ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

汇川InoProShop Modbus从站配置避坑指南:从站地址、寄存器映射与通讯排查

汇川InoProShop Modbus从站配置避坑指南:从站地址、寄存器映射与通讯排查 1. 通讯一直失败问题多半不在Modbus本身汇川InoProShop里的Modbus从站配置是很多做PLC编程的人绕不过去的一道坎。我见过太多人梯形图逻辑写得漂漂亮亮Modbus参数也照着手册一项项填了结果上位机一连接就是超时或者数据读上来全是0。折腾半天最后发现是某个不起眼的配置项没对上。这篇文章就把InoProShop里Modbus从站配置的完整链路拆开讲清楚从站地址、寄存器映射、数据区规划、通讯参数匹配每一环都说明白为什么这么设、不这么设会出什么问题。不管你是刚接触汇川PLC的新手还是从西门子、三菱转过来的老手只要你在用InoProShop做Modbus从站这篇内容都能帮你少走弯路。先说一个基本判断Modbus通讯失败九成以上的原因不在协议本身而在配置的细节上。Modbus RTU和Modbus TCP的协议规范几十年没变过稳定得很。问题出在实现层面——从站地址范围搞错了、寄存器地址偏移没算对、数据长度和上位机请求的不一致、串口参数和主站对不上、TCP端口被占用或者防火墙拦了。这些坑每一个我都亲自踩过下面逐个拆解。InoProShop是汇川PLC的编程平台底层基于CODESYS架构所以它的Modbus从站配置逻辑和CODESYS有相似之处但汇川做了不少封装和简化。理解这个背景很重要因为你在网上搜到的CODESYS Modbus配置教程有些步骤在InoProShop里对应不上反过来也一样。我建议你以InoProShop的实际界面为准CODESYS的资料只作为原理参考。2. 从站地址与通讯参数的匹配逻辑2.1 从站地址到底怎么设才不冲突Modbus从站地址的范围是1到2470是广播地址248到255保留。在InoProShop里配置Modbus从站时第一件事就是设从站地址。这个地址必须和主站请求里的地址完全一致差一个数字都不行。我遇到过一种情况有人在InoProShop里把从站地址设成了1但上位机Modbus Poll里默认的Slave ID是1看起来对上了但通讯还是失败。后来发现是他在InoProShop里同时启用了两个Modbus从站实例两个实例的地址都是1内部冲突了。InoProShop允许你添加多个Modbus从站设备每个设备可以独立设地址但同一路物理通讯口上地址不能重复。注意如果你用的是Modbus TCP从站地址在TCP连接建立后其实不太重要因为TCP是靠IP和端口定位设备的。但很多Modbus TCP主站工具仍然会发Slave ID字段这时候从站地址还是要匹配否则从站可能不响应。另外汇川H5U和Easy320系列PLC在Modbus从站地址的配置位置上略有不同。H5U一般在“通讯配置”里的Modbus从站设置中直接填地址Easy320则可能需要在设备树里先添加Modbus从站设备再在设备属性里设地址。这个差异不大但如果你照着H5U的教程去配Easy320可能会找不到对应的菜单。2.2 串口参数波特率、数据位、停止位、校验位Modbus RTU走串口的时候串口参数必须和主站完全一致。波特率常见的有9600、19200、38400、115200数据位一般是8停止位1或2校验位None、Even、Odd都有用。这里有一个很容易忽略的点InoProShop里串口参数的配置位置可能不在Modbus从站设备属性里而是在PLC的串口硬件配置里。也就是说你要先配好物理串口的参数再配Modbus从站的参数。如果物理串口配的是9600Modbus从站设备属性里又设了一个19200那实际生效的是哪个答案是物理串口的配置优先Modbus从站里的串口参数可能被忽略或者冲突。我实测下来汇川的PLC在这一点上处理得比较隐晦建议你两边都设成一样的避免歧义。校验位这块如果你不确定主站用的是什么最稳妥的办法是用串口调试工具先抓一下主站发出的报文看第一个字节和最后一个字节的校验方式。Modbus RTU的报文格式是地址功能码数据CRC校验。CRC是固定的但校验位是串口层面的不影响报文内容。如果你抓到的报文能正常解析出CRC但PLC不响应那多半是串口参数不匹配。2.3 Modbus TCP的端口和连接数限制Modbus TCP默认端口是502。InoProShop里配置Modbus TCP从站时端口号一般默认就是502但你可以改。改端口不是不行但主站那边也要跟着改否则连不上。汇川PLC的Modbus TCP从站有连接数限制。比如H5U系列同时支持的Modbus TCP连接数可能是4个或者8个具体看型号。如果你有多个上位机同时连超过限制后新的连接会被拒绝。这个限制在手册里一般有写但很多人不看等到连不上了才去查。还有一个坑Modbus TCP从站在InoProShop里启用后PLC的以太网口就不能再用于其他TCP通讯了不是不能但端口不能冲突。比如你同时用了Modbus TCP502端口和另一个自定义TCP通讯也用502端口那肯定冲突。换端口或者换协议。3. 寄存器映射从站数据区怎么规划才不乱3.1 四种寄存器类型与InoProShop的对应关系Modbus协议定义了四种寄存器类型线圈Coil可读写1位、离散输入Discrete Input只读1位、保持寄存器Holding Register可读写16位、输入寄存器Input Register只读16位。在InoProShop里配置Modbus从站时你需要把这四种寄存器和PLC内部的变量映射起来。汇川的做法一般是你定义一个数据块或者变量数组然后把Modbus从站的寄存器地址指向这个数组的起始地址。这里最容易出错的是地址偏移。Modbus的寄存器地址从1开始编有些文档从0开始而PLC内部的数组索引从0开始。比如Modbus主站请求读取保持寄存器地址40001对应的是从站的第一个保持寄存器。在InoProShop里你可能需要把这个寄存器映射到数组的第0个元素。如果你映射到了第1个元素那读上来的数据就整体偏移了一个寄存器。我建议你在InoProShop里建一个专门的Modbus映射数据块里面按寄存器类型分四个数组Coil数组、DiscreteInput数组、HoldingRegister数组、InputRegister数组。每个数组的大小根据你的实际需求定但建议留一些余量方便以后扩展。3.2 地址偏移的坑40001到底对应数组的哪个元素这个问题值得单独拿出来说因为太多人在这里翻车。Modbus的保持寄存器地址通常写成4xxxx比如40001、40002。这里的4是寄存器类型标识后面的0001是地址。有些主站工具比如Modbus Poll里你填的地址是40001它实际发出的报文里的地址是0。也就是说主站工具帮你做了减1的操作。但有些工具不是这样你填40001它发出的地址就是40001这时候从站如果按0起始解析就会找不到对应的寄存器。InoProShop里配置从站时你要看清楚它要求的地址格式。有的版本要求你填Modbus地址比如40001有的版本要求你填从0开始的偏移量比如0。填错了主站读上来的数据就是错的或者直接返回异常码。我的经验是先在InoProShop里把映射关系设好然后用Modbus Poll或者Modbus Slave模拟主站发一个读取请求看从站返回的数据和PLC内部变量的值是否一致。如果不一致调整偏移量再试。这个过程可能有点繁琐但一次调通之后后面就顺了。3.3 数据长度和字节序大小端问题Modbus寄存器是16位的但很多实际数据是32位的比如浮点数、双字整数。这时候需要两个连续的寄存器来存一个32位数据。问题来了高16位在前还是低16位在前这就是字节序Endianness问题。Modbus协议本身没有规定字节序由设备厂商自己定。汇川PLC的Modbus从站在处理32位数据时默认可能是高字在前Big-Endian但有些主站工具默认是低字在前Little-Endian。如果你读上来的浮点数明显不对比如应该是25.6读上来是1.2e-38这种离谱的值那多半是字节序反了。解决办法在InoProShop里看看有没有字节序交换的选项或者在主站那边调换高低字。如果两边都不支持交换那就在PLC程序里手动做高低字交换再映射到Modbus寄存器。提示处理浮点数的时候建议先用整数测试。比如你映射一个32位整数到两个寄存器主站读上来看看值对不对。整数对了再换浮点数。这样能把字节序问题和浮点数格式问题分开排查。4. 配置完成后通讯仍然失败的排查链路4.1 第一步确认物理层和网络层是通的通讯失败先别急着改Modbus配置。第一步永远是确认物理层和网络层没问题。如果是Modbus RTU检查串口线接对了没有。A接AB接BGND接GND。我见过有人A和B接反了通讯死活不通换了线就好了。另外如果是RS485终端电阻有没有接长距离通讯的时候终端电阻不接信号反射会导致通讯不稳定。如果是Modbus TCP先ping一下PLC的IP地址看能不能通。ping不通那就不用往下查了先解决网络问题。ping通了再用telnet或者端口扫描工具看看502端口是不是开放的。如果502端口没开那说明Modbus TCP从站没启动或者端口被改了。4.2 第二步用调试工具抓报文物理层通了之后下一步是抓报文。Modbus RTU用串口调试助手Modbus TCP用Wireshark或者Modbus Poll自带的调试功能。抓报文的目的看主站发出的请求报文长什么样从站有没有回复回复的报文是什么。如果主站发了请求从站完全没回复可能的原因从站地址不匹配、串口参数不匹配、从站没启用、物理连接问题。如果从站回复了异常码比如功能码的最高位置1比如03变成83那说明从站收到了请求但无法处理。异常码的含义01是非法功能码02是非法数据地址03是非法数据值04是从站设备故障。根据异常码去查对应的配置项。如果从站回复了正常报文但数据不对那就是寄存器映射或者字节序的问题回到上一章去排查。4.3 第三步检查InoProShop里的从站使能和任务配置InoProShop里配置完Modbus从站后有一个很容易忽略的步骤从站设备需要被使能而且可能需要绑定到某个任务周期。有些汇川PLC的Modbus从站是作为后台任务运行的不需要你手动调用功能块。但有些型号需要你在程序里调用一个Modbus从站处理功能块并且把这个功能块放在一个循环任务里。如果你忘了调用从站就不会响应。另外任务周期也会影响通讯。如果Modbus从站处理任务周期太长比如100ms那主站的请求可能超时。一般建议Modbus从站处理任务周期在10ms以内越快越好。4.4 第四步排查端口冲突和资源占用Modbus TCP从站占用了502端口如果你在PLC程序里还开了其他TCP服务端口不能冲突。另外有些汇川PLC的以太网口同时用于编程下载和Modbus TCP通讯下载程序的时候Modbus TCP可能会断开这是正常的。还有一个隐蔽的问题如果你在InoProShop里同时启用了Modbus RTU从站和Modbus TCP从站而且它们映射到了同一片数据区可能会出现数据竞争。两个从站同时读写同一片寄存器数据可能不一致。建议分开映射或者只启用一个从站。5. 几个真实案例从失败到成功的完整过程5.1 案例一H5U做Modbus RTU从站上位机读不到数据有个朋友用H5U做Modbus RTU从站上位机是组态软件。配置完之后组态软件一直显示通讯超时。排查过程先用串口调试助手代替组态软件发了一个03功能码的请求读保持寄存器40001开始的两个寄存器。从站没回复。检查串口参数发现H5U的串口配置里波特率是19200但组态软件里设的是9600。改成一致后从站回复了但数据全是0。继续排查检查寄存器映射发现他把保持寄存器映射到了一个未初始化的数组。数组里的值默认是0所以读上来是0。在PLC程序里给数组赋了初值再读数据正常了。这个案例的教训串口参数两边必须一致寄存器映射的数组要初始化。5.2 案例二Easy320做Modbus TCP从站连接数超限另一个案例是Easy320做Modbus TCP从站同时有3个上位机连接。前两个连接正常第三个连不上。查手册发现Easy320的Modbus TCP从站最大连接数是2。超过2个连接新的会被拒绝。解决办法要么减少上位机数量要么换支持更多连接的型号要么用Modbus TCP网关做中转。这个案例的教训选型的时候要看清楚Modbus TCP连接数限制别等到现场才发现不够用。5.3 案例三浮点数读写字节序不一致第三个案例是读写浮点数。PLC里定义了一个REAL变量映射到两个保持寄存器。上位机读上来值完全不对。排查先用整数测试映射一个DINT到两个寄存器上位机读上来值也不对。说明是字节序问题。在InoProShop里找到字节序设置改成和上位机一致再读整数对了。然后换回浮点数也对了。这个案例的教训字节序问题先用整数排查确认字节序对了再处理浮点数。6. 配置之外的进阶注意事项6.1 数据刷新频率和通讯负载的平衡Modbus从站的数据刷新频率取决于PLC的任务周期和主站的轮询周期。如果主站轮询太快比如10ms轮询一次而PLC的Modbus处理任务周期是50ms那主站可能会读到旧数据或者超时。建议主站的轮询周期至少是PLC Modbus任务周期的2倍以上。比如PLC任务周期20ms主站轮询周期设50ms或100ms。这样既能保证数据及时刷新又不会给PLC太大压力。另外如果从站数据量大比如几百个寄存器主站一次性读这么多寄存器报文会很长通讯时间也会增加。建议分批次读每次读几十个寄存器减少单次通讯的压力。6.2 掉线重连和异常处理工业现场的网络和串口通讯掉线是常态。Modbus从站本身不处理重连重连是主站的事。但作为从站你可以在PLC程序里做一些异常处理。比如如果Modbus从站检测到通讯异常可以置一个标志位让主程序知道通讯出了问题。或者如果从站数据是关键数据可以在通讯恢复后做一次数据同步。InoProShop里有没有现成的Modbus通讯状态变量有的版本有有的没有。如果没有你可以通过判断主站请求的超时来间接判断。比如如果超过一定时间没有收到主站请求就认为通讯断了。6.3 和CODESYS Modbus从站配置的差异前面提到过InoProShop基于CODESYS但Modbus从站配置有差异。主要差异在设备添加方式CODESYS一般在设备树里添加Modbus Slave设备InoProShop可能是在通讯配置里直接启用。寄存器映射方式CODESYS用功能块或者IO映射InoProShop可能用数据块映射。任务绑定方式CODESYS需要手动调用Modbus从站功能块InoProShop可能自动处理。如果你从CODESYS转过来别照搬CODESYS的步骤以InoProShop的实际界面为准。反过来如果你以后要用CODESYS也要注意这些差异。7. 我个人的几条实操心得第一条配置Modbus从站之前先把主站工具准备好。Modbus Poll和Modbus Slave这两个工具一个做主机一个做从机调试的时候非常有用。你可以用Modbus Slave模拟一个从站先确认主站工具本身没问题然后再去配PLC。这样能把问题范围缩小。第二条每次只改一个配置项。Modbus配置涉及很多参数如果你一次改好几个改完通讯通了你也不知道是哪个改动起了作用。下次再遇到问题还是不知道怎么排查。所以改一个测一次确认有效再改下一个。第三条把配置参数记下来。从站地址、串口参数、寄存器映射表、字节序设置这些参数配好之后写个文档存起来。下次换PLC或者换项目直接照着配不用重新试错。第四条别忽视PLC的固件版本。不同固件版本的InoProShopModbus从站的行为可能有差异。比如某个版本修复了一个字节序的bug你升级固件后原来的配置可能就不对了。升级固件前先看看更新日志里有没有Modbus相关的改动。第五条如果实在搞不定用串口调试助手或者Wireshark抓报文把报文发到技术社区里问。报文是最直接的证据比你说“通讯不上”有用得多。汇川的技术支持也能根据报文快速定位问题。最后再分享一个小技巧InoProShop里有一个在线监控功能可以实时查看PLC内部变量的值。配置Modbus从站的时候你可以一边用主站读数据一边在InoProShop里监控映射的数组看数据有没有变化。如果主站读上来的数据和InoProShop里监控到的数据不一致那问题就在通讯链路上如果一致那问题就在主站那边。这个技巧能帮你快速定位问题在哪一侧。
返回列表