C语言ESp32之Modbus寄存器映射

Modbus Register Map in C language ESp32

我正在使用 ESP32.. 我想通过 Modbus RTU 与外部世界通信。 ESP32 将是奴隶。 我怎样才能用c语言创建一些modbus寄存器。 任何的想法 ? 它只是 C 中的一个简单 table 吗? 非常感谢

我做了你想做的同样的事情,不是用 ESP32,但它是一样的。

基本上,您将所有想要访问的变量作为 modbus 寄存器放在一个精确的位置,可能是一个结构。

例如

struct modbusmap_t {
  uint16_t    speed;    // this has modbus address 0
  unit16_t    cooler;   // ...and this address 1
  ...
} modbusregs;

您的设备是一个从设备,因此您将实现一个接收 modbus 命令的服务器。当收到写入寄存器“N”的请求时,您可以简单地访问该寄存器:

*((uint16_t *) &modbusregs + N) = requestvalue;

阅读同理:

uint16result = *((uint16_t *) &modbusregs + N);

还有其他方法可以做到这一点,例如通过工会。

总而言之,关键是将所有可作为 modbus 寄存器访问的变量放在一个已知的、有序的位置,并使用指向它们的指针或数组 read/write。对于位(modbus 线圈),需要更多技巧,但想法是一样的。

在此示例中,“modbus 寄存器 0”映射到源中的变量“speed”。 Modbus 没有符号的概念,但您可以使用 2 补码或添加偏移量来管理它(32000 表示 0 速度,32010 表示速度 10,31990 表示速度 -10 等等)。