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

Programmare Arduino in linguaggio LADDER IEC 61131-3

In campo industriale , per l’automazione, normalmente non vengono utilizzati i classici linguaggi di programmazione ad alto livello ma i linguaggi definiti dallo standard IEC 61131-3 di cui il più utilizzato è il linguaggio Ladder (ovvero a contatti).
Questo linguaggio è molto diffuso siccome facilmente comprensibile anche da chi non si occupa di programmazione su PC , quindi in fase di ricerca guasto rende la risoluzione del problema più rapida ed efficace.
In questo piccolo tutorial vedremo come poter trasformare il nostro Arduino in un micro PLC programmabile in linguaggio Ladder.
Ovviamente non pensate di ritrovarvi di fronte ad una IDE come quella Siemens Step7 oppure TIAportal ma LDmicro comunque esegue il lavoro egregiamente.
LDmicro è un tool in grado di compilare per molte piattaforme ma è anche in grado di generare codice nativo C che andremo ad utilizzare per programmare il nostro Arduino.

Il programma LDmicro nasce per Windows ma , per mezzo di WINE , lo si può utilizzare su Linux e funziona alla perfezione.

Sotto riporto quindi quello di cui avremo bisogno e dove lo potremo reperire .

LINUX

Windows

Generatore di file H

Se su Windows non volete installarvi il linguaggio PHP e volete comunque utilizzare la versione console del generatore ho scritto un’articolo dove vi spiegherò come trasformarlo in eseguibile partendo dal file PHP:

LadderGen eseguibile , ovvero come generare un EXE da un file PHP

La versione consolle del generatore è molto più flessibile quindi vi consiglio vivamente di utilizzare questa.

Ora partiamo con il primo progetto Ladder che sarà un po più complesso del solito blink per potervi far vedere almeno l’uso dei contatori .
Il risultato sarà un programma che generera 10 impulsi sul led montato sull’uscita 23 , poi si accenderà fisso il led sull’uscita 25 e il led 23 farà ancora 5 impulsi per poi ricominciare da capo.

Ecco lo schema .

Sotto vi allego il programma a contatti .

LDmicro export text.
Source file: ladder.ld from 28/03/2017 16:13:17
for 'ANSI C Code', 16 MHz crystal, 10,000 ms cycle time

LADDER DIAGRAM:
    ||                                                                                     ||
    || ; --Programma di Test svilupato da Francesco Aria con LDmicro Build417 --           ||
0001||                                                                                     ||
   4||                                                                                     ||
    ||                                                                                     ||
    ||     RCoil1             TT1                                              YOut23      ||
