Vai al contenuto
PLC Forum


GESTIONE LETTURA SCRITTURA MODBUS PL7 - COME GESTIRE READ_VAR - WRITE_VAR


Stefano Sormanni

Messaggi consigliati

Stefano Sormanni

Devo gestire una lettura scrittura su una periferica Modbus RTU (Altivar28) su un PLC Micro Modicon, il mio problema sta nella gestione della scrittura e lettura in quanto ho notato che se l'inverter mi va in Fault, la comunicazione mi salta ed inoltre si pianta anche la comunicazione Unitelway (devo fare il riavvio a freddo).

Molto probabilmente mi si satura il buffer della comunicazione, e poi non si sblocca più.

Io ho fatto questo tipo di soluzione:

LD TRUE

[%MW10:4:=0]

[%MW12:=50]

LDN %MW10:X0

[READ_VAR(ADR#0.0.3,.......................,%MW10:4)]

LDF %MW10:X0

S %M2

R %M1

LD TRUE

[%MW20:4:=0]

[%MW22:=50]

LD %M2

LDN %MW20:X0

[WRITE_VAR(ADR#0.0.3,.....................,%MW20:4)]

LDF %MW20:X0

S %M1

R %M2

Non so se questa soluzione è fattibile e propio per questo motivo chiedo consiglio...

grazie

:rolleyes:

Link al commento
Condividi su altri siti


oltre all'azzeramento delle word di comunicazione

avevo anche preposto dei timer .

se ho il .done e sono bloccato , azzero le word

ti mando una routoine che avevo fatto ,c'e' anche la gestione del plc hot back -up , vedi un po cosa ti possa servire

ciao

!

(*------CHECK COMMUNICATION ETHERNET ------*)

%T10.P:=10;

%T11.P:=3;

%T12.P:=3;

%T13.P:=3;

%T14.P:=3;

%T15.P:=3;

IF %MW2100:X0 THEN START %T10;ELSE STOP %T10;PRESET %T10;END_IF;

IF %MW2125:X0 THEN START %T11;ELSE STOP %T11;PRESET %T11;END_IF;

IF %MW2106:X0 THEN START %T12;ELSE STOP %T12;PRESET %T12;END_IF;

IF %MW2129:X0 THEN START %T13;ELSE STOP %T13;PRESET %T13;END_IF;

IF %MW2400:X0 THEN START %T14;ELSE STOP %T14;PRESET %T14;END_IF;

IF %MW2220:X0 THEN START %T15;ELSE STOP %T15;PRESET %T15;END_IF;

IF %T10.D THEN %MW2100:4:=0;END_IF;

IF %T11.D THEN %MW2125:4:=0;END_IF;

IF %T12.D THEN %MW2106:4:=0;END_IF;

IF %T13.D THEN %MW2129:4:=0;END_IF;

IF %T14.D THEN %MW2400:4:=0;END_IF;

IF %T15.D THEN %MW2220:4:=0;END_IF;

!

(*------CHECK COMMUNICATION FIPWAY ------*)

%T6.P:=3; (*PRESET TIMER*)

IF %MW2110:X0

OR %MW3000:X0 (*COMMUNICATION TIMER*)

THEN START %T6; (*START TIMER*)

ELSE STOP %T6; (*STOP TIMER*)

PRESET %T6; (*RETURN PRESET TIMER*)

END_IF;

IF %T6.D (*TIME DONE =COMMUNICATION TIMER*)

THEN %MW2110:4:=0; (*STOP COMMUNICATION*)

%MW3000:4:=0;

END_IF;

!

(* POINTER CONTROL*)

IF %MW2105<0 OR %MW2105>20 THEN %MW2105:=0;END_IF;

IF %MW2104<0 OR %MW2104>3 THEN %MW2104:=0;END_IF;

!

IF %M1999 THEN JUMP %L500;END_IF;

!

(* When STAND-BY jump to the Stand-by management *)

IF NOT %MW1001:X1 THEN JUMP %L300;END_IF;

!

(*CHECK OF SELF-TEST CARD,IF NOT READY JUMP*)

IF %MW3.MOD.2:X3 THEN JUMP %L100;END_IF;

!

IF NOT %MW2100:X0 AND NOT %MW2125:X0 THEN

%MW2422:=%MW2101+%MW2126;

%MW2100:4:=0;

%MW2125:4:=0;

%MW2102:=5;

%MW2127:=5;

END_IF;

!

(*SEND DATA TABEL TO SPV*)

IF NOT %MW2100:X0 AND NOT %MW2125:X0 THEN

IF %MW2105=0 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1000,64,%MW10100:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1000,64,%MW10100:64,%MW2125:4);%MW2105:=1;JUMP %L100;END_IF;

IF %MW2105=1 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1064,64,%MW10164:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1064,64,%MW10164:64,%MW2125:4);%MW2105:=2;JUMP %L100;END_IF;

IF %MW2105=2 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1128,64,%MW10228:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1128,64,%MW10228:64,%MW2125:4);%MW2105:=3;JUMP %L100;END_IF;

IF %MW2105=3 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1192,64,%MW10292:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1192,64,%MW10292:64,%MW2125:4);%MW2105:=4;JUMP %L100;END_IF;

