|
Nota Uso con CM1241 El uso de esta instrucción con un CM 1241 solo es posible con una versión de firmware V2.1 o superior del módulo. |
Descripción
La instrucción Modbus_Slave permite al programa comunicarse como esclavo Modbus a través de un CM (RS422/485 o RS232). STEP 7 crea automáticamente un DB de instancia cuando se inserta la instrucción. El parámetro MB_DB de la instrucción Modbus_Comm_Load debe interconectarse con el parámetro MB_DB (estático) de la instrucción Modbus_Slave .
|
Nota Para un DB de instancia de la instrucción Modbus_Slave no está permitido activar la remanencia (Retain). |
Parámetros
|
Parámetro |
Declaración |
Tipo de datos |
Estándar |
Descripción |
|
|---|---|---|---|---|---|
|
S7- |
S7- |
||||
|
MB_ADDR |
IN |
UInt |
Word |
‑ |
Dirección de estación del esclavo Modbus: Nota: 0 es la dirección Broadcast |
|
COM_RST |
IN/OUT |
--- |
Bool |
FALSE |
Inicialización de la instrucción Modbus_Slave La instrucción se inicializa con TRUE. Seguidamente, la instrucción ajusta COM_RST de nuevo a FALSE. Nota: |
|
MB_HOLD_REG |
IN/OUT |
Variant |
Any |
‑ |
Puntero hacia el DB de registro de paradas Modbus: el registro de paradas Modbus puede ser el área de memoria de las marcas o bien un bloque de datos. A partir de la versión de la instrucción V4.0: El parámetro debe apuntar a un área de memoria con una longitud mínima de 16 bits. Las longitudes menores dan lugar al mensaje de error 16#8187. Esto afecta a los elementos single, arrays, STRUCT y UDT. P. ej., un Single Bool o un array con una longitud inferior a 16 elementos booleanos da lugar al mensaje de error. Si la longitud no es un múltiplo de 16 bits, la instrucción Modbus_Slave no puede leer ni escribir los bits restantes al final del área de memoria. El parámetro puede apuntar también a un área de memoria optimizada. En el área de memoria optimizada puede haber un elemento single o un array con los siguientes tipos de datos: Bool, Byte, Char, Word, Int, DWord, DInt, Real, USInt, UInt, UDInt, SInt, WChar. Cualquier otro tipo de datos da lugar al mensaje de error 16#818C. |
|
NDR |
OUT |
Bool |
FALSE |
Datos nuevos preparados:
El bit NDR es TRUE durante un ciclo después de que la última petición haya finalizado sin errores. |
|
|
DR |
OUT |
Bool |
FALSE |
Leer datos:
El bit DR es TRUE durante un ciclo después de que la última petición haya finalizado sin errores. |
|
|
ERROR |
OUT |
Bool |
FALSE |
El bit ERROR es TRUE durante un ciclo después de que la última orden haya finalizado con errores. Si la ejecución finaliza con un error, el código de error del parámetro STATUS solo es válido en el ciclo en que ERROR = TRUE. |
|
|
STATUS |
OUT |
Word |
0 |
Código de error (consulte Mensajes de error) |
|
Los códigos de función de la comunicación Modbus (1, 2, 4, 5 y 15) pueden leer y escribir bits y palabras directamente en la memoria imagen de proceso de las entradas y en la memoria imagen de proceso de las salidas de la CPU. En estos códigos de función debe definirse el parámetro MB_HOLD_REG como un tipo de datos mayor que un byte. La tabla siguiente muestra la asignación de ejemplo de las direcciones Modbus a la memoria imagen de proceso de la CPU.
Asignación de las direcciones Modbus a la memoria imagen de proceso
|
Funciones Modbus |
S7-1200 |
||||||||
|---|---|---|---|---|---|---|---|---|---|
|
Código |
Función |
Área de datos |
Área de direcciones |
Área de datos |
Dirección de la CPU |
||||
|
01 |
Leer bits |
Salida |
0 |
a |
8191 |
Memoria imagen de proceso de las salidas |
Q0.0 |
a |
Q1023.7 |
|
02 |
Leer bits |
Entrada |
0 |
a |
8191 |
Memoria imagen de proceso de las entradas |
I0.0 |
a |
I1023.7 |
|
04 |
Leer palabras |
Entrada |
0 |
a |
511 |
Memoria imagen de proceso de las entradas |
IW0 |
a |
IW1022 |
|
05 |
Escribir bit |
Salida |
0 |
a |
8191 |
Memoria imagen de proceso de las salidas |
Q0.0 |
a |
Q1023.7 |
|
15 |
Escribir bits |
Salida |
0 |
a |
8191 |
Memoria imagen de proceso de las salidas |
Q0.0 |
a |
Q1023.7 |
Asignación de las direcciones Modbus a la memoria imagen de proceso
|
Funciones Modbus |
S7-1500/S7-300/S7-400 |
||||||||
|---|---|---|---|---|---|---|---|---|---|
|
Código de función |
Función |
Área de datos |
Área de direcciones |
Área de datos |
Dirección de la CPU |
||||
|
01 |
Leer bits |
Salida |
0 |
a |
9998 |
Memoria imagen de proceso de las salidas |
Q0.0 |
a |
Q1249.6 |
|
02 |
Leer bits |
Entrada |
0 |
a |
9998 |
Memoria imagen de proceso de las entradas |
I0.0 |
a |
I1249.6 |
|
04 |
Leer palabras |
Entrada |
0 |
a |
9998 |
Memoria imagen de proceso de las entradas |
IW0 |
a |
IW19996 |
|
05 |
Escribir bit |
Salida |
0 |
a |
9998 |
Memoria imagen de proceso de las salidas |
Q0.0 |
a |
Q1249.6 |
|
15 |
Escribir bits |
Salida |
0 |
a |
9998 |
Memoria imagen de proceso de las salidas |
Q0.0 |
a |
Q1249.6 |
|
Nota El área de direcciones disponible puede ser también más pequeña, en función de la configuración de memoria de la CPU. |
Los códigos de función de la comunicación Modbus (3, 6, 16) utilizan un registro de paradas Modbus que puede ser un área de direcciones del área de memoria de las marcas o bien un bloque de datos. El tipo del registro de paradas se indica en el parámetro MB_HOLD_REG de la instrucción Modbus_Slave.
|
Nota S7-1200/1500 - Tipo del bloque de datos MB_HOLD_REG Un bloque de datos con registro de paradas Modbus debe permitir el direccionamiento directo (absoluto) y simbólico. |
Funciones de diagnóstico
|
Funciones de diagnóstico Modbus de Modbus_Slave del S7-1200 |
||
|---|---|---|
|
Códigos de función |
Función parcial |
Descripción |
|
08 |
0000H |
Emitir datos de consulta Echotest: la instrucción Modbus_Slave devuelve a un maestro Modbus el eco de una palabra de datos recibida. |
|
08 |
000AH |
Borrar contador de eventos de comunicación: la instrucción Modbus_Slave borra el contador de eventos de comunicación utilizado para la función Modbus 11. |
|
11 |
Consultar contador de eventos de comunicación: la instrucción Modbus_Slave utiliza un contador interno de eventos de comunicación para registrar el número de peticiones correctas de lectura y escritura Modbus que se envían al esclavo Modbus. El contador no se incrementa con la función 8, función 11 y peticiones Broadcast. Tampoco se incrementa en las peticiones que provocan errores de comunicación (p. ej., errores de paridad o CRC). |
|
La instrucción Modbus_Slave soporta peticiones de escritura Broadcast de maestros Modbus, en tanto que las peticiones abarquen el acceso a direcciones válidas. Para códigos de función que no se soporten en la función Broadcast, Modbus_Slave genera el código de error 16#8188.
Variables del esclavo Modbus en la versión de la instrucción V3.0
Esta tabla muestra las variables estáticas públicas del bloque de datos de instancia de Modbus_Slave que pueden utilizarse en el programa.
Variables del esclavo Modbus
|
Variable |
Tipo de datos |
Estándar |
Descripción |
|---|---|---|---|
|
HR_Start_Offset |
Word |
0 |
Indica la dirección inicial del registro de paradas Modbus (estándar = 0) |
|
QB_Start |
Word |
0 |
Dirección inicial del área de direcciones escribibles de las salidas (byte 0 a 65535). Nota: |
|
QB_Count |
Word |
0xFFFF |
Número de bytes de salida escribibles por el maestro Modbus. Nota: |
|
Extended_Addressing |
Bool |
FALSE |
Direccionamiento avanzado, configura el direccionamiento del esclavo como byte individual o doble (FALSE = dirección de byte único, TRUE = dirección de byte doble) |
|
Request_Count |
Word |
0 |
Número de todas las peticiones recibidas por este esclavo |
|
Slave_Message_Count |
Word |
0 |
Número de las peticiones recibidas para este esclavo específico |
|
Bad_CRC_Count |
Word |
0 |
Número de peticiones recibidas que presentan un error CRC |
|
Broadcast_Count |
Word |
0 |
Número de peticiones Broadcast recibidas |
|
Exception_Count |
Word |
0 |
Errores específicos de Modbus, que se acusan en el maestro con una excepción |
|
Success_Count |
Word |
0 |
Número de las peticiones recibidas para este esclavo específico sin errores de protocolo |
|
MB_DB |
MB_BASE |
- |
El parámetro MB_DB de la instrucción Modbus_Comm_Load debe conectarse con el parámetro MB_DB de la instrucción Modbus_Master. |
El programa puede escribir valores en las variables HR_Start_Offset y Extended_Addressing y controlar las operaciones del esclavo Modbus. Las demás variables pueden leerse para vigilar el estado de Modbus.
Reglas para la comunicación del esclavo Modbus
-
Modbus_Comm_Load debe ejecutarse para configurar un puerto con el fin de que la instrucción Modbus_Slave pueda comunicarse a través de dicho puerto.
-
Si un puerto debe reaccionar como esclavo a un maestro Modbus, dicho puerto no debe programarse con la instrucción Modbus_Master .
-
Solo es posible utilizar una instancia de Modbus_Slave con un puerto concreto, de lo contrario pueden producirse comportamientos imprevistos.
-
Las instrucciones Modbus no utilizan eventos de alarma de la comunicación para controlar el proceso de comunicación. El programa debe controlar el proceso de comunicación consultando la instrucción Modbus_Slave respecto de procesos de transmisión y recepción terminados.
-
La instrucción Modbus_Slave debe ejecutarse regularmente y con una frecuencia que permita una respuesta temprana a peticiones entrantes de un maestro Modbus. Se recomienda ejecutar Modbus_Slave en cada ciclo desde un OB de ciclo de programa. Modbus_Slave puede ejecutarse desde un OB de alarma cíclica, aunque no es recomendable, porque unos retardos de tiempo excesivos en el programa de interrupción pueden bloquear temporalmente la ejecución de otros programas de interrupción.
Control de tiempo de la señal Modbus
Modbus_Slave debe ejecutarse regularmente para recibir todas las peticiones del maestro Modbus y responder de un modo adecuado. La frecuencia de ejecución de Modbus_Slave se rige por el valor de timeout para la respuesta especificado por el maestro Modbus. Esto se representa en la figura siguiente.
El período de timeout de la respuesta (RESP_TO) es el tiempo que espera un maestro Modbus al principio de una respuesta de un esclavo Modbus. Dicho período no se define en el protocolo Modbus, sino en un parámetro de la instrucción Modbus_Comm_Load. Puesto que tanto la recepción como la transmisión de una trama requieren varias llamadas (tres como mínimo) de la instrucción Modbus_Slave, debería ejecutarse Modbus_Slave un mínimo de doce veces durante el período de timeout para la respuesta del maestro Modbus para que la recepción y transmisión de datos por parte del esclavo Modbus se ejecute el doble de veces de las especificadas por el período de timeout.
HR_Start_Offset
Las direcciones del registro de paradas Modbus empiezan en 40001 o 400001. Estas direcciones equivalen a la dirección de inicio del registro de paradas en la memoria del sistema de destino. De todas formas, es posible configurar la variable HR_Start_Offset para configurar una dirección inicial distinta de 40001 o 400001 para el registro de paradas Modbus.
La dirección 0 en el telegrama de recepción corresponde a la dirección inicial del registro de paradas en la memoria del sistema de destino. A través de la variable HR_Start_Offset se puede configurar otra dirección inicial como 0 para el registro de paradas de Modbus.
Así, por ejemplo, existe la posibilidad de configurar un registro de paradas que empiece en MW100 y una longitud de 100 palabras. Si HR_Start_Offset = 20, la dirección 20 del telegrama de recepción corresponde a la dirección de inicio del registro de paradas en la memoria de destino (MW100). Toda dirección del telegrama de recepción por debajo de 20 y por encima de 119 provoca un error de direccionamiento.
Ejemplo de direccionamiento del registro de paradas de Modbus si DATA_PTR señala a MW100 con una longitud de 100 palabras
|
HR_Start_Offset |
Dirección |
Mínimo |
Máximo |
|---|---|---|---|
|
0 |
Dirección Modbus (palabra) |
0 |
99 |
|
Dirección S7-1500 |
MW100 |
MW298 |
|
|
20 |
Dirección Modbus (palabra) |
20 |
119 |
|
Dirección S7-1500 |
MW100 |
MW298 |
HR_Start_Offset es un valor de palabra que indica la dirección inicial del registro de paradas Modbus y está guardado en el bloque de datos de instancia Modbus_Slave . Esta variable estática pública se selecciona mediante la lista desplegable de parámetros después de haber insertado Modbus_Slave en el programa.
Si, por ejemplo, se ha insertado Modbus_Slave en un segmento KOP, es posible pasar a un segmento anterior y asignar el valor HR_Start_Offset con el comando Move. El valor debe asignarse antes de ejecutar Modbus_Slave.
Introducir una variable de esclavo Modbus mediante el nombre de DB estándar:
-
Coloque el cursor en el campo de parámetros OUT1 e introduzca el carácter m.
-
Seleccione en la lista desplegable el DB de instancia que desee para la instrucción Modbus_Slave.
-
Coloque el cursor a la derecha del nombre de DB (después de las comillas) e introduzca un punto.
-
Seleccione en la lista desplegable "Modbus_Slave_DB.HR_Start_Offset".
Versiones de la instrucción
Aunque la versión 4.0 tiene exactamente tiene la misma funcionalidad que la versión 3.0, se ha incrementado el número por motivos internos.