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端配置
- TIA Portal中启用OPC UA服务器:
- PLC属性 → OPC UA → 激活服务器功能。
- 配置安全策略(如用户名/密码)。
- 发布变量(选择DB块中的Tag)。
- 记录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适用于第三方设备集成。