Vai al contenuto
PLC Forum


M340: Mantenimento Dati Durante Il Download Del Progetto


Cronos.

Messaggi consigliati

Buongiorno,

è il mio primo post, per tanto metto una piccola premessa, ho notato che l'username Cronos è già occupato, ma ho altresì notato che non sembra molto attivo per tale motivo ho ritenuto che l'utilizzo di questo username non creasse confusione, in caso qualcuno si confonda chiederò la modifica dell'username

Dopo qualche anno di programmazione con siemens ( s7 200 ) mi sono ritrovato che il plc ormai era troppo piccolo per alcune esigenze e ho deciso di cambiare, mi sono diretto quindi verso l'm340, fino ad ora mi sto trovando molto bene, ma ho alcune questioni ancora non risolte, ve ne espongo una che mi preme abbastanza poi se avrete pazienza vi esporrò anche le altre

Ho verificato che tutte le variabili non allocate quando viene trasferito il programma perdono il loro valore

Mi pare che questo non avvenga quando creo una modifica e non ricompilo il tutto, ma è irrilevante perchè spesso mi ritrovo a dover rifare la compilazione perchè è stato aggiunto qualcosa o modificato qualcosa che deve essere modificato obbligatoriamente offline.

Ci sono alcuni dati ( rapporto impulsi/mm, tempi, offset.. chi più ne ha, più ne metta ) che necessitano di rimanere salvati in maniera permanente, ma che non possono divenire hard-coded ( scritti direttamente nel codice come costanti ) poichè devono rimanere modificabili ( ovviamente ) da pannellino ( tipico esempio dei tempi )

Guardandomi in giro ho notato che c'è 1 bit che se valorizzato permette di "salvare" il valore attuale di una data variabile nello spazio "valore" di default della variabile, questo per quanto riguarda le non-allocate, ho pensato che questo fosse un po la soluzione al problema, quando si fa una modifica si setta questo bit, si salva tutto e via.. e può essere fatta anche da pannellino, insomma, molto comoda come cosa, ma per riuscire ad ottenere questi "valori" aggiornati bisogna ri-tirare su tutto il programma dal plc.. cosa che ovviamente annulla tutte le modifiche che sono state fatte offline da casa.

Ho verificato quindi che allocando ( e la cosa spesso non è indolore ) queste variabili è possibile caricare il "blocco dati" ( come lo chiama la siemens ) su un file e, finito il download, riscaricarlo, ma non si può definire certo una modalità semplice e tranquilla, non sarà la prima ne l'ultima volta che mi capiterà di scaricare il programma dimenticando di caricarmi prima l'ultima versione dei dati e quindi perdere tutte le modifiche che sono state fatte durante il collaudo o dagli operatori mentre la macchina va.

Mi domandavo quindi se ci fossero soluzioni alternative / più veloci / più tranquille per ottenere lo stesso effetto: non perdere i dati

cosa che su siemens si fa semplicemente evitando di scaricare il blocco dati.

Mi domandavo inoltre, non avendo trovato sufficienti informazioni in merito, se tutte le variabili ( allocate e non allocate che siano ) mantengono il loro valore "per sempre" se il plc rimane spento per mesi o se devo fare qualche operazione per salvarle in maniera definitiva

Link al commento
Condividi su altri siti


Ciao Cronos., penso che tu non abbia cercato nell' H elp....

Ribadisco qui ancora che l'H elp di Unity è estremamente chiaro su tutti i punti ed è anche un ottimo manuale di automazione per molti aspetti.

Ad ogni modo la pagina in allegato dovrebbe fare al caso tuo

Link al commento
Condividi su altri siti

Ho cercato, ma non avevo trovato questa pagina, anche ora nonostante tu me l'abbia segnalata ( il pdf non si leggeva, mi dava caratteri strani ) ho faticato a trovarla.

Nonostante una lettura di questa pagina, non sono ancora arrivato al nocciolo della questione

