Vai al contenuto
PLC Forum


Salvare Dati Plc Wago


cesco_sitec

Messaggi consigliati

ciao a tutti,

è ilmio primo post inel forum sebbene ho avuto occasione di consultare vari topic,

programmo da qualche tempo in codesys per Wago su 750-841, nel mio programma fatto prevalentemente in ST, ho organizzato i dati in struct, l'unico rproble che le struct non sono RETAIN e quindi se va via l'alimentazione mi rimangono tutte le altre varibili , ma non i dati nella struct.

come si potrebbe gestire questa situazione ? come posso farmi dei salvataggi all'interno della memoria del wago?

grazie anticipatamente

buone vacanze

Link al commento
Condividi su altri siti


Cristina Fantoni

Ciao cesco_sitec

innanzitutto benvenuto a PLCforum.

Non sono sicura di capito la tua domanda... ma provo a risponderti ugualmente :unsure:

Dovendo salvare dei dati contenuti in un array, li ho appoggiati a delle variabili retain, poi, utilizzando il task "Start", che viene richiamato solo al primo ciclo in run, riassegno alle variabili all'interno dell'array i dati che mi interessavano.

In pratica durante l'esecuzione del programma (dal 2° ciclo in poi):

%MW100:=Data_array[100];

%MW101:=Data_array[101];

......

quando manca tensione, al primo ciclo successivo:

Data_array[100]:=%MW100;

Data_array[101]:=%MW101;

......

Spero di essermi spiegata ;)

:wub:

Link al commento
Condividi su altri siti

Provo pure io.

Creati dei data_type con all'interno la tua struttura; quindi la dichiari in una variabile Retain, e dovresti avere risolto il problema

VAR_GLOBAL RETAIN

ArchivioSchede AT %MW12 : ARRAY [1..25] OF Scheda; (* ......finiscono alla word 2250 *) (Scheda è un data_type di tipo struct....)

SchedaSelezionata AT %MW2518: BYTE;

NumeroSchede AT %MW2515:WORD;

UscitaAccensioneRemota:WORD;

IngressoaccensioneRemota:WORD;

MemoriaAccensioneRemota: WORD;

IngressoSchedaPerAccRemota: WORD;

ComandoRemotoOn: BOOL;

SchedaRemota: WORD;

AcquisizioneReteOn AT %MW2514 :BOOL;

AcquisizioneReteInCorso:BOOL;

ScritturaReteOn AT %MW2517:BOOL;

SchedaSelezionataTouch AT %MW2516:WORD;

END_VAR

ciao

Link al commento
Condividi su altri siti

grazie del benvenuto e delle risposte veloci,

la soluzione proposta da luciopro è prioprio quella che ho fatto gia dall'inizio, ma con mia sorpresa ea nche vedendo nella guida di codesys le struct non possono essere indirizzate, ne dichiraete retain o meglio codesys te lo fa fare ma il wago alla riaccensione non conserva i dati nelle struct.

potrei spalmare le struct in tante array RETAIN come ha proprosto cristina, in pratica mi verrebbero 15 array da 16 elementi ciascuna, per non cambiare poi tutto il il programma che con fatica ho fatto potrei far un aggioanmento continuoni quando il programma e è esecuzione dalla straucalle retain e poi in un successivo avvio ricaricare le struct per ripristinare completamente lo stato prima delle spegnimento

grazie

ciao ciao

Link al commento
Condividi su altri siti

la soluzione proposta da luciopro è prioprio quella che ho fatto gia dall'inizio, ma con mia sorpresa ea nche vedendo nella guida di codesys le struct non possono essere indirizzate, ne dichiraete retain o meglio codesys te lo fa fare ma il wago alla riaccensione non conserva i dati nelle struct.

Scusa se insisto: premessa uso un 750-841. Dihiarate nel modo che ti ho consigliato il wago mantiene i dati allo spegnimento. Su questo ne sono sicuro.

Discorso diverso e se trasferisci nuovamente il programma: in quel caso, se non li hai salvati su PC, i dati vengono azzerati.

