C#中使用S7.net与西门子PLC通讯

最近因为工作的原因用到了西门子PLC,在使用过程中一直在思考上位机和PLC的通讯问题,后来上网查了一下,找到了一个专门针对S7开发的一个.net库–《S7netPlus》,PLC通讯方法比较多,所以也是在不断地学习中,以下内容如有不足之处,望大神予以指教。

公司设备一直都用的PLC做下端设备的控制,但是目前都没有专职做上位机的,而我之前对PLC又接触的比较少,做起来还是比较难的。。

查找了一堆资料后,终于找到了这个.net库,在大致学习了一下之后,总结了一下,当作自己的学习笔记。

一、开发环境准备

最近因为疫情的影响,只能呆在总公司混日子,手里没有设备,只能用博图的仿真器来测试通讯,需要安装的软件包括:

  • Visual Studio 2015
  • TIA Portal V15
  • S7-PLCSIMV15
  • NetToPLCSIM-S7
    这里先放个下载连接:S7Net.dll、NetToPLCSIM、S7Net使用手册

TIA Protal(博图)&S7-PLCSIM

西门子针对于PLC专门开发的一款编程软件,相信各位肯定比我熟悉这个软件了,这里就不作过多介绍了,同时提供了S7系列的仿真软件S7-PLCSIM,这里我们就用这两个设备仿真PLC设备来测试S7NETPlus库的通讯。
在这里插入图片描述

博图V15.1

在这里插入图片描述

S7-PLCSIM

NetToPLCSIM

在这里插入图片描述

这个软件是用于将西门子的PLCsim映射到网络内,如果之前没有用过这个软件,建议按照后面的操作来,否则很容易出现Start server之后还是连不上仿真器。

二、开发测试

PLC配置

1、在组态好的PLC设备属性中,找到“防护与安全”–>“连接机制”中,勾选“允许来自远程对象的PUT/GET通信访问”;

在这里插入图片描述

2、新建DB块,同时将该DB快属性中的“优化块的访问取消”;

在这里插入图片描述

3、在新建的DB块中新增一些数据,完成后点击编译计算偏移量。

在这里插入图片描述

4、以上步骤完成后,点击开始仿真,将工程下载到仿真器中;

在这里插入图片描述

NetToPLCSIM配置

1、打开软件后,点击Add增加设备

2、在弹出的窗口中,Network IP Address中填入本地回环IP“127.0.0.1”(如果你是在两台设备中测试,首先保证两台设备在同一个内网中,该处IP就可以设置为运行仿真环境的IP了)

在这里插入图片描述

3、Plcsim IP Address中,点击后面两个点,选择软件自己识别出来的仿真器地址;

在这里插入图片描述

4、Plcsim Rack/Slot中Rack为机架号,Slot为插槽号,这两个可以在PLC的设备组态属性->项目信息中找到

配置完成后点击完成,这时候就可以点击Start Server开启服务了。

在这里插入图片描述

上面的操作一定要按照以上的步骤一步一步完成,否则很容易出现即使点Start Server显示状态为running,但是实际连接仍然连不上的情况。

另外需要注意的是,可能在打开NetToPLCSim的时候,会弹出“Port 102 is in use!”的警告,如果遇到这个情况,点击是,之后在将PLCSIM关掉重新启动一下就可以了。
在这里插入图片描述

创建连接

配置连接

这里使用的是S7-1215的模块,所以CpuType选择S71200,IP地址使用回环地址“127.0.0.1”,机架号和插槽号在PLC工程中查。

using S7.Net;Plc plc = new Plc(CpuType.S71200, "127.0.0.1", 0, 1);		

配置完成后,使用Open()来打开,在最早的一个版本中,Open有返回值,可以通过返回值获取 ErrorCode 和 ErrorMessage,我目前使用的是最新版0.8.1.0,没有返回值,所以用try…catch来接收异常

try
{plc.Open();
}
catch(Exception)
{Console.WriteLine($"连接到PLC设备失败:IsConnect = {plc.IsConnected},IsAvailable={plc.IsAvailable}");return;
}

连接是否成功,可以用IsConnected去判断一下。

访问数据块

连接成功后,我们就可以去访问PLC的数据块了,访问数据块,我们先尝试一下读取数据块

