Deteccion de las entradas de Stx570

  • 2 Respuestas
  • 4432 Vistas

pboero

  • Novato
  • *
  • Mensajes: 6
Deteccion de las entradas de Stx570
« : junio 29, 2014, 23:41:51 pm »
Buenas,
Para un proyecto de domotica, tengo una Stx8081 conectada a 8 Stx570s. La idea es que las entradas de las placas de expansion detecten los cambios en las teclas de iluminacion de la casa. Ya en las primeras pruebas tuve problemas con la deteccion de eventos de las stx570, mi programa no respondio de acuerdo a lo esperado, por lo que hice un programa bien simple para ver que esta pasando:

static A = 0

PlcMain()
{
       ExPortSetEvent()                   //Habilito el evento OnExPort
       for (new i = 0; i <= 7; i++)      //Inicializo las 8 placas Stx570
             {
             Stx570_Init(i)
             }
       for(;;)                                 //Loop que trae por default el programa base
            {
            }
       return 0
}

@OnExPort()                              //Evento que detecta el cambio de estado en una placa de expansion
{
   A = A + 1                          //Incrementar en uno nuestra variable
   LcdClear()                         //Limpiar el Lcd
   LcdPrintf(0, 0, "%d", A)       //Imprimir el valor de nuestra variable
   PauseMS(200)                   // Esto es para evitar un rebote en la tecla
}


Conecte una tecla en una entrada de una de las placas. Cuando prendo la tecla se enciende el led testigo de dicha entrada, cuando apago la tecla lo mismo sucede con el led. Digamos que electricamente esta todo bien.

Si no entiendo mal, se supone que cada vez que la tecla cambia de estado, este programa deberia actualizar el LCD mostrando un numero que se incrementa en 1. Prendo la tecla, se muestra un 1, apago, se muestra un 2, prendo nuevamente, se muestra un 3....

Sin embargo, lo que sucede es que cuando la tecla cambia a posicion ON nuestra variable se incrementa en 2 unidades y cuando pasa a OFF el evento no se dispara.

Aclaro que ya verifique que cada placa tiene su respectiva direccion I2C, todas con el jumper en Multiple, menos la ultima que es Single. Tambien hice el proceso de alta de las placas en el software de acuerdo al manual.

Estoy un tanto perdido con lo que esta pasando.

Aguardo comentarios.

Muchas gracias,
Pablo

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re: Deteccion de las entradas de Stx570
« Respuesta #1 : junio 30, 2014, 12:20:14 pm »
Buenos días Pablo,

Estamos analizando su consulta, déjanos realizar unas pruebas así podemos sugerirle una alternativa por este medio.

Estamos en contacto.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2326
  • Soporte Técnico
Re: Deteccion de las entradas de Stx570
« Respuesta #2 : julio 01, 2014, 13:58:23 pm »
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:

Código: [Seleccionar]
// Configurar timer1 para un evento cada 50 mS.
        Timer1SetEvent(50, true)

Y el evento de del Timer1 lo defino así:

Código: [Seleccionar]
@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_Changed
y 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.
« Última Modificación: julio 01, 2014, 17:09:56 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com