IF %MW2105=4 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1256,64,%MW10356:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1256,64,%MW10356:64,%MW2125:4);%MW2105:=5;JUMP %L100;END_IF;

IF %MW2105=5 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1320,64,%MW10420:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1320,64,%MW10420:64,%MW2125:4);%MW2105:=6;JUMP %L100;END_IF;

IF %MW2105=6 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1384,64,%MW10484:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1384,64,%MW10484:64,%MW2125:4);%MW2105:=7;JUMP %L100;END_IF;

IF %MW2105=7 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1448,64,%MW10548:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1448,64,%MW10548:64,%MW2125:4);%MW2105:=8;JUMP %L100;END_IF;

IF %MW2105=8 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1512,64,%MW10612:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1512,64,%MW10612:64,%MW2125:4);%MW2105:=9;JUMP %L100;END_IF;

IF %MW2105=9 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1576,64,%MW10676:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1576,64,%MW10676:64,%MW2125:4);%MW2105:=10;JUMP %L100;END_IF;

IF %MW2105=10 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1640,64,%MW10740:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1640,64,%MW10740:64,%MW2125:4);%MW2105:=11;JUMP %L100;END_IF;

IF %MW2105=11 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1704,64,%MW10804:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1704,64,%MW10804:64,%MW2125:4);%MW2105:=12;JUMP %L100;END_IF;

IF %MW2105=12 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1768,64,%MW10868:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1768,64,%MW10868:64,%MW2125:4);%MW2105:=13;JUMP %L100;END_IF;

IF %MW2105=13 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1832,64,%MW10932:64,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1832,64,%MW10932:64,%MW2125:4);%MW2105:=14;JUMP %L100;END_IF;

IF %MW2105=14 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1896,54,%MW10996:54,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1896,54,%MW10996:54,%MW2125:4);%MW2105:=15;JUMP %L100;END_IF;

