Home › Forum › Programmazione IEC 61131 (LogicLab) › Impostazione indirizzo I2C su FB I2CBusManager
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 11 mesi fa da
Sergio Bertana.
-
AutorePost
-
Ottobre 20, 2025 alle 9:50 am #84250
Anonimo
InattivoStò 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?
Ottobre 20, 2025 alle 9:54 am #84253Sergio Bertana
Amministratore del forumSi 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; -
AutorePost
- Devi essere connesso per rispondere a questo topic.