Servidor Modbus
El servidor Modbus TCP propio de la estación: su fila en la columna Comunicación, cómo se enciende y se apaga, su puerto y los clientes conectados, el mapa de registros que sirve tags, variables de Logic y estados de alarma, lo que un cliente lee y escribe, un ejemplo completo y lo que no hace.
El Servidor Modbus permite que un PLC, una HMI o un sistema de edificio que solo habla Modbus TCP lea los tags, las variables de Logic y los estados de alarma de la estación, y escriba en los tags y variables que usted permita. Es el segundo camino por el que los datos salen de la estación, junto al servidor OPC UA embebido, y no es un controlador: un controlador lee equipos, mientras que el servidor Modbus es leído por los equipos; espera a que un PLC se conecte y nunca se conecta a nada. Su panel lo dice bajo el título: "Atiende a los PLC, HMI y sistemas de edificio que leen y escriben por Modbus TCP. Recibe conexiones y nunca abre una."
Modbus no lleva nombre de usuario ni contraseña: quien llega al puerto lee todos los registros que sirve el mapa. Por eso el servidor empieza apagado, cada fila de su mapa empieza en solo lectura, y la escritura se permite fila a fila, por alguien que lo decidió. Ver Connector lee la página; Configurar Connector la cambia.
La fila en la columna
La fila Servidor Modbus está bajo la carpeta Servidores del árbol de la columna Comunicación, debajo de la fila del servidor OPC UA, con un icono de servidor donde los controladores muestran un enchufe. Siempre está ahí: una estación tiene exactamente una, y nunca se crea ni se elimina. El cuadro de búsqueda la encuentra por su nombre, y los chips de estado la clasifican por su estado: Apagado mientras está apagado, Con problemas mientras su puerto está ocupado o no pudo escuchar, Correctos en cualquier otro caso. Junto al nombre dice lo que está haciendo el servidor, y un punto lo resume:
| La fila dice | Punto | Cuándo |
|---|---|---|
| "Apagado" | gris | El servidor está apagado, que es como empieza toda estación. |
| "Escuchando en el puerto 502", y luego cuántos clientes hay conectados: "Ningún cliente conectado", "1 cliente conectado", "3 clientes conectados" | verde | El servidor está encendido y el runtime funciona: el puerto está abierto. |
| "El puerto 502 está en uso" | rojo | El servidor está encendido, pero otro programa retiene el puerto. |
| "No se pudo escuchar en el puerto 502" | rojo | El servidor está encendido, pero Windows se negó a abrir el puerto por otro motivo. |
| "Runtime detenido" | gris | El servidor está encendido y el runtime está detenido: el puerto sigue cerrado hasta que el runtime vuelva a funcionar. |
El punto es solo del servidor: no entra en el resumen de la carpeta Controladores ni en la barra de estado, que tratan de los equipos que la estación lee. Seleccionar la fila abre el panel del servidor; su cabecera repite el estado junto al mismo punto. Los comandos están en la barra de comandos; la fila no tiene menú propio.
Encenderlo y apagarlo
| Comando | Qué hace | En gris cuando (situación) | No se dibuja cuando (rol) |
|---|---|---|---|
| Habilitar | Enciende el servidor, como dice su información emergente: "Encender el servidor: escucha en el puerto 502 mientras el runtime funciona." El puerto se abre en el acto si el runtime funciona, y el registro de acciones dice "Servidor Modbus encendido." | El servidor ya está encendido ("El servidor ya está encendido."), un ensayo retiene la estación, o el runtime está detenido; la información emergente da el motivo. | Sin Configurar Connector. |
| Deshabilitar | Apaga el servidor: "Apagar el servidor: cierra su puerto y desconecta a todos los clientes." El registro de acciones dice "Servidor Modbus apagado." | El servidor ya está apagado ("El servidor ya está apagado."), un ensayo retiene la estación, o el runtime está detenido. | Sin Configurar Connector. |
Estar encendido es un ajuste que la estación conserva, y la escucha sigue al runtime:
| Momento | Qué hace el servidor |
|---|---|
| La estación arranca | Un servidor que quedó encendido abre su puerto en cuanto el runtime está en marcha y los ensayos que reanuda han vuelto; un servidor que quedó apagado sigue apagado. |
| El puerto no se puede abrir | La fila dice "El puerto 502 está en uso" o "No se pudo escuchar en el puerto 502", y la tarjeta Puerto y clientes lo dice bajo el campo del puerto: "El puerto 502 está ocupado en esta máquina. Cierre lo que lo retiene, o elija otro puerto.", o el mismo fallo seguido del motivo que dio Windows. La estación sigue funcionando sin él. El servidor no lo vuelve a intentar por su cuenta: cuando el puerto quede libre, apáguelo y vuelva a encenderlo, o muévalo a otro puerto. |
| Se detiene el runtime | El puerto se cierra y todos los clientes se desconectan; una escritura que aún esperaba su respuesta deja de esperar. La fila dice "Runtime detenido", y reiniciar el runtime vuelve a abrir el puerto. |
| La aplicación se cierra | El puerto se cierra con todo lo demás. |
La tarjeta Puerto y clientes
La primera tarjeta del panel es Puerto y clientes.
| Campo | Qué hace | Valores y valor por defecto |
|---|---|---|
| Puerto TCP | El puerto en el que escucha el servidor, en todas las direcciones de este ordenador, IPv4 e IPv6. Cambiarlo mientras el servidor escucha cierra el puerto anterior y abre el nuevo, lo que desconecta a todos los clientes; el registro de acciones dice "Servidor Modbus movido al puerto 5020." | De 1 a 65535. Por defecto 502, el estándar de Modbus. |
| Clientes conectados | Cuántos clientes hay conectados ahora: "Ningún cliente conectado", "1 cliente conectado", "3 clientes conectados". Mientras haya alguien conectado, una tabla lista cada uno con Dirección del cliente (su dirección IP y su puerto, como 192.168.0.20:51234) y Conectado desde (la fecha y la hora, en el formato de la estación). |
Solo lectura. |
Un puerto al que el servidor no puede pasar se rechaza antes de guardar nada: el motivo aparece bajo el campo, el campo vuelve al puerto vigente y el servidor se queda donde estaba. Se rechazan seis entradas: un número fuera del rango ("El puerto debe estar entre 1 y 65535."); el puerto del servidor web, fijado en Acceso remoto ("El puerto N ya es el del servidor web. Elija otro puerto, o mueva antes el servidor web."); el puerto del acceso de agente fijado en la página Agente, esté el acceso de agente encendido o apagado ("El puerto N ya es el del acceso de agente. Elija otro puerto, o mueva antes el acceso de agente."); el puerto del servidor OPC UA en Configuración, en marcha o detenido ("El puerto N ya es el del servidor OPC UA. Elija otro puerto, o mueva antes el servidor."); el puerto del bróker MQTT en la página Connector, encendido o apagado ("El puerto N ya es el del bróker MQTT. Elija otro puerto, o mueva antes el bróker MQTT."); y un puerto que otra cosa de esta máquina retiene en este momento ("El puerto N está ocupado en esta máquina. Cierre lo que lo retiene, o elija otro puerto."). Los otros cuatro campos de puerto rechazan a su vez el puerto de este servidor. El motivo sigue bajo el campo hasta el siguiente puerto que el campo acepte, o hasta que se vuelva a seleccionar la fila.
Bajo la tarjeta, una nota dice: "Responde a cualquier ID de unidad. Otras máquinas solo llegan a este servidor si el Firewall de Windows deja entrar el puerto TCP 502: permitirlo es decisión suya, y esta estación nunca lo hace por sí sola."
El servidor admite como mucho 16 clientes a la vez: una decimoséptima conexión se cierra en cuanto se abre, y el diario técnico lo anota. Un cliente que desaparece sin cerrar su conexión (un PLC apagado, un cable desconectado) se detecta con el keep-alive de TCP, y su plaza queda libre en un minuto y medio, más o menos.
Firewall de Windows
Bajo la nota, un punto y una frase dicen si la regla entrante propia de la estación deja entrar este puerto, como lo dice la tarjeta Acceso de clientes para el puerto OPC UA, con una acción cuando no lo deja.
| Estado | Texto |
|---|---|
| Permitido (verde) | "Las conexiones Modbus entrantes están permitidas en el puerto N para las redes privadas y de dominio." |
| Sin configurar (ámbar) | "Puede que los clientes de red queden bloqueados porque ninguna regla propia de la aplicación permite el puerto N." Se dibuja el botón Permitir la red local. |
| No admitido (gris) | "Este arranque no puede gestionar el Firewall de Windows. Configure el acceso entrante en el sistema operativo si hace falta." Un arranque de desarrollo, portátil o de demostración, o cualquier ejecución que no sea la aplicación instalada. |
| Desconocido (gris) | "No se pudo determinar el estado del Firewall de Windows." |
| Comando | Qué hace | En gris cuando (situación) | No se dibuja cuando (rol) |
|---|---|---|---|
| Permitir la red local | Arranca elevado el ayudante propio de la aplicación, de modo que Windows pide la aprobación del administrador, y añade la regla para este puerto, acotada a los perfiles Privado y de Dominio, a la subred local y a este programa. Mientras tanto dice "Aplicando…"; el registro de acciones dice "Solicitando acceso al Firewall de Windows para el puerto Modbus N…", y después "El Firewall de Windows ya permite conexiones Modbus en el puerto N." o el texto del estado como error. Un aviso de aprobación cancelado deja el estado en Sin configurar. | En un navegador de otro dispositivo ("La regla del firewall solo se puede aplicar desde la aplicación de escritorio de la estación."), mientras un ensayo retiene la estación o el runtime está detenido, y mientras se aplica la regla ("Se está aplicando la regla del firewall."). | Sin Configurar Connector. |
El estado se lee al abrirse la tarjeta y de nuevo cuando el puerto cambia, así que un puerto nuevo muestra Sin configurar hasta que usted lo permita. La estación nunca añade la regla por su cuenta.
El mapa de registros
La segunda tarjeta, Mapa de registros, es lo que sirve el servidor: cada fila pone un tag, una variable de Logic o un estado de alarma en un registro, o en una bobina, que un cliente direcciona. Un registro que ninguna fila cubre no existe para un cliente. La tarjeta dice: "Cada fila sirve un tag, una variable de Logic o un estado de alarma en un registro. Una fila sigue siendo de solo lectura hasta que usted permita la escritura, y una fila que sirve una alarma lo es siempre. La escritura de un cliente sigue entonces el mismo camino que cualquier otra y queda en el diario técnico con la dirección del cliente."
La tabla
| Columna | Qué muestra |
|---|---|
| Clase de registro | Registro de retención (4xxxx), Registro de entrada (3xxxx), Bobina (0xxxx) o Entrada discreta (1xxxx), cada una con el primer dígito que la dirección del manual lleva para ella. |
| Registros | El registro en el que empieza la fila, contado desde 0, y el último que ocupa: 0 para una fila de un registro, 0-1 para un Float. |
| En el manual | El mismo lugar en la notación que escribe el manual o la herramienta del PLC del cliente: el primer dígito de la clase y después el registro contado desde 1. 40001 para el registro de retención 0, de 40001 a 40002 para un Float ahí, seis dígitos por encima de 9999 (410000 para el registro de retención 9999). |
| Tipo de dato | Boolean, Int16, UInt16, Int32, Float o String. |
| Acceso | Solo lectura, o Lectura y escritura. |
| Fuente | La fuente, tal como la nombra el selector. |
| Valor actual | Lo que un cliente lee ahí en este momento, o un guion cuando un cliente que lee la fila recibe la excepción 04. |
Las filas se listan por clase (registros de retención, registros de entrada, bobinas, entradas discretas) y después por registro. Sin ninguna: "Todavía no se sirve ningún registro. Añada uno con Nueva fila." Hacer clic en una fila la selecciona y abre sus campos bajo la tabla; qué fila está seleccionada pertenece a la ventana en la que usted está.
Lo que hace crecer la tabla y lo que termina una fila están a la derecha del título de la tarjeta:
| Comando | Qué hace | En gris cuando (situación) | No se dibuja cuando (rol) |
|---|---|---|---|
| Nueva fila | Añade una fila en el primer registro de retención que ninguna fila ocupa: Float, las dos casillas de orden marcadas, solo lectura, todavía sin fuente. La fila queda seleccionada y el registro de acciones dice "Fila añadida en Registro de retención (4xxxx) de 40001 a 40002." Cuando no queda ningún registro de retención: "No queda ningún registro de retención libre para una nueva fila." | Un ensayo retiene la estación, o el runtime está detenido. | Sin Configurar Connector. |
| Eliminar fila (tinta de peligro) | Elimina la fila que la tabla tiene seleccionada, en el acto y sin preguntar; su información emergente la nombra ("Eliminar la fila en Registro de retención (4xxxx) de 40001 a 40002") y el registro de acciones dice "Fila en Registro de retención (4xxxx) de 40001 a 40002 eliminada." El tag o la variable que servía no se toca. Un cliente que lee esos registros recibe la excepción 02 desde ese momento. | Ninguna fila seleccionada ("Seleccione una fila del mapa de registros para eliminarla."), un ensayo retiene la estación, o el runtime está detenido. | Sin Configurar Connector. |
Los campos de una fila
Una fila tiene exactamente los campos y las reglas de un tag Modbus: un punto aceptado en un extremo del cable se acepta en el otro. Cada campo se guarda en el momento en que cambia (un número cuando sale del campo o pulsa Intro, una elección cuando elige, una casilla cuando la marca), y un cliente recibe la fila nueva desde su siguiente petición, sin que se le desconecte.
| Campo | Qué hace | Valores y valor por defecto |
|---|---|---|
| Clase de registro | En qué tabla de Modbus responde la fila. Elegir una bobina o una entrada discreta convierte el tipo en Boolean; elegir un registro de entrada o una entrada discreta deja la fila en solo lectura. | Registro de retención (4xxxx), Registro de entrada (3xxxx), Bobina (0xxxx), Entrada discreta (1xxxx). Registro de retención en una fila nueva. |
| Número de registro (desde 0) | Dónde empieza la fila, el número tal como viaja en la petición: el registro de retención 0 es el que la notación clásica llama 40001. Al lado, Dirección en el manual lee la fila en esa notación, como la columna En el manual. | De 0 a 65535. El primer registro de retención libre en una fila nueva. |
| Tipo de dato | Cómo se dispone el valor, igual que lo dispone un tag Modbus (Tipos de valor y cantidades): Boolean en un registro (1 o 0) o como un bit, Int16 y UInt16 en un registro, Int32 y Float en dos, String como UTF-8 con dos bytes por registro. Una bobina y una entrada discreta llevan solo un Boolean. Elegir Boolean en una fila de registro la mueve a una entrada discreta (solo lectura) o a una bobina (lectura y escritura); elegir un número en una bobina o en una entrada discreta la mueve a un registro de entrada o a un registro de retención, como hace el panel de un tag Modbus. | Boolean, Int16, UInt16, Int32, Float, String. Float en una fila nueva. |
| Longitud (registros) | Solo se dibuja para un String: cuántos registros ocupa el texto. | Vacío significa 4. De 1 a 65535. |
| Byte más significativo primero (MSB first, big-endian) | Qué byte de cada registro viaja primero; las palabras entre paréntesis son las que imprimen los manuales. No se dibuja para un String, ni para una bobina o una entrada discreta. | Marcada. |
| Palabra más significativa primero (palabra alta primero) | Qué registro del par lleva la mitad alta. Solo se dibuja para Int32 y Float. Con las dos casillas marcadas, un Float viaja como AB CD, el orden de la especificación (Orden de byte y de palabra); Orden de los bytes del valor, bajo las casillas, nombra la disposición que forman (ABCD, CDAB, BADC o DCBA). |
Marcada. |
| Acceso | Si un cliente puede escribir la fila. En un registro de entrada o en una entrada discreta, Lectura y escritura sigue en la lista y en gris, con la información emergente "Solo un registro de retención o una bobina acepta escrituras." En una fila que sirve una alarma también queda en gris: "Una fila que sirve una alarma es de solo lectura." | Solo lectura o Lectura y escritura. Solo lectura en una fila nueva. |
| Fuente | Lo que sirve la fila. La lista empieza por "(ninguno)", luego cada tag habilitado de un dispositivo habilitado, nombrado por su controlador, su dispositivo y él mismo ("Tag del Connector · Simulated · Oven · Temperature"), y luego cada variable de Logic que guarda un valor (Booleano, Entero, Número decimal, Texto o Fecha y hora) por su nombre ("Variable de Logic · Setpoint") o, si está archivada en una carpeta, por sus carpetas y su nombre ("Variable de Logic · Oven / Setpoint"), así que dos variables del mismo nombre se distinguen. Después, todas las alarmas, nombradas del mismo modo ("Alarma de Logic · Oven / High temperature"); una fila que sirve una alarma es siempre de solo lectura, y sirve el estado que indica Estado de la alarma servido. La fila guarda su fuente por su identidad, así que renombrar el tag o la variable, o archivar su dispositivo en una carpeta, deja la fila en el mismo punto. Una fuente que la lista ya no ofrece sigue seleccionada y con su nombre: un tag deshabilitado como "Tag del Connector · Simulated · Oven · Temperature (deshabilitado)", un tag de un dispositivo deshabilitado como "Tag del Connector · Simulated · Oven · Temperature (dispositivo deshabilitado)", y solo una fuente que ya no existe con el nombre Tag ausente o Variable ausente y su identidad. La tarjeta Usado por de un tag lista las filas que lo sirven, y su Sustituir todo las mueve al tag elegido. | "(ninguno)" en una fila nueva. |
| Estado de la alarma servido | Aparece en una fila que sirve una alarma: cuál de sus estados lee un cliente. Activa (Boolean) vale 1 mientras se cumple la condición, Reconocida (Boolean) vale 1 mientras nada espera reconocimiento, y Estado (número) es el estado como número. | Activa (Boolean) en una nueva fila de alarma. |
Bajo los campos, tres líneas devuelven la lectura de la fila: dónde está ("Ocupa el registro 0." u "Ocupa los registros 0 a 1."), lo que un cliente puede hacer con ella ("Un cliente puede leer esta fila pero no escribirla." o "Un cliente puede leer y escribir esta fila: cada escritura queda en el diario técnico con su dirección.", o "Un cliente lee este estado de la alarma y nunca lo escribe. Como número, 0 es en reposo, 1 activa y sin reconocer, 2 activa y reconocida, 3 restablecida y sin reconocer." en una fila que sirve una alarma) y lo que un cliente lee ahí ahora ("Valor actual: 21.5"). Cuando un cliente que lee la fila no recibiría ningún valor, sigue el motivo:
| El panel dice | Cuándo |
|---|---|
| "Esta fila todavía no sirve nada: elija su fuente." | No se ha elegido ninguna fuente. |
| "La fuente de esta fila ya no existe. Un cliente que la lee recibe la excepción 04." | El tag o la variable se eliminó. |
| "La fuente no tiene ahora un valor bueno. Un cliente que lee esta fila recibe la excepción 04 hasta que lo tenga." | El tag no tiene un valor bueno (su dispositivo no responde y el tag no presenta valor sustituto, el tag o su dispositivo está deshabilitado, un fallo de límite dejó mala su calidad), o la variable es un hueco. |
| "El valor de la fuente no cabe en el tipo de esta fila. Un cliente que la lee recibe la excepción 04." | Un valor que ninguna fila de este tipo puede contener: un NaN en una fila entera, o un texto más largo que los registros de la fila. |
Lo que rechaza una fila
Un cambio que las reglas del servidor rechazan no se guarda: el motivo aparece en rojo sobre los campos de la fila, el cambio sigue en la pantalla para que lo corrija, y la fila sigue sirviendo lo que servía hasta que se acepte un cambio. Las demás filas no se ven afectadas.
| El panel dice | Cuándo |
|---|---|
| "El número de registro debe estar entre 0 y 65535." | Un registro fuera del rango del protocolo. |
| "Un punto Modbus lleva Boolean, Int16, UInt16, Int32, Float, String." | Un tipo fuera de esos seis, que solo un agente puede pedir. |
| "Una bobina o una entrada discreta lleva un Boolean." | Un número en una bobina o en una entrada discreta, que solo un agente puede pedir. |
| "Un texto ocupa de 1 a 65535 registros." | Una longitud de String fuera del rango. |
| "Los registros 65535 a 65536 pasan del registro 65535." | Una fila que terminaría después del último registro: aquí un Float en 65535. |
| "Los registros 40001 a 40002 se solapan con la fila en Registro de retención (4xxxx) 40002." | Dos filas de la misma clase que comparten un registro. |
| "Un registro de entrada o una entrada discreta es de solo lectura para un cliente: solo un registro de retención o una bobina acepta escrituras." | Escritura permitida en una clase de entrada, que solo un agente puede pedir. |
| "Una fila que acepta escrituras necesita el tag o la variable a la que van." | Lectura y escritura elegida antes que una fuente, o la fuente devuelta a "(ninguno)" en una fila que permite escribir. Elija primero la fuente. |
| "La fuente no se puede escribir: elija un tag con acceso de escritura o una variable de memoria, o deje la fila de solo lectura." | Escritura permitida en una fila cuya fuente es un tag de solo lectura, un tag de un controlador que nunca escribe, una variable de expresión o una fuente que ya no existe. |
| "La fuente contiene un texto o una fecha, que solo lleva una fila String." | Un tag de texto o de fecha, o una variable Texto o Fecha y hora, en una fila de cualquier otro tipo. |
| "Una fila que sirve una alarma es de solo lectura: un cliente lee el estado de la alarma y nunca lo escribe." | Lectura y escritura pedida en una fila que sirve una alarma, algo que solo un agente puede pedir. |
| "Esta fila del mapa de registros ya no existe. Recargue y vuelva a intentarlo." | La fila se eliminó en otro sitio, en otra ventana o por un agente, mientras usted la editaba. |
Mientras un ensayo retiene la estación o el runtime está detenido, un cambio se rechaza como cualquier cambio de la página, con el motivo en el registro de acciones ("La configuración está bloqueada mientras una unidad está en marcha.", "Runtime detenido"), y no se guarda nada.
Lo que un cliente lee y escribe
El servidor responde a cualquier ID de unidad, y responde con el ID de unidad con el que se le preguntó: en TCP una estación se direcciona por su dirección IP. Los números de registro viajan contados desde 0. Una herramienta de PLC que cuenta desde 1, o que escribe la notación clásica, suma ella misma el desplazamiento:
| Clase de registro | Leer con la función | Escribir con la función | Registro 0 en la notación clásica |
|---|---|---|---|
| Registro de retención (4xxxx) | 3 | 6 (un registro) o 16 (varios) | 40001 |
| Registro de entrada (3xxxx) | 4 | ninguna: solo lectura | 30001 |
| Bobina (0xxxx) | 1 | 5 (una bobina) o 15 (varias) | 00001 |
| Entrada discreta (1xxxx) | 2 | ninguna: solo lectura | 10001 |
Cualquier otro código de función recibe la excepción 01. Una petición lee como mucho 125 registros o 2000 bobinas o entradas, y escribe como mucho 123 registros o 1968 bobinas.
Una lectura se responde entera o no se responde. Cada valor se lee del estado actual de la estación, nunca se evalúa para el cliente: un tag sirve su valor de ingeniería, el que la estación muestra después de la cadena de conversión, una variable sirve su valor, y una alarma el estado que indica su fila. El valor se convierte al tipo de la fila con la conversión única de la estación: un real se redondea al entero más cercano en una fila entera (las mitades lejos de cero) y se sujeta en los límites del tipo, así que una fila Int16 sirve 32767 por 40000. Una lectura puede pedir parte de una fila de dos registros: recibe los registros que pidió, tal como los guarda el valor codificado. Una fila cuya fuente no tiene un valor bueno nunca recibe un último valor guardado por el servidor: un registro no lleva calidad, y un PLC que leyera un número viejo actuaría sobre un valor que la estación sabe que no es actual. El cliente recibe en su lugar la excepción 04, y su propio tratamiento de fallos de comunicación decide; el precio es que una fila sin valor hace fallar una lectura en bloque que la abarque, y la columna Valor actual del mapa señala cuál. Un tag que presenta un valor sustituto propio (el último valor bueno mantenido, o un número declarado, fijado en su etapa Lectura no válida) conserva un valor bueno, y el sustituto se sirve como cualquier valor.
La escritura de un cliente cruza el mismo punto único de escritura que cualquier otra (véase Logic): un tag por la cola de entrega de su dispositivo, con su valor de ingeniería revertido por la conversión del tag, y una variable de memoria por la cola de Logic. Los bloqueos de fuente se aplican: una fuente que retiene una receta o un enclavamiento de Process en marcha se rechaza. El punto único de escritura anota en el diario técnico cada valor como antiguo a nuevo bajo la fuente Modbus client 192.168.0.20:51234, y la respuesta espera el acuse de cada valor, que para un tag es la respuesta del propio equipo.
- Una escritura cubre filas enteras: escribir un solo registro de una fila Float se rechaza, así que un Float se escribe con la función 16 y una cantidad de 2.
- Cada fila que alcanza la escritura se comprueba contra el mapa antes de que salga ningún valor: un registro que no está en ninguna fila, o una fila de solo lectura, rechaza la petición entera, y no se escribe nada.
- Los valores van entonces a sus fuentes en el orden de los registros. Un rechazo que el punto único de escritura da a uno de ellos es lo que recibe el cliente como respuesta, aunque las demás filas de la misma petición también se entregaron.
| Excepción | Cuándo |
|---|---|
| 01 (función no válida) | Un código de función distinto de 1, 2, 3, 4, 5, 6, 15 y 16. |
| 02 (dirección de datos no válida) | Un registro que no está en ninguna fila; una escritura en una fila de solo lectura o en parte de una fila; un rango que pasa de 65535; una fuente que el punto único de escritura dice que no se puede escribir. |
| 03 (valor de datos no válido) | Una cantidad fuera de rango o una petición mal formada; una bobina escrita con algo distinto de encendido o apagado; un valor que la fuente no puede aceptar. |
| 04 (fallo del dispositivo servidor) | Una fuente sin valor bueno, una fuente que ya no existe, o un valor que la fila no puede llevar; una escritura que el equipo rechazó o no respondió, o un dispositivo que no está conectado. |
| 06 (dispositivo servidor ocupado) | Una fuente que retiene un Process en marcha, o el runtime que se está deteniendo. |
Un ejemplo completo
Un PLC lee de la estación la temperatura de un horno y el interruptor de su puerta, y escribe la consigna del horno, una variable de memoria Variables.Oven.Setpoint. En el panel:
- Seleccione la fila Servidor Modbus y pulse Nueva fila. Ponga Clase de registro en Registro de entrada (3xxxx) (el registro sigue en 0) y Fuente en "Tag del Connector · Simulated · Oven · Temperature". La fila dice "Ocupa los registros 0 a 1.", Dirección en el manual muestra de 30001 a 30002, y la columna Valor actual muestra la temperatura.
- Pulse de nuevo Nueva fila, ponga Clase de registro en Entrada discreta (1xxxx) (el tipo pasa a Boolean y el registro sigue en 0) y elija el interruptor de la puerta, "Tag del Connector · Simulated · Oven · DoorOpen".
- Pulse Nueva fila una tercera vez. Cae en el registro de retención 0, Float. Elija primero "Variable de Logic · Oven / Setpoint" y luego ponga Acceso en Lectura y escritura: la fila dice "Un cliente puede leer y escribir esta fila: cada escritura queda en el diario técnico con su dirección."
- Pulse Habilitar en la barra de comandos: la fila dice "Escuchando en el puerto 502". Para un PLC de otra máquina, pulse después Permitir la red local en la tarjeta Puerto y clientes.
Lo que pide el PLC, con las dos casillas de orden marcadas (un Float viaja en big-endian, palabra más significativa primero, ABCD):
| Valor | Función | Dirección | Cantidad | Notación clásica |
|---|---|---|---|---|
| Temperatura (lectura) | 4 | 0 | 2 | 30001-30002 |
| Interruptor de la puerta (lectura) | 2 | 0 | 1 | 10001 |
| Consigna (escritura) | 16 | 0 | 2 | 40001-40002 |
| Consigna (relectura) | 3 | 0 | 2 | 40001-40002 |
Lo mismo con un agente, con las cuatro herramientas de las áreas del Connector:
modbus_map_upsert(source: "Connector.Simulated.Oven.Temperature", registerClass: "InputRegister", register: 0, type: "Float")
modbus_map_upsert(source: "Connector.Simulated.Oven.DoorOpen", registerClass: "DiscreteInput", register: 0)
modbus_map_upsert(source: "Variables.Oven.Setpoint", registerClass: "HoldingRegister", register: 0, type: "Float", access: "ReadAndWrite")
modbus_server_configure(enabled: true)
Una fila que crea un agente es de solo lectura salvo que access diga otra cosa, y una bobina o una entrada discreta es Boolean cuando no se da ningún tipo. modbus_server_status devuelve el servidor entero: su estado, sus clientes y cada fila con lo que un cliente lee ahí ahora. Las herramientas se describen en Las herramientas, área por área.
Permisos y bloqueos
| Permiso | Qué abre aquí |
|---|---|
| Ver Connector | La fila, el panel y el mapa de registros, en solo lectura. Las tarjetas quedan inertes bajo la nota "Cambiar Connector requiere el permiso “Configurar Connector”.", y no se dibuja ningún verbo: ni Habilitar, ni Deshabilitar, ni Nueva fila, ni Eliminar fila. |
| Configurar Connector | Todo lo de la página: encender y apagar el servidor, su puerto y cada fila del mapa. |
Mientras un ensayo retiene la estación o el runtime está detenido, los verbos siguen dibujados y en gris con el motivo, y todo cambio se rechaza, como en toda la página Connector. La lectura del panel, y la de los clientes que leen el servidor, siguen. Un agente cambia el servidor solo por el área de configuración del Connector del acceso de agente, y cada cambio que hace queda anotado como del agente.
El diario técnico
El servidor escribe en la Consola de Eventos bajo el área Server, componente Modbus server: cuándo empieza y deja de escuchar, un puerto que no pudo abrir, una conexión que cerró porque ya atendía a 16 clientes, y cada petición que rechazó, con su código de excepción. Un rechazo que se repite, como el de un PLC que en cada ciclo consulta un registro que no está en el mapa, se escribe la primera vez, se resume cada pocos minutos mientras dura y se cierra con una línea cuando el cliente vuelve a ser atendido. Las conexiones y desconexiones son detalle, guardado para la captura detallada. Cada cambio de los ajustes del servidor o de su mapa también se anota, venga de la página o de un agente. Lo que hizo la escritura de un cliente es la línea del propio punto único de escritura, bajo la fuente Modbus client <address>:<port>.
Lo que el servidor no hace
- Solo sirve Modbus TCP, con la cabecera MBAP. No hay servidor Modbus RTU ni ASCII en una línea serie, ni tramas RTU sobre TCP.
- Nunca abre el Firewall de Windows por su cuenta (solo lo hace Permitir la red local, cuando usted lo pulsa), y no puede escuchar en una sola tarjeta de red: escucha en todas las direcciones del ordenador, en un puerto.
- Responde a cualquier ID de unidad con el mismo mapa único: no puede alojar varias unidades con mapas distintos.
- No tiene usuario, ni contraseña, ni cifrado, porque Modbus no los tiene: quien llega al puerto lee todas las filas y escribe en todas las que permiten escribir. Deje las filas en solo lectura salvo que un cliente tenga que escribirlas, y mantenga el puerto cerrado a las redes que no tienen nada que ver con él.
- Nunca se conecta a nada. Para leer un equipo Modbus, añádalo bajo el controlador Modbus TCP o Modbus RTU.
- No guarda registros propios: un registro que ninguna fila cubre no existe, y todo lo que escribe un cliente acaba en un tag o en una variable.
- Nunca guarda un valor propio para servirlo en lugar de uno que falta, y no ejecuta ninguno de los demás códigos de función (Read/Write Multiple Registers, Mask Write Register, identificación del dispositivo): reciben la excepción 01.
- El mapa no tiene importación ni exportación propias: viaja con la configuración de la estación en las copias de seguridad.