Generic serial and TCP

Equipos que hablan un protocolo propio de texto o de bytes, como básculas y lectores de códigos de barras, por una línea serie, TCP o UDP: cómo terminan y se comprueban sus mensajes, y cómo cada tag saca de ellos su valor.

Ver como Markdown

El driver Generic serial and TCP lee y escribe equipos que hablan un protocolo propio, hecho de texto o de bytes sencillos, donde no se aplica ningún protocolo estándar: una báscula, un lector de códigos de barras o de RFID, un instrumento antiguo, una impresora de etiquetas. A un equipo así no se le puede preguntar qué es, así que no se descubre nada. Usted le dice al dispositivo cómo termina un mensaje que envía y cómo se comprueba su suma de verificación, y le dice a cada tag cómo obtiene su valor, qué mensajes son suyos y qué caracteres del mensaje son el valor.

Un dispositivo llega a su equipo de una de tres formas, elegida al crearlo:

Transporte Cómo se llega al dispositivo Qué pueden hacer sus tags
En una línea serie Una línea serie de este driver, compartida con los demás dispositivos que tiene, una solicitud a la vez. Solicitud y respuesta, escucha, escrituras.
Cliente TCP Su propia conexión con el host y el puerto del equipo. Solicitud y respuesta, escucha, escrituras.
Escucha UDP Un puerto de esta estación al que el equipo envía datagramas. La estación no envía nada. Solo escucha, solo lectura.

Un dispositivo en una línea serie cuelga de su línea, así que esa parte del árbol se lee Driver → Línea → Dispositivo → Tag, como en Modbus RTU. Un dispositivo de red cuelga del driver y se puede archivar en carpetas como el de cualquier otro driver, Driver → Carpeta → Dispositivo → Tag. Un dispositivo se queda en el lado en que se creó: TCP y UDP se intercambian, pero un dispositivo nunca pasa de una línea a la red ni de la red a una línea.

La página del driver

La frase bajo la cabecera dice "Las líneas serie llevan los instrumentos que comparten un bus, y los dispositivos de red cuelgan del driver. Agregue una línea o un dispositivo y después ábralo para describir sus mensajes." y la página tiene dos tablas, una debajo de la otra:

Tabla Qué la hace crecer Qué lista
Líneas serie Agregar línea, a la derecha de su título. Las líneas del driver: Línea, Tupla física (puerto · baudios · formato, sin tiempo de espera, porque una línea de este driver no lo tiene), Dispositivos, Estado, y las acciones Abrir, Activar, Desactivar y Eliminar. Vacía, dice "Todavía no hay líneas serie."
Dispositivos Agregar dispositivo, a la derecha de su título. Crea un dispositivo de red, un Cliente TCP. Todos los dispositivos del driver, los de línea incluidos, con las columnas de la tabla de dispositivos de cualquier driver. Vacía, dice "Todavía no hay dispositivos."

La cabecera cuenta los dispositivos entre paréntesis, y la fila del driver en el árbol cuenta los dos niveles en cuanto existe una línea ("1 línea · 2 dispositivos"). La barra del driver no tiene Descubrir. El clic derecho sobre la fila del driver ofrece Agregar dispositivo, Agregar línea, Nueva carpeta y Actualizar, y luego, tras un separador, Quitar el driver; en el menú Nuevo… de la columna, la entrada del driver ofrece Nuevo dispositivo, Nueva línea serie y Nueva carpeta, y luego sus líneas, carpetas y dispositivos. Una vez agregado, el driver queda bajo la carpeta Drivers del árbol, con línea o dispositivo o sin ellos.

Línea serie

Una línea de este driver es la línea descrita en Líneas serie, con menos campos. Su página dice "Un bus serie físico: los ajustes de puerto que comparten sus instrumentos, una solicitud a la vez." y su tarjeta Línea física tiene:

Campo Significado Por defecto
Nombre El nombre descriptivo del bus, que se muestra en el árbol y en cada dispositivo que tiene. "Nueva línea"
Puerto serie El puerto COM de Windows, físico, virtual o redirigido, escrito o elegido entre los puertos de los que informa Windows (Actualizar los vuelve a leer). Un puerto pertenece a una línea, sea cual sea el driver de la línea. el primer puerto libre
Baudios La velocidad del bus, compartida por todos los dispositivos de la línea. 9600
Formato serie Bits de datos, paridad y bits de parada: 8N1, 8N2, 8E1, 8E2, 8O1, 8O2, 7N2, 7E1, 7E2 o 7O1. Se ofrecen los diez, porque este driver no necesita 8 bits de datos. 8E1

Una línea creada aquí empieza desactivada, para que los ajustes del puerto se escriban antes de que se abra el puerto. El puerto, los baudios y el formato solo cambian con la línea desactivada; el nombre cambia en cualquier momento. Una línea de este driver no tiene modo de transmisión, tiempo de espera de respuesta, intervalo mínimo entre transacciones ni silencio automático: cada dispositivo que tiene indica en su propio panel cómo terminan sus mensajes y cuánto espera una respuesta, como dice la tarjeta Dispositivos bajo la línea: "Todos los dispositivos de esta línea comparten sus ajustes de puerto. Cada uno indica en su propio panel cómo terminan sus mensajes y cuánto espera una respuesta." No tiene la tarjeta Descubrir unidades y su tabla Dispositivos no tiene la columna ID de unidad, porque un instrumento se distingue por lo que dicen sus solicitudes, no por una dirección.

Agregar dispositivo en la línea, o en su menú del clic derecho, crea un dispositivo de este driver en esa línea. Una línea pertenece para siempre al driver bajo el que se creó: un dispositivo Modbus RTU y un dispositivo de este driver nunca comparten una línea, y un agente que apunta un dispositivo a una línea del otro driver es rechazado. Los estados de la línea (Apagada, En reposo, Conectando…, En línea, Falla del puerto) son los de toda línea serie, en Activación y estado de salud.

En la línea, el driver abre el puerto una vez para todos sus dispositivos y envía una solicitud cada vez, esperando su respuesta antes de la siguiente. Entre solicitudes, lo que llega se ofrece a todos los dispositivos de la línea, y cada uno lo corta en mensajes según sus propias reglas. Un puerto que falla lo vuelve a abrir la línea para todos sus dispositivos, esperando cada vez más entre intentos mientras siga fallando.

Dispositivo

Conexión

Campo Significado Por defecto
Transporte Solo en un dispositivo de red. Cliente TCP: "La estación se conecta al host y al puerto del dispositivo." Escucha UDP: "La estación escucha en un puerto local lo que envía el dispositivo y no envía nada." Los dos se intercambian; un dispositivo en una línea muestra su línea en su lugar. Cliente TCP
Host o IP TCP: el nombre de host o la dirección IP del equipo. Se puede pegar una dirección entera, con tcp:// delante y el puerto tras el host. vacío
Puerto TCP: el puerto en el que responde el equipo, de 1 a 65535. Ningún puerto es estándar para este tipo de equipo, así que un dispositivo nuevo no tiene ninguno. vacío
Aceptar de UDP, en lugar del host: "Solo se leen los datagramas de esta dirección. Vacío: cualquier remitente." vacío
Puerto local UDP, en lugar del puerto: "El puerto de esta estación al que envía el dispositivo. El firewall de Windows tiene que dejarlo pasar." vacío
Línea serie · fija Un dispositivo en una línea: el nombre de la línea sobre su puerto, sus baudios y su formato, de solo lectura. la línea bajo la que se agrega

Un dispositivo TCP nuevo dice "Host aún sin indicar" y no se conecta hasta tener un host y un puerto. Un dispositivo con host y sin puerto, y un dispositivo UDP sin su puerto local, no se pueden guardar: "Indique el puerto: el del dispositivo por TCP, el puerto local de escucha por UDP." Un dispositivo en una línea no tiene host, puerto ni carpeta, ni ID de unidad.