- %S66 salva il programma, questo può essermi utile se voglio copiare il programma da una scheda ad un altra, o ad altre funzioni che per ora non mi vengono in mente, ma questo non può aiutarmi, se ho ben capito, quano io faccio il download di una modifica ( magari fatta offline perchè ho scambiato due uscite )

- Su un fronte di salita %S94, i valori correnti sostituiscono i valori iniziali nella memoria interna, e questo è il bit di cui parlavo nel mio post, ma non vedo, anche in questo caso, come questo possa aiutarmi, quando io scarico il programma creato facendo 1 modifica offline io questi parametri li perdo perchè, se non ho capito male, vengono salvati modificando il programma che c'è nel plc, ma io sostituendo quel programma, sono ancora d acapo

- SAVE_PARAM mi pare di capire che salvi le impostazioni dei moduli, ma anche in questo caso, non si parla di dati e vige ancora la regola che se io riscarico il programma torno da capo

- Backup di MW, lo può fare lui con un bit, va bene, ma anche qui, come può aiutarmi? quando scarico viene mantenuto? e anche se così fosse.. dovrei ogni volta ricordarmi di attivarlo, a meno di non farlo "ogni tot" oppure in maniera automatica ( in un qualche modo che per ora non mi viene ) ogni modifica dei dati o chessò, al primo avvio così quando arrivo spegno e riaccendo e so che lui ha salvato tutto.. ma anche in questo caso, scaricando il programma penso che lo perdo, non è ben chiaro nemmeno questo punto.. e anche se non lo perdessi cosa dovrei fare? scaricare e poi riaccendere per fare in modo che lui ricarichi quei parametri?

In definitiva per ora sono nella situazione dove:

- Non ho capito come si possono salvare i parametri di variabili non allocate ( sempre che si possa fare ) per mantenerli dopo un download dell'applicazione ( se c'è stata una modifica offline )

- So come si possono salvare le %MW, volendo posso anche farlo a mano e riscaricarle, ma questo risolve i problemi solo in parte perchè mi obbliga ad allocare tutte le variabili, si può anche fare,non è il massimo della comodità.. ma si può fare

- Quando cambio una struttura aggiungendo un bit se ho un array di queste strutture mi sono dato una zappata sui piedi perchè le variabili allocate risentono di questo problema.. lui fa una copia spudorata dei dati e la rimette dentro, se però questi dati in seguito a questo nuovo bit o nuova word vengono shiftati di un paio di word fa un disastro ( come mi è successo ieri, per fortuna avevo i parametri su carta e son riuscito a ricostruire tutto )

Di solito su siemens lasciavo 1 po di spazio libero ( un bello spreco ) quando avevo questi array di strutture, quindi li distanziavo di una decina di word ( in dipendenza poi dai possibili sviluppi futuri, se è una cosa che è per forza chiusa e non sarà mai modificata lasciavo un paio di word giusto per qualche bit più una word, se è una cosa che poteva richiedere qualche tempo aggiuntivo ne lasciavo almeno una 20ina ), ma qui non posso fare questa cosa ( a meno di non allocarsi 20 strutture singolarmente e non tramite array.. ma qui perdo la comodità dell'indice dell'array ) perchè lui li alloca ( giustamente ) in maniera sequenziale senza lasciare nemmeno un bit di spazio

Link al commento
Condividi su altri siti

Di solito su siemens lasciavo 1 po di spazio libero ( un bello spreco ) quando avevo questi array di strutture, quindi li distanziavo di una decina di word ( in dipendenza poi dai possibili sviluppi futuri, se è una cosa che è per forza chiusa e non sarà mai modificata lasciavo un paio di word giusto per qualche bit più una word, se è una cosa che poteva richiedere qualche tempo aggiuntivo ne lasciavo almeno una 20ina ), ma qui non posso fare questa cosa ( a meno di non allocarsi 20 strutture singolarmente e non tramite array.. ma qui perdo la comodità dell'indice dell'array ) perchè lui li alloca ( giustamente ) in maniera sequenziale senza lasciare nemmeno un bit di spazio

