处理超过 255 个字符的字符串
所有函数也包含在标准库中。但是,由于历史限制,这些仅限于少于 255 个字符的字符串。
二十年前,在控制系统上使用更长的字符串简直是不可想象的。
为了保持向后兼容性,必须为这些应用程序创建一个单独的 StringUtilities 库。
- 创建标准项目并选择 CODESYS Control Win V3 作为设备。
- 通过网络扫描连接目标系统。

- 打开库管理器并添加 StringUtils 库。

- 修改 PLC_PRG 如下:
声明
VAR
sTo : STRING(300) := 'Hello ';
psTo : POINTER TO BYTE := ADR(sTo);
sFrom : STRING(7) := 'World';
psFrom : POINTER TO BYTE := ADR(sFrom);
xResult : BOOL;
xConcat : BOOL;
diLen : DINT;
diCopied : DINT;
sCopied : STRING(300);
iFind : INT;
sMid : STRING;
uiMid : UINT;
sUpperText : STRING := 'This Text will be converted';
pstUpper : POINTER TO BYTE := ADR(sUpperText);
xUpper : BOOL;
xLower : BOOL;
sCmp1 : STRING := 'Hello';
sCmp2 : STRING := 'HEllo';
xCaseCmp : BOOL;
xCaseCmpEnd : BOOL;
xCaseCmpStart : BOOL;
iResult : INT;
xCmpEnd : BOOL;
xCmpStart : BOOL;
sDelete : STRING := '2 characters will delete';
xDelete : BOOL;
sTrim : STRING;
xTrim : BOOL;
xTrimEnd : BOOL;
xTrimStart : BOOL;
sOldReplace : STRING(50) := 'Hello World';
sReplace : STRING := ', good morning CODESYS-';
xReplace : BOOL;
END_VAR
实现
diLen := STu.StrLenA(pstData := psTo);
IF xConcat THEN
xConcat := FALSE;
IF NOT Stu.StrIsNullOrEmptyA(pstData := psFrom) THEN
// Create an string with more than 255 characters
//Concat-Function
WHILE Stu.StrConcatA(pstFrom := psFrom,pstTo := psTo, SIZEOF(sTo) - 8) DO
// Dummy line
END_WHILE
// Copy the whole string
diCopied := Stu.StrCpyA(pBuffer := ADR(sCopied), SIZEOF(sCopied), pStr := psTo);
sFrom := 'CODESYS';
Stu.StrConcatA(pstFrom := psFrom,pstTo := psTo, SIZEOF(sTo));
// Find position of the first substring
iFind := Stu.StrFindA(pst1 := psTo, pst2 := psFrom, uiSearchStart := 1);
// Copy just a part of the string
Stu.StrMidA(pst := psTo, uiInputBufferSize := SIZEOF(sTo), iLength := 5, iPosition := iFind , pstResult := ADR(sMid), uiResultBufferSize := uiMid);
END_IF
END_IF
If xUpper Then
xUpper := False;
Stu.StrToUpperA(pString := pstUpper);
END_IF
IF xLower THEN
xLower := FALSE;
Stu.StrToLowerA(pString := pstUpper);
END_IF
IF xCaseCmp THEN
xCaseCmp := FALSE;
// caseinsensitive comparison !!
iResult := Stu.StrCaseCmpA(pByte1 := ADR(sCmp1), pByte2 := ADR(sCmp2));
END_IF
IF xCaseCmpEnd THEN
xCaseCmpEnd := FALSE;
// sCmp1 := 'Hello'; sCmp2 := 'llO';
//=> Retdurns "0" = for equal
iResult := Stu.StrCaseCmpEndA(pString := ADR(sCmp1), pSuffix := ADR(sCmp2));
END_IF
IF xCaseCmpStart THEN
xCaseCmpStart := FALSE;
// sCmp1 := 'Hello'; sCmp2 := 'HELL';
//=> Retdurns "0" = for equal
iResult := Stu.StrCaseCmpStartA(pString := ADR(sCmp1), pPrefix := ADR(sCmp2));
END_IF
IF xCmpEnd THEN
xCmpEnd := FALSE;
// sCmp1 := 'Hello'; sCmp2 := 'llO';
//=> Retdurns "-1" = for not equal
iResult := Stu.StrCmpEndA(pString := ADR(sCmp1), pSuffix := ADR(sCmp2));
END_IF
IF xCmpStart THEN
xCmpStart := FALSE;
// sCmp1 := 'Hello'; sCmp2 := 'HELL';
//=> Retdurns "-1" = for not equal
iResult := Stu.StrCmpStartA(pString := ADR(sCmp1), pPrefix := ADR(sCmp2));
END_IF
IF xDelete THEN
xDelete := FALSE;
Stu.StrDeleteA(pby := ADR(sDelete), iLength := 2, iPosition := 4);
END_IF
IF xTrim THEN
xTrim := FALSE;
sTrim := ' The spaces will removed ';
Stu.StrTrimA(pString := ADR(sTrim)); // Space character on the left and the right side will removed
END_IF
IF xTrimEnd THEN
xTrimEnd := FALSE;
sTrim := ' The spaces will removed ';
Stu.StrTrimEndA(pString := ADR(sTrim)); // Only the space character on the right side will removed
END_IF
IF xTrimStart THEN
xTrimStart := FALSE;
sTrim := ' The spaces will removed ';
Stu.StrTrimStartA(pString := ADR(sTrim)); // Only the space character on the left side will removed
END_IF
IF xReplace THEN
xReplace := FALSE;
Stu.StrReplaceA(
pstInput:= ADR(sOldReplace),
uiInputBufferSize:= SIZEOF(sOldReplace),
pstReplaceWith:= ADR(sReplace),
iLengthInput:= DINT_TO_INT(Stu.StrLenA(ADR(sOldReplace))),
iLengthToReplace:= 1, // 1 = only the space character will replaced; 2 = " W" will replaced
iLengthToReplaceWith:= DINT_TO_INT(Stu.StrLenA(ADR(sReplace))),
iPosition:= 6);
END_IF
- 启动项目,例如,在 PLC_PRG 的第 11 行设置断点。然后单步执行单个函数示例。
