Сравнение 2 массивов символов и поиск соответствия на S7 1500 (PLC) - PullRequest
0 голосов
/ 24 января 2019

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

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

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

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

Для ref:

#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_)

1 Ответ

0 голосов
/ 27 января 2019

Вы можете написать свою собственную функцию 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', ';');
...