Vai al contenuto
PLC Forum


Caricamento DB in Runtime da software


Scaram

Messaggi consigliati

Salve,

come da titolo mi domandavo se fosse possibile caricare una DB nel PLC durante il Runtime.ma non "a mano" bensì tramite programmazione.

Tanto per intendersi, esiste una maniera per fare quanto descritto di seguito?


      U     #condizione     //se la condizione è VERA
      SPBNB _001
      #carica DB100        //carico la DB100
     SPA _fine
_001:                             //se la condizione è FALSA
      #carica DB200        //carico la DB200
_fine:

     NOP 0
 

So che può sembrare assurdo o senza senso ma lo chiedo perchè mi servirebbe, soprattutto nella OB100, e perchè in passato mi pare di aver letto, sempre in giro nei forum, che una cosa del genere fosse possibile per quanto ostica e sconsigliata.

 

Grazie dell'attenzione, un saluto :)

Link al commento
Condividi su altri siti


6 minuti fa, ken scrisse:

cosa intendi per "caricare"? creare un blocco dati e popolarlo con dei dati?

No intendo proprio caricarlo in memoria(come quando fai CTRL+L per caricare un FC modificata), nel senso che prima di ciò la DB100 non esiste "ONLINE", perchè non ancora caricata appunto.

Link al commento
Condividi su altri siti

Quello che chiedi tu è una funzione del dispositivo di programmazione e non è una funzione da HMI.

Se proprio devi gestire un caricamento di dati su eventi sarà meglio che pensi ad una gestione a ricette.

 

Link al commento
Condividi su altri siti

è la stessa cosa che ho detto alla fine. creare un blocco dati nella RAM della cpu.

una domanda, come fai a sapere che non è caricato?

 

in ogni caso in ob100 crei il tuo blocco dati con sfc22. dopo aver lanciato sfc22 viene creato un blocco dati con numero che volevi e delle dimensioni che volevi.

dopo averlo creato, con sfc20 copi i dati da un db in quello appena creato on line se il blocco di origine è già in ram, altrimenti con istruzioni move scrivi i valori nei vari indirizzi.

sfc22 lo trovi nelle librerie.

Link al commento
Condividi su altri siti

37 minuti fa, ken scrisse:

è la stessa cosa che ho detto alla fine. creare un blocco dati nella RAM della cpu.

una domanda, come fai a sapere che non è caricato?

 

in ogni caso in ob100 crei il tuo blocco dati con sfc22. dopo aver lanciato sfc22 viene creato un blocco dati con numero che volevi e delle dimensioni che volevi.

dopo averlo creato, con sfc20 copi i dati da un db in quello appena creato on line se il blocco di origine è già in ram, altrimenti con istruzioni move scrivi i valori nei vari indirizzi.

sfc22 lo trovi nelle librerie.

Avevo fatto l'esempio di blocco non caricato per semplicità, in effetti mi servirebbe di più poter sovrascrivere un blocco esistente ma quello immagino non sia possibile.

Interessante la SFC22, non la conoscevo oppure ne avevo rimosso l'esistenza :)

Grazie mille per le cortesi e celeri risposte ^_^

Link al commento
Condividi su altri siti

Quote

No intendo proprio caricarlo in memoria(come quando fai CTRL+L per caricare un FC modificata), nel senso che prima di ciò la DB100 non esiste "ONLINE", perchè non ancora caricata appunto.

E da dove lo dovrebbe caricare? Da qualche parte questo DB ci dovrà pur essere.
Ci sono istruzioni per creare nuovi DB, oppure per caricare in memoria di lavoro un DB presente solo nella memoria di caricamento (sulla MMC).
Ma se il DB non esiste da nessuna parte, non capisco come possa il PLC decidere di andare a prenderselo non si sa da dove.
Se, invece, intendi che se lo dovrebbe prendere in automatico il PLC da un eventuale PC con il sistema di sviluppo e il progetto aperto, non esistono istruzioni per questo. E nemmeno ne vedo l'utilità.

 

Forse, se spieghi quello che intendi fare, scopriamo che si possono seguire altre strade.

Link al commento
Condividi su altri siti

1 ora fa, batta scrisse:

E da dove lo dovrebbe caricare? Da qualche parte questo DB ci dovrà pur essere.
Ci sono istruzioni per creare nuovi DB, oppure per caricare in memoria di lavoro un DB presente solo nella memoria di caricamento (sulla MMC).
Ma se il DB non esiste da nessuna parte, non capisco come possa il PLC decidere di andare a prenderselo non si sa da dove.
Se, invece, intendi che se lo dovrebbe prendere in automatico il PLC da un eventuale PC con il sistema di sviluppo e il progetto aperto, non esistono istruzioni per questo. E nemmeno ne vedo l'utilità.

 

Forse, se spieghi quello che intendi fare, scopriamo che si possono seguire altre strade.

Scusatemi, forse è meglio spiegare con calma...

 

In pratica su una macchina di linea che seguo ci sono sempre dei problemi in seguito ad un blackout e conseguente riavvio della macchina.

