game4automation教程(十七) Modbus接口

勇哥注:

modbus是主从模式(master/slave)。

以服务端/客户端来做比喻的话,slave就是服务端,master就是客户端。



game4automation支持modbus接口。

但是只支持做从站,即做Slave端,而不是做Master端。

并且modbus缺省会使用本机IP,   端口号固定502不能修改。


添加方式如下图所示:

image.png

(图1)


下图是添加好的Modbus接口。

Is Connected    是只读量,指示master端是否正常连接

Is Server  这个应该是没有作用。因为这个接口只支持slave端。

Connected Clients   看上去能修改,但其实是个只读量,表示已经链接上的master端数量。

image.png

(图2)

因为modbus只传递bool量和int数。

因此是需要定义如何解释这些传过来的数据。就是说,如何解释bits和bytes。

因此game4automation提供了ModbusData组件,用于解释数据。


mdobus data组件如下图:

image.png

(图3)

image.png

(图4)

image.png

(图5)


添加一个Modbus接口,然后看到它自动生成一组modbus data。

image.png

这些子项目如果用不着可以删除。

如果要自己新建项目,可以先添加一个空对象,然后先添加一个PLC Input Bool等之类的组件,再添加Modbus Data组件。


(一)可读可写的继电器


(1.1)unity修改modbus poll中的值

image.png


PLCInputBool-OutputCoil1---3,这3个是game4automation给我们自动创建的3个可读可写的继电器。

我们打开Modbus Poll,创建一个通讯窗口,功能码置为“01 Read Coils“。

这个时候你在unity这边可以单击开关继电器(true为开,false为关),就可以看到modbus poll那边发生了变化。

image.png


但是你如果在modbus poll那边修改继电器状态,是没有效果的。

经过测试,无论你是用功能码01、05、15都无法在modbus poll这边修改unity那边的继电器状态。

你无法在modbus poll这边双击单元格修改状态。


(1.2)modbus poll中修改unity的值


如果想modbus poll可以修改unity这边的继电器,需要改成PLCOutputBool-OutputCoil1,如下:

image.png

这个时候再试试,就可以发现modbus poll这边可以控制unity的继电器了。

m7.gif

在unity这边,注意下面的操作:

只有当(Flase)是缩进状态的时候,在modbus poll那边的更新才会反馈过来。

而当(Flase)是非缩进的时候,则是鼠标单击切换true/false,此时结果会更新到modbus poll那边去。

m8.gif



(二)输入(只读)继电器

先添加一个PLC Input Bool,再添加Modbus data.

image.png


mdobus poll那边使用功能码02。

测试的时候在modbus poll那边改状态没有意义,而是要在unity这边鼠标单击(True)来切换状态,

就可以看到modbus poll那边会同步更新状态的改变。

反过来使用modbus poll 更新unity这边是没有效果的。

act10.gif


(三)可读可写的寄存器


(3.1)  modbus poll修改unity的值

image.png

我们在modbus poll那边是可以修改值的,可以看到unity这边就变化了。

image.png


(3.2)  unity修改modbus poll的值

如果要反过来,unity这里改值,modbus poll那边起变化。

则必须是:PLCInputInt OutputRegister的组合:

而且有一个关键是Modbus Data中的数据类型必须是INT,而不能是SHORT,这个很奇怪,暂时不知道为啥子。

如下图所示:

通过改变PLC Input Int的Value,就可以把变化通过modbus发给modbus poll。

act12.gif



(四)输入寄存器


需要PLC Input Int+ Input Register的组合,如下图:

image.png


image.png

同理,如果反过来,从modbus poll修改unity中的值,是不可以的。


(五)其它数据类型


(5.1)Float类型

采用 PLC Output Float+ Modbus Data Float 的组合。如下图:

image.png

注意这个Register Address 为0,而不是1。这个地方跟short类型有些区别。


通过mdobus poll 发过来的浮点数可以被接收,如下图:

但是有个问题,小数点后面有几位是无效的。

下图的例子中,如果你modbus poll发3,那么unity收到也是3。

如果发小数3.48,unity这边收到3.46875

如果发小数3.99, unity这边收到3.984375

所以貌似只保证小数点后第1位是正确的,后面位都不对。

如果轴运动时,发的小数是mm,不是脉冲的话,那这个精度就有问题了。

这又是个未解之谜的问题。

image.png

注: 网上搜了一下“modbus通讯 浮点数精度”的问题,发现这是大家常遇到的问题。

因此应该不用怀疑game4automatic这边有什么bug。

例如下面这位老兄遇到的情况就跟我们的一样:

image.png


(5.2)bit类型

  可以操作byte、bool类型的位。因为这两种数据类型都是一个字节表示的。

  因此可以操作0-7,共8个位。

  请看下图中,勇哥的操作,你就明白了。

act13.gif


受限于game4automatic中对于数据类型的支持只有下图所示这几种。

所以像ascii字符这种数据类型,就需要你收到后自行处理了。

image.png


(五)总结


Modbus支持四种存储区,如下图所示:

输出寄存器区(可读可写)

输入寄存器区(只读)

输出继电器区(可读可写)

输入继电器区(只读)

image.png


(1)输出寄存器区(可读可写)

modbus poll-->unity          PLCOutputInt  OutputRegister(short)

unity--> modbus poll         PLCInputInt  OutputRegister(int)


(2)输入寄存器区(只读)

unity--> modbus poll         PLCInputInt  InputRegister(short)


(3)输出继电器区(可读可写)

modbus poll-->unity          PLCOutputBool   OutputsCoils(bool)

unity--> modbus poll         PLCInputBool   OutputsCoils(bool)


(4)输入继电器区(只读)

unity--> modbus poll     PLC Input Bool  InputsCoils(bool)



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

发表评论:

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

会员中心
搜索
«    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