SysI2CWrRd, writes/reads on I2C extension bus

  1. Home
  2. Knowledge Base
  3. Manualistica
  4. Programmazione IEC 61131-3
  5. Gestione periferiche
  6. SysI2CWrRd, writes/reads on I2C extension bus

Questa funzione gestisce la scrittura/lettura sul bus I2C di estensione. L'utilizzo di questa funzione permette di gestire qualsiasi componente I2C connesso al bus di estensione.

Attenzione, il bus I2C è utilizzato per l'accesso ai moduli di estensione per non rallentarne l'accesso si consiglia di eseguire comandi I2C non più lunghi di 4 bytes in scrittura e lettura. Nel caso serva gestire più bytes si consiglia di spezzare il comando in più comandi consecutivi.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Address (USINT) Indirizzo dispositivo I2C range da 16#00 a 16#7F.

WrBytes (USINT) Numero di bytes dati da scrivere. 0 se solo lettura.

WrBuffer (@BYTE) Indirizzo buffer memoria che contiene i dati da scrivere, NULL se solo lettura.

RdBytes (USINT) Numero di bytes dati da leggere. 0 se solo scrittura.

RdBuffer (@BYTE) Indirizzo buffer memorizzazione dati letti, NULL se solo scrittura.

La funziona ritorna un BOOL, FALSE: Errore esecuzione, TRUE: Funzione eseguita corretamente.

Errori

In caso di errore eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Esempi

Come utilizzare gli esempi.
Viene eseguita l'acquisizione del valore di temperatura e di umidità da un sensore SHT30-DIS della Sensirion connesso al bus I2C di un sistema SlimLine. Non viene eseguito il controllo sul CRC dei valori acquisisti. In questo articolo si trova la stessa gestione realizzata con il FB di gestione bus I2C.

LogicLab (Ptp116)
PROGRAM ST_SysI2CWrRd
VAR
    CaseNr : USINT; (* Program case *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    Errors : UDINT; (* Error counter *)
    Temperature : REAL; (* Temperature value (°C) *)
    Humidity : REAL; (* Humidity value (%) *)
    I2CWrite : ARRAY[ 0..1 ] OF BYTE; (* I2C write buffer *)
    I2CRead : ARRAY[ 0..7 ] OF BYTE; (* I2C read buffer *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysI2CWrRd"
// *****************************************************************************
// Temperature and humidity acquisistion from a Sensirion SHT30-DIS.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // PROGRAM CASES
    // -------------------------------------------------------------------------
    // Program cases management.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // Conversion command "Single Shot Mode high repeatability" clock
        // streching disabled.

        0:
        I2CWrite[0]:=16#24; //MSB
        I2CWrite[1]:=16#00; //LSB
        IF NOT(SysI2CWrRd(Address:=16#44, WrBytes:=2, WrBuffer:=ADR(I2CWrite), RdBytes:=0, RdBuffer:=NULL)) THEN
            Errors:=Errors+1; //Error counter
            CaseNr:=0; //Program case
            RETURN;
        END_IF;

        // Save time to wait.

        TimeBf:=SysGetSysTime(TRUE);
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // Wait conversion complete (Max time oh high repeatability 15 mS).

         1:
         IF ((SysGetSysTime(TRUE)-TimeBf) < 15000) THEN RETURN; END_IF;

        // Read the conversion results.

        IF NOT(SysI2CWrRd(Address:=16#44, WrBytes:=0, WrBuffer:=NULL, RdBytes:=6, RdBuffer:=ADR(I2CRead))) THEN
            Errors:=Errors+1; //Error counter
            CaseNr:=0; //Program case
            RETURN;
        END_IF;

        // Convert the acquired values.

        Temperature:=-45.0+(175.0*(TO_REAL((I2CRead[0]*256)+I2CRead[1])/65535.0));
        Humidity:=100.0*(TO_REAL((I2CRead[3]*256)+I2CRead[4])/65535.0);
        CaseNr:=0; //Program case
    END_CASE;

// [End of file]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 2 Gennaio 2020