
Сообщение от
goldenlife
ПЛК, АЦП, Панель = как есть так и есть, цену какую скажут поставщики.
Остальное - механизмы и пр, типо "готово" и работает но плохо и на ручном управлении (старый дырявый пульт самопальный и рядом паяльник лежит для ремонта)... кнопки, ручные задвижки и пр. неинтересные приспособления.
.
Задача простая =) -> "Включить шнеки, набрать в малый бункер заданный вес, остановится, ждать команды сброса. И конечно же уметь юстировать, тарировать, калибровать".
.
Желание сделать только на ОВЕН. Чтоб можно было при помощи одного ноутбука разрешить ворпос с диагностикой и корректировкой всего и всея.
Да это понятно... Могу вам алгоритм дозировки свой выслать. Там основной бункер на тензодатчике, и вес измеряется по его убыванию в нижний. Но расшифровывать и комментировать уже присутствующие комментарии на буду. Там не сильно все запутано, 3 весовых бункера с компонентами и 1 нижний (весы на нем тоже есть, но я их в расчетах не использовал). Все как вам надо, задаете дозу, запускаете, после того, как система отдозирует - выпускаете нижний бункер куда надо, и по новой... Написано на кодесисе 3.5, легко переносится на кодесис 2.3...
Если не разберетесь, пишите в личку. Подскажу.
Код:
PROGRAM POU_Dos
VAR
First_Scan: BOOL;
A: ARRAY [1..5, 0..9] OF BOOL;
Wf: ARRAY [1..5] OF REAL;
Wt: ARRAY [1..5] OF REAL;
Wo: ARRAY [1..5] OF REAL;
Wz: ARRAY [1..5] OF REAL;
STOP: ARRAY [1..5] OF BOOL;
q1: ARRAY [1..5] OF R_TRIG;
q2: ARRAY [1..5] OF F_TRIG;
CMD_OF: ARRAY [1..5] OF BOOL;
CMD_CR: ARRAY [1..5] OF BOOL;
No_Dos: ARRAY [1..5] OF BOOL;
dW: ARRAY [1..5] OF REAL:= [0, 0, 0, 0, 100];
res_bit: R_TRIG;
END_VAR
VAR_INPUT
BTN_Res: ARRAY [1..5] OF BOOL;
BTN_Dos: ARRAY [1..5] OF BOOL;
BTN_Sta: ARRAY [1..5] OF BOOL;
BTN_Sto: ARRAY [1..5] OF BOOL;
END_VAR
Код:
IF NOT First_Scan THEN First_Scan:= TRUE; ResFromMSSQL:= TRUE; END_IF
FOR j:= 1 TO 5 DO
//Вес в бункере (текущий), кг
Wt[j]:= PW24_1D[j].U_RealInProgramm;
//Вес в плавке (требуемый), кг
Wz[j]:= PW24_2D[j].U_RealInProgramm;
END_FOR
MK210_312_O[2]:= FALSE;
IF (Wz[5]> Wt[5]) AND MEC[5].INP_SQ_C THEN
MK210_312_O[2]:= TRUE;
END_IF
res_bit(CLK:= MEC[5].INP_SQ_C); //Автоматический сброс задания коксика
IF res_bit.Q THEN
Wz[5]:= 0;
END_IF
FOR j:= 1 TO 5 DO
IF j= 4 THEN j:= j + 1; END_IF
IF j< 4 THEN
IF B_INP[96 + (j - 1) * 32] THEN B_INP[96 + (j - 1) * 32]:= FALSE; BTN_Sta[j]:= TRUE; END_IF //Запустить
IF B_INP[97 + (j - 1) * 32] THEN B_INP[97 + (j - 1) * 32]:= FALSE; BTN_Sto[j]:= TRUE; END_IF //Остановить
IF B_INP[98 + (j - 1) * 32] THEN B_INP[98 + (j - 1) * 32]:= FALSE; BTN_Dos[j]:= TRUE; END_IF //Отдозировать
END_IF
IF B_INP[99 + (j - 1) * 32] OR ResFromMSSQL THEN B_INP[99 + (j - 1) * 32]:= FALSE; BTN_Res[j]:= TRUE; END_IF //Сбросить вес ResFromMSSQL:= FALSE;
//Сбросить все биты при первом запуске
IF A[j, 0]= 0 THEN
FOR i:= 1 TO 9 DO
A[j, i]:= 0;
END_FOR
A[j, 0]:= 1;
END_IF
//Сбросить все биты при первом запуске
//Сброс
IF BTN_Res[j] AND NOT MEC[j].EXT_BLO AND NOT MEC[j].STA_ALA THEN
IF NOT A[j, 1] THEN
FOR i:= 2 TO 9 DO
A[j, i]:= 0;
END_FOR
Wo[j]:= 0;
STOP[j]:= 0;
END_IF
END_IF
BTN_Res[j]:= 0;
//Сброс
//Некорректное задание дозирования
No_Dos[j]:= NOT A[j, 2] AND ((Wz[j]<= 0) OR (Wz[j]>= Wt[j]));
//Некорректное задание дозирования
//Дозирование
IF BTN_Dos[j] AND NOT MEC[j].EXT_BLO AND NOT MEC[j].STA_ALA THEN
IF NOT A[j, 3] AND NOT A[j, 4] AND NOT No_Dos[j] THEN
IF NOT A[j, 2] THEN
A[j, 2]:= 1; //Повторный запуск дозирования или выгрузки
Wf[j]:= Wt[j];
END_IF
A[j, 1]:= 1; //Запрет сброса
A[j, 3]:= 1; //Начало дозирования
A[j, 4]:= 0; //Начало выгрузки
A[j, 5]:= 1; //Онлайн показания
END_IF
END_IF
BTN_Dos[j]:= 0;
//Дозирование
//Выгрузка
IF BTN_Sta[j] AND NOT MEC[j].EXT_BLO AND NOT MEC[j].STA_ALA THEN
IF NOT A[j, 3] AND NOT A[j, 4] THEN
IF NOT A[j, 2] THEN
A[j, 2]:= 1; //Повторный запуск дозирования или выгрузки
Wf[j]:= Wt[j];
END_IF
A[j, 1]:= 1; //Запрет сброса
A[j, 3]:= 0; //Начало дозирования
A[j, 4]:= 1; //Начало выгрузки
A[j, 5]:= 1; //Онлайн показания
END_IF
END_IF
BTN_Sta[j]:= 0;
//Выгрузка
//Онлайн показания
IF A[j, 5] THEN
Wo[j]:= Wf[j] - Wt[j];
// STOP[j]:= (Wo[j]>= Wz[j]);
STOP[j]:= ((Wo[j] + dW[j])>= Wz[j]);
END_IF
//Онлайн показания
//Отдозировано
IF A[j, 3] AND STOP[j] THEN
BTN_Sto[j]:= 1;
END_IF
//Отдозировано
//Остановка
IF BTN_Sto[j] OR MEC[j].EXT_BLO OR MEC[j].STA_ALA THEN
A[j, 1]:= 0; //Запрет сброса
A[j, 3]:= 0; //Начало дозирования
A[j, 4]:= 0; //Начало выгрузки
END_IF
BTN_Sto[j]:= 0;
//Остановка
q1[j](CLK := A[j, 3] OR A[j, 4]);
IF q1[j].Q THEN CMD_OF[j]:= TRUE; END_IF
q2[j](CLK := A[j, 3] OR A[j, 4]);
IF q2[j].Q THEN CMD_CR[j]:= TRUE; END_IF
IF j< 4 THEN
IF CMD_OF[j] THEN CMD_OF[j]:= FALSE; MEC[j].COM_OF:= TRUE; END_IF //Запустить
IF CMD_CR[j] THEN CMD_CR[j]:= FALSE; MEC[j].COM_STO:= TRUE; END_IF //Остановить
END_IF
IF j= 5 THEN
IF CMD_OF[j] THEN CMD_OF[j]:= FALSE; END_IF //Запустить
IF CMD_CR[j] THEN CMD_CR[j]:= FALSE; END_IF //Остановить
//IF CMD_OF[j] THEN MEC[j].COM_OF:= TRUE; END_IF //Запустить
//IF MEC[5].INP_SQ_O THEN CMD_OF[j]:= FALSE; END_IF //Сброс команды Запустить
//IF CMD_CR[j] THEN MEC[j].COM_CR:= TRUE; END_IF //Остановить
//IF MEC[5].INP_SQ_C THEN CMD_CR[j]:= FALSE; END_IF //Сброс команды Остановить
END_IF
END_FOR
ResFromMSSQL:= FALSE;