Codesys与云平台的MQTT通信
本文指南详细介绍如何在 Codesys 软件中通过 MQTT 协议将 PLC 数据上传至云平台。整个过程无需依赖复杂的图片说明,通过文字描述即可完成配置与编程。
第一阶段:环境准备与库安装
在开始编写代码之前,必须确保 Codesys 开发环境中包含 MQTT 通讯所需的库。Codesys 官方并未内置 MQTT 协议栈,通常需要从 Codesys Store 下载或由 PLC 厂商提供。
- 打开 Codesys 项目,确认 PLC 设备类型已添加。
- 双击 项目树中的
库管理器(Library Repository)选项卡。 - 点击 库管理器底部的
添加库按钮(通常是一个“+”号图标)。 - 输入 关键字
MQTT进行搜索。- 如果是标准 Codesys 环境,请搜索并安装
SysMqtt库。 - 如果是特定品牌 PLC(如汇川、施耐德等),请安装厂商提供的封装 MQTT 库(例如
MqttClient)。
- 如果是标准 Codesys 环境,请搜索并安装
- 勾选 搜索结果中的库文件,点击
确定完成添加。
第二阶段:定义全局变量与连接参数
建立 MQTT 通讯需要定义客户端实例、连接参数以及数据缓冲区。在 PLC_PRG 或自定义的 POU 中声明变量。
- 双击 打开主程序
PLC_PRG(用于存放逻辑)。 - 切换 到变量声明区(通常在编辑器上部)。
- 输入 以下变量声明代码:
VAR
// 1. MQTT 客户端实例 (假设使用 SysMqtt.Client)
fbMqttClient : SysMqtt.Client;
// 2. 连接参数结构体
mqttConnect : SysMqtt.SConnect;
// 3. 发布数据结构体
mqttPublish : SysMqtt.SPublish;
// 4. 状态控制变量
bConnectTrigger : BOOL := FALSE; // 连接触发信号
bPublishTrigger : BOOL := FALSE; // 发布触发信号
bConnected : BOOL := FALSE; // 连接状态反馈
// 5. 测试数据
nTemperature : INT := 25; // 模拟温度值
strPayload : STRING(255); // 待发送的 JSON 字符串
END_VAR
- 补充 初始化连接参数。在
PLC_PRG的代码执行区(第一周期)或属性设置中赋值:mqttConnect.strEndpoint:=你的云平台IP地址或域名;mqttConnect.nPort:=1883(非加密端口) 或8883(SSL加密端口);mqttConnect.strClientID:=Codesys_Device_01(确保唯一);mqttConnect.strUsername:=你的云平台用户名;mqttConnect.strPassword:=你的云平台密钥;
第三阶段:建立 MQTT 连接
MQTT 是有状态的协议,必须先建立连接才能传输数据。我们将使用一个上升沿信号来触发连接动作。
- 定位 到
PLC_PRG的代码执行部分(PROGRAM PLC_PRG下方)。 - 编写 连接逻辑代码:
// 触发连接:当 bConnectTrigger 为 TRUE 的瞬间执行
IF bConnectTrigger AND NOT bConnected THEN
// 调用 Connect 功能块
fbMqttClient(
xEnable := TRUE,
itfConnect := mqttConnect,
eState =>,
xBusy =>,
);
// 检查是否连接成功
IF fbMqttClient.xDone THEN
bConnected := TRUE;
bConnectTrigger := FALSE; // 复位触发信号
END_IF
// 如果出错,复位使能端以便重试
IF fbMqttClient.xError THEN
fbMqttClient(xEnable := FALSE);
END_IF
END_IF
- 注意:上述代码中
itfConnect接口传入了我们在第二阶段定义的mqttConnect结构体。
第四阶段:构建 JSON 数据与发布
云平台通常接收 JSON 格式的数据。Codesys 没有内置 JSON 库时,可以使用简单的字符串拼接功能构造数据。
- 构造 待发送的 Payload 字符串。为了演示方便,我们使用基本的拼接操作:
// 将整型数据转换为字符串并拼接到 JSON 模板中
// 格式示例:{"temp": 25}
strPayload := CONCAT('{"temp": ', DINT_TO_STRING(nTemperature));
strPayload := CONCAT(strPayload, '}');
-
配置 发布参数。在变量声明区或代码中设置
mqttPublish:mqttPublish.strTopic:=device/sensor/data(云平台订阅的主题);mqttPublish.strPayload:=strPayload(指向我们要发送的字符串);mqttPublish.qos:=SysMqtt.QoS.AtMostOnce(0级服务质量);
-
编写 发布逻辑代码(仅当已连接时才发布):
IF bConnected AND bPublishTrigger THEN
fbMqttClient.Publish(
xEnable := TRUE,
itfPublish := mqttPublish,
xDone =>,
xBusy =>
);
// 发布完成后复位触发信号
IF fbMqttClient.Publish.xDone THEN
bPublishTrigger := FALSE;
fbMqttClient.Publish(xEnable := FALSE);
END_IF
END_IF
第五阶段:逻辑整合与循环执行
在实际项目中,连接和发布需要放入主循环中周期性运行。以下是完整的逻辑流向说明。
为了直观理解连接与发布的状态切换,参考下述流程图:
graph LR
A["初始化: 赋值连接参数"] --> B["触发连接: bConnectTrigger=TRUE"]
B --> C{连接完成?}
C -- 否 --> D["保持连接: 等待 xDone"]
C -- 是 --> E["状态置位: bConnected=TRUE"]
E --> F["数据准备: 拼接 JSON 字符串"]
F --> G["触发发布: bPublishTrigger=TRUE"]
G --> H["执行发布: 调用 Publish 功能块"]
H --> I["复位触发: bPublishTrigger=FALSE"]
I --> F
- 整合 代码。将连接逻辑和发布逻辑放入同一个
PROGRAM中。 - 模拟 数据变化。为了验证效果,在代码中加入模拟数据变化逻辑:
// 每秒增加一次温度值用于测试
nTemperature := nTemperature + 1;
- 触发 数据上传。你可以使用系统时钟或定时器来周期性地置位
bPublishTrigger,或者设定条件,例如当nTemperature变化时上传。
第六阶段:调试与验证
在 PLC 处于仿真或在线模式时,必须监控变量来确认通讯状态。
- 登录 到 PLC(点击 调试菜单中的
登录)。 - 打开 监视列表(右键 点击代码区 ->
添加监视)。 - 添加 关键变量:
fbMqttClient.xDone,fbMqttClient.xError,bConnected,strPayload。 - 手动 修改
bConnectTrigger为TRUE。 - 观察
bConnected变量是否变为TRUE。如果为FALSE,检查xError状态,通常是因为网络不通或参数配置错误。 - 手动 修改
bPublishTrigger为TRUE。 - 检查 云平台控制台,确认是否收到
{"temp": 26}等数据。
常见参数配置速查表
下表汇总了配置过程中最关键的数据结构及其用途。
| 参数名称 | 类型 | 示例值 | 说明 |
|---|---|---|---|
strEndpoint |
STRING | broker.emqx.io |
MQTT 代理服务器的 IP 地址或域名 |
nPort |
UINT | 1883 |
通讯端口,1883 为明文,8883 为加密 |
strClientID |
STRING | PLC_001 |
客户端唯一标识,同一服务器下不可重复 |
strTopic |
STRING | factory/line1/temp |
消息主题,云平台根据此主题过滤数据 |
strPayload |
STRING | {"val":100} |
实际发送的消息内容,通常为 JSON 格式 |
qos |
ENUM | 0 / 1 / 2 |
服务质量等级,0 表示发后即焚,1 表示至少到达一次 |
- 保存 项目并下载 到 PLC。
- 运行 PLC 逻辑。
- 观察 云平台数据仪表盘,确认数据实时更新。

暂无评论,快来抢沙发吧!