Buenas tardes Pablo,
En el archivo adjunto al mensaje te paso un proyecto para
StxLadder que te permite detectar el cambio
de las entradas discretas de varios módulos de expansión conectados en cascada y realizar
una acción.
Utilice otro método para comprobar los cambios, ya que utilizando el cambio de estado
por evento no se puede tener completo control para lo que necesitas.
El método que utilizo es simple, creo un evento Timer1 que cada 50 ms lea
el estado de todas las entradas discretas de los módulos conectados y las almacena en memoria.
Si el estado de alguna entrada cambio con respecto a una copia previa de una lectura
anterior, informa a traves de una variable global llamada
ModDinState_Changed.
Dicha variable podes leer en tu programa para saber si hay algun cambio.
En el
PlcMain() incializo el timer de la siguiente manera:
// Configurar timer1 para un evento cada 50 mS.
Timer1SetEvent(50, true)
Y el evento de del Timer1 lo defino así:
@OnTimer1()
{
// Leer estado de todos los modulos de expansion.
for(new i=0; i < EXP_MODULES_COUNT; i++)
{
// Leer entradas de modulo.
Stx570_DinReadAll(i, ModDinState[i])
// Comprobar si existe un cambio en valor de entradas.
if(ModDinState[i] != ModDinState_Last[i])
{
// Almacenar valor actual.
ModDinState_Last[i] = ModDinState[i]
// Indicar cambio en variable flag.
ModDinState_Changed = true
// Imprimir numero de cambios.
ChangeCount++
LcdPrintf(0, 1, "Change Count %03d", ChangeCount)
}
}
}
Fíjate como leo todos los módulos y almaceno cada modulo en un elemento del array
ModDinState[].
Dicho elemento se comprueba con una copia previa de los valores de la entrada
ModDinState_Last[]y si hay algún cambio de valor, activo la variable
ModDinState_Changed.
En el loop principal de
PlcMain(), llamo a una función
CheckModDinChange() que lee la variable
ModDinState_Changedy activa o desactiva reles del PLC, segun el valor de una entrada discreta cuando hay un cambio en los modulos
de expansion.
Mira el ejemplo, probalo y avisame si hay algo que no entiendas.
Quedo a disposición.