跳到主要内容

Modbus应用笔记

阅读量: 101
阅读人次: 102

Modbus 是一种请求/应答协议,其网络中只有一个 Modbus 客户端,但可能存在多个 Modbus 服务器。服务器只能控制自身的内部状态,而客户端可以读取和写入服务器中的数据。

每个Modbus服务器(从机)内部维护了四个独立的数据存储区域(即“Tables”),用于存储不同类型的数据。

名称数据类型客户端(主机)权限典型应用
离散输入/开关量输入(Discrete Inputs)二进制 0-1传感器状态、开关信号
线圈/输出线圈(Coils)二进制 0-1读/写控制继电器、指示灯
输入寄存器(Input Registers)16位整数 0-65535(0xFFFF)模拟量输入(温度、压力)
保持寄存器(Holding Registers)16位整数 0-65535(0xFFFF)读/写设备参数配置、数据存储

MODBUS Application Protocol 1 1 b 这份文档有对其标准规范进行阐述。

ESP32

esp-modbus 实现了 Modbus 的协议,不过目前测试发现 mbc_master_send_request() 的实现对于 Function code 0x17 支持不太完善。

mb_commands_t  
MB_FUNC_READWRITE_MULTIPLE_REGISTERS

libmodbus

include(FetchContent)
set(LIBMODBUS_GIT_TAG "v3.1.11")
FetchContent_Declare(
libmodbus
GIT_REPOSITORY "https://github.com/stephane/libmodbus.git"
GIT_TAG ${LIBMODBUS_GIT_TAG}
)

string(REGEX REPLACE "^v" "" LIBMODBUS_VERSION_STRING ${LIBMODBUS_GIT_TAG})
string(REPLACE "." ";" VERSION_LIST ${LIBMODBUS_VERSION_STRING})
list(GET VERSION_LIST 0 LIBMODBUS_VERSION_MAJOR)
list(GET VERSION_LIST 1 LIBMODBUS_VERSION_MINOR)
list(GET VERSION_LIST 2 LIBMODBUS_VERSION_MICRO)
FetchContent_MakeAvailable(libmodbus)

add_library(libmodbus STATIC
${libmodbus_SOURCE_DIR}/src/modbus.c
${libmodbus_SOURCE_DIR}/src/modbus-data.c
${libmodbus_SOURCE_DIR}/src/modbus-rtu.c
)

configure_file(${libmodbus_SOURCE_DIR}/src/win32/config.h.win32 ${libmodbus_SOURCE_DIR}/src/config.h)
configure_file(${libmodbus_SOURCE_DIR}/src/modbus-version.h.in ${libmodbus_SOURCE_DIR}/src/modbus-version.h)

target_include_directories(libmodbus PUBLIC
${libmodbus_SOURCE_DIR}/src
)

target_compile_definitions(libmodbus
PUBLIC DLLBUILD
)

target_link_libraries(libmodbus
PRIVATE ws2_32
)