Non serve complicarti la vita ed appoggiarli su %mw.

ciao

Link al commento
Condividi su altri siti

non ho toccato niente con nella memoria ecco la finestra:

immaginewr9.th.jpg

la guida di codesys recita alla voce struct:

"Interlocking structures are allowed. The only restriction is that variables may not be placed at addresses (the AT declaration is not allowed!)."

grazie

Modificato: da cesco_sitec
Link al commento
Condividi su altri siti

ah lucipro ,

visto che usi l'841 ti è mai capitato che ogni tanto non si puo accedere alla memoria via modbus?.... nell'area retain ho in lettura/scrittura pannello maple e un modbus monitor da pC, ogni tanto il pannelllo segnalA "errore modbus tcp" e il modbus monitor si sconnette e delle volte mi caccia fuori anche il codesys, per non parlare dei certi momenti di "parlalisi generale" con tutte le luci che lappeggiano rosse fino a che non si leva la corrente

grazie dell'aiuto

Link al commento
Condividi su altri siti

no dovrebbe andare:

16#4000 corrispondono a 16384 word ritentive....e poi mi sembra che se le superi ti da un messaggio di allarme.

"Interlocking structures are allowed. The only restriction is that variables may not be placed at addresses (the AT declaration is not allowed!)."

Scusa copiati quanto segue, lo prendo da un mio software:

In Data_type

TYPE Scheda :

STRUCT

