Se trovi utile il mio blog sostienimi con una piccola donazione. GRAZIE

OpenPLC ovvero PLC IEC 61131-3 con Arduino e non solo

Se volete trasformare Arduino in un PLC programmabile con uno dei linguaggi IEC 61131-3 , utilizzando software open source gratuito , non avete molte opzioni ma sicuramente una delle più complete è OpenPLC.
OpenPLC in realtà non trasforma Arduino in un PLC ma lo utilizza come scheda di Input Output remota.
Questo tipo di approccio vi obbliga ad avere Arduino connesso ad un PC (Windows o Linux) ma non vi spaventate perche potendo utilizzare un RaspberryPi il costo non è atroce e i vantaggi sono molti , tra cui il più ovvio è quello di avere la piattaforma di editazione dei programmi integrata al vostro PLC.
OpenPLC puo quindi essere installato su RaspberryPI e in questo caso le opzioni sono :

  • Usare un Arduino per gli I/O collegandolo via USB
  • Usare direttamente gli I/O del RaspberryPI
  • Usare come I/O una Device che comunichi in Modbus su TCP/IP (rete LAN) , quindi la distanza tra SoftPLC e I/O può essere notevole. Ovviamente il nostro amato Arduino può diventare una device ModbusTCP/IP (basta installare una shield Ethernet usare la libreria giusta e scrivere un po di righe in C++)

Se avete capito quello che ho riportato sopra penso di aver acceso la curiosità di una certa quantità di persone.

L’editor che viene fornito con OpenPlc si chiama PLCOpenEditor ed è veramente completo , infatti vi permette di utilizzare tutti e cinque i linguaggi IEC :

IL – Lista di istruzioni https://it.wikipedia.org/wiki/AWL_(linguaggio)
ST – Testo strutturato – Linguaggio di alto livello simile al Pascal.
LD – Ladder , il classico linguaggio a contatti. https://it.wikipedia.org/wiki/Ladder_diagram
FBD – Diagramma a blocchi funzionali – Analogo ai diagrammi circuitali
SFC – Diagramma funzionale sequenziale , Graphcet https://it.wikipedia.org/wiki/Sequential_function_chart

Come avrete capito questo è il tool giusto per chi vuole imparare a programmare i PLC senza spendere .

Ovviamente se volete utilizzare la piattaforma per realizzare piccole automazioni potete farlo ma ricordatevi che dovrete prendervi tutte le responsabilità del caso , nel senso che se qualcosa non funziona dovrete aver previsto tutte le casistiche in modo che non vengano provocati danni a cose e persone e dovrete certificare voi il sistema .
Quindi per quanto sopra detto vi sconsiglio di utilizzarlo fuori dal laboratorio.
Diciamo anche che realizzare automazioni utilizzando prodotti certificati non vi mette comunque al riparo dalle responsabilità legali derivanti , in ogni caso dovrete analizzare tutte le casistiche e fare in modo che l’impianto sia sicuro e certificato .
Nel nostro caso utilizzeremo Arduino come I/O via USB e poi tramite ModBus TCP/IP.


Firmware

In questa prima parte vedremo dove reperire il firmare da caricare sul nostro Arduino .
Il firmware è scaricabile dal sito ufficiale di OpenPLC ed è disponibile sia per Arduino UNO che per Arduino Mega .
In teoria è sufficente scaricare i firmware da questa pagina :
http://www.openplcproject.com/getting-started-arduino

Questo firmware però soffre di un difetto non irrilevante per un PLC , ovvero nel caso di arresto della comunicazione con il softPLC
lo stato delle uscite resta congelato all’ultimo aggiornamento e la cosa non è carina.(anzi potrebbe essere distruttiva per l’impianto)
Il metodo migliore sarebbe attivare il timer di WatchDog interno di Arduino per riavviarlo ma su alcuni vecchi bootloader non è possibile
quindi ho implementato un metodo meno efficente ma che funziona modificando il firmaware come sotto :

Questo è il nuovo Loop principale :

void loop() 
{
 updateInputs();
 
 while (Serial.available() > 0)
 {
 parseMessage(Serial.read());
 last_run = micros();
 }
 
 /*Reset output and imput for WatchDog*/
 if (IsWatchDog())
 {
 memset(&input_data,0,sizeof(input_data));
 memset(&output_data,0,sizeof(output_data));
 updateOutputs(); 
 }
 
 if (packetReceived)
 {
 packetReceived = false;
 
 struct OPLC_output *dataPointer;
 dataPointer = &output_data;
 memcpy(dataPointer, incommingBuffer, sizeof(struct OPLC_output));
 
 updateOutputs();
 sendPacket();
 }
}

E questa la definizione delle costanti e la funzione IsWatchDog :

/* Plc watch dog interval(micro sec.) */ 
#define PLC_INTERVAL 200000
static unsigned long last_run;

/* Plc WatchDog */
boolean IsWatchDog()
{
 
 if (micros() - last_run >= PLC_INTERVAL)
 {
 
 return true;
 }
 return false;
}

Modificando in questo modo il firmware in caso di mancata comunicazione le uscite vengono resettate .

Il firmware modificato per Arduino Mega è scaricabile dal link sotto per Arduino Uno riportate le stesse modifiche manualmente sul firmware originale :

OpenPLC_MEGA_fw_TO


OpenPLC su LINUX

Per prima cosa dovremo installare i pacchetTi necessari alla compilazione del SoftPLC

1) Dovremo aprire un terminale e installare i seguenti pachetti utilizzando apt-get , basta copiare i comandi sotto se la distribuzione è una Debian o Ubuntu:​

