Просмотр полной версии : SPK-ПРИСВОЕНИЕ значений элементам двумерного массива
пробовал заполнять многомерный массив- дает шибку
делаю все по Help
пришлите наипростейший проверенный пример присвоения первому элементу многомерного массива какого-либо значения
Codesys3.5V5
Евгений Кислов
27.04.2015, 11:09
пробовал заполнять многомерный массив- дает шибку
делаю все по Help
пришлите наипростейший проверенный пример присвоения первому элементу многомерного массива какого-либо значения
Codesys3.5V5
17923
Если речь о вложенных массивах, то:
17925
17923
Если речь о вложенных массивах, то:
17925
меня интересует на языке ST в тексте программы как все будет выглядеть а вы мне втюхиваете объявление массива
Евгений Кислов
27.04.2015, 12:18
Там на скриншотах как раз на языке ST, в самом низу. Или я чего-то недопонял в вопросе?
попробовал- у меня тоже так получается
а что означает arr[0,3]????
///////////////////////////////////////////////////////////////////
если надо массив 3 на 120 (три столбца по120элементов), то как объявлять и как обращаться к третьей строке и второму элементу в строке?
Евгений Кислов
27.04.2015, 12:51
попробовал- у меня тоже так получается
а что означает arr[0,3]????
Если речь о Arr[0][3], то это означает: третий элемент для массива, а этот массив в свою очередь является нулевым элементом массива Arr.
не очень понятно
а что означает arr[1..10,1..10]?????это как выглядит?
Евгений Кислов
27.04.2015, 13:08
Постараюсь попонятнее.
Итак, как я понимаю, вам по сути нужна таблица - 3 столбца, 120 строк. Предположим, в ней будут логические переменные.
Объявим массив таким образом: Arr: ARRAY [1..3] OF ARRAY [1..120] OF BOOL;
Мы создали массив из трех элементов ("столбцов"), причем каждый из этих трех элементов является массивом, содержащим 120 логических переменных ("строк").
Теперь мы хотим присвоить значение TRUE элементу на пересечении второго столбца и третьей строки.
В коде программы пишем:
arr[2][3]:=TRUE;
При запуске программы видим:
17929
Надеюсь, в этот раз объяснил понятнее.
of real у меня должно быть
спасибо, попробую
Евгений Кислов
27.04.2015, 13:29
Еще на всякий случай поясню: описанный способ нужен именно для многомерных массивов (я ответил в этом контексте из-за содержания первого поста темы). "Много" в данном случае означает "более трех".
Т.к. в данном случае речь идет о двухмерном массиве, то есть еще один вариант, наверное, более простой, о котором вы вскользь упомянули:
а что означает arr[1..10,1..10]?????это как выглядит?
В вашем случае это выглядит так:
Объявляем массив: Arr2: ARRAY [1..3, 1..120] OF BOOL;
Обращаемся к 2 элементу 3 строки: Arr2[2,3]:=TRUE;
Но нужно понимать, что такой способ ограничивается одно-, двух- и трехмерными массивами - если число измерений превышает три, то речь уже идет именно многомерных массивах и нужно использовать методику из моего предыдущего поста.
[QUOTE=Евгений Кислов;169265]Еще на всякий случай поясню: описанный способ нужен именно для многомерных массивов (я ответил в этом контексте из-за содержания первого поста темы). "Много" в данном случае означает "более трех".
Т.к. в данном случае речь идет о двухмерном массиве, то есть еще один вариант, наверное, более простой, о котором вы вскользь упомянули:
В вашем случае это выглядит так:
Объявляем массив: Arr2: ARRAY [1..3, 1..120] OF BOOL;
Обращаемся к 2 элементу 3 строки: Arr2[2,3]:=TRUE;
Но нужно понимать, что такой способ ограничивается одно-, двух- и трехмерными массивами - если число измерений превышает три, то речь уже идет именно многомерных массивах и нужно использовать методику из моего предыдущего поста.[/QUOTE
сейчас понадобилось объявить VisuStruct3DTrack- как это сделать наипростейшим способом и как в эту структуру "загрузить " какое-нибудь число???
сейчас понадобилось объявить visuStruct3DTrack- как это сделать и как присвоить хоть какое то значение??
Евгений Кислов
06.05.2015, 09:00
Возможно, вам поможет пример от компании 3S:
Возможно, вам поможет пример от компании 3S:
пример дает 1005 ошибок
может можно что -нибудь без ошибок и попроще?
будем, конечно пытаться разобраться и с этим примером
Евгений Кислов
06.05.2015, 09:40
Открываю в CODESYS V3.5 SP6 с архивом репозитория V3.5 SP4 - ошибок нет. Таргет от виртуального контроллера.
Открываю в CODESYS V3.5 SP6 с архивом репозитория V3.5 SP4 - ошибок нет. Таргет от виртуального контроллера.
у меня он странно скачивается- нельзя открыть папку, его содержащую, но запускакется с 64 ошибками из списка Download!!!
у меня он странно скачивается- нельзя открыть папку, его содержащую, но запускакется с 64 ошибками из списка Download!!!
почему так странно получается: при создании нового проекта можно выбрать или СПК110 или SoftMotion???
Евгений Кислов
07.05.2015, 15:01
почему так странно получается: при создании нового проекта можно выбрать или СПК110 или SoftMotion???
Потому что то, что вы называете SoftMotion - это виртуальный (запускаемый на ПК) контроллер с поддержкой технологии SoftMotion.
СПК технологию SoftMotion не поддерживают.
Потому что то, что вы называете SoftMotion - это виртуальный (запускаемый на ПК) контроллер с поддержкой технологии SoftMotion.
СПК технологию SoftMotion не поддерживают.
НО элемент Путь 3D активный-т.е. он может работать в СПК, мне к нему надо подключить массив Данных для построения графика
Хоть бы одна живая душа подсказала, как это делается!!
компилятор заявляет, что данные должны быть в этом случае типа visuStruct3DTrack-как мой массив преобразовать к этому типу - хоть бы кто подсказал!
и еще: Таргет от виртуального контроллера- это как сделать для запуска примера, который Вы прислали?!
И еще : при попытке загрузки Вашего примера CODESYS пишет, что не удалось загрузить несколько библиотек
у меня CODESYS 3.5 v5
sssssaaaaabbbbb
22.05.2024, 12:11
Здравствуйте коллеги, подскажите в чем разница этих массивов? 75934
Sergey666
22.05.2024, 12:29
Первый массив одномерный, состоит из массивов BOOL[1..3], второй обычный двумерный массив, см. школьный учебник алгебры.
sssssaaaaabbbbb
22.05.2024, 13:05
Первый массив одномерный, состоит из массивов BOOL[1..3], второй обычный двумерный массив, см. школьный учебник алгебры.
одномерный массив можно просто задать(a1: ARRAY [11..16] OF BOOL), но тем не менее, кодесис как то это принимает (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) в чем разница?
МихаилГл
22.05.2024, 13:16
одномерный массив можно просто задать(a1: ARRAY [11..16] OF BOOL), но тем не менее, кодесис как то это принимает (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) в чем разница?
А как при этом считывать данные в 2х вариантах?
s[1, 2] = xxx
а в случае ARRAY OF ARRAY так пройдет? Сам не пробовал, но раз вы уже занялись этим...
sssssaaaaabbbbb
22.05.2024, 14:05
А как при этом считывать данные в 2х вариантах?
s[1, 2] = xxx
а в случае ARRAY OF ARRAY так пройдет? Сам не пробовал, но раз вы уже занялись этим...
как двойной массив обьявлять понятно, но вот эта запись непонятна (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) и как с ней работать непонятно. Просто любопытство.
Евгений Кислов
22.05.2024, 15:49
как двойной массив обьявлять понятно, но вот эта запись непонятна (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) и как с ней работать непонятно. Просто любопытство.
1.
Объявления
a1: ARRAY [0..1, 0..2] OF INT;
и
a2: ARRAY [0..1] OF ARRAY [0..2] OF INT;
эквивалентны.
Разница лишь в отображении элементов массива в окне просмотра при онлайн-подключении к контроллеру - в первом случае плоским списком, во втором - структурированно.
75945
2.
Для обращения к элементу массива при втором варианте объявления используется следующий синтаксис (пример):
a2[0][1] := 123;
Sergey666
22.05.2024, 16:15
одномерный массив можно просто задать(a1: ARRAY [11..16] OF BOOL), но тем не менее, кодесис как то это принимает (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) в чем разница?
Массив массивов...Можете начинать петь и танцевать, вы написали индусский код и не понимаете что вы написали? А зачем?
sssssaaaaabbbbb
22.05.2024, 16:37
Массив массивов...Можете начинать петь и танцевать, вы написали индусский код и не понимаете что вы написали? А зачем?
Ну и что. что индусский, работает, а теперь и понятен стал. Спасибо Евгению.
Mikhail_NNT
19.02.2025, 12:53
Добрый день, помогите разобраться в причинах ошибок компилятора.
При вызове ФБ присваиваю внутренние переменные (элементы одномерного массива) переменным, объявленным в Главной программе (элементы многомерного массива). Пробовал Очистить все и заново Генерировать код, но компилятор все равно ругается.
82029
Код ФБ:
FUNCTION_BLOCK Downtime_Chassis_line
VAR_INPUT
xRedButton: BOOL; //Красная кнопка "Авария"
END_VAR
VAR_OUTPUT
arDownTimeS1: ARRAY [1..TargetVars.iQuantityHoursPerShift] OF WORD; //Массив времени простоев I смена
arDownTimeS2: ARRAY [1..TargetVars.iQuantityHoursPerShift] OF WORD; //Массив времени простоев II смена
wTotalDownTimeS1: WORD; //Всего простоев за I смену
wTotalDownTimeS2: WORD; //Всего простоев за II смену
arCountDownTimeS1: ARRAY [1..TargetVars.iQuantityHoursPerShift] OF WORD; //Массив количества простоев I смена
arCountDownTimeS2: ARRAY [1..TargetVars.iQuantityHoursPerShift] OF WORD; //Массив количества простоев II смена
END_VAR
VAR
tofDowntime: TimerTOF_Chassis_line; //Таймер времени простоя
tDowntime: TIME; //Время работы таймера простоя в милллисекундах
dwDowntime: DWORD;
wDowntime: WORD;
rtClickButton: R_TRIG; //Передний фронт красной кнопки "Авария"
ftClickButton: F_TRIG; //Задний фронт красной кнопки "Авария"
i: INT; //Итератор цикла
END_VAR
//Присвоение значения селекторам количества часов в I и II сменах
IF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sStartShift1 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH1_H2Shift1)
THEN TargetVars.iHourShift1:=1; //1-ый час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH1_H2Shift1 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sStartBreak11)
THEN TargetVars.iHourShift1:=2; //2-ой час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sEndBreak11 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH3_H4Shift1)
THEN TargetVars.iHourShift1:=3; //3-ий час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH3_H4Shift1 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sStartLunch1)
THEN TargetVars.iHourShift1:=4; //4-ый час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sEndLunch1 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH5_H6Shift1)
THEN TargetVars.iHourShift1:=5; //5-ый час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH5_H6Shift1 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sStartBreak12)
THEN TargetVars.iHourShift1:=6; //6-ой час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sEndBreak12 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH7_H8Shift1)
THEN TargetVars.iHourShift1:=7; //7-ой час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH7_H8Shift1 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sEndShift1)
THEN TargetVars.iHourShift1:=8; //8-ой час
ELSE TargetVars.iHourShift1:=0; //Сброс селектора количества часов в I смене
END_IF
IF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sStartShift2 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH1_H2Shift2)
THEN TargetVars.iHourShift2:=1; //1-ый час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH1_H2Shift2 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sStartBreak21)
THEN TargetVars.iHourShift2:=2; //2-ой час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sEndBreak21 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH3_H4Shift2)
THEN TargetVars.iHourShift2:=3; //3-ий час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH3_H4Shift2 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sStartLunch2)
THEN TargetVars.iHourShift2:=4; //4-ый час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sEndLunch2 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH5_H6Shift2)
THEN TargetVars.iHourShift2:=5; //5-ый час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH5_H6Shift2 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sStartBreak22)
THEN TargetVars.iHourShift2:=6; //6-ой час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sEndBreak22 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sH7_H8Shift2)
THEN TargetVars.iHourShift2:=7; //7-ой час
ELSIF (TargetVars.stRTC.sGetFormatTime>=TargetVars.sH7_H8Shift2 AND TargetVars.stRTC.sGetFormatTime<TargetVars.sEndShift2)
THEN TargetVars.iHourShift2:=8; //8-ой час
ELSE TargetVars.iHourShift2:=0; //Сброс селектора количества часов в II смене
END_IF
//Сброс данных о простоях I и II смены
IF TargetVars.stRTC.sGetFormatTime=TargetVars.sDataRe set
THEN FOR i:=1 TO TargetVars.iQuantityHoursPerShift DO
arDownTimeS1[i]:=0;
arDownTimeS2[i]:=0;
arCountDownTimeS1[i]:=0;
arCountDownTimeS2[i]:=0;
END_FOR
wTotalDownTimeS1:=0;
wTotalDownTimeS2:=0;
END_IF
rtClickButton (CLK:=xRedButton);
ftClickButton (CLK:=xRedButton);
//Включение/отключение Таймера времени простоя
tofDowntime (PT:=T#28800S); // Таймер на 8 часов
tofDowntime.IN:=rtClickButton.Q;
tofDowntime.Reset:=ftClickButton.Q;
IF ((TargetVars.stRTC.sGetFormatTime=TargetVars.sStar tLunch1 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartL unch2
OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartB reak11 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartB reak12
OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartB reak21 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartB reak22) AND tofDowntime.Q)
THEN tofDowntime.Pause:= TRUE;
END_IF
IF ((TargetVars.stRTC.sGetFormatTime=TargetVars.sEndL unch1 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndLun ch2
OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBre ak11 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBre ak12
OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBre ak21 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBre ak22) AND tofDowntime.Q)
THEN tofDowntime.Pause:= FALSE;
END_IF
IF ftClickButton.Q
THEN tDowntime:=tofDowntime.ET;
dwDowntime:=TO_DWORD (tDowntime);
dwDowntime:=dwDowntime/1000; //Перевод миллисекунд в секунды
CASE TargetVars.iHourShift1 OF
1:
arDownTimeS1[1]:=arDownTimeS1[1]+TO_WORD (dwDowntime);
arCountDownTimeS1[1]:=arCountDownTimeS1[1]+1;
2:
arDownTimeS1[2]:=arDownTimeS1[2]+TO_WORD (dwDowntime);
arCountDownTimeS1[2]:=arCountDownTimeS1[2]+1;
3:
arDownTimeS1[3]:=arDownTimeS1[3]+TO_WORD (dwDowntime);
arCountDownTimeS1[3]:=arCountDownTimeS1[3]+1;
4:
arDownTimeS1[4]:=arDownTimeS1[4]+TO_WORD (dwDowntime);
arCountDownTimeS1[4]:=arCountDownTimeS1[4]+1;
5:
arDownTimeS1[5]:=arDownTimeS1[5]+TO_WORD (dwDowntime);
arCountDownTimeS1[5]:=arCountDownTimeS1[5]+1;
6:
arDownTimeS1[6]:=arDownTimeS1[6]+TO_WORD (dwDowntime);
arCountDownTimeS1[6]:=arCountDownTimeS1[6]+1;
7:
arDownTimeS1[7]:=arDownTimeS1[7]+TO_WORD (dwDowntime);
arCountDownTimeS1[7]:=arCountDownTimeS1[7]+1;
8:
arDownTimeS1[8]:=arDownTimeS1[8]+TO_WORD (dwDowntime);
arCountDownTimeS1[8]:=arCountDownTimeS1[8]+1;
END_CASE
CASE TargetVars.iHourShift2 OF
1:
arDownTimeS2[1]:=arDownTimeS2[1]+TO_WORD (dwDowntime);
arCountDownTimeS2[1]:=arCountDownTimeS2[1]+1;
2:
arDownTimeS2[2]:=arDownTimeS2[2]+TO_WORD (dwDowntime);
arCountDownTimeS2[2]:=arCountDownTimeS2[2]+1;
3:
arDownTimeS2[3]:=arDownTimeS2[3]+TO_WORD (dwDowntime);
arCountDownTimeS2[3]:=arCountDownTimeS2[3]+1;
4:
arDownTimeS2[4]:=arDownTimeS2[4]+TO_WORD (dwDowntime);
arCountDownTimeS2[4]:=arCountDownTimeS2[4]+1;
5:
arDownTimeS2[5]:=arDownTimeS2[5]+TO_WORD (dwDowntime);
arCountDownTimeS2[5]:=arCountDownTimeS2[5]+1;
6:
arDownTimeS2[6]:=arDownTimeS2[6]+TO_WORD (dwDowntime);
arCountDownTimeS2[6]:=arCountDownTimeS2[6]+1;
7:
arDownTimeS2[7]:=arDownTimeS2[7]+TO_WORD (dwDowntime);
arCountDownTimeS2[7]:=arCountDownTimeS2[7]+1;
8:
arDownTimeS2[8]:=arDownTimeS2[8]+TO_WORD (dwDowntime);
arCountDownTimeS2[8]:=arCountDownTimeS2[8]+1;
END_CASE
END_IF
wTotalDownTimeS1:=arDownTimeS1[1]+arDownTimeS1[2]+arDownTimeS1[3]+arDownTimeS1[4]+arDownTimeS1[5]+arDownTimeS1[6]+arDownTimeS1[7]+arDownTimeS1[8];
wTotalDownTimeS2:=arDownTimeS2[1]+arDownTimeS2[2]+arDownTimeS2[3]+arDownTimeS2[4]+arDownTimeS2[5]+arDownTimeS2[6]+arDownTimeS2[7]+arDownTimeS2[8];
Вызов ФБ:
fbDowntime_Chassis_line: ARRAY [1..TargetVars.iQuantityStation_ChassisLine] OF Downtime_Chassis_line; //ФБ Время простоя Линии сборки шасси
arrDowntime_Shift1: ARRAY [1..9] OF ARRAY [1..20] OF WORD; //Многомерный массив простоев I смена Линия сборки шасси
arrDowntime_Shift2: ARRAY [1..9] OF ARRAY [1..20] OF WORD; //Многомерный массив простоев II смена Линия сборки шасси
arRedButtonStation: ARRAY [1..TargetVars.iQuantityStation_ChassisLine] OF BOOL; //Массив красных кнопок "Авария" Станции №1...20
//Вызов ФБ Время простоя Линии сборки шасси
FOR i:=1 TO TargetVars.iQuantityStation_ChassisLine DO
fbDowntime_Chassis_line [i]
(xRedButton:=arRedButtonStation[i],
arDownTimeS1[1]=>arrDowntime_Shift1[1][i],
arDownTimeS1[2]=>arrDowntime_Shift1[2][i],
arDownTimeS1[3]=>arrDowntime_Shift1[3][i],
arDownTimeS1[4]=>arrDowntime_Shift1[4][i],
arDownTimeS1[5]=>arrDowntime_Shift1[5][i],
arDownTimeS1[6]=>arrDowntime_Shift1[6][i],
arDownTimeS1[7]=>arrDowntime_Shift1[7][i],
arDownTimeS1[8]=>arrDowntime_Shift1[8][i],
wTotalDownTimeS1=>arrDowntime_Shift1[9][i],
arDownTimeS2[1]=>arrDowntime_Shift2[1][i],
arDownTimeS2[2]=>arrDowntime_Shift2[2][i],
arDownTimeS2[3]=>arrDowntime_Shift2[3][i],
arDownTimeS2[4]=>arrDowntime_Shift2[4][i],
arDownTimeS2[5]=>arrDowntime_Shift2[5][i],
arDownTimeS2[6]=>arrDowntime_Shift2[6][i],
arDownTimeS2[7]=>arrDowntime_Shift2[7][i],
arDownTimeS2[8]=>arrDowntime_Shift2[8][i],
wTotalDownTimeS2=>arrDowntime_Shift2[9][i]);
END_FOR
Евгений Кислов
19.02.2025, 13:08
Добрый день.
Слева от оператора => не может быть индексного доступа к выходу ФБ.
Можете переписать в таком виде:
arrDowntime_Shift1[1][i] := fbDowntime_Chassis_line [i].arDownTimeS1[1];
Mikhail_NNT
19.02.2025, 13:22
Вас вообще не смущает, что количество элементов может не совпасть у переменных с разным типом массивов?
А чтоб ошибку устранить на скрине, вероятно достаточно написать так
fbDowntime_Chassis_line [i](xRedButton:=arRedButtonStation[i]);
arrDowntime_Shift1[1][i] := fbDowntime_Chassis_line [i].arDownTimeS1[1]
и т.д.
Не подумал об этом, и не знал что, слева от оператора => не может быть индексов [i]. Спасибо за подсказку.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot