Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




GESTIONE LETTURA SCRITTURA MODBUS PL7 - COME GESTIRE READ_VAR - WRITE_VAR


Messaggi consigliati

Stefano Sormanni
Inserito:

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:


Inserita:

Ho fatto qualcosa di simile, appena ho un po' di tempo ti mando un esempio ;)

Inserita:

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 ################### *)

Inserita:

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.

Gabriele Corrieri
Inserita:

Ciao Walter,

non ci capisco molto (non ho mai usato PL7) ... comunque sei proprio forte in programmazione!!! :D:lol::D:lol:

Ciao

  • 9 years later...
fourniermarcello
Inserita:

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

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...