Questo blocco funzione esegue la lettura di un contatore, in base alla definizione di Mode è possibile gestire conteggio su fronte positivo, negativo o su entrambi i fronti dell’ingresso clock. Se il modulo che gestisce il contatore lo prevede è possibile anche definire comandi hardware (Ingressi logici) di reset conteggio e di inversione conteggio.
Per abilitare i counter opzionali occorre richiedere il codice di protezione, vedi protezione funzioni e blocchi funzione. E’ comunque possibile utilizzarli liberamente in modo test per 15 Min.
Moduli supportati
Questo FB opera solo sui moduli che implementano la gestione hardware del contatore, di seguito una tabella riassuntiva.
Module code | Counters | Clock mode | Reset mode | Reverse mode | Note |
---|---|---|---|---|---|
PCB131, MPS050 | 1 | 0 | Non gestito | Non gestito | Connesso a Di00 |
PCB135, MPS053 | 1 | 0 | Non gestito | Non gestito | Connesso a Di00 |
PCB137, MPS054 | 2 | 0, 1 | Non gestito | Non gestito | Possono essere connessi a qualsiasi ingresso |
PCB141, MPS056 | 4 (Di cui 2 opzione) | 0, 1 | Non gestito | Non gestito | Possono essere connessi a qualsiasi ingresso Per abilitare i 2 opzionali è richiesta una chiave di protezione |
PCB124*000 | 2 | 0, 1 | Non gestito | Non gestito | Possono essere connessi a qualsiasi ingresso |
PCB124*010 | 4 | 0, 1 | Non gestito | Non gestito | Possono essere connessi a qualsiasi ingresso |
Descrizione
Address (USINT) Occorre specificare l’indirizzo di modulo da cui eseguire l’acquisizione (Range da 0 a 255). Il valore 0 indica il primo modulo di estensione, 1 il secondo e così di seguito. L’indirizzo 255 indica il modulo CPU.
Channel (USINT) Occorre specificare l’indirizzo del canale sul modulo (Range da 0 a 15).
Mode (UDINT) Modo acquisizione (Vedi definizione).
RCount (BOOL) Reverse counting, attivando questo ingresso Value viene decrementato ad ogni variazione di conteggio.
Reset (BOOL) Attivando questo ingresso si ha il reset del valore di conteggio Value.
Done (BOOL) Dato acquisisto, viene attivato per un loop di programma al termine della acquisizione.
Fault (BOOL) Errore di acquisizione, viene attivato in caso di errore nella sequenza di gestione.
Value (UDINT) Valore contatore.

Definizione Mode
Modo acquisizione, espresso su 32 bit secondo lo schema riportato. Per calcolare il valore di mode si applica la formula: ((Reverse mode)*2097152)+((Reverse input)*65536)+((Reset mode)*8192)+((Reset input)*256)+((Clock mode)*32)+(Clock input)

- Clock Input: Definisce ingresso logico da utilizzare come clock.
- Clock Mode: 0:Conta su fronte salita, 1:Conta su fronte discesa, 2:Conta su entrambi i fronti.
- Reset Input: Definisce ingresso logico da utilizzare come reset.
- Reset Mode: 0:Non è utilizzato ingresso di reset, 1:Reset counter se ingresso attivo, 2:Reset counter se ingresso non attivo.
- Reverse Input: Definisce ingresso logico da utilizzare come inversione conteggio
- Reverse Mode: 0:Non è utilizzato ingresso di reverse, 1:Inverte conteggio counter se ingresso attivo, 2:Inverte conteggio counter se ingresso non attivo
Esempi
ST_SysGetCounter: Viene eseguita l’acquisizione del contatore 0 dal modulo CPU di SlimLine, il valore di conteggio è trasferito nella variabile Value. Attivando da debug RCount si inverte il conteggio ad ogni variazione dell’ingresso di clock viene decrementato il valore in uscita. Attivando da debug Reset viene eseguito il reset del conteggio.
ST_SpeedCalculation: Viene eseguito il calcolo della velocità di rotazione di un albero acquisendo gli impulsi generati da una ruota fonica che genera 10 impulsi al giro.
LogicLab (Ptp116, ST_SysGetCounter)
PROGRAM ST_SysGetCounter
VAR
Value : UDINT; (* Counter value *)
CInp : SysGetCounter; (* Counter acquisition *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_SysGetCounter"
// *****************************************************************************
// This program acquires a counter from the CPU module.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// COUNTER ACQUISITION
// -------------------------------------------------------------------------
// Acquires counter 0 by CPU module.
CInp.Address:=255; //Module address
CInp.Channel:=0; //Module channel
CInp.Mode:=16#00000000; //Acquisition mode
CInp(); //Counter acquisition
IF (CInp.Done) THEN Value:=CInp.Value; END_IF;
// [End of file]
LogicLab (Ptp116, ST_SpeedCalculation)
PROGRAM ST_SpeedCalculation
VAR
TimeBf : UDINT; (* Time buffer (mS) *)
Memo : UDINT; (* Memo counter *)
Pulses : UDINT; (* Number of pulses *)
Speed : REAL; (* Speed (RPM) *)
CInp : SysGetCounter; (* Counter acquisistion *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_SpeedCalculation"
// *****************************************************************************
// This program calculates the rotation speed of a shaft by counting the pulses
// generated by a phonic wheel.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Acquires counter 0 by CPU module. Counter is set to count on both edges.
IF (SysFirstLoop) THEN
CInp.Address:=255; //Module address
CInp.Channel:=0; //Module channel
CInp.Mode:=16#00000000; //Acquisition mode
END_IF;
// -------------------------------------------------------------------------
// COUNTER ACQUISITION
// -------------------------------------------------------------------------
// At every 1 S is acquired the number of pulses counted.
IF ((SysTimeGetMs()-TimeBf) < T#1s) THEN RETURN; END_IF;
TimeBf:=SysTimeGetMs(); //Time buffer (mS)
CInp(); //Counter acquisition
Pulses:=CInp.Value-Memo; //Number of pulses
Memo:=CInp.Value; //Memo counter
// Calculate speed, having 10 pulses at revolution. The calculation is
// executed at every 1 S, so to have RPM the result is multiplied by 60.
Speed:=(TO_REAL(Pulses)/10.0)*60.0; //Speed (RPM)
// [End of file]