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 等等)。
我正在使用 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 等等)。