Agregar nuevo Cliente PLC al servidor TCP

  • 5 Respuestas
  • 91 Vistas

Mariano

  • Aprendiz
  • **
  • Mensajes: 94
Agregar nuevo Cliente PLC al servidor TCP
« : abril 28, 2019, 20:16:19 pm »
Estimado Boris, buenas noches,

Necesiraría información sobre el evento OnTcpServerRx().

Aquí entiendo que se procesa la recepción de datos de clientes remotos. Por ahora tengo un sólo cliente y lo que quiero es agregar un segundo. Quisiera saber como identificar en el programa del server cual es el cliente que se está conectando.
El código completo de este evento del server es:

Código: [Seleccionar]
@OnTcpServerRx()
{
// new Identidad se definio en globales
// Obtener conexiones con datos sin leer.

while((Identidad=TcpServerGetUnreadId()) > 0)
{       
// Leer 2 datos y almacena en RxData[].
TcpServerRead(Identidad, RxData, 2)
      DoutSetOn(DOUT10);   //Enciende indicador led ambar puerta tablero plc tanque
segundero_com=0;     // nuevo.....................................
     
      ultimo_data_0_rural=RxData[0];
      ultimo_data_1_rural=RxData[1];
     
//Comprobar si debemos activar/desactivar
      //salidas digitales DOUT1 y/o DOUT2.
      //según bits recibidos en RxData[0] y [1]
     
if(RxData[0] == 0){
DoutSetOff(DOUT1); //DOUT1 Led que corresponde a Bomba3
         TcpServerSend(Identidad, TxData, 2);
         }
if(RxData[0] == 1){
         DoutSetOn(DOUT1);
         TcpServerSend(Identidad, TxData, 2);
         }
     
if(RxData[1] == 0){DoutSetOff(DOUT2);}
if(RxData[1] == 1){DoutSetOn(DOUT2) ;}
}
}

Entiendo que en la variable Identidad (definida como global), debería encontrarse cual es el cliente conectado; si es así no sé como podría manipularla para mostrarla en el web server por ejemplo.
Hay alguna nota de aplicación que explique las funciones disponibles y relacionadas a este evento?

Saludos
« Última Modificación: abril 29, 2019, 17:50:30 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2032
  • Soporte Técnico
Re:Agregar nuevo Cliente PLC al servidor TCP
« Respuesta #1 : abril 29, 2019, 17:42:42 pm »
Buenas tardes Mariano, paso a contestarte a continuación:

Necesiraría información sobre el evento OnTcpServerRx().
Hay alguna nota de aplicación que explique las funciones disponibles y relacionadas a este evento?

Aquí te paso el link donde están las funciones descriptas:

http://foro.slicetex.com/index.php?topic=165.msg780#msg780

Y dos ejemplos:

http://foro.slicetex.com/index.php?topic=165.msg775#msg775

http://foro.slicetex.com/index.php?topic=165.msg776#msg776

Tengo pendiente crear el PDF en la nota de aplicación.

Aquí (OnTcpServerRx()) entiendo que se procesa la recepción de datos de clientes remotos. Por ahora tengo un sólo cliente y lo que quiero es agregar un segundo. Quisiera saber como identificar en el programa del server cual es el cliente que se está conectando.

Si, cada vez que se reciben nuevos datos, se llama al evento OnTcpServerRx().

Como el servidor TCP puede manejar más de un cliente, la única forma que tenés de identificarlo, es conociendo su "ID" (identificador), un número mayor a cero.

Este "ID" es el que usas para comunicarte con los clientes conectados, actualmente el PLC admite dos conexiones, es decir 2 números ID, 1 y 2 (esto se puede aumentar si en necesario). Por lo que para comunicarte con los clientes, solo debes usar el ID en las funciones.

Cuando recibis datos es fácil, porque desde el evento obtenes los ID de conexiones que tienen datos nuevos, y usas esos ID para enviar una repuesta.

Para transmitir asincrónicamente (es decir cuando se te ocurra desde el servidor), es conveniente que compruebes que el ID pertenece a una conexión abierta (ya que el cliente puede haber cerrado la conexión).

Los ID (1 y 2, por ejemplo), pueden pertenecer a cualquier cliente conectado. Si lo que querés es mostrar en el Webserver, algo más especifico, podés hacer que cada PLC al transmitir datos especifique en un byte un número propio, entonces sabes de donde viene y los datos recibidos los podes identificar de uno u otro PLC, y a su vez darle una repuesta especifica.

Si sabés de que PLC viene, podes ir almacenando esos datos en una variable especifica y mostrar en el servidor web.

Generalmente, las aplicaciones cliente-servidor TCP, son del tipo:

Cliente envia Mensaje -> Servidor (procesa mensaje) -> Respuesta al cliente desde el servidor.

Esto es para que organices de esa forma el programa y te sea más fácil administrar varios clientes.


El código completo de este evento del server es:

