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;