0002||-------]/[---------{TON 200 ms}--------------------------------------------( )-------||
  20||                                                                                     ||
    ||                                                                                     ||
    ||     YOut23             TT2                                              RCoil1      ||
0003||-------] [---------{TON 200 ms}--------------------------------------------( )-------||
  20||                                                                                     ||
    ||                                                                                     ||
    ||     YOut23           CCNT1:0                                            YOut25      ||
0004||-------]/[-----------[CTU>=10]---------------------------------------------( )-------||
  26||                                                                                     ||
    ||                                                                                     ||
    ||     YOut25           YOut23           CCNT2:0                            CCNT1      ||
0005||-------] [--------------]/[-----------[CTU>=5]----+-----------------------{RES}------||
  42||                                                  |                                  ||
    ||                                                  |                       CCNT2      ||
    ||                                                  +-----------------------{RES}------||
    ||                                                                                     ||
    ||                                                                                     ||
    ||                                                                                     ||
   5||------[END]--------------------------------------------------------------------------||
 130||                                                                                     ||
    ||                                                                                     ||

I/O ASSIGNMENT:
  Name                       | Type                     | Pin             | Port | Pin name
 ----------------------------+--------------------------+-----------------+------+-----------
  CCNT1                      | contatore                |                 |      | 
  CCNT2                      | contatore                |                 |      | 
  YOut23                     | Uscita digitale          | (non assegnato) |      | 
  YOut25                     | Uscita digitale          | (non assegnato) |      | 
  RCoil1                     | Relè interno             |                 |      | 
  TT1                        | ritardo all' eccitazione |                 |      |
  TT2                        | ritardo all' eccitazione |                 |      | 

VAR LIST:
    2 bytes CCNT1
    2 bytes CCNT2 	Now not used !!!
    2 bytes Cnew 	Now not used !!!
    2 bytes PWMduty 	Now not used !!!
    2 bytes TT1 	Now not used !!!
    2 bytes TT2 	Now not used !!!
    2 bytes TUpdateOF 	Now not used !!!
    2 bytes TUpdateON 	Now not used !!!
  129 bytes char7seg
    1 bytes char7seg[0]
    2 bytes dest 	Now not used !!!
    2 bytes display 	Now not used !!!
    2 bytes saved 	Now not used !!!

Tutti i programmi sviluppati con questo metodo dovranno , come nome file , chiamarsi “ladder” in quanto il tool per generare il file header lo pretende.
Creato il vostro programma dovrete scegliere in Settaggi->Microcontroller il tipo “Ansi C Code” e poi effettuare la compilazione.
Questa operazione genererà un file in codice C , quindi con estensione .c
In fase di sviluppo con LDmicro si può simulare il funzionamento del programma con la possibilità di testarlo in modo slegato da Arduino ma la cosa aiuta molto.
Ottenuto il file .c per poter procedere dovremo rinominarne l’estensione in .cpp ottenendo quindi ladder.cpp.
In fase di sviluppo bisogna tenere conto che se volete utilizzare il generatore di header web su http://adam.horcica.cz/tools/ladder-gen/ dovrete usare come nome delle variabili di ingresso i nomi da d0 a d13 che corrispondono ai pin di un Arduino UNO .
Invece se avete la possibilita di utilizzare la versione del programma php in modo console ( https://github.com/ah01/LDmicro2arduino ) sarete molto più liberi e basterà crearvi un file (tutti i file devono essere nella stessa cartella ovviamente) con nome pinmap.ini con una struttura simile a quella sotto riportata.

Oppure createvi una versione EXE del genratore : LadderGen eseguibile , ovvero come generare un EXE da un file PHP

Questo vi permetterà di assegnare liberamente i Pin.

Per eseguire il generatore di header in modalità console dovrete installare l’interprete php .

; Questo file contiene la mappattura tra le variabili utilizzate e il PIN
; corrispondente su Arduino.
; E conveniente utilizzare sempre questo file per avere controllo delle assegnazioni

; In questo progetto ci sono due led.

; Led Rosso sul PIN 23
Out23 = 23

; Led Verde sul PIN 25
Out25 = 25

Ora lanciado ladder-gen.php in modalità console oppure usando il sito otterremo il nostro file header e avremo quindo a disposizione quasi tutti i file necessari.
Ora si dovranno spostare i file ottenuti ladder.cpp e ladder.h , pinmap.ini in una cartella che dovrà avere come nome quello del progetto arduino .
Apriremo la IDE arduino e genereremo un file con il contenuto sotto riportato .

#include "ladder.h"

/* Plc cycle interval, set this according to LDmicro settings. (micro sec.) */ 
#define PLC_INTERVAL 10000

void setup()
{
 PlcSetup();
}

void loop()
{
 if (IsPlcInterval())
 {
 PlcCycle();
 }
}

/* Plc Cycle timing function. */
boolean IsPlcInterval()
{
 static unsigned long last_run;
 
 if (micros() - last_run >= PLC_INTERVAL)
 {
 last_run = micros();
 return true;
 }
 return false;
}

Ora non ci resta che compilare e scaricare nel nostro Arduino il progetto ed il gioco è fatto.
Sotto vi metto a disposizione il progetto discusso nell’articolo completo di tutti i file  :

ldLadder

Comments are closed.