Unity3D 与西门子PLC通讯

  • 前言
  • 通讯协议
  • 通讯建立的细节
    • 期间遇到的两个主要问题
  • 总结

前言

想做这样的通讯太久了,从21年二月份陆陆续续到十一月份才正式做好,最开始想西门子1200系列与unity如果可以进行通讯,那么很多实验都可以做到虚拟仿真,未来做上位机的界面也会比传统的更丰富些。如今工控行业与IT行业密不可分,相似度也越来越高,零零散散试了几个通讯方式,最后还是在老师的帮助下找到了最为妥帖的通讯方式。
本文是做实体PLC和Unity 的通讯,如果没有实体PLC可以参考我之前的博文上位机与西门子博途TIA的PROFINET通讯仿真(虚拟通讯),这篇博文写了如何对PLCsim进行配置,使用PlCsim代替实体PLC进行通讯。

特别要说明的一点是,下文所介绍的通讯方式在本人的计算机上调试成功,如果遇到特殊情况请特殊处理,欢迎大家联系我,我们一起进步学习。

通讯协议

PLC与Unity之间的通讯协议,选用的是ModbusTCP通讯,
在西门子端需要做到大致两点

  1. 将项目的通讯保护等选项勾选掉
  2. 编写一部分ModbusTCP的代码,我认为这样的目的是允许外部访问。

在Unity端是需要引入一个C#的Dll库——S7.Net,这个库是编写Winform应用的,因为都是C#写的,所以导入Unity也是可以直接使用。

通讯建立的细节

注意!!!运行博途的计算机、运行Unity的计算机、西门子PLC这三者需要在一网段,即IP地址的前三位相同。
一、西门子博途方的设置

  1. 根据S7.Net官方文档进行配置应有属性
    官方文档中提到(下面为了避免我描述的不够清楚,将原文放置下面,设置一共有三点,第一点是只有需要访问DB块是才会用到,访问M寄存器时不需要这样做。之后两点是必须要做的。)
S7 1200/1500 Notes
An external equipment can access to S71200/1500 CPU using the S7 “base”
protocol, only working as an HMI, i.e. only basic data transfer are allowed.
All other PG operations (control/directory/etc..) must follow the extended protocol,
not (yet) covered by Snap7.
Particularly to access a DB in S71500 some additional setting plc-side are needed.
1. Only global DBs can be accessed.
2. The optimized block access must be turned off.
3. The access level must be “full” and the “connection mechanism” must allow
GET/PUT.
Let’s see these settings in TIA Portal V12
DB property
Select the DB in the left pane under “Program blocks” and press Alt-Enter (or in
the contextual menu select “Properties…”)
Uncheck Optimized block access, by default it’s checked

(这里需要将要访问的数据块关闭优化块访问这个选项。)

Protection
Select the CPU project in the left pane and press Alt-Enter (or in the contextual
menu select “Properties…”)
In the item Protection, select “Full access” and Check “Permit access with PUT/GET
….” as in figure.

(这里有两点设置,一是将保护中的访问等级调至:Full access;二是允许PUT/GET连接)
2. 编写通讯代码
在右侧通讯-其他-ModbusTCP中选择MB_Server块

放入后进行编写即可,具体细节如下两图。(具体参数含义在此不再赘述,如有疑问请参照博途信息系统。)
二、Unity方的通讯设置

  1. 在Unity项目文件Assets文件夹下新建一个Plugins文件夹,并将S7.Net.dll及其他文件放入
    S7.net的Dll库及说明书已经上传有需要的可以自取

    这里要注意的两点是,一是我也不清楚,这个文件是否会对项目有影响,所以是一起放入的。(.meta文件是导入Unity后自动生成的,可以通过这个来确认是否能在项目中使用。)

    第二点是网上的S7.Net的库是一个文件夹,但是有三个版本的S7.Net库,只需要保存一个即可,不然Unity会识别混乱。
    当然,要是拿到的只有
    这样两个文件就没有以上需要注意的两点。
  2. 导入Dll库后就可以在项目中新建C#脚本进行代码编写了。
    下面是我的源代码,其中重要的点我会以注释的形式标出。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using S7.Net;                    //首先一定是using
using System;
using UnityEngine.UI;
using System.Threading;public class PLC : MonoBehaviour
{Plc PLC1 = new Plc(CpuType.S71200, "192.168.0.1", 0, 1);        //在这里对Plc这类进行新建,public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot),这个函数是对连接的Plc进行一个访问初始化//需要的参数有PLC类型、IP地址、插槽号、机架号。其中后两项在博途CPU属性中可以查到。public InputField InputIP;public Text InputSet;Thread PLCLink;public Text Error;public GameObject FluidC;public byte HighSet;public byte result;public double RealSet;public byte ReadValve;public ushort intValve;float UnityHigh;// Start is called before the first frame updatevoid Start(){}public void BtnOpen(){try{PLC1 = new Plc(CpuType.S71200, InputIP.text, 0, 1);  //这里的是做了一个外部设置IP地址的操作PLC1.Open();//打开与PLC的连接是有两种方式,一个是Open();另一个是OpenAsync(),两者之间的功能是一样的,前者可以返回错误信息,比较适合初学者。if (PLC1.IsConnected)   //判断是否连接{Debug.Log("Plc is Connected");Error.text = "Plc is Connected";PLCLink = new Thread(LinkThread);PLCLink.Start();                    //这里我是想做一个阶段性的中断,所以选用另起线程,将查询和写入PLC的功能放入新的线程,数据处理在主线程。用来防止线程卡死。}else{Error.text = "PLC 连接不成功,请检查IP地址、机架、插槽等是否正确";}}catch (Exception ex){Debug.Log(ex);Error.text = ex + "";throw;}}public void BtnClose(){try{PLC1.Close();     //关闭与PLC的连接}catch (Exception ex){Debug.Log(ex);Error.text = ex + "";throw;}}public void BtnRead(){//复位按键try{PLC1.Write("M0.0", true);  //我做的是Unity上的仿真PID所以需要一个复位按键。PLC1.Write("M0.0", false);}catch (Exception ex){Debug.Log(ex);Error.text = ex + "";throw;}}public void LinkThread(){while (true){if (PLC1.IsConnected){RealSet = Convert.ToDouble(PLC1.Read("DB3.DBD0"));  //读取PLC的值,这边我还没有做的很满意,大家可以根据S7.Net的说明书和自己的意图来写合适的代码result = (byte)PLC1.Read("MB103");intValve = (ushort)PLC1.Read("DB3.DBW12");Debug.Log(intValve);Thread.Sleep(100);}}}private void OnApplicationQuit(){BtnClose();}// Update is called once per framevoid Update(){UnityHigh = FluidC.GetComponent<FluidControl>().OutPutHigh;InputSet.text = result + "";}
}

到这里,双方通讯已经完成,剩下的就是数据处理。等下次做的满意后,单写一篇文章给大家看。

期间遇到的两个主要问题

  1. S7.Net.PlcException: 无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。

  2. 索引超出数组界限。
    我的这两个问题都是发生在连接成功后无法进行读取和写入操作。
    大致总结了一下检查步骤

  3. Ping一下PLC的IP地址,ping不通的话有很多种可能,不在同一网段、PLC没有正确设置对外部访问还有保护(请参照 一、西门子博途方的设置)等。

  4. 如果可以Ping的通,请检查一下PLC的通讯代码是否有错。一般第一个问题会出现在这里。

  5. 第二个问题,有可能是访问的块不存在或者是地址没定义数。

总结

这篇仅写了我一家之言,问题遇到的不算多,所以不会是最全面的,希望大家遇到的稀奇古怪问题可以找我一起讨论。