Código: [Seleccionar]
@OnTcpServerRx()
{
// new Identidad se definio en globales
// Obtener conexiones con datos sin leer.

while((Identidad=TcpServerGetUnreadId()) > 0)
{       
// Leer 2 datos y almacena en RxData[].
TcpServerRead(Identidad, RxData, 2)
if(RxData[0] == 0){
   DoutSetOff(DOUT1); //DOUT1 Led que corresponde a Bomba3
                   TcpServerSend(Identidad, TxData, 2);
                }
if(RxData[0] == 1){
                   DoutSetOn(DOUT1);
                   TcpServerSend(Identidad, TxData, 2);
                }
         }
}

Entiendo que en la variable Identidad (definida como global), debería encontrarse cual es el cliente conectado; si es así no sé como podría manipularla para mostrarla en el web server por ejemplo.

Claro, el evento se dispara porque hay un dato nuevo recibido, y con TcpServerGetUnreadId() buscás el ID (o conexión) que tiene datos recibidos sin leer. Luego usas ese ID, para transmitir una repuesta.

No es complicado, pero si tenés duda quedo a disposición.

Saludos!
« Última Modificación: abril 29, 2019, 19:30:14 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Aprendiz
  • **
  • Mensajes: 94
Re:Agregar nuevo Cliente PLC al servidor TCP
« Respuesta #2 : mayo 09, 2019, 14:07:57 pm »
Boris gracias por los links.
Ya lo pude conectar y funciona perfecto.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2032
  • Soporte Técnico
Re:Agregar nuevo Cliente PLC al servidor TCP
« Respuesta #3 : mayo 09, 2019, 20:51:14 pm »
Perfecto!
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Mariano

  • Aprendiz
  • **
  • Mensajes: 94
Re:Agregar nuevo Cliente PLC al servidor TCP
« Respuesta #4 : junio 18, 2019, 20:37:38 pm »
Estimado Boris buenas noches.

El sistema estuvo funcionando a prueba todo un més aproximadamente y decidi implementarlo definitivamente. Funcionó muy bien unos días hasta q tuve q desconectar a uno de los dos clientes. Al reconectarlo, sucede que cuando uno tiene que hacer un cambio de estado, aparece como el unico conectado y el otro recién se conecta cuando le toca a el.
Sospecho q es una cuestión de conflicto en el server. El cual por alguna razón muestra conectado a un sólo de los dos clientes a la vez.
Me parece q la solución podría ser cerrar la conexión en el cliente por lo q estuve leyendo del foro q me pasaste.
Voy a necesitar las instrucciones pawn para operar sobre el cliente (el foro que me pasaste sólo tiene las sentencias del server). Hay alguna nota de aplicación o algún link a un foro donde figuren estas instrucciones?

Saludos

Mariano

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2032
  • Soporte Técnico
Re:Agregar nuevo Cliente PLC al servidor TCP
« Respuesta #5 : junio 19, 2019, 10:43:34 am »
Buenos días Mariano.

El sistema estuvo funcionando a prueba todo un més aproximadamente y decidi implementarlo definitivamente. Funcionó muy bien unos días hasta q tuve q desconectar a uno de los dos clientes. Al reconectarlo, sucede que cuando uno tiene que hacer un cambio de estado, aparece como el unico conectado y el otro recién se conecta cuando le toca a el.
Sospecho q es una cuestión de conflicto en el server. El cual por alguna razón muestra conectado a un sólo de los dos clientes a la vez.
Me parece q la solución podría ser cerrar la conexión en el cliente por lo q estuve leyendo del foro q me pasaste.

Puede ser una posibilidad que el servidor al soportar solo dos clientes a la vez, cuando se desconecta un cliente (sin cerrar la conexión en el servidor) no puede conectarse de nuevo hasta que el servidor aborta la conexión previa por inactividad. Luego el cliente puede volver a reconectar cuando tiene una conexión libre.

Te adjunto en este mensaje el firmware versión 223, que admite 4 conexiones simultáneas para el servidor. Esto podría manejar mejor ese caso, ya que el cliente puede reconectar estando dos conexiones ocupadas. La cual también quedará libre luego de un tiempo de inactividad.

Podés aplicar esta actualización al PLC servidor y probar resultados.

Voy a necesitar las instrucciones pawn para operar sobre el cliente (el foro que me pasaste sólo tiene las sentencias del server). Hay alguna nota de aplicación o algún link a un foro donde figuren estas instrucciones?

En este link podés ver la descripción de las funciones del cliente TCP:

foro.slicetex.com/index.php?topic=48.msg121#msg121

También una alternativa, es que desde cliente te conectes al servidor, transmitas o recibas los datos y luego cierres la conexión con TcpClClose() hasta que necesites de vuelta conexión (como para cerrar explícitamente la conexión en el servidor y mantener cierto control de conexiones).

Saludos!
« Última Modificación: junio 19, 2019, 10:50:14 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com