处理超过 255 个字符的字符串


所有函数也包含在标准库中。但是,由于历史限制,这些仅限于少于 255 个字符的字符串。

二十年前,在控制系统上使用更长的字符串简直是不可想象的。

为了保持向后兼容性,必须为这些应用程序创建一个单独的 StringUtilities 库。

  • 创建标准项目并选择 CODESYS Control Win V3 作为设备。
  • 通过网络扫描连接目标系统。

图1

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

图2

  • 修改 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 行设置断点。然后单步执行单个函数示例。

图3