Modbus Poll和Modbus slave软件应用(二)

勇哥注:

这篇继续说一下这两款软件的应用。


系列贴子:

Modbus Poll和Modbus slave软件应用(一)

http://47.98.154.65/?id=2494


Modbus Poll和Modbus slave软件应用(二)

http://47.98.154.65/?id=2528



先说下Modbus Slave软件


(一)软件线程多开

 如果想启动多个Modbus Slave或者Modbus Poll读写线程,其实没必须运行多个程序副本。

 这个软件是mdi窗口的,你能过菜单中的new可以启动多个服务端板。


image.png



(二)Slave Definition 面板

单元格右键菜单,或者顶层菜单,都可以找到这个面板。

它用来设置slave工作时的数据格式、一些功能之类的属性。

image.png


image.png

Function 列表的就是4种存储区名称,对应下表:

modbus中只能表达两类数据,一是bool值的线圈,二是非bool值的寄存器,它表示数值。

image.png

面板其它参数意思:

   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 可以模拟心跳包方式自动累加更新值。

image.png


(2)值的注释,就是Alias

image.png


(3)Format是数据类型

可以跟踪使用场景切换数据类型,这个可以理解为只是本地方便查阅的格式。

可以选择多个单元格一次修改。

image.png


(4)可以修改单元格本色

image.png


(5)窗口状态栏

image.png


(6)查看收发报文

image.png



(四)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的使用说明



(一)状态栏

image.png

Tx = 0表示向主站发送数据帧次数,图中为0次;

Err = 0表示通讯错误次数,图中为0次;

ID = 1表示模拟的Modbus子设备的设备地址,图中地址为1;

F = 03表示所使用的Modbus功能码,图中为03功能码;

SR = 1000ms表示发送周期,1S一次。

红字部分,表示当前的错误状态,“No Connection”表示未连接状态。



(二)读写定义


image.png


Slave ID为要访问的Modbus从机的地址,

Function 功能码的选择,

Address 为寄存器起始地址,根据功能码的不同,访问地址不同,这里默认是Protocol address地址,

  可以勾选下面的Plc address(Base 1)选择地址从1开始。

Quantity:为访问寄存器个数。

Scan Rate为读取数据周期,轮询发送,单位毫秒。

Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:

image.png


(三)Functions菜单

这都是些快速测试工具。

image.png

下面工具条上也有对应的快捷方式。

image.png


在使用这些工具的时候,确保已经连接到Slave端。并且禁用工作窗口的动作。

否则测试的时候,会看到你的操作会被工作窗口干扰。

禁用功能在顶层的Setup菜单中,如下图所示:

它会对你当前激活的窗口生效,而不是禁用全部窗口功能。

image.png

如下图所示,第15号功能的测试面板:Wirte Multiple Coils,写多个线圈。

image.png




Modbus的多存储区的同时读写

下图是一个线圈+一个寄存器读写。

他们通过ID来区分读写通道。


image.png

同一种类型的存储区,也可以有多个线程分段同时读写。

例如下面,功能码03,poll端的两个窗口,同时读写1-10地址,11-20地址

image.png


对于上面的测试,每一个Slave或者Poll的窗口,我们可以理解为一个线程。

所以这里讨论的就是多线程访问的问题。

经过实际测试,大家要注意的情况如下:

(1)如果Poll开N个窗口,轮询Slave端对应的N个窗口,而这N个窗口都是同一种存储区,而且地址也相同

         这种情况下是不可以的,只有一个Slave窗口的数值会响应更新,但是软件也不会报错。

         如下图所示:

         两个poll窗口都是操作的30001地址,理论上来讲,Slave的两个窗口因为也都是监视的30001地址的内容,

         但是我们观察到Mbslave1窗口有更新,而Mbslave5不更新。

         image.png


         还是这种情况,我们只要把操作的地址改得不一样(不要有交集),则是没有问题的。
         比如MBslave1操作30001开始的10个地址,而Mbslave5操作30011开始的10个地址。(当然同时roll那边也需要这样修改)

         


(2)如果不同窗口的ID不同,那们他们即使操作同一个存储区,同一段地址,也不会有问题。

         如下图所示:

         同样是写30001,但是ID=1, ID=2是不会干扰的。

         image.png

         这就好像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)可以报告通讯异常的各种错误。




本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2024-10-22 10:53:32 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864