Depois de fazer nosso primeiro projeto no CODESYS (Veja o artigo) podemos usar a biblioteca eCDSS8CoreMng. Esta biblioteca contém todos os objetos de função e FBs para gerenciar os módulos de extensão do SlimLine, download de biblioteca, o programa SimpleStartUp descrito neste artigo pode ser encontrado no PTP161 (Baixar).
Instalação de biblioteca
Para usar a biblioteca, instale-a no repositório de bibliotecas do seu PC. Baixe a biblioteca do menu Gestore libreria selecionar Repository librerie e escolha Installa será possível navegar no disco e procurar o arquivo da biblioteca que será transferido para o "C:\ProgramData\CODESYS\Managed Libraries\Elsist Srl\".
Uso da biblioteca
Crie um novo projeto como indicado em Neste artigo, adicione a biblioteca ao projeto.
Gerenciamento I2C de módulos de expansão
O módulo da CPU gerencia os módulos de extensão com uma conexão em I2C, portanto, o driver de gerenciamento deve ser instalado. Com o botão direito do mouse no dispositivo I2C escolha o item Aggiungi dispositivoe selecione o dispositivo I2C master. O valor a ser definido no dispositivo é /dev/i2c-4.
O dispositivo será adicionado à árvore do projeto e, como pode ser visto na foto, a variável será criada I2C_master de tipo i2cMaster. O nome da variável é importante porque será comunicado ao FB de gerenciamento do sistema.
Exemplos
Todos os objetos (Funções e FB) úteis para acessar os vários módulos estão disponíveis na biblioteca, consulte a documentação da biblioteca para obter uma lista. Agora você pode escrever o programa, dentro de "PLC_PRG" temos que instanciar e executar o bloco funcional SysCoreManager (Gerente do sistema) para o qual devemos passar o endereço do gerenciador de barramento I2C. Ao ativar o FB, o sinal de pronto é ativado no barramento de extensão e o circuito do cão de guarda de hardware e todos os módulos conectados ao barramento de extensão são inicializados.
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]