Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 31

Тема: SPK-ПРИСВОЕНИЕ значений элементам двумерного массива

  1. #21

    По умолчанию

    Здравствуйте коллеги, подскажите в чем разница этих массивов? Снимок.PNG

  2. #22
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,799

    По умолчанию

    Первый массив одномерный, состоит из массивов BOOL[1..3], второй обычный двумерный массив, см. школьный учебник алгебры.

  3. #23

    По умолчанию

    Цитата Сообщение от Sergey666 Посмотреть сообщение
    Первый массив одномерный, состоит из массивов BOOL[1..3], второй обычный двумерный массив, см. школьный учебник алгебры.
    одномерный массив можно просто задать(a1: ARRAY [11..16] OF BOOL), но тем не менее, кодесис как то это принимает (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) в чем разница?

  4. #24

    По умолчанию

    Цитата Сообщение от sssssaaaaabbbbb Посмотреть сообщение
    одномерный массив можно просто задать(a1: ARRAY [11..16] OF BOOL), но тем не менее, кодесис как то это принимает (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) в чем разница?
    А как при этом считывать данные в 2х вариантах?
    s[1, 2] = xxx
    а в случае ARRAY OF ARRAY так пройдет? Сам не пробовал, но раз вы уже занялись этим...

  5. #25

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    А как при этом считывать данные в 2х вариантах?
    s[1, 2] = xxx
    а в случае ARRAY OF ARRAY так пройдет? Сам не пробовал, но раз вы уже занялись этим...
    как двойной массив обьявлять понятно, но вот эта запись непонятна (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) и как с ней работать непонятно. Просто любопытство.

  6. #26
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,342

    По умолчанию

    Цитата Сообщение от sssssaaaaabbbbb Посмотреть сообщение
    как двойной массив обьявлять понятно, но вот эта запись непонятна (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;
    эквивалентны.

    Разница лишь в отображении элементов массива в окне просмотра при онлайн-подключении к контроллеру - в первом случае плоским списком, во втором - структурированно.

    22-05-2024 15-50-06.png

    2.

    Для обращения к элементу массива при втором варианте объявления используется следующий синтаксис (пример):

    Код:
    a2[0][1] := 123;

  7. #27
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,799

    По умолчанию

    Цитата Сообщение от sssssaaaaabbbbb Посмотреть сообщение
    одномерный массив можно просто задать(a1: ARRAY [11..16] OF BOOL), но тем не менее, кодесис как то это принимает (a2:ARRAY [11..16] OF ARRAY [1..3] OF BOOL) в чем разница?
    Массив массивов...Можете начинать петь и танцевать, вы написали индусский код и не понимаете что вы написали? А зачем?

  8. #28

    По умолчанию

    Цитата Сообщение от Sergey666 Посмотреть сообщение
    Массив массивов...Можете начинать петь и танцевать, вы написали индусский код и не понимаете что вы написали? А зачем?
    Ну и что. что индусский, работает, а теперь и понятен стал. Спасибо Евгению.

  9. #29

    По умолчанию

    Добрый день, помогите разобраться в причинах ошибок компилятора.
    При вызове ФБ присваиваю внутренние переменные (элементы одномерного массива) переменным, объявленным в Главной программе (элементы многомерного массива). Пробовал Очистить все и заново Генерировать код, но компилятор все равно ругается.
    123.png
    Код ФБ:
    Код:
    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.sDataReset
    	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.sStartLunch1 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartLunch2
    	OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartBreak11 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartBreak12
    	OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartBreak21 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sStartBreak22) AND tofDowntime.Q)
    	THEN tofDowntime.Pause:= TRUE;
    END_IF
    
    IF ((TargetVars.stRTC.sGetFormatTime=TargetVars.sEndLunch1 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndLunch2
    	OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBreak11 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBreak12
    	OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBreak21 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBreak22) 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

  10. #30
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,342

    По умолчанию

    Добрый день.
    Слева от оператора => не может быть индексного доступа к выходу ФБ.

    Можете переписать в таком виде:

    arrDowntime_Shift1[1][i] := fbDowntime_Chassis_line [i].arDownTimeS1[1];

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Похожие темы

  1. Тестирование Библиотеки SPK Tools
    от Александр Приходько в разделе СПК2xx (архив)
    Ответов: 116
    Последнее сообщение: 10.12.2016, 17:06
  2. Придание динамики элементам на панели СП270
    от Михаил Ковалев в разделе Панели оператора (HMI)
    Ответов: 3
    Последнее сообщение: 06.08.2013, 10:28
  3. Присвоение QW в LD
    от Salvafion в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 11.09.2012, 20:11
  4. Присвоение значений команде по условию
    от Salvafion в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 06.09.2011, 05:57
  5. Ответов: 1
    Последнее сообщение: 26.04.2010, 16:07

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •