提示:参照本文,你可以完成从软件安装到第一个C#通讯实例的快速搭建,少踩一些坑。
关键词:C#,.Net Core,S7 Net Plus,TIA Portal V17,PLCSIM Advanced V4,S7-1500。
C#与西门子PLC通讯 系列文章目录
后续博客参考
如果您觉得新手入门还不过瘾,请继续阅读下面的文章。
C#与西门子PLC通讯——熟手快速入门
番外篇
C#与西门子PLC通讯——手搓S7通讯协议
文章目录
C#与西门子PLC通讯 系列文章目录前言一、环境准备1.1 PLC编程环境准备1.2 PLC仿真环境准备1.3 .Net Core编程环境准备1.4 仿真器网络环境配置 二、PLC创建2.1 运行博图软件2.2 创建一个新项目2.3 组态设备 添加S7-15002.4 属性设置2.4.1 设置项目支持仿真2.4.2 PLC网络设置 2.5 数据块添加2.5.1 添加新块2.5.2 添加数据块内容2.5.3 取消优化的块访问(可选) 三、仿真器创建3.1 运行博图仿真软件3.2 博图仿真软件参数设置 四、PLC程序下载到仿真器4.1 PLC程序装载4.2 监控仿真PLC数据 五、.Net Core读写仿真器5.1 新建项目5.2 安装S7netplus程序包5.3 连接仿真PLC5.4 读写仿真PLC5.5 使用Task多线程自动读写PLC数据 总结
前言
一日,吾遇一电气之士,闻其欲谋转开发之途,叹其敏而好学,故以吾之薄知相赠,遂有此记焉。
本文基于C# .Net Core和西门子博图TIA Portal V17搭建。由于手边没有西门子PLC实物,所以采用S7-PLCSIM Advanced V4.0作为模拟PLC,以实现0成本完成通讯测试实例。
整体架构示意图如下:
注:网络架构中的IP地址可以根据自己的实际情况进行调整。
一、环境准备
博图V17安装包资源:https://www.jb51.net/softs/777828.html
Visual Studio Community 开发工具:https://visualstudio.microsoft.com/zh-hans/vs/community/
注意:完成本章任务大约耗时半天,请合理安排时间。
1.1 PLC编程环境准备
首先,安装博图软件,双击运行Start.exe,安装前后都要求重启,一路点“下一步”,勾选条款和安全设置即可完成安装。
如果安装中出现问题,请自行搜索:西门子博图v17安装教程。
1.2 PLC仿真环境准备
其次,安装博图仿真软件,双击运行Start.exe,安装前后也是按要求重启,一路点“下一步”,勾选条款和安全设置即可完成安装。
如果安装中出现问题,请自行搜索:西门子博图 S7-PLCSIM Advanced V4安装教程。
1.3 .Net Core编程环境准备
然后,安装集成开发环境 (IDE),双击运行VisualStudioSetup.exe,按需勾选C#相关的桌面应用开发。
如果安装中出现问题,请自行搜索:Visual Studio 2022 安装教程。
1.4 仿真器网络环境配置
最后,配置一下静态IP。安装博图软件之后,可以在网络连接中找到Siemens PLCSIM Virtual Ethernet Adapter
。
将IP地址手动设置为:192.168.0.200 ;将子网掩码手动设置为:255.255.255.0。
至此,环境准备部分完成。
二、PLC创建
2.1 运行博图软件
2.2 创建一个新项目
选择【创建新项目】,填写好项目名称(如:仿真PLC)后,点击【创建】按钮。
2.3 组态设备 添加S7-1500
操作步骤如下:
选择【设备与网络】 ;选择【添加设备】 ;选择需要的PLC(以S7-1511为例 );点击【添加】。
2.4 属性设置
2.4.1 设置项目支持仿真
右击项目名称(如:仿真PLC),选择【属性】。
找到【保护】页签,勾选√【块编译时支持仿真】,点击【确定】。
2.4.2 PLC网络设置
首先,设置PLC以太网为静态IP:
选择【设备组态】 ;选择对应的【PLC】图标;选择【常规】;选择【以太网地址】;将PLC地址设为静态IP:192.168.0.100。
然后,设置PLC允许PUT/GET:
选择【防护与安全】-【连接机制】;勾选√【允许来自远程对象的PUT/GET通信访问】。
2.5 数据块添加
2.5.1 添加新块
给PLC添加仿真用的数据块 :
选择【添加新块】 ;输入【名称】,如:仿真数据块 ;选择【数据块】 ;点击【确定】。
2.5.2 添加数据块内容
在数据块内添加内容如:
布尔量 - Bool ;整形量 - Int ;数组字 - Array[0…9] of Word。
2.5.3 取消优化的块访问(可选)
为了能够方便后续查看偏移量,取消勾选【优化的块访问】,具体操作如下:
右击数据块名称(如:仿真数据块),选择【属性】。

