勇哥注:
下面是一个综合的例子,通过一个杜撰的设备,演示了gam4automation的能力。
为了完成这个例子,还需要配合一些自定义脚本,以及做为上位机的C#程序。
完整的设备见下图:
设备是一个分拣设备。
上下料的轴有x, z轴。分拣的轴是u轴。
这个例子勇哥只是弄了个简单的示意场景,并没有导入cad图纸。
仿真这边实现了下面的功能:
(1)传送带
(2)x, z, u轴
(3)工位上的双控气缸
(4)吸嘴上的真空与破真空
(5)取料与放料
(6)回原
按原点与正负限位感应编制的回原动作。
(7)相机拍照显示
(8)调试功能的支持
设备整体速度、进出料盒、控制按钮等。
(9)通讯
使用了modbusTcp通讯。
上位机部分是C#写的,实现了下面的功能:
(1)单步调试,比如jog, ptp运动。
(2)单步动作
(3)输入也输出IO的监视与调试
(4)控制面板
实现了启动、复制、暂停、急停。
还可以做“场景复位”,它相当于仿真器重新播放。
(5)游戏时间快慢调节
用于加快设备的动作,而不用单独调轴的速度。
一些有意义的点:
(1)整个例子采用了实控虚
外部采用上位机C#程序控制,因此是实控虚的方式
如果想虚控实,在这个例子里并没有什么意义不是那么大。实体如果是个物理设备的话,实现虚控实更有意义些。
这个例子没有做虚控实。
(2)整体速度调节的意义
这个例子的那个速度调节滑块,使用了unity的游戏时间缩放,通过把游戏时间标准缩短,加快了游戏整体的速度。
这个功能会带来想不到的好处,就是不用调轴的速度,就可以实现整体速度的变化。
整体速度变化后,通讯也会跟着频率变快,可以用来测试设备在极速的情况下,通讯的可靠性。
(3)modbusTCP通讯
modbus通讯说起来很简单,但是其实对于master端的调用者来说,问题很多。
这个例子中,unity端是Slave,C#端是Master。
unity端的Slave,是game4automation自带的。
C#端的Master得你自己去开发。由于你使用的组件不同、多线程调用、调用频率等方面的原因,一顿乱搞下来,多半会出现通讯错误。
这方面,勇哥会出一个专门的贴子。(实际上这个例子,也出现偶发的通讯错误)
(4)关于轴的回原
Drive组件是没有轴回原的功能的,你得依据原点、限位感应器自己去实现。
这个例子只实现了轴在原点左边的时候的普通回原模式(即向负方向碰到原点感应就停止下来)。
这种方式下,会出现每次回原结束后不可能刚好到0后停止,而是出现小数点的情况,因此回成功后还得把位置置位到0。
(5)场景复位
这个功能十分有必要的。
它的实现思路是,清除掉全部mu、重新载入场景。
(6)轴停止
这个需要Drive组件的那个stop,配合其它的运动方法的停止。
这是一个要摸索的点。
(7)吸真空与破真空
这个实际上是picker组件的应用。
让picker失能实际上就等于破真空。
(8)jog和ptp运动
这两者其实是有冲突的,我们通过禁用/启用 ptp相关的组件的方式完成。
(9)mu重力下滑
这实际上unity端的物理设置,需要对mu和滑板都做物理材质,以确定其摩擦系数。
如果不做,mu掉在滑板上去,却滑不下去。
(10)ccd拍照
可以为ccd这个游戏对象,配置一个摄像机,摄照的过程就是把摄像机视图看到内容保存为贴图,并贴到一个对象上去。
这个例子中放了3块cube,就是用来显示拍照的内容。
(11)按钮
这个例子中,unity端的按钮,实际上是作为一个显示效果。
C#这边按了按钮后,unity端做为回显。
(12)设备调试功能
这是非常有意义的功能,为了它,我们在输出IO里增加了许多IO,以支持调试功能。
我们需要下面这样的调试能力:
1)可以拽住物料
可以拉住物料,让进料超时,或者把物料抛掉,以此来验证逻辑是否考虑到了这一点。
这种能力,目前是依赖unity编辑器,导出独立exe后,则没有。
2)可以随时破真空
物料吸起后,破掉它的真空,模拟物料掉了,以此来验证逻辑的防呆。
3)可以抽出物料盒
设备在运行中,人工会进行一些操作,本例子中,就是抽出物料盒。