读取单个数据–Read

这里主要用到了DBX,DBW,DBD读取数据,其他的各位可以在查一下PLC的资料

/*
方法:public object Read(string variable)
入参:读取数据地址
出参:Object类型数据,可强制类型转换
*/
var db1Bool1 = plc.Read("DB1.DBX0.0");
Console.WriteLine("DB1.DBX0.0:" + db1Bool1);bool db1Bool2 = (bool)plc.Read("DB1.DBX0.1");
Console.WriteLine("DB1.DBX0.1:" + db1Bool2);int IntVariable = (ushort)plc.Read("DB1.DBW2.0");
Console.WriteLine("DB1.DBW2.0:" + IntVariable);float RealVariable = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();
Console.WriteLine("DB1.DBD4.0:" + RealVariable);var dIntVariable = (uint)plc.Read("DB1.DBD8.0");
Console.WriteLine("DB1.DBD8.0: " + dIntVariable);var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
Console.WriteLine("DB1.DBD12.0: " + Convert.ToString(dWordVariable, 16));var wordVariable = (ushort)plc.Read("DB1.DBW16.0");
Console.WriteLine("DB1.DBW16.0: " + Convert.ToString(wordVariable,16));

在这里插入图片描述

读取批量数据块–ReadBytes
/*
方法:public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count)
入参:1、DataType数据类型,可选择从DB块或者Memory中读取;2、db:1:DataBlock=1,Memory=0;3、startByteAdr:起始地址,即DB块的起始偏移量;4、count:读取大小,该大小由读取的DB块的最后一个数据的偏移量和大小决定,这里最后一个字节WordVariable偏移量为16,数据类型为word,2个字节,因此此次读取为16+2=18个字节。
出参:Byte[],这里Byte[]的大小必然和count的大小是相同的,
*/
//读取数据选择从DB块中读取,db设置为1,起始地址为0,读取18个字节
var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 18);
//取字节0中的第0位
var db1Bool1 = bytes[0].SelectBit(0);
Console.WriteLine("DB1.DBX0.0:" + db1Bool1);
//取字节0中的第1位
bool db1Bool2 = bytes[0].SelectBit(1); ;
Console.WriteLine("DB1.DBX0.1:" + db1Bool2);
//跳到字节2并连续取两个字节数据
int IntVariable = S7.Net.Types.Int.FromByteArray(bytes.Skip(2).Take(2).ToArray());
Console.WriteLine("DB1.DBW2.0:" + IntVariable);
//...
double RealVariable = S7.Net.Types.Real.FromByteArray(bytes.Skip(4).Take(4).ToArray());
Console.WriteLine("DB1.DBD4.0:" + RealVariable);
//...
int dIntVariable = S7.Net.Types.DInt.FromByteArray(bytes.Skip(8).Take(4).ToArray());
Console.WriteLine("DB1.DBD8.0: " + dIntVariable);
//...
uint dWordVariable = S7.Net.Types.DWord.FromByteArray(bytes.Skip(12).Take(4).ToArray());
Console.WriteLine("DB1.DBD12.0: " + Convert.ToString(dWordVariable, 16));
//...
ushort wordVariable = S7.Net.Types.Word.FromByteArray(bytes.Skip(16).Take(2).ToArray());
Console.WriteLine("DB1.DBW16.0: " + Convert.ToString(wordVariable, 16));

在这里插入图片描述

写入单个数据–Write
/*
方法:public void Write(string variable, object value)
入参:1、string variable:写入地址2、object value,写入数据
*/
plc.Write("DB1.DBX0.0", true);
plc.Write("DB1.DBD12.0", 123457);

在这里插入图片描述

写入多个数据–WriteBytes
/*
public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)
用法如同ReadBytes,这里就不在写例程了,有兴趣的可以自己研究一下
*/
读写字符串–String与S7String

有人问到用S7.net读写字符串,大概试验了一下,两种方法基本一致

读字符串分两步操作:
1、获取字符串的长度;
2、从指定地址开始,读取字符串长度;

//String读取
var count = (byte) plc.Read(dataType, dbNumber, address, VarType.Byte, 1);//获取字符串长度
val = (string) plc.Read(dataType, dbNumber, address + 1, VarType.String, count);//获取对应长度的字符串
//S7String读取
var reservedLength = (byte) plc.Read(dataType, dbNumber, address, VarType.Byte, 1);//获取字符串长度
val = (string) plc.Read(dataType, dbNumber, address, VarType.S7String, reservedLength);//获取对应长度的字符串

写入与读取是反向操作,同样的也是要先写入要写入数据的长度,然后在写入数据

//Write写入
plc.Write(dataType, dbNumber, address, val.Length);    //写入长度
plc.Write(dataType, dbNumber, address + 1, val);       //写入字符串
//使用S7String方法构建,需要先构建S7String对应的字节数组,然后将数组写入。
var temp = Encoding.ASCII.GetBytes(val);   //将val字符串转换为字符数组
var bytes = S7.Net.Types.S7String.ToByteArray(val, temp.Length);
plc.WriteBytes(dataType, dbNumber, address, bytes);

关闭连接

在通讯完之后,千万不要忘了关闭通讯链路哈,这里使用Close来关闭。

 plc.Close();

以上内容都是在学习中,中间有很多内容还不完善,后续的内容在学习过程中会不断增加,如有更好的解决方案,欢迎留言一起探讨。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#调用PCHMI与西门子PLC连接通讯

文章目录 一、PCHMI环境配置二、PCHMI连接S7(PLC)三、标签与按钮的使用总结 一、PCHMI环境配置 创建一个新项目 打开项目属性,更改输出路径为"bin\binexe"下 工具箱新建个选择卡,我们命名为PCHMI 鼠标右键【选择项】…

第三方调试助手的与S7-1200 PLC的通信

1、概述 西门子S7-1200 PLC支持多种协议通过以太网通讯方式,如OPC、TCP、S7、MODBUS-TCP等。TCP方式相比其它协议,具有更多的灵活性,更快的数据响应等优点, 需要PLC与电脑还有其他设备进行TCP通讯,使用TCP调试助手与…

TIA 博图 使用 S7通讯 Put Get 对两台PLC进行通讯

1.打开设备组态-属性-找到防护与安全: 把允许来自远程的PUT/GET 通讯访问✔,两台PLC都是这样,把组态下载进去。 2.设备与网络中,用端口1把两台设备连在一起: 两台设备需要在同一个网段里面 3.在PLC3新建一个DB块&#…

文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题

五、V.Pan 发现一种方法,可以用 132 464 次乘法操作完成 68 x 68 的矩阵相乘,发现另一种方法,可以用 143 640 次乘法操作完成 70 x 70 的矩阵相乘,还发现一种方法,可以用155 424次乘法操作完成 72 x 72 的矩阵相乘。当…

【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

目录 🐱背景🐱工具🐱分析流程🐔登陆分析🐔检索分析🐔模拟HTML代码请求🐔 解析HTML🐔 再次分析🐟分析js算法🐟 拿下furl🐟拿下sfname🐟拿下sfname🐔 构造请求🐔再次瓶颈🐔分析cookie🐟 成功演示🐱总结

[云炬python3玩转机器学习]6-2模拟梯度下降法

