记录|C#连接PLC通讯

参考视频C#连接S71200PLC
参考资料


前言

学习完了如何用LabVIEW连接PLC后,进行下一步如何使用C#连接PLC。
这里会进行”控制台连接“和”窗口连接“两种方式。
在这里插入图片描述


一、使用工具

  • 软件:
    • Visual Studio2022,
    • HslCommunication【VS插件】
    • 博图PLCSim V16
  • 硬件:
    • PLC硬件
    • 网线

二、博图PLC

1.创建好PLC设备

Step1. 创建新设备

在这里插入图片描述

Step2. 自动配置CPU

  • 对于创建的空白CPU,我们直接点击“获取”。【这里的前提是,已经有实体PLC,并且PLC通过网线和电脑相连接】。
  • 在新界面中,选择好接口,点击搜索,最后点击检测,就能实现根据实际PLC硬件来配备CPU。

在这里插入图片描述

Step3. 配置IP协议和连接机制

在这里插入图片描述

隐藏步骤:重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容

点击“在线连接”后,会自动断开,并出现下面的标志,就代表版本不兼容。
在这里插入图片描述
首先,选择CPU,右击“更改设备“,擦看版本是否对。我这里明显需要4.2版本的。【这里版本需要小伙伴自己确认】
在这里插入图片描述
之后点击”在线“查看
在这里插入图片描述

如果还是没解决,那么最后一招:重置
在这里插入图片描述

Step4. 通过HslDemo来测试是否连通

在这里插入图片描述

Step5. 配置DB数据块【连通后才有意义,之后配置好后只需写入设备】

对数据块配备数据的时候,必须将属性中的优化和指定访问可去掉。
在这里插入图片描述

问题:如何将DB块下载到设备中

【如下图】我遇到了DB块下载不进设备中的问题:
在这里插入图片描述
右击“数据块_1[DB1]”,选择实际值的快照。
在这里插入图片描述
【第二次下载数据到设备中时,将出现下面数据库重新初始化的问题】
在这里插入图片描述
这里可以先选择”将快照值复制到起始值中“
在这里插入图片描述


三、VS控制台连接

Step1 新建项目

在这里插入图片描述
对于新建的项目,添加个S7.net插件。【下图所示:
在这里插入图片描述
在项目文件中导入using S7.Net;

在这里插入图片描述
在这里插入图片描述
编写测试连接程序:
在这里插入图片描述
上面的Read()方法只是简单演示,这么用不够高效,可以看Read()方法使用
结果显示为:
在这里插入图片描述

Step2. 编写

依据

Read()方法使用

结合我在PLC中DB块中设置的内容,C#编程中的Read()内容修改为如下【个人认为比DBX,DBB,DBW这些表示好懂多了】

using S7.Net;

namespace C__Link_S71200
{

    internal class Program
    {
    //实例化的同时,建立和PLC的连接
        static Plc my1200 = new Plc(CpuType.S71200,"192.168.0.10",0,1);
       
        static void Main(string[] args)
        {
            my1200.Open();
            do
            {
                int db = 1;
                var readValue = my1200.Read(DataType.DataBlock,db,2,VarType.Int,1);
                Console.WriteLine($"从偏移量为2的位置开始,读取1个Int类型的数据,值为:{readValue}");

                readValue = my1200.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
                Console.WriteLine($"从偏移量为4的位置开始,读取1个Int类型的数据,值为:{readValue}");

                
                Thread.Sleep(3000);
                Console.Clear();

            } while (true);
        }
    }
}

我的VS运行后的结果为:
在这里插入图片描述

补充:DB块知识

参考文章:《西门子DB

  • DB数据块

  • DB100:指编号为100的数据块;

    • DBX0.0:在数据块中,第一个字的第一个位。
    • DB100.DBX0.0:编号为100的数据块中,第一个字节的第一位的值
  • DBW2,第二个字,一个字2个字节,共16位。存储Int数据。
    DBX0,一个字节,存储Bool类型数据。
    DB0,32位,存储Real类型数据。

特别注意

  • 编程中的int是32位。而PLC中的Int和Word型都是16位。【天坑】

四、VS的窗口连接

1. 创建Windows窗体项目

在这里插入图片描述
在这里插入图片描述


2. 配置连接

在这里插入图片描述

在这里插入图片描述

3. 按钮进行读写控制

效果展示

在这里插入图片描述


开关按钮
  • 功能:控制PLC连接,依据是否连接更改按钮的颜色
  • 绿色代表连接上;灰色表示未连接上【这一步在定时器中做了,也可以在按钮中做】
    代码 :
        private void button1_Click(object sender, EventArgs e)
        {
            //关闭连接,按钮变银色;建立连接,按钮变绿色【颜色变化在定时器中做了,也可以在这里的按钮做】
            if (my1200.IsConnected)
            {
                my1200.Close();
            }
            else
            {
                my1200.Open();
            }

        }

定时器
  • 功能:设定多长时间后执行什么动作。
  • 这里设定500ms后进行连接按钮的颜色变化。-在这里插入图片描述

