勇哥注:
modbus是主从模式(master/slave)。
以服务端/客户端来做比喻的话,slave就是服务端,master就是客户端。
game4automation支持modbus接口。
但是只支持做从站,即做Slave端,而不是做Master端。
并且modbus缺省会使用本机IP, 端口号固定502不能修改。
添加方式如下图所示:
(图1)
下图是添加好的Modbus接口。
Is Connected 是只读量,指示master端是否正常连接
Is Server 这个应该是没有作用。因为这个接口只支持slave端。
Connected Clients 看上去能修改,但其实是个只读量,表示已经链接上的master端数量。
(图2)
因为modbus只传递bool量和int数。
因此是需要定义如何解释这些传过来的数据。就是说,如何解释bits和bytes。
因此game4automation提供了ModbusData组件,用于解释数据。
mdobus data组件如下图:
(图3)
(图4)
(图5)
添加一个Modbus接口,然后看到它自动生成一组modbus data。
这些子项目如果用不着可以删除。
如果要自己新建项目,可以先添加一个空对象,然后先添加一个PLC Input Bool等之类的组件,再添加Modbus Data组件。
(一)可读可写的继电器
(1.1)unity修改modbus poll中的值
PLCInputBool-OutputCoil1---3,这3个是game4automation给我们自动创建的3个可读可写的继电器。
我们打开Modbus Poll,创建一个通讯窗口,功能码置为“01 Read Coils“。
这个时候你在unity这边可以单击开关继电器(true为开,false为关),就可以看到modbus poll那边发生了变化。
但是你如果在modbus poll那边修改继电器状态,是没有效果的。
经过测试,无论你是用功能码01、05、15都无法在modbus poll这边修改unity那边的继电器状态。
你无法在modbus poll这边双击单元格修改状态。
(1.2)modbus poll中修改unity的值
如果想modbus poll可以修改unity这边的继电器,需要改成PLCOutputBool-OutputCoil1,如下:
这个时候再试试,就可以发现modbus poll这边可以控制unity的继电器了。
在unity这边,注意下面的操作:
只有当(Flase)是缩进状态的时候,在modbus poll那边的更新才会反馈过来。
而当(Flase)是非缩进的时候,则是鼠标单击切换true/false,此时结果会更新到modbus poll那边去。
(二)输入(只读)继电器
先添加一个PLC Input Bool,再添加Modbus data.
mdobus poll那边使用功能码02。
测试的时候在modbus poll那边改状态没有意义,而是要在unity这边鼠标单击(True)来切换状态,
就可以看到modbus poll那边会同步更新状态的改变。
反过来使用modbus poll 更新unity这边是没有效果的。
(三)可读可写的寄存器
(3.1) modbus poll修改unity的值
我们在modbus poll那边是可以修改值的,可以看到unity这边就变化了。
(3.2) unity修改modbus poll的值
如果要反过来,unity这里改值,modbus poll那边起变化。
则必须是:PLCInputInt OutputRegister的组合:
而且有一个关键是Modbus Data中的数据类型必须是INT,而不能是SHORT,这个很奇怪,暂时不知道为啥子。
如下图所示:
通过改变PLC Input Int的Value,就可以把变化通过modbus发给modbus poll。
(四)输入寄存器
需要PLC Input Int+ Input Register的组合,如下图:
同理,如果反过来,从modbus poll修改unity中的值,是不可以的。
(五)其它数据类型
(5.1)Float类型
采用 PLC Output Float+ Modbus Data Float 的组合。如下图:
注意这个Register Address 为0,而不是1。这个地方跟short类型有些区别。
通过mdobus poll 发过来的浮点数可以被接收,如下图:
但是有个问题,小数点后面有几位是无效的。
下图的例子中,如果你modbus poll发3,那么unity收到也是3。
如果发小数3.48,unity这边收到3.46875
如果发小数3.99, unity这边收到3.984375
所以貌似只保证小数点后第1位是正确的,后面位都不对。
如果轴运动时,发的小数是mm,不是脉冲的话,那这个精度就有问题了。
这又是个未解之谜的问题。
注: 网上搜了一下“modbus通讯 浮点数精度”的问题,发现这是大家常遇到的问题。
因此应该不用怀疑game4automatic这边有什么bug。
例如下面这位老兄遇到的情况就跟我们的一样:
(5.2)bit类型
可以操作byte、bool类型的位。因为这两种数据类型都是一个字节表示的。
因此可以操作0-7,共8个位。
请看下图中,勇哥的操作,你就明白了。
受限于game4automatic中对于数据类型的支持只有下图所示这几种。
所以像ascii字符这种数据类型,就需要你收到后自行处理了。
(五)总结
Modbus支持四种存储区,如下图所示:
输出寄存器区(可读可写)
输入寄存器区(只读)
输出继电器区(可读可写)
输入继电器区(只读)
(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)

