文章目录

Codesys的字符串处理函数库应用

发布于 2026-03-29 15:20:17 · 浏览 6 次 · 评论 0 条

Codesys 的字符串处理函数库应用

在工业自动化控制中,设备通信与数据显示经常涉及文本信息的交换。CODESYS 作为广泛使用的开发环境,内置了标准功能库中的字符串处理机制。掌握这些机制能让程序更稳健地解析协议数据、生成报警日志或操作 HMI 标签。本文直接讲解如何调用、使用及避坑 CODESYS 中的字符串函数。


环境准备与库管理

激活 字符串功能库是第一步。默认情况下,部分基础类型已可用,但高级函数需显式引用。

  1. 打开 项目树中的 Resources(资源)文件夹。
  2. 右键点击 Global Libraries(全局库)。
  3. 选择 Add Library(添加库)。
  4. 勾选 Standard(标准库),该库包含最常用的 STRING 相关函数。
  5. 确认 选中后,保存 项目以更新依赖关系。
  6. 新建 一个名为 StringProcessDemo 的功能块(POU),用于编写逻辑测试代码。

核心函数速查表

下表列出最常用的字符串操作函数及其输入输出参数特征。注意所有长度单位均为字符数,不包括终止符。

函数名称 功能描述 关键输入参数 返回值说明
STRING_LENGTH 获取字符串实际长度 str (STRING) 整数类型,表示字符个数
CONCAT 连接两个或多个字符串 s1, s2, ... 合并后的新字符串
LEFT 截取字符串左侧指定长度 str, len 左侧截取部分
RIGHT 截取字符串右侧指定长度 str, len 右侧截取部分
MID 从中间位置截取字符串 str, pos, len 从第 pos 位开始取 len 个字符
POS 查找子串在主串中的位置 find, in_str 子串起始索引,未找到返回 0
REPLACE 替换字符串中的特定内容 str, old, new, cnt 替换后的新字符串
UPPER / LOWER 转换字母大小写 str 全大写或全小写的字符串

实战:协议数据包解析

工业现场常收到类似 SENSOR001,Temp:25.5,Cnt:100; 的报文。本例演示如何使用上述函数提取关键数据。假设接收缓冲区变量为 rx_buffer (STRING),目标温度存储于 target_temp (REAL)。

代码实现

复制 以下结构化文本(ST)代码到你的 POU 中:

PROGRAM ParseSensorData
VAR
    rx_buffer : STRING := 'SENSOR001,Temp:25.5,Cnt:100;';
    temp_part : STRING;
    full_len : INT;
    start_pos : INT;
    end_pos : INT;
    clean_val : STRING;
END_VAR

// 1. 计算总长度
full_len := STRING_LENGTH(rx_buffer);

// 2. 定位逗号位置以分割字段
start_pos := POS(',', rx_buffer) + 1; // 跳过第一个逗号

// 3. 截取包含温度的中间段 " Temp:25.5"
temp_part := MID(rx_buffer, start_pos, 12); 

// 4. 再次定位冒号,剔除前缀
start_pos := POS(':', temp_part);
clean_val := MID(temp_part, start_pos + 1, STRING_LENGTH(temp_part));

// 5. 类型转换 (STRING TO REAL)
target_temp := _STRTOreal(clean_val); 

逻辑流程图解

若需理清数据处理顺序,参考下方的逻辑流向。该图展示了从原始数据到最终数值的转化路径。

graph TD A["接收原始报文\nrx_buffer"] --> B["计算总长度\nSTRING_LENGTH"] B --> C["定位分隔符\nPOS']'']"] C --> D["截取子串\nMID"] D --> E["清理前缀\n第二次 MID"] E --> F["类型转换\nSTRTO_REAL"] F --> G["输出数值\ntarget_temp"] style A fill:#f9f,stroke:#333,stroke-width:2px style G fill:#bbf,stroke:#333,stroke-width:2px

进阶技巧与边界控制

动态缓冲区管理

当拼接长字符串时,必须预先定义足够大的 STRING(n)

声明 变量时需指定最大长度,例如 msg : STRING[255];。如果超出这个限制,多余的字符会被自动截断,不会报错但会导致数据丢失。

建议 在拼接前使用 STRING_LENGTH 预判剩余空间。

IF STRING_LENGTH(msg) + NEW_DATA_LEN <= 255 THEN
    msg := CONCAT(msg, NEW_DATA);
ELSE
    // 触发溢出报警
END_IF

去除首尾空格

通讯数据常含多余空格影响比较判断。虽然 CODESYS 标准库无直接的 TRIM 函数,可组合使用 MIDLENGTH 模拟。

  1. 获取 字符串长度。
  2. 循环 检测首尾字符是否为 ASCII 码 32(空格)。
  3. 重新赋值 截取后的内容到新变量。

编码兼容性

注意 CODESYS 默认采用 UTF-8 或 ANSI 编码,取决于编译器设置。中文环境下需确保设备与上位机编码一致。若出现乱码,检查 项目设置中的 Character Set 选项,强制统一为 UTF-8


常见错误规避清单

在执行字符串操作时,以下错误极易导致程序异常。

错误场景 后果描述 规避措施
数组越界 访问 STRING 索引 0 或超过定义的最大长度 始终 先执行 STRING_LENGTH 校验
空指针引用 对未初始化的 STRING 指针操作 初始化 所有字符串变量为空 "" 或默认值
类型不匹配 直接将数字赋给字符串变量 必须 使用 INT_TO_STRING 等转换函数
内存泄漏 在循环中频繁创建临时大字符串对象 复用 已分配的字符串变量,减少 VAR_TEMP 开销
特殊字符转义 路径中包含反斜杠 \ 导致解析错误 使用 双反斜杠 \\ 或正斜杠 / 代替

性能优化建议

字符串处理比数值运算消耗更多 CPU 周期。

避免 在主扫描循环(Main Cycle)内进行复杂的字符串正则匹配。对于高频数据,优先使用字节数组(ARRAY OF BYTE)传输,仅在 HMI 刷新或报表生成时转换为 STRING

使用 静态变量缓存重复生成的固定格式文本(如日期前缀),无需每个周期重新构建。

  1. 定义 静态变量 static_date_part
  2. 判断 系统时间是否变化。
  3. 仅当 时间变化时 更新 该变量。
  4. 日志拼接时 直接引用 静态变量。
PROGRAM OptimizedLogging
VAR
    static prev_sec : TIME_OF_DAY := T#0S;
    static date_header : STRING := '';
    current_msg : STRING;
END_VAR

// 检查秒级变化
IF now >= prev_sec + T#1S THEN
    date_header := CONCAT(now_to_string(TIME), " [LOG]: ");
    prev_sec := now;
END_IF

// 快速拼接
current_msg := CONCAT(date_header, event_desc);

调试策略

启用 TRACE 功能记录字符串变量的内容变化,以便在线监控。

  1. 添加 变量 rx_buffer 到 Trace Window。
  2. 设置 采样率为任务周期的 1/2。
  3. 运行 程序并 观察 波形图中的字符内容。
  4. 对比 预期报文与实际截取结果,修正偏移量 pos 参数。

利用 DEBUG 模式下 Watch 窗口的实时计算功能,手动输入 MID(rx_buffer, 1, 5) 测试截取逻辑是否正确,无需修改代码即可验证。

评论 (0)

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

扫一扫,手机查看

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