programmazione dei casi di EMERGENZA negli automi Industriali

salve sto progettando un automa che abbia requisiti di sicurezza a norma europea. Sto usando Arduino Uno. E ho quasi finito i diversi sketch, mi manca solo la routine d'emergenza, che deve essere creata usando la funzione interrupt. Ricordo che l'emergenza ferma il flow chart e disabilita tutti gli input di un'automa. Il mio problema è: una volta definita la routine d'interrupt come riprendo il main o il loop() principale dal punto in cui è stato interrotto?. Ho provato con la funzione detachIterrupt() ma rimane all'interno della routine emergenza. Sapete darmi un aiutino? L'ideale sarebbe che Impostato l'interrupt tipo attachInterrupt(0,emergenza,RISING); ==> emergenza() ci sia una condizione o un ciclo "do" che accerti che fino a quando l'input "reset" non sia premuto rimanga in emergenza() ma se resettato ritorni nel loop().

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Secondo me non hai le basi per programmare qualcosa di essenziale o di sicurezza.
Poi Arduino é una piattaforma di prototipizzazione senza certificazioni che la norma che citi sicuramente pretende.
Ciao Uwe

http://pighixxx.com/unov3pdf.pdf

http://pighixxx.com/PNG/121.png

http://pighixxx.com/PNG/192.png

Cosa vuoi dirci con queste immagini?
Ciao Uwe

vabbè ho capito me la vedo da solo come ogni cosa.

Te la sei presa perché Uwe ti ha fatto notare che Arduino non ha certificazioni di sicurezza o forse perché ha dei dubbi sulla tua preparazione?

Sinceramente anche io ho delle perplessità a riguardo.

Le emergenze dovrebbero staccare l'alimentazione dei motori (output e non input) e comunque in modo indipendente dal controller, ad esempio interrompendo l'alimentazione delle bobine dei relè.

Quanto al tuo quesito, dopo aver fatto scattare la routine di emergenza, dovresti controllare un ingresso separato per ripristinare il funzionamento.

Esatto, le certificazioni industriali prevedono esplicitamente che l'azionamento di un'emergenza IMPEDISCA la ripresa dell'esecuzione del lavoro e/o il riavvio della macchina senza l'intervento esplicito di una persona ... per questo, ad esempio, i "funghi" dei pulsanti di arresto di emergenza sono del tipo a blocco automatico, che una volta premuti richiedono di essere ruotati (o addirittura per certe apparecchiature, sbloccati con una chiave) per poter riaccendere la macchina ...

Qualsiasi sistema che in caso di arresto di emergenza si ripristini da solo, senza l'intervento umano, non importa quanto ben fatto, non sarebbe a norme ...

Secondo me non hai le basi per programmare qualcosa di essenziale o di sicurezza.
Poi Arduino é una piattaforma di prototipizzazione senza certificazioni che la norma che citi sicuramente pretende.
Ciao Uwe

Però nulla vieta di usare Arduino per lo sviluppo di un progetto che sarà destinato ad uso industriale.
Posso anche pensare che l'intento sia sperimentale, una organizzazione si è posto l'obbiettivo di verificare se Arduino è un valido strumento di sviluppo anche per quelle applicazioni industriali e se non lo fosse lo scopriranno nel dettaglio durante il tentativo di uso.

Non sono aggiornatissimo in merito alle norme industriali, ho solo notato che c'è la volontà di spingere sui PCL certificati, ma non escludo si possa certificare una scheda con su un AVR e un software basato su arduino lib (almeno in parte).

Comunque ammesso che avete visto più lontano di me, il problema rimane e a livello tecnico può essere interessante discuterne.

In una ISR c'è un while(1); una volta entrato nella ISR (o funzione utente di attachInterrupt()) non esce più.
Per escire dal while si inserisce codice che controlla lo stato di un pin di ingresso al fine di verificare quando diventa LOW e in tal caso si esce dal while con break e si ritorna al loop nel punto successivo all'interruzione.

ISR() {
    while (1) {
    if ( getReset() )
        break;

    }
}

Ciao.

Torado:
vabbè ho capito me la vedo da solo come ogni cosa.

Ma comunque cosa c'entrano le immagini ? C'e' pure il collegamento di un servo !?!?

Sono messaggi subliminali ;D

MauroTec:
Però nulla vieta di usare Arduino per lo sviluppo di un progetto che sarà destinato ad uso industriale.
Posso anche pensare che l'intento sia sperimentale, una organizzazione si è posto l'obbiettivo di verificare se Arduino è un valido strumento di sviluppo anche per quelle applicazioni industriali e se non lo fosse lo scopriranno nel dettaglio durante il tentativo di uso.

Non sono aggiornatissimo in merito alle norme industriali, ho solo notato che c'è la volontà di spingere sui PCL certificati, ma non escludo si possa certificare una scheda con su un AVR e un software basato su arduino lib (almeno in parte).

Comunque ammesso che avete visto più lontano di me, il problema rimane e a livello tecnico può essere interessante discuterne.

In una ISR c'è un while(1); una volta entrato nella ISR (o funzione utente di attachInterrupt()) non esce più.
Per escire dal while si inserisce codice che controlla lo stato di un pin di ingresso al fine di verificare quando diventa LOW e in tal caso si esce dal while con break e si ritorna al loop nel punto successivo all'interruzione.

ISR() {

while (1) {
    if ( getReset() )
        break;

}
}




Ciao.

