Cominciamo con il dire che per il conteggio consiglio di utilizzare l’operando somma al posto del FB CTU. Questo ti permette di utilizzare per il conteggio una variabile della dimensione che desideri 8/16/32/64 bits, inoltre puoi definirla come RETAIN o allocarla nella DB100 ad indirizzo da 2048 per avere il valore mantenuto allo spegnimento. E con semplici operazioni di MOVE puoi variarne il valore per il reset od il preset.
Come ingresso digitale è consigliato utilizzare quelli del modulo CPU come correttamente hai fatto, ma non devi utilizzare l’immagine di processo bensì devi acquisirne lo stato con il FB SysGetPhrDI. Ecco un programma di esempio.
// *****************************************************************************
// PROGRAM "CounterOnDI"
// *****************************************************************************
// Manage counter on CPU module Di00.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Initialize variables.
IF (SysFirstLoop) THEN
i:=SysSetTaskLpTime(ID_TASK_FAST, 500); //Task Fast is executed every 500uS
// Set digital input module.
DInp.Address:=255; //Module address
DInp.Mode:=DI_MODE#DI_8_LL; //Acquisition mode
END_IF;
// -------------------------------------------------------------------------
// COUNTER MANAGEMENT
// -------------------------------------------------------------------------
// Check digital input rising pulse.
DInp(); //Digital input acquisition
IF (DInp.Value.0 = Pulse) THEN RETURN; END_IF;
Pulse:=DInp.Value.0; //Digital input pulse
// Increase the counter.
IF (DInp.Value.0) THEN Counter:=Counter+1; END_IF;
// [End of file]
Il programma và eseguito in task Fast di cui puoi cambiare il tempo di esecuzione, lo standard è 1mS ma puoi scendere fino a 100uS. Se vuoi modificare l’ingresso digitale cambia DInp.Value.x dove x è l’ingresso da utilizzare.