文章目录

西门子SCL中字符串的处理函数

发布于 2026-03-30 06:08:34 · 浏览 8 次 · 评论 0 条

西门子 SCL 中字符串的处理函数

在西门子 PLC 编程中,SCL(Structured Control Language)处理文本数据的能力远强于梯形图。无论是读取条码、解析通讯报文还是生成报警信息,都离不开字符串操作。本指南直接讲解如何在 TIA Portal 中定义、操作及调试字符串,确保你能够立即上手。


1. 定义字符串变量

在 SCL 中,字符串不是基本数据类型,需要正确声明才能使用。西门子支持两种主要字符串类型,分别是 STRINGWSTRING

  1. 打开 项目树中的“数据类型”文件夹。
  2. 创建 一个新的数据块(DB)或全局常量表。
  3. 定义 变量类型为 StringWString
  4. 设置 最大长度参数。

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
  1. 查阅 上表确认所需功能。
  2. 编写 调用代码时注意参数顺序。
  3. 检查 返回值是否需要存储到新变量。

特别注意 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["结束 输出结果"]
  1. 遵循 上述流程编写逻辑。
  2. 避免 在未检查长度的情况下直接截取。
  3. 处理 所有异常分支,防止程序停机。

4. 实战案例:解析条码数据

假设扫码枪上传的数据格式为 ID:12345;VAL:99,你需要提取出 1234599 并存入整数变量。以下是完整的 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
  1. 复制 上述代码到你的 SCL 块中。
  2. 修改 变量命名以匹配你的项目规范。
  3. 测试 不同长度的输入数据验证稳定性。

代码中的 MID 函数起始位置从 1 开始计数,而非 0,这是与 C 语言最大的区别,务必注意。STRING_TO_INT 是类型转换函数,如果字符串包含非数字字符,转换结果可能不可控,建议在前端增加字符校验。


5. 常见陷阱与注意事项

字符串操作看似简单,但在 PLC 实时控制系统中容易引发隐蔽问题。以下是必须遵守的铁律。

  1. 限制 字符串长度不要超过声明上限。
    • 如果 String[10] 尝试存入 11 个字符,多余部分会被截断,不会报错,但数据会丢失。
  2. 清理 字符串末尾的空格。
    • 通讯接收的数据常带有填充空格,使用 LEN 计算长度时会包含空格,影响判断。
  3. 避免 在高速循环中频繁创建临时字符串。
    • 频繁分配内存会增加扫描周期,建议在静态变量中复用临时字符串缓冲区。
  4. 注意 字符编码一致性。
    • 触摸屏、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;
  1. 审查 所有赋值语句的长度匹配情况。
  2. 添加 长度判断逻辑保护关键数据。
  3. 监控 程序扫描时间,优化字符串操作频率。

评论 (0)

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

扫一扫,手机查看

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