文章目录

Codesys与云平台的MQTT通信

发布于 2026-03-26 10:01:40 · 浏览 8 次 · 评论 0 条

Codesys与云平台的MQTT通信

本文指南详细介绍如何在 Codesys 软件中通过 MQTT 协议将 PLC 数据上传至云平台。整个过程无需依赖复杂的图片说明,通过文字描述即可完成配置与编程。


第一阶段:环境准备与库安装

在开始编写代码之前,必须确保 Codesys 开发环境中包含 MQTT 通讯所需的库。Codesys 官方并未内置 MQTT 协议栈,通常需要从 Codesys Store 下载或由 PLC 厂商提供。

  1. 打开 Codesys 项目,确认 PLC 设备类型已添加。
  2. 双击 项目树中的 库管理器(Library Repository)选项卡。
  3. 点击 库管理器底部的 添加库 按钮(通常是一个“+”号图标)。
  4. 输入 关键字 MQTT 进行搜索。
    • 如果是标准 Codesys 环境,请搜索并安装 SysMqtt 库。
    • 如果是特定品牌 PLC(如汇川、施耐德等),请安装厂商提供的封装 MQTT 库(例如 MqttClient)。
  5. 勾选 搜索结果中的库文件,点击 确定 完成添加。

第二阶段:定义全局变量与连接参数

建立 MQTT 通讯需要定义客户端实例、连接参数以及数据缓冲区。在 PLC_PRG 或自定义的 POU 中声明变量。

  1. 双击 打开主程序 PLC_PRG(用于存放逻辑)。
  2. 切换 到变量声明区(通常在编辑器上部)。
  3. 输入 以下变量声明代码:
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
  1. 补充 初始化连接参数。在 PLC_PRG 的代码执行区(第一周期)或属性设置中赋值:
    • mqttConnect.strEndpoint := 你的云平台IP地址或域名;
    • mqttConnect.nPort := 1883 (非加密端口) 或 8883 (SSL加密端口);
    • mqttConnect.strClientID := Codesys_Device_01 (确保唯一);
    • mqttConnect.strUsername := 你的云平台用户名;
    • mqttConnect.strPassword := 你的云平台密钥;

第三阶段:建立 MQTT 连接

MQTT 是有状态的协议,必须先建立连接才能传输数据。我们将使用一个上升沿信号来触发连接动作。

  1. 定位PLC_PRG 的代码执行部分(PROGRAM PLC_PRG 下方)。
  2. 编写 连接逻辑代码:
// 触发连接:当 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
  1. 注意:上述代码中 itfConnect 接口传入了我们在第二阶段定义的 mqttConnect 结构体。

第四阶段:构建 JSON 数据与发布

云平台通常接收 JSON 格式的数据。Codesys 没有内置 JSON 库时,可以使用简单的字符串拼接功能构造数据。

  1. 构造 待发送的 Payload 字符串。为了演示方便,我们使用基本的拼接操作:
// 将整型数据转换为字符串并拼接到 JSON 模板中
// 格式示例:{"temp": 25}
strPayload := CONCAT('{"temp": ', DINT_TO_STRING(nTemperature));
strPayload := CONCAT(strPayload, '}');
  1. 配置 发布参数。在变量声明区或代码中设置 mqttPublish

    • mqttPublish.strTopic := device/sensor/data (云平台订阅的主题);
    • mqttPublish.strPayload := strPayload (指向我们要发送的字符串);
    • mqttPublish.qos := SysMqtt.QoS.AtMostOnce (0级服务质量);
  2. 编写 发布逻辑代码(仅当已连接时才发布):

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
  1. 整合 代码。将连接逻辑和发布逻辑放入同一个 PROGRAM 中。
  2. 模拟 数据变化。为了验证效果,在代码中加入模拟数据变化逻辑:
// 每秒增加一次温度值用于测试
nTemperature := nTemperature + 1;
  1. 触发 数据上传。你可以使用系统时钟或定时器来周期性地置位 bPublishTrigger,或者设定条件,例如当 nTemperature 变化时上传。

第六阶段:调试与验证

在 PLC 处于仿真或在线模式时,必须监控变量来确认通讯状态。

  1. 登录 到 PLC(点击 调试菜单中的 登录)。
  2. 打开 监视列表(右键 点击代码区 -> 添加监视)。
  3. 添加 关键变量:fbMqttClient.xDone, fbMqttClient.xError, bConnected, strPayload
  4. 手动 修改 bConnectTriggerTRUE
  5. 观察 bConnected 变量是否变为 TRUE。如果为 FALSE,检查 xError 状态,通常是因为网络不通或参数配置错误。
  6. 手动 修改 bPublishTriggerTRUE
  7. 检查 云平台控制台,确认是否收到 {"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 表示至少到达一次

  1. 保存 项目并下载 到 PLC。
  2. 运行 PLC 逻辑。
  3. 观察 云平台数据仪表盘,确认数据实时更新。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文