La Base URI que muestra la cabecera es la dirección de ejecución: generic://tcp/<host>:<port>, generic://udp/<local port> (con from=<sender> cuando Aceptar de está relleno) o generic://serial/<line id>/<port>/<baud>/<format>, seguida de cómo terminan y se comprueban los mensajes (end, start, terminator, length, gap, timeout, checksum y el resto). Los bytes que lleva son bytes, nunca la notación en que se escribe el dispositivo. La copia de un dispositivo en una línea se queda en esa línea; la copia de un dispositivo de red va al nivel propio del driver.

La tarjeta Mensajes

Bajo la tarjeta Conexión, la tarjeta Mensajes dice cómo se escriben los bytes y cómo termina un mensaje.

Campo Significado Por defecto
Escrito como Cómo se escriben el marcador de inicio, el terminador y, en cada tag, la solicitud, el filtro, el separador, el mensaje de escritura y la respuesta esperada. Texto con escapes: los caracteres imprimibles tal cual, \r, \n, \t, \\ y \xNN para cualquier otro byte. Bytes en hexadecimal: dos dígitos por byte, como 02 30 31 0D. Cambiarlo reescribe todos los campos de bytes del dispositivo y de sus tags, para que cada uno siga enviando los mismos bytes; mientras uno de ellos no sean bytes válidos, el cambio se rechaza: "La notación no se cambió: un campo de bytes de este dispositivo o de sus tags no es válido en la notación en uso. Corrígelo primero." Texto con escapes
El mensaje termina con Terminador, Longitud fija o Silencio. Por UDP cada datagrama es un mensaje, diga esto lo que diga. Terminador
Terminador Con Terminador: los bytes que cierran cada mensaje. No forman parte de lo que leen los tags. \r\n
Longitud del mensaje (bytes) Con Longitud fija, de 1 a 1024: "Cada mensaje tiene estos bytes, incluidos el marcador de inicio y la suma de verificación."
Silencio (ms) Con Silencio, de 5 a 10000: "Un mensaje termina cuando no llega nada durante este tiempo." 50
Marcador de inicio Opcional. Los bytes con que empieza cada mensaje, como \x02. Los bytes anteriores se descartan, lo que además vuelve a poner en fase un flujo tomado a mitad de un mensaje, y cuenta como los primeros caracteres del mensaje. vacío
Tiempo de espera de respuesta (ms) De 50 a 60000: "Cuánto espera una solicitud su respuesta, y una escritura su respuesta esperada." 1000
Tiempo máximo sin mensaje (s) De 0 a 86400, donde 0 significa nunca: "Los tags en escucha dejan de contar como lecturas cuando no llega nada durante este tiempo. 0: nunca, para un dispositivo que solo envía de vez en cuando, como un lector de códigos de barras. Ajústalo para un dispositivo que envía todo el tiempo, como una báscula." 0

Un campo que el final elegido no lee no se dibuja y conserva su valor para cuando ese final vuelva. Un valor con el que el dispositivo no puede trabajar no se guarda, y el registro de acciones dice por qué, por ejemplo "Indique el terminador con que terminan los mensajes, como \r\n." o "La longitud del mensaje debe estar entre 1 y 1024 bytes."

La tarjeta Suma de verificación

Campo Significado Por defecto
Algoritmo La suma de verificación que lleva cada mensaje: Ninguno, Suma (8 bits), Complemento a dos de la suma (LRC), Complemento a dos de la suma de 7 bits (Toledo), XOR (8 bits), CRC-16/MODBUS o CRC-16/CCITT. "Un mensaje cuya suma de verificación no coincide se descarta y se cuenta en el diario técnico, nunca se lee como valor." Ninguno
Escrita como Texto hexadecimal, la suma escrita con dígitos hexadecimales, o Bytes en bruto, los bytes propios de la suma. Texto hexadecimal
Posición Antes del final: los últimos bytes antes del terminador, o los últimos bytes del mensaje. Después del terminador: justo después de él, que entonces queda cubierto; solo se ofrece cuando los mensajes terminan con un terminador. Antes del final
Bytes excluidos al principio De 0 a 255: "Bytes al principio del mensaje que la suma de verificación no cubre, como un STX o un $." 0
Bytes excluidos justo antes De 0 a 255: "Bytes justo antes de la suma de verificación que esta no cubre, como el * de una sentencia NMEA. Los tags tampoco los leen." 0

Todos los campos salvo el algoritmo se dibujan solo cuando se elige una suma de verificación. La suma cubre el mensaje desde su primer byte hasta el byte anterior a la suma, salvo los bytes excluidos. Un mensaje cuya suma no coincide nunca se lee como valor: se descarta, y el diario técnico lo anota bajo el dispositivo como mucho una vez por minuto. La suma solo se comprueba: las solicitudes y las escrituras se envían exactamente como se escribieron, así que una solicitud que necesita suma de verificación la lleva en sus propios bytes.

Algoritmo Uso habitual
Suma (8 bits) Indicadores.
Complemento a dos de la suma (LRC) Indicadores, tramas al estilo de Modbus ASCII.
Complemento a dos de la suma de 7 bits (Toledo) La salida continua de un indicador Toledo, como un byte en bruto tras el CR.
XOR (8 bits) Sentencias NMEA 0183 ($…*hh), indicadores, lectores RFID.
CRC-16/MODBUS Tramas binarias; el byte bajo primero en bytes en bruto.
CRC-16/CCITT Tramas binarias (la variante CCITT-FALSE); el byte alto primero en bytes en bruto.

Direccionamiento del tag

Un tag de este driver no tiene dirección que escribir: su tarjeta Fuente pregunta cómo obtiene su valor, en los campos de abajo. Los bytes se escriben en la notación del dispositivo.

Campo Significado Por defecto
Modo de lectura Solicitud y respuesta: "La estación envía la solicitud con el intervalo de sondeo del tag y lee el valor en la respuesta." Escucha: "El dispositivo envía por su cuenta, y el tag conserva el último mensaje que acepta su filtro." Un dispositivo UDP solo ofrece Escucha: "Este dispositivo escucha por UDP y no envía nada: sus tags solo escuchan y son de solo lectura." Solicitud y respuesta
Solicitud Solo en solicitud y respuesta: "Lo que la estación envía con el intervalo de sondeo del tag, escrito como indica el dispositivo. El primer mensaje que acepta el filtro dentro del tiempo de espera es la respuesta." obligatoria
Filtro de mensajes Qué mensajes son del tag: Todos los mensajes, Empieza con (los bytes con que empiezan) o Coincide con una expresión regular (la Expresión regular con la que coinciden). En una solicitud, "Qué mensaje responde a la solicitud. Los demás pasan a los tags en escucha." Todos los mensajes
El valor es Cómo se recorta el valor del mensaje: El mensaje completo, Posición fija (Primer carácter y Longitud), Campo entre separadores (Separador y Número de campo) o Grupo de captura de un patrón (Patrón). "Las posiciones y los campos cuentan desde 1. El patrón necesita exactamente un grupo de captura, el valor. Los números se leen con punto decimal." El mensaje completo
El dispositivo escribe una coma como separador decimal Solo en tags Float y Double. La coma es el separador decimal al leer y al escribir. desactivada
Mensaje de escritura Tags que se escriben, no en UDP: "Lo que envía una escritura, con donde va el valor, como SP \r, o para darle formato. En un tag Boolean, un mensaje de escritura sin es un comando, que se envía al escribir true." vacío
Respuesta esperada "Opcional. Con qué empieza la respuesta del dispositivo a una escritura. La escritura solo tiene éxito cuando esa respuesta llega dentro del tiempo de espera." vacía

Los caracteres se cuentan desde el principio del mensaje, incluido el marcador de inicio; el terminador, la suma de verificación y los bytes que la suma excluye justo antes no forman parte de lo que lee un tag. Un patrón es una expresión regular de .NET, y un mensaje que tarda más de 250 ms en leer no se lee. Un tag de solo escritura no tiene campos de solicitud, filtro ni valor; un tag sin mensaje de escritura es de solo lectura.

