可以看到,在Unity的场景中,读到了PLC中的数据。
如果我们进一步导入设备3D模型、气缸、电机、皮带等到Unity中,配合PLC程序就可以搞数字孪生、虚拟仿真了。在数字孪生设备中我们可以设定某些条件,比如某个传感器损坏/误感应、卡板、电机堵转,看看程序是否报警,如何动作。也可以直接验证PLC程序本身的逻辑错误,不需要等元器件采购、设备装配完成再验证程序。
再进一步,通过数字孪生设备积累的大量数据,如传感器感应次数、气缸动作次数、伺服运动次数、伺服每次的位置、各种报警的次数和内容进行统计分析、找规律,可以对设备进行预测性维护,提前准备好备件,在设备元件损坏停机之前就按计划更换,减少了计划外故障停机时间。
还有一个好处——设备的操作人员流动性大、培训不够的情况下,操作设备很困难,什么工位哪个元件分不清,在设备的数字双胞胎中可以直观的将故障位置显示出来,操作步骤显示出来,再对照实物,就很好理解了。下面是基础步骤:
1、在画面(场景)中添加按钮及文本
首先在Unity Hub中选择 3D 核心模板或示例模板--创建项目
如图,在层级(Hierarchy)--项目名称(SampleScene)--右键--游戏对象--UI--选择按钮或文本或文本输入框,来创建。
按钮的位置和大小通过右侧设置。
点击运行按钮查看效果:
2、导入S7.NET
在 项目->Assets 文件夹下,新建Plugins
S7.NET.dll文件下载地址链接: https://pan.baidu.com/s/1b7Q6K6ovye761RjnMRJYHw?pwd=tmsk 提取码: tmsk 复制这段内容后打开百度网盘手机App,操作更方便哦
3、同样在Assets 文件夹下,新建文件夹Scripts文件夹,在Scripts文件夹中新建C#脚本。
这里我们新建一个C#脚本,命名为OP.cs
using System.Collections;using System.Collections.Generic;using UnityEngine;using System;using S7.Net;using UnityEngine.UI;using System.Threading;//新开线程不影响主线程,注意,该线程不适用于Unitty中组件的操作。
publicclassOP : MonoBehaviour{public InputField floattext;privatestatic Plc objS7net; Thread CONPLCNOW;//定义PLC连接线程,读取数据量不大,就不新建线程了
// Start is called before the first frame updatevoidStart() {//floattext.text = "hello,world!";//不加按钮了,直接运行就实例化然后连接 CONPLCNOW = new Thread(CON);//定义线程方法 CONPLCNOW.Start();//执行线程 print("HI"); }
privatevoidCON() {//这里是连接PLC用的方法 objS7net = new Plc(CpuType.S71500, "192.168.1.200", 0, 1);try { objS7net.Open(); print( "S7.NET连接成功"); }catch (Exception) { print("S7.NET连接失败"); }
}
publicvoidreadfloat()//定义读取按钮点击的方法 { floattext.text = objS7net.Read(floattext.text).ToString();//floattext.text = objS7net.Read("DB1.DBW2").ToString();//这里可以直接输入"DB1.DBW2",也可以通过文本输入框来选择地址 }
privatevoidOnDestroy() { CONPLCNOW.Abort();//记得关闭线程哦 }
// Update is called once per framevoidUpdate() { }}
4、绑定脚本 (这里换了一个项目)
步骤:选择Main Camera--右下角 添加组件--选择脚本--选择OP
5、绑定文本输入框
点击脚本变量后面的+,弹出输入框选择界面,选择相应输入框
6、绑定按钮
这个操作比较逆天,选中button--鼠标单击()--点击+符号(增加至列表)--鼠标左键选中Main Camera拖动至Runtime...下方位置--选择Runtime Only--选择OP--选择我们脚本里写好的readfloat()方法。、
注意:Unity新建项目如果提示要安装Plastic SCM,则根据提示安装,但是要在比较好的网络下才能成功。
参考:
https://blog.csdn.net/u011723630/article/details/124158258https://blog.csdn.net/qq_30454411/article/details/79694777
翻译:
Hierarchy:层级Grid:网格Canvas:画布
通过S7.net写入西门子PLC DB中各种类型变量的例子(二)
如图所示:通过上位机改变PLC内DB块变量的值,其中16进制byte类型变量的写入还有一点复杂。
/* 一元 !(逻辑非)运算符。 二元 &(逻辑与)、|(逻辑或)和 ^(逻辑异或)运算符。这些运算符始终计算两个操作数。 二元 &&(条件逻辑与)和 ||(条件逻辑或)运算符。这些运算符仅在必要时才计算右侧操作数。 */privatevoidtextBox1_TextChanged(object sender, EventArgs e) {//1、BOOL量写入if (textBox1.Text=="0" || textBox1.Text == "1") { objS7net.Write("DB1.DBX0.0", int.Parse(textBox1.Text)); } }
privatevoidtextBox2_TextChanged(object sender, EventArgs e) {if (textBox2.Text != "") { //2、16进制byte类型变量写入 0~Fvar i = int.Parse(textBox2.Text, System.Globalization.NumberStyles.AllowHexSpecifier);var bytes = BitConverter.GetBytes(i); objS7net.Write("DB1.DBB1", bytes[0]); } }
privatevoidtextBox3_TextChanged(object sender, EventArgs e) {if (textBox3.Text != "") {//3、int类型数值写入 objS7net.Write("DB1.DBW2", short.Parse(textBox3.Text)); } }
privatevoidtextBox4_TextChanged(object sender, EventArgs e) {if (textBox4.Text != "") {//4、浮点数写入 objS7net.Write("DB1.DBD4", float.Parse(textBox4.Text)); } }
|