勇哥注:
这篇继续说一下这两款软件的应用。
系列贴子:
Modbus Poll和Modbus slave软件应用(一)
Modbus Poll和Modbus slave软件应用(二)
先说下Modbus Slave软件
(一)软件线程多开
如果想启动多个Modbus Slave或者Modbus Poll读写线程,其实没必须运行多个程序副本。
这个软件是mdi窗口的,你能过菜单中的new可以启动多个服务端板。
(二)Slave Definition 面板
单元格右键菜单,或者顶层菜单,都可以找到这个面板。
它用来设置slave工作时的数据格式、一些功能之类的属性。
Function 列表的就是4种存储区名称,对应下表:
modbus中只能表达两类数据,一是bool值的线圈,二是非bool值的寄存器,它表示数值。
面板其它参数意思:
Slave ID:可以配置从机地址
Address:可以配置读/写的寄存器/线圈起始地址
Quantity:可以配置读/写的寄存器/线圈个数,就是一次可以读取多个地址。
Rows:可以选择该窗口一列可以显示多少行,数字是对应的行数,
最后一个选项"Fit to Quantity"是可以根据前面设置的"Quantity"数量自动匹配行数。
Hide Alias Columns:可以选择是否隐藏"Alias"列。
PLC Addresses(Base 1):可以选择通信的基地址是从0开始还是从1开始。
Error Simulation(故障模拟)
Skip response:跳过响应,目前实测是主机每发10帧,Slave这边会有一帧不回。
Insert CRC/LRC error:插入CRC/LRC错误,目前实测是主机每发10帧,Slave这边会有一帧返回错误CRC/LRC校验。
Response delay:延迟回复时间,可以设置接收到数据后延时回复的时间。
Return exception 06. Busy:返回设备繁忙状态,即故障码06。
(三)Modbus Slave界面的功能操作
(1)双击单元格可以修改值。
勾选Auto increment 可以模拟心跳包方式自动累加更新值。
(2)值的注释,就是Alias
(3)Format是数据类型
可以跟踪使用场景切换数据类型,这个可以理解为只是本地方便查阅的格式。
可以选择多个单元格一次修改。
(4)可以修改单元格本色
(5)窗口状态栏
(6)查看收发报文
(四)Modbus Slave的使用经验
1、工具所保存的窗口文件,不同版本的窗口文件只能做到向上兼容,也就是低版本做的窗口文件,
可以在高版本的软件里打开,但高版本的软件做的窗口文件,则无法在低版本软件中打开。
2、软件内的保护机制并不全,比如软件下发一条读10个寄存器的指令,
从机设备给它回复100个寄存器的CRC校验正常的指令,软件并不会报错。
如果要做一些保护设计,可以参考FreeModbus的设计,相对较全。
3、这个工具上的一些时间设置,当时间设置较短时,可能不准。
比如以前试过把每一帧的发送间隔时间调成1ms,但实际用示波器抓到的数据,间隔大概100ms左右,
基本低于100ms的都实现不了。这个可能跟电脑本身性能有关系,
所以要注意不要太过于相信这里面的时间设置,最好以实际的为主。
4、正常连接通信的情况下,直接断开当前通信Com口的USB线,有些电脑可能会死机蓝屏。
如果没死机,再把USB线插回去,在不重连的情况下,当前窗口可能会保持原本的错误通信状态。5、这个不像Modbus Poll工具做了那么多故障的判断,如果出现一些通信异常,
基本需要查看原始通信报文人为判断问题。
6、因为这个软件是在window系统上运行的,当系统卡顿时,可能会影响软件的运行,
表现出来就是可能会连续收到几帧主机发过来的报文不回复,或者查看的报文有异常。
Modbus Poll或其他串口调试工具也会有类似的问题。
(五)Modbus Slave的其它参考资料:
这篇文章有动图演示Modbus Slave的操作。
https://www.cnblogs.com/ybqjymy/p/18021257
下面是Modbus Poll的使用说明
(一)状态栏
Tx = 0表示向主站发送数据帧次数,图中为0次;
Err = 0表示通讯错误次数,图中为0次;
ID = 1表示模拟的Modbus子设备的设备地址,图中地址为1;
F = 03表示所使用的Modbus功能码,图中为03功能码;
SR = 1000ms表示发送周期,1S一次。
红字部分,表示当前的错误状态,“No Connection”表示未连接状态。
(二)读写定义
Slave ID为要访问的Modbus从机的地址,
Function 功能码的选择,
Address 为寄存器起始地址,根据功能码的不同,访问地址不同,这里默认是Protocol address地址,
可以勾选下面的Plc address(Base 1)选择地址从1开始。
Quantity:为访问寄存器个数。
Scan Rate为读取数据周期,轮询发送,单位毫秒。
Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:
(三)Functions菜单
这都是些快速测试工具。
下面工具条上也有对应的快捷方式。
在使用这些工具的时候,确保已经连接到Slave端。并且禁用工作窗口的动作。
否则测试的时候,会看到你的操作会被工作窗口干扰。
禁用功能在顶层的Setup菜单中,如下图所示:
它会对你当前激活的窗口生效,而不是禁用全部窗口功能。
如下图所示,第15号功能的测试面板:Wirte Multiple Coils,写多个线圈。
Modbus的多存储区的同时读写
下图是一个线圈+一个寄存器读写。
他们通过ID来区分读写通道。
同一种类型的存储区,也可以有多个线程分段同时读写。
例如下面,功能码03,poll端的两个窗口,同时读写1-10地址,11-20地址
对于上面的测试,每一个Slave或者Poll的窗口,我们可以理解为一个线程。
所以这里讨论的就是多线程访问的问题。
经过实际测试,大家要注意的情况如下:
(1)如果Poll开N个窗口,轮询Slave端对应的N个窗口,而这N个窗口都是同一种存储区,而且地址也相同
这种情况下是不可以的,只有一个Slave窗口的数值会响应更新,但是软件也不会报错。
如下图所示:
两个poll窗口都是操作的30001地址,理论上来讲,Slave的两个窗口因为也都是监视的30001地址的内容,
但是我们观察到Mbslave1窗口有更新,而Mbslave5不更新。
还是这种情况,我们只要把操作的地址改得不一样(不要有交集),则是没有问题的。
比如MBslave1操作30001开始的10个地址,而Mbslave5操作30011开始的10个地址。(当然同时roll那边也需要这样修改)
(2)如果不同窗口的ID不同,那们他们即使操作同一个存储区,同一段地址,也不会有问题。
如下图所示:
同样是写30001,但是ID=1, ID=2是不会干扰的。
这就好像modbus的存储区按id进行了隔离,有多少个id,就有多少个存储区的副本。
当然这是实验结果的比喻,实际上并没有官方文档有明确说明。
最后站在程序员角度的总结一下modbus用于软件之间通讯的好处:
modbus可以直接代替常见的socket通讯,用于软件与软件之间的通讯,效果更好。
你会拥有什么样的能力呢?
(1)你的软件做为Slave端,自动拥有四个数组空间,每个数组65536个元素
你可以按ID新建多组这样的四个数组。即存储区是二维的。
(2)2个数组是bool型,2个数组是int型
(3)2个bool型数组,一个是只读,一个是可读可写。同样两个int型数组也是一个只读,一个可读可写。
(4)不同的数组可以被不同的客户端访问;即使对于同一个数组的,N个客户端可以同时访问不同的连续区域。
(5)客户端对可读可写类型的数组进行值的更改,Slave端会接收到数值改变的事件通知
(6)Slave端对只读数组数值的修改,客户端会收到数据改变的事件通知
(7)通过第三方编程方式实现通过int型,表达出浮点数、ASCII字符、汉字等多种数据类型。可以理解为可以直接发送以上数据类型。
(8)Slave端和客户端可以跨电脑通讯,或者进行本地通讯。
(9)可以报告通讯异常的各种错误。

