You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Structured Text IEC从串口通信数据中提取帧的问题求助

问题解答

1. $符号的含义

$是转义标识字符,用来表示后续字符是ASCII控制字符的十进制编码。因为STX(ASCII 02)、ETX(ASCII 03)这类控制字符属于不可打印字符,无法直接以字符串形式传输,所以用$ + 控制字符的十进制数字来转义表示:

  • $ 2对应ASCII 02(STX,帧起始符)
  • $ 3对应ASCII 03(ETX,帧结束符)
    (注:从提供的帧内容看,$和数字之间有空格,这是转义格式的一部分)

2. Structured Text提取有效数据的实现

接收的帧为STRING(255)类型,核心思路是循环定位每一组$ 2(STX)和$ 3(ETX)的位置,提取中间的子串。以下是具体实现代码:

VAR
    RawData: STRING(255) := "$ 200103001<000000008000000000000000000009$ 3$ 200103001<000000008000000000000000000009$ 3$ 200100?1$ 3";
    StxPattern: STRING(3) := "$ 2";
    EtxPattern: STRING(3) := "$ 3";
    StxPos: INT;
    EtxPos: INT;
    CurrentStart: INT := 1;
    ExtractedData: STRING(200);
    TempData: STRING(200);
END_VAR

// 循环提取每帧数据
REPEAT
    // 定位当前起始位置后的STX
    StxPos := FIND(RawData, StxPattern, CurrentStart);
    IF StxPos = 0 THEN
        EXIT; // 无更多STX,退出循环
    END_IF;

    // 从STX结束位置开始定位对应ETX
    EtxPos := FIND(RawData, EtxPattern, StxPos + LEN(StxPattern));
    IF EtxPos = 0 THEN
        EXIT; // 未找到匹配ETX,退出
    END_IF;

    // 提取STX与ETX之间的有效数据
    TempData := MID(RawData, StxPos + LEN(StxPattern), EtxPos - (StxPos + LEN(StxPattern)));
    
    // 可将单帧数据存入数组或做后续处理,示例为拼接所有提取数据
    ExtractedData := ExtractedData + TempData + ',';

    // 更新下一次查找的起始位置
    CurrentStart := EtxPos + LEN(EtxPattern);
UNTIL CurrentStart > LEN(RawData) END_REPEAT;

代码说明:

  • 用StxPattern和EtxPattern明确定义帧起止标识,避免硬编码错误
  • 通过REPEAT...UNTIL循环处理多帧连续数据
  • FIND函数的第三个参数指定查找起始位置,确保只处理未解析的字符串段
  • MID函数根据STX和ETX的位置计算有效数据的索引与长度,实现精准提取

内容的提问来源于stack exchange,提问作者Toxic Me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:59:52