▎西门子博途 LGF 库详解 · 14:字符串操作——大小写转换、CharArray 提取与查找
扫码枪输出、上位机报文、HMI 输入——PLC 里处理文本的场景比你想象的多。博途原生的字符串指令有限,LGF 的字符串操作组 5 个块补上了大小写转换、CharArray 文本提取和子串查找。
一、5 个块一览
字符串操作组(4.11 Converter / String Operations)
| 块名 | 类型 | 版本 | 功能 |
|------|------|------|------|
| LGF_ToLower | FC | V1.0.0 | String 转小写 |
| LGF_ToUpper | FC | V1.0.0 | String 转大写 |
| LGF_ExtractStringFromCharArray | FC | V1.1.0 | 从 Variant 字符数组中按前后标记提取字符串 |
| LGF_ExtractStringFromCharArrayAdv | FC | V1.1.0 | 同上 + 指定起始位置和长度 + 可选包含前后标记 |
| LGF_FindStringInCharArray | FC | V1.1.0 | 在 Variant 字符数组中查找子串位置 |
二、引脚详解
#### LGF_ToLower / LGF_ToUpper
| 引脚 | 类型 | 方向 | 说明 |
| In | String | IN | 输入字符串 |
| Ret_Val | String | OUT | ToLower: 全部转小写;ToUpper: 全部转大写 |
#### LGF_ExtractStringFromCharArray
| 引脚 | 类型 | 方向 | 说明 |
| textBefore | String | IN | 要提取内容的前置标记文本 |
| textAfter | String | IN | 要提取内容的后置标记文本 |
| searchIn | Variant | IN | 待搜索的字符数组(Array of Char) |
| Ret_Val | Word | OUT | 状态码 |
| extractedString | String | OUT | 提取出的字符串(不含前后标记) |
| status | Word | OUT | 状态码 |
#### LGF_ExtractStringFromCharArrayAdv
| 引脚 | 类型 | 方向 | 说明 |
| textBefore | String | IN | 前置标记文本 |
| textAfter | String | IN | 后置标记文本 |
| includeBeforeAfter | Bool | IN | TRUE=提取结果包含前后标记 |
| startPos | DInt | IN | 搜索起始位置(0-based) |
| searchIn | Variant | IN | 待搜索的字符数组 |
| Ret_Val | Word | OUT | 状态码 |
| extractedString | String | OUT | 提取结果 |
| position | DInt | OUT | 找到的位置 |
| length | Int | OUT | 提取的长度 |
| status | Word | OUT | 状态码 |
#### LGF_FindStringInCharArray
| 引脚 | 类型 | 方向 | 说明 |
| searchFor | String | IN | 要查找的子串 |
| startPos | DInt | IN | 搜索起始位置(0-based) |
| searchIn | Variant | IN | 待搜索的字符数组 |
| Ret_Val | DInt | OUT | 找到的位置(-1=未找到) |
| status | Word | OUT | 状态码 |
三、实战案例
#### 案例 1:扫码枪数据提取产品编码
扫码枪输出格式为 "[PROD]ABC12345[/PROD]",从中提取产品编码:
CharArray 提取产品编码
LGF_ExtractStringFromCharArray(textBefore := '[PROD]', textAfter := '[/PROD]',
searchIn := barcodeArray, extractedString => productCode);
提取结果是 "ABC12345",前后标记被自动去除。
#### 案例 2:HMI 输入规范化
HMI 输入的用户名可能大小写混用,统一转小写后比较:
ToLower 输入规范化
normalizedName := LGF_ToLower(hmiInput);
IF normalizedName = expectedName THEN loginOK := TRUE; END_IF;
#### 案例 3:Adv 版精确提取含前后标记
需要保留标记内容以便后续处理:
Adv 版包含标记提取
LGF_ExtractStringFromCharArrayAdv(textBefore := '<', textAfter := '>',
includeBeforeAfter := TRUE, startPos := 0,
searchIn := xmlArray, extractedString => fullTag);
// 结果包含 '' 而非 'tag'
四、总结与下载
下载信息
| 项目 | 内容 |
|------|------|
| 库名称 | Library of General Functions (LGF) |
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(中文站最新;SIOS 全球站另有 V5.2.1) |
| 兼容 | TIA Portal V17+、S7-1200 (固件 ≥V4.2)、S7-1500 (固件 ≥V2.0) |
| 费用 | 完全免费 |
> 本文所有引脚数据基于 LGF V5.1.1 官方文档。全球站:support.industry.siemens.com/cs/document/109479728
下篇预告:LGF 库详解 · 15——类型转换(上)。IntString、DTLString(DE/ISO)、TimeString、TaddrString——10 个块覆盖最常用的数据类型互转。欢迎点赞、在看、转发。