Non ho riferimenti per il linguaggi Grafcet (o Graphcet)

Buongiorno,
è la prima occasione di contattare persone molto più esperte di me, di certo, su Arduino.
In passato (sono abbastanza datato) ho usato microcontrollori per creare antifurti e similari.
Avevo una azienda di produzione, competenza nulla nella programmazione scritta, ma con l'aiuto del sw Realizer di Actum, ho creato diverse apparecchiature.
Mi chiedo e vi chiedo se con Arduino e la libreria Grafcet potrei fare lo stesso o tentare almeno.
Scusate il noioso preambolo. Dove trovo una libreria per Arduino?.
Grazie.

Benvenuto, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

nid69ita

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Quelle librerie non le conosco, e non so come si possa sposare la programmazione grafica con Arduino. Tuttavia grafcet non è solo un linguaggio grafico, ma anche e soprattutto un metodo di descrizione/progettazione a stati, che si traduce in modo "semplicissimo" con istruzioni C, con le quali poi si può fare molto di più e molto altro. Ma se la logica è già espressa in grafcet (funzionante su carta diciamo), hai già risolto il 90% dei problemi comuni che affliggono molti partecipanti del forum, che conoscono la sintassi C ma faticano con la progettazione ad un livello "più astratto". In sostanza ritengo che la strada potrebbe essere se non in discesa, almeno pianeggiante, salvo una piccola salitina iniziale di approccio alle basi del C (tipi dati, variabili, operazioni, struttura decisionale if/else) e alle funzioni di ingresso/uscita e configurazione dei pin specifiche di Arduino (e non c'è bisogno di conoscere nulla dell'hardware interno del microcontroller). Dopo di che con il C, essendo un linguaggio general purpose, e non specific purpose, puoi "simulare" tanto il grafcet, quanto il ladder, quanto scrivere algoritmi secondo diversi paradigmi, e anche mescolare tutto assieme per trarre il meglio da ogni metodo.

Io ho trovato un esempio qui:

Avevo visto quell'esempio ma avevo paura a proporlo come primo impatto... per via di alcune considerazioni generali sull'esecuzione di un grafcet, e più nello specifico per quella "variabile di umanizzazione", messa li per non realizzare il giusto edge detect sulla pressione del pulsante.

Se dovessi riscrivere l'esempio farei così:

void loop() 
{
  //LETTURA INGRESSO CON DEBOUNCE E RICONOSCIMENTO FRONTE HIGH->LOW
  delay(50);
  lettura = digitalRead(Pulsante);
  premuto =  lettura==LOW  &&  letturaPrec==HIGH; 
  letturaPrec = lettura;


  //ESEGUE GLI STEP ATTIVI E CALCOLA TRANSIZIONI SU EVENTO

  if(STEP[0])
  {
    digitalWrite(Led, LOW);
    if (premuto) { TRAN[0] = 1; }
  }

  if(STEP[1])
  {
    digitalWrite(Led, HIGH);
    if (premuto) { TRAN[1] = 1; }
  }

  //DISATTIVA STATI A MONTE DELLE TRANSIZIONI ATTIVE
  if(TRAN[0]) { STEP[0] = 0; }
  if(TRAN[1]) { STEP[1] = 0; }

  //ATTIVA STATI A VALLE DELLE TRANSIZIONI ATTIVE
  if(TRAN[0]) { STEP[1] = 1; }
  if(TRAN[1]) { STEP[0] = 1; }

  //AZZERA TRANSIZIONI PER PROSSIMO GIRO
  TRAN[0] = 0;
  TRAN[1] = 0;
}

Il motivo delle transizioni controllate due volte è perché in generale deve essere possibile per uno stato essere contemporaneamente disattivato (dalla transizione a valle) e attivato (da quella a monte). Non so quante volte in pratica si abbia bisogno di questa caratteristica, ma, visto che in un grafcet come caso limite anche tutti gli stati potrebbero diventare contemporaneamente attivi, va considerata.

Poi mancano altre cose, inutili in questo esempio, ma indispensabili nella realtà, come un'indicazione di "primo giro" quando uno stato diventa attivo, e la memorizzazione dell'istante in cui lo stato diventa attivo, per poter calcolare quanto tempo passa dalla sua attivazione.

Deve essere chiaro però che NON esiste un programma (almeno io non l'h trovato) che traduce grafcet in codice Arduino, la cosa viene fatta "a mano".
Per il tempo passato puoi memorizzare il valore di millis()
Per sapere se sei al primo giro, ti fai una tua variabile booleana (o anche byte 0/1). Gestita a mano, come del resto gli stati in quel esempio/link

Un po' di tempo fa ho fatto una libreria che in qualche modo riproduce quello che si fa con gli SFC...
Non ci metto le mani da diverso tempo e probabilmente c'è qualche bug da sistemare, però forse può essere di aiuto/ispirazione...

Sostanzialmente è la classica macchina a stati finiti, ma con la possibilità di associare delle funzioni di callback che saranno poi eseguite all'ingresso in uno specifico stato, continuamente mentre lo stato è attivo e in uscita dallo stato (si ispira un po' quanto si può fare con gli SFC usati con CodeSys v3).

github/cotestatnt/YA_FSM