故事作者:万泉河

最近创作

看看TA的故事

0320【万泉河】MODBUS地址:400235=40235

已锁定

万泉河

  • 帖子

    10904
  • 精华

    132
  • 被关注

    1012

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

0320【万泉河】MODBUS地址:400235=40235

1677

15

2022-03-20 15:40:30

0320【万泉河】MODBUS地址:400235=40235

 

昨天, 在微信2群里群友们探讨讨论了MODBUS通讯的问题。起因是棋影大师发表了一篇关于OMRON  PLC 实现MODBUS通讯文章。

 

在群友的讨论过程中,从不少人发表的观点看,看来相当一大部分的同行,对MODBUS协议的认知还很混乱, 有一些甚至是错误的,同时甚至有一些人, 把持有的错误的观点固化认知,还作为知识整理输出出来,影响了更多的人,造成了更大的混乱。

 

所以感觉有必要写出来, 以正视听, 希望能帮助到更多的同行小伙伴。

 

比如有同行表示,寄存器地址的定义:

不超过10000的地址就用40001+,超过10000的用400001+。

 

理由是当超过10000的时候相加成了5xxxx,就错了, 通迅不上了。

 

这种表达就很混乱,误导别人的同时,他自己可能也是这样被另一个二把刀发在某个地方的知识资料误导所致。

 

MODBUS的通讯地址,第一位最高位的0,1,2,3,4等, 是地址区标识,相当于西门子的I, Q,M,V等。 而其实一些日系的PLC也使用数字作为地址区的标识,其实是一样的道理。

 

打一个比方,前面的数字是楼号,而后面的不管XXXX还是XXXXX,都是楼单元内的房间号。


 

 

而至于房间的编号有几位, 最大能到多少号, 完全取决于地产开发商的盖楼能力。对应到PLC或者其他的智能控制器,就是各自存储区的大小。能力大的多预留一点, 能力小的少预留一点,当然小系统需要使用的数量肯定有限,多了也用不上。

 

这些是与MODBUS协议无关的,协议只是规定了这样的一个规范,具体使用由各自厂商分配。 当然,协议本身有个数值上限,65535, 那是由报文的字节数分配决定的。如果真有需要超过这个数值使用, 那就需要升级更改协议了。

 

所以,对一个低层的房间来说,它的编号是不与整个大楼的容量相关的。 即比如235#房间,你可以标识0235#,也可以表示为00235#。头部冠上楼号的时候就是400235, 40235, 或者4235, 都一样, 完全等价。 快递员来送货上门都不会走错。

 

所以这就是题目中说的: 400235=40235,那么顺推,1#房间就是: 400001=40001=4001。然而4001的用法要谨慎使用, 后文会谈及。

 

我们先注意到, 房间号是从1#开始的, 并没有0#房间。 这与我们生活习惯是统一的。

 

然而在实际的通讯报文中,地址区域标识和具体的地址是分开的。 MODBUS协议规定了一系列功能码,用于对不同地址类型区域的访问。读和写,是不同的功能码, 甚至写还会有多个功能码都可以实现,只不过细节功能不同。

 

所以对4XXXX区, 对应的功能码分别是FC03, FC06, FC16。这是十进制的描述, 如果按16进制, 最后一个的功能码就是10H。

 

FC06和FC16的区别在于前者是单个字的写, 而后者是可以写多个字,只不过也可以写1个字, 无非数量定义为1即可。

 

所以最终,RTU侧如果只支持其中一种, 也可以实现通信,也算是满足协议需求。

 

与此类似的是FC23(FC17H), 这个是协议后升级增加的功能码,可以在一次报文问答中同时实现对一个4XXXX数据的读,以及另一个4XXXXX数据区的写,通信效率得到了极大的提升。

 

而任何一个功能码,需要作为数据通信的双方都同时支持才可以使用。比如FC23,如果只有主站/客户端支持是不够的, 必须从站/服务器也支持。而历史上的大多数的RTU基本都不支持。 这是FC23应用很少的原因。

 

同样因为这一点, 通讯的双方在交接通信数据点表的时候, 只提交4XXXX的地址说明,是不够的。 还需要同时表明自己一侧所支持的FC功能码。这就导致一些厂家,在交换数据信息的时候,放弃地址描述,直接只描述功能码+地址偏移量信息了。

 

偏移量以数据区开始算, 首地址的地址是0,后面1,2,3,4,5依次。

 

然而比较重要的是第一个数据,它真实的地址是0,然而标识为1#房间, 即40001。这就导致了地址信息和偏移量差1的问题。 是另一个导致许多同行混乱的原因。

 

即,MODBUS的地址是没有40000这个地址的, 地址的开始就是40001。

 

对一个站号为1的RTU读取其40001的数据的报文开头部分会是:

 

01 03 00 00 ……

 

其中01为站号,03是功能码, 而00 00 就是首地址了。 这就是最大地址不能超过65535的原因。

 

所以, 表达MODBUS通讯的地址会有两种方式,一种是40001, 另一种是FC03/06/16  + 0000。

 

即,如果第一眼看到40001的字样, 首先应该想到是前者, 而不应该理解为是后面的地址偏移量,否则就乱套了。 然而就有许多人因为对协议理解不够深, 总给理解错误。 然而其实也不必要每个人都对协议非常了解。主要是一些公号文章,自己可能都未必了解透彻, 却偏偏爱写什么《专家大神带你十分钟了解MODBUS协议》这样的文章, 最终误导一大片。

 