三、仿真器创建
3.1 运行博图仿真软件
3.2 博图仿真软件参数设置
操作步骤如下:
将开关拨到【PLCSIM Virtual Eth. Adapter】;展开【Start Virtual S7-1500 PLC】;输入配置参数,name :Sim1511;IP Address:192.168.0.100;Subnet mask:255.255.255.0;点击【Start】。
操作完成后,仿真PLC将显示在清单中,此时可以看到有一个黄色小方块,表示仿真器还没有程序运行。
四、PLC程序下载到仿真器
4.1 PLC程序装载
点击【下载到设备】- 【认为可信并建立连接】。





4.2 监控仿真PLC数据
点击【全部监视】 。可以在【监视值】中任意修改PLC数值。
五、.Net Core读写仿真器
5.1 新建项目
找到VS2022 IDE,点击运行。
如果是其他版本,也可以参照操作,但不保证完全一致。
点击【创建新项目】。
选择【C#】- 选择【控制台】- 【控制台应用】-【下一步】。
填写【项目名称】- 选择项目文件夹 - 【下一步】。
【下一步】。
进入代码窗口。
5.2 安装S7netplus程序包
进入NuGet包管理界面(路径:【工具】-【NuGet包管理器】-【管理解决方案的NuGet程序包】)。



5.3 连接仿真PLC
回到Program代码窗口中。
在第一行引用S7netplus程序包:using S7.Net;
将Main函数修改为: static void Main(string[] args) { Plc plc = new Plc(CpuType.S71500, "192.168.0.100", 0, 1); plc.Open(); if (plc.IsConnected) { Console.WriteLine("连接成功"); } plc.Close(); }
查看运行结果。
Plc plc = new Plc(CpuType.S71500, "192.168.0.100", 0, 1);
变量 | 含义 |
---|---|
CpuType.S71500 | PLC的类型 |
“192.168.0.100” | PLC IP地址 |
0 | 机架号 |
1 | 槽号 |
5.4 读写仿真PLC
接下来,稍微改造一下连接PLC的代码,增加读写功能。
using S7.Net;namespace SimS71500{ internal class Program { static void Main(string[] args) { Plc plc = new Plc(CpuType.S71500, "192.168.0.100", 0, 1); plc.Open(); // 接收键入的值 string inputKey = ""; bool boolFlag = false; short iCount = 1; while (plc.IsConnected && inputKey != "q") { Console.Clear(); Console.WriteLine("连接成功"); // 布尔量 plc.Write("DB1.DBX0.0", boolFlag); // 整形量 plc.Write("DB1.DBW2", iCount); // 数组字中的第一个元素 plc.Write("DB1.DBW4", (short)(iCount * 2)); // 数组字中的剩余元素 short[] arrValues = new short[9]; // 你要写入的新值数组 for (int i = 0; i < arrValues.Length; i++) { arrValues[i] = (short)(iCount + 1 + i); } plc.Write("DB1.DBW6", arrValues); // 布尔量 Console.WriteLine(plc.Read("DB1.DBX0.0")); // 整形量 Console.WriteLine(plc.Read("DB1.DBW2")); // 数组字中的第一个元素 Console.WriteLine(plc.Read("DB1.DBW4")); // 数组字中的剩余元素 short[] remainArr = (short[])plc.Read(DataType.DataBlock, 1, 6, VarType.Word, 9); for (int i = 0; i < remainArr.Length; i++) { Console.Write(remainArr[i] + "\t"); } iCount++; boolFlag = !boolFlag; inputKey = Console.ReadLine(); } plc.Close(); } }}
代码解析:
“DB1”表示PLC中的数据块编号。
“DBX”和“DBW”表示读取的数据类型,这个影响数据截取的长度。
“DBX”和“DBW”后面紧跟着的数字表示偏移量,如:DBX0表示偏移量为0,DBW2表示偏移量为2。
另外,“DB1.DBX0.0”中,最后一个0表示字节偏移量为0,这与PLC存储数据的格式有关。plc.Read(DataType.DataBlock, 1, 6, VarType.Word, 9)是读取指定数据块、起始位置、数据类型和读取长度的方法。本篇文章不过多解释。
5.5 使用Task多线程自动读写PLC数据
继续改造一下代码,加入Task多线程,readPLCTask线程用于读取PLC,writePLCTask线程用于写入PLC。
using S7.Net;namespace SimS71500{ internal class Program { static void Main(string[] args) { Plc plc = new Plc(CpuType.S71500, "192.168.0.100", 0, 1); plc.Open(); // 接收键入的值 string inputKey = ""; bool boolFlag = false; short iCount = 1; Task readPLCTask = Task.Factory.StartNew(() => { while (plc.IsConnected && inputKey != "q") { Console.Clear(); // 布尔量 Console.WriteLine(plc.Read("DB1.DBX0.0")); // 整形量 Console.WriteLine(plc.Read("DB1.DBW2")); // 数组字中的第一个元素 Console.WriteLine(plc.Read("DB1.DBW4")); // 数组字中的剩余元素 short[] remainArr = (short[])plc.Read(DataType.DataBlock, 1, 6, VarType.Word, 9); for (int i = 0; i < remainArr.Length; i++) { Console.Write(remainArr[i] + "\t"); } Task.Delay(200).Wait(); } }); Task writePLCTask = Task.Factory.StartNew(() => { while (plc.IsConnected && inputKey != "q") { // 布尔量 plc.Write("DB1.DBX0.0", boolFlag); // 整形量 plc.Write("DB1.DBW2", iCount); // 数组字中的第一个元素 plc.Write("DB1.DBW4", (short)(iCount * 2)); // 数组字中的剩余元素 short[] arrValues = new short[9]; // 你要写入的新值数组 for (int i = 0; i < arrValues.Length; i++) { arrValues[i] = (short)(iCount + 1 + i); } plc.Write("DB1.DBW6", arrValues); iCount++; boolFlag = !boolFlag; Task.Delay(200).Wait(); } }); inputKey = Console.ReadLine(); plc.Close(); Task.WaitAll(readPLCTask, writePLCTask); } }}
总结
这篇入门笔记解决了新手第一次上手实践时遇到的坑,并且有意忽略了实际项目中会遇到的逻辑交互和更多的数据格式问题。为新手上手建立信心,帮助新手建立起与Siemens S7-1500 PLC的仿真器连接和数据交互的基础。如果需要在实际项目中使用,还需要进一步学习和了解PLC编程、通信协议和C# .Net Core技术。
这文档主要介绍了如何使用C# .Net Core和S7 Net Plus库连接到Siemens S7-1500 PLC的仿真器,并进行读写操作。
以下是一些关键步骤和总结:
欢迎在评论区交流。