SlimLine Raspberry libreria eCDSSystem8Core

Dopo avere realizzato il nostro primo progetto in CODESYS (Vedi articolo) possiamo addentrarci nell'utilizzo della libreria eCDSS8CoreMng. Questa libreria contiene tutti gli oggetti funzioni ed FBs per la gestione dei moduli di estensione di SlimLine, download libreria, il programma SimpleStartUp descritto in questo articolo si può trovare nel PTP161 (Download).

Installazione libreria

Per utilizzare la libreria occorre installarla nel repository delle librerie sul proprio PC. Eseguito il download della libreria, dal menù Gestore libreria selezionare Repository librerie e scegliere Installa sarà possibile eseguire un browsing del disco e cercare il file di libreria che verrà trasferito nella cartella "C:\ProgramData\CODESYS\Managed Libraries\Elsist Srl\".

Utilizzo della libreria

Creare un nuovo progetto così come indicato in questo articolo, aggiungere la libreria al progetto.

I2C gestione moduli espansione

Il modulo CPU gestisce i moduli di estensione con una connessione in I2C, quindi occorre installare il driver di gestione. Con il tasto destro del mouse sul dispositivo I2C scegliere la voce Aggiungi dispositivo, e selezionare il dispositivo I2C master. Il valore da impostare sul dispositivo è /dev/i2c-4.

Il dispositivo verrà aggiunto all'albero del progetto e come si vede dalla foto verrà creata la variabile I2C_master di tipo i2cMaster. E' importante il nome della variabile perchè sarà da comunicare al FB di gestione del sistema.

Esempi

Come utilizzare gli esempi.

Nella libreria sono disponibili tutti gli oggetti (Funzioni ed FB) utili per accedere ai vari moduli, consultare la documentazione di libreria per un elenco. Ora è possibile scrivere il programma, all'interno di "PLC_PRG" dobbiamo istanziare ed eseguire il blocco funzione SysCoreManager (Gestore del sistema) a cui dobbiamo passare l'indirizzo del gestore del bus I2C. Abilitando il FB viene attivato il segnale di ready sul bus di estensione ed il circuito di watch dog hardware e tutti i moduli connessi al bus di estensione sono inizializzati.

LogicLab (Ptp161)
PROGRAM PLC_PRG
VAR
  DInp: ARRAY[ 0..2 ] OF DWORD; //Digital input value
  DOut: ARRAY[ 0..2 ] OF DWORD; //Digital output value
  LpTime: ARRAY[ 0..1 ] OF UDINT; //Loop time (uS)
  TimeBf: ARRAY[ 0..3 ] OF UDINT; //Time buffer (uS)
  S8Core: eS8Core.SysCoreManager; //System 8 core manager
  AnInp: ARRAY[ 0..1 ] OF eS8Core.SysGetAnInp; //Analog input acquisition
  AnOut:  ARRAY[ 0..1 ] OF eS8Core.SysSetAnOut; //Analog output management
END_VAR

// -------------------------------------------------------------------------
// EXECUTION TIME CALCULATION AUSILIARES
// -------------------------------------------------------------------------
// Here the reference time is saved.

LpTime[0]:=eS8Core.SysGetSysTime(TRUE); //Loop time (uS)

// -------------------------------------------------------------------------
// SYSTEM 8 CORE MANAGEMENT
// -------------------------------------------------------------------------
// PConsole defines TCP port to which it's possible to connect by telnet
// HWDogTm defines watch dog refresh time.
// pI2CManager defines the I2C driver used to manage the extension bus.

S8Core(Enable:=TRUE, PConsole:=10000, HWDogTm:=0, pI2CManager:=ADR(I2C_master));
IF NOT(S8Core.Ready) THEN RETURN; END_IF;

// Put here some initializations if needed.

// IF (S8Core.Init) THEN END_IF;

// -------------------------------------------------------------------------
// DIGITAL I/O MODULES MANAGEMENT
// -------------------------------------------------------------------------
// Here are managed all the digital I/O modules. The function reads digital
// inputs and writes digital outputs.

SysDIOModule(0, ADR(DInp[0]), ADR(DOut[0])); //Modulo "0"

// -------------------------------------------------------------------------
// BLINK OUTPUTS
// -------------------------------------------------------------------------
// Here outputs 0 and 1 of module 0 are blinking.

IF ((eS8Core.SysGetSysTime(TRUE)-TimeBf[0]) > 100000) THEN
  TimeBf[0]:=eS8Core.SysGetSysTime(TRUE); DOut[0].0:=NOT(DOut[0].0);
END_IF;

IF ((eS8Core.SysGetSysTime(TRUE)-TimeBf[1]) > 200000) THEN
  TimeBf[1]:=eS8Core.SysGetSysTime(TRUE); DOut[0].1:=NOT(DOut[0].1);
END_IF;

// -------------------------------------------------------------------------
// ANALOG I/O MODULES MANAGEMENT
// -------------------------------------------------------------------------
// Here are managed some analog I/Os on the module 0.

AnOut[0](Address:=0, Channel:=0, Mode:=AO_MODE.DA_VOLT_0_10);
AnInp[0](Address:=0, Channel:=0, Mode:=AI_MODE.AD_VOLT_0_10_COMMON);
 
AnOut[1](Address:=0, Channel:=1, Mode:=AO_MODE.DA_VOLT_0_10);
AnInp[1](Address:=0, Channel:=1, Mode:=AI_MODE.AD_VOLT_0_10_COMMON);

// Every 5 Secs a random voltage (Range 0.0 to 10.0) is set on outputs.

IF ((eS8Core.SysGetSysTime(TRUE)-TimeBf[3]) > 5000000) THEN
  TimeBf[3]:=eS8Core.SysGetSysTime(TRUE); //Time buffer (uS)
  AnOut[0].Value:=SysGetRandom(TRUE)*10.0; //Analog output value (Volt)
  AnOut[1].Value:=SysGetRandom(TRUE)*10.0; //Analog output value (Volt)
END_IF;

// -------------------------------------------------------------------------
// CALCULATES THE EXECUTION TIME
// -------------------------------------------------------------------------
// Here is calculated the time needed to execute the program. The value in
// uS is stored in LpTime[1] variable.

LpTime[1]:=eS8Core.SysGetSysTime(TRUE)-LpTime[0]; //Loop time (uS)

// [End of file]
Was this article helpful?