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

[复制链接]
查看82 | 回复0 | 2024-4-16 16:45:56 | 显示全部楼层 |阅读模式
可以看到,在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中组件的操作。
public class OP : MonoBehaviour{    public InputField floattext;    private static Plc objS7net;        Thread CONPLCNOW;//定义PLC连接线程,读取数据量不大,就不新建线程了
    // Start is called before the first frame update    void Start()    {        //floattext.text = "hello,world!";        //不加按钮了,直接运行就实例化然后连接        CONPLCNOW = new Thread(CON);//定义线程方法        CONPLCNOW.Start();//执行线程        print("HI");    }
    private void CON()    {//这里是连接PLC用的方法        objS7net = new Plc(CpuType.S71500, "192.168.1.200", 0, 1);               try        {            objS7net.Open();            print( "S7.NET连接成功");        }        catch (Exception)        {            print("S7.NET连接失败");        }
    }
    public void readfloat()//定义读取按钮点击的方法    {        floattext.text = objS7net.Read(floattext.text).ToString();        //floattext.text = objS7net.Read("DB1.DBW2").ToString();//这里可以直接输入"DB1.DBW2",也可以通过文本输入框来选择地址    }
    private void OnDestroy()    {        CONPLCNOW.Abort();//记得关闭线程哦    }
    // Update is called once per frame    void Update()    {            }}
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类型变量的写入还有一点复杂。














































/*        一元 !(逻辑非)运算符。        二元 &(逻辑与)、|(逻辑或)和 ^(逻辑异或)运算符。这些运算符始终计算两个操作数。        二元 &&(条件逻辑与)和 ||(条件逻辑或)运算符。这些运算符仅在必要时才计算右侧操作数。        */        private void textBox1_TextChanged(object sender, EventArgs e)        {//1、BOOL量写入            if (textBox1.Text=="0" || textBox1.Text == "1")            {                objS7net.Write("DB1.DBX0.0", int.Parse(textBox1.Text));            }                                              }
        private void textBox2_TextChanged(object sender, EventArgs e)        {            if (textBox2.Text != "")            {                               //2、16进制byte类型变量写入 0~F                var i = int.Parse(textBox2.Text, System.Globalization.NumberStyles.AllowHexSpecifier);                var bytes = BitConverter.GetBytes(i);                objS7net.Write("DB1.DBB1", bytes[0]);            }                                        }
        private void textBox3_TextChanged(object sender, EventArgs e)        {            if (textBox3.Text != "")            {//3、int类型数值写入                objS7net.Write("DB1.DBW2", short.Parse(textBox3.Text));            }        }
        private void textBox4_TextChanged(object sender, EventArgs e)        {            if (textBox4.Text != "")            { //4、浮点数写入                objS7net.Write("DB1.DBD4", float.Parse(textBox4.Text));            }        }




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

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

本版积分规则