西门子 SCL 中字符串的处理函数
在西门子 PLC 编程中,SCL(Structured Control Language)处理文本数据的能力远强于梯形图。无论是读取条码、解析通讯报文还是生成报警信息,都离不开字符串操作。本指南直接讲解如何在 TIA Portal 中定义、操作及调试字符串,确保你能够立即上手。
1. 定义字符串变量
在 SCL 中,字符串不是基本数据类型,需要正确声明才能使用。西门子支持两种主要字符串类型,分别是 STRING 和 WSTRING。
- 打开 项目树中的“数据类型”文件夹。
- 创建 一个新的数据块(DB)或全局常量表。
- 定义 变量类型为
String或WString。 - 设置 最大长度参数。
STRING 类型基于 ASCII 码,最大长度为 254 个字符;WSTRING 基于 Unicode,最大长度为 65534 个字符。对于大多数工业通讯场景,STRING 已足够使用。定义变量时,务必注意实际长度不能超过声明的最大长度,否则会导致运行时错误。
// 正确定义示例
VAR
Barcode_Input : String[20]; // 最大容纳 20 个字符
Product_Name : String[50]; // 最大容纳 50 个字符
Error_Msg : String[100]; // 最大容纳 100 个字符
END_VAR
2. 核心处理函数详解
西门子 SCL 提供了一套标准库函数来处理字符串。你不需要自己编写底层逻辑,直接调用这些函数即可。以下是最高频使用的函数清单。
| 函数名 | 功能说明 | 输入参数 | 返回值类型 |
|---|---|---|---|
LEN |
计算字符串实际长度 | 字符串变量 | Int |
CONCAT |
连接两个字符串 | 字符串 1, 字符串 2 | String |
FIND |
查找子串位置 | 主串,子串 | Int |
LEFT |
截取左侧字符 | 字符串,长度 | String |
RIGHT |
截取右侧字符 | 字符串,长度 | String |
MID |
截取中间字符 | 字符串,起始位置,长度 | String |
DELETE |
删除部分字符 | 字符串,起始位置,长度 | Void |
INSERT |
插入字符串 | 主串,插入串,位置 | Void |
REPLACE |
替换子串 | 主串,旧串,新串 | Void |
- 查阅 上表确认所需功能。
- 编写 调用代码时注意参数顺序。
- 检查 返回值是否需要存储到新变量。
特别注意 FIND 函数,如果未找到子串,它返回 0。在进行截取操作前,务必先判断长度,防止索引越界。
3. 字符串处理逻辑流程
处理复杂字符串(如解析带分隔符的报文)时,建议先理清逻辑步骤。以下流程图展示了标准的解析过程。
flowchart TD
A["开始 读取原始字符串"] --> B["检查长度 LEN"]
B --> C{"长度 > 0?"}
C -- "否" --> D["报错 空字符串"]
C -- "是" --> E["查找分隔符 FIND"]
E --> F{"找到分隔符?"}
F -- "否" --> G["报错 格式错误"]
F -- "是" --> H["截取子串 MID"]
H --> I["转换数据类型"]
I --> J["结束 输出结果"]
- 遵循 上述流程编写逻辑。
- 避免 在未检查长度的情况下直接截取。
- 处理 所有异常分支,防止程序停机。
4. 实战案例:解析条码数据
假设扫码枪上传的数据格式为 ID:12345;VAL:99,你需要提取出 12345 和 99 并存入整数变量。以下是完整的 SCL 代码实现。
FUNCTION_BLOCK "FB_ParseBarcode"
VAR
Raw_Data : String[50]; // 原始输入数据
ID_Value : Int; // 输出的 ID 数值
Val_Value : Int; // 输出的 VAL 数值
Temp_Str : String[20]; // 临时字符串
Pos_Start : Int; // 起始位置
Pos_End : Int; // 结束位置
Len_Str : Int; // 字符串长度
END_VAR
BEGIN
// 1. 获取原始数据长度
Len_Str := LEN(Raw_Data);
// 2. 防止空数据报错
IF Len_Str > 0 THEN
// 3. 查找第一个分号的位置
Pos_End := FIND(Raw_Data, ';');
// 4. 确保格式正确
IF Pos_End > 0 THEN
// 5. 提取 ID 部分 (假设格式固定为 "ID:xxxxx;")
// 起始位置为 4 (跳过 "ID:"),长度为 分号位置 - 4
Temp_Str := MID(Raw_Data, 4, Pos_End - 4);
// 6. 转换为整数 (需确保字符串纯数字)
// 此处假设已确认内容合法,实际生产需加校验
ID_Value := STRING_TO_INT(Temp_Str);
// 7. 提取 VAL 部分 (假设格式为 ";VAL:99")
Pos_Start := Pos_End + 5; // 跳过 ";VAL:"
Temp_Str := MID(Raw_Data, Pos_Start, Len_Str - Pos_Start + 1);
Val_Value := STRING_TO_INT(Temp_Str);
END_IF;
END_IF;
END_FUNCTION_BLOCK
- 复制 上述代码到你的 SCL 块中。
- 修改 变量命名以匹配你的项目规范。
- 测试 不同长度的输入数据验证稳定性。
代码中的 MID 函数起始位置从 1 开始计数,而非 0,这是与 C 语言最大的区别,务必注意。STRING_TO_INT 是类型转换函数,如果字符串包含非数字字符,转换结果可能不可控,建议在前端增加字符校验。
5. 常见陷阱与注意事项
字符串操作看似简单,但在 PLC 实时控制系统中容易引发隐蔽问题。以下是必须遵守的铁律。
- 限制 字符串长度不要超过声明上限。
- 如果
String[10]尝试存入 11 个字符,多余部分会被截断,不会报错,但数据会丢失。
- 如果
- 清理 字符串末尾的空格。
- 通讯接收的数据常带有填充空格,使用
LEN计算长度时会包含空格,影响判断。
- 通讯接收的数据常带有填充空格,使用
- 避免 在高速循环中频繁创建临时字符串。
- 频繁分配内存会增加扫描周期,建议在静态变量中复用临时字符串缓冲区。
- 注意 字符编码一致性。
- 触摸屏、PLC 和上位机必须统一使用 ASCII 或 Unicode,否则中文会显示为乱码。
// 错误示范:直接赋值可能导致截断
Short_String := Long_String; // 若 Long 长度超过 Short 定义,数据丢失
// 正确示范:先检查长度
IF LEN(Long_String) <= 10 THEN
Short_String := Long_String;
ELSE
Short_String := LEFT(Long_String, 10); // 强制截取前 10 位
END_IF;
- 审查 所有赋值语句的长度匹配情况。
- 添加 长度判断逻辑保护关键数据。
- 监控 程序扫描时间,优化字符串操作频率。

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