Определение конструктивных размеров трехфазной электродной системы пароводонагревателя мощностью 25 кВт
При определении конструктивных размеров электродной системы исходными данными являются: номинальная мощность -25 кВт, напряжение – 380/220 В, номинальное значение удельного сопротивления воды при 20 ºС ρ20 = 26 Ом·м, минимально допустимое удельного сопротивления котловой воды ρ20.мин = 2 Ом·м., температура кипения воды -96 ºС (в условиях г. Алматы).
Для обеспечения нормальной работы парогенератора в широком диапазоне изменения удельного сопротивления воды принимаем значение минимального межэлектродного расстояния l2=0,017 м, значение максимального межэлектродного расстояния l1=0,08 м. По конструктивным соображениям принимаем b1 =0,05 м, b2=0,1 м. При таких размерах электродной системы диаметр корпуса не превышает 0,3 м, что вполне приемлемо с точки зрения .
Необходимо найти высоту Н электродной системы, при которой достигается номинальная мощность.
Определяем фазную проводимость
См
Высота электродной системы:
Здесь
1/ Ом·м.
После подстановки численных значений, находим требуемую высоту электродной системы
м.
Геометрический коэффициент электродной системы
Определяем угол наклона ψ поверхности углообразного электрода относительно вертикальной радиальной плоскости:
При этом длина электрода составляет
м
|
|
Исходя из расчетных конструктивных размеров электродной системы, определены размеры корпуса пароводонагревателя: диаметр корпуса – 0,3 м, толщина стенки корпуса -3 мм.
ПРИЛОЖЕНИЕ Г
Математическое моделирование работы ГЭТУ в режиме одновременного нагрева воды в бойлере и теплоносителя системы отопления
Исходные данные:
Fто1=0,4 м2; tп= 100 ºС; ; Дж/кг·°С; Ств= 500·4190=2095000 Дж/С; Дж/°С; °К; ·103Дж/кг; кг/м3; м/с2; м3; м2; Па. В; Ом·м; См/м; м; ; °С; кг; =10°С; =80°С; °С; Vт=270 м3; кДж/°С; Дж/кг·°С; Вт/м3·°С; В; Вт/м2·°С;)Fто2=0,235м2,Fро= 14м2, кг/с, .
|
tтв hукtто2 tро tпом
Математическое моделирование работы ГЭТУ в режиме
Электрического нагрева воды в бойлере
τ tто1 tтв hук
ПРИЛОЖЕНИЕ Д
Математическое моделирование работы ГЭТУ в режиме
Солнечного нагрева воды в бойлере
Исходные данные:
qc= 760 Вт/м2; Fгк= 5,7 м2; ηоп= 0,8; k1=1 Вт/м2 k1=0,001 Вт/м2 =5177 Дж/кг ; Кто3=1200 Вт/ м2 ; Fто3= 0,5 м2;
а) солнечный нагрев воды |
в начале июля |
|
в начале февраля ( tос = -10ºС,qc= 450 Вт/м2)
|
б) солнечный нагрев воды |
|
τ tгк tто3 tтв
|
ПРИЛОЖЕНИЕ Е
Алгаритм программы
Модуль опроса МВА МДВВ
Создание библиотеки для опроса по модбасу
1. Работа с ком портом (ComConn)
· Использованыбиблиоеки: modbus, standart,SysCom, RS mode Library
Задача, работа с ком портам по по RS-485 илиRS-232 по протоколу modbus.
· Инициализация Функционального блока должно в программе вызыватся один раз
· Возможность выбора com-порта
· Возможность задать скорсть обмена данными
· Возможность задать четность
· Число стоп битов
· Размер посылки
· Идентификатор открытие порта
· Флаг успешного завершение
· Ошибка порта
Код программы:
(*Функциональный блок инициализации ком порта, запускается один раз*)
FUNCTION_BLOCK ComConn
VAR_INPUT
(*разрешение на открытие порта*) enable:BOOL;
(*номер порта на ПЛК, для 485 на 304м это номер 2*) PortNum: COM_PORTS:=2;
(*скорость, по умолчанию 115200*) PortBaudrate:COM_Baudrate:=115200;
|
|
(*четность 0- нет 1-нечет 2-чет, по умолчанию 0-нет*) PortParity:COM_Parity:=0 ;
(*стопбит 1-1бит, 2-1.5бита, 3-2бита, по умолчанию1-1бит*) PortStopBits:COM_StopBits:=1 ;
(*размер посылки, кажется, по умолчанию 8 бит*) PortByteSize:BYTE:=8;
(*Выбор режима работы порта СПК2хх :0-RS-232, 2-RS-485, по умл RS-485*) Port_Mode:RS_mode:=2;
(*Включение функции выбора работы порта, по умолчанию Выкл*) Port_ModeOn:BOOL:=FALSE;
(*разрешение на закрытие порта*) Port_CloseOn:BOOL:=FALSE;
END_VAR
VAR_OUTPUT
(*идентификатор открытого порта, если ошибка то все F*) Handle:SysCom.RTS_IEC_HANDLE;
(*флаг состояния порта*) Done:BOOL:=FALSE;
(*кодошибки*) ErrCode:SysCom.RTS_IEC_RESULT;
|
|
END_VAR
VAR
settings:SysCom.COM_Settings;
settings2:SysCom.COM_SettingsEx;
res:SysCom.RTS_IEC_RESULT;
ret_res:INT;
rtrig:R_TRIG;
trig:rs;
END_VAR
rtrig(clk:=(Enable AND NOT done));
trig(set:=rtrig.Q,RESET1:=FALSE);
IF trig.Q1 THEN
Settings.sPort:=PortNum; (*номер COM-порта*)
Settings.ulBaudrate:=PortBaudrate; (*скорость*)
Settings.byParity:=PortParity;
Settings.ulTimeout:=0;
Settings.byStopBits:=PortStopBits;
Settings.ulBufferSize:=0;
settings2.byByteSize:=PortByteSize;
settings2.bBinary := TRUE;
settings2.bDtrControl := FALSE;
settings2.bRtsControl := TRUE;
settings2.bOutxCtsFlow := FALSE;
settings2.bOutxDsrFlow := FALSE;
settings2.bDsrSensitivity := FALSE;
//settings2.bInX:=FALSE;
//settings2.bOutX:=FALSE;
//settings2.bTXContinueOnXoff:=FALSE;
//settings2.byXoffChar:=FALSE;
//settings2.byXonChar:=FALSE;
handle:=SysCom.SysComOpen2( ADR(Settings),ADR(Settings2),ADR(ErrCode));
IF Port_ModeOn THEN
ret_res:=RS_mode_Setup(handle,Port_Mode);
END_IF
IF ErrCode=0 THEN
ErrCode:=ret_res;
END_IF
(*res:=SysComGetSettings(handle, ADR(Settings),ADR(Settings2));
res:=SysComSetSettings(handle, ADR(Settings),ADR(Settings2));*)
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF (handle <> 16#FFFFFFFF ) THEN
done:=TRUE;
trig(RESET1:=true);
ELSE
done:=FALSE;
END_IF
END_IF
IF Port_CloseOn THEN
done:=FALSE;
res:=SysComClose(handle);
trig(set:=FALSE,RESET1:=TRUE);
Port_CloseOn:=FALSE;
ErrCode:=res;
END_IF
2. Библиотека для работы с МВА8(MVA8_inputs)
Использованыбиблиоеки: modbus, standart,SysCom, RS mode Library
Задача:
· Опрос модуля аналогового ввода используя шаблон ComConn
· Ввод модбас адреса
· Выбор режима работы модбас
· Ввод тайиаута ороса
· Вывод данных с аналогово ввода
· Вывыод кода ошибок исключительных ситуации
Код программы:
(*функциональный блок считывания состояния входов и код исключительных ситуаций модуля МВА8*)
FUNCTION_BLOCK MVA8_inputs
VAR_INPUT
(*идентификатор порта*) Handle:SysCom.RTS_IEC_HANDLE;
(*разрешение на работу*) Enabl:BOOL;
(*режим работы ModBus, по умолчанию RTU*) Modd:MB_MODE:=MB_RTU (*MB_RTU, MB_Ascii*);
(*адресс прибора, по умолчанию 16*) Addr:BYTE:=16;
(*таймаут, по умолчанию 50мс*) TimeOut: TIME:=T#50MS;(*таймаут*)
(*число перезапросов, по умолчанию 3*) ErCL:BYTE:=3;
END_VAR
VAR_OUTPUT
(*измеренное значение 1го входа прибора*) inp1:REAL;
(*измеренное значение 2го входа прибора*) inp2:REAL;
(*измеренное значение 3го входа прибора*) inp3:REAL;
(*измеренное значение 4го входа прибора*) inp4:REAL;
(*измеренное значение 5го входа прибора*) inp5:REAL;
(*измеренное значение 6го входа прибора*) inp6:REAL;
(*измеренное значение 7го входа прибора*) inp7:REAL;
(*измеренное значение 8го входа прибора*) inp8:REAL;
(*код исключительной ситуации 1го канала*) inpExcSCode1:WORD;
(*код исключительной ситуации 2го канала*) inpExcSCode2:WORD;
(*код исключительной ситуации 3го канала*) inpExcSCode3:WORD;
(*код исключительной ситуации 4го канала*) inpExcSCode4:WORD;
(*код исключительной ситуации 5го канала*) inpExcSCode5:WORD;
(*код исключительной ситуации 6го канала*) inpExcSCode6:WORD;
(*код исключительной ситуации 7го канала*) inpExcSCode7:WORD;
(*код исключительной ситуации 8го канала*) inpExcSCode8:WORD;
(*код ошибки*) wErrCode:WORD:=0;
(*флаг завершения*) done:BOOL:=FALSE;
END_VAR
VAR
Err:WORD:=0;
ErrCount:BYTE:=0;
cmpl:BOOL;
marker:WORD:=0;
Exception: BYTE;
DataSize: WORD;
RegAddr1:WORD:=16#02;
RegAddr2:WORD:=16#08;
RegAddr3:WORD:=16#0E;
RegAddr4:WORD:=16#14;
RegAddr5:WORD:=16#1A;
RegAddr6:WORD:=16#20;
RegAddr7:WORD:=16#26;
RegAddr8:WORD:=16#2C;
get_modbus:MB_RD_HOLD_REGS;
BUFFER: ARRAY [0..255] OF BYTE;
x: REAL;
ptr_x:POINTER TO BYTE;
rtrig:R_TRIG;
trig:rs;
END_VAR
done:=FALSE;
rtrig(clk:=(Enabl));
trig(set:=rtrig.Q,RESET1:=FALSE);
CASE marker OF
0: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr1 , (*номер регистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp1:=x;
inpExcSCode1:=0;
ptr_x:=ADR(inpExcSCode1);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=1;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=1;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
1: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr2 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp2:=x;
inpExcSCode2:=0;
ptr_x:=ADR(inpExcSCode2);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=2;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=2;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
2: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr3 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp3:=x;
inpExcSCode3:=0;
ptr_x:=ADR(inpExcSCode3);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=3;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=3;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
3: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr4 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp4:=x;
inpExcSCode4:=0;
ptr_x:=ADR(inpExcSCode4);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=4;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=4;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
4: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr5 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp5:=x;
inpExcSCode5:=0;
ptr_x:=ADR(inpExcSCode5);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=5;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=5;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
5: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr6 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp6:=x;
inpExcSCode6:=0;
ptr_x:=ADR(inpExcSCode6);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=6;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=6;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
6: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr7 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp7:=x;
inpExcSCode7:=0;
ptr_x:=ADR(inpExcSCode7);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=7;
ErrCount:=0;
ELSE
IF (ErrCount >= ErCL) THEN
marker:=7;
wErrCode:=Err;
ErrCount:=0;
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
7: get_modbus(
Enable:=trig.Q1 , (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr8 , (*номеррегистра*)
Quantity:=4, (*количество регистров*)
ComHandle:=handle ,(*номерCOM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
IF cmpl THEN
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=0;
ptr_x:=ADR(x);
ptr_x^:=buffer[7];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[6];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[5];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[4];
inp8:=x;
inpExcSCode8:=0;
ptr_x:=ADR(inpExcSCode8);
ptr_x^:=buffer[1];
ptr_x:=ptr_x+1;
ptr_x^:=buffer[0];
marker:=0;
done:=TRUE;
trig(RESET1:=TRUE);
ErrCount:=0;
ELSE
IF ErrCount>=ErCL THEN
marker:=0;
wErrCode:=Err;
ErrCount:=0;
done:=TRUE;
trig(RESET1:=TRUE);
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
END_CASE
3. Библиотека для работы с дискретными вводами МДВВ(MDVV_inputs)
Использованыбиблиоеки: modbus, standart,SysCom, RS mode Library
Задача:
· Опрос модуля дискретного ввода вывода используя шаблон ComConn
· Ввод модбас адреса
· Выбор режима работы модбас
· Ввод тайиаута ороса
· Вывод данных с дискретных вводов
· Вывыод кода ошибок исключительных ситуации
Код программы:
FUNCTION_BLOCK MDVV_inputs
VAR_INPUT
(*идентификатор порта*) Handle:SysCom.RTS_IEC_HANDLE;
(*разрешение на работу*) Enabl:BOOL;
(*режим работы ModBus (MB_RTU, MB_Ascii), по умолчанию RTU*) Modd:MB_MODE:=MB_RTU ;
(*адресс прибора, по умолчанию 16*) Addr:BYTE:=16;
(*таймаут, по умолчанию 100мс*) TimeOut: TIME:=T#100MS;
(*число перезапросов, по умолчанию 3*) ErCL:BYTE:=3;
END_VAR
VAR_OUTPUT
(*состояния 1го входа прибора*) inp1:BOOL;
(*состояния 2го входа прибора*) inp2:BOOL;
(*состояния 3го входа прибора*) inp3:BOOL;
(*состояния 4го входа прибора*) inp4:BOOL;
(*состояния 5го входа прибора*) inp5:BOOL;
(*состояния 6го входа прибора*) inp6:BOOL;
(*состояния 7го входа прибора*) inp7:BOOL;
(*состояния 8го входа прибора*) inp8:BOOL;
(*состояния 9го входа прибора*) inp9:BOOL;
(*состояния 10го входа прибора*) inp10:BOOL;
(*состояния 11го входа прибора*) inp11:BOOL;
(*состояния 12го входа прибора*) inp12:BOOL;
(*код ошибки*) wErrCode:WORD;
(*флаг завершения*) done:BOOL;
END_VAR
VAR
rtrig:R_TRIG;
trig:rs;
ErrCount:BYTE:=0;
err:WORD;
cmpl:BOOL;
Exception: BYTE;
DataSize: WORD;
RegAddr:WORD:=16#33;
get_modbus:MB_RD_HOLD_REGS;
BUFFER: ARRAY [0..255] OF BYTE;
x: WORD;
END_VAR
done:=FALSE;
rtrig(clk:=(Enabl));
trig(set:=rtrig.Q,RESET1:=FALSE);
get_modbus(
Enable:=trig.Q1, (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:=RegAddr , (*номеррегистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=handle ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
(*IF SysComRead(handle, ADR(tempBuf), 255, 0, ADR(res)) <> 0 THEN
err:=0;
END_IF*)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
inp1:=x.0;
inp2:=x.1;
inp3:=x.2;
inp4:=x.3;
inp5:=x.4;
inp6:=x.5;
inp7:=x.6;
inp8:=x.7;
inp9:=x.8;
inp10:=x.9;
inp11:=x.10;
inp12:=x.11;
done:=TRUE;
ErrCount:=0;
wErrCode:=Err;
trig(RESET1:=TRUE);
ELSE
IF (ErrCount >= ErCL) THEN
wErrCode:=Err;
ErrCount:=0;
done:=TRUE;
trig(RESET1:=TRUE);
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
4. Библиотека для работы с дискретными выводами МДВВ(MDVV_outs)
Использованыбиблиоеки: modbus, standart,SysCom, RS mode Library
Задача:
· Ввод дискретных данных в модуля дискретного ввода вывода используя шаблон ComConn
· Ввод модбас адреса
· Выбор режима работы модбас
· Ввод тайиаута ороса
· Вывыод кода ошибок исключительных ситуации
Код программы:
FUNCTION_BLOCK MDVV_outs
VAR_INPUT
(*идентификатор порта*) Handle:SysCom.RTS_IEC_HANDLE;
(*разрешение на работу*) Enabl:BOOL;
(*режим работы ModBus (MB_RTU, MB_Ascii), по умолчанию RTU*) Modd:MB_MODE:=MB_RTU ;
(*адресс прибора, по умолчанию 16*) Addr:BYTE:=16;
(*таймаут, по умолчанию 20мс*) TimeOut: TIME:=T#20MS;(*таймаут*)
(*число перезапросов, по умолчанию 3*) ErCL:BYTE:=3;
(*состояниедискретноговыходаприбора*) out1,out2,out3,out4,out5,out6,out7,out8:BOOL:=FALSE;
END_VAR
VAR_OUTPUT
(*кодошибки*) wErrCode:WORD;
(*флагзавершения*) done:BOOL;
END_VAR
VAR
ErrCount:BYTE:=0;
cmpl:BOOL;
shag:byte:=0;
err:WORD;
Exception: BYTE;
DataSize: WORD;
RegAddr:WORD:=16#32;
send2_modbus: MB_WR_REGS; (*функция 16 - записьпараметров*)
BUFFER: ARRAY [0..255] OF BYTE;
i: WORD;
rtrig:R_TRIG;
trig:rs;
END_VAR
done:=FALSE;
rtrig(clk:=(Enabl));
trig(set:=rtrig.Q,RESET1:=FALSE);
IF trig.Q1 AND shag=0 THEN
buffer[0]:=0;
//buffer[1]:=0;
buffer[1].0:=out1;buffer[1].1:=out2;buffer[1].2:=out3;buffer[1].3:=out4; buffer[1].4:=out5; buffer[1].5:=out6; buffer[1].6:=out7; buffer[1].7:=out8;
shag:=1;
END_IF
IF shag=1 THEN
send2_modbus(
Enable:= trig.Q1, (* разрешениеработыблока *)
Mode:=Modd , (*режимпередачи*)
DevAddr:=Addr , (*адрес*)
FirstAddr:= RegAddr, (*номеррегистра*)
Quantity:= 1, (*количество записываемых регистров*)
ComHandle:=handle ,(*номерсом-порта*)
TimeOut:=TimeOut , (*таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>Err , (* скопировать регистр ошибок *)
RegCnt=> DataSize); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
shag:=0;
IF Err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
done:=TRUE;
trig(RESET1:=TRUE);
ErrCount:=0;
wErrCode:=Err;
ELSE
IF (ErrCount >= ErCL) THEN
wErrCode:=Err;
ErrCount:=0;
done:=TRUE;
trig(RESET1:=TRUE);
END_IF
ErrCount:=ErrCount+1;
END_IF
END_IF
END_IF
5. Используя созданную библиотеку создать функциональный блок ввода-ввывода Данных(mva_mdvv)
FUNCTION_BLOCK mva_mdvv
VAR_INPUT
set: BOOL;
do1: BOOL;
do2: BOOL;
do3: BOOL;
do4: BOOL;
do5: BOOL;
do6: BOOL;
do7: BOOL;
do8: BOOL;
END_VAR
VAR_OUTPUT
di1: BOOL;
di2: BOOL;
di3: BOOL;
di4: BOOL;
di5: BOOL;
di6: BOOL;
ai1: REAL;
ai2: REAL;
ai3: REAL;
ai4: REAL;
ai5: REAL;
ai6: REAL;
ai7: REAL;
ai8: REAL;
mva_er1: WORD;
mva_er2: WORD;
mva_er3: WORD;
mva_er4: WORD;
mva_er5: WORD;
mva_er6: WORD;
mva_er7: WORD;
mva_er8: WORD;
mva_err: WORD;
mdvv_err: WORD;
END_VAR
VAR
ComConn_0: ComConn;
TP_0: TP;
MDVV_inputs_0: MDVV_inputs;
MDVV_outs_0: MDVV_outs;
MVA8_inputs_0: MVA8_inputs;
TP_2: TP;
END_VAR
6. Работа с Часами реального времени
FUNCTION_BLOCK RealTimeClock4
VAR_INPUT
Lang: STRING;
Set_Year: UINT;
Set_Month: UINT;
Set_Day: Uint;
Set_Hour: Uint;
Set_Minute: Uint;
Set_Second: UINT;
Add_Year: BOOL;
Add_Month: BOOL;
Add_Day: BOOL;
Add_Hour: BOOL;
Add_Minute: BOOL;
Add_Second: BOOL;
Sub_Year: BOOL;
Sub_Month: BOOL;
Sub_Day: BOOL;
Sub_Hour: BOOL;
Sub_Minute: BOOL;
Sub_Second: BOOL;
END_VAR
VAR_OUTPUT
RTC: DT;
Year: UINT;
Month: UINT;
Day: UINT;
Hour: UINT;
Minute: UINT;
Second: UINT;
w_str_time: WSTRING; (*Получаем Время в виде строки - статичное изображение*)
w_str_dateM: WSTRING; (*Получаем Дату в виде строки - месяц буквами*)
END_VAR
VAR
GetTime: DTU.GetDateAndTime;
SetTime: DTU.SetDateAndTime;
RT_TIME:R_TRIG;
RT_Add_Year: R_TRIG;
RT_Add_Month: R_TRIG;
RT_Add_Day: R_TRIG;
RT_Add_Hour: R_TRIG;
RT_Add_Minute: R_TRIG;
RT_Add_Second: R_TRIG;
RT_Sub_Year: R_TRIG;
RT_Sub_Month: R_TRIG;
RT_Sub_Day: R_TRIG;
RT_Sub_Hour: R_TRIG;
RT_Sub_Minute: R_TRIG;
RT_Sub_Second: R_TRIG;
Error: DTU.ERROR;
Set:BOOL;
Update_Year: UpdateUint;
Update_Month: UpdateUint;
Update_Day: UpdateUint;
Update_Hour: UpdateUint;
Update_Minute: UpdateUint;
Update_Second: UpdateUint;
(*Расчетвисокосногогода*)
leap_year: BOOL;
x1:WORD;
x2:WORD;
x3:WORD;
(*последний день текущего месяца*)
EndDay: UINT;
(*конвертируем дату и время в текст*)
Second_old:UINT;
MonthWS:WSTRING;
END_VAR
(*Получаем системное время в формате DATE_AND_TIME*)
GetTime(xExecute:= NOT(GetTime.xDone));
RT_TIME(CLK:=GetTime.xDone);
IF RT_TIME.Q AND GetTime.xBusy=FALSE AND GetTime.xError=FALSE AND GetTime.eError=0 THEN
RTC:=GetTime.dtDateAndTime;
(*Разбираемсистемноевремя*)
Error:=DTU.DTSplit(
dtDateAndTime:= RTC,
puiYear:= ADR(Year),
puiMonth:= ADR(Month),
puiDay:= ADR(Day),
puiHour:= ADR(Hour),
puiMinute:= ADR(Minute),
puiSecond:= ADR(Second));
(*Собираем время в строку*)
END_IF
IF Second_old<>Second THEN
w_str_time:=wconcat(WORD_TO_WSTRING(Hour)," : ");
w_str_time:=wconcat(w_str_time,WORD_TO_WSTRING(Minute));
w_str_time:=wconcat(w_str_time," : ");
w_str_time:=wconcat(w_str_time,WORD_TO_WSTRING(Second));
IF Lang='RU' THEN
CASE Month OF
1:
MonthWS:="января";
2:
MonthWS:="февраля";
3:
MonthWS:="марта";
4:
MonthWS:="апреля";
5:
MonthWS:="мая";
6:
MonthWS:="июня";
7:
MonthWS:="июля";
8:
MonthWS:="августа";
9:
MonthWS:="сентября";
10:
MonthWS:="октября";
11:
MonthWS:="ноября";
12:
MonthWS:="декабря";
END_CASE
ELSE
CASE Month OF
1:
MonthWS:="January";
2:
MonthWS:="February";
3:
MonthWS:="March";
4:
MonthWS:="April";
5:
MonthWS:="May";
6:
MonthWS:="June";
7:
MonthWS:="July";
8:
MonthWS:="August";
9:
MonthWS:="September";
10:
MonthWS:="October";
11:
MonthWS:="November";
12:
MonthWS:="December";
END_CASE
END_IF
IF Lang='RU' THEN
w_str_dateM:=wconcat(WORD_TO_WSTRING(Day)," ");
w_str_dateM:=wconcat(w_str_dateM,MonthWS);
w_str_dateM:=wconcat(w_str_dateM," ");
w_str_dateM:=wconcat(w_str_dateM,WORD_TO_WSTRING(Year));
w_str_dateM:=wconcat(w_str_dateM,"г.");
ELSE
w_str_dateM:=wconcat(MonthWS," ");
w_str_dateM:=wconcat(w_str_dateM,WORD_TO_WSTRING(Day));
w_str_dateM:=wconcat(w_str_dateM,"th, ");
w_str_dateM:=wconcat(w_str_dateM,WORD_TO_WSTRING(Year));
END_IF
END_IF
Second_old:=Second;
(*Определяем високосный год или нет*)
x1:= Year MOD 4;
x2:= Year MOD 100;
x3:= Year MOD 400;
IF (x3=0) OR (x1=0 AND x2<>0 ) THEN
leap_year:=TRUE;
END_IF
IF (x1<>0) OR (x2=0 AND x3<>0) THEN
leap_year:=FALSE;
END_IF
(*Определяем последний день текущего месяца*)
CASE Month OF
1:
EndDay:=31;
2:
IF leap_year THEN
EndDay:=29;
ELSE
EndDay:=28;
END_IF
3:
EndDay:=31;
4:
EndDay:=30;
5:
EndDay:=31;
6:
EndDay:=30;
7:
EndDay:=31;
8:
EndDay:=31;
9:
EndDay:=30;
10:
EndDay:=31;
11:
EndDay:=30;
12:
EndDay:=31;
END_CASE
(*Управление временем через логичские входы*)
RT_Add_Year ( CLK:=Add_Year) ;
RT_Add_Month ( CLK:=Add_Month) ;
RT_Add_Day ( CLK:=Add_Day) ;
RT_Add_Hour ( CLK:=Add_Hour) ;
RT_Add_Minute ( CLK:=Add_Minute);
RT_Add_Second ( CLK:=Add_Second);
RT_Sub_Year ( CLK:=Sub_Year) ;
RT_Sub_Month ( CLK:=Sub_Month) ;
RT_Sub_Day ( CLK:=Sub_Day) ;
RT_Sub_Hour ( CLK:=Sub_Hour) ;
RT_Sub_Minute ( CLK:=Sub_Minute);
RT_Sub_Second ( CLK:=Sub_Second);
(*ГОД*)
IF RT_Add_Year.Q THEN
Year:=Year+1;
IF Year>2038 THEN
Year:=2038;
END_IF
END_IF
IF RT_Sub_Year.Q THEN
Year:=Year-1;
IF Year<1970 THEN
Year:=1970;
END_IF
END_IF
(*Месяц*)
IF RT_Add_Month.Q THEN
Month:=Month+1;
IF Month >12 AND Month<20 THEN
Month:=1;
END_IF
END_IF
IF RT_Sub_Month.Q THEN
Month:=Month-1;
IF (Month <=65535 AND Month>65500) or Month=0 THEN
Month:=12;
END_IF
END_IF
(*День*)
IF RT_Add_Day.Q THEN
Day:=Day+1;
IF Day >EndDay AND Day<40 THEN
Day:=1;
END_IF
END_IF
IF RT_Sub_Day.Q THEN
Day:=Day-1;
IF (Day <=65535 AND Day>65500) OR Day=0 THEN
Day:=EndDay;
END_IF
END_IF
(*Час*)
IF RT_Add_Hour.Q THEN
Hour:=Hour+1;
IF Hour >23 AND Hour<30 THEN
Hour:=0;
END_IF
END_IF
IF RT_Sub_Hour.Q THEN
Hour:=Hour-1;
IF Hour <=65535 AND Hour>65500 THEN
Hour:=23;
END_IF
END_IF
(*Минута*)
IF RT_Add_Minute.Q THEN
Minute:=Minute+1;
IF Minute >59 AND Minute<70 THEN
Minute:=0;
END_IF
END_IF
IF RT_Sub_Minute.Q THEN
Minute:=Minute-1;
IF Minute <=65535 AND Minute>65500 THEN
Minute:=59;
END_IF
END_IF
(*Секунда*)
IF RT_Add_Second.Q THEN
Second:=Second+1;
IF Second >59 AND Second<70 THEN
Second:=0;
END_IF
END_IF
IF RT_Sub_Second.Q THEN
Second:=Second-1;
IF Second <=65535 AND Second>65500 THEN
Second:=59;
END_IF
END_IF
(*Есливведеноновоезначение*)
Update_Year(In:= Set_Year, Set=> );
Update_Month(In:= Set_Month, Set=> );
Update_Day(In:= Set_Day, Set=> );
Update_Hour(In:= Set_Hour, Set=> );
Update_Minute(In:= Set_Minute, Set=> );
Update_Second(In:= Set_Second, Set=> );
IF Update_Year.Set THEN
(*Собираемсистемноевремя*)
RTC:=DTU.DTConcat(
uiYear:= Set_Year,
uiMonth:= Month,
uiDay:= Day,
uiHour:= Hour,
uiMinute:= Minute,
uiSecond:= Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
IF Update_Month.Set THEN
(*Собираем системное время*)
RTC:=DTU.DTConcat(
uiYear:= Year,
uiMonth:= Set_Month,
uiDay:= Day,
uiHour:= Hour,
uiMinute:= Minute,
uiSecond:= Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
IF Update_Day.Set THEN
(*Собираем системное время*)
RTC:=DTU.DTConcat(
uiYear:= Year,
uiMonth:= Month,
uiDay:= Set_Day,
uiHour:= Hour,
uiMinute:= Minute,
uiSecond:= Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
IF Update_Hour.Set THEN
(*Собираем системное время*)
RTC:=DTU.DTConcat(
uiYear:= Year,
uiMonth:= Month,
uiDay:= Day,
uiHour:= Set_Hour,
uiMinute:= Minute,
uiSecond:= Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
IF Update_Minute.Set THEN
(*Собираем системное время*)
RTC:=DTU.DTConcat(
uiYear:= Year,
uiMonth:= Month,
uiDay:= Day,
uiHour:= Hour,
uiMinute:= Set_Minute,
uiSecond:= Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
IF Update_Second.Set THEN
(*Собираем системное время*)
RTC:=DTU.DTConcat(
uiYear:= Year,
uiMonth:= Month,
uiDay:= Day,
uiHour:= Hour,
uiMinute:= Minute,
uiSecond:= Set_Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
(*Пишем новое значение*)
IF RT_Add_Year.Q OR RT_Add_Month.Q OR RT_Add_Day.Q OR RT_Add_Hour.Q OR RT_Add_Minute.Q OR RT_Add_Second.Q OR
RT_Sub_Year.Q OR RT_Sub_Month.Q OR RT_Sub_Day.Q OR RT_Sub_Hour.Q OR RT_Sub_Minute.Q OR RT_Sub_Second.Q THEN
(*Собираем системное время*)
RTC:=DTU.DTConcat(
uiYear:= Year,
uiMonth:= Month,
uiDay:= Day,
uiHour:= Hour,
uiMinute:= Minute,
uiSecond:= Second,
peError:= ADR(Error));
Set:=TRUE;
END_IF
IF Set THEN
SetTime(
xExecute:= TRUE,
dtDateAndTime:= RTC,
xDone=> ,
xBusy=> ,
xError=> ,
eError=> );
IF SetTime.xDone AND SetTime.xError=FALSE THEN
SetTime(xExecute:= FALSE);
Set:=FALSE;
sysexecute('/etc/rc.sync &');
ELSE
SetTime(xExecute:= FALSE);
END_IF
END_IF
FUNCTION_BLOCK UpdateUint
VAR_INPUT
In: UINT;
END_VAR
VAR_OUTPUT
Set: BOOL;
END_VAR
VAR
In_OLD: UINT;
rt:R_Trig;
END_VAR
rt(CLK:=IN<>IN_OLD);
Set:=rt.Q;
In_OLD:=IN;
7. Программа архивации
PROGRAM arhives
VAR
My_ARCH: Archiver;
My_Dev: StorageDeviseEnum:=Dev_USB1; (*Устройство, на которое пишется архив*)
My_Dev_Copy: StorageDeviseEnum:=Dev_SD1; (*Устройство, на которое копируется архив*)
ARCH_DATA: ARRAY[0..63] OF Params_ARCH;
timess: TIME;
END_VAR
VAR_INPUT
ARCH_START:BOOL; (*Запуск/останов архивации*)
ARCH_COPY:BOOL; (*Копировать архивы на другой носитель*)
END_VAR
VAR_OUTPUT
(*Информация о носителе, на который данные архивируются*)
INFO:WSTRING; (*Общая информаци для наглядности*)
SDEV_Size:STRING; (*Объем устройства*)
SDEV_Used:STRING; (*Использованное пространство*)
SDEV_Available:STRING; (*Свободное пространство*)
END_VAR
timess:=T#10M;
ARCH_DATA[1].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[1].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai1); (*Указатель на первый байт переменной*)
ARCH_DATA[1].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[2].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[2].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai2); (*Указатель на первый байт переменной*)
ARCH_DATA[2].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[3].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[3].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai3); (*Указатель на первый байт переменной*)
ARCH_DATA[3].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[4].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[4].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai4); (*Указатель на первый байт переменной*)
ARCH_DATA[4].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[5].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[5].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai5); (*Указатель на первый байт переменной*)
ARCH_DATA[5].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[6].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[6].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai6); (*Указатель на первый байт переменной*)
ARCH_DATA[6].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[7].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[7].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai7); (*Указатель на первый байт переменной*)
ARCH_DATA[7].tTM:=timess; (*Таймаутархивации*)
ARCH_DATA[8].dDT:=typeREAL; (*Типпеременной*)
ARCH_DATA[8].pPB:=ADR(PLC_PRG.mva_mdvv_0.ai8); (*Указатель на первый байт переменной*)
ARCH_DATA[8].tTM:=timess; (*Таймаутархивации*)
My_ARCH(
Start:= ARCH_START,
TypeDevice:= My_Dev,
ARCH_Data:= ARCH_DATA,
TypeDeviceForCopy:= My_Dev_Copy,
Copy:= ARCH_COPY,
INFO=> INFO,
DEV_Size=> ,
DEV_Used=> ,
DEV_Available=> ,
DEV_Use=> ,
SDEV_Size=> SDEV_Size,
SDEV_Used=> SDEV_Used,
SDEV_Available=> SDEV_Available,
All_Err=> ,
DevStatus=> ,
Done=> );
8. Гелиоколектор
Работа емкосьти
FUNCTION_BLOCK emkost
VAR
rs1: RS;
END_VAR
VAR_INPUT
dt15_in: REAL;
END_VAR
VAR_OUTPUT
do2_out: BOOL;
END_VAR
rs1(set:=dt15_in>60 OR dt15_in=60, reset1:=dt15_in<50 OR dt15_in=50);
do2_out:=rs1.Q1;
Работа гелиоколектора
FUNCTION_BLOCK geliokollector
VAR
rs1: RS;
END_VAR
VAR_INPUT
dt14_in: REAL;
dt21_in: REAL;
END_VAR
VAR_OUTPUT
do1_out: BOOL;
END_VAR
rs1(set:=dt21_in=dt14_in+8
OR dt21_in>dt14_in+8,
reset1:= dt21_in=dt14_in+4
OR dt21_in<dt14_in+4);
do1_out:=rs1.Q1;
Зашита
FUNCTION_BLOCK zawita
VAR_INPUT
dt32: REAL;
END_VAR
VAR_OUTPUT
out1: BOOL;
END_VAR
VAR
rs1: Rs;
END_VAR
rs1(set:=dt32>70 OR dt32=70, reset1:=dt32<64 OR dt32<64);
out1:=rs1.Q1;
FUNCTION_BLOCK geliokollector
VAR
rs1: RS;
t_vkl: REAL:=8;
t_vikl:REAL:=4;
END_VAR
VAR_INPUT
dt14_in: REAL;
dt21_in: REAL;
END_VAR
VAR_OUTPUT
do1_out: BOOL;
END_VAR
rs1(set:=dt21_in=dt14_in+t_vkl
OR dt21_in>dt14_in+t_vkl,
reset1:= dt21_in=dt14_in+t_vikl
OR dt21_in<dt14_in+t_vikl);
do1_out:=rs1.Q1;
FUNCTION_BLOCK zawita
VAR_INPUT
dt32: REAL;
END_VAR
VAR_OUTPUT
out1: BOOL;
END_VAR
VAR
rs1: Rs;
END_VAR
rs1(set:=dt32>72 OR dt32=72, reset1:=dt32<64 OR dt32<64);
out1:=rs1.Q1;
9. Лето зима
FUNCTION_BLOCK leto_zima
VAR_INPUT
moonth: UINT;
END_VAR
VAR_OUTPUT
leto: BOOL;
zima: BOOL;
END_VAR
VAR
m1: BOOL;
END_VAR
IF moonth>3 AND moonth<10 THEN m1:=1;
ELSE m1:=0;
END_IF
leto:=m1=1;
zima:=m1=0;
FUNCTION_BLOCK zima
VAR_INPUT
dt32: REAL;
dt15: REAL;
dt37: REAL;
hour: UINT;
set: BOOL;
t_o_h:REAL:=18;
t_o_l:REAL:=16;
END_VAR
VAR_OUTPUT
do4: BOOL;
do5: bool;
do7: BOOL;
END_VAR
VAR
rs40: RS;
RS50: RS;
rs2: RS;
rs3: RS;
rs_o: Rs;
END_VAR
rs40(set:=dt32<55 OR dt32=55, reset1:=dT32>60 OR dt32=60);
RS50(
SET:=dt15<plc_prg.ust_e_l_z OR dt15=plc_prg.ust_e_l_z,
reset1:=dt15>plc_prg.ust_e_h_z OR dt15=plc_prg.ust_e_h_z
);
rs2(set:= hour=23 OR hour>23 OR hour<8, reset1:= hour>8 AND hour<23);
rs3(set:=(hour=17 OR hour>17) AND hour<19, reset1:=hour<17 OR hour>19);
do4:=rs40.Q1 AND rs_o.Q1 AND set;
do5:=rs50.Q1 AND (rs2.Q1 OR rs3.Q1) AND set;
(*ОТПЛЕНИЕ*)
rs_o(set:=dt37<t_o_l OR dt37=t_o_l, reset1:=dt37>t_o_h);
do7:=rs_o.Q1 AND set;
(*ОТПЛЕНИЕ*)
FUNCTION_BLOCK leto
VAR_INPUT
hour: UINT;
set: BOOL;
dt_15: REAL;
END_VAR
VAR_OUTPUT
do5: BOOL;
END_VAR
VAR
rs1: RS;
rs2: Rs;
rs3: RS;
END_VAR
10. Парогенератор
FUNCTION_BLOCK Pechka
VAR_INPUT
set:BOOL;
di1:BOOL;
di2:BOOL;
di3:bool;
dt55:REAL;
mow_kvt:word;
END_VAR
VAR_OUTPUT
do3:BOOL;(*Слив*)
do8: BOOL;(*Подпитка*)
out1: BOOL;
END_VAR
VAR
rs1: Rs;
rs2: Rs;
tp1: Tp;
rs3: Rs;
ton22: Ton;
dsd: BOOL;
END_VAR
ton22(
in:=set,
pt:=T#10S
);
(*Подпитка*)
rs1(set:=ton22.Q AND di2=FALSE , reset1:=di3);
do8:=rs1.Q1 AND tp1.Q=0;
(*Подпитка*)
(*Слив*)
dsd:=ton22.Q AND di2=FALSE AND mow_kvt>2499;
rs2(set:= dsd , reset1:=tp1.Q=FALSE);
tp1(in:=rs2.Q1 AND ton22.Q ,pt:=T#20S);
do3:=tp1.Q;
(*Слив*)
rs3(set:=dt55<1, reset1:=dt55>1.8 OR dt55=1.8);
out1:=ton22.Q AND tp1.Q=0 AND rs3.Q1 AND rs1.Q1=FALSE AND tp1.Q=FALSE;
11. Парогенератор в режиме пара
FUNCTION_BLOCK par
VAR_INPUT
set:BOOL;
di2:BOOL;
di3:bool;
dt55: REAL;
mosh_kvt:WORD;
ust_h:REAL:=25;
ust_l:REAL:=24;
END_VAR
VAR_OUTPUT
do8: BOOL;
out1: BOOL;
END_VAR
VAR
rs1: Rs;
rs2: Rs;
rs3: Rs;
rs4: Rs;
x: INT:=0;
END_VAR
rs1(
set:=dt55<1.3,
reset1:=dt55=1.56 OR dt55>1.56
);
out1:=rs1.Q1 AND set;
rs3(
set:= set AND mosh_kvt>ust_h*100-500,
reset1:=set=FALSE
);
rs2(
set:= rs3.Q1 and mosh_kvt<ust_l*100,
reset1:= mosh_kvt=ust_h*100-500 OR mosh_kvt>ust_h*100-500 OR set=FALSE
);
IF rs4.Q1 AND set THEN x:=2;
ELSIF set=FALSE THEN x:=0;
END_IF
rs4(
set:= x=0 AND set,
reset1:= di3 OR set=FALSE
);
do8:=rs2.Q1 OR rs4.Q1;
12. режим ручной автомат
PROGRAM ru4_avto
VAR
out1r: BOOL;
out2r: BOOL;
out3r: BOOL;
out4r: BOOL;
out5r: BOOL;
out6r: BOOL;
out7r: BOOL;
out8r: BOOL;
rs1:rs;
END_VAR
VAR_INPUT
set: BOOL;
reset: BOOL;
out1: BOOL;
out2: BOOL;
out3: BOOL;
out4: BOOL;
out5: BOOL;
out6: BOOL;
out7: BOOL;
out8: BOOL;
END_VAR
VAR_OUTPUT
q1: BOOL;
q2: BOOL;
q3: BOOL;
q4: BOOL;
q5: BOOL;
q6: BOOL;
q7: BOOL;
q8: BOOL;
END_VAR
rs1(set:=set,reset1:=reset);
q1:=(out1 AND rs1.Q1= FALSE) OR ( out1r AND rs1.Q1);
q2:=(out2 AND rs1.Q1= FALSE) OR ( out2r AND rs1.Q1);
q3:=(out3 AND rs1.Q1= FALSE) OR ( out3r AND rs1.Q1);
q4:=(out4 AND rs1.Q1= FALSE) OR ( out4r AND rs1.Q1);
q5:=(out5 AND rs1.Q1= FALSE) OR ( out5r AND rs1.Q1);
q6:=(out6 AND rs1.Q1= FALSE) OR ( out6r AND rs1.Q1);
q7:=(out7 AND rs1.Q1= FALSE) OR ( out7r AND rs1.Q1);
q8:=(out8 AND rs1.Q1= FALSE) OR ( out8r AND rs1.Q1);
13.
FUNCTION_BLOCK kva_t
VAR_INPUT
kva:WORD;
END_VAR
VAR_OUTPUT
kva_to_dp:REAL;
END_VAR
VAR
END_VAR
kva_to_dp:=word_to_real(kva)/100;
14. Обеденеяяем все программы (основная программа)
ПРИЛОЖЕНИЕ Ж
Дата добавления: 2018-04-05; просмотров: 281; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!