
STRING(字符串)类型数据在我们的PLC编程应用中,是非常常见的类型。特别在HMI里面,对程序数据的说明、变量的解释、多文本的显示及报警显示等等,都有大量的使用!

这期我们重点介绍STRING(字符串) ,这个 PLC 编程中用于处理文本的数据类型。

字符CHAR和STRING主要的应用在:
除了这些,还有其他的具体应用不一一列举。

文本相关数据类型
主要有以下几种数据类型:

对应的IEC61131-3标准里面的定义:

STRING[20] 而非默认 254)。STRING[1] 或 BYTE 替代。

0(NULL 终止符) 为止(某些编程语言在索引 0 存储字符串长度,需注意跨设备通信兼容性)。
STRING[255] 分段处理)。字符串定义的示例如下:

内存占用说明:
szDemo):占用 254 字节 + 1 字节终止符。szDemoFix):占用 35 字节 + 1 字节终止符。
特殊字符与转义序列
除了上述常规的字符以外,还有显示:‘,“,$等等特殊的字符,在PLC中如何处理呢?
那就需要用到转义字符或序列来处理了,如下表所示:


多文本语言的示例:

$N,需使用 \n。" 会导致解析错误)。STRING[1] := 34; 表示 ")。
有关STRING的标准函数
在字符串需要进行拼接、删除某个字符、或者查找某个字符等等功能时,那就需要用到有关STRING字符串的相关函数了。
我们下表总结以下函数:
函数名称 | 语法示例 | 功能说明 | 注意事项 |
|---|---|---|---|
CONCAT | CONCAT(str1, str2) | 连接两个字符串,返回 str1 + str2。 | 结果长度不能超过目标变量的定义长度(如 STRING[50])。 |
DELETE | DELETE(str, pos, len) | 从字符串 str 的 pos 位置开始删除 len 个字符。 | - pos 从 1 开始计数。- 若 pos + len 超出长度,删除到字符串末尾。 |
FIND | FIND(strMain, strSub) | 返回子串 strSub 在 strMain 中的起始位置(未找到返回 0)。 | 区分大小写(如 'A' ≠ 'a')。 |
INSERT | INSERT(str1, str2, pos) | 在 str1 的 pos 位置插入 str2。 | - pos 超出范围时可能追加到末尾或忽略。- 总长度需合法。 |
LEFT | LEFT(str, len) | 返回字符串左侧的 len 个字符。 | 若 len 超过字符串长度,返回完整字符串。 |
LEN | LEN(str) | 返回字符串的实际长度(不包含终止符 \0)。 | 空字符串('')返回 0。 |
MID | MID(str, pos, len) | 从 str 的 pos 位置开始提取 len 个字符。 | - pos 从 1 开始计数。- 若 pos 或 len 超限,返回有效部分或空字符串。 |
REPLACE | REPLACE(str, pos, len, strNew) | 将 str 中从 pos 开始的 len 个字符替换为 strNew。 | 替换后总长度不能超过目标变量定义。 |
RIGHT | RIGHT(str, len) | 返回字符串右侧的 len 个字符。 | 同 LEFT 函数逻辑。 |
当然,需要注意的时STRING可以看作是特殊的一个数组类型,例如插入一个字符可以用下方这种方式:

最后结果:

另外,在做数据转换时,要考虑我们在第8章介绍的内容:

特别是在STRING类型转换成INT、REAL等数据类型的时候,需要确定STRING是否是数值类型的,例如’12A3‘,这种转换就会出错了:

推荐使用IsNumber函数进行判断后,再来进行转换!
FUNCTION IsNumber : BOOL
VAR_INPUT
str : STRING;
END_VAR
VAR
i : INT;
ch : CHAR;
END_VAR
IsNumber := TRUE;
FOR i := 1 TO LEN(str) DO
ch := MID(str, i, 1);
IF NOT (ch >= '0' AND ch <= '9' OR ch = '.' OR ch = '-') THEN
IsNumber := FALSE;
EXIT;
END_IF;
END_FOR;
END_FUNCTION最后,关于WSTRING的说明,我们实际应用主要是让它显示成中文字符,所以用这类变量就很方便!

针对WSTRING类型的函数,例如WCONCAT、WLEN并不是所有的PLC支持,所以应用时要查看对应的手册!
具体的示例我们这里不做介绍,大家有兴趣的可以直接查阅原书第11章节的11.3-11.5节。