本文参考链接:西门子PLC丨PROFINET通讯仿真(虚拟通讯)做了一些更详细的优化,本文使用的类库并非原作者使用的类库。
首先,昨天项目已经创建好了,这边也加了一个InputField和一个Button,可以实现简单的读取,ok开始。
放入准备好的通讯类库;
新建一个博途的项目,本次测试使用博途V15,测试环境为虚拟机,Unity运行在本地计算机, 建立博途项目流程如下:
新建项目,右键项目-属性-保护-对勾,如图:
不得不说的是,仿真中加密的FB块是无法下载的哦~
添加CPU,本次使用S7-1200 系列,设置CPU安全等级,允许PUT/GET通信,300/400应该是没有的,可以正常用。
写程序,写完程序后重点来咯~~~以下内容,尤其是仿真和开工具的顺序很重要。
首先关闭虚拟机防火墙,都会吧。。。
虚拟机设置网络为桥接,选择好本机用的网卡。
设置CPU的IP,如下图,192.168.10.25:
设置虚拟机网卡IP,最好手动,要不然麻烦。我设置192.168.10.10(必须全部同网段)
然后管理员身份运行NetTOPLCSIM;(仿真之前运行)
上图提示获取端口,点击是即可,如果后期出现问题,也可以点击tools进行获取。 下图获取成功后点击OK
然后点击PLCSIM,点击确定
然后出现PLCSIM,直接搜索下载即可。
可以看到我们仿真已经成功了
然后点击nettoplcsim的Add,添加一个服务;
不要自己手动输入,要检测出来的。
注意观察下面的槽号要求;
设置完成点击OK,点击启动服务;
服务启动之后,我们进入客户端层面,Unity3D简单写了一个读取的脚本,代码如下(注释写的很清楚了):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PLC通讯库.Siemens;//引入类库
using Siemens;//引入类库
using System.Threading;//新开线程不影响主线程,注意,该线程不适用于Unitty中组件的操作。
using UnityEngine.UI;//引入UI可以操作UI,不多说都懂
public class OP : MonoBehaviour
{
public InputField floattext;
Thread CONPLCNOW;//定义PLC连接线程,读取数据量不大,就不新建线程了
public SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200);//实例化类库
// Start is called before the first frame update
void Start()
{
//不加按钮了,直接运行就实例化然后连接
CONPLCNOW = new Thread(CON);//定义线程方法
CONPLCNOW.Start();//执行线程
}
private void CON(){//这里是连接PLC用的方法
siemensS7Net.IpAddress = "192.168.10.10";//定义所要连接PLC
siemensS7Net.Port = 102;//定义端口号S7NET通用102
siemensS7Net.ConnectServer();//连接PLC
if (siemensS7Net.ConnectServer().IsSuccess)//判断打印,不说了
{
print("连接成功");
}
else {
print(siemensS7Net.ConnectServer().ToMessageShowString());
}
}
public void readfloat()//定义读取按钮点击的方法
{
floattext.text = siemensS7Net.ReadFloat(floattext.text).Content.ToString();//读取并赋值,相信大家都能看懂。
}
// Update is called once per frame
private void OnDestroy()
{
CONPLCNOW.Abort();//记得关闭线程哦
}
}
可以看到图中PLC的IP是10而不是25,因为信息是通过转发的。
在客户端添加一个IP,如下图,我客户端IP为192.168.10.200
将button的点击事件绑定readfloat(),将定义的Iputfield挂到脚本上,以下是Unity基本操作,可以略过。
运行一下看看~
OK!已经连接成功啦,那我们尝试一下读取数据(上动图!)
欧克!这篇文章里,写了太多,要类库的可以私信但是不知道啥时候能回复。