Page 1 sur 2

Communication API /ISB+/CORUS

Posté : 16 août 2018, 15:19
par BHB
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

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 15:37
par itasoft
slts,
sur quel automate ? donner une vue de la requête de lecture (ex: READ_VAR) pour voir comment c'est programmé

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 15:52
par BHB
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;

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 15:52
par BHB
Automate schneider

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 15:59
par itasoft
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;

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 17:04
par BHB
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

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 17:17
par itasoft
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 ?

Re: Communication API /ISB+/CORUS

Posté : 16 août 2018, 22:12
par itasoft
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

Re: Communication API /ISB+/CORUS

Posté : 23 août 2018, 16:53
par BHB59
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;

Re: Communication API /ISB+/CORUS

Posté : 23 août 2018, 21:57
par itasoft
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;