Vai al contenuto

I/O remoti modulari e programmabili

L’utilizzo degli I/O remoti nell’automazione industriale consente di estendere la gamma di dispositivi di ingresso e di uscita disponibili per un sistema di automazione, permettendo do utilizzare sensori e attuatori decentrati rispetto al sistema di automazione. Il loro utilizzo rende più facile e conveniente la manutenzione e la riparazione dei dispositivi, permettendo la scalabilità del sistema di automazione. E’ possibile aggiungere o rimuovere facilmente dispositivi di ingresso e di uscita senza dover modificare il cablaggio fisico del sistema.

I/O remoti non programmabili

I sistemi di I/O remoti possono essere dei semplici moduli con diverse interfacce come ad esempio:

Oppure I/O remoti modulari con possibilità di scelta tra diverse interfacce CAN, Ethernet Modbus TCP, EtherCAT.

I/O remoti programmabili

Se in molte applicazioni possono essere utilizzati moduli non programmabili, vi sono casi in cui disporre di moduli di I/O remoti programmabili permette di delegare al modulo l’esecuzione di operazioni. Questo limita il lavoro del PLC centrale e permette di gestire logiche molto veloci direttamente sul modulo di I/O.

Nel caso di gestioni analogiche il modulo di I/O può convertire e linearizzare i valori permettendo al PLC centrale di operare direttamente con unità ingegneristiche delegandone al modulo I/O la conversione in valore analogico.

Utilizzando i nostri sistemi SlimLine è possibile realizzare moduli di I/O remoti sia con la semplice gestione degli I/O che con la possibilità di eseguire un programma locale realizzato utilizzando LogicLab. Il cuore del sistema è il modulo CPU a cui è possibile abbinare moduli di I/O digitali, analogici mixed.

Composizione moduli SlimLine

Utilizzo di SlimLine

Il sistema SlimLine può essere utilizzato oltre che come I/O remoto anche come PLC principale, nel caso che tutta l’automazione sia realizzata con i sistemi SlimLine per comunicare con i moduli di I/O si può utilizzare il FB DataTransfer, che permette lo scambio real time utilizzando la comunicazione seriale o una connessione Ethernet TCP/UDP. Nel caso si desideri distribuire gli /IO su area geografica è possibile utilizzare la libreria eLLabDataExchLib (Vedi articolo) per scambiare gli I/O tramite Internet.

E’ possibile utilizzare un sistema SlimLine con i suoi moduli di I/O in due modi:

  • Come semplice remote I/O, il programma SimplyRemoteIO, esegue l’appoggio di tutti gli I/O fisici nell’area di memoria DB100 per essere accessibili da Modbus.
  • Come remote I/O programmabile, in questo caso da Modbus si accede a variabili allocate nell’area di memoria DB, ed il programma utilizza le variabili per eseguire logiche interne.
Programma SimplyRemoteIO

Questo programma scaricabile da qui, esegue il semplice appoggio di tutti i possibili moduli di I/O logico nell’area di memoria DB100 che è accessibile da Modbus. Come si vede dal listato il programma gestisce 16 moduli di I/O, il modulo di I/O può avere al suo massimo 32 punti di I/O.

I 32 ingressi di ogni modulo sono trasferiti in 16 DWORD consecutive nell’area DB100, eseguendo la lettura di 2 registri via Modbus con il comando 16#03 Read Holding Register all’indirizzo:

  • 16#40000 si potrà acquisire lo stato dei possibili 32 ingressi del modulo 0.
  • 16#40002 si potrà acquisire lo stato dei possibili 32 ingressi del modulo 1.
  • 16#40031 si potrà acquisire lo stato dei possibili 32 ingressi del modulo 15.

Le 32 uscite di ogni modulo sono acquisite da 16 DWORD consecutive nell’area DB100, eseguendo la scrittura di 2 registri via Modbus con il comando 16#10 Write Multiple register all’indirizzo:

  • 16#40032 si potrà settare lo stato delle possibili 32 uscite del modulo 0.
  • 16#40034 si potrà settare lo stato delle possibili 32 uscite del modulo 1.
  • 16#40127 si potrà settare lo stato delle possibili 32 uscite del modulo 15
LogicLab (Ptp203, SimplyRemoteIO)

Per l’appoggio degli I/O nell’area DB100 accessibile da Modbus occorre dichiarare le seguenti variabili globali.

VAR_GLOBAL
    DInputs AT %MD100.0 : ARRAY[0..15] OF DWORD; (* Digital inputs map *)
    DOutputs AT %MD100.64 : ARRAY[0..15] OF DWORD; (* Digital outputs map *)
END_VAR
PROGRAM LogicIOMapping
VAR
    BCtr : USINT; (* Board counter *)
    IDx : USINT; (* Bit index *)
    Pattern : UDINT; (* Bit pattern *)
    DiPtr : @BOOL; (* Digital input pointer *)
    DoPtr : @BOOL; (* Digital output pointer *)
END_VAR

// *****************************************************************************
// PROGRAM "LogicIOMapping"
// *****************************************************************************
// The program maps all the possible physical I/Os on a DW memory map accessible
// by Modbus protocol.
// Note: THE PROGRAM MUST BE EXECUTED ON SLOW TASK
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // LOGIC INPUT MAPPING
    // -------------------------------------------------------------------------
    // Iterate through all the 16 possible digital inputs boards.

    DiPtr:=ADR(%IX0.0); //Digital input pointer
    FOR BCtr:=0 TO 15 DO

        // Maps the real input on a DW map bit.
                
        Pattern:=16#00000001; //Bit pattern
        FOR IDx:=0 TO 31 DO
            IF NOT(@DiPtr) THEN
                DInputs[BCtr]:=DInputs[BCtr] AND NOT(Pattern);
            ELSE
                DInputs[BCtr]:=DInputs[BCtr] OR Pattern;
            END_IF;

            DiPtr:=DiPtr+1;  //Digital input pointer
            Pattern:=Pattern*2; //Bit pattern
        END_FOR;
    END_FOR;

    // -------------------------------------------------------------------------
    // LOGIC OUTPUT SETTING
    // -------------------------------------------------------------------------
    // Iterate through all the 16 possible digital ouputs boards.

    DoPtr:=ADR(%QX0.0); //Digital output pointer
    FOR BCtr:=0 TO 15 DO

        // Set digital output with output map bit.
                
        Pattern:=16#00000001; //Bit pattern
        FOR IDx:=0 TO 31 DO
            @DoPtr:=TO_BOOL(DOutputs[BCtr] AND Pattern);

            DoPtr:=DoPtr+1;  //Digital output pointer
            Pattern:=Pattern*2; //Bit pattern
        END_FOR;
    END_FOR;

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