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用梯形图表示: ![]() 各个引脚定义: ADR为地址引脚,对于PREMIUM系列需要使用ADDR功能块连接。 对于M340系列需要使用ADDM功能块连接。 TYPE为类型引脚,1为接受/发送,2为只接受,3为只发送。 EMIS为要发送表 RECP为接受表 GEST为交换管理表 实例一:读取N位(功能码01) ![]() 其中在EMIS数组中第一个字,低字节为功能码01,高字节为读取位的起始位1 第二个字,低字节为读取位的起始位1,高字节为读取位的长度5 第三个字,低字节为读取位的长度5 最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的数据起始地址,2个字节的读取位的长度,所以长度为1+2+2=5 在TWIDO中赋值如下: ![]() 在RECP中第一个字为返回码 第二个字为读取的数据 ![]() Modbus通讯编程实例(二) 实例二:读取N字(功能码03) ![]() 其中在EMIS数组中第一个字,低字节为功能码03,高字节为读取字的起始地址1 第二个字,低字节为读取字的起始地址1,高字节为读取字的长度6 第三个字,低字节为读取字的长度6 最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的数据起始地址,2个字节的读取字的长度,所以长度为1+2+2=5 在TWIDO中赋值如下 ![]() 在RECP中第一个字为返回码 第二个字开始为读取的数据 ![]() Modbus通讯编程实例(三) 实例三:写单字(功能码06) ![]() 其中在EMIS数组中第一个字,低字节为功能码06,高字节为从站要写入字的地址11 第二个字,低字节为从站要写入字的地址11,高字节为主站写出字的地址90 第三个字,低字节为主站写出字的地址90 最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的从站写入字地址,2个字节的主站写出字地址,所以长度为1+2+2=5 在主站赋值如下 ![]() 在TWIDO中显示如下: ![]() Modbus通讯编程实例(四) 实例四:写N字(功能码16) ![]() 其中在EMIS数组中第一个字,低字节为功能码16,高字节为从站要写入字的起始地址20 第二个字,低字节为从站要写入字的起始地址20,高字节为要写入字的长度3 第三个字,低字节为要写入字的长度3,高字节为2倍的要写入字的长度 第四个字~第六个字为主站写出字,高低字节顺序要相互转换 最后要在交换管理表的第四个字中定义这个报文字节的长度,为1个字节的功能码,2个字节的从站写入字地址,2个字节的写入字的长度,1个2倍的要写入字的长度,6个字节的主站写出字,所以长度为1+2+2+1+6=12 在主站赋值如下 ![]() 在TWIDO中显示如下 ![]() 另外注意刷新数据时,必须要把EN引脚断开一下才可以重新读取或写入。通过实验,把交换管理表的完成位(即GEST第一个字的最低位)放在EN引脚前不太好使,所以最好编个令牌循环指令。把令牌放在EN引脚前,当取得令牌时再读取或者写入。 ![]() 功能码05: ![]() |
|免责声明|本站介绍|工控课堂
( 沪ICP备14007696号-3 )|网站地图
GMT+8, 2019-9-17 21:33 , Processed in 0.061605 second(s), 42 queries .
Powered by Discuz! X3.4
© 2001-2017 Comsenz Inc.