Vai al contenuto

Resettare il sistema da programma utente

Home Forum Controllori SlimLine e Netsyst (LogicLab) Resettare il sistema da programma utente

Stai visualizzando 15 post - dal 1 a 15 (di 15 totali)
  • Autore
    Post
  • #35405
    Maurizio Conti
    Partecipante

    Vorrei 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 ?

    #37754
    Sergio Bertana
    Amministratore del forum

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

    #37755
    Sergio Bertana
    Amministratore del forum

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

    #37761
    Maurizio Conti
    Partecipante

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

    #37762
    Sergio Bertana
    Amministratore del forum

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

    #37767
    Maurizio Conti
    Partecipante

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

    #37768
    Sergio Bertana
    Amministratore del forum

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

    #37769
    Maurizio Conti
    Partecipante

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

    #37770
    Sergio Bertana
    Amministratore del forum

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

    #38128
    Maurizio Conti
    Partecipante

    Il 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 ?

    #38129
    Sergio Bertana
    Amministratore del forum

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

    #50127
    Rubox
    Partecipante

    Leggendo 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?

    #50194
    Sergio Bertana
    Amministratore del forum

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

    #70065

    Mi 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

    #70095
    Sergio Bertana
    Amministratore del forum

    Per 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;
Stai visualizzando 15 post - dal 1 a 15 (di 15 totali)
  • Devi essere connesso per rispondere a questo topic.