IF %MW2105=15 THEN WRITE_VAR(ADR#{4.1}SYS,'%M',10000,896,%MW11200:56,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%M',10000,896,%MW11200:56,%MW2125:4);%MW2105:=16;JUMP %L100;END_IF;

IF %MW2105=16 THEN WRITE_VAR(ADR#{4.1}SYS,'%M',10896,64,%MW11256:4,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%M',10896,64,%MW11256:4,%MW2125:4);%MW2105:=17;JUMP %L100;END_IF;

IF %MW2105=17 THEN WRITE_VAR(ADR#{4.1}SYS,'%M',10960,160,%MW11260:10,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%M',10960,160,%MW11260:10,%MW2125:4);%MW2105:=18;JUMP %L100;END_IF;

IF %MW2105=18 THEN WRITE_VAR(ADR#{4.1}SYS,'%MD',4000,12,%MW16054:24,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MD',4000,12,%MW16054:24,%MW2125:4);%MW2105:=19;JUMP %L100;END_IF;

IF %MW2105=19 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1960,15,%MW14000:15,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1960,15,%MW14000:15,%MW2125:4);%MW2105:=20;JUMP %L100;END_IF;

IF %MW2105=20 THEN WRITE_VAR(ADR#{4.1}SYS,'%MW',1950,1,%MW11050:1,%MW2100:4);

WRITE_VAR(ADR#{4.2}SYS,'%MW',1950,1,%MW11050:1,%MW2125:4);%MW2105:=0;JUMP %L100;END_IF;

END_IF;

!

%L100:

!

IF NOT %MW2106:X0 AND NOT %MW2129:X0 THEN

%MW2106:4:=0;

%MW2129:4:=0;

%MW2108:=5;

%MW2131:=5;

END_IF;

!

IF NOT %MW2106:X0

AND NOT %MW2129:X0 THEN

IF %MW2104=0 THEN WRITE_VAR(ADR#{4.30}SYS,'%MW',10000,10,%MW13000:10,%MW2106:4);

WRITE_VAR(ADR#{4.31}SYS,'%MW',10000,10,%MW13000:10,%MW2129:4);%MW2104:=1;JUMP %L101;END_IF;

IF %MW2104=1 THEN WRITE_VAR(ADR#{4.50}SYS,'%M',4000,960,%MW11200:60,%MW2106:4);

WRITE_VAR(ADR#{4.51}SYS,'%M',4000,960,%MW11200:60,%MW2129:4);%MW2104:=2;JUMP %L101;END_IF;

IF %MW2104=2 THEN WRITE_VAR(ADR#{4.50}SYS,'%M',4960,160,%MW11260:10,%MW2106:4);

WRITE_VAR(ADR#{4.51}SYS,'%M',4960,160,%MW11260:10,%MW2129:4);%MW2104:=3;JUMP %L101;END_IF;

IF %MW2104=3 THEN WRITE_VAR(ADR#{4.50}SYS,'%MW',3401,8,%MW15000:8,%MW2106:4);

WRITE_VAR(ADR#{4.51}SYS,'%MW',3401,8,%MW15000:8,%MW2129:4);%MW2104:=0;JUMP %L101;END_IF;

END_IF;

!

%L101:

!

(* ##################### COMMUNICATION WITH AU121...125 ################### *)

Link al commento
Condividi su altri siti

Suggerimento:

per inserire i codici sorgenti, utilizzate il tasto "Code", eviterete tagli di codice dell'interprete html

esempio:

LD     TRUE
[%MW10:4:=0]
[%MW12:=50]
LDN   %MW10:X0
[READ_VAR(ADR#0.0.3,.......................,%MW10:4)]
LDF   %MW10:X0
S      %M2
R      %M1
LD    TRUE
[%MW20:4:=0]
[%MW22:=50]
LD    %M2
LDN  %MW20:X0
[WRITE_VAR(ADR#0.0.3,.....................,%MW20:4)]
LDF  %MW20:X0
S     %M1
R     %M2[/code]

forse con Telemecanique non succede nulla, ma con Siemens qualcuno ha gia' avuto problemi.

Link al commento
Condividi su altri siti

  • 9 years later...
fourniermarcello

Salve sono un programmatore novello (più novello che programmatore) io ho un problema . LA Schneider mi ha lasciato un progetto in PL7 Pro dove avviene lo scambio di valori fra PLC attraverso una READ_VAR(...) . Da questa conversazione noto che dall'altra parte ci dovrebbe essere un WRITE_VAR ?

Fino ad oggi ho sempre resettato la %MW di diagnostica nel READ_VAR per sbloccare lo scambio . Ma ora , credo , come dite nel topic , si sia saturato il buffer di comunicazione .

Mi avvalgo della vs esperienza per risolvere tale problema o comunque delucidarmi sullo scambio di dati fra PLC.

Grazie

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...