Codesys 的字符串处理函数库应用
在工业自动化控制中,设备通信与数据显示经常涉及文本信息的交换。CODESYS 作为广泛使用的开发环境,内置了标准功能库中的字符串处理机制。掌握这些机制能让程序更稳健地解析协议数据、生成报警日志或操作 HMI 标签。本文直接讲解如何调用、使用及避坑 CODESYS 中的字符串函数。
环境准备与库管理
激活 字符串功能库是第一步。默认情况下,部分基础类型已可用,但高级函数需显式引用。
- 打开 项目树中的
Resources(资源)文件夹。 - 右键点击
Global Libraries(全局库)。 - 选择
Add Library(添加库)。 - 勾选
Standard(标准库),该库包含最常用的STRING相关函数。 - 确认 选中后,保存 项目以更新依赖关系。
- 新建 一个名为
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);
逻辑流程图解
若需理清数据处理顺序,参考下方的逻辑流向。该图展示了从原始数据到最终数值的转化路径。
进阶技巧与边界控制
动态缓冲区管理
当拼接长字符串时,必须预先定义足够大的 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 函数,可组合使用 MID 和 LENGTH 模拟。
- 获取 字符串长度。
- 循环 检测首尾字符是否为 ASCII 码 32(空格)。
- 重新赋值 截取后的内容到新变量。
编码兼容性
注意 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。
使用 静态变量缓存重复生成的固定格式文本(如日期前缀),无需每个周期重新构建。
- 定义 静态变量
static_date_part。 - 判断 系统时间是否变化。
- 仅当 时间变化时 更新 该变量。
- 在 日志拼接时 直接引用 静态变量。
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 功能记录字符串变量的内容变化,以便在线监控。
- 添加 变量
rx_buffer到 Trace Window。 - 设置 采样率为任务周期的 1/2。
- 运行 程序并 观察 波形图中的字符内容。
- 对比 预期报文与实际截取结果,修正偏移量
pos参数。
利用 DEBUG 模式下 Watch 窗口的实时计算功能,手动输入 MID(rx_buffer, 1, 5) 测试截取逻辑是否正确,无需修改代码即可验证。

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