Acquisizione temperatura con sensori pirometrici
Home › Forum › Discussioni su problematiche generali › Acquisizione temperatura con sensori pirometrici
- Questo topic ha 3 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 1 settimana, 4 giorni fa da
Sergio Bertana.
-
AutorePost
-
Aprile 1, 2025 alle 12:10 pm #81122
Anonimo
InattivoDovrei realizzare un sistema per l’acquisizione di 18 sensori di temperatura pirometrici, pensavo di utilizzare come sensori i MEMS Thermal Sensors D6T della Omron.
- Ho visto che i sensori hanno una interfaccia I2C posso acquisirli utilizzando i Vs controllori programmabili?
- Qual’è la distanza di collegamento tra il PLC ed i sensori?
- Quanti sensori posso acquisire con un modulo PLC?
Aprile 1, 2025 alle 12:12 pm #81124Sergio Bertana
Amministratore del forumAbbiamo già affrontato l’acquisizione di questi sensori vediamo di rispondere alle tue domande. Ipotizzando di collegare il sensore al bus di espansione del ns modulo CPU per l’acquisizione utilizzeremo la funzione SysI2CWrRd.
- I sensori hanno interfaccia I2C ma come si evince dal manuale utente hanno indirizzo fisso (16#0A) quindi è possibile collegare un solo sensore al bus.
- Essendo il bus I2C delle estensioni dei ns moduli CPU, un bus a 400Khz la distanza massima ipotizzabile in sicurezza potrebbe essere 1 o 2 metri.
- Avendo il sesore unico indirizzo si può collegare 1 solo sensore.
Ecco il programma che abbiamo realizzato per l’acquisizione di un sensore a 16 zone. Nell’array Pn sono presenti le 16 temperature delle zone acquisite dal sensore.
PROGRAM D6TMeasure VAR i : UDINT; (* Auxiliary variable *) CaseNr : USINT; (* Program case *) TimeBf : UDINT; (* Time buffer (uS) *) Errors : ARRAY[0..1] OF UDINT; (* Error counter *) I2CWrite : ARRAY[0..1] OF BYTE; (* I2C write buffer *) I2CRead : ARRAY[0..63] OF BYTE; (* I2C read buffer *) PTAT : REAL; (*Reference temperature (°C) *) Pn: ARRAY[0..15] OF REAL; (* Temperature points (°C) *) END_VAR // ***************************************************************************** // PROGRAM "D6TMeasure" // ***************************************************************************** // Acquires a Omron MEMS Thermal Sensors D6T. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // PROGRAM CASES // ------------------------------------------------------------------------- // Program cases management. CASE (CaseNr) OF // --------------------------------------------------------------------- // Conversion command "Single Shot Mode high repeatability" clock // streching disabled. 0: I2CWrite[0]:=16#4C; //Comando scrittura IF NOT(SysI2CWrRd(Address:=16#0A, WrBytes:=1, WrBuffer:=ADR(I2CWrite), RdBytes:=0, RdBuffer:=NULL)) THEN Errors[0]:=Errors[0]+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) < 500000) THEN RETURN; END_IF; // Read the conversion results. IF NOT(SysI2CWrRd(Address:=16#0A, WrBytes:=0, WrBuffer:=NULL, RdBytes:=35, RdBuffer:=ADR(I2CRead))) THEN Errors[1]:=Errors[1]+1; //Error counter CaseNr:=0; //Program case RETURN; END_IF; // Acquire the reference temperature. PTAT:=TO_REAL(TO_INT((TO_UINT(I2CRead[1])*256+I2CRead[0])))/10.0; // Acquire the Pn temperatures. FOR i:=0 TO 15 DO Pn[i]:=TO_REAL(TO_INT((TO_UINT(I2CRead[3+(2*i)])*256+I2CRead[2+(2*i)])))/10.0; END_FOR; CaseNr:=0; //Program case END_CASE; // [End of file]
Aprile 1, 2025 alle 2:19 pm #81131Sergio Bertana
Amministratore del forumAggiungo che vista la tua esigenza di acquisire più sensori e magari a distanze superiori ai 1 o 2 metri, posso consigliare di utilizzare il FB I2CBusManager con I2CMode:=1. In questo modo i segnali del bus I2C sono gestiti utilizzando una routine software con degli I/O digitali, la gestione del bus ha frequenze decisamente inferiori ma con segnali optoisolati dal sistema. Questo permette di aumentare molto la distanza garantendo anche una immunità ai disturbi.
Anche in questo modo avresti il problema dell’unico sensore per ogni bus (Visto che l’indirizzo è fisso), ma utilizzando ad esempio il modulo MPS056B310 con 4 ingressi e 4 uscite potresti pilotare 2 diversi bus I2C ed acquisire 2 sensori.
In alternativa si pootrebbe realizzare un FB ad-hoc dove si utilizza un ingresso ed 1 uscita per il segnale DATA e con 3 uscite si possono gestire 3 segnali CLOCK da utilizzare per il comando di 3 sensori. In questo modo un unico modulo CPU potrebbe acquisire 3 sensori.
Aprile 8, 2025 alle 8:43 am #81263Sergio Bertana
Amministratore del forumHo ripreso in mano il vecchio progetto e pensando alla tua esigenza di gestire più sensori in I2C localizzati distanti dal sensore di acquisizione ho utilizzato un modulo 817 con 4 optoisolatori che si trova a pochi euro su moltissimi siti in Internet. Collegando gli I/O di un nostro modulo di estensione statico come questo, è possibile arrivare al modulo con 2 ingressi e 2 uscite digitali con segnali a 24Vdc aumentando l’immunità al rumore.
Il modulo provvede ad abbassare il livello del segnale ai 5Vdc per il sensore, un alimentatore a 5Vdc fornirà la tensione di alimentazione al sensore e tramite due resistenze di pull-up da 2200Ohm fornirà il livello alto ai segnali Clock e Data del bus I2C. Sul modulo 817 ho cortocircuitato (Resistenza oOhm) alcune resistenze (Vedi schema elettrico).
Disponendo di molti I/O digitali con un solo modulo di estensione e un isolatore per ogni sensore potrai acquisire tutti i sensori di cui necessiti.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.