Modbus库开发笔记:Modbus ASCII Slave开发
与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave。对于Modbus ASCII从站来说,需要实现的功能其实与Modbus RTU的Slave是一样的。其操作过程也是一样的。首先接收到主站的访问命令,对该命令报文进行解析,这里我们也只是实现前面提到的8种功能码。其次我们根据解析的结果进行对应的操作,具体的软件访问结构如下:
从上图中不难发现实际是3步:
第1步、接到命令后先解析。解析的方式与前面几节中的类式。
第2步、根据解析结果进行操作。包括更具命令修改或者获取变量的值。
第3步、生成响应并返回给主机。
1、解析主机命令
从机在接收到主机的命令报文后,对其进行解析,我们暂且支持上图所示的8种功能码。
/*解析接收到的信息,并返回合成的回复信息和信息的字节长度,通过回调函数*/
uint16_t ParsingAsciiMasterAccessCommand(uint8_t *receivedMessage, uint8_t *respondBytes, uint16_t rxLength, uint8_t StationAddress)
该函数接收接受到的报文,并生成响应信息报文,返回值是响应报文的长度。在开发应用是将接收到的报文发送个该函数,并将生成的响应信息返回个客户端就可以了。
2、结果操作
解析之后无论是读命令还是写命令都需要进行相应的操作。我们根据不同的功能码封装不同的操作:
/*处理读线圈状态命令*/
static uint16_t HandleReadCoilStatusCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理读输入状态命令*/
static uint16_t HandleReadInputStatusCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理读保持寄存器命令*/
static uint16_t HandleReadHoldingRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理读输入寄存器命令*/
static uint16_t HandleReadInputRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理写单个线圈命令*/
static uint16_t HandleWriteSingleCoilCommand(uint16_t coilAddress,uint16_t coilValue,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理写单个寄存器命令*/
static uint16_t HandleWriteSingleRegisterCommand(uint16_t registerAddress,uint16_t registerValue,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理写多个线圈状态*/
static uint16_t HandleWriteMultipleCoilCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*处理写多个寄存器状态*/
static uint16_t HandleWriteMultipleRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
同样我们也是定义一个函数指针数组来实现这8个函数的调用:
uint16_t (*HandleAsciiMasterCommand [])(uint16_t,uint16_t,uint8_t *,uint8_t *)={HandleReadCoilStatusCommand,
HandleReadInputStatusCommand,
HandleReadHoldingRegisterCommand,
HandleReadInputRegisterCommand,
HandleWriteSingleCoilCommand,
HandleWriteSingleRegisterCommand,
HandleWriteMultipleCoilCommand,
HandleWriteMultipleRegisterCommand};
3、生成从机响应
处理完还需要生成从机的相应信息,无论是读操作命令还是写操作命令,我们均在对应的功能码处理时生成响应报文。这么一来在开发应用时,只需要调用解析函数据可以实现全部的功能了。
源代码可上Github下载:https://github.com/foxclever/Modbus
欢迎关注:
相关文章
- 【Android平台】 Alljoyn学习笔记三 开发环境的搭建和Building AllJoyn from Source for Android
- 《征服 C 指针》笔记6:练习——挑战那些复杂的声明
- keras神经网络开发知识笔记
- python开发笔记之zip()函数用法详解
- jquery学习笔记一:数据类型判断 之 小疑惑
- iOS开发笔记--UIView中的坐标转换
- 服务器设计笔记(3)-----消息队列
- vue笔记
- hotplug_uevent机制_修改mdev配置支持U盘自动挂载学习笔记
- RestfulApi 学习笔记——父子资源(四)
- Mono for Android开发调研笔记
- 南大《探索数据的奥秘》课件示例代码笔记11
- 机器学习笔记 - LUX:用于自动探索性数据分析的 Python API
- Android开发学习笔记(十五)文本标签TextView
- Android开发学习笔记(四)线性布局LinearLayout
- C# 指针学习笔记之指针类型
- 测试开发之Vue学习笔记-Vue基础
- linux达人养成计划学习笔记(五)—— 关机和重启命令
- cocos2dx游戏开发——捕鱼达人mini版学习笔记(一)——FishAchor的搭建
- cocos2dx游戏开发——微信打飞机学习笔记(八)——EnemyLayer的搭建
- java多线程与并发笔记
- JavaEE——Spring学习笔记01【Ioc开发的模式】
- 强化学习笔记:Sutton-Book第三章小结