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
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.
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]