基于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
相关产品推荐
相关产品推荐

