『7x24小时有问必答』
西门子 S7-1500 PLC 原生支持  MQTT (Message Queuing Telemetry Transport)  协议,这是目前工业物联网 (IIoT) 中最主流的通信方式。相比 HTTP,MQTT 具有轻量级、低功耗、发布/订阅模式、断线重连等优势,非常适合与云平台(阿里云、AWS、Azure)、MES 系统或边缘网关进行数据交互。以下是基于  TIA Portal V16/V17/V18/V19  和  S7-1500 (固件 V2.6+)  的 MQTT 通信详解。

---

一、核心前提条件

硬件固件:
CPU 固件版本必须  ≥ V2.6  (部分高级功能如 QoS 1/2 或大载荷可能需要更新固件)。
推荐升级至最新固件以获得最佳稳定性。
软件环境:
TIA Portal 版本  ≥ V16  (V16 引入了  MQTT_CLIENT  指令)。
建议安装最新的  Support Package (HSP)  以获取最新的指令库。
网络配置:
PLC 必须配置有效的 IP 地址、子网掩码、网关。
DNS 服务器:如果 Broker 地址是域名(如  iot.aliyun.com),必须在 CPU 属性中配置 DNS。

---

二、指令介绍:MQTT_CLIENT

S7-1500 使用标准的库指令  MQTT_CLIENT  (位于:Instructions > Communication > Open user communication > MQTT)。

主要引脚功能:

引脚
方向
数据类型
说明
REQ
Input
Bool
上升沿触发连接请求或发布/订阅操作。
CONNECT
Input
String
MQTT Broker 的地址。格式:tcp://<ip或域名>:<端口>  或  ssl://...
CLIENT_ID
Input
String
客户端唯一标识符。全球唯一,通常由设备序列号生成。
KEEP_ALIVE_TIME
Input
Int
心跳时间(秒)。建议设为 60-120 秒。超时未心跳,Broker 会断开连接。
USERNAME
Input
String
可选。用于鉴权。
PASSWORD
Input
String
可选。用于鉴权。
SUBSCRIBE
Input
Bool
上升沿触发订阅请求。
SUB_TOPIC
Input
String
订阅的主题,支持通配符  +  (单层) 和  #  (多层)。
PUBLISH
Input
Bool
上升沿触发发布请求。
PUB_TOPIC
Input
String
发布的主题。
PUB_PAYLOAD
Input
Variant
发布的数据内容 (String, Array of Byte, Struct 等)。
QOS
Input
Int
服务质量等级:0 (最多一次), 1 (至少一次), 2 (仅一次)。S7-1500 通常支持 0 和 1。
RETAIN
Input
Bool
是否保留消息。True 表示 Broker 会保存最后一条消息给新订阅者。
DONE
Output
Bool
当前操作完成标志。
ERROR
Output
Bool
错误标志。
STATUS
Output
Word
状态代码。关键调试依据
RECV_PAYLOAD
Output
Variant
接收到的消息内容。
RECV_TOPIC
Output
String
接收到的消息主题。

---

三、实施步骤详解

步骤 1:创建全局数据块 (DB)

为了管理状态和数据,建议创建一个全局 DB (例如  DB_MQTT_Config)。
步骤 2:编写通信逻辑 (FB)
创建一个功能块  FB_MQTT_Handler,在 OB1 或循环中断 OB 中调用。
逻辑流程设计:
初始化/连接:上电或断线后,触发  CONNECT订阅:连接成功后,触发  SUBSCRIBE发布循环:根据定时器或事件触发  PUBLISH接收处理:当有新消息到达时,解析  RECV_PAYLOAD

四、关键场景配置

1. 连接公有云 (阿里云/AWS/Azure)

Broker 地址:从云平台控制台获取。
阿里云 MQTT:  tcp://{ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883
EMQX Public:  tcp://broker.emqx.io:1883
鉴权:
云平台的密码通常是签名后的字符串  (HMAC-SHA1/SHA256),而不是明文密码。
难点:S7-1500 无法动态计算复杂的签名。解决:
使用云平台提供的在线计算器生成固定的 Username/Password (如果 DeviceSecret 不变)。
或者在边缘网关计算好 Token 下发给 PLC。
对于阿里云,ClientID 格式也有严格要求:deviceName|securemode=2,signmethod=hmacsha1|