代码:

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (my1200.IsConnected)
            {
                button1.BackColor = Color.Green;
                button1.Text = "已连接";
            }
            else
            {
                button1.BackColor = Color.Gray;
                button1.Text = "未连接";
            }
        }

修改数据按钮
  • 功能:根据点击按钮,实现更改DB块中DB1.DBX0.0的位置的值
        private void button2_Click(object sender, EventArgs e)
        {
            bool value = (bool)my1200.Read("DB1.DBX0.0");
            //更改后的值为1,那么按钮显示绿色,否则显示为灰色。
            button2.BackColor = !value ? Color.Green : Color.Gray;
            my1200.Write("DB1.DBX0.0", !value);
            textBox1.Text = "DB1.DBX0.0的值:" + my1200.Read("DB1.DBX0.0").ToString();

        }
显示文本
  • 功能:显示文本内容。这里面我们不用写任何代码,直接用textBox1.Text直接赋值即可。调用代码已经在上面的"修改数据按钮"的代码中出现了。

C#中的部分问题解决【持续补充

1. textbox无法调整大小

在这里插入图片描述
在这里插入图片描述


2. Boolean对象强制转换String对象错误

在这里插入图片描述
解决方法:
用ToString()解决

textBox1.Text = my1200.Read("DB1.DBX0.0").ToString();

3. Read()方法使用

参考文章c#使用s7netplus读取plc数据
其中:

  • db=1,代表DB1
    在这里插入图片描述
  • DataBlock是默认值

简单用例:
单个值读写

int db = 1;
//读取bool
//参数分别为数据块类型,数据块,偏移量,读取类型,读取个数
var boolDemo = plc.Read(DataType.DataBlock, db,  0, VarType.Bit,  1);
 
Console.WriteLine("bool值打印:" + boolDemo);

//写入bool
plc.Write(DataType.DataBlock, db, 0, false);//false表示写入的值

多个值读写【数组

short[] arr_short_int = new short[10];

arr_short_int = (short[])my1200.Read(DataType.DataBlock, db, 2, VarType.Int, 10);

Console.WriteLine("从偏移量为2的位置开始,连续读取10个数据,值为:");
foreach(var value in arr_short_int)
 {
   Console.WriteLine(value);
 }

4. Write()方法使用

特别注意:plc中的int是c#中的short,所以需要进行类型转换,否则将赋0
正确写入如下:
PLC的Int型

my1200.Write(DataType.DataBlock, db, 2, (short)66);

readValue = my1200.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
Console.WriteLine($"从偏移量为2的位置开始,读取1个Int类型的数据,值为:{readValue}");

我的visual studio运行效果为:
在这里插入图片描述
PLC的Real型
不强转的话,就是默认是double型的62.6,double是64位;而Real是32位。

my1200.Write(DataType.DataBlock, db, 62, (float)62.5);

更新时间线

  • 2024-07-11:创建
  • 2024-07-12:VS控制台连接编写
  • 2024-07-15:窗口编程中的textBox无法修改该部件的大小。实际案例。
  • 2024-07-16:补充Real型的Write写法
03-12
### 使用C#PLC进行交互 对于希望利用C#实现与可编程逻辑控制器(PLC)通信的应用开发者来说,有多种方法可以达成这一目标。一种常见的途径是通过OPC UA (Open Platform Communications Unified Architecture),这是一种被广泛接受的标准协议,用于工业自动化领域中的安全可靠的数据交换[^1]。 #### OPC UA客户端开发 为了创建能够与支持OPC UA标准的任何PLC通讯的应用程序,可以在项目中引入官方提供的NuGet包`Opc.UaFx.Client`或者第三方库如Kepware, Matrikon等公司的产品来简化操作过程。一旦安装好这些工具之后,就可以编写如下所示的基础代码片段来进行简单的读取/写入变量的操作: ```csharp using Opc.Ua; using Opc.UaFx; // 创建连接到指定服务器地址的新会话 var session = new OpcSession("opc.tcp://localhost:4840"); try { await session.ConnectAsync(); // 建立连接 var nodeId = NodeId.Parse("ns=2;s=Channel1.Device1.TagName"); // 从PLC获取特定标签值 object valueRead = await session.ReadNodeValueAsync(nodeId); Console.WriteLine($"The current value is {valueRead}."); // 向PLC发送新数值 await session.WriteNodeValueAsync(nodeId, newValue); } finally { if(session.IsConnected){ await session.DisconnectAsync(); } } ``` 此段代码展示了如何建立一个针对本地运行的服务端口为4840的OPC UA Server的安全TCP/IP连接,并执行基本的数据访问命令。需要注意的是,在实际部署前应当仔细阅读所选产品的文档并遵循最佳实践指南以确保系统的稳定性和安全性。 另外,除了采用标准化接口之外,某些品牌也可能提供专有的SDKs或APIs供程序员调用;例如Siemens S7系列就有专门适用于.NET环境下的S7.Net Plus开源类库可供选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值