比如群友发的某一变频器通讯地址的描述截图:

 


看水印是从某豆上下载的。这里面的描述就完全一团糟, 他把2001H换算为8193之后, 得到了48194的地址,然而却又神仙般把这个数变换成16#BC42,我看了后脑子烧了一会儿没转过来,直接就怒了。

 

4是楼号, 是标识符, 这样一锅粥的给转换以后就神仙也不认识了。 这不是精神病吗!

 

然后就有网友问我, 这位作者这样添油加醋添乱, 是为了故意误导学习者吗?我说,估计不是。他本意应该也是好心,也是想尽量把事情说明白,想把信息交代足够详尽。然而无奈自身水平有限,说白了可能就是个二把刀,然而却特别有热心进行技术输出,最终非但不能帮助别人,反而给别人增加了混乱。

 

我发现, 这个行业二把刀的工程师特别多。因为这是个非常容易自证正确的行业。 一些工程师, 即便闭门造车,即便无老师指点,但经过自己的努力,不断地尝试, 也能把系统调试运转成功,只要完成项目, 就可以印证自己思维方法正确。 然后就会把自己的一些错误的混乱的认知当成宝贵经验。然后一次次的成功之后,反而会逐渐强化确认这种认知,等到后来到一定程度, 自己在公司内也做出了一定的业绩, 有了一定的地位,在公司小圈子内甚至成了说一不二的专家,他自己就很难再改变了。 后来即便有机会遇到名师指正,都未必能说服自己内心, 放下面子去虚心接受这种批评。

 

比如行业中就有不少工程师,对MODBUS地址偏移量的认知,就是错的。 竟然以为各设备厂家可以自由定义,而不受协议的文本约定限制。 比如有做上位通讯的IT程序员,竟然会为每个品牌的PLC的MODBUS都单独做一套驱动,甚至整理了各个品牌的偏移量一览表。 就可想而知这种误解之深。

 

更有同行工程师, 认为调试每个设备的时候,需要单独去打设备厂家的服务电话咨询,自然会得到正确答案。 然后把这一条经验也写在了小本本里,也愿意不吝惜地推荐给同行。

 

而在我看来, 如果一套依据通信协议约定的数据表都不能表达交接清楚数据, 还需要再人工口头交流确认的话, 那这个协议就是失败的,不管是数据提供方, 还是采集数据方,都是失败。

 

我自己的工作中,既做过数据提供方, 也做过数据采集方。 曾经公司提供给电厂的设备,需要提供MODBUS数据接口,供给电厂的DCS来读取 。我一开始给的地址是4XXXXX的,然而就有电厂的DCS工程师,千方百计通过我们现场的项目经理, 找到公司,公司又转给我, 问这个偏移量不对,通迅不上。 我一怒之下, 数据表中又增加了2列, 功能码和偏移量都给标上,从此以后就再也无电厂打电话来骚扰了。

 

而一个485网络上的设备会来自多个厂家, 还需要这么挨个儿打电话咨询, 自己首先得烦死。如果是国外进口设备, 还打国际电话不成?所以我自己在做数据采集方的时候,只需要对方给了完备的数据点表,就非常自觉, 尽量不给设备方联系而给人添麻烦。

 

然而,前年做过一个国外著名空压机品牌COMPAIR的数据通讯,还是出了问题。


设备随机提供的资料,地址表里面是4001,然后我理所当然以为就是40001开始的数据区,也没觉得有什么难度就直接用TCP/RTU的网关给转了一下,点表提供给上位的DCS了。然而没想到现场调试的同事反馈说上位是WINCC不能通讯。

 

后来仔细了解并到现场接上电脑调试了才发现, 对方的4001竟然不是地址而是偏移量,而且是16#4001,即十进制的地址是16385,即第一个数据是416386。

 

然而这样转换之后,到了WINCC通讯是有问题的。 因为WINCC的MODBUS TCP通讯驱动需要检测40001来确认通讯正常,而站地址中不存在40001的数据。 所以即便用MODSCAN能扫描到数据,尽管数据能传上来,但对WINCC来说,数据通讯总是错误。

 

就因为这个事,导致我现场多跑了好多次,也又先后换了多个网关,最终才解决。 简直被它恨死。

 

我总结这家厂家的4001的地址的原因, 也是遇到了二把刀的工程师。 可能其单片机的通讯是外包的,开始时在提出数据表的时候是正常的,但没想到二把刀给误解了,给当成偏移量,而且还给转了下数制。但等后来产品已经布及全国客户, 协议表也没法改了,就只能这么一直将错就错下去了。

 

估计全国有用这个COMPAIR品牌空压机的吃亏的工程师不在少数。

 

我说这个二把刀, 说那个也是二把刀,肯定有很多被我打击到的二把刀不服气。 会抬扛说, 你凭啥就指责别人是二把刀,而说不定你自己才是那个二把刀呢!

 

这容易。

 

沟通是化解二把刀的最好的利器。

 

我上面发表的观点,如果有人发现其中的错误, 请毫不犹豫地指出来,如果这篇文章被转发, 转载方也请务必留下原作者【万泉河】的名号,放上我的联系方式:178616417@QQ.COM, 好让读者有机会帮助到我帮我。

 

以开放的心态与人交流, 勇于发现自己的错误, 善于接受错误的指正,并不断提升,才是避免自己闭门造车陷入到二把刀死循环的唯一途径。

 

 

 


0320【万泉河】MODBUS地址:400235=40235 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

网友专栏

共有3375条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。