Unity + HMI
一、前言
该项目的重点是通过OPC UA进行客户端-服务器通信的简单演示,该演示在Unity3D中实现(服务器- B&R Automation PLC,客户端- Unity3D)。该项目展示了数字孪生的分拣机与一些额外的功能。该应用程序使用多线程编程进行性能优化。
此解决方案可用于控制真实的机器或对其进行模拟(Automation Studio模拟/真实的PLC)。使用X20 CP 1584 PLC在模拟上测试了Unity3D应用程序。可以使用另一个OPC UA服务器,但要符合某些原则(输入/输出节点)。
该应用程序的主要思想是使用XYZ操纵器和另一个轴(相机输送机)来对多个对象进行排序。为了对物体进行目视检查,我们使用带有附加光源的2D摄像头,整个控制程序(轴控制、报警处理、物体的连接/拆卸等)都在PLC(OPC UA服务器)上编程。Unity3d 应用程序用于可视化场景、操作对象以及获取有关对象类型的信息。该应用程序还使用一个软件包(人机界面- mappView)进行数据可视化。这些数据可以在PC面板上本地查看,也可以使用标准Web浏览器在任何设备上远程查看(mappView中的数据管理完全基于OPC UA)。
二、Unity脚本分析
2.1 UI脚本
用于控制一个用户界面(UI)与其相应行为的交互操作。
变量:UI中的相机对象,UI中的图片组件,用于显示连接面板、诊断面板和连接信息,文本输入字段,用于输入IP地址,一个私有浮点变量,可能用于控制UI元素的展示位置或其他设置。显示XYZ机械手的位置和速度信息、显示相机输送器的位置和速度信息、显示连接信息的文本
Start方法(初始化方法)定义:
初始设置连接信息图片为红色,并将文本设置为“Disconnect”。
设置连接面板和诊断面板的初始位置。
初始化XYZ操控器和相机输送器的位置和速度显示为“0.00”。
IP地址设置为“127.0.0.1”(通常代表本机地址)。
Update方法(周期函数)定义:
从通过UI输入字段读取IP地址并更新全局变量。
控制连接按钮的颜色(绿色表示连接,红色表示断开)和文本。
循环读取并将全局变量中的XYZ机械手和相机输送器的位置与速度参数显示在对应的UI文本上。
其他方法:
应用退出时销毁这个脚本的实例
控制连接面板的显示和隐藏。
控制诊断面板的显示和隐藏。
控制相机视图位置和角度的变更方法,分别对应不同的视角。
处理连接和断开按钮被按下时的事件,更新全局连接控制变量
2.2 数据处理类(OPC UA客户端)
存储全局变量的主控静态类:包含OPC UA配置参数,用于读写操作的启用状态 以及连接状态 。
存储全局变量的OPC UA 数据节点静态类:包含了多种与OPC UA节点相关的变量,例如XYZ机械手的位置 和速度节点ID,摄像机输送带的位置和速度节点ID等。还包含了一些读取的标志位变量,例如机械手抓取 ,参数重置 和摄像机扫描 的状态
OPC UA数据处理类:包含初始化 (Start) 方法,配置OPC UA客户端和开始读写线程。主功能 (Update) 方法根据状态机制处理连接和断开连接的逻辑。提供了多个辅助函数,包括处理退出应用时的线程终止 , 读取线程函数 , 写入线程函数 , 配置OPC UA客户端, 创建OPC UA会话, 以及写入OPC UA节点值 。
每个类和方法都有明确的功能和职责,形成整个OPC UA客户端通信模块的框架。代码的整体结构清晰,易于理解和维护。这段代码用于与OPC UA服务器通信,执行读写操作,以及在Unity项目中处理游戏对象和工业自动化系统之间的交互。
2.3 UNITY脚本中 FIXEDUPDATE 与 UPDATE的区别
FixedUpdate 和 Update 都是 Unity 脚本中用于更新游戏对象的函数,但它们有以下区别:
Update 函数是在每一帧中被调用,用于处理游戏对象的逻辑更新,例如用户输入、物体移动和碰撞检测等操作。Update 函数的调用频率与帧率一致,通常为60帧/秒。
FixedUpdate 函数是在固定时间间隔内被调用,用于处理涉及物理计算的逻辑更新,例如施加力和旋转等操作。FixedUpdate 函数的调用频率是固定的,通常为50次/秒。
由于 FixedUpdate 函数可以保持固定的时间间隔调用,因此某些需要在时间上精确模拟的任务就需要放在 FixedUpdate 中,否则可能会出现不同设备上的表现不一致或者卡顿等问题。而 Update 函数适用于大多数通用任务,不需要考虑物理计算的精确性。
2.4 XYZ各轴脚本
用于控制XYZ操纵器中对应连接件的位置。在每一个物理更新步骤(FixedUpdate)中,它读取来自全局OPC UA客户端变量数组对应元素的值,并更新连接件的局部Z坐标。此脚本确保了Unity游戏对象的位置可以实时反映出来自真实世界设备的数据变化。当应用程序退出时,OnApplicationQuit函数将确保此组件被销毁,释放相关资源。
该代码片段显示了如何在Unity中根据从OPC UA客户端获取的实时数据动态更新一个游戏对象的位置。通过这种方式,Unity可视化界面能够准确反映出控制系统中的物理机器人的状态,为操作者或程序员提供了实时反馈。
2.5 相机传送带脚本
代码定义了一个控制输送带上摄像头第一个连接部分的Unity脚本。使用FixedUpdate方法,它可以在每次物理模拟更新时,根据实时输入数据调整摄像头连接件在Z轴的位置。这里提供的位置更新能够让Unity场景中的虚拟摄像头随着实际工业输送带上的摄像头位置的变化而移动,确保两者的同步。该脚本中的X轴和Y轴坐标是固定值,而Z轴坐标则会根据实时数据实现动态调整。OnApplicationQuit方法同上一段代码,在应用程序退出前用于资源清理,确保适当的组件销毁,一般Unity会自动处理,除非需要进行特定的资源释放操作。
2.6 灯光闪烁脚本
代码定义了一个Unity脚本,用于模拟和控制相机扫描时灯光的闪烁效果。通过协程控制一个灯光组件的开关,创建闪烁效果。同时,脚本会根据扫描到的对象的ID,从一个预定义的对象类型数组中读取并设置当前对象的类型。这种闪烁的灯光可能用于模拟工业现场相机扫描物件的视觉效果或状态指示,并对扫描对象的类型进行分类存储或判断。
2.7 分拣对象转移脚本
用于控制游戏对象(例如立方体)的变换,例如位置、旋转和缩放。它与OPC UA客户端的全局变量进行交互,实现基于通过OPC UA读取的数据指令对对象进行的操作。这包括对象的附加与分离操作。
类成员变量定义:
一个游戏对象数组,包含九个代表主要立方体的元素。
XYZ操作器末端执行器的游戏对象。
相机输送机垫的游戏对象。
初始化垫的游戏对象。
浮点数组,包含了九个立方体的位置偏移值。
用于状态机控制的整型变量。
Start方法(初始化方法)定义:
初始化设置每个立方体对象的默认位置,旋转和缩放。同时设置这些立方体的Rigidbody组件为静止(isKinematic=true),这意味着物理引擎不会影响它们的运动。
Update方法(周期函数)定义:
一个基于主状态变量的状态机,根据OPC UA客户端的全局变量执行不同的指令。
针对不同的状态(0、1、2、3),依据抓取和分离全局变量的值,执行附加或分离立方体对象的行为,同时将立方体的父对象设置为特定的操作器末端执行器或输送机垫。
OnApplicationQuit方法定义:
在应用退出时尝试销毁脚本的实例,并捕获可能出现的异常。
整个脚本的目的是通过Unity和OPC UA之间的交互,实现立方体对象在特定的位置按照给定的指令进行移动和固定。这种动作通常在模拟工业自动化操作如工业机器人的XYZ操作器控制中体现。脚本利用状态机实现控制逻辑,可用于在触发特定条件时控制游戏中的物体。
三、Automation Studio PLC程序分析
3.1 贝加莱AUTOMATION STUDIO 都支持哪些PLC
贝加莱Automation Studio 是一个集成开发平台,支持多种编程语言,如 IEC 61131-3 和 ANSI C。它可以用来开发和维护 PLC、运动控制、HMI、安全和通信等功能¹。
贝加莱Automation Studio 支持贝加莱自己的 PLC 系列,如 X20、X67、2005、2003、2000 等,以及其他厂商的 PLC,如西门子、施耐德、罗克韦尔、三菱等,通过不同的通信协议和接口进行连接和数据交换²³。
贝加莱Automation Studio 还支持使用 OPC UA、MQTT、AMQP 等互联网技术,实现与云平台和物联网设备的集成⁴。
(1) 贝加莱(B&R)的Automation Studio软件和西门子的Siemens TIA软件比较?- 知乎. https://www.zhihu.com/question/275074286.
(2) Automation Studio | B&R Industrial Automation. https://www.br-automation.com/zh/products/software/automation-software/automation-studio/.
(3) 贝加莱机器控制开发入门篇 - 哔哩哔哩. https://www.bilibili.com/read/cv10062193/.
(4) 软件 | B&R Industrial Automation. https://www.br-automation.com/zh/products/software/.
(5) Automation Studio | B&R Industrial Automation. https://www.br-automation.com/zh/products/software/automation-software/automation-studio/.
(6) 贝加莱(B&R)的Automation Studio软件和西门子的Siemens TIA软件比较?- 知乎. https://www.zhihu.com/question/275074286.
(7) 贝加莱机器控制开发入门篇 - 哔哩哔哩. https://www.bilibili.com/read/cv10062193/.
(8) 软件 | B&R Industrial Automation. https://www.br-automation.com/zh/products/software/.
AS运行时下载地址:
https://www.br-automation.com/zh/downloads/software/automation-runtime/automation-studio-49/v49-ar-upgrade-c0490-x20cp1584/
https://www.br-automation.com/zh/downloads/ AS软件下载地址
3.2 主程序
此代码是一个用于PLC(可编程逻辑控制器)的程序,运用B&R Automation Studio开发。它主要负责一个XYZ机械操作系统的流程控制,涉及物体的识别、搬运以及放置。下面是对主要类别和方法的解析:
常量定义:
用来标识不同类型的物体。
一系列常量用于定义机械手初始化位置偏移量。
用来表示设备的初始位置常量。
初始化函数:
初始化全局变量,设置相机扫描变量,设备位置,速度参数以及其他所需变量。
设置延时函数的时间。
初始化和设置偏移量数组,这些数组用于计算设备在处理物体时的位置。
周期性函数:
包含一个状态机,用来控制整个程序流程的不同阶段。
根据不同阶段来移动XYZ机械手和相机输送带,并在特定时刻进行对象的识别、吸附或释放。
在每个阶段使用
设置时间
函数来进行时间控制,以协调各个动作的执行。
设置时间
函数:
运用B&R的TON功能块来实现定时功能。
当使能输入被设置为TRUE时,计时开始,一旦计时器的预设时间达成,输出Q将变为TRUE。
每个case语句代表状态机中的不同状态,管理从初始化到物体处理的各个步骤,根据控制系统中的条件来改变状态。通过设置时间
函数和其他条件判断来使得状态机可以在特定时间后或在特定的条件被满足后,决定下一个动作或状态。
程序还包括与可视化系统的接口。
整体而言,这是一个复杂的PLC程序,用于管理和协调一套工业自动化系统,能够根据不同类型的物体进行分类操作,并确保物体被准确地放在预定位置。
3.3 XYZ轴PLC程序
首先包含了必要的头文件、变量和类型定义,为程序提供了基础的数据结构和函数。
然后定义了相机输送轴的一个绝对位置宏。
_LOCAL
关键字声明了多个结构体变量,这些变量用于设置和管理相机输送轴的基本参数和周期性参数。ProgramInit
函数是初始化函数,它设置了相机输送轴的启用、引用和参数。对MpAxis参数、周期性参数进行了初始化设置,并对SMC轨道的相关参数进行了设定。_CYCLIC
函数是周期性函数,在每个程序循环中被调用。它根据主控制程序的状态机来控制轴的运行状态,读取和设置相应的参数,然后调用功能块进行操作。这段代码操控着轴的启动、停止、参数加载、位置设置,并和主控制程序进行数据的交换,以完成对相机输送轴的精确控制。
总结来说,这段代码负责初始化一个输送轴的运动控制系统,通过周期性函数在每个循环中根据状态机来更新轴的行为,同时进行数据的读取和写入,保证轴系统的正常运行。
3.4 相机移动轴PLC程序
为抓取相机系统中称为相机移动的传送轴进行运动控制系统的设置和调试。代码首先定义该轴的绝对位置,然后声明若干结构体用于控制轴的基础和周期运动。初始化函数 进行轴系统初始化,设置轴参数,如滑差错误读取模式、扭矩模式等,以及初始化控制轴运动的 结构体参数,包括加速度、减速度、最大速度等。周期函数 则根据控制算法切换轴的状态,处理启动、停止、加载参数、设置位置等功能,并与主控制程序进行通信,以实现对传送轴的准确控制。最终,通过调用功能块来驱动轴运行。
总的来说,这段代码是管理相机输送系统中的某个轴的运动控制程序,包含轴的初始化设置和周期性运动控制逻辑,以确保其按照期望的方式进行精确移动。
结 语
Unity与HMI联调失败,HMI按钮无响应,因我关注的是Unity并不打算去学习Automation Studio,也不影响我研究Unity源码,所以不对Automation Studio 做进一步研究。
The End