STM32CubeMX | 适用于嵌入式平台的Modbus主机实现
1、代码移植
modbus和freemodbus移植使用可以参考我的另一篇博客,本篇文章就不在介绍。
STMC2CubeMX | STM32 HAL库移植FreeModbus详细步骤
网上有很多从机的实现,找主机却很少,要么有系统限制,要么还要基于某个依赖才能使用。
鉴于此,我在FreeModbus(版本为V1.6)的基础上做了修改,新增了主机模式下的API,代码风格与源代码保持一致,实现方式上也与原代码保持一致,也是基于回调函数和事件的形式。
移植的时候与从机时候的移植没有区别,我设置了一个全局宏定义MB_USE_MASTER ,该宏定义在port.h 文件中,定义该宏表示使用主机模式,注释该宏为从机模式。
从机模式下,回调函数在port.c 中实现。
主机模式下,回调函数在port_master.c 中实现。
2、主机模式API使用详解
2.1 读线圈(命令码1)
eMBErrorCode eMBRTUMasterReadCoils(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usNum)
2.2 读离散量(命令码2)
eMBErrorCode eMBRTUMasterReadDiscreteInputs(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usNum)
2.3 读保持寄存器(命令码3)
eMBErrorCode eMBRTUMasterReadHoldingRegisters(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usNum)
2.4 读输入寄存器(命令码4)
eMBErrorCode eMBRTUMasterReadInputRegisters(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usNum)
2.5 写单个线圈(命令码5)
eMBErrorCode eMBRTUMasterWriteSingleCoil(UCHAR ucSlaveAddress, USHORT usAddress, UCHAR ucState)
2.5 写单个寄存器(命令码6)
eMBErrorCode eMBRTUMasterWriteSingleRegister(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usRegVal)
2.6 写多个线圈(命令码15)
eMBErrorCode eMBRTUMasterWriteMultipleCoils(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usNum, const UCHAR* pucStateBitsBuf)
2.6 写多个寄存器(命令码16)
eMBErrorCode eMBRTUMasterWriteMultipleRegisters(UCHAR ucSlaveAddress, USHORT usAddress, USHORT usNum, const USHORT* pusRegVal)
3、API使用示例
UCHAR ucCoilsBitsState[2] = {0XFF, 0X03};
USHORT usRegVals[3] = {0XAA, 0XBB, 0XCC};
eMBRTUMasterReadCoils(0X01, 1, 10);
eMBRTUMasterReadDiscreteInputs(0X01, 1, 10);
eMBRTUMasterReadHoldingRegisters(0X01, 1, 10);
eMBRTUMasterReadInputRegisters(0X01, 1, 10);
eMBRTUMasterWriteSingleCoil(0X01, 1, 1);
eMBRTUMasterWriteSingleCoil(0X01, 3, 0);
eMBRTUMasterWriteSingleRegister(0X01, 1, 0XA1B0);
ucCoilsBitsState[0] = 0XFF;
ucCoilsBitsState[1] = 0X03;
eMBRTUMasterWriteMultipleCoils(0X01, 1, 10, ucCoilsBitsState);
ucCoilsBitsState[0] = 0X00;
eMBRTUMasterWriteMultipleCoils(0X01, 4, 2, ucCoilsBitsState);
ucCoilsBitsState[0] = 0XFF;
ucCoilsBitsState[0] = 0X03;
eMBRTUMasterWriteMultipleCoils(0X01, 2, 10, ucCoilsBitsState);
eMBRTUMasterWriteMultipleRegisters(0X01, 1, 3, usRegVals);
ends…
|