I problemi consistono nel malfunzionamento, o meglio nel non funzionamento, della comunicazione Modbus tra PLC ed una telecamera lineare. Per ovviare a questa situazione di "empasse" occorre mettere in stop la CPU, caricare dal progetto offline le 2 DB utilizzate per la configurazione e la gestione del Modbus e mettere nuovamente in Run la CPU. il tutto naturalmente tramite PC con SIMATIC MANAGER. 

Così facendo la comunicazione riprende, ovvio dato che in pratica riparte da zero come se fosse la prima volta, ma è una procedura assolutamente fuori standard e impossibile da replicare dai manutentori semplici.

La mia idea era di salvare sulla memoria di caricamento 2 DB di backup di quelle incriminate e, al riavvio del PLC in seguito al blackout, ricaricarle automaticamente tramite la OB100.

Non sono sicuro però che sia possibile caricarle in memoria di lavoro se già esistono in essa, ovvero sovrascriverle.

Avevo pensato anche ad un'altra soluzione, ovvero caricare una copia delle DB nella memoria di lavoro con il solo scopo di fungere da copie campioni in caso di ripristino. Al riavvio dopo il blackout intendevo copiare il contenuto delle 2 copie all'interno delle 2 DB "ufficiali" utilizzando la SFC20.

Link al commento
Condividi su altri siti

25 minuti fa, ken scrisse:

ti basta salvare i valori attuali come valori iniziali...

oppure salvare la ram in rom (dipende dalla cpu)

I valori iniziali sono già settati come si deve, nonostante ciò al riavvio la comunicazione rimane in stallo.

Il salvataggio RAM in ROM non l'ho mai provato, pur sapendo più o meno cosa fa non lo abbiamo usato praticamente mai.

Link al commento
Condividi su altri siti

Quote

I valori iniziali sono già settati come si deve, nonostante ciò al riavvio la comunicazione rimane in stallo.

Il DB è ritentivo. Spegnendo e riaccendendo la CPU, oppure col passaggio da stop a run, viene eseguito un avviamento a caldo. Nei DB non vengono caricati i valori iniziali, ma rimangono i valori che c'erano prima dello spegnimento o del passaggio in stop. Puoi provare a vedere cosa succede configurando il DB come non ritentivo.

 

Comunque, se la comunicazione non riprende spontaneamente, probabilmente è rimasto qualche flag in uno stato non corretto.
Secondo me ti basta individuare questo flag (potrebbero essere anche più di uno) ed impostarlo nel modo corretto in OB100 o con comando da HMI.

 

Quote

La mia idea era di salvare sulla memoria di caricamento 2 DB di backup di quelle incriminate e, al riavvio del PLC in seguito al blackout, ricaricarle automaticamente tramite la OB100.

Questo lo puoi fare (ed è quello che ho già suggerito), ma è una cosa ben diversa da quella che chiedevi nei tuoi precedenti post.

Le istruzioni da usare sono WRIT_DBL e READ_DBL.

Attenzione che le operazioni potrebbero richiedere più di una scansione del PLC per essere completate, quindi, fino a quando "BUSY" non sarà tornato a zero, non devi modificare il contenuto del DB.
 

Link al commento
Condividi su altri siti

il 12/12/2017 at 11:22 , batta scrisse:

Il DB è ritentivo. Spegnendo e riaccendendo la CPU, oppure col passaggio da stop a run, viene eseguito un avviamento a caldo. Nei DB non vengono caricati i valori iniziali, ma rimangono i valori che c'erano prima dello spegnimento o del passaggio in stop. Puoi provare a vedere cosa succede configurando il DB come non ritentivo.

 

Comunque, se la comunicazione non riprende spontaneamente, probabilmente è rimasto qualche flag in uno stato non corretto.
Secondo me ti basta individuare questo flag (potrebbero essere anche più di uno) ed impostarlo nel modo corretto in OB100 o con comando da HMI.

 

Questo lo puoi fare (ed è quello che ho già suggerito), ma è una cosa ben diversa da quella che chiedevi nei tuoi precedenti post.

Le istruzioni da usare sono WRIT_DBL e READ_DBL.

Attenzione che le operazioni potrebbero richiedere più di una scansione del PLC per essere completate, quindi, fino a quando "BUSY" non sarà tornato a zero, non devi modificare il contenuto del DB.
 

 

Innanzitutto grazie della disponibilità, cortesia e pazienza :

 

Ho risolto il problema "semplicemente" settando un flag della DB che gestisce la comunicazione Modbus al riavvio della CPU (OB100); nello specifico non si tratta altro che del bit che, richiede l'invio del telegramma(lato Cient) o abilita la ricezione dello stesso (lato Server).

 

La soluzione era molto più semplice di quanto la mia mente avesse elaborato, per fortuna aggiungerei :)

 

La creazione (e cancellazione) delle DB in tempo reale è un argomento interessante ma credo sia veramente utile solo in pochissimi casi eccezionali, negli altri casi il loro utilizzo mi sembra più che altro pericoloso oltre che poco pratico.

 

Grazie ancora a tutti quelli che hanno risposto e partecipato ^_^ 

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