实现思路
C#通过sharp7.cs 读取DB块中的数据。(这里是字节数组)。
然后对字节数据进行解析,并绑定在textbox控件中进行显示。
需求
1-基于Sharp7.cs二次编写的访问PLC类。可参考文章C#-基于Sharp7.cs二次开发读取PLC值的方法-留言更新方法
2-Bytes数据类型转换文件。 引用 generalDataTypeConvert.dll。
实现步骤
1-PLC访问类中添加方法,获取DB块字节数组
//20201029 生成DB块字节数组 public byte[] getDBbytes(string plcIp, int Rack, int Slot, int DbNum, int Start,int Length) { byte[] Buffer = new byte[Length]; Client.ConnectTo(plcIp, Rack, Slot); Client.DBRead(DbNum, Start, Length, Buffer);//读取DbwNum所对应的字的值 return Buffer; }
2-编写窗体
自定义控件的方法可参考文章C#-基于Socket实现与西门子S7-1200 PLC服务器通信-2-字节数据解析及数据绑定textbox控件
3-PLC中定义DB块
4-这里我们通过视频看一下运行效果
PS:
1-这里我们读取的是DB块,M区也可以这样做。
2-我们把解析后的数据都绑定在了textbox控件中,这样减少了代码的编写量。
最后,附上窗体代码,这里大家可以看到,代码的编写量减少了很多。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using generalPLC;using generalDataTypeConvert;namespace S7BytesConvert{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } PLC opplc = new PLC(); public byte[] buffer; private void timer1_Tick(object sender, EventArgs e) { timer1.Interval = 2000; buffer = opplc.getDBbytes("10.228.140.46", 0, 3, 298, 0, 24); foreach (Control item in this.Controls) { if (item is S7TEXT Is) { switch (Is.DataType) { case DataType.Bool: Is.VarValue = BitLib.GetBitFromByteArray(buffer, Is.Start, Is.Offset).ToString(); break; case DataType.Short: Is.VarValue = ShortLib.GetShortFromByteArray(buffer, Is.Start).ToString(); break; case DataType.Int: Is.VarValue = IntLib.GetIntFromByteArray(buffer, Is.Start).ToString(); break; case DataType.Float: Is.VarValue = FloatLib.GetFloatFromByteArray(buffer, Is.Start).ToString(); break; } } } } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } }}


