【教程】Unity 与 Simence PLC 联动通讯

news2024/11/20 18:26:39

开发平台:Unity 2021
依赖DLL:S7.NET
编程语言:CSharp 6.0 以上

一、前言


  Unity 涉及应用行业广泛。在工业方向有着一定方向的涉足与深入。除构建数据看板等内容,也会有模拟物理设备进行虚拟孪生的需求需要解决。而 SIMATIC(西门子)作为工业通讯其一,需要了解如何在 CSharp 中实现通讯是本文章所关注的重点。

二、了解 | 依赖库对象:S7.NET


在这里插入图片描述


限制:限定在 Unity CSharp 配置 2.0 Framework 下运行。
下载链接:GitHub-S7.NET
开发文档:WiKi-S7.NET

  对于 Unity 来说,引用 S7.NET 方法需要将 S7.NET.DLL 或 DLL内所有程序文件导入至 Unity Assets 目录下才可使用。如上图所示:我们仅需要将 S7.NET 文件夹 导入至 Unity 即可。或是生成 S7.NET.DLL 导入目录下 Plugins 文件夹下。

三、了解 | PLC DB数据库


在这里插入图片描述

  PLC DB数据库根据 “数据库 - 数据类型 - 数据偏移量” 进行数据写入或读取。这种描述或有些抽象,以 S7.NET 读取单个示例数据。例如上图红框:获取 PLC数据 [DB160] 下的 Int 数据类型、便宜量为 104.0 的数据。

PLC.Read("DB160.DBW104.0");
  1. 获取 DB库 始终坚持 “DB” + 库编号
  2. 获取 偏移量值,始终坚持 “DB” + 数据类型 + 偏移量值
    在这里插入图片描述
    需注意:S7中所使用 PLC.Read(string content) 读取值默认为 10 进制

  而对于一些数据本身大的情况,部分负责数据的PLC工程师会选择拆分数据进行分批存储。例如:Real 数据类似于 CSharp 中 float 精度数据类。

  • 在 Unity 开发中,涉及精度的数据(如位移、旋转轴数据),常见会被拆分为高低位的 16进制 存储。

四、关于不建议使用 Read 方式进行数据读取


  剖析 PLC.Read(string plc) 可了解其根据字符串组合内容创建一个 DataItem 对象,用于 PLC DB块数据访问。注意:是创建。每次定时请求必须有创建局部变量后才可访问。从高频读取为前提,是不可取且随这使用的 string plc 量增加下,出现读取延时等情况。

public override void OnUpdateData()
{
	Data.J1 = float.Parse($"{PLC.Read("DB110.DBW20.0")}");
	Data.J2 = float.Parse($"{PLC.Read("DB110.DBW22.0")}");
	Data.J3 = float.Parse($"{PLC.Read("DB110.DBW24.0")}");
	Data.J4 = float.Parse($"{PLC.Read("DB110.DBW26.0")}");	

	Data.机械夹爪原位 = ConvertUtils.GetBool(PLC.Read("DB110.DBW100.0"), 1);
	Data.机械夹爪动位 = ConvertUtils.GetBool(PLC.Read("DB110.DBW110.0"), 7);
	
	Data.顶升气缸原位 = ConvertUtils.GetBool(PLC.Read("DB110.DBW100.0"), 2); 
	Data.顶升气缸东位 = ConvertUtils.GetBool(PLC.Read("DB110.DBW100.0"), 3); 

	Data.滚筒进料阻挡原位 = ConvertUtils.GetBool(PLC.Read("DB110.DBW110.0"), 2); 
	Data.滚筒进料阻挡动位 = ConvertUtils.GetBool(PLC.Read("DB110.DBW110.0"), 4);

	//.....更多其他数据
}

  历史记忆最清楚的是一台底盖安装机的机械轴有 4轴轴值数据、机械夹爪状态数据、皮带状态数据、顶升|阻挡气缸等其他部件数据。在同步机械轴数据上本应按照 100ms 一次更新下,在13台设备的同步请求 PLC DB数据下,出现 7s 完成一次数据请求的情况,显然 PLC读取出现阻塞情况。(在设计上使用多线程请求数据,在多线程优化上对于我来说是捉襟见肘)

  于是,考虑到每次请求中,存在相同 DB 块偏移量数据的请求,我建立了局部变量读取。例如:

public override void OnUpdateData()
{
	var theDB20 = PLC.Read("DB110.DBW20.0");
	var theDB22 = PLC.Read("DB110.DBW22.0");
	//...
	var theDB100 = PLC.Read("DB110.DBW100.0");

	Data.J1 = float.Parse($"{theDB20}");
	//...
	Data.顶升气缸原位 = ConvertUtils.GetBool(theDB100, 2); 
	Data.顶升气缸东位 = ConvertUtils.GetBool(theDB100, 3); 
	//...
}
  • 在使用局部变量作为替代使得13台设备全运行下的更新频率由 7s 缩减至 3 - 4s。针对不同规模的工程,其频率变化程度不一,但相较于反复使用 PLC.Read(string plc) 有明显的提升。但本质上依然未达到即时的目标。

  所以,认识 PLC.Read(string plc) 的字符串解析规则是必然的。透过源码,可了解其最终被解析为 DataItem 的数据类用以请求。而参考 PLC WIKI文档可了解 PLC.ReadMultibleVars(List<DataItem> data) 的方法,其用于获取一个 DB块 下指定偏移量数据。一次访问获取所有数据比多次访问获取多数据明显压力上更低,更适用。因此结合 PLC.Read(string plc) 创建DataItem实例。使用静态字段与属性替代 string 访问DB是最优解(目前)

private static DataItem VarDB20 = new DataItem()
{
    DataType = DataType.DataBlock,
    VarType = VarType.Bit,
    DB = 110,
    StartByteAdr = 20,
    BitAdr = 0,
    Count = 1,
    Value = new object()
};

public static List<DataItem> Datas = new List<DataItem>() { VarDB20 }
  • DataType.DataBlock:PLC 连接数据类为 DB块
  • VarType:数据类型。参考 “DBW” “DBB” “DBX” “DBD”
  • DB:DB块号。例如 “DB110.DBW20.0” 指向 110 BD块
  • StartByteAdr :偏移量。例如 “DB110.DBW20.0” 指向 20 偏移量(20.0 中小数点前20)
  • BitAdr :地址。例如 “DB110.DBW20.0” 指向 0 偏移量(20.0 中小数点后0)
  • Count:取数(默认为1即可,除非有特殊说明)
  • Value:存放 PLC 中读取或将写入的数据值。(十进制)
public override void OnUpdateData()
{
	PLC.ReadMultibleVars(Datas);
	
	Data.J1 = float.Parse($"{VarDB20.Value}");
	//...
	Data.顶升气缸原位 = ConvertUtils.GetBool(VarDB100.Value, 2); 
	Data.顶升气缸东位 = ConvertUtils.GetBool(VarDB100.Value, 3); 
	//...
}

  在优化使用 PLC.ReadMultibleVars(List<DataItem> data) 的情况下,读取压力再次降低,使得实际机械轴模拟表现几乎与实际表现无延迟。注意:在数据均指向同一 DB块 下,使用该方法读写最优(目前)。

五、关于数据类型转换


  与各程序语言相同,其数据类型同样包含 string/bool 等数据类型,但不同的有 Real 数据类型。(其实就是 double/float 那种浮点数)。对于该类型数据的读取,需要使用 DBD 类型进行读取。好在转换的方法在 S7 中有提供:

(uShort.Parse($"{PLC.Read("DB110.DBW100.0")}")).ConvertToFloat()

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

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

相关文章

测评:腾讯云轻量4核8G12M服务器CPU内存带宽流量

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

02-参数传递+统一响应结果

1. 参数传递&#xff1a; -- 简单参数 如果方法形参数名称与请求方法名称不匹配&#xff0c;采用RequestParam注解 -- 实体参数 -- 数组集合参数 -- 日期参数 -- JSON参数 -- 路径参数 2. 统一响应结果 -- 1. 创建Result类&#xff08;放到pojo包中&#xff09; package dem…

centos8 源码安装 apache(内附图片超详细)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Redis 如何实现库存扣减操作和防止被超卖?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

《Rank-LIME: Local Model-Agnostic Feature Attribution for Learning to Rank》论文精读

文章目录一、论文信息摘要二、要解决的问题现有工作存在的问题论文给出的方法&#xff08;Rank-LIME&#xff09;介绍贡献三、前置知识LIMEFeature AttributionModel-AgnosticLocalLearning to Rank&#xff08;LTR&#xff09;单文档方法&#xff08;PointWise Approach&#…

工业相机标定(张正友标定法)

目录 相机标定的概念 a. 相机标定的定义 b. 相机标定的目的 相机标定的过程 a. 标定板选择 b. 标定板摆放及拍摄 c. 标定板角点提取 张正友标定法 a. 反解相机矩阵 b.反解畸变系数 使用Python进行相机标定 a. 安装OpenCV b. 准备标定板图片 c. 利用OpenCV进行角点…

HashMap、HashTable、ConcurrentHashMap 之间的区别

哈喽&#xff0c;大家好~我是保护小周ღ&#xff0c;本期为大家带来的是 HashMap、HashTable、ConcurrentHashMap 之间的区别&#xff0c;从数据结构到多线程安全~确定不来看看嘛~更多精彩敬请期待&#xff1a;保护小周ღ *★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* ‘一、…

