Ottimizzare il tempo di funzionamento dei dispositivi è un obiettivo fondamentale nell’industria per migliorare l’efficienza, la durata e la sicurezza degli impianti. Alternando il funzionamento dei dispositivi in base al loro tempo di lavoro si evita che un singolo dispositivo sia sottoposto a un’usura eccessiva prolungandone la vita.
Approfondimenti
- In questo topic chiarimenti sull’utilizzo del FB
- In questo topic un esempio con macro per visualizzare il tempo di funzionamento su un pannello operatore.
Descrizione
DNumber (UDINT) Numero dispositivi da bilanciare (Range 1-32).
DEnable (DWORD) Ogni bit abilita la gestione del relativo dispositivo in DCommand. L’abilitazione è gestita sia il comando manuale in DForce che la richiesta in DRequest.
DForce (DWORD) Ogni bit forza il comando (In manuale) del relativo dispositivo in DCommand.
DRequest (DWORD) Ogni bit esegue la richiesta di un dispositivo. E’ possibile richiedere più dispositivi contemporaneamente. I dispositivi richiesti verranno comandati in base al tempo di lavoro e ad eventuali comandi di forzatura attivi.
DWTime (PVOID) Occorre fornire l’indirizzo di allocazione di un array di UDINT dove li FB gestirà il tempo di lavoro del dispositivo in secondi, il conteggio ha valore massimo di 136 anni. Il numero di elementi dell’array deve corrispondere al numero di dispositivi in DNumber.
Fault (BOOL) Attivo per un loop se errore esecuzione.
UResourced (BOOL) Si attiva se il numero di dispositivi richiesti supera il numero di dispositivi abilitati.
DCommand (DWORD) Ogni bit comanda il relativo dispositivo.

Esempi
Come utilizzare gli esempi
Nel programma di esempio è gestito l’intervento di 3 pompe connesse da una condotta idrica per l’alimentazione di un serbatoio. Ad ogni richiesta di acqua vengono avviate 2 pompe simultaneamente scegliendo tra le 2 che hanno meno ore di lavoro.
Da notare la variabile DWTime che è un array di 3 UDINT allocata nell’area DB100.2048 che è un’area ritentiva per memorizzare il tempo di funzionamento delle pompe. Ai bits di DEnable è possibile connettere le eventuali protezioni termiche delle pompe per evitarne l’avvio in caso di problemi.Se non sono disponibili almeno 2 pompe se ne attiverà una sola e si attiva l’uscita UResourced. Con DForce è possibile comandare manulamente le pompe.

LogicLab (Ptp114, ST_TimeBalancing)
PROGRAM ST_TimeBalancing
VAR
WaterRequest : BOOL; (* Water request sensor *)
DEnable : ARRAY[0..2] OF BOOL := [TRUE, TRUE, TRUE]; (* Device enable *)
DForce : ARRAY[0..2] OF BOOL; (* Device force *)
DCommand : ARRAY[0..2] OF BOOL; (* Device command *)
DWTime AT %MX100.2048 : ARRAY[0..2] OF UDINT; (* Device work time (S) (Must be RETAIN) *)
PBalance : TimeBalancing; (* Pump time balancing *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_TimeBalancing"
// *****************************************************************************
// In this program, three pumps are managed. When water is requested, two pumps
// are simultaneously activated. To balance the pumps working time, the pumps
// with the lowest working hours are started with each request. If a pump's
// thermal overload trips, the pump is excluded from the request.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Variable initialization.
IF (SysFirstLoop) THEN
PBalance.DNumber:=SIZEOF(DWTime)/SIZEOF(DWTime[0]); //Device number
PBalance.DWTime:=ADR(DWTime); //Device work time
PBalance.TILock:=T#1s; //Interlock time
END_IF;
// -------------------------------------------------------------------------
// INPUT COMMANDS
// -------------------------------------------------------------------------
// Pump's thermal overload managing.
PBalance.DEnable.0:=DEnable[0]; //Pump 1 thermal overload
PBalance.DEnable.1:=DEnable[1]; //Pump 2 thermal overload
PBalance.DEnable.2:=DEnable[2]; //Pump 3 thermal overload
// Pump's manual start command.
PBalance.DForce.0:=DForce[0]; //Pump 1 manual start
PBalance.DForce.1:=DForce[1]; //Pump 2 manual start
PBalance.DForce.2:=DForce[2]; //Pump 3 manual start
// Water request managing.
// Two pumps are simultaneously requested.
PBalance.DRequest.0:=WaterRequest; //Device request
PBalance.DRequest.1:=WaterRequest; //Device request
// -------------------------------------------------------------------------
// TIME BALANCING
// -------------------------------------------------------------------------
// Pump balancing managing.
PBalance(); //Pump time balancing
// Pump's output command.
DCommand[0]:=PBalance.DCommand.0; //Pump 1 command
DCommand[1]:=PBalance.DCommand.1; //Pump 2 command
DCommand[2]:=PBalance.DCommand.2; //Pump 3 command
// [End of file]