Communication API /ISB+/CORUS
Communication API /ISB+/CORUS
Bonjour,
Je tente de communiquer via une passerelle Modbus TCPIP/RS485 avec un module CORUS (debitmetre) a travers un module instrinsèque ISB+.
MODBUS TCPIP<>RS485<>ISB+ITRON<>RS232<> CORUS.
Les paramètres de com sont
Vitesse de transmission = 9600 bauds
Bits de données = 8 bits
Bit(s) de stop = 1 bit
Parité = Sans parité
Grosso modo un automate vient lire les données du débitmètre
Je communique puis quelques heures après la communication se coupe , il faut couper le jus sur le ISB+ pour la com redémarre. Quelqu'un aurait il une piste ?
Merci de votre aide Smile
Je tente de communiquer via une passerelle Modbus TCPIP/RS485 avec un module CORUS (debitmetre) a travers un module instrinsèque ISB+.
MODBUS TCPIP<>RS485<>ISB+ITRON<>RS232<> CORUS.
Les paramètres de com sont
Vitesse de transmission = 9600 bauds
Bits de données = 8 bits
Bit(s) de stop = 1 bit
Parité = Sans parité
Grosso modo un automate vient lire les données du débitmètre
Je communique puis quelques heures après la communication se coupe , il faut couper le jus sur le ISB+ pour la com redémarre. Quelqu'un aurait il une piste ?
Merci de votre aide Smile
- itasoft
- Mi homme - Mi automate
- Messages : 7112
- Enregistré le : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Communication API /ISB+/CORUS
slts,
sur quel automate ? donner une vue de la requête de lecture (ex: READ_VAR) pour voir comment c'est programmé
sur quel automate ? donner une vue de la requête de lecture (ex: READ_VAR) pour voir comment c'est programmé
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr
Re: Communication API /ISB+/CORUS
Bonjour
Je passe par un convertisseur Modbus TCPIP / RS485, je communique quelques heures et la comm. se coupe.
(* Adresse Corus *)
ADDM_CORUS := ADDM('Ethernet_N0{210.5.20.51}10');
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
(* Chargement Time-Out *)
CORUS_Timeout:=100;
(* gestion index zone d'echange *)
IF (com_corus_nozone > 3) OR (com_corus_nozone < 1) THEN
com_corus_nozone:=1;
END_IF;
(* Lecture des débits bruts et convertis *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND Top_1s THEN
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
Je passe par un convertisseur Modbus TCPIP / RS485, je communique quelques heures et la comm. se coupe.
(* Adresse Corus *)
ADDM_CORUS := ADDM('Ethernet_N0{210.5.20.51}10');
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
(* Chargement Time-Out *)
CORUS_Timeout:=100;
(* gestion index zone d'echange *)
IF (com_corus_nozone > 3) OR (com_corus_nozone < 1) THEN
com_corus_nozone:=1;
END_IF;
(* Lecture des débits bruts et convertis *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND Top_1s THEN
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
Re: Communication API /ISB+/CORUS
Automate schneider
- itasoft
- Mi homme - Mi automate
- Messages : 7112
- Enregistré le : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Communication API /ISB+/CORUS
slts,
pour lancer une requête il faut tester le bit d'activité à 0 et mettre une Time-OUT c'est la régle sinon tu plante la COM au bout d'un certain temps
(* Lecture des débits bruts et convertis *)
IF NOT %MW291.0 AND CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND Top_1s THEN
%M291:=0;
%M292:=0;
%M293:=20;(*Time-out*)
%MW294:=0;
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
pour lancer une requête il faut tester le bit d'activité à 0 et mettre une Time-OUT c'est la régle sinon tu plante la COM au bout d'un certain temps
(* Lecture des débits bruts et convertis *)
IF NOT %MW291.0 AND CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND Top_1s THEN
%M291:=0;
%M292:=0;
%M293:=20;(*Time-out*)
%MW294:=0;
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr
Re: Communication API /ISB+/CORUS
Oui je l'ai fait
(* Chargement Time-Out *)
CORUS_Timeout:=100;
(* Lecture des débits bruts et convertis *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND
(* Chargement Time-Out *)
CORUS_Timeout:=100;
(* Lecture des débits bruts et convertis *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND
- itasoft
- Mi homme - Mi automate
- Messages : 7112
- Enregistré le : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Communication API /ISB+/CORUS
OK, j'avais pas fait le rapprochement avec les mnémoniques alors ça vient pas de la requête qui est bien programmé, à la rigueur le time-out de 1s c'est un peu long je mettrais 500ms (soit la valeur 50) mais ça doit pas changer grand chose.Sinon es que ya d'autres requêtes sur cette même voier ?
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr
- itasoft
- Mi homme - Mi automate
- Messages : 7112
- Enregistré le : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Communication API /ISB+/CORUS
slts,
question:
es que ya d'autres requêtes READ_VAR ou WRITE_VAR sur cette même voie à l'adresse: ADDM('Ethernet_N0{210.5.20.51}10') ??
Exemple :
Si j’ai une requête READ_VAR pour la lecture et une requête WRITE_VAR pour l’écriture sur la même voie
ADDM('Ethernet_N0{210.5.20.51}10') dans le principe le TCP peut empiler les requêtes mais par sécurité et vu que la COM plante, j’utiliserais la même table de gestion %MW291 :4 pour les deux requêtes et teste le même bit d’occupation et je cadence une fois l’une une fois l’autre,
Exemple :
%M6 :=%S6 ;
if RE(%M6) AND NOT %MW291.0 THEN READ_VAR (..................%MW291:4)
if FE(%M6) AND NOT %MW291.0 THEN WRITE_VAR (..................%MW291:4)
la ceinture et les bretelles, LOL
question:
es que ya d'autres requêtes READ_VAR ou WRITE_VAR sur cette même voie à l'adresse: ADDM('Ethernet_N0{210.5.20.51}10') ??
Exemple :
Si j’ai une requête READ_VAR pour la lecture et une requête WRITE_VAR pour l’écriture sur la même voie
ADDM('Ethernet_N0{210.5.20.51}10') dans le principe le TCP peut empiler les requêtes mais par sécurité et vu que la COM plante, j’utiliserais la même table de gestion %MW291 :4 pour les deux requêtes et teste le même bit d’occupation et je cadence une fois l’une une fois l’autre,
Exemple :
%M6 :=%S6 ;
if RE(%M6) AND NOT %MW291.0 THEN READ_VAR (..................%MW291:4)
if FE(%M6) AND NOT %MW291.0 THEN WRITE_VAR (..................%MW291:4)
la ceinture et les bretelles, LOL
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr
-
- Code son premier grafcet
- Messages : 32
- Enregistré le : 23 août 2018, 16:45
- Localisation : Nord de la france
Re: Communication API /ISB+/CORUS
Bonjour,
Désolée pour la réponse tardive mais j'ai eu un problème avec le compte de ce forum et j'ai du en créer un autre.
Il me semble que je cadence l'envoi des read var . voir code ci dessous... je pense que le code est OK
Merci de votre aide
(* Adresse Corus *)
ADDM_CORUS := ADDM('Ethernet_N0{210.5.20.51}10');
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
(* Chargement Time-Out *)
CORUS_Timeout:=100;
(* gestion index zone d'echange *)
IF (com_corus_nozone > 3) OR (com_corus_nozone < 1) THEN
com_corus_nozone:=1;
END_IF;
(* Lecture des débits bruts et convertis *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND Top_1s THEN
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
(* Lecture des température et pression *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 2) AND Top_1s THEN
(* Lecture 16 Mots par ECOCEM dans CORUS (%MW806-821) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 834,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_2);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
(* Lecture des compteurs *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 3) AND Top_1s THEN
(* Lecture 16 Mots par ECOCEM dans CORUS (%MW806-821) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 806,
NB := 16,
GEST := %MW291:4,
RECP => Corus_Zone_3);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
(* TRAITEMENT COMPTE RENDU *)
IF (CORUS_Fct_RV_WV <> 0) AND NOT (CORUS_Echange.0) THEN
(* Test Si Pas Defaut Communication *)
IF CORUS_Cpt_Rendu = 0 THEN
CORUS_Cpt_Def:=0;(* RAZ : Compteur de defaut *)
(* Echange OK *)
SET (CORUS_echange_ok);
ELSE
(* Comptage Defaut : Si > 3 Alors Defaut Com *)
IF CORUS_Cpt_Def<9999 THEN INC (CORUS_Cpt_Def);END_IF;
(* RAZ Echange OK *)
RESET (CORUS_echange_ok);
END_IF;
CORUS_Fct_RV_WV:=0;(* RAZ : Info Fct en cours *)
END_IF;
Désolée pour la réponse tardive mais j'ai eu un problème avec le compte de ce forum et j'ai du en créer un autre.
Il me semble que je cadence l'envoi des read var . voir code ci dessous... je pense que le code est OK
Merci de votre aide
(* Adresse Corus *)
ADDM_CORUS := ADDM('Ethernet_N0{210.5.20.51}10');
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
(* Chargement Time-Out *)
CORUS_Timeout:=100;
(* gestion index zone d'echange *)
IF (com_corus_nozone > 3) OR (com_corus_nozone < 1) THEN
com_corus_nozone:=1;
END_IF;
(* Lecture des débits bruts et convertis *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND Top_1s THEN
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
(* Lecture des température et pression *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 2) AND Top_1s THEN
(* Lecture 16 Mots par ECOCEM dans CORUS (%MW806-821) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 834,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_2);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
(* Lecture des compteurs *)
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0) AND (com_corus_nozone = 3) AND Top_1s THEN
(* Lecture 16 Mots par ECOCEM dans CORUS (%MW806-821) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 806,
NB := 16,
GEST := %MW291:4,
RECP => Corus_Zone_3);
SET (CORUS_RV_Mots);
INC(com_corus_nozone);
END_IF;
(* TRAITEMENT COMPTE RENDU *)
IF (CORUS_Fct_RV_WV <> 0) AND NOT (CORUS_Echange.0) THEN
(* Test Si Pas Defaut Communication *)
IF CORUS_Cpt_Rendu = 0 THEN
CORUS_Cpt_Def:=0;(* RAZ : Compteur de defaut *)
(* Echange OK *)
SET (CORUS_echange_ok);
ELSE
(* Comptage Defaut : Si > 3 Alors Defaut Com *)
IF CORUS_Cpt_Def<9999 THEN INC (CORUS_Cpt_Def);END_IF;
(* RAZ Echange OK *)
RESET (CORUS_echange_ok);
END_IF;
CORUS_Fct_RV_WV:=0;(* RAZ : Info Fct en cours *)
END_IF;
- itasoft
- Mi homme - Mi automate
- Messages : 7112
- Enregistré le : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: Communication API /ISB+/CORUS
slts,
c'est pas bon,
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
Après ça, tu met CORUS_Echange.0 à zéro donc il ne sert plus à à rien dans la condition suivante
Tu met à zéro le bit d'activité puis tu le teste à FALSE, il sera obligatoirement à FALSE donc il ne sert à rien
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0)
============= Corrigé suivant le modèle standard ============
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
Supprimer cette RAZ
Top_1s:=%S6;
(* Cadencement *)
if RE(Top_1s) then
inc(com_corus_nozone);
end_if;
IF (com_corus_nozone > 3) OR (com_corus_nozone <0) THEN
com_corus_nozone:=0;
END_IF;
(* Lecture des débits bruts et convertis *)
IF NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND RE(Top_1s) THEN
MOVE_INT_ARINT(0,%MW291:4);
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
END_IF;
c'est pas bon,
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
Après ça, tu met CORUS_Echange.0 à zéro donc il ne sert plus à à rien dans la condition suivante
Tu met à zéro le bit d'activité puis tu le teste à FALSE, il sera obligatoirement à FALSE donc il ne sert à rien
IF CORUS_Fct_RV_WV=0 AND NOT (CORUS_Echange.0)
============= Corrigé suivant le modèle standard ============
(* RAZ : Table Controle Echange *)
IF CORUS_Fct_RV_WV=0 THEN
MOVE_INT_ARINT(0,%MW291:4);
END_IF;
Supprimer cette RAZ
Top_1s:=%S6;
(* Cadencement *)
if RE(Top_1s) then
inc(com_corus_nozone);
end_if;
IF (com_corus_nozone > 3) OR (com_corus_nozone <0) THEN
com_corus_nozone:=0;
END_IF;
(* Lecture des débits bruts et convertis *)
IF NOT (CORUS_Echange.0) AND (com_corus_nozone = 1) AND RE(Top_1s) THEN
MOVE_INT_ARINT(0,%MW291:4);
(* Lecture 4 Mots par ECOCEM dans CORUS (%MW822-825) *)
READ_VAR (ADR := ADDM_CORUS,
OBJ := '%MW',
NUM := 822,
NB := 4,
GEST := %MW291:4,
RECP => Corus_Zone_1);
END_IF;
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr