C# 西门子S7协议SDK送源代码,应用简单。 ****不包含界面,不包含界面,不包含界面*****
直接怼个C#的S7协议库有多爽?先扔个GitHub地址自己体会:https://github.com/S7NetPlus/s7netplus。这个库支持.NET Standard 2.0,连西门子PLC就跟玩似的,先别急着搞界面,咱们先把PLC当计算器用起来。
先来个硬核操作——三行代码连PLC:
var plc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1); plc.Open(); Console.WriteLine(plc.IsConnected ? "连上了!" : "凉了");注意CpuType要选对型号,S7-1200和S7-1500的魔数不一样。要是连不上?先检查IP能不能ping通,再确认下PLC是不是在STOP模式(别笑,真有人在这翻车)。
读个DB块数据比泡面还简单:
var result = plc.Read("DB1.DBD4"); // 读DB1的4号地址开始的4字节 if (result is byte[] bytes) { int value = BitConverter.ToInt32(bytes, 0); Console.WriteLine($"当前温度:{value}℃"); }这里有个暗坑——西门子的字节序是反的!用BitConverter前得确认要不要自己反转数组。读字符串更刺激,西门子喜欢在第一个字节存长度:
var strBytes = plc.Read("DB1.DBB10"); string result = Encoding.ASCII.GetString(((byte[])strBytes).Skip(2).ToArray()); // 跳过长度字节写数据也别虚,直接往死里怼:
bool[] output = { true, false, true }; plc.Write("QB0", output); // 写输出寄存器Q0.0到Q0.2这时候要盯着PLC的Q点LED看有没有闪,比什么调试工具都管用。突发奇想想批量读写?上这个骚操作:
var items = new List<DataItem> { new DataItem { DataType = DataType.DataBlock, DB = 1, StartByteAdr = 0, VarType = VarType.Byte, Count = 4 }, new DataItem { DataType = DataType.Output, StartByteAdr = 0, VarType = VarType.Bit, BitAdr = 5 } }; var results = plc.ReadMultipleVars(items);记得处理好异常捕获,PLC超时比女朋友生气还难哄。最后别忘了plc.Close(),虽然理论上using语句更优雅,但实战中见过直接断电把PLC搞崩的案例。
这个库最狠的是能反编译源码直接改,比如调整超时时间:
public class MyPlc : Plc { public MyPlc() : base(CpuType.S71500, "10.0.0.1", 0, 1) { base.ReadTimeout = 3000; // 默认1秒不够就改 } }碰到协议解析问题直接下断点跟源码,比看文档快十倍。别问为什么知道——都是被西门子官方文档坑出来的经验。