Dos consultas sobre sintaxis y funcionamiento en Pawn

  • 4 Respuestas
  • 3880 Vistas

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Dos consultas sobre sintaxis y funcionamiento en Pawn
« : marzo 24, 2014, 20:15:07 pm »
Hola Boris, qué tal ?   Tengo un par de consultas relativas a programación Pawn:

1) Las operaciones AND y OR tienen algun tipo de precedencia entre sí?
   Concretamente: La operación AND (&&) parece tener precedencia sobre la OR (||):

   if( (Condicion1) && (Condicion2) ||
       (Condicion3) && (Condicion4) ||   
       (Condicion5) && (Condicion6) ||
       (Condicion7) && (Condicion8) )
   {
      Accion
   }

   Si es como a mí me parece, entonces la expresión anterior se evaluará  "renglón por renglón", sin tener que ponerle un paréntesis a cada renglón, de la siguiente forma:

   if( ((Condicion1) && (Condicion2)) ||
       ((Condicion3) && (Condicion4)) ||   
       ((Condicion5) && (Condicion6)) ||
       ((Condicion7) && (Condicion8)) )
   {
      Accion
   }

   O sea que sería igual hacerlo de cualquiera de las dos formas. Es correcto ??


2) Estoy teniendo un problema con los temporizadores tipo Timeout, por el hecho de que todos los Timeouts "comparten" la misma función de servicio @OnTimeout(). El esquema es el siguiente:

Al comienzo del programa:

   // Inicializar los temporizadores tipo Timeout
   TimeoutInitEvent()
   
   // Lanzar el Timeout1 para enviar el primer email al cabo de 10 segundos
   Timeout1SetEvent(10)


En otra parte del programa:

   // En ciertas condiciones, prende una luz en RELAY3, temporizada con Timeout2
   if (Sensor_PIR == 1)
   {
      Forzar_RELAY3 = 1
      Timeout2SetEvent(60)
   }


Y esta es la función de servicio de todos los timeout:

@OnTimeout()
{
   // Comprobar si Timeout1 ha expirado: enviar el email de Power-On
   if(Timeout1Check() == 1)
   {
      email_accion = "ENVIAR EMAIL"
      SendMail = 1
      
      // Borrar el Timeout1 para que no se repita
      Timeout1ClrEvent()                    [1]
   }

   // Comprobar si Timeout2 ha expirado: Apagar la luz en RELAY3
   if(Timeout2Check() == 1)
   {
      Forzar_RELAY3 = 0
      
      // Borrar el Timeout2 para que no se repita
      Timeout2ClrEvent()                    [2]
   }

   return 0
}

Al principio, no tenía colocada ninguna de las 2 instrucciones [1] y [2], con lo cual se producía el siguiente efecto: al cabo del primer Timeout1, se enviaba el mail (bien), pero con cada disparo del Timeout2, además de prenderse (y apagarse) la luz en RELAY3, también
se despachaba un email (mal), debido a que Timeout1Check() quedó en "1".

Leyendo el manual, deduzco que cuando un TimeoutX finaliza, la función TimeoutXCheck() retorna "1" en forma permanente de ahí en más, hasta que se lo resetee.

Entonces agregué en ambos lugares [1] y [2] los correspondientes reseteos de los temporizadores, para que cada uno se ejecute solo una vez hasta que se lo regenere de nuevo. El problema que me hace ahora es que cuando se da la condición de prender la luz en RELAY3, ésta se prende bien, pero no se apaga más.

Es como que hay alguna interacción rara entre las funciones TimeoutXClrEvent().  No logro discernir si una influye sobre la otra, pero pareciera que Timeout1ClrEvent() borra Timeout1 y también el Timeout2, y viceversa.

Puede ser que haya un error de firmware ??

Desde ya muchas gracias y un gran saludo,
Pablo.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re: Dos consultas sobre sintaxis y funcionamiento en Pawn
« Respuesta #1 : marzo 25, 2014, 12:12:37 pm »
Buen día Pablo,

1) Efectivamente, la función AND (&&) tiene precedencia sobre la función OR (||) y se evalúa de izquierda a derecha.

En la pagina 46 del documento STXLADDER-PI.pdf, esta la tabla de precedencia de operadores y expresiones.

Entonces seria correcto de las dos formas. Pero si explicitas con el uso de paréntesis te aseguras no cometer
errores de tipeo a futuro (solo para mayor prolijidad).

2) Déjame ver el tema de los Timeouts, voy a realizar un par de pruebas para ver el efecto que comentas y te aviso.

Es cierto lo de TimeoutXCheck(), queda en 1 hasta que se elimine el Timeout o se recargue con TimeoutXReload().

Te estoy pasando novedades a la brevedad.

« Última Modificación: marzo 25, 2014, 14:56:00 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re: Dos consultas sobre sintaxis y funcionamiento en Pawn
« Respuesta #2 : marzo 25, 2014, 20:45:28 pm »
Pablo, pude comprobar que el funcionamiento de la funcion TimeoutXClrEvent() tenia
un funcionamiento erratico, cuando se utilizaban varios timeouts, para desactivarlos y activarlos.

Era como suponias, se borraban algunos timers de mas con TimeoutXClrEvent().

Te adjunto un archivo stx8081-d2-v195.zip que contiene la actualizacion de firmware
para tu modelo de placa que corrige el error. Luego lo subiria oficialmente a la Web si funciona todo bien.

Tambien adjunto un proyecto de ejemplo (TimeoutClearSet.zip), que utiliza todos los timeouts repetidamente
con TimeoutXClrEvent() para demostrar que funciona correctamente (antes de la actualizacion fallaba).

Gracias por el feedback y avisame como te va.

SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Re: Dos consultas sobre sintaxis y funcionamiento en Pawn
« Respuesta #3 : marzo 26, 2014, 08:18:39 am »
Muchísimas gracias Boris.

Apenas haga el upgrade de firmware veo como funciona y te aviso.

Saludos,
Pablo.

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Re: Dos consultas sobre sintaxis y funcionamiento en Pawn
« Respuesta #4 : marzo 31, 2014, 16:29:04 pm »
Hola !

Hice el upgrade del firmware del PLC y me parece que ahora los TimeOuts funcionan perfecto.

No lo pude probar completamente porque tengo caído el servicio de Arnet y con eso algunas funcionalidades no me andan, pero igualmente estoy casi 100% de que ya está funcionando bien.

Muchas gracias !
Saludos,
Pablo.