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.