Passa al contenuto principale

SysGetCounter, get counter

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.

Approfondimenti
  • In questo articolo utilizzo di 2 counters per acquisizione bus Wiegand.
  • In questo topic un esempio di acquisizione due tastiere Wiegand utilizzando 4 counters.

Moduli supportati

Questo FB opera solo sui moduli che implementano la gestione hardware del contatore, di seguito una tabella riassuntiva.

Module codeCountersClock modeReset modeReverse modeNote
PCB131, MPS05010Non gestitoNon gestitoConnesso a Di00
PCB135, MPS05310Non gestitoNon gestitoConnesso a Di00
PCB137, MPS05420, 1Non gestitoNon gestitoPossono essere connessi a qualsiasi ingresso
PCB141, MPS0564 (Di cui 2 opzione)0, 1Non gestitoNon gestitoPossono essere connessi a qualsiasi ingresso Per abilitare i 2 opzionali è richiesta una chiave di protezione (Vedi articolo)
PCB124*00020, 1Non gestitoNon gestitoPossono essere connessi a qualsiasi ingresso
PCB124*01040, 1Non gestitoNon gestitoPossono essere connessi a qualsiasi ingresso

Descrizione​

Immagine FB_SysGetCounter

Immagine selezione modo FB_SysGetCounter

ParametroTipoDescrizione
AddressUSINTOccorre 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.
ChannelUSINTOccorre specificare l'indirizzo del canale sul modulo (Range da 0 a 15).
ModeUDINTModo acquisizione (Vedi definizione).
RCountBOOLReverse counting, attivando questo ingresso Value viene decrementato ad ogni variazione di conteggio.
ResetBOOLAttivando questo ingresso si ha il reset del valore di conteggio Value.
DoneBOOLDato acquisisto, viene attivato per un loop di programma al termine della acquisizione.
FaultBOOLErrore di acquisizione, viene attivato in caso di errore nella sequenza di gestione.
ValueUDINTValore 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​

Come utilizzare gli 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]