В структурированном тексте: можно ли записать многомерный массив одной строкой в ​​циклическом коде?

Следующее работает нормально:

PROGRAM PLC_PRG:
    VAR
        MyArray : ARRAY[0..1,0..5]OF USINT := [1,2,3,4,5,6,7,8,9,10,11,12];
        i : INT;
        j : INT;
    END_VAR

    // change to random values
    FOR i:=0 TO 1 DO
        FOR j:=0 TO 5 DO
            MyArray[i,j] := i+j;
        END_FOR
    END_FOR

    // Or individualy set numbers
    MyArray[0,1] := 56;
    MyArray[0,4] := 156;
END_PROGRAM

Но что, если я хочу изменить все значения в одной строке кода?

то есть ниже приведен псевдокод того, что я хотел бы сделать. (Обратите внимание, на самом деле это не работает)

PROGRAM PLC_PRG:
    VAR
        MyArray : ARRAY[0..1,0..5]OF USINT := [1,2,3,4,5,6,7,8,9,10,11,12];
        bChange : BOOL;
    END_VAR

    IF bChange THEN
        MyArray := [1,58,3,53,5,6,128,8,9,10,20,12];
    END_IF
END_PROGRAM

person tomatoeshift    schedule 08.04.2020    source источник


Ответы (2)


Вам нужно запрограммировать функцию, чтобы упростить назначение значений массива.

Объявление функции:

FUNCTION F_SetArrayValues : ARRAY[0..1,0..5]OF USINT
VAR_INPUT
     v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12 : USINT;    
END_VAR

Реализация функции:

F_SetArrayValues[0,0] := v1;
F_SetArrayValues[0,1] := v2;
F_SetArrayValues[0,2] := v3;
F_SetArrayValues[0,3] := v4;
F_SetArrayValues[0,4] := v5;
F_SetArrayValues[0,5] := v6;
F_SetArrayValues[1,0] := v7;
F_SetArrayValues[1,1] := v8;
F_SetArrayValues[1,2] := v9;
F_SetArrayValues[1,3] := v10;
F_SetArrayValues[1,4] := v11;
F_SetArrayValues[1,5] := v12;

Вы вызываете функцию следующим образом:

IF bChange THEN
    MyArray := F_SetArrayValues(2,3,4,5,6,7,8,9,10,11,12,13);
END_IF
person Filippo Boido    schedule 08.04.2020
comment
Хорошо, я надеялся, что есть более простой способ. Я думал, что у меня есть синтаксическая ошибка в приведенном мной примере. К счастью, мне не нужно столько раз переписывать массив в коде, поэтому я думаю, что не буду реализовывать для него собственную функцию. - person tomatoeshift; 08.04.2020

Только во время инициализации.

PROGRAM PLC_PRG:
    VAR
        MyArray : ARRAY[0..1,0..5]OF USINT := [
            [1,2,3,4,5,6],
            [1,2,3,4,5,6]
        ];
    END_VAR
END_PROGRAM

Это не разрешено

IF bChange THEN
    (* еhis will fial *)
    MyArray := [
            [1,2,3,4,5,6],
            [1,2,3,4,5,6]
        ];
END_IF
person Sergey Romanov    schedule 09.04.2020
comment
Я заметил, что это запрещено. Я надеялся, что для этого есть простое решение, но похоже, что а) создайте для него функцию, как в другом ответе, или б) индивидуально установите все нужные элементы. - person tomatoeshift; 09.04.2020
comment
К вашему сведению, ваш синтаксис MyArray : ARRAY[0..1,0..5]OF USINT := [[1,2,3,4,5,6],[1,2,3,4,5,6]]; выдаст ошибку в моей среде IDE. Я использую AutomatioStudio от B&R, поэтому единственный правильный синтаксис в соответствии с его компилятором - MyArray : ARRAY[0..1,0..5]OF USINT := [1,2,3,4,5,6,7,8,9,10,11,12]; - person tomatoeshift; 09.04.2020
comment
Правильно, реализация ST отличается от IDE к IDE. Я ссылался на CoDeSys 3.5. Вы использовали мое расширение VS Code для кода ST? Люди говорят, что это хорошо для B&R. - person Sergey Romanov; 10.04.2020
comment
Да, это мое расширение. Некоторые люди, которые работают с B&R, в обзоре говорят, что это расширение хорошо подходит для этого. Вы можете попробовать открыть свой проект дома с помощью VS Code IDE и посмотреть, как он выглядит. - person Sergey Romanov; 12.04.2020
comment
Я кратко попробовал ваше расширение. цветовые коды выглядят красиво. Одним из преимуществ студии автоматизации B&R является то, что я могу щелкнуть правой кнопкой мыши любую переменную/тип/функцию/действие и выбрать просмотр ее определения и типа. т.е. затем IDE переходит в это место. Я знаю, что то же самое возможно с кодом VS, расширением Arduino, так что, возможно, это какая-то дополнительная реализация, которую вы могли бы включить в свое расширение. - person tomatoeshift; 12.04.2020
comment
Да, планируется. Он называется LSP (Language Service Protocol). Я планирую создать полноценную ST IDE, так как я также разрабатываю программный ПЛК на базе Linux (Runtime). В конечном итоге пользователь сможет написать код ST с моим расширением и скомпилировать его для работы на машине Linux или ПЛК. - person Sergey Romanov; 14.04.2020
comment
Звучит интересно! Но и много работы нужно было проделать :) . Удачи вам. - person tomatoeshift; 14.04.2020