与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

欢迎关注:

Modbus协议栈开发笔记之七:Modbus ASCII 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. 嵌入式系统开发笔记90:ALIENTEK MiniSTM32开发板原理图基本电路讲解

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

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

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

  6. Kinect开发笔记之七Visual Studio结合C#调控Kinect俯仰角度

    总感觉自己前面啰啰嗦嗦写了好多,却一直都没有使用用开发kinect的重型武器--Visual Studio. 那么本次我们就借助于Visual Studio,写一个C#程序,连接Kinect并调用Ki ...

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

    前面我们实现了TCP服务器和客户端的简单应用,接下来我们实现一个基于TCP协议的应用协议,那就是HTTP超文本传输协议. 1.HTTP协议简介 超文本传输协议(Hyper Text Transfer ...

  8. PID控制器开发笔记之七:微分先行PID控制器的实现

    前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡.为了适应这种给定值频繁变化的场合,人们设计了微分先行算法. 1.微分先行算法的思想 微分先行PID控制 ...

  9. iOS开发笔记之七十九——读写线程锁介绍(一)

    一.读写锁 在多线程环境下,我们经常会遇到读写同步的问题.常见的做法就是将读写做成互斥操作,但是这样会降低读写性能.通常情况下我们希望读操作之间是不互斥的,这个时候就需要用到读写锁了.简单来说,读写锁 ...

最新文章

  1. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画
  2. 是什么阻碍了你的 AI 致富路?
  3. Android 热修复总结
  4. 程序运行时,内存占用查看
  5. 从红旗5.0提及——看Linux的内存办理
  6. LineageOS编译
  7. 鸿蒙杀戮手机电脑版,鸿蒙杀戮单职业最新版
  8. jQuery获取iframe的document对象的方法
  9. Windows 消息ID及定义大全
  10. 涡轮流量计说明书_实际应用中超声波流量计与电磁流量计哪个更好用
  11. 扎实的基础知识、高质量的代码
  12. 计算机第二章基础知识习题,计算机基础知识习题.docx
  13. java分布式缓存memcached_分布式缓存系统Memcached学习心得
  14. Unity3D启动时卡在Loading界面
  15. 什么是区块链? 区块链的入门教程~
  16. react 最佳入门_详解React-Todos入门例子
  17. 区块链组适应不断变化的监管环境
  18. [通信技术]UTRAN Iub接口介绍
  19. 美服行星边际2服务器维护时间,行星边际2美服证书 快速起步攻略新手必读
  20. A - ASCII码排序

热门文章

  1. 【笔试面试】C#中的程序集
  2. CF1129D Isolation(分块+DP)
  3. HDU Integer's Power(容斥原理)
  4. Java 代码复用 —— 泛型
  5. codeforces 264 B. Good Sequences(dp+数学的一点思想)
  6. 3.1_ 6_ 基本分页存储管理的基本概念
  7. 操作系统学习笔记-05-中断和异常
  8. centos 安装MySQL报错You could try using --skip-broken to work around the problem You could try running:
  9. Leetcode--523. 连续的子数组和
  10. Leetcode--102. 二叉树的层次遍历