Perchè dici che non puoi mettere spazi liberi?? Non capisco.

Perchè dici su siemens puoi fare certe cose che qui no? Non mi è chiaro.

Tecnicamente se fai modifiche offline al programma, il programma stesso sarà considerato giustamente nuovo e diverso, quindi con il download rischi di perdere tutti i dati.

Non fare modifiche offline o prepara il software in modo tale da poter essere ampliato come hai più o meno indicato. Sinceramente non mi è chiaro cosa non puoi fare che un plc con solo memoria allocata può fare...

Link al commento
Condividi su altri siti

Sinceramente non mi è chiaro cosa non puoi fare che un plc con solo memoria allocata può fare...

Un plc con memoria sia allocata che non allocata può fare le stesse cose di uno con memoria allocata.. ma non è vero il contrario, ovvero uno con memoria non allocata può fare cose che un plc con memoria allocata non può fare in maniera semplice ( vedasi annidamento di funzioni )

ed è uno dei motivi per cui ho abbandonato con un sorriso sgargiante la siemens.

Non ho detto che non si possono fare, ho detto che non so come fare ( che è ben diverso )

Per quanto riguarda lo spazio libero non posso ( o non so come fare ) perchè se creo una struttura, diciamo

Scarico

[

- Bit Fotocellula

- Bit Sensore

- Time Tempo1

- Time Tempo2

]

E ne faccio un array di questi, poniamo che me ne servano 20

lui li alloca in maniera contigua, quindi non ho spazio tra uno e l'altro

Poniamo che un domani mi serva aggiungere un tempo perchè il cliente ha deciso che ha un altra esigenza che prima non c'era, io a questo punto devo aggiungere 1 variabile di tipo time e mi scombussola la memoria

non posso lasciare spazio libero tra gli elementi dell'array a meno di non creare chessò 3 variabili di tipo time che per ora non servono a nulla e non so, 10 variabili di tipo bit che per ora non servono a nulla, solo in questo modo avrei lo spazio libero

però è abbastanza assurda come cosa a mio avviso, perchè non so mai cosa potrei dover aggiungere

un altro esempio che mi viene in mente sono i parametri del DFB per il controllo degli inverter / brushless, io posso tenere qualche bit di scorta, ma se magari devo aggiungere una funzione che mi mette in asse elettrico il brushless a meno di non tenere una vagonata di spazio libero, sforerò certamente

ma per tenere spazio libero dovrei creare delle variabili, a meno che non ci sia un settaggio "lascia 1 po di spazio libero tra uno e l'altro" che non ho trovato

