C#与西门子PLC通讯——新手快速入门

提示:参照本文,你可以完成从软件安装到第一个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-1500
    • 2.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 连接仿真PLC
    • 5.4 读写仿真PLC
    • 5.5 使用Task多线程自动读写PLC数据
  • 总结

前言

一日,吾遇一电气之士,闻其欲谋转开发之途,叹其敏而好学,故以吾之薄知相赠,遂有此记焉。

本文基于C# .Net Core和西门子博图TIA Portal V17搭建。由于手边没有西门子PLC实物,所以采用S7-PLCSIM Advanced V4.0作为模拟PLC,以实现0成本完成通讯测试实例。

整体架构示意图如下:

上位机与PLC的网络架构示意图

注:网络架构中的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编程环境准备

VisualStudio安装程序

然后,安装集成开发环境 (IDE),双击运行VisualStudioSetup.exe,按需勾选C#相关的桌面应用开发。

VisualStudio安装界面

如果安装中出现问题,请自行搜索:Visual Studio 2022 安装教程。

1.4 仿真器网络环境配置

以太网图例

最后,配置一下静态IP。安装博图软件之后,可以在网络连接中找到Siemens PLCSIM Virtual Ethernet Adapter。

  • 将IP地址手动设置为:192.168.0.200 ;
  • 将子网掩码手动设置为:255.255.255.0。

网络IP地址设定

至此,环境准备部分完成。

二、PLC创建

2.1 运行博图软件

博图软件快捷方式

2.2 创建一个新项目

创建新项目窗口

选择【创建新项目】,填写好项目名称(如:仿真PLC)后,点击【创建】按钮。

2.3 组态设备 添加S7-1500

PLC组态

操作步骤如下:

  1. 选择【设备与网络】 ;
  2. 选择【添加设备】 ;
  3. 选择需要的PLC(以S7-1511为例 );
  4. 点击【添加】。

2.4 属性设置

2.4.1 设置项目支持仿真

右击项目名称(如:仿真PLC),选择【属性】。

项目右击属性

找到【保护】页签,勾选√【块编译时支持仿真】,点击【确定】。

项目保护设置

2.4.2 PLC网络设置

首先,设置PLC以太网为静态IP:

  1. 选择【设备组态】 ;
  2. 选择对应的【PLC】图标;
  3. 选择【常规】;
  4. 选择【以太网地址】;
  5. 将PLC地址设为静态IP:192.168.0.100。

PLC以太网地址

然后,设置PLC允许PUT/GET:

  1. 选择【防护与安全】-【连接机制】;
  2. 勾选√【允许来自远程对象的PUT/GET通信访问】。

设置PLC允许PUT/GET

2.5 数据块添加

2.5.1 添加新块

创建数据块

给PLC添加仿真用的数据块 :

  1. 选择【添加新块】 ;
  2. 输入【名称】,如:仿真数据块 ;
  3. 选择【数据块】 ;
  4. 点击【确定】。

2.5.2 添加数据块内容

在数据块内添加内容如:

  • 布尔量 – Bool ;
  • 整形量 – Int ;
  • 数组字 – Array[0…9] of Word。

添加数据块内容

2.5.3 取消优化的块访问(可选)

为了能够方便后续查看偏移量,取消勾选【优化的块访问】,具体操作如下:

  1. 右击数据块名称(如:仿真数据块),选择【属性】。

    数据块属性

  2. 选择【属性】-取消勾选【优化的块访问】-点击弹出窗口的【确定】-点击【确定】。

    取消优化的块访问

三、仿真器创建

3.1 运行博图仿真软件

博图仿真软件

3.2 博图仿真软件参数设置

在这里插入图片描述

操作步骤如下:

  1. 将开关拨到【PLCSIM Virtual Eth. Adapter】;
  2. 展开【Start Virtual S7-1500 PLC】;
  3. 输入配置参数,name :Sim1511;IP Address:192.168.0.100;Subnet mask:255.255.255.0;
  4. 点击【Start】。

操作完成后,仿真PLC将显示在清单中,此时可以看到有一个黄色小方块,表示仿真器还没有程序运行。

仿真PLC清单

四、PLC程序下载到仿真器