内存、CPU与指针的知识

在计算机中&#xff0c;内存、CPU和指针是非常重要的概念。在本篇博客中&#xff0c;我们将探讨内存、CPU和指针的知识。 内存的概念 内存是计算机中的一种存储设备&#xff0c;用于存储程序和数据。内存可以被CPU读取和写入&#xff0c;因此是计算机中非常重要的组成部分。在…

006:Mapbox GL添加zoom和旋转控件

第006个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加zoom和旋转rotation控件 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共60行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:h…

【数据结构第八章】- 排序(万字详解排序算法并用 C 语言实现)

目录 一、基本概念和排序方法概述 1.1 - 排序的基本概念 1.2 - 内部排序的分类 二、插入排序 2.1 - 直接插入排序 2.2 - 希尔排序 三、交换排序 3.1 - 冒泡排序 3.2 - 快速排序 3.2.1 - 递归算法 3.2.2 - 优化 3.2.3 - 非递归算法 四、选择排序 4.1 - 简单选择排…

关于统信UOS(Linux)系统磁盘无损扩容的方法

前言 针对某托管平台分配的4台虚拟服务器&#xff0c;操作系统统信UOS&#xff08;Linux&#xff09;&#xff0c;数据磁盘空间已满&#xff0c;无损扩容的办法。 &#xff08;在操作硬盘扩容前&#xff0c;为了安全起见&#xff0c;请通过磁盘快照功能备份服务器系统盘与数据盘…

Java 堆外内存

文章目录Java 堆外内存堆外内存的分配方式使用 Unsafe 类进行分配使用 ByteBuffer 进行分配堆外内存的查看方式Java 堆外内存 在 Java 虚拟机中&#xff0c;分配对象基本上都是在堆上进行的&#xff0c;然而在有些情况下&#xff0c;缓存的数据量非常大时&#xff0c;使用磁盘或…

【Python_Scrapy学习笔记(十四)】基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)

基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取) 前言 本文中介绍 如何基于 Scrapy 框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)&#xff0c;并以抓取 第一PPT 网站的 PPT 模板为例进行展示&#xff0c;同时抓取此网站数据的方式…

Docker安装Nexus搭建Maven私服及介绍

目录前言一、Nexus是什么&#xff1f;二、Docker安装方式1. 拉取镜像2. 创建挂载目录3. 运行4. 容器运行日志 &#xff08;可选&#xff09;三、用户登录四、仓库介绍五、创建代理仓库六、上传依赖&#xff08;重点&#xff09;七、下载依赖常见问题1、如何把新建的仓库添加到组…

【前端之旅】vue-router声明式导航和编程式导航

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

科研作图-常用的图像分割指标 (Dice, Iou, Hausdorff) 及其计算

1. 简介 本节内容主要是介绍图像分割中常用指标的定义、公式和代码。常用的指标有Dice、Jaccard、Hausdorff Distance、IOU以及科研作图-Accuracy,F1,Precision,Sensitive中已经介绍的像素准确率等指标。在每个指标介绍时&#xff0c;会使用编写相关代码&#xff0c;以及使用M…

TypeScript学习记录Ts基础

安装及初步使用 1.CMD全局安装 npm install -g typescript2.检查是否安装成功 tsc -V 如报错tsc 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件[可参考](https://www.cnblogs.com/sanyekui/p/13157918.html)3.在vscode中新建ts文件01_ts.ts let str:strin…

iPhone上5款视频压缩工具推荐,学会轻松压缩视频

随着技术的不断进步&#xff0c;现在移动端设备已经能够轻松地拍摄高清视频&#xff0c;然而这也带来了存储压力的增大。苹果手机更新换代频繁&#xff0c;但内存空间却没有跟着变大&#xff0c;因此如何压缩视频成为了一个重要的问题。 苹果手机怎么压缩视频&#xff1f;有什…

01-ASPICE体系知识

1. ASPICE是什么&#xff1f; ASPICE: 全称是"Automotive Software Process Improvement and Capacity Determination"&#xff0c;汽车软件过程改进及能力评定&#xff0c;是汽车行业用于评价软件开发团队的研发能力水平的模型框架。最初由欧洲20多家主要汽车制造商…

上位机:创建WPF应用并使用控件完成控件交互

创建WPF应用并使用控件完成控件交互 1.XAML是WPF技术中专门用于设计UI的语言。 2.优点,XAML是一种声明型语言,只能用来声明一些UI元素、绘制UI和动画,不能在其中加入程序逻辑。实现UI与逻辑的剥离。 下面使用visual studio2019建立一个WPF项目: 进入项目,点击运行,然后…