Сравнение 2 массивов символов и поиск соответствия на S7 1500 (PLC)

В настоящее время я работаю над небольшим упражнением по кодированию на S7 1500 с использованием ST (SCL), где 2 массива, A (более крупный по длине) и B сравниваются друг с другом и проверяются на соответствие элементов.

Однако массив B состоит из буквенно-цифровых символов и специальных символов (точка с запятой), например: «12345; 12346B; 12347A» и т. д., в отличие от массива A, в котором нет точки с запятой. Я хочу реализовать функциональность Split, где Delimiter или EndSeparator равен ';' чтобы разделить группу чисел и сравнить разделенные числа с элементами массива A, чтобы проверить, присутствует ли 12345 в массиве A.

Я использовал LOWER_BOUND и UPPER_BOUND для ограничений массива, поскольку диапазон массива A не определен.

Как мне это сделать? Любые указатели будут действительно оценены. :)

Для ссылки:

#LowerBound := LOWER_BOUND(ARR := #ARRAY_B, DIM := 1);
#UpperBound := UPPER_BOUND(ARR := #ARRAY_B, DIM := 1);

SPLIT(Mode:= _dword_in_, RecSeparator:=_variant_in_, EndSeparator:=_variant_in_, SrcArray:=_variant_in_, Count=>_udint_out_, DstStruct:=_variant_inout_, Position:=_udint_inout_)

person Arjun    schedule 24.01.2019    source источник


Ответы (1)


Вы можете написать свою собственную функцию SPLIT.

FUNCTION SPLIT : ARRAY[0..255] OF STRING(250)
VAR_INPUT
    STR: STRING(250);
    CHAR: STRING(1);
END_VAR
VAR
    iPos: INT;
    sTest: STRING(250);
    iIndex: INT;
    xFinish: BOOL;
END_VAR

    sTest := STR;
    REPEAT
        iPos := FIND(sTest, CHAR);

        IF iPos = 0 THEN
            SPLIT[iIndex] := sTest;
            xFinish := TRUE;
        ELSE
            SPLIT[iIndex] := LEFT(sTest, iPos - 1);
            sTest := RIGHT(sTest, LEN(sTest) - iPos);
        END_IF;
        iIndex := iIndex + 1;
    UNTIL (xFinish = TRUE)
    END_REPEAT;

END_FUNCTION

А потом в коде

VAR
    arsTest: ARRAY[0..255] OF STRING(250);
END_VAR

arsTest := SPLIT('12345;12346B;12347A', ';');
person Sergey Romanov    schedule 27.01.2019