Mantener registro en microcontrolador para Modbus RTU

2

Soy muy novato en microcontrolador modbus. Quiero hacer un dispositivo esclavo Modbus RTU usando RS232. Leí la documentación de modbus del sitio modbus.org. Pero aún no tengo claras algunas cosas.

¿Cómo definir los registros de tenencia en Atmega32? ¿O es necesario que cualquier nuevo elemento de almacenamiento esté interconectado con mcu? ¿O es necesario utilizar la memoria interna de MCU? Por favor, proporcione algunos ejemplos.

    
pregunta user2721044

3 respuestas

2

Un registro de retención de modbus es solo un valor de 16 bits. Solo puede asignar una matriz de uint16_t para almacenarlos.

Hay bibliotecas de código abierto de MODBUS disponibles.

    
respondido por el jwygralak67
1

Los registros de retención son conceptos para Modbus, son solo tipos de datos de dos bytes. Puede asignar los registros de espera a cosas como los sensores conectados al microcontrolador, los temporizadores en el microcontrolador o cualquier dato de aplicación que esté obteniendo el microcontrolador.

Por ejemplo, podría asociar el registro de retención 40003 al sensor de temperatura conectado al puerto del controlador y si la identificación del dispositivo es 0x32. Luego, si la siguiente consulta de modbus se envía al controlador

32 03 02 01 3E 3C

La consulta anterior es una consulta de lectura al registro de retención analógica para el ID de dispositivo 0x32 y el registro de retención analógico no 40003. Cuando esta consulta se recibe en su controlador en uart, puede enviar la respuesta como

32 03 02 2345 64 83

La respuesta dice que hay dos bytes en la respuesta ya que la consulta solicitada es de solo un registro de retención analógico y el registro de retención analógico es de 2 bytes, y como la lectura de la temperatura se asigna al registro de retención analógico, puede enviar el 2345 o la lectura de la temperatura en el pin de puerto.

De esta forma, el estado del pin del puerto se puede asignar a bobinas discretas y contactos discretos, y los valores que se obtienen que no son valores de bits se pueden asignar a entradas analógicas y registros de espera y el modbus se puede usar para compartir información .

    
respondido por el RaviGaniga
0

He hecho proyectos similares antes, pero no estoy seguro de con qué estás teniendo problemas.  Si estuviera creando un programa esclavo para un microprocesador (uso arduino y sello básico) habría una función de bucle que escanea los pines IO y todos los estados de los pines se asignarán a las variables, por ejemplo, pin1 = REG (0), pin2 = REG ( 1) etc. Me resulta más sencillo crear algunos arreglos:

DIM I (16)
DIM Q (16)
DIM F (64)

AI DIM (8)
DIM AQ (8)
DIM AF (8)
DIM REG (32)

y asigne todos los tipos de IO similares a la misma matriz (todas las entradas juntas, todas las salidas juntas, todos los registros juntos) El siguiente paso será procesar las solicitudes entrantes del maestro para que el esclavo sepa qué datos (si hay alguno) debe responder.  Puede usar hardware (como un modbus shield) o bibliotecas de software (arduino tiene algunas pero no sé sobre atmega32). . . o mi opción favorita: escribe tu propio código.

El paquete de respuesta modbus se debe construir en función de los datos solicitados.  este enlace] 1 fue un sitio completo de ayuda para aprender a crear los paquetes de respuesta.

Los paquetes completados deberían tener este aspecto

01 01 01 00 51 88 [bobinas]

01 02 01 00 A1 88 [entradas]

01 03 80 00 00 00 ... [registros de tenencia]

El paso final es convertir las respuestas anteriores a ascii y enviarlas al maestro (a través de rs232).

Además, me resulta más fácil escribir todo mi código para hacer cálculos en formato hexadecimal de 2 caracteres (00-FF) porque imita la forma en que se manejan los datos en modbus. Un registro analógico puede almacenar de 0 a 245, y los registros se combinan para almacenar números más grandes.

    
respondido por el chambers

Lea otras preguntas en las etiquetas