Resettare il sistema da programma utente
Home › Forum › Controllori SlimLine e Netsyst (LogicLab) › Resettare il sistema da programma utente
- Questo topic ha 14 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 2 anni, 2 mesi fa da
Sergio Bertana.
-
AutorePost
-
Settembre 6, 2013 alle 6:49 am #35405
Maurizio Conti
PartecipanteVorrei scrivere una funzione di watchdog che mi resetti il PLC nel caso di eventuali impallamenti (nell’ipotesi chiaramente che l’impallamento lasci la funzione di watchdog operativa).
E’ possibile resettare lo Slimline da codice ST ?
Settembre 6, 2013 alle 6:53 am #37754Sergio Bertana
Amministratore del forumQuesto post mi dà l’opportunità di spiegare in modo dettagliato tutti i meccanismi di autocontrollo del funzionamento gestiti dal sistema operativo e dall’hardware dello SlimLine.
I sistemi SlimLine hanno un doppio circuito di watchdog hardware, uno basato su un circuito appositamente predisposto ed uno gestito internalmente dal processore ARM. Se il programma non rinfresca ciclicamente questi due watchdog il sistema viene resettato in modo hardware forzandone un riavvio. Tutta questa gestione è fatta appositamente per garantire che eventuali impallamenti del sistema non lo blocchino, la normativa IEC infatti prevede che in caso di blocchi sul funzionamento del programma il sistema riparta. Esistono poi ulteriori controlli gestiti in modo hardware dal processore ARM che provocano il riavvio del sistema:
Il programma fa un accesso ad un area di memoria errata.
Il processore trova nel programma una istruzione non corretta.
Vengono abilitati/disabilitati gli interrupts in modo anomalo.
Viene corrotta la memoria di heap del processore.Può succedere che nel programma trasferito sul sistema vi sia un errore grave che provoca il riavvio del sistema, in questo caso mi troverei in un vicolo cieco, il sistema ripartendo riesegue il programma in errore riavviandosi e questo all’infinito. Ecco allora che se SlimLine riconosce che era connesso ad un PC con l’ambiente di sviluppo LogicLab, in caso di errore non riavvia il programma ma si pone in stato di programmazione.
Settembre 6, 2013 alle 7:16 am #37755Sergio Bertana
Amministratore del forumAggiungo la risposta alla tua richiesta, come detto nel post precedente, SlimLine viene riavviato se il programma non rinfresca ciclicamente il circuito di watchdog, quindi se nel tuo programma ti blocchi in un loop infinito provochi il riavvio del sistema. E’ possibile ad esempio scrivere un programma del tipo:
WHILE (Di00CPU) DO END_WHILE;
Come si evince attivando la variabile Di00CPU (Definita come %IX255.0, ingresso 0 del modulo CPU) il programma si arresta in un loop infinito provocando il riavvio del sistema SlimLine per intervento del circuito di watchdog.
Attenzione! Eseguendo questo tipo di tests od in generale se il programma và sempre in errore può essere impossibile riconnettere il sistema a LogicLab, per risolvere il problema occorre eseguire un catch del sistema e la successiva cancellazione del programma (Vedi post).
Settembre 9, 2013 alle 4:03 pm #37761Maurizio Conti
PartecipanteHo provato ad impostare il reset inlooppando ‘opportunamente’ il programma con l’istruzione WHILE (TRUE) DO END_WHILE;
L’effetto che ottengo è perdere il controllo da parte di LogicLab (e penso anche la funzionalità del PLC) con segnalazione ERROR in rosso nella barra di stato. Da qui in avanti non è più possibile connettersi al PLC con LogicLab. Per farlo devo spegnere e riaccendere il PLC ed allora tutto ritorna a funzionare regolarmente.Settembre 10, 2013 alle 1:04 pm #37762Sergio Bertana
Amministratore del forumE’ quello che volevi ottenere. Se leggi bene il mio post, chiudendo il programma in un loop infinito, il sistema si resetta e quindi riparte dall’inizio (Esattamente come se venisse spento ed acceso).
La tua domanda era di eseguire un reboot su certe condizioni, ecco allora il loop infinito deve essere abilitato solo sulle condizioni nelle quali vuoi eseguire reboot.
Settembre 11, 2013 alle 10:10 am #37767Maurizio Conti
PartecipanteConfermo quello dici, il programma riparte ma viene persa la possibilità di controllare lo SlimLine da LogicLab. Anche disattivando la connessione e poi riattivandola, oppure uscendo e rientrando in LL, non ci si riesce più a connettere allo SlimLine. L’unico modo che ho trovato è spegnere e riaccendere lo SlimLine, allora anche LL funziona.
Settembre 11, 2013 alle 10:24 am #37768Sergio Bertana
Amministratore del forumMa che tipo di connessione usi con lo SlimLine ?
Connessione seriale, dovrebbe riprendere senza alcun problema.
Connessione TCP/IP su rete ethernet, eseguendo il reboot viene persa la connessione, occorre disabilitarla e poi riabilitarla.
Connessione TCP/IP su USB, occorre scollegare e ricollegare il cavo USB e/o come fai tu spegnere e riaccendere il dispositivo.Settembre 11, 2013 alle 4:38 pm #37769Maurizio Conti
PartecipanteUso la connessione TCP/IP su USB; effettivamente se scollego e ricollego il cavo USB dopo il ‘reset’ allora tutto torna a funzionare. Sicuramente ciò è meglio che spegnere/riaccendere il PLC.
Settembre 11, 2013 alle 4:48 pm #37770Sergio Bertana
Amministratore del forumIl problema è che il driver RNDIS di Windows sul reboot non si accorge della sconnessione del sistema e quindi mantiene attiva la connessione USB, lo SlimLine invece essendosi resettato ha interrotto l’endpoint e quindi non comunica più.
Scollegando il cavo o spegnendo e riaccendendo lo SlimLine viene a mancare il segnale elettrico sull’USB del PC il quale resetta tutte le connessioni attive.
Marzo 12, 2014 alle 1:53 pm #38128Maurizio Conti
PartecipanteIl modulo OEM PCB131A020 recentemente acquistato risulta avere un comportamento diverso dal MPS050A020 a seguito di un reset forzato: infatti mentre quest’ultimo riparte regolarmente il primo rimane fermo (devo dare lo start da LogicLab). Devo configurare qualcosa da qualche parte ?
Marzo 12, 2014 alle 2:47 pm #38129Sergio Bertana
Amministratore del forumIl modulo OEM è esattamente lo stesso circuito che trovi nel modulo completo MPS050A020, quindi non ci sono differenze circuitali. Puoi verificare se il firmware installato nei due moduli se è la stessa versione SFW184***0 in caso contrario puoi eseguire un upgrade (Vedi nota).Ma mi dici che devi dare uno start da LogicLab, mi chiedevo non è che quando forzi il reset hai LogicLab connesso, perché in tal caso il sistema si resetta, ma il programma utente non và in esecuzione.
Ottobre 11, 2019 alle 2:55 pm #50127Rubox
PartecipanteLeggendo sul forum mi imbatto in post che mi interessano, anche se “vecchi” di anni e mi sorgono domande su domande.
Interessante il poter riavviare il PLC ponendolo in un loop infinito. C’è un modo per accorgermi che il sistema si è riavviato per un qualcosa di anomalo? Tipo un flag bool che mi indica uno o più riavvii per il watchdog?
Ottobre 11, 2019 alle 3:03 pm #50194Sergio Bertana
Amministratore del forumAttualmente non è presente alcuna variabile che indichi che tipo di avvio ha avuto il sistema, ma trovo interessante l’idea e vediamo se possiamo inserire anche questa possibilità in una prossima release del sistema operativo.
Se vuoi “capire” che il sistema si è riavviato per un watchdog creato da te nel programma (Loop infinito), c’è un workaround. Prima di fermarti nel loop scrivi in una locazione di memoria backup un determinato valore (Esempio supponendo un UDINT 16#12345678). Poi attendi qualche secondo per garantire l’avvenuto backup del dato, puoi anche sincronizzarti testando la variabile SysBackupEnd, che dovrà attivarsi almeno 2 volte.
Ora alla accensione controlli il valore della variabile e se è il valore da te definito il sistema si è riavviato a causa del tuo comando. Naturalmente appena dopo il controllo devi porre a 0 il valore della variabile.
Febbraio 10, 2023 alle 9:44 am #70065Alessandro Campodonico
PartecipanteMi sono imbattuto in questa vecchia discussione, in quanto sarei interessato al reboot dello SlimLine da programma utente.
Mi chiedevo se negli anni sia stata implementata una “sistema alternativo per riavviare lo slimline da programma, o se è sempre da tenere valida la soluzione
WHILE (Di00CPU) DO END_WHILE
Febbraio 13, 2023 alle 11:06 am #70095Sergio Bertana
Amministratore del forumPer il restart del sistema è possibile utilizzare la funzione SysOSIDValue passando come OSID la definizione OSID_PLC_COMMAND con i valori:
- reboot: esegue il reboot del sistema.
- restart: esegue il riavvio del solo programma PLC, tutte le variabili sono azzerate.
Ecco un programma di esempio (Deve essere eseguito in task Back).
PROGRAM RebootRestart VAR i : UDINT; (* Auxiliary variable *) Reboot : BOOL; (* Reboot command *) Restart : BOOL; (* Restart command *) END_VAR IF (Reboot) THEN i:=SysOSIDValue(TRUE, OSID_PLC_COMMAND, ADR('reboot')); END_IF; IF (Restart) THEN i:=SysOSIDValue(TRUE, OSID_PLC_COMMAND, ADR('restart')); END_IF;
-
AutorePost
- Devi essere connesso per rispondere a questo topic.