模拟梯度下降法 In [1]: import numpy as np import matplotlib.pyplot as plt import datetime;print (Run by CYJ,,datetime.datetime.now()) In [2]: plot_x np.linspace(-1., 6., 141) plot_xOut[2]: array([-1. , -0.95, -0.9 , -0.85, -0.8 , -0.75, -0.7 , -0.65…

OneFlow源码解析:静态图与运行时

作者|郑建华 更新|许啸宇、张文骁、成诚 OneFlow静态图的训练效率远高于动态图(eager模式)。本文试图通过一个简单例子,结合v0.8.0版本的代码,解读一下静态图和运行时的实现机制。 在开始之前,建…

infer源码阅读之yolo.cu

目录 yolo.cu注意事项一、2023/3/30更新前言1.宏定义2.Norm3.后处理3.1 affine_project3.2 decode3.2.1 decode_common3.2.2 decode_v8 3.3 nms3.4 invoker 4.预处理5.decode_mask6.AffineMatrix7.InferImpl7.1 adjust_memory7.2 preprocess7.3 load7.4 forwards 8.其它9.拓展之…

【爬虫实例】从B站和某论文网站分析python爬虫的一般编写思路———To someone

问题背景 好久没写爬虫了,前两天友人来问我python能不能爬论文,能不能告诉她爬虫的基本运行原理是什么,跑起来是什么样子。 我一看,论文爬取——爬虫最实用的场景之一,这不拿捏? 于是便尝试现场演示一番。…

【Metaverse系列一】元宇宙的奥秘

你有没有想过逃离闷热的会议室,瞬间移动到马尔代夫的沙滩上开会?开完会,纵身跳入大海和美人鱼捉迷藏。然后一个鲤鱼打挺直冲云霄,进入天宫一号开展科学研究,发现微重力环境下韭菜的长势喜人,而且在特定光照…

科大讯飞版ChatGPT测评:很好很强大

大家好,我是黄海广。 今天我体验到了科大讯飞版本的ChatGPT,这个产品凭借其强大的功能和出色的性能,超出了我对国产大模型的预期。 一、产品简介 这个模型全名叫讯飞星火认知大模型,官方是这么解释这个产品的: “科大讯…

七大语言模型PK,ChatGPT内容基线测评稳居第一

随着ChatGPT的爆火与流行,大型语言模型(LLM)与生成式人工智能(AIGC)不断跃入大众视野,随之也带来了许多内容风险隐患。 近日,知道创宇内容安全专家对互联网上流行的7款大型语言模型进行了全面和…

ChatGPT风靡全球,我们应该为未来感到担心吗?

近期,关于ChatGPT的话题再次引爆全网,不少用户加入到“玩疯了”的阵营中……有赞叹不已的、有表示惊奇的、有展示BUG的,但总体来说,ChatGPT的整体社交评价还是非常向好的。 微软CEO纳德拉就坦言,ChatGPT服务的风靡&…

库克考虑卸任苹果CEO,谁会是下一任接班人?

作者 | Carol 出品 | CSDN(ID:CSDNnews) 十年前,8 月 24 日那天,史蒂夫乔布斯宣布辞去苹果 CEO 一职,正式任命蒂姆库克成为苹果的新掌门人。如今,恰逢库克上任苹果 CEO 十周年。在今年4月份&…

历史上的今天:乔布斯辞去苹果CEO一职;Windows 95 发布

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2022 年 8 月 24 日,14 年前的今天,北京奥运会闭幕式举办,宣告圆满结束,为所有国人打上了一针强心剂。而在科技历史上&am…

最全盘点苹果高管团队 谁有可能成为下一代继任者?

编译|辰辰 出品|网易智能 随着苹果首席执行官蒂姆库克(Tim Cook)已经掌舵10年,他和高级副手们正将更多注意力放在培养公司新一代领导者上。 目前库克管理团队的成员都是在苹果工作20多年,已经赚到数千万美元、年龄在55岁至60岁左右…

行业报告 | AI+制造业赋能,机器视觉开启掘金新大陆(上)

原创 | 文 BFT机器人 01 核心要点 Al制造业赋能,META 发布 SAM 助力机器视觉迎来 GPT 时刻。 机器视觉技术使得工业设备能够“看到”它正在进行的操作并进行快速决策,完整机器视觉系统由硬件软件组成,分别进行成像和图像处理工作。 目前,以“…

2024奇点将至:人类尚未准备好迎接S2F大于100的巨硬资产

奇点将至! “奇点”这个词儿本来是搞人工智能的那帮人从物理学里借用过来唬人的。大意是指所谓AGI通用人工智能降临的那一刻。计算机将在智能上全方位碾压人类。 最近ChatGPT的爆红让无数人产生了错觉,真的彷佛看到AGI近在咫尺。 但是,穿越过…

chatGPT人工智能对话系统H5写作论文毕业论文付费问答写代码分销

ChatGPT对话问答系统是一款功能神奇的人工智能应用,具有广泛的用途和应用领域。以下是一些主要功能: 编写代码:ChatGPT可以帮助用户编写和理解各种编程语言的代码。撰写文案、论文、小说:ChatGPT能够根据用户的需求,协…

万字长文爆肝 DNS 协议!

试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种…