Modbus库开发笔记之九:利用协议栈开发Modbus TCP Server应用

前面我们已经完成了Modbus协议栈的开发,但这不是我们的目的。我们开发它的目的当然是要使用它来解决我们的实际问题。接下来我们就使用刚开发的Modbus协议栈开发一个Modbus TCP Server应用。

开发Modbus TCP Server首先需要有TCP Server的支持以及网络的配置等,但这些与Modbus本身没有什么关系,我们再次不作讨论。我们规定网络和TCP Server已经配置妥当。接下来我们讨论Modbus TCP Server的实现过程。

根据前面对协议栈的封装,我们需要引用Modbus TCP Server的相关封装。在接收到命令后调用解析函数进行解析,解析函数的原型:

uint16_t ParsingClientAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes);

该函数作为函数指针传递给TCP Server,并回调解析接收到的信息列表。

除此之外,我们要根据具体的需要实现8个回调函数,以完成真正的对Modbus对象的操作,这8个函数的原型如下:

/*获取想要读取的Coil量的值*/

void GetCoilStatus(uint16_t startAddress,uint16_t quantity,bool *statusList);

/*获取想要读取的InputStatus量的值*/

void GetInputStatus(uint16_t startAddress,uint16_t quantity,bool *statusValue);

/*获取想要读取的保持寄存器的值*/

void GetHoldingRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue);

/*获取想要读取的输入寄存器的值*/

void GetInputRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue);

/*设置单个线圈的值*/

void SetSingleCoil(uint16_t coilAddress,bool coilValue);

/*设置单个寄存器的值*/

void SetSingleRegister(uint16_t registerAddress,uint16_t registerValue);

/*设置多个线圈的值*/

void SetMultipleCoil(uint16_t startAddress,uint16_t quantity,bool *statusValue);

/*设置多个寄存器的值*/

void SetMultipleRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue);

这8个函数根据应用的具体需求来实现数据对象的操作,实现几个如何实现根据各自的应用需求和数据结构来确定。

时间: 2024-08-07 17:01:24

Modbus库开发笔记之九:利用协议栈开发Modbus TCP Server应用的相关文章

Android开发笔记(九十七)图片的特效处理

图片特效用到的函数 本文讲述的图片特效处理包括:怀旧.光照.光晕.底片.浮雕.模糊.锐化.黑白.冰冻.素描,所有这些特效都是基于一定的算法,对图像每个点的RGB值进行计算,并汇总所有点的计算结果生成新图片. 特效处理主要用到Bitmap类的三个方法: createBitmap : 创建一张新图片. getPixels : 从指定图片中获取所有点的像素数组. setPixels : 对指定图片设置所有点的像素数组. 图片怀旧效果 现实生活中的老相片都是泛黄的,而黄色又是由绿色和红色混合而成,所以怀

CoolBlog开发笔记第2课:搭建开发环境

教程目录 1.1 CoolBlog开发笔记第1课:项目分析 前言 今天是CoolBlog开发笔记的第2课,我们将要讲解的是开发环境的搭建.俗话说"工欲善其事必先利其器",Django开发中我们选择一些比较好用的开发工具大有裨益. 开发选择的操作系统为win7 x64旗舰版(比较普遍,我也想用Mac),Python版本使用的是3.5.2,Django采用的版本是1.9.8.建议大家Python和Django的版本尽量和我保持一致,这样有了问题也好排查.如果你使用的Python2.7.x,

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

CoolBlog开发笔记第4课:数据库模型设计

教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 1.3 CoolBlog开发笔记第3课:创建Django应用 前言 我新书<Python爬虫开发与项目实战>出版了. 这本书包括基础篇,中级篇和深入篇三个部分,不仅适合零基础的朋友入门,也适合有一定基础的爬虫爱好者进阶,如果你不会分布式爬虫,不会千万级数据的去重,不会怎么突破反爬虫,不会分析js的加密,这本书会给你惊喜.如果大家对这本书感兴趣的话,可以看一下 试读样章.废话少说,开

Modbus库开发笔记之三:Modbus TCP Server开发

在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用.当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用. 这里我们不涉及TCP的协议,这部分与Modbus没有必然联系,我们只是在其应用层运行Modbus协议而已. 对于Modbus TCP的服务器我们需要实现几个功能:首先是对接收到客户端命令进行解析,我们只实现前面提到的8中常用的功能吗的支持.其次在解析完成后,我们要实现对应各种功能码的操作.具体架构如下

Modbus库开发笔记之七:Modbus其他辅助功能开发

前面开发了各种应用,但是却一直没有提到一个问题,你就是对具体的数据进行读写操作.对于Modbus来说标准的数据有4种:线圈数据(地址:0000x).输入状态量数据(地址:1000x).保持寄存器数据(地址:4000x)和输入寄存器数据(地址:3000x).我们通讯的目的就是为了对这些数据进行操作,可是我们前面的封装中并没有提到数据处理.事实上,也没办法考虑这一点,因为具体的应用数据千差万别,是没办法封装的.那我们怎么解决这一问题呢?接下来我们将解决这一类问题. 1.数据处理函数的封装 我们考虑到

Android开发笔记(一百零九)利用网盘实现云存储

网盘存储 个人开发者往往没有自己的后台服务器,但同时又想获取app的运行信息,这就要借助于第三方的网络存储(也叫网盘.云盘.微盘等等).通过让app自动在网盘上存取文件,可以间接实现后台服务器的存储功能,同时开发者也能及时找到app的用户信息. 曾几何时,各大公司纷纷推出免费的个人网盘服务,还开放了文件管理api给开发者调用,一时间涌现了网盘提供商的八大金刚:百度网盘.阿里云.华为网盘.腾讯微云.新浪微盘.360云盘.金山快盘.115网盘.可是好景不长,出于盈利.监管等等因素,各大网盘开放平台要

DLNA&UPnP开发笔记(4)— PlatinumKit库介绍

前面几篇文章主要从理论上介绍了DLNA和UPnP协议的相关概念和知识点,本文主要介绍一下PlatinumKit库,该库实现了UPnP协议栈,代码写得非常漂亮,但文档不多,所以希望我的介绍和引导能够帮助初学者更快速地掌握该库的应用. 1. PlatinumKit库的官方网站 http://www.plutinosoft.com/platinum/ 2. PlatinumKit库的特点 (1)由C++编写 (2)支持Windows, Mac OSX, Linux, iPhone, Android (

IOS开发笔记-百度地图(第三方库)

最近做了百度地图,在导入SDK后遇到了一些问题 编译错误: linker command failed with exit code 1 (use -v to see invocation) 想了很多办法,查了很多资料,最后终于解决. 可能原因: 1. 有重复的.m文件,或者未导入 解决办法:有重复的删除即可 在工作左边导航栏Target-->Build Phases-->compile Sources中,第三库库的所有.m文件都添加到里面 2.Valid Architectures 的值 在