Devo realizzare un programma per un macchina che deve fare una serie di operazioni (ingressi e uscite tutte digitali), volevo capire se il modo che ho impostato di procedere è corretto o se è più conveniente prendere altre strade. Ho cercato sul forum ma non ho trovato idee. In pratica, in questo esempio ho messo un pulsante Start, un pulsante Emergenza ed un pulsante Reset. Nel boot, azzero tutte le variabili poi un programma nel main ho realizzato questo programma che realizza una macchina a stati.
// Gestione comandi.
IF (Emergenza=TRUE) THEN Stato:=99; //Se si preme il pulsante emergenza và a stato 99
ELSIF ((Stato=0) AND (Start=TRUE)) THEN Stato:=1; //Se si preme il pulsante start và a stato 1
ELSIF (Reset=TRUE) THEN Stato:=0; //Se si preme il pulsante di reset và a stato 0
END_IF;
// Macchina a stati.
CASE Stato OF
1: //Stato 1 avanti finchè il sensore fondo non si attiva
IF (IM1Fondo=FALSE) THEN
Motore1:=TRUE;
ELSE
Motore1:=FALSE;
Stato:=2; //passa allo stato 2
END_IF;
2: //Stato 2 indietro finchè il sensore inizio non si attiva
IF (IM1Inizio=FALSE) THEN
Motore2:=TRUE;
ELSE
Motore2:=FALSE;
Stato:=0; //torna allo stato 0
END_IF;
99: //Stato 99 emergenza: si ferma tutto
Motore1:=FALSE;
Motore2:=FALSE;
ELSE //?
Motore1:=FALSE;
Motore2:=FALSE;
END_CASE;
In pratica è una macchina a stati, in cui lo stato 0 è tutto fermo. quando si preme il pulsante Start si passa allo stato 1 in cui si attiva il motore1 finchè non si raggiunge il fondo (sensore). A questo punto si passa allo stato 2 in cui si attiva il motore 2 finchè non si raggiunge l’inizio (altro sensore).
Il pulsante Emergenza, premuto in qualsiasi momento, fa passare allo stato 99 (tutto fermo), e per tornare allo stato 0 si deve premere il pulsante Reset.
Non so se magari sia più semplice usare delle FB per i vari spostamenti, ad esempio fare una FB con un parametro che indichi se spostare il carrello in avanti completamente o parzialmente (introducendo un altro sensore), o (se il motore lo permettesse con un ingresso analogico) un altro parametro per decidere la velocità di avanzamento, ecc…