sudo apt-get update
sudo apt-get install build-essential pkg-config bison flex
sudo apt-get install autoconf automake libtool make nodejs git

2) Ora dobbiamo clonare il repository github di OpenPLC (ovvero dobbiamo scaricare i sorgenti usando il terminale) :

git clone https://github.com/thiagoralves/OpenPLC_v2.git


3) Ora da terminale dovremo spostarci nella cartella OpenPLC_v2 e compilare il progetto del softPLC tramite terminale (richiederà un po di tempo):


cd OpenPLC_v2
./build.sh

Alla fine del processo di compilazione vi verrà chiesto quale driver utilizzare con OpenPLC:

OpenPLC necessita di un driver per essere in grado di accedere agli I/O fisici 
oppure ad un'hardware virtuale .
Please select the driver you would like to use:
1) Blank 4) RaspberryPi 7) ESP8266
2) Modbus 5) UniPi 8) Arduino+RaspberryPi
3) Fischertechnik 6) Arduino 9) Simulink
#?

Nel nostro caso sceglieremo l’opzione 6 (Arduino) ma se implementassimo Modbus su Arduino potremmo anche usare l’opzione 2 .

​Avvio del softPLC

L’aplicazione OpenPLC ha un webserver NodeJS che ci permeterà di comandare e controllare se OpenPLC è in run o stop e ci darà anche la possibilità di fare l’upload del file programma (.st) generato utilizzando l’editor “PLCopen Editor”.
Per avviare OpenPLC da terminale bisogna entrare nel direttorio OpenPLC_v2 e digitare :

sudo nodejs server.js

Ora utilizzando il browser web bisogna navigare sulla pagina http://localhost:8080.
Dovreste visualizzare l’interfaccia web di OpenPLC da dove potrete fare l’upload del vostro primo programma.
Quando un programma verra caricato verra automaticamente compilata una nuova applicazione OpenPLC e mandata in esecuzione.
Ovviamente Arduino dovrà essere collegato alla porta USB del PC .


OpenPLC su Windows

1) Installare Cygwin (https://cygwin.com/install.html) utilizzando le opzioni di default
Assicuarsi di installare il pachhetto Lynx selezionandolo durante l’installazione di Cygwin come da figura :

2) Installare NodeJS (https://nodejs.org/en/download/)
3) Aprite il terminale di Cygwin Terminal and digitare i comandi sotto riportati (potete fare il copia incolla di una riga alla volta):

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin
apt-cyg install wget gcc-core gcc-g++ git pkg-config
apt-cyg install automake autoconf libtool make

4) Ora dobbiamo clonare il repository github di OpenPLC (ovvero dobbiamo scaricare i sorgenti usando il terminale Cygwin) :

git clone https://github.com/thiagoralves/OpenPLC_v2.git

5) Ora da terminale Cygwin dovremo spostarci nella cartella OpenPLC_v2 e compilare il progetto del softPLC tramite terminale (richiederà un po di tempo):

cd ~/OpenPLC_v2
./build_win.sh

Alla fine del processo di compilazione vi verrà chiesto quale driver utilizzare con OpenPLC:

OpenPLC necessita di un driver per essere in grado di accedere agli I/O fisici 
oppure ad un'hardware virtuale .
Please select the driver you would like to use:
1) Blank 4) RaspberryPi 7) ESP8266
2) Modbus 5) UniPi 8) Arduino+RaspberryPi
3) Fischertechnik 6) Arduino 9) Simulink
#?

Nel nostro caso sceglieremo l’opzione 6 (Arduino) ma se implementassimo Modbus su Arduino potremmo anche usare l’opzione 2 .

Avvio del softPLC

L’applicazione OpenPLC ha un webserver NodeJS che ci permeterà di comandare e controllare se OpenPLC è in run o stop e ci darà anche la possibilità di fare l’upload del file programma (.st) generato utilizzando l’editor “PLCopen Editor”.
Per avviare OpenPLC da terminale Cygwin bisogna entrare nel direttorio OpenPLC_v2 e digitare :

sudo nodejs server.js

Ora utilizzando il browser web bisogna navigare sulla pagina http://localhost:8080.
Dovreste visualizzare l’interfaccia web di OpenPLC da dove potrete fare l’upload del vostro primo programma.
Quando un programma verra caricato verra automaticamente compilata una nuova applicazione OpenPLC e mandata in esecuzione.
Ovviamente Arduino dovrà essere collegato alla porta USB del PC .


OpenEditor

Il PLCopen Editor è un software che vi permetterà di scrivere i programmi per il PLC in accordo alla direttiva IEC-61131-3 e conforme alla allo standard PLCopen XML.
Il programma può essere scaricato da qui http://www.openplcproject.com/plcopen-editor
Questo editor è stato creato principalmente da Edouard Tisserant e Laurent Bessard per il progetto Beremiz http://www.beremiz.org/.
Sotto vi metto due video del progetto Beremiz ma ricordatevi che il progetto Beremiz e OpenPLC sono due cose differenti .

OpenPLC è in grado di eseguire programmi in Testo strutturato (ST) programs.
PLCopen Editor può generare programmi ST per OpenPLC utilizzando tutti e cinque i linguaggi IEC-61131-3.
Per il momento mi fermo qui e nel prossimo post vedremo come scrivere il primo programma e caricarlo su OpenPLC.

Ladder

Testo strutturato

 

Lista di istruzioni

Blocchi funzionali

Grafcet

Comments are closed.