仙游门户网
当前位置:主页>国际新闻>
Modbus通讯编程实例
来源:fithyorange.com  阅读量:1883

  2019 工控自动化联盟

  Modbus通讯编程实例(一)

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

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

  功能码(十进制)十六进制说明0101读线圈0202读离散量输入0303读保持寄存器0404读输入寄存器0505写单个线圈0606写单个寄存器0707读异常状态0808诊断110B获得事件计数器120C获得事件记录150F写多个线圈1610写多个寄存器1711报告从站ID2216屏蔽写寄存器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:

  

  Modbus通讯编程实例(一)

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

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

  功能码(十进制)十六进制说明0101读线圈0202读离散量输入0303读保持寄存器0404读输入寄存器0505写单个线圈0606写单个寄存器0707读异常状态0808诊断110B获得事件计数器120C获得事件记录150F写多个线圈1610写多个寄存器1711报告从站ID2216屏蔽写寄存器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:

  

友情链接:
仙游门户网 版权所有© www.fithyorange.com 技术支持:仙游门户网 | 网站地图