2. 启用 SSL/TLS 加密 (端口 8883)

为了数据安全,生产环境强烈建议使用加密连接。
地址格式:将  tcp://  改为  ssl://  或  mqtts://证书配置:
获取 Broker 的 CA 根证书 (.crt  或  .pem)。
在 TIA Portal 项目树中,右键  "Certificates"  ->  "Import"  导入证书。
在  MQTT_CLIENT  指令的属性窗口 (不是引脚),勾选  "Use TLS/SSL"  并选择导入的证书。
如果是双向认证 (Mutual Auth),还需导入客户端证书和私钥。

3. JSON 数据处理

MQTT 载荷通常是 JSON 格式。
发送:使用 SCL 的  CONCAT  函数拼接字符串,或使用第三方 JSON 库构建。
例:'{"temp":' + REAL_TO_STRING(Temp) + '}'
接收:S7-1500 没有原生 JSON 解析器。简单方法:使用  FIND,  MID,  LEFT,  RIGHT  字符串函数提取关键值。推荐方法:集成开源的  S7-1500 JSON Library  (GitHub 上有很多,如  json-scl-lib),实现  JsonGetValue  功能。

---

五、常见错误代码 (STATUS) 及排查

状态码 (Hex)
含义
排查建议
160000
无错误/空闲
正常。
160001
忙碌 (BUSY)
指令正在执行,不要重复触发 REQ。
16000B
DNS 解析失败
检查 CPU 属性中的 DNS 服务器设置;尝试直接用 IP 地址测试。
16000E
连接超时
检查防火墙、路由、Broker 端口是否开放;Ping 测试。
168201
连接被拒绝
Broker 地址错误、端口错误、或 Broker 服务未启动。
168204
认证失败 (Not Authorized)
Username/Password 错误;ClientID 重复;Token 过期。
168205
主题无效
Topic 格式错误,或权限不足。
16820C
SSL/TLS 握手失败
证书未导入、证书过期、系统时间不正确。

---

六、最佳实践与建议

ClientID 唯一性
确保每个 PLC 的  CLIENT_ID  是全局唯一的。如果两个设备用相同的 ID 连接,会导致互相“踢下线”(震荡)。
建议使用 CPU 的序列号或 MAC 地址后缀作为 ID 的一部分。
心跳与断线重连
KEEP_ALIVE_TIME
  设置要合理。太短会增加网络负担,太长会导致云端认为设备离线延迟高。推荐  60s
程序必须包含自动重连逻辑。当  ERROR  置位时,复位连接状态,延时几秒后重新触发  CONNECT
QoS 选择
QoS 0:最快,但不保证到达。适合高频传感器数据(丢几个无所谓)。QoS 1:保证至少到达一次。适合报警、工单状态、关键工艺参数(推荐默认使用)。QoS 2:S7-1500 支持有限,且开销大,一般工业场景少用。
数据缓冲
如果网络中断,PLC 产生的数据怎么办?
建议在 PLC 内部建立一个  FIFO 缓冲区 (Array of Struct)。网络断开时,数据存入缓冲区;网络恢复后,循环读取缓冲区并通过 MQTT 补发(需注意云端的时序处理)。
安全性
永远不要硬编码明文密码在代码中如果可能泄露。
生产环境务必使用  SSL/TLS (端口 8883)
在 Broker 端配置 ACL (访问控制列表),限制 PLC 只能发布/订阅特定 Topic。

七、总结

S7-1500 的  MQTT_CLIENT  指令功能强大,是实现 IT/OT 融合的神器。
开发核心:在于连接参数的正确计算(特别是云平台的签名)和JSON 数据的序列化/反序列化调试关键:密切关注  STATUS  引脚的代码,并利用 Wireshark 或 MQTT.fx/MQTTX 等工具进行抓包对比测试。架构建议:对于复杂的云对接,如果 PLC 处理签名和 JSON 过于吃力,可以考虑引入边缘网关(运行 Node-RED 或 Python),PLC 仅通过 Modbus TCP 或简单的 MQTT (内网) 与网关交互,由网关负责复杂的云端 MQTT 通信。
</ip或域名>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码