Vai al contenuto

Impostazione indirizzo I2C su FB I2CBusManager

Home Forum Programmazione IEC 61131 (LogicLab) Impostazione indirizzo I2C su FB I2CBusManager

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #84250
    Anonimo
    Inattivo

    Stò usando la FB I2CBusManager con I/O del PLC, tutto ok con UN device addr 60.

    Sulla mia applicazione devo scrivere su 4 device, con indirizzi che vanno dal 61 al 64, (visibili da PLC).

    Come posso cambiare l’indirizzo senza inizializzare I2C?

    #84253
    Sergio Bertana
    Amministratore del forum

    Si utilizza il FB I2CBusManager per gestire dispositivi I2C tramite I/O digitali quando i dispositivi sono lontani dal modulo CPU e quindi non è possibile collegarli direttamente al bus di espansione e gestirli con la funzione SysI2CWrRd. Utilizzando gli I/O digitali inoltre si ha la separazione galvanica tra il sistema ed i dispositivi evitando che problemi sui dispositivi possano bloccare l’intero sistema.

    Ora venendo alla tua domanda, non capisco cosa intendi per “cambiare l’indirizzo senza inizializzare I2C”. Riferendomi all’esempio ST_I2CBusManager come vedi l’istanza I2CBus è eseguita come una funzione passando direttamente i valori alla chiamata. Basterà aggiungere ai parametri anche il valore di I2CAddress per gestire dispositivi diversi. Ti allego un estratto del programma con la gestione di due stati per scrittura e lettura da due dispositivi diversi.

        // -------------------------------------------------------------------------
        // PROGRAM CASES
        // -------------------------------------------------------------------------
        // Program cases management.
    
        CASE (CaseNr) OF
    
            // ---------------------------------------------------------------------
            // Gestione Write/Read address 60.
    
            0:
            I2CBus(I2CAddress:=60, WrBuffer:=ADR(I2CWrite), WrBytes:=2, RdBuffer:=ADR(I2CRead), RdBytes:=1);
            IF NOT(I2CBus.Done) THEN RETURN; END_IF;
            IF (I2CBus.Fault) THEN Errors:=Errors+1; CaseNr:=0; RETURN; END_IF;
            CaseNr:=CaseNr+1; //Program case
    
            // ---------------------------------------------------------------------
            // Gestione Write/Read address 61.
    
            1:
            I2CBus(I2CAddress:=61, WrBuffer:=ADR(I2CWrite), WrBytes:=2, RdBuffer:=ADR(I2CRead), RdBytes:=1);
            IF NOT(I2CBus.Done) THEN RETURN; END_IF;
            IF (I2CBus.Fault) THEN Errors:=Errors+1; CaseNr:=0; RETURN; END_IF;
            CaseNr:=0; //Program case
        END_CASE;
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.