C# 与台达 PLC 串口通讯实现实时监控

C#与台达plc串口通讯 台达plc与C#串口通信程序,可同 步读写操作,实时监控。 地址通过xml文件配置,控件自动生成。 通信协议使用的是ModBusRtu,适用于所有支持ModBusRtu的PLC。 附件为C#上位机软件与PLC测试程序

在工业自动化领域,上位机与 PLC 的通讯至关重要。今天咱就来聊聊如何用 C# 实现与台达 PLC 通过串口通讯,并且能同步读写操作以及实时监控。这里我们采用 ModBusRtu 协议,这个协议适用性超广,只要是支持 ModBusRtu 的 PLC 都能搞。

一、通讯基础与协议选择

ModBusRtu 协议是一种在工业控制领域广泛应用的串行通信协议。它规定了数据在串口上传输的格式和规则。在 C# 中,我们可以利用 System.IO.Ports 命名空间来操作串口。

csharp 复制代码
using System.IO.Ports;
// 创建串口对象
SerialPort serialPort = new SerialPort();
// 设置串口参数,这里只是示例,实际需根据PLC配置调整
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;

在上述代码中,我们先引入了操作串口所需的命名空间,然后创建了 SerialPort 对象,并对串口的基本参数进行了设置,比如串口号、波特率、校验位、数据位和停止位。这些参数要和 PLC 的串口配置一致,不然通讯就会出问题。

二、地址配置与控件生成

我们通过 xml 文件来配置地址,这样做的好处是方便后期维护和修改。假设我们的 xml 文件结构如下:

xml 复制代码
<Addresses>
  <Address type="input" value="0x01"/>
  <Address type="holding" value="0x02"/>
</Addresses>

在 C# 中读取这个 xml 文件并解析的代码如下:

csharp 复制代码
using System.Xml;

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("addresses.xml");
XmlNodeList addressNodes = xmlDoc.SelectNodes("/Addresses/Address");
foreach (XmlNode node in addressNodes)
{
    string type = node.Attributes["type"].Value;
    string value = node.Attributes["value"].Value;
    // 这里可以根据type和value做相应的逻辑处理,比如添加到集合中供后续使用
}

上面这段代码使用 XmlDocument 来加载 xml 文件,然后通过 XPath 表达式选取所有 Address 节点,接着获取每个节点的属性值。这些属性值我们可以用来配置与 PLC 通讯的地址。

至于控件自动生成,这主要涉及到 WinForms 或者 WPF 开发。假设我们用 WinForms,我们可以根据解析出来的地址信息动态创建控件,比如创建文本框用来显示 PLC 寄存器的值。

csharp 复制代码
TextBox textBox = new TextBox();
textBox.Location = new Point(100, 100);
textBox.Name = "txt_" + type + "_" + value;
this.Controls.Add(textBox);

这段代码创建了一个文本框,并设置了其位置和名称,然后添加到当前的窗体控件集合中。

三、同步读写与实时监控实现

同步读写操作是基于 ModBusRtu 协议规定的功能码来实现的。比如读取保持寄存器(功能码 0x03)和写入单个保持寄存器(功能码 0x06)。

csharp 复制代码
// 读取保持寄存器
byte[] readRequest = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B };
serialPort.Open();
serialPort.Write(readRequest, 0, readRequest.Length);
byte[] readResponse = new byte[serialPort.BytesToRead];
serialPort.Read(readResponse, 0, readResponse.Length);
serialPort.Close();
// 这里对readResponse进行解析,获取PLC寄存器的值

// 写入单个保持寄存器
byte[] writeRequest = new byte[] { 0x01, 0x06, 0x00, 0x00, 0x00, 0x10, 0x99, 0xC5 };
serialPort.Open();
serialPort.Write(writeRequest, 0, writeRequest.Length);
serialPort.Close();

在读取保持寄存器的代码中,我们先构建了读取请求帧,然后打开串口发送请求,接着读取响应数据并关闭串口。写入操作类似,只是构建的请求帧不同,是基于写入单个保持寄存器的功能码构建的。

实时监控的话,我们可以利用 Timer 控件定时去读取 PLC 的数据,并更新界面上的控件显示。

csharp 复制代码
private void timer1_Tick(object sender, EventArgs e)
{
    // 执行读取PLC数据的操作
    byte[] readRequest = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B };
    serialPort.Open();
    serialPort.Write(readRequest, 0, readRequest.Length);
    byte[] readResponse = new byte[serialPort.BytesToRead];
    serialPort.Read(readResponse, 0, readResponse.Length);
    serialPort.Close();
    // 解析readResponse并更新界面控件显示
    // 例如更新之前创建的文本框的值
    TextBox textBox = this.Controls.Find("txt_input_0x01", true).FirstOrDefault() as TextBox;
    if (textBox!= null)
    {
        // 根据解析后的数据设置文本框的值
        textBox.Text = "解析后的值";
    }
}

上面这段代码是 Timer 控件的 Tick 事件处理函数,定时执行读取 PLC 数据并更新界面控件的操作。

本文附件中提供了 C# 上位机软件与 PLC 测试程序,大家可以下载下来进一步研究和测试。通过这些实现,我们就可以轻松实现 C# 与台达 PLC 的串口通讯,完成同步读写与实时监控的功能啦。

相关推荐
武藤一雄2 小时前
C# 万字拆解线程间通讯?
后端·微软·c#·.net·.netcore·多线程
赵庆明老师3 小时前
NET 10 集成Session
缓存·.net
SEO-狼术3 小时前
Detect Trends with Compact In-Cell Visuals
.net
赵庆明老师4 小时前
.NET 日志和监控
.net
我是唐青枫4 小时前
C# Params Collections 详解:比 params T[] 更强大的新语法
c#·.net
Zhen (Evan) Wang4 小时前
从客户端的HTTP 请求到后端 .NET 8 API的整个生命周期 - 处理请求和响应的主要方式
c#·.net
zybsjn5 小时前
多线程环境下 Dictionary 高 CPU 问题排查:一次真实的 .NET 线上事故分析
.net
总有刁民想爱朕ha5 小时前
.NET 8 AOT教程的使用
.net·.net8教程
Zhen (Evan) Wang6 小时前
从客户端的HTTP 请求到后端 .NET 8 API的整个生命周期
c#·.net