Slicetex Electronics - Foro

PLC - DAQ => STX8081 => Mensaje iniciado por: coloriginal en noviembre 30, 2015, 11:32:26 am

Título: Implentacion de tarjetas Wiegand
Publicado por: coloriginal en noviembre 30, 2015, 11:32:26 am
Hola Boris quería saber en que estado esta la implementación en el PLC de la lectura de tarjetas de proximidad Wiegand, ya que es una de las pocas cosas que me falta para completar la implementación del PLC en mi desarrollo.

Desde ya te agradezco la buena predisposición para apoyar mi desarrollo.
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en noviembre 30, 2015, 11:59:49 am
Buenas tardes, en estos días iba a comenzar a implementarlo.

Te mantengo al tanto del progreso.

Estamos en contacto.

Enviado desde un dispositivo móvil usando Taptalk.

Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 03, 2015, 20:14:14 pm
Buenas tardes Cristian,

Ya esta terminado la implementación del protocolo Wiegand, funcionando con el hardware que suministraste.

Falta que actualice el software del del entorno para que pueda descargarse y usarse.

Aprovecho para adjuntarte el ejemplo de uso (Wiegand.zip) para StxLadder (http://www.slicetex.com/ladder), así lo tenes en cuenta para adaptarlo a tu código.

Luego voy a subir las descripciones de las funciones.

Saludos
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: coloriginal en diciembre 04, 2015, 08:02:17 am
De 10 Boris muy bueno, en que pin se conecta el lector?, podre pasar esta tarde para que me muestre la conexión física?
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 04, 2015, 08:57:10 am
Después te voy a pasar la información de conexión.
Igual creo necesitas el cable modificado para conectar también al puerto serie.

Estoy de viaje ahora. Pero para el primer día hábil de la semana que viene (miércoles) , te puedo tener el conector así directamente lo conectas al sensor.

A su vez, luego te voy a pasar la actualización de soft, así lo podes dejar implementado teóricamente en tu proyecto.

Estamos en contacto.

Enviado desde un dispositivo móvil usando Taptalk.

Título: Re:Implentacion de tarjetas Wiegand
Publicado por: coloriginal en diciembre 04, 2015, 09:16:07 am
Ok gracias, disculpa el apuro es que pensaba aprovechar el fin de semana lardo para realizar algunas pruebas, de todas formas ya tengo armado el código (pero no puedo compilarlo) la única duda es como transformar el nro. que obtengo con la nueva función WiegandGetCardNumber() a bytes para poder mandarlo con TcpServerSend.

Espero con ansias la actualización del software para poder realizar pruebas.

Gracias y buen viaje.
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 04, 2015, 11:03:55 am
La función WiegandGetCardNumber()  retorna un valor de 16 bits. Por lo tanto necesitas dos bytes para transmitir.

Podes hacer :

Código: (Pawn) [Seleccionar]
new Tx[2]
new Value

Value = WiegandGetCardNumber()

Tx[0]  = Value
Tx[1]  = Value >> 8

El operador >> desplaza 8 bits a la derecha, por lo que primero transmitis el valor menos significativo y luego el más significativo.

Al recibirlos en la PC debes hacer el proceso inverso.



Enviado desde un dispositivo móvil usando Taptalk.

Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 08, 2015, 19:37:30 pm
Buenas tardes Cristian,

Ya esta actualizado el software para el soporte del protocolo Wiegand 26 para leer tarjetas RF de identificación.

Lo primero que hay que hacer es actualizar:

Una vez actualizado firmware y software, hay que configurar la placa para usar el protocolo Wiegand 26 en el puerto de expansión.

Esto se hace una vez por cada placa desde StxLadder, en "PLC > Configurar PLC". Conectar al PLC y luego en pestaña "Expansión" hacer click en "Wiegand: Hardware compatible". Ver imagen que paso adjunta.

Luego, el harware Wiegand debe conectarse al puerto de expansión HP2/HP3 de la siguiente forma:


Importante-1: La conexión debe hacerse con el PLC apagado y luego de configurar el hardware desde StxLadder.
Importante-2: Consultar hoja de datos del dispositivo (http://slicetex.com/hw/stx80xx/docs.html) para limites eléctricos e identificación de pines en puerto de expansión.

Así mismo te tengo armado un cable especial para conectar al lector de tarjeta y al puerto RS232.
Llámame para coordinar.



FUNCIONES PAWN DISPONIBLES PARA PROTOCOLO WIEGAND 26

El ejemplo Wiegand.zip que se adjunta en este mensaje contiene el modo de uso.


WiegandInit(): Inicializa la librería Wiegand. Debe llamarse antes de cualquier función.

RETORNO:


WiegandCheckValidity(): Comprueba si el ultimo dato recibido con el protocolo Wiegand 26 es valido.

RETORNO:

Nota: El software del PLC comprueba validez del protocolo utilizando los Bit de paridad Par/Impar provistos por la trama recibida. Si la paridad coincide con los datos recibidos, se acepta como valida. Esto permite identificar tramas erroneas generadas por ruido o por hardware no compatible.


WiegandGetCardNumber(): Obtiene el ultimo "Card Number" recibido con el protocolo Wiegand 26.

RETORNO:


WiegandGetFacilityCode(): Obtiene el ultimo "Facility Code" recibido con el protocolo Wiegand 26.

RETORNO:


WiegandGetFrame(): Obtiene el ultimo "Frame" recibido con el protocolo Wiegand 26. Es decir la secuencia completa de 26 bits sin procesar.

RETORNO:


WiegandSetEvent(): Activa el evento @OnWiegand() que es llamado cuando datos son recibidos del hardware Wiegand conectado al puerto de expansión.

RETORNO:


WiegandClrEvent(): Desactiva el evento @OnWiegand().

RETORNO:


EJEMPLO

Ver archivo Wiegand.zip adjunto.

Código: (Pawn) [Seleccionar]
// ********************************************************************************
// Funcion     : PlcMain()
// Descripcion : Punto de entrada principal del PLC.
// ********************************************************************************

PlcMain()
{
   //
   // Incializar puerto de expansion para
   // utilizar protocolo Wiegand.
   //

   WiegandInit()
   WiegandSetEvent()
   
   //
   // Mensaje de bienvenida.
   //
   
   LcdClear()
   LcdPrintf(0,0, "PASS CARD")
   LcdPrintf(0,1, "PLEASE")

   //
   // Loop principal
   //
   
   for(;;)
   {
   DelayMS(500)
   LedToggle()
   }

   // Retorno.
   return 0
}

// ********************************************************************************
// Funcion     : @OnWiegand()
// Descripcion : Evento generado cuando se recibe una trama del protocolo
//               Wiegand 26 a traves del hardware conectado al puerto de expansion.
// ********************************************************************************

@OnWiegand()
{
if(WiegandCheckValidity())
{
// Datos validos.

LcdClear()
LcdPrintf(0, 0, "Facility: %d", WiegandGetFacilityCode())
LcdPrintf(0, 1, "Card #: %d", WiegandGetCardNumber())
}
else
{
// Datos recibidos con error.
// Comprobar hardware.

LcdClear()
LcdPrintf(0, 0, "Invalid")
LcdPrintf(0, 1, "Code")
}
}
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 09, 2015, 19:03:03 pm
Buenas tardes Cristian,

Una nueva  versión 213 del firmware de la STX8081 (http://slicetex.com/hw/stx8081/soft.html) esta disponible para descargar, la misma corrige la interpretación de bits en el protocolo Wiegand 26.

Antes se interpretaba mal el orden de los bits. Ahora decodifica correctamente el numero de las tarjetas.

Probalo y avísame.

Saludos
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: coloriginal en diciembre 10, 2015, 20:36:17 pm
Hola Boris, te cuento que esta funcionando a la perfección.
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: coloriginal en diciembre 15, 2015, 20:41:28 pm
Hola Boris te cuente que estuve haciendo un par de pruebas ya con todos los equipos conectados al plc (barrera, espira de detección metálica, impresora, botón y lectora de tarjetas Wiegand) y encontré que al activar la barrera con el relé 1 para subir o con el relé 2 para bajar me activaba el evento @OnWiegand() y la función WiegandCheckValidity() me indica que es erróneo o incluso me devuelve un números de tarjetas a la zar, para solucionar este problema lo que hice fue desactivar el evento antes de activar los relés y volver a activarlo tras 800 MS de liberado los relés. Te cuento esto para que me des tu opinión sobre esta solución que encontré o si se te ocurre alguna otra.

Por otro lado te comento que una vez resuelto el tema anterior me ocurrió que aleatoriamente la función WiegandCheckValidity() me indica varias veces que la lectura de la tarjeta es errónea y cuando vuelve a tomar un dato válido me devuelve otro número de tarjeta de forma constante, la única forma de sacar de ese error al PLC es reiniciándolo. Incluso algunas veces me paso al comenzar, sin activar ningún relé ya se presenta la indicación de la función WiegandCheckValidity() de que la lectura es incorrecta. Me gustaría si podes probar esto que te menciono ya que no puedo estar reiniciando el PLC cuando esto ocurre.

Te adjunto una imagen con el nro de tarjeta y el nro que toma, cualquier cosa que necesites más datos para poder replicar el problema por favor avisame y nos ponemos en contacto.

Como siempre desde ya muchas gracias.
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 16, 2015, 19:48:44 pm
Buenas tardes Cristian,

Citar
Hola Boris te cuente que estuve haciendo un par de pruebas ya con todos los equipos conectados al plc (barrera, espira de detección metálica, impresora, botón y lectora de tarjetas Wiegand) y encontré que al activar la barrera con el relé 1 para subir o con el relé 2 para bajar me activaba el evento @OnWiegand() y la función WiegandCheckValidity() me indica que es erróneo o incluso me devuelve un números de tarjetas a la zar, para solucionar este problema lo que hice fue desactivar el evento antes de activar los relés y volver a activarlo tras 800 MS de liberado los relés. Te cuento esto para que me des tu opinión sobre esta solución que encontré o si se te ocurre alguna otra.

Al detectar por flanco descendente, cada bit de señal del protocolo Wiegand en el puerto de expansión genera una interrupción. Al conmutar el rele se introduce un ruido que genera falsas interrupciones y secuencias de bits, por ello WiegandCheckValidity() indica error.

Al desactivar el evento, desactivas las interrupciones y no se generan bits por ruido.

Entonces, esto puede mejorarse con:


Citar
Por otro lado te comento que una vez resuelto el tema anterior me ocurrió que aleatoriamente la función WiegandCheckValidity() me indica varias veces que la lectura de la tarjeta es errónea y cuando vuelve a tomar un dato válido me devuelve otro número de tarjeta de forma constante, la única forma de sacar de ese error al PLC es reiniciándolo. Incluso algunas veces me paso al comenzar, sin activar ningún relé ya se presenta la indicación de la función WiegandCheckValidity() de que la lectura es incorrecta. Me gustaría si podes probar esto que te menciono ya que no puedo estar reiniciando el PLC cuando esto ocurre.

Esto puede ser un error de firmware. Hay que ver que esta "confundiendo" el algoritmo. Sospecho que queda una secuencia incompleta de bits, y el algoritmo la espera indefinidamente. Entonces al pasar la siguiente tarjeta, se generan 26 bits, pero como ya había leídos algunos bits anteriormente (incompletos) los nuevos 26 bits se suman a los ya leídos, y se detecta un error de paridad. Y así indefinidamente.

Fíjate si llamando a WiegandInit() podes evitar reiniciar con RESET, ya que eso vuelve a "default" las variables de la librería.

Si eso lo destraba, tenemos un punto para comenzar a ver donde esta la falla.

De ser eso, hay que implementar "un limpiador" automático de secuencias incompletas, que el algoritmo las detecte o mejorarlo para tal situación.

Bueno, avísame que detectas y quedo a disposición.


Título: Re:Implentacion de tarjetas Wiegand
Publicado por: coloriginal en diciembre 17, 2015, 21:34:50 pm
Hola Boris te cuento que implemente todas las modificaciones que me recomendaste y funciona a la perfección, te cuento que luego de leer cada código y de activar los relé  invoco la función WiegandInit(), de esta forma no tuve más lecturas anómalas. Por otro lado te quería preguntar si era viable cambiar la asignación de los pines del puerto de expansión cambiando el pin 6 por el 5, esto es debido que de dicha forma puedo aprovechar los circuitos del puerto de expansión para soldar los capacitors y los conectores del lector. En la configuración actual tuve que hacer una modificación a la placa. Te adjunto unas fotos para que lo evalúes.
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 18, 2015, 06:59:52 am
Buenos días Cristian,

Las modificaciones de software que hiciste por si solas, solucionan el problema? O también los capacitores ayudan?.

Igual te recomiendo usarlos, especialmente en la salida del contactor.

Voy a intentar implementar una forma de descartar falsos comienzos del protocolo Wiegand, ya que por eso al usar WiegandInit() mejora. Te aviso por este medio.

Respecto al cambio de pin, el pin 5 no tiene función como puerto I/O, y no es posible usarlo.

Capaz que te convenga soldarlos en la parte de abajo del puerto.

Estamos en contacto.



Enviado desde un dispositivo móvil usando Taptalk.

Título: Re:Implentacion de tarjetas Wiegand
Publicado por: coloriginal en diciembre 18, 2015, 07:03:25 am
Buenos días Boris , los cambios que implemente son de software y capacitores.con respecto al pin no te hagas drama se puede hacer igual.
Título: Re:Implentacion de tarjetas Wiegand
Publicado por: Soporte en diciembre 25, 2015, 12:30:29 pm
Buenos días Cristian,

Adjunto te paso un nuevo firmware (versión 215) que mejora el protocolo Wiegand 26.

En esta versión, las tramas que tienen una longitud menor o igual a 10 mS, y mayor o igual a 100 mS, son descartadas, ya que pueden ser
potenciales ruidos. Las mismas no se informan como eventos.

Esto te evita llamar al WiegandInit() repetidamente como lo hacías para re-iniciar el algoritmo.

Sin embargo, si hay un ruido que entre en ese periodo de tiempo y genere 26 bits, el mismo será tomado como una trama y luego el algoritmo indicará que es inválida (pero genera el evento) porque los bit de paridad serán erróneos. En ese caso, si no queres que se genere un evento, vas a tener que deshabilitarlo como hacías hasta ahora cuando activas el motor o incorporar los capacitores de filtro en las señales por hardware.

Finalmente me habías comentado de necesitar una funcion para medir tiempo entre dos puntos del programa. Fijate en el manual de programación Pawn (http://ww.slicetex.com/hw/stx80xx/docs/STX80XX-MP-PLC-AX_CX_DX.pdf), la función TimeGetTickRateMS(). La misma tiene una resolucion de 10 mS. El ejemplo esta en el manual.


Saludos y felices fiestas.