协议接入

西门子 S7 数据采集:优化块与 DB 地址问题

S7 协议本身很稳定,绝大多数「连不上」「读出来是 0」的问题都出在 PLC 侧的两个勾选项上。这篇按系列写清配置步骤和地址算法,以及为什么不建议直接读 M 区。

S7 协议用在哪些设备上

S7 是西门子 PLC 的原生通信协议(走 ISO-on-TCP,端口 102),覆盖 S7-200 SMART、S7-300、S7-400、 S7-1200、S7-1500 全系列,也适用于用这些 PLC 做主控的第三方设备。 能访问的存储区包括 DB 数据块、M 位存储器、I 输入区、Q 输出区、T 定时器与 C 计数器。 在国内自动化设备里,西门子 PLC 的占比很高,所以 S7 通常是数采项目里第一个要打通的协议。

敏洽 SCADA 数采软件的 siemens_s7 驱动基于 snap7 实现,源码内嵌静态编译,现场部署不需要装西门子的任何通信组件, 也不需要装 Simatic NET 或者 OPC Server,避免了授权与版本冲突问题。

实际会遇到的几个坑

1. 「优化的块访问」是头号拦路虎

S7-1200/1500 新建 DB 块时,TIA Portal 默认勾上「优化的块访问」。 优化块里的变量没有固定的绝对偏移,只能按符号名访问,而经典 S7 协议是按 「DB 号 + 字节偏移 + 长度」寻址的,因此优化块用 S7 协议读会直接失败或读到无意义数据。 解决办法:在块属性里取消勾选「优化的块访问」,重新编译下载。

但直接改现有块有风险——地址重排可能影响已有程序里的间接寻址。 更稳妥的做法是新建一个非优化的 DB 块专做「采集镜像区」, 由 PLC 程序周期性把要上传的变量搬进去。这样做还有个附带好处: 采集接口与 PLC 内部逻辑解耦,PLC 程序后续升级不会连带影响采集。

2. PUT/GET 权限没勾,连接被拒

在 PLC 设备属性的「保护与安全」页里,有一项 「允许来自远程对象的 PUT/GET 通信访问」。 S7-1200/1500 默认不勾,外部读取会被直接拒绝。表现是 TCP 三次握手成功、 协议协商阶段就被断开。这一项必须勾上并重新下载硬件组态。 顺带说一句,勾上之后 PLC 对外是可读可写的,出于安全考虑应该把采集网段与办公网隔离。

3. 不要把 M 区当数据接口

现场为了快,经常直接读 M 区。这在调试期没问题,但作为交付方案是隐患: M 区是 PLC 程序员的临时工作区,下次改程序时某个 MW 地址被挪走, 采集侧读到的就是别的含义的数据,而且不会报错,只会安静地出错数。 这类问题排查起来极其费时。正确做法是约定专用 DB 块,地址表书面确认, 作为接口文档的一部分归档,双方任何一侧要改都必须走变更流程。

4. 数据类型与字节序

西门子是大端字节序。读 REAL(32 位浮点)时要按大端解析,读 DINT 同理。 常见错误是按小端解析导致数值离谱(比如温度读出来 -1.7e38)。 另外 S7-1500 的 LREAL 是 64 位浮点,占 8 字节,容易和 REAL 混淆。 BOOL 变量在 DB 块里按位存放,地址形如 DB10.DBX4.3, 读的时候要注意是读整字节再取位,还是驱动帮你算好。 字符串类型 STRING 在 S7 里前两个字节是最大长度与实际长度, 直接当 ASCII 读会带上这两个字节的垃圾。

5. 一次读多少合适

S7 协议单次请求的数据量受 PDU 大小限制(常见 240 或 480 字节)。 把需要的变量在 DB 块里连续排布,一次批量读一整段, 比逐个变量单独发请求快一个数量级。所以「采集镜像区」的字段顺序设计是有讲究的: 按数据类型分组连续摆放,避免为了对齐插入大量空洞。 实际项目里几百个点位排好后,1 秒周期采集完全没有压力。

各系列的接入条件

系列接入方式注意事项
S7-1500网口直连,S7 协议需关闭目标 DB 的优化块访问;需勾选 PUT/GET 权限;注意 LREAL 为 8 字节
S7-1200网口直连,S7 协议同 S7-1500;固件较老的版本 PDU 较小,批量读要拆包
S7-400网口(CP 模块)需要 CP 通信模块或集成 PN 口;DB 块无优化概念,地址直接可用
S7-300网口(CP 343 / 集成 PN)同 S7-400;纯 MPI 机型需加装以太网模块或走 MPI 转换
S7-200 SMART网口直连,S7 协议V 区映射为 DB1,地址换算需注意
S7-200(老)PPI 串口不支持 S7 以太网协议,需串口服务器 + 自由口协议实现,成本较高

硬件上需要客户准备的东西不多:工业交换机、网线,以及固定的 IP 分配表。 建议采集网段与办公网物理隔离,PLC 用静态 IP,不要走 DHCP—— 现场断电重启后 IP 变化导致采集全线中断,是排查起来很浪费时间的一类故障。

相关交付情况

在整线数采项目里,西门子 PLC 通常是主控,同时还挂着仪表、机器人、视觉工站。 敏洽的做法是把 PLC 侧的「采集镜像区」作为整条线的数据汇聚点: 工站数据先进 PLC,再由采集软件一次批量读出,这样只需维护一份点表, 调试时也只有一个数据源要核对。当然,如果某些工站数据量大或者节拍要求高, 也可以让工站直接对接采集软件,绕过 PLC 中转。这个取舍在方案阶段确定, 判断依据是数据量、节拍要求与现场布线成本三项。

更多交付情况见 案例中心, 协议清单见 SCADA 软件的 45 个协议驱动。

常见问题

先看两处:一是要采集的 DB 块属性里「优化的块访问」是否勾着,勾着的话经典 S7 协议无法按绝对地址访问,需要取消勾选并重新编译下载;二是 PLC 属性的保护页里「允许来自远程对象的 PUT/GET 通信访问」是否勾上,不勾上则外部读取会被拒绝。
会影响块内变量的地址分配,取消勾选后需要重新编译并下载。如果程序里已经用符号名访问,逻辑本身不用改;但如果有间接寻址或者指针操作依赖了原来的偏移,需要复核。稳妥做法是新建一个专门的非优化 DB 块作为「采集镜像区」,由 PLC 程序把要上传的数据搬进去,不动原有块。
技术上可以,但不建议作为长期方案。M 区是 PLC 程序员的临时工作区,改程序时地址很容易被挪动,采集侧会在某次程序升级后突然读到错误数据,而且这种故障很难定位。正确做法是约定一个专用 DB 块作为数据接口,地址表由双方书面确认。
不一样。S7-200 SMART 支持 S7 协议(走 TCP 502 之外的 102 端口),可以直接采集;老的 S7-200 只有 PPI 串口,需要走 PPI 转换或者用自由口协议自己实现,改造成本高得多,常见的替代做法是加装串口服务器后按自由口报文取数。

有具体设备清单或工件样品,可以直接给判断

提供设备型号、PLC 品牌与需要采集的数据项,或提供被检工件照片与精度要求,敏洽可先给出可行性判断与硬件前置条件,再谈软件工作量与报价。