与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. Hololens开发笔记之使用Unity开发一个简单的应用

    一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...

  2. (SenchaTouch+PhoneGap)开发笔记(2)开发环境搭建二

    一.Java环境和Android SDK  1.安装JDK和JRE JRE会在JDK安装完成后自动出现安装界面. 安装完成后,设置环境变量 JAVA_HOME    D:\Program Files\ ...

  3. [转] WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

    以下文章来自   http://www.blogjava.net/jacally/articles/186655.html 现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了 ...

  4. (SenchaTouch+PhoneGap)开发笔记(1)开发环境搭建一

    1.下载senchaTouch 2.下载senchaCMD 3.安装ruby(for windows ) 4.senchaCmd创建项目: 打开senchacmd,cd到senchaTouch的目录如 ...

  5. Modbus库开发笔记:Modbus ASCII Master开发

    这一节我们来封装Modbus ASCII Master应用,Modbus ASCII主站的开发与RTU主站的开发是一致的.同样的我们也不是做具体的应用,而是实现ASCII主站的基本功能.我们将ASCI ...

  6. Modbus库开发笔记之十一:关于Modbus协议栈开发的说明

    对于Modbus协议栈的整个开发内容,前面已经说得很清楚了,接下来我们说明一下与开发没有直接关系的内容. 首先,关于我为什么开发这个协议栈的问题.我们的初衷只是想能够在开发产品时不用每次都重写这一部分 ...

  7. Modbus库开发笔记之一:实现功能的基本设计(转)

    源: Modbus库开发笔记之一:实现功能的基本设计

  8. Modbus库开发笔记之十一:关于Modbus协议栈开发的说明(转)

    源: Modbus库开发笔记之十一:关于Modbus协议栈开发的说明

  9. Modbus库开发笔记之二:Modbus消息帧的生成

    前面我们已经对Modbus的基本事务作了说明,也据此设计了我们将要实现的主从站的操作流程.这其中与Modbus直接相关的就是Modbus消息帧的生成.Modbus消息帧也是实现Modbus通讯协议的根 ...

随机推荐

  1. [C++]四分树(Quadtrees)

    [本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] 四分树Quadtrees 一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个 ...

  2. [C++]油田(Oil Deposits)-用DFS求连通块

    [本博文非博主原创,均摘自:刘汝佳<算法竞赛入门经典>(第2版) 6.4 图] [程序代码根据书中思路,非独立实现] 例题6-12 油田(Oil Deposits,UVa572) 输入一个 ...

  3. Element Select 回显

    有思考有痛点的朋友可以聊聊(要求:认真看过Element相关文档,对该场景自己有过多角度的探索) 下拉框回显的关键点:要回显的值包含于下拉列表的数组中 demo图 最近遇到一个需求抽象下:循环中下拉框 ...

  4. linux 开发板上的调试

    1.需要命令 ulimit 进行设置core file size ,  看 core file size. cat /proc/pid/limits,  这个暂时不用 2.需要有gdb命令 , 需要g ...

  5. A Simple Problem with Integers POJ - 3468 (分块)

    题目链接:https://cn.vjudge.net/problem/POJ-3468 题目大意:区间加减+区间查询操作. 具体思路:本来是一个线段树裸题,为了学习分块就按照分块的方法做吧. 分块真的 ...

  6. mysql 原理~ FTWRDL

    FTWRL 锁与MDL一 简介:今天来聊聊为什么备份会卡住,申请不到全局FTWRL二 FTWRL 1 FTWRL主要包括3个步骤:        1.上全局读锁(lock_global_read_lo ...

  7. Servlet 线程安全

    普通类的静态属性,当被多个线程访问时,就有线程安全问题: Servlet 也一样 当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Se ...

  8. MySql 在cmd下的学习笔记 —— 有关用户权限的操作(grant)

    用户连接到MySQL时: [用户]   <---->   [服务器] 分为2个阶段: 1:有没有权限连接: 2:有没有执行此操作的权利.(如select, update……) 判断依据:( ...

  9. python基础-----字符编码

    1.ASCII ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现 ...

  10. 2017-2018-2 20165221 实验三《敏捷开发与XP实践》实验报告

    实验报告封面 姓名:谭笑 学号:20165221 班级:1652班 实验名称: JAVA--敏捷开发与XP实践 指导老师:娄嘉鹏 试验时间:15:35--17:15 实验性质:选修 实验组次:21 实 ...