Определение конструктивных размеров трехфазной электродной системы пароводонагревателя мощностью 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!