C#实现与西门子S7-1200/1500 PLC通信

简介: C#实现与西门子S7-1200/1500 PLC通信

C#实现与西门子S7-1200/1500 PLC通信,三种主流通信方式(S7协议、Modbus TCP、OPC UA)


一、S7协议通信(推荐)

1. 使用Sharp7库

// NuGet安装:Install-Package Sharp7
using Sharp7;

public class S7CommSharp7 {
   
    private S7Client _client = new S7Client();

    // 连接PLC
    public bool Connect(string ip, int rack=0, int slot=1) {
   
        int result = _client.ConnectTo(ip, rack, slot);
        return result == 0; // 返回连接状态
    }

    // 读取DB块数据(如DB1中前10字节)
    public byte[] ReadDB(int dbNumber, int start, int size) {
   
        byte[] buffer = new byte[size];
        int result = _client.DBRead(dbNumber, start, size, buffer);
        if (result != 0) throw new Exception($"读取失败,错误码:{result}");
        return buffer;
    }

    // 写入Int类型数据到DB块
    public void WriteInt(int dbNumber, int offset, int value) {
   
        byte[] buffer = new byte[2];
        S7.SetIntAt(buffer, 0, value);
        _client.DBWrite(dbNumber, offset, 2, buffer);
    }
}

关键配置

  • PLC需开启S7通信权限(TIA Portal中启用“允许远程通信”)。
  • 默认端口102,机架号0,槽号1(S7-1200/1500)。

二、Modbus TCP通信

1. PLC配置

  • 在TIA Portal中启用Modbus TCP服务器功能。
  • 设置端口号(默认502)和存储区映射(如DB块地址→Modbus寄存器)。

2. C#客户端实现

// NuGet安装:Install-Package NModbus4
using NModbus;

public class ModbusComm {
   
    private IModbusMaster _master;

    public void Connect(string ip, int port=502) {
   
        TcpClient tcpClient = new TcpClient(ip, port);
        _master = Modbus.Transport.CreateIp(tcpClient);
    }

    // 读取保持寄存器(如地址40001对应DB1.DBW0)
    public ushort[] ReadRegisters(byte slaveId, ushort startAddr, ushort count) {
   
        return _master.ReadHoldingRegisters(slaveId, startAddr, count);
    }

    // 写入浮点数(需转换为两个ushort)
    public void WriteFloat(byte slaveId, ushort startAddr, float value) {
   
        ushort[] data = BitConverter.GetBytes(value).ToUshortArray();
        _master.WriteMultipleRegisters(slaveId, startAddr, data);
    }
}

地址转换规则

  • DB1.DBW0 → Modbus地址40001(需PLC配置映射)。

三、OPC UA通信(跨平台推荐)

1. PLC端配置

  1. TIA Portal中启用OPC UA服务器:
    • PLC属性 → OPC UA → 激活服务器功能。
    • 配置安全策略(如用户名/密码)。
    • 发布变量(选择DB块中的Tag)。
  2. 记录PLC的OPC UA端点地址:opc.tcp://192.168.0.1:4840

2. C#客户端代码

// NuGet安装:Install-Package Opc.Ua.Client
using Opc.Ua.Client;

public class OpcUaComm {
   
    private Session _session;

    public void Connect(string endpointUrl) {
   
        ApplicationConfiguration config = new ApplicationConfiguration();
        var endpoint = new ConfiguredEndpoint(null, new EndpointDescription(endpointUrl));
        _session = Session.Create(config, endpoint).GetAwaiter().GetResult();
    }

    // 读取浮点数变量
    public float ReadFloat(string nodeId) {
   
        DataValue value = _session.ReadValue(nodeId);
        return (float)value.Value;
    }

    // 写入布尔值
    public void WriteBool(string nodeId, bool state) {
   
        _session.WriteValue(nodeId, state);
    }
}

节点ID示例

  • ns=3;s=\"DB1\".\"Temperature\"(TIA Portal自动生成)。

四、性能优化与错误处理

1. 异步读写(避免阻塞UI)

// Sharp7异步读取示例
public async Task<byte[]> ReadDBAsync(int dbNumber, int start, int size) {
   
    return await Task.Run(() => ReadDB(dbNumber, start, size));
}

2. 异常处理模板

try {
   
    plc.WriteInt(1, 0, 100);
} catch (Exception ex) {
   
    // 网络中断重连
    if (ex.Message.Contains("Connection refused")) {
   
        plc.Reconnect();
        plc.WriteInt(1, 0, 100); // 重试
    }
    // 记录日志
    Logger.Log($"写入失败:{ex.Message}");
}

3. 心跳监测

// 定时检查连接状态
Timer _heartbeatTimer = new Timer(_ => {
   
    if (!plc.IsConnected) plc.Connect();
}, null, 0, 5000); // 每5秒检测一次

参考代码 PC与西门子S7-1200 1500 C#通讯例程 www.youwenfan.com/contentalc/111882.html

总结

  • 基础通信:首选Sharp7或S7.NetPlus,适合高速本地控制。
  • 跨系统集成:OPC UA为工业4.0标准方案,支持云端数据中台。
  • 遗留系统兼容:Modbus TCP适用于第三方设备集成。
相关文章
|
2月前
|
网络协议 网络安全 API
C# 与三菱FX5U PLC通讯交互指南
C# 与三菱FX5U PLC通讯交互指南
890 121
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据
【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据
656 0
艾伟_转载:让榨汁机定时工作(C#+PLC)
买了自加热的榨汁机每天补充营养是件好事,但是为此早起一个小时却划不来。如果为了节省时间,早上用微波炉加热昨晚做好的豆汁,口感却不怎么好。怎么办?买定时加热的榨汁机,估计价钱会很高,不过市面上好像也没有带这种功能的。
1214 0
|
2月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
139 19
|
3月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
442 0
|
12月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
231 3
|
11月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
714 12
|
12月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
458 4
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
215 11