Filtro anti-rebotes en Pawn y declaracion de variables

  • 1 Respuestas
  • 3003 Vistas

coloriginal

  • Aprendiz
  • **
  • Mensajes: 37
Filtro anti-rebotes en Pawn y declaracion de variables
« : noviembre 20, 2015, 09:39:49 am »
Buenos días Boris, por lo que vi en la documentación en Ladder existe un control que funciona como filtro anti-rebote para las entradas digitales pero no vi el equivalente en Pawn y quería saber si existe algo parecido y en tal caso como utilizarlo, o en caso contrario saber si hay que implementarlo manualmente y si tenes algún ejemplo para basarse.

Por otro lado no encontré en el corto tiempo que llevo en el lenguaje Pawn la forma correcta de declarar las variables, si me podrias decir o dar un par de ejemplos estaría muy bueno.

ej.

New int A = 1
o
int A =1
o
New A = 1
etc.

Desde ya muchas gracias.

A.S.: Cristian M. Colovatto
M. P. :3076
(0351)-157428908
« Última Modificación: noviembre 20, 2015, 16:18:56 pm por Soporte »
A.S.: Cristian M. Colovatto
M.P.:3076
Del.:3512635979
WWW.E-PARKING.COM.AR

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re: Filtro anti-rebotes en Pawn y declaracion de variables
« Respuesta #1 : noviembre 20, 2015, 16:18:37 pm »
Buenas tardes Cristian,

Para declarar correctamente una variable entera Int32 en Pawn debes hacer:

new NombreVariable

Por defecto se inicializa con el valor cero, pero podes incializar con cualuquier otro valor constante:

new NombreVariable = 55

Este documento introduce al lenguaje Pawn: http://slicetex.com/ladder/docs/files/STXLADDER-PI.pdf

No 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:

Código: (Pawn) [Seleccionar]
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:

Código: (Pawn) [Seleccionar]

// 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.



« Última Modificación: noviembre 20, 2015, 16:20:18 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com