C#如何实现工业自动化中的PLC通信与数据采集

来源:AI大模型作者:印尼程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《C#如何实现工业自动化中的PLC通信与数据采集》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何实现工业自动化中的PLC通信与数据采集》有用,将其分享出去将是对创作者最好的鼓励。

工业自动化领域里,PLC作为可编程逻辑控制器,承担着设备逻辑控制的核心职能,而C#凭借完善的生态和高效的开发效率,成为很多工业软件开发者实现PLC通信与数据采集的首选语言。实际开发中,开发者需要根据PLC支持的通信协议选择合适的技术方案,保障数据传输的稳定性和实时性。

C#如何实现工业自动化中的PLC通信与数据采集

C#对接PLC的常用通信方式

目前工业场景中PLC支持的通信协议种类繁多,C#开发中常用的有以下几种:

  • Modbus协议:分为Modbus RTU和Modbus TCP两类,是工业领域通用性最高的协议,多数主流PLC都支持该协议,开发门槛较低。
  • OPC UA协议:面向工业4.0的标准通信协议,支持跨平台、加密传输,适合对数据安全性和兼容性要求较高的场景。
  • 厂商私有协议:比如西门子S7协议、三菱MC协议,针对特定品牌PLC设计,通信效率更高,但需要依赖对应厂商的开发库。

Modbus TCP协议下的C#通信实现

Modbus TCP是基于TCP/IP的Modbus协议变种,默认端口为502,无需额外串口配置,适合局域网内的PLC通信场景。我们可以使用第三方库NModbus4快速实现通信功能,首先需要通过NuGet安装该库。

建立PLC连接

下面的代码实现了C#与Modbus TCP类型PLC的连接建立:

using System;
using System.Net.Sockets;
using Modbus.Device;

namespace PlcCommunicationDemo
{
    class ModbusTcpClient
    {
        private TcpClient tcpClient;
        private IModbusMaster modbusMaster;
        // PLC的IP地址
        private string plcIp = "192.168.0.1";
        // Modbus TCP默认端口
        private int port = 502;

        /// <summary>
        /// 连接PLC设备
        /// </summary>
        /// <returns>是否连接成功</returns>
        public bool ConnectPlc()
        {
            try
            {
                tcpClient = new TcpClient();
                // 建立TCP连接
                tcpClient.Connect(plcIp, port);
                // 创建Modbus TCP主站实例
                modbusMaster = ModbusIpMaster.CreateIp(tcpClient);
                // 设置超时时间
                modbusMaster.Transport.ReadTimeout = 2000;
                modbusMaster.Transport.WriteTimeout = 2000;
                Console.WriteLine("PLC连接成功");
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"PLC连接失败:{ex.Message}");
                return false;
            }
        }
    }
}

读取PLC数据

Modbus协议中,常用的数据区包括保持寄存器(功能码03)、输入寄存器(功能码04)、线圈(功能码01)、离散输入(功能码02)。下面的代码演示了读取保持寄存器的操作,假设PLC的从站地址为1,需要读取起始地址为0的10个寄存器数据:

/// <summary>
/// 读取PLC保持寄存器数据
/// </summary>
/// <param name="slaveId">从站地址</param>
/// <param name="startAddress">起始寄存器地址</param>
/// <param name="num">读取寄存器数量</param>
/// <returns>寄存器数据数组</returns>
public ushort[] ReadHoldRegisters(byte slaveId, ushort startAddress, ushort num)
{
    if (modbusMaster == null)
    {
        Console.WriteLine("请先建立PLC连接");
        return null;
    }
    try
    {
        // 调用Modbus读取保持寄存器方法
        ushort[] result = modbusMaster.ReadHoldingRegisters(slaveId, startAddress, num);
        Console.WriteLine($"读取到{num}个寄存器数据,起始地址:{startAddress}");
        return result;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"读取寄存器失败:{ex.Message}");
        return null;
    }
}

写入PLC数据

如果需要向PLC写入数据,比如修改某个寄存器的数值,可以使用下面的方法实现:

/// <summary>
/// 向PLC保持寄存器写入数据
/// </summary>
/// <param name="slaveId">从站地址</param>
/// <param name="startAddress">起始寄存器地址</param>
/// <param name="values">要写入的数据数组</param>
/// <returns>是否写入成功</returns>
public bool WriteHoldRegisters(byte slaveId, ushort startAddress, ushort[] values)
{
    if (modbusMaster == null)
    {
        Console.WriteLine("请先建立PLC连接");
        return false;
    }
    try
    {
        // 调用Modbus写入保持寄存器方法
        modbusMaster.WriteMultipleRegisters(slaveId, startAddress, values);
        Console.WriteLine($"成功向起始地址{startAddress}写入{values.Length}个寄存器数据");
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"写入寄存器失败:{ex.Message}");
        return false;
    }
}

数据采集实战流程

实际工业数据采集场景中,通常需要按照固定周期读取PLC数据,并将数据存储到数据库或者推送到前端展示。整体流程可以分为以下几步:

  1. 初始化PLC连接,检测连接状态,连接失败则进行重试。
  2. 根据业务需求定义采集点位,比如温度、压力、设备运行状态对应的寄存器地址。
  3. 使用定时器按照设定周期(比如1秒)调用读取方法获取对应点位的数据。
  4. 对采集到的数据进行解析、校验,过滤异常数据。
  5. 将有效数据存储到时序数据库,或者推送到消息队列供其他系统消费。

注意事项

  • 通信过程中需要做好异常处理,比如网络中断、PLC断电等场景的重连逻辑,避免程序崩溃。
  • 寄存器地址的映射需要参考PLC厂商提供的地址表,不同品牌的PLC地址定义规则存在差异。
  • 高频采集场景下需要合理设置采集周期,避免占用过多PLC资源,影响设备正常运行。
  • 如果涉及多设备同时采集,建议使用异步编程方式,提升程序运行效率。

C#PLC通信工业自动化数据采集修改时间:2026-06-26 08:24:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。