Los tipos de datos son Boolean, Int32, Int64, Float, Double y String. El texto recortado se lee como el tipo del tag antes de que las etapas propias del tag lo conviertan, como en todo driver (vea La cadena de conversión): un Boolean lee 1, true, on o yes y 0, false, off o no; un entero lee un número entero (12.0 se lee como 12, 12.5 se rechaza); un Float o un Double lee un número decimal; un String toma los caracteres tal cual. Los espacios alrededor de un número, y entre su signo y sus dígitos, se ignoran, porque los indicadores rellenan sus números con espacios. Un tag cuyos campos no pueden funcionar no se guarda, y la página del tag dice qué le falta, por ejemplo "Indique la solicitud que envía este tag." o "El patrón necesita exactamente un grupo de captura, alrededor del valor."

La vista previa de solo lectura de la dirección de bus muestra ask o listen seguido de lo que aplique, por ejemplo listen?extract=position&start=5&length=6, o ask?send=01RD%0D&extract=field&separator=,&field=3 para un tag que envía 01RD y un CR y lee el tercer campo separado por comas de la respuesta.

Lectura

Situación Tag de solicitud y respuesta Tag en escucha
El valor Del primer mensaje comprobado que acepta el filtro dentro del tiempo de espera tras la solicitud. Del último mensaje comprobado que acepta el filtro, fechado por su llegada.
Cuándo se lee Con el intervalo de sondeo del tag. Cada vez que el equipo envía; el tag muestra el último mensaje con su intervalo de sondeo.
Antes del primer mensaje No aplica. El tag espera: sin valor y sin error, como cualquier tag antes de su primera respuesta.
Sin respuesta, o un equipo callado Ninguna respuesta dentro del tiempo de espera es una lectura fallida, y la política del tag para un dispositivo que no respondió decide qué muestra. Pasado el Tiempo máximo sin mensaje (s) del dispositivo, todos los tags en escucha fallan su lectura y su política decide qué muestran. Una conexión TCP que se cae los hace fallar diga lo que diga ese tiempo.
Un mensaje que el tag no puede leer Una lectura fallida, con el motivo: un campo que falta, el valor que pasa del final del mensaje, o un texto que el tipo no admite. Lo mismo.

Los mensajes que no responden a ninguna solicitud pasan a los tags en escucha del mismo dispositivo, así que un dispositivo puede tener las dos clases de tags. Los tags en escucha con el mismo filtro comparten lo que se oyó, y pueden sacar campos distintos del mismo mensaje.

Escritura

Una escritura pasa por el mismo embudo que la de cualquier otro driver: la casilla de escritura recibe el valor de ingeniería, y las etapas de conversión se invierten antes de enviar el valor bruto (vea Connector).

Mensaje de escritura Qué se envía Qué informa la escritura
Con {value} Los bytes escritos, con el valor donde está {value}: un número en cultura invariante (con coma como separador decimal cuando el tag lo indica), o con formato {value:FORMAT} según un formato numérico de .NET (W{value:000.0}\r envía 12,5 como W012.5 y un CR); un Boolean como 1 o 0; un texto tal cual. Hecha en cuanto se envía. Con una Respuesta esperada, hecha solo cuando llega dentro del tiempo de espera una respuesta que empieza con ella; otra respuesta rechaza la escritura con esa respuesta como motivo, y el silencio es falta de respuesta.
Sin {value}, en un tag Boolean Un comando, como una tara o una impresión: escribir true lo envía, escribir false se rechaza. Lo mismo.
Ninguno Nada: el tag es de solo lectura.

Las escrituras esperan su turno en la cola del dispositivo como las de todo driver: en una línea comparten la solicitud a la vez de la línea, en TCP la conexión propia del dispositivo. Un dispositivo UDP no envía nada, así que sus tags no se pueden escribir.

Ejemplo: una báscula por RS-232

