Modbus库开发笔记之三:Modbus TCP Server开发
在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用。当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用。
这里我们不涉及TCP的协议,这部分与Modbus没有必然联系,我们只是在其应用层运行Modbus协议而已。
对于Modbus TCP的服务器我们需要实现几个功能:首先是对接收到客户端命令进行解析,我们只实现前面提到的8中常用的功能吗的支持。其次在解析完成后,我们要实现对应各种功能码的操作。具体架构如下:
1、命令解析
服务器作为被动端接收到客户端的请求后,安装请求进行处理。所以服务器接收到信息后首先对其进行解析,这里我们只需要一个解析函数就可以完成,当在具体应用中时只要将接收到的信息调用这个函数解析就可以了。
/*解析接收到的信息,返回响应命令的长度*/
uint16_t ParsingClientAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes)
其实对外来说只有这一个函数时可见的。当我们要开发一个TCP Server的应用时,就调用这个函数。
2、命令处理
命令解析出来了之后,按不同的功能码来进行不同的处理,我们支持8种功能码,每种功能吗都对应处理部分,很多时候大家都会在解析的时候根据解析结果处理,这势必需要一个很大的解析函数。为了简化操作,我们将每个功能码对应的处理部分都封装为一个函数。然后使用一个函数指针数组来动态调用这些函数,从而简化这些函数。
首先我们需要8个处理对应个功能码操作的函数:
/*处理读线圈状态命令*/
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)
然后我们定义一个函数指针数组来调用这下函数:
uint16_t (*HandleClientCommand[])(uint16_t,uint16_t,uint8_t *,uint8_t *)={HandleReadCoilStatusCommand,
HandleReadInputStatusCommand,
HandleReadHoldingRegisterCommand,
HandleReadInputRegisterCommand,
HandleWriteSingleCoilCommand,
HandleWriteSingleRegisterCommand,
HandleWriteMultipleCoilCommand,
HandleWriteMultipleRegisterCommand};
3、响应的生成
对于响应命令的生成其实在第二篇中已经说过了,需要说明的是各种写数据的具体数值以及获得读数据的各种具体数值我们将在单独的文件中去实现,因为这部分TCP和RTU是相同的,我们将在后续的篇章中说明。
相关文章
- 用dotnet core 搭建web服务器(一)http server
- SQL Server-聚焦强制索引查询条件和Columnstore Index(九)
- sql server几种读写分离方案的比较
- SQL Server 2008怎么自动备份数据库
- Sql server在另一台服务器,在Visual Studio 中没问题,IIS中 提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。。。。”
- file /usr/lib64/mysql/plugin/dialog.so from install of Percona-Server-server-56-5.6.24-rel72.2.el6.x86_64 conflicts with file from package mariadb-libs-1:5.5.60-1.el7_5.x86_64
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
- sql server去空格函数LTRIM()RTRIM(),判断是否为空函数isnull(),以及获取字符串长度len()的使用方法
- SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222) 解决方案
- SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
- 重要的 SQL Server 函数 - 日期函数
- 误删Server后Tomcat服务器报错The Tomcat server configuration at ServersTomcat v8.5 Server at
- Caused by: java.lang.RuntimeException: java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ
- git clone时出现"fatal: unable to access 'https://myrepo.git/': server certificate verification failed. CAfile: /my-certificate CRLfile: none"时如何处理?
- HTTP 笔记与总结(9)分块传输、持久链接 与 反向 ajax(comet / server push / 服务器推技术)
- 基于C#(MVC5)+SQL Server 2008 实现(Web)博客网站【100010199】
- 随手记之TCP Keepalive笔记-tcp_keepalive_timer
- 关于mariadb10.x版本安装mariadb-galera-server包
- sql server 小技巧(4) Sql server 排序时让空值排在最后
- Modbus库开发笔记之九:利用协议栈开发Modbus TCP Server应用
- RSA应用指数与模生成公钥(ArcGIS Server)
- http-server服务跨域设置
- ROS Noetic入门笔记(九)使用C++编写简单的Server与Client
- Metrics Server--->aggregate api-->metric-server -->cadvisor
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)
- 阿里云server改动MySQL初始password---Linux学习笔记
- (4.46)sql server中的rule
- sql server分布式alwaysOn
- sql server 2008 评估期已过期解决办法
- sql server维护计划配置
- SQL SERVER 自带系统存储过程分类
- Navicat连接数据库出现 is not allowed to connect to this MySQL server 报错