Mi sono trovato a dover gestire alcuni servoassi della Festo, della serie CMMO, come posizionatori semplici e, per una tanto normale quanto grave incapacità di scelta del costruttore della macchina, questi oggetti furono scelti meramente per ragioni politiche economiche, senza nemmeno sapere se ed in che modo si potessero poi controllare. Il risultato fu che, per farli funzionare dovetti scrivermi il driver di comunicazione via Ethernet, in TCP/IP, non potendoli gestire unicamente in I/O digitali come mi avevano proposto.
Ora il driver è fatto e funzionante e mi fa piacere condividerlo nella speranza che colleghi altrettanto attivi ed operosi magari lo riprendano, completino magari per il controllo in velocità o forza.
Il PLC partner
La logica della macchina questa volta è gestita da un soft PLC Beckhoff, una CPU CX9020, con programma scritto in CoDeSys. Il driver fa uso delle libreria TwinCAT "Ethernet TCP/IP server CE", perché per ora non ho ancora sentito il bisogno di riscrivere questa libreria. La libreria è disponibile solo a pagamento, ma confidando anche che il codice sia usato per altri sistemi basati su CoDeSys, il problema non si pone in quanto il driver sarebbe da ritoccare leggermente per adattarlo alla liberia TCP/IP di volta in volta utilizzata.
Il codice
Il programma del driver è per il vero molto semplice. Si tratta di inviare e ricevere ciclicamente dei pacchetti di dati formattati adeguatamente per leggere lo stato del controller, programmarlo ed ordinare i vari posizionamenti.Per quanto ho potuto capire, nel caso di utilizzo come posizionatore semplice, il controller non accetta l'invio dei dati di posizione, velocità, forza, ecc, in modo libero, ma permette unicamente di programmare una tabella di record, che potranno poi essere richiamati per la loro esecuzione.Quindi, nel driver, si vedrà una parte di codice orientata alla scrittura dei record. (Nel programma allegato i record 1, 2 e 3), che poi vengono richiamati per comandare il posizionamento.
Il driver viene implementato tramite il richiamo di un unico blocco funzione: "FB_CmmoStManager", il quale si preoccupa poi dei richiami ulteriori utili. Tutto il codice scritto è in chiaro, privo di password e protezioni. L'uso è libero e privo di costi di ogni tipo. Scritto in CoDeSys 2, è facilmente portabile anche in CoDeSys 3.
Difetti noti
Non tanto per scusarmi, ma per indirizzare eventualmente gli utilizzatori sviluppatori: dalla poca documentazione trovata di questo controller ho implementato anche la scrittura dell'oggetto 107 per la memorizzazione in flash della tabella dei record, tuttavia non sono ancora riuscito a farla funzionare e, di fatto, i record sono tenuti solo in RAM, andando persi allo spegnimento. Se ne servono pochi si possono reinviare ad ogni accensione, ma se occorre usarne molti le cose si complicano e quindi questo resta un punto aperto da dover approfondire. Una ulteriore pecca sono i pochissimi commenti di cui faccio uso neio miei programmi. Occorre spendere qualche minuto per seguirli e ricostruirne la logica. Ma dovrebbero almeno essere scritti in modo abbastanza chiaro.
Altro difetto, non tanto del codice software, ma dell'oggetto in se, è che non implementa una forma di comunicazione veloce con la tecnica dei PDO, ma occorre eseguire continue query via ethernet, che ogni volta devono essere costruite, e le risposte ricevute interpretate, rendendo difficile, se non impossibile, l'uso del posizionatore in real time, con interazione del programma PLC basate su velocità e posizione dell'oggetto. Il blocco funzione proposto fa questo, dopo avere aperto il socket di comunicazione, esegue in loop infinito query di lettura e scrittura dati. Il risultato è quello di un asse controllabile via PLC in modo qui completo, ma mancandogli alcune peculiarità di un driver per applicazioni motion, si presta bene come elettrocilindro multiposizionale.
Download
Un progetto demo, con tutta la libreria compresa, è disponibile a questo link. Si tratta di un progetto estratto da una macchina funzionante, da dove ho strappato le parti di codice inutili al caso.