S7.NetPlus是连接S7-1200/1500及S7-200 Smart最稳妥的方案,需严格匹配机架插槽(如S7-200 Smart固定为rack=0,slot=2)、DB地址对齐规则,并启用PLC端PUT/GET通信权限。

S7.NetPlus 是目前最常用、踩坑最少的方案,尤其适合 S7-1200/1500 和 S7-200 Smart。它封装了底层 S7 协议细节,支持地址字符串读写(如 "DB1.DBX0.0"),不用手动处理字节偏移和大小端,上手快、出错少。
用 S7.NetPlus 连接 S7-1200/1500 时,机架号和插槽号不能乱填
西门子不同型号 PLC 的默认 rack 和 slot 值不同,填错直接连不上:
- S7-1200:通常
rack = 0,slot = 1(CPU 模块默认插槽) - S7-1500:同样多为
rack = 0,slot = 1,但若扩展了通信模块(如 CP 1543-1),需按 TIA Portal 中“硬件配置”里实际插槽号填写 - S7-200 Smart:必须设为
rack = 0,slot = 2(这是 S7-200 Smart 固定约定,不是笔误)
错误现象:plc.Open() 返回成功,但 plc.IsConnected 为 false;或抛出 "Connection refused" / "Timeout" 异常。此时先用 ping 确认网络通,再核对插槽号。
DBX/DBW/DBD 地址写法要严格匹配数据类型和字节对齐
西门子 DB 块中地址不是线性字节偏移,而是按类型强制对齐的:
-
DBX0.0表示 DB 第 0 字节第 0 位(bool),可任意偏移 -
DBW2表示从第 2 字节开始的 2 字节(word或int),起始地址必须是偶数 -
DBD4表示从第 4 字节开始的 4 字节(dint、real),起始地址必须是 4 的倍数
常见错误:把 DBD2 当作合法地址去读 real,结果读到的是错位的 4 字节,解出来是随机浮点数。TIA Portal 在 DB 属性里会标出每个变量的实际字节地址,务必以它为准。
写 float 或 struct 时别直接传 byte[],用库自带的地址写法更稳
S7.NetPlus 支持字符串地址写入,比手动拼 byte[] + BitConverter 少三类坑:
- 大小端:西门子是大端(
ABCD→DCBA),C# 默认小端,BitConverter不翻转就错 - 对齐偏移:手动算错字节位置,覆盖相邻变量
- 结构体嵌套:比如
struct Motor { int speed; bool enable; },字段之间可能有填充字节,PLC 里没定义对应 layout 就读歪
推荐写法:
plc.Write("DB1.DBD0", 3.14f); // float 写入 DB1 起始地址 0
plc.Write("DB1.DBW4", (ushort)1234); // word 写入 DB1 地址 4
plc.Write("DB1.DBX8.3", true); // bit 写入 DB1 第 8 字节第 3 位
只要 PLC DB 块里真有这个地址且类型匹配,就几乎不会出错。
Sharp7 和 S7.NetPlus 选哪个?看是否需要异步和诊断细节
S7.NetPlus 胜在简单、文档全、nuget 更新勤;Sharp7 胜在返回详细错误码(如 result == -12 表示“地址非法”)、支持异步读写、能查 PLC 诊断缓冲区。但代价是 API 更底层,比如读 int 得自己调 S7.SetIntAt(buffer, 0, value),稍不注意就崩。
- 新项目、快速验证、中小规模数据交互 → 无脑选
S7.NetPlus - 已有 Sharp7 代码、需对接旧系统、或要求精确定位通信故障点 → 用
Sharp7
两者都不支持 S7-300/400 的 MPI 或 Profibus,只走以太网 S7 协议。如果现场只有老式 MPI 接口,得加 CP343-1 或换 OPC UA 方案。
真正容易被忽略的是 PLC 端配置:TIA Portal 中必须勾选“允许来自远程对象的 PUT/GET 通信”,否则任何 C# 库都会卡在连接后立即断开——这个开关藏在 CPU 属性 → “保护” → “访问级别”里,不是通讯设置页,很多人翻半天找不到。


















