如何提取PLC标签子元素名称前缀数字实现点位自动映射
实现场景说明
待处理的子元素统一采用[数字编号]_[子元素名]的命名格式,示例如下:
001_Child1030_Child2109_Child3
需要配置单一通用库属性,提取名称开头的数字编号,映射到对应PLC点位,映射规则为:编号值为N的子元素,指向PLC(N).Cnt,示例对应关系:001_Child1→PLC(1).Cnt030_Child2→PLC(30).Cnt109_Child3→PLC(109).Cnt
之前方案的问题
之前尝试的两类方案都存在硬编码逻辑缺陷:
- 基于Left指令做前导零替换:逻辑没有区分「无意义前导零」和「数字有效位的0」,会误删数字中间的有效0,比如
030被错误处理为3、109被错误处理为19 - 固定长度截取删除前两位字符:完全没有适配不同编号的长度差异,会出现
030截取后得到0、109截取后得到9的错位问题
正确实现方案
不要手工做字符串裁剪、零值替换,直接用内置函数按分隔符定位+数值类型自动转换即可,单属性表达式如下:
PLC(VAL(LEFT(THIS.Name, FIND(THIS.Name, "_")-1))).Cnt
执行逻辑说明
FIND(THIS.Name, "_"):定位子元素名称中下划线的位置,自动适配任意长度的数字编号段,不存在固定长度截取的错位问题LEFT(..., 上述返回值-1):截取从名称开头到下划线前的完整数字字符串,001/030/109这类完整数字段会被全部取出,不会丢失任何字符VAL(上述截取的字符串):将数字字符串转为数值类型,转换过程会自动丢弃无意义的前导零,同时完整保留数字中间、末尾的有效0:"001"转成数值1、"030"转成数值30、"109"转成数值109,不会出现误删有效0的问题- 转换后的数值直接作为PLC数组的索引传入,即可完成正确映射
该方案为单一属性配置,不需要额外辅助变量、脚本逻辑,适配任意长度的带前导零数字编号场景,全场景通用。
内容的提问来源于stack exchange,提问作者Maverick
相关产品推荐
相关产品推荐