Maurotec e Etemenanki hanno capito di cosa parlo. Lavoro in una industria. Parto dal primo punto. Sfatare i PLC, anche perchè sempre più periferiche di un'automa sono controllati da microcontrollori che poi comunicano con un plc di processo. Arduino come altri costa poco ed prestante come un PLC da 100 euro se non di più. L'automa sarà una pesatrice, e avrà il punsante di emergenza e i carter di protezione se sarà necessario. Vi spiego il mio problema che mi lacera... Il pulsante d'emergenza non solo stacca con dei relay d'emergenza le periferiche di OUTPUT ma interompe il ciclo di lavoro, immaginate se le periferiche fossero staccate ma atmega continua a lavorare... al ripristino succederebbe il finimondo perchè non possiamo immaginare a che punto del flowchart si trovi. Uso arduino UNO e vi dico che i pin di un lato sono tutti occupati. Il pulsante a fungo per l'emergenza interompe in qualsiasi momento il lavoro della macchina.

esempio con un servomotore

void setup()
pulsante reset
sevo.attach
attachInterruput(0,emergenza,RISING)

loop()
{
abilitiamo nel loop l'interrupts()
.

.
.
servo lavora in base agli input che riceve
.
.
}

emergenza() //il pulsante oltre che ad attivare l'interrupt con dei relay leverà l'alimentazione
{
do{
accendi led 13 per allarme;
servo.detach(); //disabilito il servo - per sicurezza e in caso debba intervenire l'operatore
}
while (emergenza==0 || reset==0) // fai questo fino a quando questa affermazione è falsa
detachInterrupt(0);
/ADESSO VIENE I PUNTO CRUCIALE PERCHÈ NON RIESCO AD USCIRE DALLA ROUTINE DALL'ALLARME/
}

non capisco come usare il detachinterrupt... posso usarlo così detachInterrupt(0,FALLING)? stacca l'interrupt andando nel loop nel fronte di discesa di un segnale?

questo è il mio sketch

#include <Servo.h>
Servo tramog;
int ledall=13;
int reset=4;
int emerg=1;

void setup()
{
  pinMode(ledall,OUTPUT);
  pinMode(reset,INPUT);
  pinMode(emerg,INPUT);
}

void loop()
{
  attachInterrupt(0,emergenza,HIGH);
  interrupts();
  digitalWrite(ledall,LOW);
  tramog.attach(3);
  tramog.write(50);
  delay(1000);
  tramog.write(100);
  delay(1000);
  tramog.write(200);
  delay(1000);
}

void emergenza()
{
  do{
    digitalWrite(ledall,HIGH);
    tramog.detach();
  }
  while(digitalRead(emerg)==1||digitalRead(reset)==0);
  detachInterrupt(0);
  delay(500);
}

c'è qualcosa che sbaglio

non riprende da dove ho interrotto il ciclo... e poi quando carico il firmware se non stacco tutte le periferiche mi da l'errore di comunicazione avrdude: stk500_recv(): programmer is not responding

Torado:
non riprende da dove ho interrotto il ciclo... e poi quando carico il firmware se non stacco tutte le periferiche mi da l'errore di comunicazione avrdude: stk500_recv(): programmer is not responding

Non devi attacare niente sui pin 0 e 1.

Stai dimostrando che non ha le basi e vuoi programmare qualcosa di molto critico.

Uno Stop di emergenza deve funzionare in modo piú semplice possibile e piú affidabile possibile che vuol dire privo di fattori inaffidabili come un microcontroller per fermare l'apparecchio o dispositivo. Se da questa azione deriva che va buttato la produzione di 2 ore é cosí.

È uno Stop di emergenze per salvare l' incolumitá di un operatore dove si accettano danni.

L' ultimo Stop di Emergenza nella mia ditta premuto per ignoranza cosó 55000€ e 3 giorni fermomacchina dove una azione apropriata avrebbe significato un fermomacchina di 2 giorni e un costo di qualche mile €.
Ma é giusto che il Stop sia presente e funzionante in quel modo.

Ciao Uwe

Se tu hai le basi per programmare e per aiutare qualcuno fallo! Se non ti fermavi a dire solo cose lapalissiane. Penso che non hai letto proprio niente dei miei precedenti post.

non riprende da dove ho interrotto il ciclo... e poi quando carico il firmware se non stacco tutte le periferiche mi da l'errore di comunicazione avrdude: stk500_recv(): programmer is not responding

Un problema per volta, quindi risolvi prima il problema di avrdude che come dice uwe potrebbe essere dovuto al fatto che impegni i pin 0 e 1 che fanno capo alla seriale.

Documentati meglio sugli interrupt, ne hai necessità. Usa il manuale del ATmega328 scaricabile da Atmel.
In questo caso non serve usare detachInterrupt(0), in quanto all'ingresso nella ISR gli interrupt sono disabilitati, in pratica una ISR non è interrompibile. In più detachInterrupt(0) disabilita il tasto Emergenza e poi nel loop dovrai trovare il modo di riabilitarlo.

void emergenza()
{
  do{
    digitalWrite(ledall,HIGH);
    tramog.detach();
  }
  while(digitalRead(emerg)==1||digitalRead(reset)==0);
  digitalWrite(ledall,LOW);  // qui spegni il led che prima avevi acceso
  /* qui dovresti riattivare tramog */
    
  /* detachInterrupt(0); */
  /* delay(500); */
}

PS: Alcune cose di Arduino code non sono pensate per l'uso che ne vuoi fare, tieni conto di questo, ad esempio la seriale con gli interrupt abilitati, evita la classe String.

Ciao.

Okkay mi informerò e troverò il modo. Grazie sei stato esuastivo. Anche se va già lo sketch e se vedi si riabilita l'interrupt nel loop... provare per credere collega e al posto di un servo metti un led. Vedrai che tutto il sistema funziona.