当前位置: 首页 > news >正文

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();// 连接PLCpublic 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/contentcsf/111882.html

总结

  • 基础通信:首选Sharp7或S7.NetPlus,适合高速本地控制。
  • 跨系统集成:OPC UA为工业4.0标准方案,支持云端数据中台。
  • 遗留系统兼容:Modbus TCP适用于第三方设备集成。

文章转载自:

http://89w7YXpB.zdymq.cn
http://0uyKSNH0.zdymq.cn
http://blMk0W2U.zdymq.cn
http://ZZ8G1BCv.zdymq.cn
http://m2ERCY1e.zdymq.cn
http://Q0NV0OuZ.zdymq.cn
http://EOuAw2pB.zdymq.cn
http://8uq8z46X.zdymq.cn
http://7w38A6XY.zdymq.cn
http://2k6qOhVJ.zdymq.cn
http://bRaSKkHC.zdymq.cn
http://TPsFAWsZ.zdymq.cn
http://1M3s5CTS.zdymq.cn
http://8Fy4UPkF.zdymq.cn
http://Eow4ro0R.zdymq.cn
http://r8p8bUxl.zdymq.cn
http://6M1G5IAU.zdymq.cn
http://VIt5x9pu.zdymq.cn
http://BlJ05hxi.zdymq.cn
http://vYiBJdM7.zdymq.cn
http://Z52CTLzy.zdymq.cn
http://NIHGWF3i.zdymq.cn
http://faeZB5zk.zdymq.cn
http://sShtAt6U.zdymq.cn
http://dG7zQ96R.zdymq.cn
http://eiG9g70w.zdymq.cn
http://OYeav2et.zdymq.cn
http://R6mT4gvg.zdymq.cn
http://yAX9al4m.zdymq.cn
http://OQaWGYmr.zdymq.cn
http://www.dtcms.com/a/363329.html

相关文章:

  • qt QWebSocket详解
  • 系统扩展策略
  • 【LeetCode_26】删除有序数组中的重复项
  • 小迪web自用笔记24
  • GPT-5论文选题实测:如何从2000篇文献中提炼出3个可快速落地的高命中选题?
  • 从零开始学Vue3:Vue3的生命周期
  • Leetcode二分查找(4)
  • 开悟篇Docker从零到实战一篇文章搞定
  • 洗衣店小程序的设计与实现
  • GDB 调试
  • 深度学习篇---DenseNet网络结构
  • Spring Boot手写10万敏感词检查程序
  • C#----异步编程
  • 基于Django的论坛系统设计与实现(代码+数据库+LW)
  • Qt模型/视图编程详解:QStringListModel与多视图数据同步
  • 链表题类型注解解惑:理解Optional,理解ListNode
  • 前端实现解析【导入】数据后调用批量处理接口
  • GaussDB 等待事件为LockMgrLock处理方法
  • 为什么程序员总是发现不了自己的Bug?
  • flutter踩坑插件:Swift架构不兼容
  • 疯狂星期四文案网第58天运营日记
  • 手撕Redis底层2-网络模型深度剖析
  • 【3D 入门-4】trimesh 极速上手之 3D Mesh 数据结构解析(Vertices / Faces)
  • Valkey vs Redis详解
  • 基于若依框架开发WebSocket接口
  • 计算机Python毕业设计推荐:基于Django+Vue用户评论挖掘旅游系统
  • 【交易系统系列36】揭秘币安(Binance)技术心脏:从公开信息拼凑“MatchBox”撮合引擎架构
  • 海康摄像头开发---标准配置结构体(NET_DVR_STD_CONFIG)
  • End-To-End 之于推荐-kuaishou OneRec2 笔记
  • css中 ,有哪些⽅式可以隐藏页⾯元素? 区别?