Modbus在串行链路上分为Slave和Master,这一节我们就来开发Slave。对于Modbus RTU从站来说,需要实现的功能其实与Modbus TCP的服务器端是一样的。其操作过程也是一样的。首先接收到主站的访问命令,对该命令报文进行解析,这里我们也只是实现前面提到的8种功能码。其次我们根据解析的结果进行对应的操作,具体的软件访问结构如下:

从上图中不难发现实际是3步:

第1步、接到命令后先解析。解析的方式与前面几节中的类式。

第2步、根据解析结果进行操作。包括更具命令修改或者获取变量的值。

第3步、生成响应并返回给主机。

1、解析主机命令

从机在接收到主机的命令报文后,对其进行解析,我们暂且支持上图所示的8种功能码。

/*解析接收到的信息,并返回合成的回复信息和信息的字节长度,通过回调函数*/

uint16_t ParsingMasterAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes,uint16_t rxLength)

该函数接收接受到的报文,并生成响应信息报文,返回值是响应报文的长度。在开发应用是将接收到的报文发送个该函数,并将生成的响应信息返回个客户端就可以了。

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 (*HandleMasterCommand[])(uint16_t,uint16_t,uint8_t *,uint8_t *)={HandleReadCoilStatusCommand,

HandleReadInputStatusCommand,

HandleReadHoldingRegisterCommand,

HandleReadInputRegisterCommand,

HandleWriteSingleCoilCommand,

HandleWriteSingleRegisterCommand,

HandleWriteMultipleCoilCommand,

HandleWriteMultipleRegisterCommand};

3、生成从机响应

处理完还需要生成从机的相应信息,无论是读操作命令还是写操作命令,我们均在对应的功能码处理时生成响应报文。这么一来在开发应用时,只需要调用解析函数据可以实现全部的功能了。

源码网址是:https://github.com/foxclever/Modbus

欢迎关注:

Modbus协议栈开发笔记之五:Modbus RTU Slave开发相关推荐

  1. ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

    目录 ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植 Atmel两个官方lib介绍 一.CryptoAuthLib简介 Lib中最主要的三种对象类型: 二. ...

  2. 硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件

    `该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125369228 红胖子网络科技博文大全:开发技术集合( ...

  3. 硬件开发笔记(八): 硬件开发基本流程,制作一个USB转RS232的模块(七):创建基础DIP元器件(晶振)封装并关联原理图元器件

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125370284 红胖子网络科技博文大全:开发技术集合( ...

  4. Modbus协议栈应用实例之五:Modbus ASCII主站应用

    自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例.所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们来使用协议栈实现Modbus ...

  5. 嵌入式系统开发笔记90:ALIENTEK MiniSTM32开发板原理图基本电路讲解

    文章目录 前言 一.电源部分 1.USB输入 第一路通过CH340转换为串口信号,接MCU的串口1,该接口可以用于程序下载使用. 第二路直接与MCU的USB口相连接,用于USB通讯操作. 2.电源开关 ...

  6. SSD202开发笔记 | 01- 东山Pi壹号开发板快速上手(原厂SDK快速入门)

    本文中我使用Ubuntu 18.04,阿里源. 一.东山Pi壹号开发板 东山Pi壹号开发板是联合芯片原厂星宸科技一起推的最小Linux开发板: 主控芯片: 星辰科技 SSD202D 内置128MB D ...

  7. LwIP应用开发笔记之五:LwIP无操作系统TCP服务器

    前面我们实现了UDP服务器及客户端以及基于其上的TFTP应用服务器.接下来我们将实现同样广泛应用的TCP协议各类应用. 1.TCP简述 TCP(Transmission Control Protoco ...

  8. Kinect开发笔记之五使用PowerShell控制Kinect

    这是第一次用MarkDown编辑器来写博客,挺喜欢这种没有任何格式舒服的编辑器,自由洒脱更加易读,留一个不自然的自然段纪念下找到舒服的编辑器. 这次要记录使用win7/win8内建的PowerShel ...

  9. iOS开发笔记之五十九——OS X和iOS安全机制之一——签名机制

    一.背景 在OS X上病毒和恶意软件很少见,给大家的感觉是OS X和iOS更加安全.到底是什么原因导致的OS X更加安全呢? (1)OS X占有率较低,没有吸引足够的恶意软件开发者的注意(假设你是恶意 ...

最新文章

  1. SEED实验系列:ShellShock 攻击实验
  2. 啊哈c语言推箱子小游戏,啊哈C入门版学完了,现发推箱子源代码~
  3. 一睹为快 | 施耐德电气全生命周期智能制造解决方案亮相线上工博
  4. Linux中的tty、pts、pty等概念辨析
  5. “Could not change executable permissions on the application”的原因和解决方法
  6. ACM题集以及各种总结大全
  7. Matlab Tricks(二十四)—— 将一副图像逆时针旋转 180°
  8. python免费网课-Python网课推荐——免费学习Python编程
  9. bigdecimal计算开n次方_随笔:HashMap中容量为什么是2的次方数?
  10. pe linux 引导修复工具下载,winpe系统引导修复工具
  11. centos安装Docker与使用构建业务镜像挂载卷harbor仓库的高可用及网络模式和资源限制介绍...
  12. idea gradle GC overhead limit exceeded
  13. pycharm中的红色小闪电
  14. python的scipy层次聚类参数详解
  15. 写给通信人的“失业”生存指南
  16. 系统解剖学 | 心血管系统 | 静脉
  17. Chrome浏览器开启手机调试模式就断网解决
  18. 一篇文章轻松学会python装饰器
  19. SVM支持向量机——MATLAB在数学建模中的应用
  20. 如何查看Win10电脑是否能运行Hyper-V虚拟机

热门文章

  1. 中文实体、关系抽取工具
  2. 6 操作系统第二章 进程管理 处理机调度
  3. IO模型(epoll)--详解-02
  4. 【笔试面试】C#中的程序集
  5. yii2的Console定时任务创建
  6. 简单图形打印(需求分解)
  7. 因HTTP的Header长度过长导致下载文件名出现乱码的问题
  8. 【剑指offer】面试题63:股票的最大利润(Java)
  9. js纯ajax,自动完成JS类(纯JS, Ajax模式)
  10. dm_php库,dmandwp系统 PHP建站系统+wordpress建站和DM系统区块+安装教程