Buenas tardes Cristian,
Para declarar correctamente una variable entera
Int32 en Pawn debes hacer:
new NombreVariablePor defecto se inicializa con el valor cero, pero podes incializar con cualuquier otro valor constante:
new NombreVariable = 55Este documento introduce al lenguaje Pawn:
http://slicetex.com/ladder/docs/files/STXLADDER-PI.pdfNo hay una función anti-rebote como tal en Pawn, pero se pueden implementar manualmente.
Si bien por hardware cada entrada tiene un pequeño filtro RC, podes utilizar un algoritmo para filtrar posibles rebotes.
Un codigo simple es el siguiente:
DinReadFiltered(Din)
{
new timeOut = 10
new lastLevel = 0
lastLevel = DinValue(Din)
while(timeOut > 0)
{
if(DinValue(Din) == lastLevel)
{
// Retardo de 5 mS.
DelayMS(5)
timeOut--
}
else
{
// Valor difiere al ultimo leído, reiniciar timeout.
lastLevel = DinValue(Din)
timeOut = 10
}
}
return lastLevel
}
Podes utilizarlo de la siguiente forma:
if(DinReadFiltered(DIN1) == 1)
{
RelayClose(RELAY1)
}La contra de ese código es que al llamarlo, bloquea el programa por al menos 50 mS.
Pero podes combinar por ejemplo con el evento
@OnDinChange() que es llamado cuando alguna entrada digital cambia de estado.
En este caso, asocias una variable a las entradas criticas, por ejemplo
Motor a la entrada
DIN1 y
Bomba a la entrada
DIN2.
Solo cuando alguna entrada cambia su valor (respecto al ultimo leido), llamas a la función de filtro.
Ejemplo:
// Variables asociadas al accionamiento de una entrada.
new Motor = 0
new Bomba = 0
PlcMain()
{
// Actualizar variables.
Motor = DinReadFiltered(DIN1)
Bomba = DinReadFiltered(DIN2)
// Activar evento @OnDinChange()
DinOnChangeSetEvent()
// Loop principal.
while(true)
{
//
// Leer variables, ya que indirectamente representan las entradas filtradas.
//
if(Motor == 1)
{
RelayClose(RELAY1)
}
else
{
RelayOpen(RELAY1)
}
if(Bomba== 1)
{
RelayClose(RELAY2)
}
else
{
RelayOpen(RELAY2)
}
//
// Otro codigo o funcion ...
//
}
}
@OnDinChange()
{
// COMPROBAR ENTRADAS DIN1 Y DIN2
if(DinValue(DIN1) != Motor)
{
Motor = DinReadFiltered(DIN1)
}
if(DinValue(DIN2) != Bomba)
{
Bomba = DinReadFiltered(DIN2)
}
}
A veces el filtro digital no es necesario, ya que actúa el filtro de hardware incorporado, pero eso debes evaluarlo.
Cualquier duda quedo a disposición.