Telecomando1HPulsantiL:WORD; (* 0000 INT_TELECOMANDO_IR_L (H)

INT_PULSANTI_STATE (L) azzero alla lettura modbus contine, i valori in OR dall'ultima lettura modus.*)

Telecomando2HSwitchL:WORD; (* 0001 INT_TELECOMANDO_IR_H (H)

INT_SWITCH_SCHEDA (L) azzero alla lettura modbus, contine il valore attuale dei 8 switch.*)

Temperatura1:WORD; (* 0002 INT_TEMPERATURA_1 (H) 1°=10 10000=Sonda in corto

INT_TEMPERATURA_1 (L) 20000=sonda scollegata*)

Temperatura2:WORD; (* 0003 INT_TEMPERATURA_2 (H) 1°=10 10000=Sonda in corto

INT_TEMPERATURA_2 (L) 20000=sonda scollegata*)

Termostato:WORD; (* 0004 INT_ SETPOINT_TEMPERATURE1 (H)

INT_ SETPOINT_TEMPERATURE1 (L) 20000=sonda scollegata*)

Luximetro:WORD; (* 0005 INT_LUXIMETRO_ANAL (H)

INT_LUXIMETRO_ANAL (L) 20000=sonda scollegata*)

ControlWord:WORD; (* 0006 INT_INT_CTRL_WORD (H) Life counter (10 msec)

INT_INT_CTRL_WORD (L)*)

StatoRele:WORD; (* 0007 INT_RELAY_STATE (H)

INT_RELAY_STATE (L) ATTENZIONE, SI INTENDE LO STATO LOGICO DELLA USCITA*)

(* -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ATTENZIONE DA QUESTO Punto in poi il valore 0 non è significativo e quindi scartato

rimarrà scritto il valore precedente. questo per consenntire di semplificare di molto il software e di variare con una sola scrittura modbus + parametri!!!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)

OutDimmer1:WORD; (* 0008 INT_OUT_DIMMER1 (H)

INT_OUT_DIMMER1 (L) percentuale luce dimmer 1 - >=10 *)

Outdimmer2:WORD; (* 0009 INT_OUT_DIMMER2 (H)

INT_OUT_DIMMER2 (L) percentuale luce dimmer 1 - >=10 *)

SetPointTemperatura1:WORD; (* 0010 INT_SETPOINT_TEMP1 (H)

INT_SETPOINT_TEMP1 (L) 1°=10 *)

SetPointTemperatura2:WORD; (* 0011 INT_SETPOINT_TEMP2 (H)

INT_SETPOINT_TEMP2 (L) 1°=10 *)

IsteresiTemperatura:WORD; (* 0012 INT_ISTERESI (H)

INT_ISTERESI (L) Valore isteresi delle temperature 10 = 1°C valore minimo 0.2 °C *)

Temperatura2HTemperature1LMode:WORD; (* 0013 INT_TEMP1_MODE (L)

INT_TEMP2_MODE (H)

Bit 15 14 13 12 11 10 9 8

1= Estate 1=Inverno Free Free 1=Aut 1=Man 1=ON 1=OFF --> Temp 2

Bit 7 6 5 4 3 2 1 0

1= Estate 1=Inverno Free Free 1=Aut 1=Man 1=ON 1=OFF --> Temp 1

Condizione di contorno:

--> Se ON e OFF contemporanei intendo OFF -->Se Estate e Inverno contemporanei intendo Inverno

--> Con estate intendo che il controllo di temperatura unziona a logica Condizionatore.

--> Con inverno intendo che il controllo di temperatura unziona a logica Riscaldamento.

--> Sul fronte del comando controller_OFF le uscite relay sono comandate spente, (ma non in continuazione).

--> Quando OFF intendo spento il riscaldamento o il condizionatore. *)

PlcCommand:WORD; (* 0014 INT_PLC_COMMAND (H) Timer mode (diventa un timer anche quando non lo è)

INT_PLC_COMMAND (L) Ingressi Virtuali non replicarsi sulla WORD INT_PULSANTI_STATE *)

PlcScenario:WORD; (* 0015 INT_SCENARIO (H) 1= Enable output

INT_SCENARIO (L) 1/0= Stato uscita -->Se uscita Timer si spegnerà a tempo. *)

AnalogOutput:WORD; (* 0016 INT_ANALOGICA_OUT da definisri

INT_ANALOGICA_OUT da definisri *)

DurataMassimaHNumeroImpulsiLIO1:WORD; (* 0017 INT_IO_LOG_1 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_1 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO1:WORD; (* 0018 INT_ANALOG_1 (H) Libero

INT_ANALOG_1 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO2:WORD; (* 0019 INT_IO_LOG_2 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_2 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO2:WORD; (* 0020 INT_ANALOG_2 (H) Libero

INT_ANALOG_2 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO3:WORD; (* 0021 INT_IO_LOG_3 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_3 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO3:WORD; (* 0022 INT_ANALOG_3 (H) Libero

INT_ANALOG_3 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO4:WORD; (* 0023 INT_IO_LOG_4 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_4 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO4:WORD; (* 0024 INT_ANALOG_4 (H) Libero

INT_ANALOG_4 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO5:WORD; (* 0025 INT_IO_LOG_5 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_5 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO5:WORD; (* 0026 INT_ANALOG_5 (H) Libero

INT_ANALOG_5 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO6:WORD; (* 0027 INT_IO_LOG_6 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_6 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO6:WORD; (* 0028 INT_ANALOG_6 (H) Libero

INT_ANALOG_6 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO7:WORD; (* 0029 INT_IO_LOG_7 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_7 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO7:WORD; (* 0030 INT_ANALOG_7 (H) Libero

INT_ANALOG_7 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

DurataMassimaHNumeroImpulsiLIO8:WORD; (* 0031 INT_IO_LOG_8 (H) Al termine di ogni impulso verifico se è quello di durata maggiore, in tel caso aggiorno il modbus. Azzero alla lettura modbus.

(Base 10 msec se supera il valore max delle word viene scritto 0xff)

INT_IO_LOG_8 (L) Allo scadere del tempo impostato, aggiorno nel modbus gli impulsi arrivati. Azzero il byte alla lettura modbus.

(Vedi word INT_ANTIFURTO_1_4 per base tempo e impostazione funzionamento ingressi) *)

FreeHValoreAnalogicoLIO8:WORD; (* 0032 INT_ANALOG_8 (H) Libero

INT_ANALOG_8 (L) Valore analogico 8 bit aggiornato all'istante in cui ho valutato l'impulso di durata massima, per capire che tipo di bilanciamento c'è. *)

Free1:WORD;

Free2:WORD;

Free3:WORD;

Free4:WORD;

Free5:WORD;

Free6:WORD;

(* -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ATTENZIONE DA QUESTO Punto in poi il valore 0 è significativo !!!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)

SystemCommand:WORD; (* 0033 INT_SYSTEM_COMMAND (H) Versione S.W. scheda IO

INT_SYSTEM_COMMAND (L)

7 6 5 4 3 2 1 0

1=reset software 1=connesso al PLC 1=Wr Eprom

--> il bit 0 se a 1 devo scrivere i campi successivi nella EE e verifico se inizializzare le porte 1W come digitali o analogiche. Viene azzerato dopo la lettura.

--> il bit 1 il plc è connesso e se perdo la comunicazione devo utilizzare la word INTERNAL_SCENARIO_PLC_OFF. *)

ModeOut1:WORD; (* 0034 INT_OUT_MODE1 (H)

INT_OUT_MODE1 (L)

BIT

0 0=Relè Spento 1=Relè Acceso (posizione di accensione)

1 0=PassoPasso 1= Timer

2 0= OnOff 1= Dimmer

3 Free

4 Free

5 0=Ton Dimmer 0s 1=Ton Dimmer 3s

6 0=Normale 1= Serranda Mororizzata

7 0=Non Invert. 1= Invertito

8-9-10-11-12-13 Tempo funzione Timer

14 1= 1s Base Timer

15 1= 1min

La priorità è Serranda/(Dimmer--> come Normale) *)

ModeOut2:WORD; (* 0035 INT_OUT_MODE2 (H)

INT_OUT_MODE2 (L)

BIT

0 0=Relè Spento 1=Relè Acceso (posizione di accensione)

1 0=PassoPasso 1= Timer

2 0= OnOff 1= Dimmer

3 Free

4 Free

5 0=Ton Dimmer 0s 1=Ton Dimmer 3s

6 0=Normale 1= Serranda Mororizzata

7 0=Non Invert. 1= Invertito

8-9-10-11-12-13 Tempo funzione Timer

14 1= 1s Base Timer

15 1= 1min

La priorità è Serranda/(Dimmer--> come Normale) *)

ModeOut3:WORD; (* 0036 INT_OUT_MODE3 (H)

INT_OUT_MODE3 (L)

BIT

0 0=Relè Spento 1=Relè Acceso (posizione di accensione)

1 0=PassoPasso 1= Timer

2 0= Normale 1=Temperatura

3 0=Temp.1 1=Temp.2

4 0=Normale 1=Inverno

5 0=Normale 1=Estate

6 0=Normale 1= Serranda Mororizzata

7 0=Non Invert. 1= Invertito

8-9-10-11-12-13 Tempo funzione Timer

14 1= 1s Base Timer

15 1= 1min

La priorità è Serranda/Temperatura/Normale

Se uscita timer ad ogni impulso mantengo il comando di ON e ricarico il tempo.

-----------------------------------------------------------------------------------------------------------

Il controllo di temperatura può funzionare con 2 relay uno collegato al condizionatore e uno alla caldaia.

IL controllo può avere anche lo stesso relay utilizzato per estate e per inverno.

Se esistono 2 relay sul medesimo controllo di temperatura, settati come Inverno/Inverno oppure Estate/Estate si considerano il relay con numero progressivo minore.

Nel caso si guasta il sensore di temperatura:

-Estate accendo il condizionatore.

-Inverno accendo il riscaldamento.

-----------------------------------------------------------------------------------------------------------

La priorità è Serranda/(Dimmer--> come Normale)

-----------------------------------------------------------------------------------------------------------

Serranda configurazione di default.

OutPut

0 0=Relè Spento (posizione di accensione)

1 1= Timer

2 0= OnOff

3 0

4 0

5 0

6 1= Serranda Mororizzata

7 0=Non Invert

8-9-10-11-12-13 Non settare a default

14 Non settare a default

15 Non settare a default

Input

Bit 0 0= Ingresso Normale N.O.

Bit 1 0= Non bilanciato (senza resistenza)

Bit 2

Bit 3 Non settare a default

-----------------------------------------------------------------------------------------------------------

Temperatura configurazione di default.

Output

BIT

0 0=Non settare a default

1 0=PassoPasso

2 1=Temperatura

3 0= Non settare a default

4 0= Non settare a default

5 0= Non settare a default

6 0=Normale

7 0= Non settare a default

8-9-10-11-12-13 Non settare a default

14 Non settare a default

15 Non settare a default

-->Le serrande gestiscono i relay a coppia (1-2) (3-4) (5-6) (7-8) comandati dagli ingressi rispettivamente (1-2) (3-4) (5-6) (7-8).

-->Non si deve verificare assolutamente l'accensione contemporanea di entrambi i relay.

-->Il comando manuale ha priorità rispetto a un comando PLC in corso per sicurezza.

-->Se durante la movimentazione premo il pulsante di apertura o di chiusura arresto il movimento.

-->!!!ATTENZIONE Il comando PLC e' il INT_PLC_COMMAND_L il controllo della uscita è una togle timerizzata sia manualmente che tramite il PLC.

-->La ripetizione del comando stesso è interpretato come arresta.

-->La pressione contemporanea dei pulsanti non deve far sfarfallare i relay (previsto un tempo minimo di commutazione).

-->Deve essere testato il flag tapparella della word;

-->INTERNAL_OUT_MODE_1,

-->INTERNAL_OUT_MODE_3,

-->INTERNAL_OUT_MODE_5,

-->INTERNAL_OUT_MODE_7.

-->Il plc deve settare la funzione timer per le uscite, e settare il tempo necessario all'apertura chiusura.

-->Il plc deve sprogrammare il DIMMER. *)

ModeOut4:WORD; (* 0037 INT_OUT_MODE4 (H)

INT_OUT_MODE4 (L) *)

ModeOut5:WORD; (* 0038 INT_OUT_MODE5 (H)

INT_OUT_MODE5 (L) *)

ModeOut6:WORD; (* 0039 INT_OUT_MODE6 (H)

INT_OUT_MODE6 (L) *)

ModeOut7:WORD; (* 0040 INT_OUT_MODE7 (H)

INT_OUT_MODE7 (L) *)

ModeOut8:WORD; (* 0041 INT_OUT_MODE8 (H)

INT_OUT_MODE8 (L) *)

MappingRele1:WORD; (* 0042 INT_MAPPING_RELE'_1 (H) Remote IR

INT_MAPPING_RELE'_1 (L) PLS Command *)

MappingRele2:WORD; (* 0043 INT_MAPPING_RELE'_2 (H) Remote IR

INT_MAPPING_RELE'_2 (L) PLS Command *)

MappingRele3:WORD; (* 0044 INT_MAPPING_RELE'_3 (H) Remote IR

INT_MAPPING_RELE'_3 (L) PLS Command *)

MappingRele4:WORD; (* 0045 INT_MAPPING_RELE'_4 (H) Remote IR

INT_MAPPING_RELE'_4 (L) PLS Command *)

MappingRele5:WORD; (* 0046 INT_MAPPING_RELE'_5 (H) Remote IR

INT_MAPPING_RELE'_5 (L) PLS Command *)

MappingRele6:WORD; (* 0047 INT_MAPPING_RELE'_6 (H) Remote IR

INT_MAPPING_RELE'_6 (L) PLS Command *)

MappingRele7:WORD; (* 0048 INT_MAPPING_RELE'_7 (H) Remote IR

INT_MAPPING_RELE'_7 (L) PLS Command *)

MappingRele8:WORD; (* 0049 INT_MAPPING_RELE'_8 (H) Remote IR

INT_MAPPING_RELE'_8 (L) PLS Command *)

Mode1Wire:WORD; (* 0050 INT_1W_IO_MODE_1 (H)

INT_1W_IO_MODE_2 (L)

BIT

0 Telecomando 2

1 Temperatura 2

8 Temperatura 1

9 Termostato 1

10 Luximetro 1 *)

ModeInput14:WORD; (* 0051 INT_ANTIFURTO_1_4

Ingresso 1

BIT

0 1= Antifurto N.C. 0= Ingresso Normale N.O.

1 1= Bilanciato 0= Non bilanciato (senza resistenza)

2 Tempo Conteggio Numero Impulsi 00=2 sec 01=5 sec 10=10 sec 11=30sec

3 *)

ModeInput58:WORD; (* 0051 INT_ANTIFURTO_5_8

Ingresso 5

BIT

0 1= Antifurto N.C. 0= Ingresso Normale N.O.

1 1= Bilanciato 0= Non bilanciato (senza resistenza)

2 Tempo Conteggio Numero Impulsi 00=2 sec 01=5 sec 10=10 sec 11=30sec

3 *)

PlcScenarioOff:WORD; (* 0052 NTERNAL_SCENARIO_PLC_OFF

Simile a INT_SCENARIO da valutare solamente una volta dopo avere perso la comunicazione con il plc per 10 sec.

Ripristino il funzionamento alla prima comunicazione modbus ok. *)

Free8:WORD;

Free9:WORD;

Free10:WORD;

Free11:WORD;

ApgIsteresiTemp:WORD:=2; (* Vedi sopra....*)

MemoriaAccensioneRemoto:WORD; (* Memorizzo comando accensione verso schede remote

BIT

0 Accensione remota A in corso

1 Accensione remota B in corso

2 Accensione remota C in corso

3 Accensione remota D in corso *)

ApgDimmer1:WORD; (* Vedi sopra....*)

ApgDimmer2:WORD; (* Vedi sopra....*)

ApgTemperatura1Aut:WORD; (* Vedi sopra....*)

ApgTemperatura2Aut:WORD; (* Vedi sopra....*)

ApgTemperatura1Man:WORD; (* Vedi sopra....*)

ApgTemperatura2Man:WORD; (* Vedi sopra....*)

ApgTemperaturaMode:WORD; (* Vedi sopra....*)

SchedaRemotoA:WORD; (* Indirizzo della scheda di cui voglio camndare l'usicta con un pulsante locale della scheda attuale *)

OutSchedaRemotaAHPlsSchedaLocaleL:WORD; (* H:Uscita della scheda remota da comandare L:Ingresso della scheda locale che commuta l'uscita *)

SchedaRemotoB:WORD; (* Indirizzo della scheda di cui voglio camndare l'usicta con un pulsante locale della scheda attuale *)

OutSchedaRemotaBHPlsSchedaLocaleL:WORD; (* H:Uscita della scheda remota da comandare L:Ingresso della scheda locale che commuta l'uscita *)

SchedaRemotoC:WORD; (* Indirizzo della scheda di cui voglio camndare l'usicta con un pulsante locale della scheda attuale *)

OutSchedaRemotaCHPlsSchedaLocaleL:WORD; (* H:Uscita della scheda remota da comandare L:Ingresso della scheda locale che commuta l'uscita *)

SchedaRemotoD:WORD; (* Indirizzo della scheda di cui voglio camndare l'usicta con un pulsante locale della scheda attuale *)

OutSchedaRemotaDHPlsSchedaLocaleL:WORD; (* H:Uscita della scheda remota da comandare L:Ingresso della scheda locale che commuta l'uscita *)

Free12:WORD;

Free13:WORD;

Free14:WORD;

Free15:WORD;

Free16:WORD;

ErroreLettura:WORD;

NumeroErroriLettura:WORD;

ErroriScrittura:WORD;

NumeroErroriScrittura:WORD;

Free20:WORD;

Free21:WORD;

Free22:WORD;

Free23:WORD;

Free24:WORD;

Free25:WORD;

Free26:WORD;

Free27:WORD;

Free28:WORD;

Free29:WORD;

END_STRUCT

END_TYPE

in Global_variable:

VAR_GLOBAL RETAIN

ArchivioSchede AT %MW12 : ARRAY [1..2] OF Scheda; (* ......finiscono alla word 2250 *)

END_VAR

Cosi facendo mi trovo due array di tipo Struct, allocate (istruzione AT) e ritentive!!! Se spengo e accendo il PLC ed i valori me li mantiene........

bho forse non ho compreso bene quello che ti serve....

ciao

Link al commento
Condividi su altri siti

ah lucipro ,

visto che usi l'841 ti è mai capitato che ogni tanto non si puo accedere alla memoria via modbus?.... nell'area retain ho in lettura/scrittura pannello maple e un modbus monitor da pC, ogni tanto il pannelllo segnalA "errore modbus tcp" e il modbus monitor si sconnette e delle volte mi caccia fuori anche il codesys, per non parlare dei certi momenti di "parlalisi generale" con tutte le luci che lappeggiano rosse fino a che non si leva la corrente

Si a volte me lo fa ma solo se sono collegato con il PC con il codesys e tengo collegato anche il Touch XBTGT.......

Solo con il pannello non mi rompe le scatole........

Devono esserci dei parametri nel web gate per controllare la comunicazione ethernet ma sinceramente non ho vuto voglia di guardarci.... :rolleyes: :rolleyes:

Link al commento
Condividi su altri siti

putroppo anche con il tuo codice non mi rimangono i dati in memoria nell struct :'(

ho organizzato il mio programma pratiamente nello stesso modo tuo, e quasto mi fa piacere essendo che è il mio primo vero programma in codesys di una certa "dimensione"

c'è mica qualcosina da spuntare? la cosa buffa è che le variabili singole messe in retain che siano allocate in %MW che non, mantengono il valore.........

grazie:)

Modificato: da cesco_sitec
Link al commento
Condividi su altri siti

cesco scusa,

ma quello che ti ho scritto è un software testato....

putroppo anche con il tuo codice non mi rimangono i dati in memoria nell struct :'(

vediamo di chiarirci.

1- Hai fatto prima di spegnere il comando online--> Create Boot Project ??

2- Crea una tabella delle variabili e metti in visulaizzazione ad esempio:

.ArchivioSchede[1].AnalogOutput

.ArchivioSchede[1].ApgDimmer1

.ArchivioSchede[1].ApgDimmer2

.ArchivioSchede[1].ApgIsteresiTemp

.ArchivioSchede[1].ApgTemperatura1Aut

.ArchivioSchede[1].ApgTemperatura1Man

.ArchivioSchede[1].ApgTemperatura2Aut

.ArchivioSchede[1].ApgTemperatura2Man

.ArchivioSchede[1].ApgTemperaturaMode

Scrivigli un valore...... a quel punto spegni ed accendi e lui te lo deve tenere!!!!!!!! Non ha scuse.

Ma quando spegni ed accendi e ti ricolleghi online ti chiede di riscaricare il programma???

ho organizzato il mio programma pratiamente nello stesso modo tuo, e quasto mi fa piacere essendo che è il mio primo vero programma in codesys di una certa "dimensione"

non ti illudere: sono un principiante pure io :rolleyes: :rolleyes:

Dai che prima o poi risolviamo......al costo di spedirti tutto il mio programma per vedere se è un problema di cpu......

ciao

Link al commento
Condividi su altri siti

allora , il tuo codice son riuscito a far rimanere la variabile in retain,

beche avevo "crea automaticamente progetto di boot" lo rifatto da online e la cosa mi sembra funzionare, ora devo vedere il mio codice, vedro un po' di manovare un po' !!!!!

grazzie mille mi ha dato dei riferimenti molto importanti

ciao ciao

PS tra 62 minuti vado in ferie......... buone vacanze anche a te

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