Modbus使用常见问题 点击:3717 | 回复:9



jz3154

    
  • 精华:2帖
  • 求助:2帖
  • 帖子:60帖 | 787回
  • 年度积分:5
  • 历史总积分:3532
  • 注册:2012年10月06日
发表于:2015-11-16 17:08:51
楼主

    Modbus协议最初由Modicon公司开发出来,是针对PLC设备设计的基于串行总线的主从模式的应用层总线设备协议。ModbusTCP是封装在TCP包内的Modbus协议,虽然有一些变化,但是根本上还是主从模式。
    一、modbus的保持和输入寄存器是以word(16bit/2byte)为单位的。
比如4****(保持寄存器/输出寄存器)和3****(输入寄存器)是以字为单位的。所以,如果读40001寄存器开始的一个16位的数,那么返回2个Byte,并可以从40002开始读下一个16位的数。
但是,如果读40001寄存器开始的一个32位浮点数,那么,返回4个Byte,而且,下一个32位浮点数必须从40003开始。
   常见问题:
1)将40001定义为一个Byte的数据;
2)将40001定义为32位浮点数,40002为下一个32位浮点数。
    二、寄存器最小地址为1,而报文起始地址为0。
在数据报文中,所有的modbus地址都是从0开始的。也就是首次出现的数据项在报文中的地址为0。比如:
1.在控制器中,“线圈1”在Modbus报文的地址域中的地址为00 00。
2.线圈127的十六进制报文地址为007E hex(十进制的126)
3.保持寄存器40001的报文地址为00 00。因为报文功能码明确要操作“保持寄存器”,所以,协议就以“4XXXX”代表这个寄存器。
4.保持寄存器40108的报文地址为006B hex (十进制107)
总之,Modbus地址一般指4****(保持寄存器/输出寄存器)和3****(输入寄存器),这时应用层面的:
比如设备说明书可以简要说明设备支持Modbus RTU标准协议,并详细描述其地址对应关系为:40001 --  模拟量采集通道1,16位有符号数,.....。比如组态软件的地址设置,一般为输出寄存器,从地址1开始,连续多少个。或者指明400001:16位有符号数。但是,在数据报文层面,寄存器起始地址从0开始。
数据报文包括:设备地址+功能码+起始地址+寄存器个数+校验位。其中,起始地址是从0开始的。

举例说明:从设备17读40001开始的2个寄存器数据的报文

设备地址功能码起始地址寄存器个数校验
11              03          00 00         00 02              --

   常见问题:
1)使用和定义40000地址;
2)分析报文时,直接将报文起始地址当作应用层寄存器地址。
3)Modbus的写寄存器命令的不同。
常用Modbus寄存器有:线圈(Coil)、输入(Input)、保持寄存器(Holding Registers)和输入寄存器(Input Registers)。
从Modbus设备角度看,输入是上位机采集Modbus设备的信息,也就是这些寄存器是只读的,所以,Modbus协议没有写输入(Input)和输入寄存器(Input Registers)的命令。

线圈(Coil)是状态量,对应Modbus设备的开关量输出(DO),保持寄存器(Holding Registers)是模拟量,对应Modbus设备模拟量输出(AO),这些寄存器需要Modbus设备的上位机进行设置,也就是为可以写的寄存器。

在Modicon_Modbus协议协议中,写线圈(Coil)和保持寄存器(Holding Registers)都有两种写命令:
1)、写单个寄存器:
置单线圈(Force Single Coil)功能码05(0x05)
写单个寄存器(Preset Single Holding Register)功能码06(0x06)
2)、写多个寄存器
写多线圈(Force Multiple Coils)功能码15(0x0F)
写多个寄存器(Preset Multiple Registers)功能码16(0x10)




楼主最近还看过



江湖再见-余辉

  • [版主]
  • 精华:53帖
  • 求助:44帖
  • 帖子:3351帖 | 28451回
  • 年度积分:603
  • 历史总积分:131640
  • 注册:2006年4月25日
发表于:2015-11-17 17:11:56
1楼

不错的帖子  授精了

jz3154

  • 精华:2帖
  • 求助:2帖
  • 帖子:60帖 | 787回
  • 年度积分:5
  • 历史总积分:3532
  • 注册:2012年10月06日
发表于:2015-11-17 20:47:15
2楼


引用 江湖再见-余辉 的回复内容: 不错的帖子  授精了

谢谢!继续努力!发些有用的帖子!

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 17回
  • 年度积分:0
  • 历史总积分:65
  • 注册:2007年9月25日
发表于:2015-11-18 09:42:06
3楼

收藏了,以后慢慢研究。

upcyang

  • 精华:0帖
  • 求助:4帖
  • 帖子:24帖 | 798回
  • 年度积分:0
  • 历史总积分:3656
  • 注册:2011年4月13日
发表于:2015-12-11 09:30:41
4楼

引用  的回复内容: 收藏了,以后慢慢研究。

 

abc594417818

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 24回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2013年9月09日
发表于:2015-12-29 14:07:03
5楼


引用  的回复内容: 收藏了,以后慢慢研究。


蜜汁叉烧

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 83回
  • 年度积分:3
  • 历史总积分:402
  • 注册:2017年3月27日
发表于:2017-04-24 21:43:53
6楼

不错的帖子  授精了

z_yang526

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 61回
  • 年度积分:0
  • 历史总积分:94
  • 注册:2018年7月20日
发表于:2018-07-20 23:54:37
7楼

学习了,感谢分享

bioe

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 42回
  • 年度积分:0
  • 历史总积分:42
  • 注册:2010年10月09日
发表于:2018-08-07 17:46:21
8楼

感谢分享 学习了

bioe

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 42回
  • 年度积分:0
  • 历史总积分:42
  • 注册:2010年10月09日
发表于:2018-08-07 17:47:23
9楼

请问:

实际应用问题

ModBus RTU协议,常用的功能码03 04,例如某品牌的多联机空调,对于同一台室内机,功能码03读holding register与功能码04读input register相比较,室内机返回的数据是不是相同(假设读操作期间室内机参数不变)?


热门招聘
相关主题

官方公众号

智造工程师