初识上位机(下):C#读写PLC数据块数据
大家好,我是Edison。
作为一个工业自动化领域的程序员,不懂点PLC和上位机,貌似有点说不过去。这里我用两篇小文带你快速进入上位机开发领域。后续,我会考虑再出一个系列文章一起玩工控上位机。上一篇:搭建PLC模拟仿真环境复习一下 在上一篇中,我们通过PLCSIM Advanced软件创建了一个虚拟的西门子S7-1500 PLC如下所示: 然后,我们创建了一个博途的自动化项目,和我们的虚拟PLC进行了组态。在编译完成后,我们创建的数据块中的数据字段就得到了偏移量,如下图所示,0,2,4, 260就是所谓的偏移量,会在后面用到。创建Windows Form项目
这里开始我们就开始使用C#创建一个Windows Form项目,然后通过S7NetPlus库来连接PLC,并读取和写入数据块中的数据,这是一个典型的上位机数据采集的场景。这里我们创建一个.NET Framework 4.8的Windows Form项目,并拖控件完成一个如下图所示的窗体应用界面: 这个窗体提供了连接和断开PLC,以及读取 和 写入 文本框中的数据,接下来我们就来实现这几个功能。实现PLC的连接与断开
要实现S7 PLC的连接和操作,目前已经有很多较为成熟的组件了,我们这里使用S7NetPlus组件,直接通过NuGet安装最新版本即可。
然后编写Connect按钮的Click事件如下:private static Plc s7Instance;public MainForm(){ InitializeComponent();}private void btnConnect_Click(object sender, System.EventArgs e){ if (btnConnect.Text == "Connect") { if (s7Instance == ) s7Instance = new Plc(CpuType.S71500, txtPlcIPAddress.Text.Trim(), 0, 1); s7Instance.Open(); btnConnect.Text = "Disconnect"; } else { s7Instance.Close(); btnConnect.Text = "Connect"; txtBool01.Clear(); txtInt01.Clear(); txtStr01.Clear(); txtStr02.Clear(); }}实现PLC数据块的读取 由于我们在博途项目中设置的数据块是DB01,且只有4个字段,所以这里我们编写ReadData按钮的Click事件如下,它通过指定参数读取到指定类型的数据并绑定到文本框的Text中。
private void btnReadData_Click(object sender, System.EventArgs e){ if (s7Instance == || !s7Instance.IsConnected) { MessageBox.Show("Your PLC is not connected now!", "Error", MessageBoxButtons.OK); return; } // bool var boolData = (bool)s7Instance.Read(DataType.DataBlock, 1, 0, VarType.Bit, 1); txtBool01.Text = boolData ? "1" : "0"; // int var intData = (short)s7Instance.Read(DataType.DataBlock, 1, 2, VarType.Int, 1); txtInt01.Text = intData.ToString(); // string var count = (byte)s7Instance.Read(DataType.DataBlock, 1, 4 + 1, VarType.Byte, 1); // +1表示读取偏移值的长度 var str01Data = Encoding.Default.GetString(s7Instance.ReadBytes(DataType.DataBlock, 1, 4 + 2, count)); // +2表示读取偏移值(跳过)的字符 txtStr01.Text = str01Data; // wstring var str02Data = (string)s7Instance.Read(DataType.DataBlock, 1, 260, VarType.S7WString, 254); txtStr02.Text = str02Data;}(1)针对bool和int类型,我们可以直接通过Read方法快速读取到,但需要告诉PLC准确的读写位置和数据类型,主要是偏移量一定要给正确。
Read方法的参数分别为数据块类型,数据块,偏移量,读取类型,读取长度
(2)针对string和wstring类型,就稍微麻烦一些了:针对string,需要先获取string值的所占长度。再拿到具体byte值。转换为utf8格式的ascci码,具体代码中有体现。+1 表示获取到长度
+2 表示获取到跳过偏移长度的字符
var count = (byte)s7Instance.Read(DataType.DataBlock, 1, 4 + 1, VarType.Byte, 1); // +1表示读取偏移值的长度var str01Data = Encoding.Default.GetString(s7Instance.ReadBytes(DataType.DataBlock, 1, 4 + 2, count)); // +2表示读取偏移值(跳过)的字符
特别注意:string类型只能存储ascci码,需要注意,不能存储中文 !
针对wstring,稍微简单点,但是需要注意的是获取的字符需要为254个 ,因为符号占用了4个字节。实现PLC数据块的写入
和读取一样,通过Write方法即可轻松实现写入,但针对string和wstring仍然是复杂一些,这里我封装了一个S7DataWriter的静态类,提供了两个方法来获取要写入的bytes,因为它无法直接接收C#程序中的string类型。public static class S7DataWriter{ /// <summary> /// 获取西门子PLC字符串数组--String类型 /// </summary> public static byte[] GetPlcStringByteArray(string str) { byte[] value = Encoding.Default.GetBytes(str); byte[] head = new byte[2]; head[0] = Convert.ToByte(254); head[1] = Convert.ToByte(str.Length); value = head.Concat(value).ToArray(); return value; } /// <summary> /// 获取西门子PLC字符串数组--WString类型 /// </summary> public static byte[] GetPlcWStringByteArray(string str) { byte[] value = Encoding.BigEndianUnicode.GetBytes(str); byte[] head = BitConverter.GetBytes((short)508); byte[] length = BitConverter.GetBytes((short)str.Length); Array.Reverse(head); Array.Reverse(length); head = head.Concat(length).ToArray(); value = head.Concat(value).ToArray(); return value; }}然后,我们就可以编写Write Data按钮的Click事件了:
private void btnWriteData_Click(object sender, System.EventArgs e){ if (s7Instance == || !s7Instance.IsConnected) { MessageBox.Show("Your PLC is not connected now!", "Error", MessageBoxButtons.OK); return; } // bool var boolValue = txtBool01.Text.Trim() == "1" ? true : false; s7Instance.Write(DataType.DataBlock, 1, 0, boolValue); // int var intValue = Convert.ToInt16(txtInt01.Text); s7Instance.Write(DataType.DataBlock, 1, 2, intValue); // string s7Instance.Write(DataType.DataBlock, 1, 4, S7DataWriter.GetPlcStringByteArray(txtStr01.Text.Trim())); // wstring s7Instance.Write(DataType.DataBlock, 1, 260, S7DataWriter.GetPlcWStringByteArray(txtStr02.Text.Trim())); MessageBox.Show("Write data successfully!", "Info", MessageBoxButtons.OK);}
效果演示
和读取一样,通过Write方法即可轻松实现写入,但针对string和wstring仍然是复杂一些,这里我封装了一个S7DataWriter的静态类,提供了两个方法来获取要写入的bytes,因为它无法直接接收C#程序中的string类型。(1)读取数据 (2)写入数据小结
本文通过使用C#开发了一个简单的WindowsForm窗体程序,实现了S7 PLC的连接、数据读取和写入。虽然只是一个简单的Demo,但是从中可以看见上位机的基本思想,就是对PLC的数据采集和监控。当然,实现这个目的,不止S7协议一条路,我们还可以通过ModBus、OPC UA等协议,这些就留到后面的专题吧,如果你感兴趣的话,就保持关注哦!源码
GitHub:https://github.com/Coder-EdisonZhou/PLC-Connectors年终总结:Edison的2023年终总结数字化转型:我在传统企业做数字化转型C#刷题:C#刷剑指Offer算法题系列文章目录.NET面试:.NET开发面试知识体系.NET大会:2020年中国.NET开发者大会PDF资料什么是ST语言,三菱PLC两种ST语言创建方法及注意事项
什么是ST语言,ST是结构化文本Structured Text的英文首字母。西门子PLC叫“SCL”,Structured Control Language,意思是结构化控制语言。
GX-Works2/3编程软件的两种PLC程序ST语言创建方法:
1,新建结构化工程,使用ST语言编程。
2,新建简单工程,勾选使用标签,大部分的程序还是用梯形图来编程,在编程窗口要插入的位置,点击鼠标右键→编辑→内嵌ST框插入,或者输入“STB”按回车即可。
ST语言的特点:
条件判断以及四则运算有强大的优势,逻辑顺控不如梯形图直观好用,用梯形图语言插入ST语言可以很方便的写大型模拟量、定位算法的程序。
注意事项:
1,输入法要切换到英文、半角输入模式。
2,在结构化工程模式,输入指令后,接着按“CtrI+F1”系统会提示这条指令的使用规则。在内嵌模式下按CtrI+F1,不能得到提示。程序可直接写在框内,也可以去结构化工程模式下复制,再粘贴到内嵌模式框内。
3,在写的过程中要经常转换/编译,不容易出错。
4,ST语言不能计算32位的数据,要新建标签,用32位的数据类型来标示,再用DMOV读写标签里的数据。
5,一个指令或者元件输入完之后要按空格键表示输入完成。
6,计算的时候,先做乘法再做除法,避免较大误差。
7,ST程序末尾以标点符号“;”结束。
8,注释记法:(*注释*)或//注释//或/*注释*/。
#PLC# #电工学习PLC# #电工#
相关问答
刚刚还用的好好的,三菱plc编程突然间那个输入的方框由蓝色变成了紫色,怎么回事?
按下insert键就ok了,可能你删除时碰到那个键了。按下insert键就ok了,可能你删除时碰到那个键了。
plc触摸屏提示框会卡程序吗?
提示框不会卡程序的,把提示框取消了就可以。提示框不会卡程序的,把提示框取消了就可以。
step7逻辑框怎么编辑?
要编辑Step7逻辑框,您可以按照以下步骤进行操作:首先,打开Step7软件并加载您的项目。然后,选择逻辑框并双击打开它。在逻辑框中,您可以使用不同的功能块...
威纶通触摸屏的位状态开关的地址lb1,对应的是plc的x1吗?
LB存储区是触摸屏内部自己的寄存器,不是PLC上。如果你要对应到X1,在触摸屏的开关量里头,设备要选到所连接的PLC,然后找到下拉框里头找到X触点LB存储区是触摸...
家里电脑没法开机,开机的时候就弹出一个框说没有找到DNSAPI....
在实际应用中定时器的时间范围超过PLC的定时器定时范围时,怎么实现?2470浏览5回答苹果笔记本13寸剪辑视频够吗3049浏览笔记本键盘打斜线怎么打出来的啊?...
欧姆龙plc输入按钮怎样接线?
首先你要弄清楚每个端子的名称,端子名称在PLC上有明确标注,每个框是一个端子。找到对应的端子之后,根据原理图接线就可以啦。不知道你这个PLC是PNP还是NPN的,...
欧姆龙PLC怎么接线?
首先你要弄清楚每个端子的名称,端子名称在PLC上有明确标注,每个框是一个端子。找到对应的端子之后,根据原理图接线就可以啦。不知道你这个PLC是PNP还是NPN的,...
我用的是三菱PLC软件…在进入监视模式时…提示COm错误…我电...
Excel批量修改批注框大小(宽度与高度)?9709浏览最新问答cad三维怎么修剪多余的部分1338浏览7回答oppoa53开发者选项在哪2683浏览5回答怎么知道电脑...
wokrs2能编程fx3g的plc吗?
选择新建工程,在机型选择的下拉文本框是否有fx3g,如有就能编程,反之不能。选择新建工程,在机型选择的下拉文本框是否有fx3g,如有就能编程,反之不能。
PLC用什么语言编程?
西门子PLC支持以下几种编程语言,其中包含梯形图:1、顺序功能图(SFC,SeauentialFuctionChart)西门子STEP7中的该编程语言是S7Graph。这是位于.....