菜单

6.7 自由协议

下载

自由协议由 Lua 定义帧格式和收发规则。本节接收四字节水温报文,更新海岸泵站画面。

核心功能

  • 自定义帧头、数据和应答。
  • 接收半帧与连续多帧。
  • 工程通信口及独立第二串口。

1. 参数设置

在 工程 → 设置 → 工程设置 中配置通信参数。

6.7 自由协议 参数编号,完整 IDE 窗口
序号 参数 本例 作用
1 波特率 115200 公共串口参数,见 6.1 DCBUS。
2 数据位 8 公共串口参数,见 6.1 DCBUS。
3 校验位 无 公共串口参数,见 6.1 DCBUS。
4 停止位 1位 公共串口参数,见 6.1 DCBUS。
5 接收回调 是 将接收字节交给 Lua 的 on_uart_recv;自由协议示例开启。
6 协议类型 自定义 选择当前工程使用的通信协议。
7 间隔时间ms 50 通信报文之间的调度间隔;不等于所有变量的刷新周期。
8 同步画面 否 公共设置,见 6.3 Modbus 主站 的“公共参数”。
9 画面写入地址 未设置 公共设置,见 6.3 Modbus 主站 的“公共参数”。
10 画面取自地址 未设置 公共设置,见 6.3 Modbus 主站 的“公共参数”。
11 字节序 默认大端 公共设置,见 6.3 Modbus 主站 的“公共参数”。

本例开启 接收回调,在 Lua 中处理数据。串口的“间隔时间”不替代帧长度、校验或脚本定时器。

2. 应用

下载本节工程 · 6.8 示例下载

  1. 打开 SeasideCustom 并运行;模拟器串口副屏选择 工程通信,打开 COM2。
  2. 助手选择 自由协议,打开 COM3。
  3. 输入 25、32、9,分别点击“写入设定”;屏上水温依次更新。
自由协议:发送水温数据并更新屏幕

2.1 帧格式

字段 字节数 示例
帧头 2 AA 55
水温值 2 高字节在前,00 09 表示 9
text 复制代码
25:AA 55 00 19
32:AA 55 00 20
 9:AA 55 00 09

接收值写入 LW1000,水温数值及进度条绑定同一地址。液位与转速为本地画面演示,不参与这个四字节协议。

2.2 接收脚本

一次回调可能只有半帧,也可能包含多帧。保留未完成数据,凑齐后再处理。

lua 复制代码
local LW = 1
local rx = ""

function on_uart_recv(channel, packet, length)
    if channel ~= 0 then return end
    rx = rx .. packet
    while #rx >= 2 do
        local first, second = string.byte(rx, 1, 2)
        if first ~= 0xAA or second ~= 0x55 then
            rx = string.sub(rx, 2)
        elseif #rx < 4 then
            break
        else
            local high, low = string.byte(rx, 3, 4)
            set_uint16(LW, 0x1000, high * 256 + low)
            rx = string.sub(rx, 5)
        end
    end
end

示例未定义 CRC、确认或重发;接入设备时按对端规范补充。同名回调只保留一份,已有业务合并到函数内部。

2.3 发送数据

lua 复制代码
-- 在按钮事件或定时器中按需调用
local result = uart_send(0, {0xAA, 0x55, 0x00, 0x01})
if result ~= 0 then
    print("发送失败", result)
end

返回 0 表示发送接口接受数据,不代表对端已经执行。不要在每轮 on_run 中无间隔发送。

3. 串口与回调

用途 设置 / 发送 接收通道
工程通信口 uart_setup(0, ...) / uart_send(0, ...) 0
独立第二口 uart_setup(3, ...) / uart_send(3, ...) 3

通道 0 是工程通信口,不是硬件日志 UART0。通道 1 是主口别名;通道 2 仅保留第二口发送别名,不支持 uart_setup。新工程统一使用 0 / 3。

lua 复制代码
-- 放入现有 on_init;115200、8N1
local result = uart_setup(3, 115200, 8, 0, 0)
if result ~= 0 then
    print("第二串口初始化失败", result)
end

Lua 的停止位编码为 0=1位、1=2位,校验编码为 0=无、1=奇、2=偶。主口改参会影响工程协议,但不改写工程文件;双口接收各自保存缓冲。

模拟器第二口需在启动前设置 STT_SIM_UART3 为另一个可用 COM,不能与主口重复。函数范围及版本要求见 5.3 串口通信。

4. 常见问题

现象 检查项
串口有数据但画面不变 是否开启接收回调、选择工程通信,是否判断通道 0
偶尔丢数据 是否把一次回调误当一整帧,是否处理半帧及多帧
第二口无数据 COM 配置、端口占用和运行库支持情况
脚本持续发送 停止相应定时器或业务开关;set_notify 不会停止 uart_send

回调中可临时打印通道和长度,在串口副屏“运行日志”查看。内置协议也可提供原始接收回调,监听时不要重复发送其应答。

6.8 示例下载

上一个
6.6 三菱 FX3U
下一个
6.8 示例下载
最近修改: 2026-11-06Powered by