Programación UC6
El protocolo se envía al solicitante. Los protocolos Modbus incluyen ASCII, RTU, TCP, etc. y no especifica la capa física. El protocolo define estructuras de mensajes que los controladores pueden reconocer y utilizar independientemente de la red a través de la cual se comunican. El controlador Modicon estándar utiliza RS232C para Modbus serie. Los protocolos ASCII y RTU de Modbus especifican la estructura de mensajes y datos, comandos y métodos de respuesta. La comunicación de datos adopta el modo maestro/esclavo y el host envía mensajes de solicitud de datos. Después de recibir el mensaje correcto, el esclavo puede enviar datos al maestro en respuesta a la solicitud. El maestro también puede enviar mensajes directamente para modificar los datos del esclavo para lograr lectura y escritura bidireccional. El protocolo Modbus requiere verificar los datos. Además de la verificación de paridad en el protocolo serial, el modo ASCII usa verificación LRC, mientras que el modo RTU usa verificación 16 CRC. Sin embargo, no hay comprobaciones adicionales en el modo TCP porque el protocolo TCP es un protocolo confiable orientado a la conexión. Además, Modbus utiliza el modo maestro-esclavo para enviar y recibir datos con regularidad. En el uso real, si la estación esclava se desconecta (como por falla o apagado), el terminal maestro puede diagnosticarlo y, cuando se repara la falla, puede conectarse automáticamente a la red. Por tanto, la fiabilidad del protocolo Modbus es mejor. Déjame darte una breve introducción. Respecto a los protocolos ASCII, RTU y TCP de Modbus, los protocolos TCP y RTU son muy similares. Solo necesitamos eliminar el código de verificación de dos bytes del protocolo RTU, luego agregar cinco 0 y un 6 al comienzo del protocolo RTU y enviarlo a través del protocolo de red TCP/IP. Así que aquí solo presento los protocolos ASCII y RTU de Modbus. La siguiente tabla es una comparación entre el protocolo ASCII y el protocolo RTU: Protocolo marca de inicio marca de fin verificación de eficiencia de transmisión procesamiento del programa
ASCII: (dos puntos) CR, LF LRC bajo intuitivo, simple, fácil de depurar.
RTU sin CRC no es intuitivo y es un poco complicado.
Se puede ver en la comparación que el protocolo ASCII tiene marcas de inicio y fin en comparación con el protocolo RTU, por lo que el procesamiento del programa es más conveniente y, dado que se transmiten todos los caracteres ASCII visibles, la depuración es más intuitiva. y su Verificación LRC también es más fácil. Pero debido a que transmite todos los caracteres ASCII visibles, cada byte de datos transmitido por RTU debe transmitirse en dos bytes. Por ejemplo, RTU transmite un número hexadecimal 0xF9 y ASCII necesita transmitir dos bytes de códigos ASCII 'F''9' 0x39 y 0x46, por lo que la eficiencia de transmisión es relativamente baja. En términos generales, si la cantidad de datos a transmitir es pequeña, puede considerar el protocolo ASCII. Si la cantidad de datos a transmitir es grande, es mejor utilizar el protocolo RTU.
La verificación de los dos protocolos se presenta a continuación.
1, verificación LRC
El campo LRC es un byte que contiene un valor binario de 8 bits. El valor LRC lo calcula el dispositivo transmisor y lo coloca en el marco del mensaje. El dispositivo receptor calcula el LRC durante la recepción del mensaje y lo compara con el valor en el campo LRC del mensaje recibido. Si los dos valores no son iguales, existe un error.
La verificación LRC es relativamente simple. Se utiliza en el protocolo ASCII. Detecta el contenido en el campo del mensaje, excepto los dos puntos iniciales y el carácter de retorno de carro final. Simplemente agrega 1 a cada dato a transferir, en bytes. El siguiente es su código VC:
Byte obtener código de verificación (constchar * psendbuf, int nend)//Obtener el código de verificación.
{
byLrc = 0 bytes;
char pBuf[4];
int nData = 0;
for(I = 1; I lt end; I = 2) //i es inicialmente 1, evitando los dos puntos "marca de inicio".
{
//Cada dos códigos ASCII a enviar se convierten a números hexadecimales.
pBuf[0]= pSendBuf[I];
pBuf[1]= pSendBuf[I 1];
pBuf[2]= ' \ 0 ';
sscanf(pBuf, " x ", ampnData);
por LRC = nData
}
porLrc = ~; porLrc
por lrc;
Devolver porLrc
}
2. Comprobación CRC
El campo CRC es Dos bytes que contienen un valor binario de 16 bits. Lo calcula el dispositivo transmisor y lo agrega al mensaje. El dispositivo receptor vuelve a calcular el CRC del mensaje recibido y lo compara con el valor en el campo CRC de recepción. Si los dos valores son diferentes, hay un error.
CRC primero llama a un registro de 16 bits cuyo valor es todo "1" y luego llama a un proceso para procesar el valor en cada registro actual de bytes consecutivos de 8 bits en el mensaje. Sólo 8-8 bits de datos en cada carácter son válidos para CRC, y el bit de inicio, el bit de parada y el bit de paridad no son válidos.
Durante el proceso de generación de CRC, a cada carácter de 8 bits se le aplica una operación OR con el contenido del registro, el resultado se mueve al bit menos significativo y el bit más significativo se rellena con ceros. Extraer y detectar LSB. Si el LSB es 1, el registro se restablecerá individualmente al valor preestablecido. Si el LSB es 0, no se ejecutará. Todo el proceso se repite ocho veces. Una vez completado el último bit (bit 8), el siguiente byte de 8 bits se agrega solo o con el valor actual del registro. El valor en el registro final es el valor CRC después de que se hayan ejecutado todos los bytes del mensaje.
Al agregar un CRC a un mensaje, agregue primero el byte de orden inferior y luego el byte de orden superior. El siguiente es su código VC:
Word obtiene el código de verificación (constchar * psendbuf, int nend)//Obtiene el código de verificación.
{
WORD wCrc = WORD(0x ffff);
for(int I = 0; i ltnEndi)
{
wCrc ^=palabra (byte(psendbuf[I]));
for(int j = 0; j lt8; j )
{
if(wCrc amp; 1)
{
wCrc gt gt= 1;
wcrc ^= 0xa 001;
}
Otro
{
wCrc gt gt= 1;
}
} p>
}
Devolver wCrc
}
Para los comandos del protocolo RTU, simplemente puede convertirlos a comandos del protocolo ASCII siguiendo los pasos:
1. Elimine la verificación CRC del comando y calcule el reemplazo de la verificación LRC.
2. Convierta cada byte de la cadena de comando generada en el código ASCII de dos bytes correspondiente, por ejemplo, 0x03 se convierte en 0x30 y 0x33 (0 códigos ASCII, 3 códigos ASCII).
3. Agregue la marca de inicio ":" al comienzo del comando, su código ASCII es 0x3A.
4. Agregue etiquetas finales Cr, LF (0xD, 0xA) al final del comando, donde CR y LF representan los códigos ASCII de retorno de carro y avance de línea.
Por lo tanto, a continuación solo se presenta el protocolo RTU. El protocolo ASCII correspondiente se puede generar mediante los pasos anteriores.
La siguiente tabla muestra los códigos de función soportados por Modbus:
Nombre del código de función función
01 Lee el estado de la bobina y obtiene el estado actual de un grupo de bobinas lógicas (interruptor).
02 Leer el estado de entrada y obtener el estado actual (encendido/apagado) de un conjunto de entradas de interruptor.
03 Leer el registro de retención para obtener el valor binario actual en uno o más registros de retención.
Leer registros de entrada para obtener el valor binario actual en uno o más registros de entrada.
05 Fuerce una sola bobina para forzar el estado encendido-apagado de la bobina lógica
Preestablezca un solo registro para cargar un valor binario específico en el registro de retención.
Lea el estado anormal para obtener el estado de encendido y apagado de ocho bobinas internas. Las direcciones de estas ocho bobinas las determina el controlador.
08 Verificación de diagnóstico de eco Envía un mensaje de verificación de diagnóstico al esclavo para evaluar el procesamiento de la comunicación.
La programación 09 (sólo utilizada en 484) permite al host simular el rol de un programador y modificar la lógica del PC esclavo.
La consulta 10 (solo 484) permite al maestro comunicarse con un esclavo que está ejecutando una tarea de programa larga y preguntarle al esclavo si ha completado su tarea de operación. Este código de función solo se envía después de enviar un mensaje que contiene el código de función 9.
11 La lectura del recuento de eventos permite al host emitir una consulta y luego determinar si la operación fue exitosa, especialmente cuando un comando u otra respuesta causó un error de comunicación.
12 La lectura de registros de eventos de comunicación permite que el dispositivo maestro recupere los registros de eventos de comunicación de transacciones Modbus de cada dispositivo esclavo. Si se completa la transacción, el registro dará un error.
La programación 13 (184/384 484 584) puede habilitar la función del programador analógico maestro para modificar la lógica esclava del PC.
14 Consulta (184/384 484 584) permite al maestro comunicarse con la máquina esclava que está ejecutando la tarea y consultar periódicamente si la máquina esclava ha completado la operación del programa. Este código de función solo se puede enviar después de enviar un mensaje que contenga la función 13.
15 Force Multi-Coil activa y desactiva una serie de bobinas lógicas continuas
16 Preset Multi-Register carga un valor binario específico en una serie de registros de retención continuos.
17 Informar la identificación del esclavo permite al host determinar el tipo de esclavo al que se dirige y el estado del indicador de funcionamiento del esclavo.
18 (884 y micro-84) pueden permitir que el host simule funciones de programación y modifique la lógica del estado de la PC.
19 Después de que ocurre un error no modificable al restablecer el enlace de comunicación, el esclavo se restablece a un estado conocido y el byte de secuencia se puede restablecer.
20 Lee los parámetros generales (584L) y muestra la información de los datos en el archivo de memoria extendida.
21 Escribir parámetros generales (584L) Escribe o modifica parámetros generales en el archivo de almacenamiento extendido.
22 ~ 64 están reservados para funciones extendidas.
65 ~ 72 están reservados para funciones de usuario y códigos de extensión de funciones de usuario.
73 ~ 119 funciones ilegales
120 ~ 127 están reservadas para funciones internas.
128 ~ 255 están reservados para respuestas anormales.
Entre estos códigos de función, los códigos de función 1, 2, 3, 4, 5 y 6 se utilizan desde hace mucho tiempo y se pueden utilizar para leer y escribir cantidades digitales y analógicas de la computadora.
1. Leer y escribir registros digitales (estado de la bobina):
Comando enviado por la computadora: [dirección del dispositivo][número de comando 01][8 bits altos de la dirección del registro inicial] [8 bits bajos][8 bits altos del número de registros leídos][8 bits bajos][8 bits inferiores de verificación CRC][8 bits altos de verificación CRC].
Ejemplo: [11][01][00][13][00][25][CRC bajo][CRC alto]
El significado es el siguiente: p>
lt1 gt; Dirección del dispositivo: Se pueden conectar varios dispositivos a un bus 485. La dirección del dispositivo aquí indica con qué dispositivo desea comunicarse.
En el ejemplo, quiero comunicarme con 17 (17 decimal es 11 hexadecimal).
lt2 gt número de comando 01: El número de comando para leer cantidades digitales se fija en 01.
Dirección inicial lt3 gt: 8 bits alto y 8 bits bajo: indica la dirección inicial del interruptor a leer (la dirección inicial es 0). Por ejemplo, la dirección inicial en el ejemplo es 19.
Los 8 bits altos y 8 bits bajos del número de registro lt4 gt: indican cuántos interruptores se leyeron desde la dirección inicial. En este ejemplo, hay 37 interruptores.
Comprobación lt5 gtCRC: desde el principio hasta la actualidad. Se describirá al final de este acuerdo. Cabe señalar aquí que el orden del byte alto y el byte bajo de la verificación CRC en el comando es opuesto al otro orden.
Respuesta del dispositivo: [dirección del dispositivo][número de comando 01][número de bytes devueltos][datos 1][datos 2]...[datos n][8 bits inferiores de verificación CRC] [Alto 8 bits de verificación CRC]
Ejemplo: [11][01][05][CD][6b][B2][0e][1b][CRC nivel bajo][CRC nivel alto]
El significado es el siguiente:
lt1 gt; la dirección del dispositivo y el número de comando son los mismos que los anteriores.
El número de bytes devueltos por lt2 gt: indica el número de bytes de datos, es decir, el valor de n en los datos 1 y 2... sustantivo (abreviatura de sustantivo)
lt3 gt data 1...n: debido a que cada dato es un número de 8 bits, cada dato representa el valor de 8 interruptores. Cada bit es 0, lo que significa que el interruptor correspondiente está apagado y 1 significa que está cerrado. Por ejemplo, en el ejemplo, significa que el interruptor 20 (número de índice 19) está cerrado, el interruptor 21 está abierto, el interruptor 22 está cerrado, el interruptor 23 está cerrado, el interruptor 24 está abierto, el interruptor 25 está cerrado y el interruptor 26 está cerrado. , el interruptor No. 27 está cerrado. Si el valor del interruptor consultado no es un múltiplo entero de 8, la parte de orden superior del último byte no tiene sentido y se establece en 0.
La comprobación de lt4 gtCRC es la misma que la anterior.
2. Leer el registro digital de solo lectura (estado de entrada):
Similar a leer el estado de la bobina, excepto que el número de comando del segundo byte ya no es 1 sino 2. .
3. Escribe la cantidad digital (estado de la bobina):
La computadora envía un comando: [Dirección del dispositivo] [Número de comando 05] [8 bits altos de la dirección del registro a descargar ] [8 bits bajos] [8 bits altos de datos a descargar] [8 bits bajos] [Comprobación CRC 8 bits bajos] [Comprobación CRC 8 bits altos].
Ejemplo: [11][05][00][AC][FF][00][CRC nivel bajo][CRC nivel alto]
El significado es el siguiente:
lt1 gt; la dirección del dispositivo es la misma que la anterior.
Número de comando lt2 gt: El número de comando para escribir cantidades digitales se fija en 05.
lt3 gtLa dirección del registro a configurar es de 8 bits de alto y 8 bits de bajo: indica la dirección del interruptor a configurar.
Los datos descargados por lt4 gt tienen 8 bits altos y 8 bits bajos: indica el estado del valor del interruptor que debe cerrarse. En este ejemplo, el interruptor está cerrado. Tenga en cuenta que solo [FF] [00] significa cerrado y [00] [00] significa abierto. Otros valores son ilegales.
lt5 gtTenga en cuenta que este comando solo puede establecer un valor de cambio.
Respuesta del dispositivo: Si el comando emitido por el ordenador se devuelve con éxito, en caso contrario no responderá.
4. Leer y escribir registros analógicos (registros de retención):
La computadora envía el comando: [dirección del dispositivo] [número de comando 03] [8 bits altos de la dirección del registro inicial] [8 bits bajos][8 bits altos del número de registros leídos][8 bits bajos][8 bits bajos de verificación CRC][8 bits altos de verificación CRC]
Ejemplo: [11][ 03 ][00][6b][00][03][CRC nivel bajo][CRC nivel alto]
El significado es el siguiente:
lt1 gt; es el mismo que el anterior.
Número de comando lt2 gt: El número de comando para leer cantidades analógicas se fija en 03.
dirección inicial lt3 gt: 8 bits altos, 8 bits bajos: indica la dirección inicial de la cantidad analógica a leer (la dirección inicial es 0). Por ejemplo, la dirección inicial en el ejemplo es 107.
lt4 gt tiene un número de registro de 8 bits altos y 8 bits bajos: indica cuántas cantidades analógicas se leen desde la dirección inicial. En este ejemplo, hay tres cantidades analógicas. Tenga en cuenta que el análogo necesita devolver dos bytes en la información devuelta.
Respuesta del dispositivo: [dirección del dispositivo][número de comando 03][número de bytes devueltos][datos 1][datos 2]...[datos n][8 bits inferiores de verificación CRC] [Alto 8 bits de verificación CRC]
Ejemplo: [11][03][06][02][2b][00][00][00][64][CRC bajo][ CRC alto]
El significado es el siguiente:
lt1 gt; la dirección del dispositivo y el número de comando son los mismos que los anteriores.
El número de bytes devueltos por lt2 gt: representa el número de bytes de datos, es decir, el valor de n en los datos 1 y 2...n en el ejemplo, los datos de tres analógicos. Se devuelven cantidades, porque se requieren 2 bytes para una cantidad analógica, por lo que ***6 bytes.
lt3 gt datos 1...n: donde [datos 1] [datos 2] son los 8 bits altos y los 8 bits bajos de 1 simulación, [datos 3] [datos 4] es el segundo Los 8 bits altos y los 8 bits bajos de la simulación, y así sucesivamente. Los valores devueltos en el ejemplo son 555, 0 y 100.
La comprobación de lt4 gtCRC es la misma que la anterior.
5. Registro analógico de solo lectura (registro de entrada):
Es similar a leer el registro de guardado, excepto que el número de comando del segundo byte ya no es 2 sino 4. .
6. Escriba un registro analógico (registro de retención):
La computadora envía un comando: [Dirección del dispositivo] [Comando No. 06] [8 bits altos de la dirección del registro a descargar] [8 bits bajos] [8 bits altos de datos a descargar] [8 bits bajos] [Comprobación CRC 8 bits bajos] [Comprobación CRC 8 bits altos].
Ejemplo: [11][06][00][01][00][03][CRC bajo][CRC alto]
El significado es el siguiente: p>
lt1 gt; La dirección del dispositivo es la misma que la anterior.
Número de comando lt2 gt: El número de comando para escribir cantidades analógicas se fija en 06.
lt3 gt La dirección del registro a descargar es de 8 bits de alto y 8 bits de bajo: indica la dirección del registro analógico a descargar.
Los datos de descarga del lt4 gt tienen 8 bits altos y 8 bits bajos: indica los datos de simulación que se descargarán. Por ejemplo, el valor del registro 1 se establece en 3.
lt5 gtTenga en cuenta que este comando solo puede establecer un estado de simulación.
Respuesta del dispositivo: Si el comando emitido por el ordenador se devuelve con éxito, en caso contrario no responderá.