( li inserisco sempre in array anche questi come dati in modo che sia semplice poi scorrerli per fare operazioni comuni a tutti, esempio il check dei fault, chessò l'inizializzazione, il display da pannello etc )

sarebbe diverso se ci fosse un opzione che mi lascia tra 1 elemento e l'altro dell'array un determinato spazio, ma questa funzione non l'ho trovata

Non fare modifiche offline o prepara il software in modo tale da poter essere ampliato come hai più o meno indicato. Sinceramente non mi è chiaro cosa non puoi fare che un plc con solo memoria allocata può fare...

Non fare modifiche offline.. pare semplice.. dovrei essere sempre dal cliente, se anche solo faccio una simulazione in locale per esempio, poi non posso più fare "crea modifiche", ma devo per forza trasferire ( o almeno, mi è parso che è questo che mi è successo oggi )

In più è classico il fatto di dover fare delle modifiche a casa perchè le modifiche richieste hanno una certa entità e farle in mezzo al rumore non è il massimo della vita, e quindi la probabilità che queste sforino e mi obbilghino a fare la modifica offline è molto alta

Inoltre unity pretende le modifiche offline anche per cose veramente banali come il cambio di un indirizzo topologico.. anche volendo è relativamente difficile non cascare nel dover far la modifica offline.. :angry:

Tecnicamente se fai modifiche offline al programma, il programma stesso sarà considerato giustamente nuovo e diverso, quindi con il download rischi di perdere tutti i dati.

non è che rischio.. li perdo proprio

però questo è inconcepibile, non posso in una macchina che ha 800 parametri copiarmeli tutti a mano e reinserirmeli tutti a mano, oppure mi ritrovo a pensare che "no ho solo aggiunto 1 bit non mi ha shiftato tutti i dati" mentre in realtà lo ha fatto

basterebbe che si copiasse i dati collegandoli alla variabile e non al suo spazio di allocazione e riconvertisse gli indirizzi nel nuovo formato, cosa che in un qualche modo fa quando si fa il crea modifiche ( salvo che è più semplice perchè penso che "accodi" tutte le nuove varibili non allocate alle precedenti e quindi non debba rimapparsi la memoria )

e personalmene non penso che tutti gli sviluppatori di m340 si segnino a manina tutti i parametri, quindi penso ci sia un modo più furbo per fare le cose.. che per ora non ho ancora trovato, per questo chiedo consiglio

Link al commento
Condividi su altri siti

Ho provato ad aggiungere delle word di "scorta" alla struttura, ma la cosa non mi convince molto, ho visto che se devo aggiungere qualche bit mi scombussola di nuovo gli indirizzi

Avete trovato un modo migliore per lasciare 1 po di spazio di scorta quando indicizzate una struttura?

Link al commento
Condividi su altri siti

Anche io ho avuto problemi come i tuoi;

alla fine ho risolto sostituendo la SD da

BMXRMS008MP a BMXRMS008MPF

(cioè con la SD che può contenere files).

Poi ho realizzato una routine che salva il

contenuto delle variabili in files sulla SD

che NON vengono persi durante il download

e/o ricompilazione globale. Al riavvio dopo

il dowload mi vado a leggere tali dati.

Prova a cercare nell'. le istruzioni

CREATE_FILE

OPEN_FILE

WR_DATA_TO_FILE

RD_FILE_TO_DATA

CLOSE_FILE

Link al commento
Condividi su altri siti

Appena ho visto la tua risposta l'ho ritenuta un ottima soluzione, mi sono messo a guardare le funzioni e ho esclamato "fanno proprio a caso mio!" e mi sono messo a testa bassa a scrivere codice per gestire tutto questo

Quando, dopo aver avuto alcuni problemi e pensando a come risolverli sono arrivato ad una conclusione:

scrivere su file questi dati non mi aiuta per niente, è solo una complicazione inutile

e ora ti esporrò anche il perchè:

poniamo di avere una struttura con 10 word al suo interno, la scriviamo su file

ne inseriamo 5 di queste strutture e le scriviamo su file ( in maniera contigua ovviamente perchè anche in questo caso non c'è margine per dare spazio libero e non sarebbe comunque una cosa gestibile )

detto questo modifichiamo la struttura e inseriamo un ulteriore word, quindi questa struttura avrà 11 word

andiamo ora a leggere da file

la lettura da file leggerà 11 word, praticamente 10 in quella vecchia ( e fin qui tutto ok ) e una di quella nuova ( ! ) e qui è l'inghippo, perchè torniamo esattamente al punto di prima:

cambiando la struttura i dati vanno a farsi benedire

l'unico modo per salvarsi sarebbe scriversi a mano queste dieci word, ma sarebbe un lavoro a dir poco massacrante ( ho strutture con 30 elementi.. e queste sono in un array da 15.. 30*15 -> 450 scritture! )

mi domando cosa tu abbia risolto facendo così, hai forse dei dati sciolti?

Qualcuno ha altre idee?

Non mi sembra un problema così poco comune..boh, sarò io che faccio codice strano :/

Link al commento
Condividi su altri siti

Per prima cosa salva il file su SD; se la tua struttura dati è omogenea

(il classico array per capirci) puoi aprire il file e scrivere ad un punto

(indice o puntatore chiamalo come vuoi) che necessiti tu. Detto questo,

l'unica accortezza e di mantenere i dati inseriti per primi nelle stesse

posizioni e cioè dovresti cercare di aggiungere sempre in coda alla tua

struttura. Insomma, riuscirai ad avere un file "dinamico" se così possiamo

definirlo (almeno da quello che deduco leggendo dall'. di Unity v4.1).

Per spiegarmi ancora meglio, non devi tutte le volte riscrivere tutto il file

e quindi tutto 'array ma puoi scrivere / aggiungere solo l'elemento che ti

interessa.

Io non ho usato questo sistema perchè la mia applicazione non

lo necessita; in ogni caso non volevo farti perdere tempo ma solo darti

una mano .... <_<

Link al commento
Condividi su altri siti

Mi pare evidente che il tuo intento non fosse quello di farmi perdere tempo ;)

Lungi da me l'insinuare questo, tutt'altro, mi hai dato una possibile soluzione, solo che sono insorti dei problemi e mi domandavo tu come li avessi risolti visto che avevi detto che utilizzavi questo metodo per risolvere questo problema

L'unica cosa è che quest'ultima soluzione soluzione che hai prospettato è di difficile applicazione, ti faccio un esempio

Struttura
[
  - Elemento1
  - Elemento2
  ..
  - Elemento20
]
Ora, poniamo di aggiungere l'elemento 21
Struttura
[
  - Elemento1
  - Elemento2
  ..
  - Elemento20
  - Elemento21
]

per poter salvare i dati, e recuperarli dovrei inserire, come hai giustamente detto tu, l'elemento 21 in coda

ma questo implica che non potrei salvare facendo un write della struttura ma facendo un write dei singoli

dopotutto scrivere in coda non ha grande utilità, se io i dati li ho riportati in memoria, posso riscrivere tutto completamente senza problemi, tanto ormai li ho in memoria, non mi serve più il file vecchio

del resto, ponendo anche di non salvare prima di aver recuperato i dati, il problema è proprio il recupero

io non potrei recuperare i dati facendo una semplice lettura dell'intera struttura, perchè mi andrebbe a leggere dati incongruenti, quindi dovrei leggerli tutti e 20 a mano, uno per uno, per tutte le strutture..

un lavoro massacrante a dir poco, tanto più che devo creare ( se non ho capito male ) un istanza di quelle funzioni per ogni dato che vado a leggere, visto che non ho trovato un modo semplice per riuscire a gestire la cosa in quanto non è possibile avere array di tipo "any" o passare "any" ad un qualche dfb

( tra parentesi, avete trovato qualche escamotage per evitare di creare miliardi di istanze di dfb utilizzati spesso come le letture da can o similare? )

Modificato: da Cronos.
Link al commento
Condividi su altri siti

Vi aggiorno sullo stato dell'arte in modo che se qualcuno si ritroverà nel mio stesso problema, avrà un'indicazione

Dopo parecchie prove, lettura di vari . e tutto quanto, sono giunto alla conclusione che non c'è alcun modo per mantenere i dati in maniera umana tramite procedure da fare o altro

Si può però ovviare in parte al problema mettendo delle variabili di scorta, esempio

Struttura
[
  - Dato1
  - Dato2
  ...
  ...
  ...
  - Dato100
  - Scorta1 [ DINT ]
  - Scorta2 [ DINT ]
  ..
  - Scorta10 [DINT]
]
badate bene che ho messo 10 DINT di scorta, ma tutto dipende da quanto si è in previsione di modificare nelle "prossime puntate" se si è sicuri che non verrà mai cambiato, io lascerei un paio di DINT, altrimenti se c'è la possibilità che venga cambiato si adegua alle possibili modifiche anche strane che potrebbero venire in mente al cliente, fin tanto che lo spazio non è un problema si intende Detto questo, come noterete ho inserito DINT, ma questo non nega che io in futuro possa cambiare queste DINT di scorta e ottenerci TIME ( in questo caso basta solo cambiare il nome e il tipo ), INT ( in questo caso deve essere elimanto il DINT e inserito al suo posto 2 variabili di tipo INT ), WORD ( 4 word al posto della DINT ), BOOL ( 4*8 bool.. ma in questo caso rimane ovvio che conviene creare 1 INT + 1 WORD + 8 BOOL così se servono altri bool si converte la word, se ne servono altri si converte l'int in word+int, e così via ) In questo modo si rimane abbastanza flessibili per le modifiche senza il rischio di perdere i valori da notare che è MOLTO importante che non si scambino i dati esempio
Struttura
[
  ..
  - Scorta 1 [DINT]
  - Scorta 2 [INT]
  - Scorta 3 [BOOL]
]
non può diventare
[
  ..
  - Scorta 1 [DINT]
  - Scorta 3 [BOOL]
  - Scorta 2 [INT]
]
ne
[
  ..
  - Scorta 1 [INT]
  - Scorta 3 [BOOL]
  - Scorta 2 [INT]
  - Scorta 1_2 [INT]
]
pena la possibile perdita di dati perchè il sistema potrebbe ottimizzare in maniera differente lo spazio in questo caso la corretta sostituzione è
[
  ..
  - Scorta 1 [DINT]
  - Scorta 3 [BOOL]
  - Scorta 2 [INT]
]
diviene
[
  ..
  - Scorta 1_1 [INT]
  - Scorta 1_2 [INT]
  - Scorta 3 [BOOL]
  - Scorta 2 [INT]
]

Detto questo, vi ringrazio per la vostra consulenza

Link al commento
Condividi su altri siti

Cronos. wrote:

Detto questo, come noterete ho inserito DINT, ma questo non nega che io in futuro possa cambiare queste DINT di scorta e ottenerci TIME ( in questo caso basta solo cambiare il nome e il tipo ), INT ( in questo caso deve essere elimanto il DINT e inserito al suo posto 2 variabili di tipo INT ), WORD ( 4 word al posto della DINT ), BOOL ( 4*8 bool.. ma in questo caso rimane ovvio che conviene creare 1 INT + 1 WORD + 8 BOOL così se servono altri bool si converte la word, se ne servono altri si converte l'int in word+int, e così via )

In questo modo si rimane abbastanza flessibili per le modifiche senza il rischio di perdere i valori ...

Non sono convinto che cambiando SOLO il tipo di dato (senza comunque cambiare l' allineamento dei dati in memoria : 1 DINT --> 2 INT) non si perdano comunque i dati ! Appena ho un attimo di tempo effettuo questa prova ...

Cronos. wrote:

... da notare che è MOLTO importante che non si scambino i dati

Quanto dici mi fa infatti pensare che non sia possibile cambiare il tipo di dato (ripeto : anche senza cambiare l' allineamento in memoria) senza perdere tutti i valori in memoria.

Link al commento
Condividi su altri siti

Ho fatto delle prove prima di dirlo ;)

[
  ..
  - Scorta 1_1 [INT]
  - Scorta 1_2 [INT]
  - Scorta 3 [BOOL]
  - Scorta 2 [INT]
]
e
[
  ..
  - Scorta 1 [DINT]
  - Scorta 3 [BOOL]
  - Scorta 2 [INT]
]

lasciano assolutamente inalterato tutto il resto della struttura senza alcun problema

rimane ovvio che i dati di scorta 1 venogno persi, ma è anche ovvio questo in quanto il dato scorta 1 viene cancellato e diventa 2 dati differenti

prova in ogni caso giusto per maggior conferma, se trovi un caso in cui quello che ho detto non è vero ti prego di porgermi un esempio e di mostrarmelo, potrei ritrovarmi con dei problemi quando pensavo che non ve ne fossero e perdere ore e ore quando magari la macchina è in produzione.. un disastro insomma

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