PLC论坛-全力打造可编程控制器专业技术论坛

 找回密码
 注册哦

QQ登录

只需一步,快速开始

微信扫码登录

查看: 91897|回复: 0

[西门子] 数字孪生(二)Unity 读写PLC变量、绘制按钮、文本、导入S7.net、新建C#脚本;通过S7.net写PLC变量

[复制链接]
发表于 2024-4-16 08:16:26 | 显示全部楼层 |阅读模式
可以看到,在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));            }        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册哦

本版积分规则

QQ|小黑屋|手机版|Archiver|PLC技术网-PLC论坛 ( 粤ICP备17165530号 )|网站地图

GMT+8, 2024-5-1 01:09 , Processed in 0.044735 second(s), 27 queries .

快速回复 返回顶部 返回列表