博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通讯实例 modbus_Modbus通讯编程实例
阅读量:7023 次
发布时间:2019-06-28

本文共 1684 字,大约阅读时间需要 5 分钟。

Modbus通讯编程实例(一)

最近单独在写Modbus和现场总线的介绍,都是一些思路性质的介绍,不涉及具体的实例,可能很多童鞋还是觉得不够具体,因为我现在不做具体的编程调试了,所以直接些实例很费劲。参考了一些网上的和施耐德电气内部的资料,写成以下的案例,用了一些其他人的劳动成果,如果原作者在意版权问题,请联系我,我尊重您的所有权。

我的帖子里提过Modbus的功能码,常用的没几个,这里列出更多的(也不是全部):

功能码(十进制)十六进制说明

0101读线圈
0202读离散量输入
0303读保持寄存器
0404读输入寄存器
0505写单个线圈
0606写单个寄存器
0707读异常状态
0808诊断
110B获得事件计数器
120C获得事件记录
150F写多个线圈
1610写多个寄存器
1711报告从站ID
2216屏蔽写寄存器
2317读/写多个寄存器
2418读FIFO队列

DATA_EXCH功能块是用于Premium和M340传输数据到另外一台设备,这个功能块支持Modbus所有的功能码。DATA_EXCH用梯形图表示:

a3306c51dfb962ce32ff77e7bd400091.png

各个引脚定义:

ADR为地址引脚,对于PREMIUM系列需要使用ADDR功能块连接。

对于M340系列需要使用ADDM功能块连接。
TYPE为类型引脚,1为接受/发送,2为只接受,3为只发送。
EMIS为要发送表
RECP为接受表
GEST为交换管理表

实例一:读取N位(功能码01)

f37d3689502752bae6a4ba8f5f5c589f.png

其中在EMIS数组中第一个字,低字节为功能码01,高字节为读取位的起始位1

第二个字,低字节为读取位的起始位1,高字节为读取位的长度5
第三个字,低字节为读取位的长度5
最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的数据起始地址,2个字节的读取位的长度,所以长度为1+2+2=5

在TWIDO中赋值如下:

60e03f5d9399b4a0c14b3308b2d53a2b.png

在RECP中第一个字为返回码

第二个字为读取的数据

513c00cc9a795aa84c1f27507dc82cf1.png

Modbus通讯编程实例(二)

实例二:读取N字(功能码03)

f4ee21ee87dc6030744a8fbf10a7cf65.png

其中在EMIS数组中第一个字,低字节为功能码03,高字节为读取字的起始地址1

第二个字,低字节为读取字的起始地址1,高字节为读取字的长度6

第三个字,低字节为读取字的长度6
最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的数据起始地址,2个字节的读取字的长度,所以长度为1+2+2=5

在TWIDO中赋值如下

eb8aa5e1b468fde2da94bbd1c90e4ae1.png

在RECP中第一个字为返回码

第二个字开始为读取的数据

7460de5a4b336551c0ba40d918597c34.png

Modbus通讯编程实例(三)

实例三:写单字(功能码06)

c680b8642f36009fe82da24bd73e63c2.png

其中在EMIS数组中第一个字,低字节为功能码06,高字节为从站要写入字的地址11

第二个字,低字节为从站要写入字的地址11,高字节为主站写出字的地址90
第三个字,低字节为主站写出字的地址90
最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的从站写入字地址,2个字节的主站写出字地址,所以长度为1+2+2=5

在主站赋值如下

c08dfd65c28ad0605e2e34870087b337.png

在TWIDO中显示如下:

c7ad20b13ebc7bb6d45a1420096a8c5d.png

Modbus通讯编程实例(四)

实例四:写N字(功能码16)

2bbcd4de7ac768455ce3cef957951efa.png

其中在EMIS数组中第一个字,低字节为功能码16,高字节为从站要写入字的起始地址20

第二个字,低字节为从站要写入字的起始地址20,高字节为要写入字的长度3
第三个字,低字节为要写入字的长度3,高字节为2倍的要写入字的长度
第四个字~第六个字为主站写出字,高低字节顺序要相互转换
最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的从站写入字地址,2个字节的写入字的长度,1个2倍的要写入字的长度,6个字节的主站写出字,所以长度为1+2+2+1+6=12

在主站赋值如下

f5f82014be15a7d3635f3bfed9e60a6d.png

在TWIDO中显示如下

9dff3d2c61e6adec6bc2cffeb7ab3170.png

另外注意刷新数据时,必须要把EN引脚断开一下才可以重新读取或写入。通过实验,把交换管理表的完成位(即GEST第一个字的最低位)放在EN引脚前不太好使,所以最好编个令牌循环指令。把令牌放在EN引脚前,当取得令牌时再读取或者写入。

3aa9baf417220f4865e518644c07ea36.png

功能码05:

7859655fdb2deafea95d0ba296aaffab.png

转载地址:http://ywsxl.baihongyu.com/

你可能感兴趣的文章
Oracle中scn讲解
查看>>
在Java中实现MongoDB的Group功能
查看>>
我的友情链接
查看>>
Haproxy+Keepalived+apache实现高可用
查看>>
python网络编程实现TCP和UDP连接
查看>>
主流NoSQL数据库评测之Tokyo Cabinet
查看>>
airodump-ng wlan0mon doesn't work
查看>>
iostat 实例分析
查看>>
php学习日记
查看>>
Qt新建项目
查看>>
虚拟机的克隆并更改主机名
查看>>
Java并发编程:什么是CAS?这回总算知道了
查看>>
分享一波Android面试题
查看>>
python入门系列:文件操作
查看>>
适合练习的10个Python项目,每个项目都不到500行代码
查看>>
iOS宏定义的使用与规范
查看>>
Cisco ASA 应用NAT
查看>>
微信环境中不支持APP(APK)文件下载的解决方案---使用augpush实现跳转
查看>>
Python进阶之路 3.4.4 比较运算符
查看>>
数据库系统学习二
查看>>