记录|C#连接PLC通讯

小白鼠零号 2024-08-27 12:05:02 阅读 68

参考视频C#连接S71200PLC

参考资料

目录

前言一、使用工具二、博图PLC1.创建好PLC设备Step1. 创建新设备Step2. 自动配置CPUStep3. 配置IP协议和连接机制隐藏步骤:重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容Step4. 通过HslDemo来测试是否连通Step5. 配置DB数据块【连通后才有意义,之后配置好后只需写入设备】问题:如何将DB块下载到设备中

三、VS控制台连接Step1 新建项目Step2. 编写补充:DB块知识特别注意

四、VS的窗口连接1. 创建Windows窗体项目2. 配置连接3. 按钮进行读写控制`效果展示``开关按钮``定时器``修改数据按钮``显示文本`

C#中的部分问题解决【持续补充1. textbox无法调整大小2. Boolean对象强制转换String对象错误3. Read()方法使用4. Write()方法使用

更新时间线


前言

学习完了如何用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;

在这里插入图片描述

在这里插入图片描述

编写测试连接程序:

在这里插入图片描述

<code>上面的Read()方法只是简单演示,这么用不够高效,可以看Read()方法使用

结果显示为:

在这里插入图片描述

Step2. 编写

依据

Read()方法使用

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

<code>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. 按钮进行读写控制

<code>效果展示

在这里插入图片描述


<code>开关按钮

功能:控制PLC连接,依据是否连接更改按钮的颜色绿色代表连接上;灰色表示未连接上【这一步在定时器中做了,也可以在按钮中做】

代码 :

private void button1_Click(object sender, EventArgs e)

{

//关闭连接,按钮变银色;建立连接,按钮变绿色【颜色变化在定时器中做了,也可以在这里的按钮做】

if (my1200.IsConnected)

{

my1200.Close();

}

else

{

my1200.Open();

}

}


定时器

功能:设定多长时间后执行什么动作。这里设定500ms后进行连接按钮的颜色变化。-

在这里插入图片描述

代码:

<code> 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()解决

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


3. Read()方法使用

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

其中:

db=1,代表DB1

在这里插入图片描述

DataBlock是默认值

简单用例:

单个值读写

<code>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运行效果为:

在这里插入图片描述

<code>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写法



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。