4.1 PLC程序装载

  1. 点击【下载到设备】- 【认为可信并建立连接】。

    下载到设备

  2. 在弹出窗口中【开始搜索】仿真PLC。

    开始搜索

  3. 选择搜索到的PLC,点击【下载】。

    下载

  4. 勾选【全部覆盖】- 点击【装载】。

    全部覆盖

  5. 选择【启动模块】-点击【完成】。

    启动模块

  6. 在仿真器中可以看到,原来黄色小方块变为了绿色小方块,表示下载成功。

    仿真器中可以看到绿色小方块

4.2 监控仿真PLC数据

  1. 点击【全部监视】 。
  2. 可以在【监视值】中任意修改PLC数值。

在这里插入图片描述

五、.Net Core读写仿真器

5.1 新建项目

  1. 找到VS2022 IDE,点击运行。

    VS2022

    如果是其他版本,也可以参照操作,但不保证完全一致。

  2. 点击【创建新项目】。

    启动窗口

  3. 选择【C#】- 选择【控制台】- 【控制台应用】-【下一步】。

    选择新项目

  4. 填写【项目名称】- 选择项目文件夹 – 【下一步】。

    项目名称

  5. 【下一步】。

    其他信息

  6. 进入代码窗口。

    代码窗口

5.2 安装S7netplus程序包

  1. 进入NuGet包管理界面(路径:【工具】-【NuGet包管理器】-【管理解决方案的NuGet程序包】)。

    NuGet包管理路径

  2. 选择【浏览】页签 – 搜索框输入“S7netplus” – 选择【S7netplus】-勾选项目-点击【安装】。

    NuGet包管理

  3. 点击【OK】。

    预览更改

  4. 可以看到【解决方案资源管理器】中,【包】增加了【S7netplus】库。

    解决方案资源管理器

5.3 连接仿真PLC

回到Program代码窗口中。

  1. 在第一行引用S7netplus程序包:
using S7.Net;
  1. 将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();
        }
  1. 查看运行结果。

    连接仿真PLC运行结果

  2. 关于PLC连接字段的解析。
Plc plc = new Plc(CpuType.S71500, "192.168.0.100", 0, 1);
变量含义
CpuType.S71500PLC的类型
“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中的数据块编号。

    C#与西门子PLC通讯——新手快速入门

  • “DBX”和“DBW”表示读取的数据类型,这个影响数据截取的长度。

    C#与西门子PLC通讯——新手快速入门

  • “DBX”和“DBW”后面紧跟着的数字表示偏移量,如:DBX0表示偏移量为0,DBW2表示偏移量为2。

    C#与西门子PLC通讯——新手快速入门

  • 另外,“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);
        }
    }
}

自动读写PLC运行结果


总结

这篇入门笔记解决了新手第一次上手实践时遇到的坑,并且有意忽略了实际项目中会遇到的逻辑交互和更多的数据格式问题。为新手上手建立信心,帮助新手建立起与Siemens S7-1500 PLC的仿真器连接和数据交互的基础。如果需要在实际项目中使用,还需要进一步学习和了解PLC编程、通信协议和C# .Net Core技术。

这文档主要介绍了如何使用C# .Net Core和S7 Net Plus库连接到Siemens S7-1500 PLC的仿真器,并进行读写操作。

以下是一些关键步骤和总结:

  • 环境准备:确保你已安装了TIA Portal V17、PLCSIM Advanced V4以及Visual Studio Community。另外,为仿真器的以太网端口配置静态IP地址,以便连接。
  • PLC创建:在TIA Portal中创建一个新项目,然后添加S7-1500 PLC。设置项目支持仿真,并配置PLC的网络参数,包括IP地址和允许PUT/GET通信。
  • 数据块添加:创建一个数据块,定义其中包含的变量,包括布尔、整数和数组类型的数据。
  • 仿真器创建:在PLCSIM Advanced中创建仿真器,并设置参数,包括名称和IP地址。启动仿真器,确保它能被连接。
  • PLC程序下载到仿真器:使用TIA Portal将PLC程序下载到仿真器中。可以在仿真器监视值中查看数据。
  • .Net Core读写仿真器:创建一个C# .Net Core项目,引用S7 Net Plus库。使用库中的Plc类连接到仿真PLC,并进行读写操作。
  • 使用Task多线程自动读写PLC数据:将读和写PLC数据的操作放入不同的线程中,以实现并行操作。这样可以自动地定时读写PLC数据。

欢迎在评论区交流。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/eece0d4984.html