如何使用C / C++映射Modbus寄存器地址

How to Map Modbus Register address using C / C++

本文关键字:Modbus 寄存器 地址 映射 C++ 何使用      更新时间:2023-10-16

我正在尝试使用STM32F4发现板在UART外设上实现ModBus RTU协议。

我计划使用Modbus RTU实现主站和从站功能。

这是我的问题

如何使用C/C++将UART中接收的数据移动到MODBUS并将数据从MODBUS层传输到UART,请提供一些可以帮助我理解您的解释的代码片段。(截至目前,我正在考虑提出一些API,请建议一些模式)

其次,我如何实现Modbus寄存器和线圈。我的意思是我如何定义 ModBus 应用手册中指定的地址。请用代码片段解释我。下面是我试图实现的东西。

/*Global Array, Structure and Variable Declarations*/
/* So to access Discrete_Output_Coils[2345] 
   the valid address to include in the protocol would be
   so we have to access address 0x929 to read the 
   data.*/
const unsigned short int Discrete_Output_Coils[4999];
const unsigned short int Discrete_Input_Contacts[4999];
const unsigned short int Analog_Input_Register[4999];
const unsigned short int Anlog_output_Holding_Register[4999];

我同意user694733。你应该一步一步来。例如,您应该定义您的硬件规格(即,它们是什么信号和哪种类型?几个?这些问题的答案将告诉您有多少寄存器以及哪种类型对您的"设备"有意义。之后,将每个信号映射到寄存器,然后尝试执行单个寄存器读/写操作,并结合(编程)线圈或模拟的CRC检查。调整协议,直到它达到预期,它们覆盖单个寄存器类型(线圈、模拟)的其余部分。然后,将实现扩展到多个寄存器读/写操作。顺便说一下,放置数组声明并不表示解决问题的努力。你要求社区做所有的艰苦工作。如果你想要更多的代码从谷歌开始一点。这是一个图书馆的链接,您可以研究它是否符合您的要求:http://libmodbus.org/download/