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

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

1、数据处理函数的封装

我们考虑到,不论是在RTU主站、RTU从站、TCP客户端、还是在TCP服务器对数据的处理本质上是一样的,只要具体应用的数据结构确定后处理方法也就确定了。鉴于此,我们采用的方法是定义弱化类型的函数。如下:

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

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

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

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

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

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

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

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

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

__weak void SetSingleCoil(uint16_t coilAddress,bool coilValue)

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

__weak void SetSingleRegister(uint16_t registerAddress,uint16_t registerValue)

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

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

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

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

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

{

//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容

}

/*更新读回来的线圈状态*/

__weak void UpdateCoilStatus(uint16_t startAddress,uint16_t quantity,bool *stateValue)

{

//在客户端(主站)应用中实现

}

/*更新读回来的输入状态值*/

__weak void UpdateInputStatus(uint16_t startAddress,uint16_t quantity,bool *stateValue)

{

//在客户端(主站)应用中实现

}

/*更新读回来的线圈状态*/

__weak void UpdateHoldingRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)

{

//在客户端(主站)应用中实现

}

/*更新读回来的线圈状态*/

__weak void UpdateInputResgister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)

{

//在客户端(主站)应用中实现

}

在开发具体应用时,我们只需要在应用中实现对应的函数就可以使功能完整,至于具体的数据如何处理,就要看具体应用中的数据格式了。当然这些函数并非都需要实现,只需要根据自己的需要实现就可以了。

2、关于大小端的问题

提到数据通讯,有一个问题是没有办法回避的,那就是大小端的问题。对于Modbus协议来说,采用的是大端模式,就是低位地址存高位字节数据,高位地址存低位字节数据。

在进行多字节数据通讯时,大小端的问题就明显了,比如一个浮点数在不同的系统中存储的顺序是有差别的,你读上来或者写下去的数据就会出现错误的解析。所以我们在处理数据报文时是必须考虑这一点的。

时间: 2024-10-07 22:58:19

Modbus库开发笔记之七:Modbus其他辅助功能开发的相关文章

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,

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

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

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

前面我们已经对Modbus的基本事务作了说明,也据此设计了我们将要实现的主从站的操作流程.这其中与Modbus直接相关的就是Modbus消息帧的生成.Modbus消息帧也是实现Modbus通讯协议的根本. 1.Modbus消息帧分析 MODBUS协议在不同的物理链路上的消息帧有一些差异,但我们分析一下就会发现,在这些不同的消息帧中具有一下相同的部分,这对我们实现统一的数据操作非常重要,具体描述如下: (1).简单协议数据单元 MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)

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

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

EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO

0 前言 本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2.4至P2.5关联,通过modbus指令可控制GPIO的输出.本文改动自freemodbus 演示样例LINUXTCP.经过简单的改动也可用于其它Linux开发板. [相关博文] [EasyARM i.mx28学习笔记--文件IO方式操作GPIO] [EasyARM i.mx28学习笔记--安装和使用tft

EasyARM i.mx28学习笔记——通过modbus tcp控制GPIO

0 前言 本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机.在该从机中定义了线圈寄存器,其中线圈寄存器地址较低的4位和EasyARM的P2.4至P2.5关联,通过modbus指令可控制GPIO的输出.本文修改自freemodbus 示例LINUXTCP,经过简单的修改也可用于其他Linux开发板. [相关博文] [EasyARM i.mx28学习笔记--文件IO方式操作GPIO] [EasyARM i.mx28学习笔记--安装和使用tftp]

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 的值 在

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 (

Android开发笔记(一百零六)支付缴费SDK

第三方支付 第三方支付指的是第三方平台与各银行签约,在买方与卖方之间实现中介担保,从而增强了支付交易的安全性.国内常用的支付平台主要是支付宝和微信支付,其中支付宝的市场份额为71.5%,微信支付的市场份额为15.99%,也就是说这两家垄断了八分之七的支付市场(2015年数据).除此之外,还有几个app开发会用到的支付平台,包括:银联支付,主要用于公共事业缴费,如水电煤.有线电视.移动电信等等的充值:易宝支付,主要用于各种报名考试的缴费,特别是公务员与事业单位招考:快钱,被万达收购,主要用于航空旅