文档中心 › 西门子 S7 采集
西门子 S7-1200/1500 数据采集到 SQLite/MQTT 的完整方案
S7-1200/1500 是中小型产线最常见的 PLC。把它们的温度、转速、产量等变量定时读到服务器或边缘网关,再写入数据库、上送 MQTT/HTTP,是数据中台、设备预测性维护、能源管理的第一步。本文给出可直接落地的完整链路,以及最容易踩坑的 TIA 设置。
一、先解决 TIA 侧的“能不能读”
nscada 使用标准 S7comm over ISO-on-TCP(端口 102)读取。绝大多数“连不上/读不到”都不是软件问题,而是 PLC 工程里没有开放远程访问:
- TIA Portal 打开 CPU → 属性 → 防护与安全 → 连接机制,勾选“允许从远程伙伴(PUT/GET 通信)访问”;
- 被测数据块(DB)的属性中取消“优化的块访问”(或把需要采集的变量放在非优化 DB 中),否则无法按偏移直接读取;
- S7-1200 的 PUT/GET 连接数有限(约 3~8 条,视固件),确认没有被上位机、触摸屏占满;S7-1500 连接数较充裕。
接线与网络:PLC 与采集服务器同一网段即可;不需要改 PLC 程序逻辑,只改 CPU 属性与 DB 属性。
二、地址怎么写(DB / 标记区 / I/Q)
nscada 点表支持 nodes7 语法,几个示例:
DB1,REAL0 // DB1 第 0 字节起,32 位浮点(工艺值)
DB1,X14.0 // DB1.DBX14.0 布尔(运行/故障位)
DB1,INT12.2 // DB1 第 12 字节起 2 个 INT(数组)
M32.2 // 标记区位
MW30 / MD40 // 标记区字/双字
I0.1 / Q2.3 // 输入/输出位
槽位建议:S7-300/400 常为 rack0/slot2,S7-1200/1500 为 rack0/slot1(在设备连接参数里配置)。
三、几百个点位如何不把 PLC 拖垮
逐点轮询会产生大量请求。nscada 会把同一 DB 内连续地址自动合并成区块读取,并按 PDU 上限分包,一次周期通常只发 2~6 个请求即可覆盖数百点;采集周期可按点组拆分——关键点 1~5 秒,趋势点 10~30 秒。
四、数据落 SQLite,转发 MQTT/HTTP
- 采集到的原始值按点表做线性缩放(value = a×raw + b)与精度舍入;
- 写入本地 SQLite(按天分表、可设保留天数),断网/上位机宕机数据也不丢;
- 同时写入Outbox 持久队列,由发送器投递:MQTT 主题如
cx/{deviceId}/data(支持 QoS/retain),或 HTTP 批量 POST JSON;失败指数退避重试,进程重启自动续投。
五、最小验证清单
- 开发机 `ping` 通 PLC;本机 `telnet
102` 能连上; - 用探针脚本读 1 个 DB 变量验证地址与块设置;
- 建采集任务(如 1s 周期)→ 运行监控里看到“在线”;
- 配置 MQTT/HTTP 转发 → 上游收到 JSON 数据。