西门子PLC与Unity3D通讯丨PROFINET通讯相关推荐

  1. C# 机器视觉工控通讯------西门子PLC之S7协议上位机通讯

    C# 机器视觉工控通讯------西门子PLC之S7协议上位机通讯 使用步骤 1.引入库 项目添加应用HslCommunication.dll和代码代码如下(示例): dll官方支持网站> us ...

  2. 西门子PLC 1200和V20变频器USS通讯 5台西门子变频器V20和1200PLC USS通讯

    西门子PLC 1200和V20变频器USS通讯 5台西门子变频器V20和1200PLC USS通讯,西门子触摸屏,总线通讯,实际项目程序,提供,CAD电气图纸 变频器设置说明 详细注释和项目文件 YI ...

  3. 西门子PLC的MODBUS RTU和modbusTCP通讯

    1.西门子PLC的通讯扩展 西门子通讯桥接器分为基本版和专业版,型号分别为NET30-MPI和NET30-MPI Pro,专业版不仅包含了基本版所有的功能,而且增加了扩展口X2的MODBUS主从站功能 ...

  4. 西门子PLC与Unity3D通讯丨串口通讯

    串口通讯 前言 通讯协议 代码部分 引用文件的准备 数据类型的声明 写接收数据函数DataReceiveFunction() 写打开串口函数OpenPort() 关闭串口ClosePort() 发送数 ...

  5. 如何用西门子SMART系列PLC和KUKA机器人进行Profinet通讯(非常详细)

    连接前准备物料:RJ45接口网线,交换机,西门子Smart系列SR20 PLC(西门子SR,ST系列PLC都行,除了个别模块) 1.下载西门子Smart V2.4版本软件,并下载V2.4的固件库,将固 ...

  6. 西门子PLC(S7-1200、1500)通讯程序报16#80C8错误的解决方法

    最近在用S7-1200做通讯实验,里面配置了1个TCP通讯.2个UDP通讯.1个MODBUS TCP SERVER. 开始时,只配置有一个通讯的时候,都能正常工作.后来,把这几个集成在一个程序里时,却 ...

  7. KEBA控制器通过PROFINET连接西门子PLC

    摘要 方案介绍: KEBA控制器支持PROFIBUS协议,需要连接西门子S71200/1500等系列支持PROFINET通讯的PLC.本文通过赫优讯NT50系列网关,实现西门子S71200 PLC(P ...

  8. 200与mcgs485实例 smart_西门子Smart触摸屏与S7-200Smart无线PPI通讯实例

    在工业现场往往会用触摸屏来控制现场的PLC工作.若是遇到布线不方便或是工期较短的情况,那么可以采用无线数据交换的方式来完成触摸屏对PLC的RS485无线通讯. (1)自由串口协议 (2)Modbus协 ...

  9. 西门子PLC Wincc大型程序scl+梯形图变频器G120 伺服 S120 远程终端ET200SP

    西门子PLC Wincc大型程序scl+梯形图变频器G120 伺服 S120 远程终端ET200SP 写法经典,1500用到极致,实际使用中程序,有电气图 详细英文注释,请看清,英文注释 和MES通讯 ...

最新文章

  1. Web图形开发,SVG还是VML?
  2. Go 结构体的值传递和地址传递
  3. linux shell之IFS分割字符串
  4. Pytorch cifar10离线加载二进制文件
  5. 如何把UIView转成UIImage,解决模糊失真问题
  6. Protobuf介绍及简单使用(下)之文件读写
  7. Nginx工作原理及相关介绍
  8. levelshifter工作原理_从滑块问题看Level Shifter中Latch的状态转换
  9. 禁用计算机服务LanmanServer,[如何]在Windows 10中启用或禁用SMB协议 | MOS86
  10. jquery 选择器 逗号
  11. [转载] 中华典故故事(孙刚)——19 万岁
  12. SonarQube代码审查工具
  13. Nacos忘记密码Nacos密码加密方式
  14. Hexo写博客时的图片问题
  15. 2021年疫情再度爆发,面对停课教培机构该如何应对?
  16. mme 服务器位置,MME、PGW、SGW和PCRF的介绍
  17. 可用于飞书上的机器人上线啦
  18. MFC画带箭头的直线
  19. Using Memory Efficiently(Pro Android Apps Performance Optimization)
  20. JAVA 设计模式(三)—— 设计模式之工厂模式

热门文章

  1. 协同学:大自然构造的奥秘--哈肯
  2. 米老师验收ITOOjava5.0------米老师语录
  3. 就在今天!当当科技品类日满100减50
  4. 榆熙教育:拼多多平台考核如何达成系统考核指标
  5. OAuth2客户端springsecurity5 - 神经病的缥缈之旅
  6. (吊灯止损和YOYO止损) --- ATR作为入场工具的应用示例
  7. 关于三点演讲与口才训练方法
  8. hiper工具查看页面加载时间
  9. 这应该是我见过最好的机房监控解决方案了!
  10. Invalid name supplied, making object name syntactically valid. New object name is Seurat..ProjectDim