【Unity】分拣机的数字双胞胎集成到Unity3D开发平台中

804bdbf5db5dee4a94b39ecc548f171b.jpeg

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脚本分析

a70f92a5ae886286a7271e319d853ca8.png

6d5c7049b1054bd37e72499b4ef592fb.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 for 来遍历枚举的元素

#include <stdio.h> enum DAY { MON1, TUE, WED, THU, FRI, SAT, SUN } day; int main() { // 遍历枚举元素 for (day MON; day < SUN; day) { printf("枚举元素&#xff1a;%d \n", day); } }

DolphinDB教程:实时计算高频因子

DolphinDB教程&#xff1a;实时计算高频因子 DolphinDB是一款高性能分布式时序数据库。与传统的关系数据库和常见的时序数据库不同&#xff0c;DolphinDB不仅提供了高速存取时序数据的基本功能&#xff0c;而且内置了向量化的多范式编程语言与强大的计算引擎。DolphinDB的计算引…

S32 Design Studio PE工具配置ADC

工具配置 我这个K1芯片有两个ADC驱动&#xff0c;也就有两个components&#xff0c;点开之后每个components都有四个选项卡converter转换器、channel通道、compare比较器、average求平均。 配置引脚 配置之前&#xff0c;得先配置好引脚&#xff0c;哪个引脚用来采集ADC。 每…

亚洲股市下一步的关键:中国看财报、日本看汇率、韩国看治理、印度看基建

汇丰认为财报将是驱动中国股市走势的关键因素。目前市场预计2024年中国企业每股收益将增长16%。 日本央行转向、A股业绩复苏、印度基建、韩国市场改革......最近这段时间&#xff0c;亚洲各大市场涌现出了不同的交易主题。 汇丰银行指出&#xff0c;中国受到本土企业盈利能力…

python 中的enumerate函数

在Python中&#xff0c;enumerate()函数用于将一个可遍历的数据对象&#xff08;如列表、元组或字符串&#xff09;组合为一个索引序列&#xff0c;同时列出数据下标和数据&#xff0c;一般用在for循环中。 enumerate()函数的语法是&#xff1a; enumerate(iterable, start0)…

域控操作八:下发打印机策略

、此方法可以直接下发打印机&#xff0c;加域OU后自动连接 1&#xff0c;在域控服务器上安装打印机确保域控可以让打印机使用 并且要开共享入目录 这个共享路径正常情况下应该是在运行里面输入是直接能连接打印机的

算法——链表王

链表刷题详解 203.移除链表元素 力扣题目链接(opens new window) 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head []…

【JS】Object的静态方法

前言 像map、filter、some等方法都是Object实例的方法&#xff0c;即原型链方法。 Object的静态方法不依赖于任何对象实例&#xff0c;而是直接调用Object类本身。 常用静态方法如下&#xff1a; 一、Object.assign(target,…source) 将一个或多个源对象的属性复制到目标对…

数据库(mysql)-新手笔记(主外键,视图)

主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段&#xff0c;其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的&#xff0c;不能有两个或更多的记录具有相同的主键值 非空性&#xff1a;主键字段不能包含NULL值。 外键(引用完整 …

AutoPSA里给定了弹簧刚度,为什么计算没有引用?

山东一用户问&#xff1a;已经给定了弹簧刚度&#xff0c;为什么计算没引用&#xff1f; 在AutoPSA里包含两种算法仿CAESARII &#xff0c;仿GLIF算法。 在仿CAESARII算法里直接给定弹簧刚度与安载荷载&#xff0c;两个都给了相应值&#xff0c;也就是给定了弹簧号&#xff1b…

CF476D Dreamoon and Sets 题解 贪心

Dreamoon and Sets 传送门 Dreamoon likes to play with sets, integers and gcd ⁡ \gcd gcd . gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) is defined as the largest positive integer that divides both a a a and b b b . Let S S S be a set of exactly four distinct…

网络编程套接字(2)——Socket套接字

目录 一、概念 二、分类 1、流套接字&#xff08;使用传输层TCP协议&#xff09; TCP的特点 2、数据报套接字&#xff08;使用传输层UDP协议&#xff09; UDP的特点 3、原始套接字 一、概念 Socket套接字&#xff0c;是由系统提供用于网络通信的技术&#xff0c;是基于T…

ORACLE RAC ADG容灾实施

--1、主库检查 检查修改主库的force logging 模式 sqlplus / as sysdba SQL>select FORCE_LOGGING from v$database; alter database force logging; --主库remote_login_passwordfile 为EXCLUSIVE show parameter remote_login_passwordfile ---2、主库参数 alter …

处理error: remote origin already exists.及其Gitee文件上传保姆级教程

解决error: remote origin already exists.&#xff1a; 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin &#xff08;HTTPS&#xff09; 比如这样&#xff1a; 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…

Python实习生(自动化测试脚本开发) - 面经 - TCL新技术有限公司

JD&#xff1a; 招聘流程&#xff1a; 2024.1.3 Boss直聘 沟通 2024.1.4 约面 2024.1.6 上午面试 面试流程&#xff1a; 上来第一步&#xff0c;直接问Python基础语法&#xff0c;讲一下基础的数据类型 就记得元组和字典 分别具体说一下元组和字典 流程控制语句有哪些&…

应急布控球远程视频监控方案:视频监控平台EasyCVR+4G/5G应急布控球

随着科技的不断发展&#xff0c;应急布控球远程视频监控方案在公共安全、交通管理、城市管理等领域的应用越来越广泛。这种方案通过在现场部署应急布控球&#xff0c;实现对特定区域的实时监控&#xff0c;有助于及时发现问题、快速响应&#xff0c;提高管理效率。 智慧安防视…

SPFA找负环

2024-01-31&#xff08;最短路径&#xff09;-CSDN博客 求负环的常用方法&#xff0c;基于spfa&#xff1a; 1.统计每个点入队的次数&#xff0c;如果有个点入队n次&#xff0c;则说明存在负环 2.统计当前每个点的最短路中包含的边数&#xff0c;如果某个点的最短路的所包含的边…

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设…

【uni-app】condition 启动模式配置,生产环境无效,仅开发期间生效

在小程序开发过程中&#xff0c;每次代码修改后&#xff0c;都会启动到首页&#xff0c;有时非常不方便&#xff0c;为了更高效的开发&#xff0c;有时需要模拟直接跳转到指定的页面&#xff0c; 操作方法如下&#xff1a; 在pages.joson里面配置下列代码&#xff1a; "…

Mybatis-Spring | Mybatis与Spring的“整合“

目录 : 一、配置环境1. 整合环境需导入的JAR :Spring框架所需JARMybatis框架所需JARMyBatis与Spring整合的中间JAR数据库驱动JAR包数据源所需JAR包 &#xff08;下面的例子中 : 用的不是这个数据源&#xff09; 2. 编写“配置文件” 和 “.properties文件” ( 只是概述&#xf…