Un indicador al estilo de la salida continua de Toledo envía, muchas veces por segundo, un STX, tres bytes de estado, seis dígitos de peso, seis de tara, un CR y un byte de suma de verificación. En la estación:

  1. Agregar línea en la página del driver; llámela Scale line, elija COM3, deje Baudios en 9600 y elija 7E1 como Formato serie, y después Activar la línea.
  2. Agregar dispositivo en la línea; llámelo Scale. En la tarjeta Mensajes deje Texto con escapes y Terminador, ponga el Terminador en \r, el Marcador de inicio en \x02 y el Tiempo máximo sin mensaje (s) en 10, para que un cable suelto se vea como comunicación perdida.
  3. En la tarjeta Suma de verificación elija Complemento a dos de la suma de 7 bits (Toledo), Bytes en bruto y Después del terminador, con las dos cuentas de bytes excluidos en 0.
  4. Agregar tag; llámelo Weight, Double, de solo lectura. En la tarjeta Fuente elija Escucha, Todos los mensajes y Posición fija, con Primer carácter 5 y Longitud 6: el STX es el carácter 1, los tres bytes de estado van del 2 al 4, el peso del 5 al 10.
  5. Los dígitos no llevan punto decimal, así que la etapa Escala del tag lo coloca, por ejemplo un factor de 0,01 para un indicador ajustado a dos decimales.

Un agente hace lo mismo con tres llamadas de herramienta:

serial_line_upsert driver=GenericSerialTcp name="Scale line" serialPort=COM3 baudRate=9600 serialFormat=7E1
device_upsert driver=GenericSerialTcp name=Scale transport=SerialLine serialLineId=<id> messageEnd=Terminator terminator=\r startMarker=\x02 checksum=SumTwosComplement7Bit checksumFormat=Raw checksumPlacement=AfterEnd silenceTimeoutSeconds=10
tag_upsert device=Scale name=Weight opcUaType=Double tagMode=Listen valueExtraction=FixedPosition valueStart=5 valueLength=6

Ejemplo: un lector de códigos de barras por TCP

Un lector de códigos de barras con puerto Ethernet envía un código por línea, y solo cuando lee uno:

  1. Agregar dispositivo en la página del driver; llámelo Reader, deje Cliente TCP e indique Host o IP 192.168.0.40 y Puerto 2001.
  2. En la tarjeta Mensajes deje Texto con escapes, Terminador \r\n y Tiempo máximo sin mensaje (s) en 0: un lector que no envía nada durante una hora no está fallando. Deje Ninguno en la tarjeta Suma de verificación.
  3. Agregar tag; llámelo Code, String, de solo lectura. En la tarjeta Fuente elija Escucha, Todos los mensajes y El mensaje completo.

Lo mismo con las herramientas del agente:

device_upsert driver=GenericSerialTcp name=Reader transport=TcpClient host=192.168.0.40 port=2001 messageEnd=Terminator terminator=\r\n
tag_upsert device=Reader name=Code opcUaType=String tagMode=Listen valueExtraction=WholeMessage

driver_capabilities describe este driver en genericSerialTcp, con estos dos ejemplos, y serial_line_upsert crea una línea de este driver con driver=GenericSerialTcp; las demás herramientas están en Las herramientas, área por área.

Límites que conviene conocer

  • No se descubre nada: no hay protocolo para preguntar a un equipo así qué es o qué contiene.
  • Una trama binaria que anuncia su propia longitud en una cabecera no se lee; un mensaje termina con un terminador, una longitud fija, un silencio o un datagrama.
  • La suma de verificación solo se comprueba: no se agrega ninguna a lo que envía la estación.
  • Un tag saca un valor de un mensaje, como texto leído según su tipo; los números empaquetados como enteros o coma flotante binarios dentro del mensaje no se decodifican.
  • Un dispositivo UDP solo escucha: no envía solicitudes ni acepta escrituras.
  • Un dispositivo no se puede mover entre una línea serie y la red, ni a otra línea: créelo donde le corresponde y elimine el antiguo.