每周一个编程小例子:如何优雅的分割字符串
引言
在工业自动化和生产线控制中,PLC(可编程逻辑控制器)被广泛应用来控制和监测机器设备的工作。PLC 程序设计不仅关注控制逻辑的实现,还涉及到如何处理和分割数据,进而做出决策。在这里,我们将介绍一段 PLC 程序——PM_StringSplitter_v3,它的主要功能是将输入的字符串按照指定的分隔符分割成多个子字符串,并输出这些子字符串及其数量。
1 程序功能简介
PM_StringSplitter_v3 实现了将输入字符串分割成多个子字符串,并存储在一个数组中。输入字符串通过一个特定的分隔符(在本例中是 ';')进行分割。此功能块适用于需要处理字符串数据的自动化应用场景,比如生产线上的数据处理、监控和控制。
1.1 程序代码
代码基于 codesys 平台的 TS 语言
FUNCTION_BLOCK PM_StringSplitter_v3 VAR_INPUT InputString: STRING := 'abc;def;ghi;jkl'; KeyChar: STRING[1] := ';'; END_VAR VAR_OUTPUT SplitStrings: ARRAY [1..10] OF STRING; SegmentsNumber : INT; Erro : BOOL; END_VAR VAR CurrentString: STRING; I, J, K: INT; Char: STRING[1]; LastInputString: STRING; END_VAR // 判断输入字符串是否改变 IF InputString = LastInputString THEN // 初始化变量 CurrentString := ''; I := 1; // 遍历输入字符串 FOR K := 1 TO LEN(InputString) DO Char := MID(InputString, 1, K); IF Char = KeyChar THEN // 遇到关键字符时保存当前子字符串并重置 SplitStrings[I] := CurrentString; CurrentString := ''; I := I + 1; ELSE // 否则添加字符到当前子字符串 CurrentString := CONCAT(CurrentString, Char); END_IF END_FOR // 保存最后一个子字符串 IF CurrentString <> '' THEN SplitStrings[I] := CurrentString; END_IF // 没有找到标识符,输出报警 IF InputString = SplitStrings[1] THEN Erro := TRUE; SegmentsNumber := 0; ELSE Erro := FALSE; SegmentsNumber := I; END_IF ELSE // 初始化样本数组 FOR I := 1 TO 10 DO SplitStrings[I] := ''; END_FOR LastInputString := InputString; // 保存当前输入 END_IF;
1.2 输入参数
-
InputString:需要分割的字符串,默认值为 'abc;def;ghi;jkl'。
-
KeyChar:作为分隔符的字符,默认值为 ';'。
1.3 输出参数
-
SplitStrings:一个数组,最多存储 10 个分割后的子字符串。
-
SegmentsNumber:分割后得到的子字符串数量。
-
Erro:一个布尔值,指示程序是否发生错误。
1.4 内部变量
-
CurrentString:用于临时存储当前正在构建的子字符串。
-
I, J, K:循环计数器,用于遍历输入字符串和管理分割过程。
-
Char:当前处理的字符。
-
LastInputString:记录上一次的输入字符串,用于检查输入是否发生变化。
1.5 程序逻辑
程序的核心逻辑是通过循环逐个字符地遍历输入字符串。当遇到分隔符(例如 ';')时,程序会把当前的子字符串保存到 SplitStrings 数组中,然后继续构建下一个子字符串。如果输入字符串没有发生变化,程序会继续执行分割操作,否则会初始化 SplitStrings 数组并重新开始。
具体流程如下:
判断输入字符串是否变化:程序首先检查输入字符串是否发生变化。如果输入字符串没有变化,则继续执行分割操作;否则,初始化所有输出数组并记录新的输入字符串。
遍历输入字符串:程序逐个字符检查输入字符串。遇到分隔符时,保存当前构建的子字符串,并开始构建下一个子字符串;否则,继续将字符添加到当前子字符串中。
保存最后的子字符串:如果字符串遍历结束后仍有内容(即最后一个子字符串没有以分隔符结尾),程序将其保存到数组中。
错误检测:如果分割后得到的第一个子字符串与输入字符串相同(即没有进行任何分割),程序会标记为错误,并将子字符串数量设置为 0。
2 应用场景
PM_StringSplitter_v3 可以应用于多个自动化控制系统中,特别是那些需要处理带有特定分隔符的输入字符串的场景。以下是几个典型的应用案例:
2.1 数据采集与处理
在自动化生产线中,设备可能会通过文本格式传输多个数据项,这些数据项之间通过特定的分隔符(例如 ;)隔开。PM_StringSplitter_v3 可以用来解析这些数据项,并将其分割成多个子项供后续处理使用,例如:
-
读取传感器数据(温度、湿度等),将其按分隔符分割成多个参数;
-
解析生产过程中的日志信息,按分隔符提取每个事件的详细数据。
2.2 配置文件解析
许多工业自动化系统通过配置文件加载参数,配置文件中的参数通常以字符串形式存储,并且各参数之间使用分隔符(如 ;、, 等)进行分割。该程序可以自动解析这些配置文件,提取出各个参数并存储,方便后续使用。
2.3 数据存储与传输
在一些远程监控系统中,数据通过串口或网络传输,并且常常以特定的格式进行编码(如分隔符分割的字符串)。通过使用 PM_StringSplitter_v3,接收端能够准确地解析这些数据,并进行存储或进一步处理。
3 拓展思考
3.1 可扩展性
当前程序设计较为简单,只能处理最多 10 个子字符串的分割,并且假设输入字符串不会超过一定长度。在实际应用中,可能会有更大的数据量或更复杂的字符串格式要求。可以通过以下方式扩展功能:
-
动态数组:通过动态分配数组大小来处理更多的分割字符串。
-
多级分割:对于复杂的数据格式,可能需要多次分割,可以通过递归调用该功能块,或者增加更多分割逻辑进行多级分割。
3.2 错误处理
当前的错误处理仅仅是检查是否有分隔符,并标记为错误。可以通过增强错误处理机制来检查其他异常情况,例如:
-
输入字符串为空;
-
输入字符串格式不规范,分隔符的数量不匹配;
-
特定的字符集错误或非法字符。
3.3 性能优化
虽然本程序在小规模应用中运行良好,但在大型工业应用中,处理大量数据可能会影响性能。因此,进一步优化程序逻辑,减少不必要的循环和字符串操作,能显著提高程序效率。
总结
PM_StringSplitter_v3 是一个自己开发简单而实用的 PLC 功能块,它能够将输入字符串根据特定的分隔符进行分割,并提供分割后的数据以及分割成功与否的标志。这个程序可以广泛应用于数据处理、配置解析和数据传输等场景,对于提升自动化系统的智能化水平和数据处理能力有着重要作用。
通过对该程序的拓展思考,我们可以进一步提高其适应性和可扩展性,使其能够应对更复杂的自动化需求。
你来出题 我来答
欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。
往期回顾
每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比
2025年06月