Добрый день, помогите разобраться в причинах ошибок компилятора.
При вызове ФБ присваиваю внутренние переменные (элементы одномерного массива) переменным, объявленным в Главной программе (элементы многомерного массива). Пробовал Очистить все и заново Генерировать код, но компилятор все равно ругается.
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