Не могу найти ошибку, хоть тресни.
Текущий код:
Где тут кроется ошибка?Код:(*IF bd<>0 THEN bd:=0; END_IF; (*Инициализация*)*) tim_strt (IN:=strt_plc , PT:=T#10s); (*инициализация старта плк*) strt_plc:=tim_strt.q; (*по окончании 10 секунд после старта снимаем флаг включения питания*) rtr_a220 (CLK:= avar_220v AND NOT tim_strt.q, Q=> ); (*Фронт пропажи напряжения*) rtr_strt (CLK:= strt_plc, Q=>); (*Фронт старта плк*) IF hour=3 THEN period_save:=TRUE; END_IF; (*Каждые сутки в 3 часа происходит сохранение настроек*) rtr_psave (CLK:=period_save, Q=>); (*Фронт периодического сохранения*) (*bl_save(ENABLE:= TRUE, TIMELOW:= T#86399s, TIMEHIGH:= T#1s, OUT=> ); (*Генератор импульсов для сохранения с заданным периодом*)*) rtr_bls(CLK:= rtr_psave.Q OR savebut, Q=> ); (*savebut - в конфигурации*) IF rtr_strt.Q THEN (*Если плк включился*) bdstatus:=3; (*Начинаем чтение файла*) END_IF; IF ((*rtr_a220.Q OR *)rtr_bls.Q) AND (bdstatus=0 AND NOT tim_strt.q) THEN (*Если появился сигнал исчезновения напряжения, а также раз в 24 часа или по нажатию копки сохранения*) bdstatus:=1; (*Выполняем сохранение*) END_IF; CASE bdstatus OF 1: (*Сохраняем текущие значения в структуру базы данных*) bdsave.day_ust:=day_ust; bdsave.night_ust:=night_ust; bdsave.hh_day:=hh_day; bdsave.mm_day:=mm_day; bdsave.hh_night:=hh_night; bdsave.mm_night:=mm_night; bdsave.ddvh_off:=ddvh_off; bdsave.ddvyh_max:=ddvyh_max; bdsave.ddvh_max:=ddvh_max; bdsave.Kp:=Kp; bdsave.Ti:=Ti; bdsave.pid_ust:=pid_ust; bdsave.sbros:=sbros; bdsave.t_sbros:=t_sbros; bdsave.sbros_max:=sbros_max; bdsave.sbros_count:=sbros_count; bdsave.count_num:=count_num; bdsave.ntp_yes:=ntp_yes; bdsave.gmt:=gmt; bdsave.listNum:=listNum; bdstatus:=2; (*Сохранение данных в файл*) 2: (*Запись структуры уставок в файл*) file:=SysFileOpen('sets.bin', 'w'); (*Открываем файл для записи, если файла нет, то создается новый*) IF file=0 THEN error_rwfile:=TRUE; (*Ошибка открытия/создания файла*) RETURN; (*В этом случае пытаемся открыть файл повторно*) ELSE wr_byte:=SysFileWrite(file,ADR(bdsave),SIZEOF(bdsave)); (*Получаем количество записанных байт*) IF wr_byte=SIZEOF(bdsave) THEN (*Если равно размеру базы данных*) SysFileClose(file); (*Закрываем файл*) bd.0:=SysFileClose(file); (*Флаг - Файл успешно записан и закрыт*) ELSE bd.1:=TRUE; (*Флаг - Файл не сохранен*) END_IF; END_IF; bdstatus:=0; (*Запись окончена*) 3: (*Чтение*) file:=SysFileOpen('sets.bin', 'r'); (*Открытие файла для чтения*) IF file=0 THEN (*Ошибка открытия файла (файл не существует)*) bd.2:=TRUE; (*Флаг - Не найден файл с уставками*) bdstatus:=5; (*Переход на заводские настройки*) ELSE rd_byte:=SysFileRead(file,ADR(buf_bdsave),SIZEOF(buf_bdsave)); (*Считываем данные из файла в структуру (в буфер)*) IF SIZEOF(buf_bdsave)=rd_byte THEN (*Если файл считан*) SysFileClose(file); (*Закрываем файл*) (* IF SysFileClose(file) THEN (*Файл успешно закрыт*)*) bdstatus:=4; (*Если файл извлечен - копируем в базу*) ELSE bd.3:=TRUE; (*Ошибка извлечения файла*) bdstatus:=5; (*Сброс на заводские параметры*) (*END_IF;*) END_IF; END_IF; 4: (*Сохраняем буфер в текущую структуру*) bdsave:=buf_bdsave; bd.4:=TRUE; (*Настройки успешно сохранены *) bdstatus:=0; 5: (*Сброс на заводские параметры*) bdsave.day_ust:=4; bdsave.night_ust:=4; bdsave.hh_day:=5; bdsave.mm_day:=0; bdsave.hh_night:=1; bdsave.mm_night:=0; bdsave.ddvh_off:=TRUE; bdsave.ddvyh_max:=10; bdsave.ddvh_max:=10; bdsave.Kp:=0.01; bdsave.Ti:=0.3; bdsave.pid_ust:=25; bdsave.sbros:=TRUE; bdsave.t_sbros:=5; bdsave.sbros_max:=5; bdsave.sbros_count:=0; bdsave.count_num:=1; bdsave.ntp_yes:=TRUE; bdsave.gmt:=2; listNum[0]:=111234567; listNum[1]:=0; listNum[2]:=0; listNum[3]:=0; listNum[4]:=0; bdsave.listNum:=listNum; bd.5:=TRUE; (*Настройки сброшены на заводские*) bdstatus:=2; END_CASE IF bdsave.day_ust=0 THEN (*В случае нулевого значения дневной уставки*) bdstatus:=5; (*Сброс на заводские параметры*) END_IF; IF bd.4 OR bd.5 THEN (*Если настройки сброшены на заводские или успешно извлечены из файла - выполняем присвоение переменных*) day_ust:=bdsave.day_ust; night_ust:=bdsave.night_ust; hh_day:=bdsave.hh_day; mm_day:=bdsave.mm_day; hh_night:=bdsave.hh_night; mm_night:=bdsave.mm_night; ddvh_off:=bdsave.ddvh_off; ddvyh_max:=bdsave.ddvyh_max; ddvh_max:=bdsave.ddvh_max; Kp:=bdsave.Kp; Ti:=bdsave.Ti; pid_ust:=bdsave.pid_ust; sbros:=bdsave.sbros; t_sbros:=bdsave.t_sbros; sbros_max:=bdsave.sbros_max; sbros_count:=bdsave.sbros_count; count_num:=bdsave.count_num; ntp_yes:=bdsave.ntp_yes; gmt:=bdsave.gmt; listNum:=bdsave.listNum; bd.6:=TRUE; END_IF; IF bd.6 THEN (*После присвоения значений переменным, отправляем их на панель*) p_hh:=hour; (*запись в регистры значений уставок и времени из энергонезависимой памяти*) p_mm:=minute; p_ss:=second; p_dd:=day; p_mh:=month; p_yy:=year; p_hh_day:=hh_day; (*часы начала дневного режима*) p_mm_day:=mm_day; (*минуты начала дневного времени*) p_hh_night:=hh_night; (*часы начала ночного времени*) p_mm_night:=mm_night; (*минуты начала ночного времени*) p_Pin:=Pin; (*входное давление*) p_Pout:=Pfact; (*выходное давление*) p_day_ust:=day_ust; (*дневная уставка давления*) p_night_ust:=night_ust; (*ночная уставка давления*) p_pid_ust:=pid_ust; (*выход в вольтах сигнала управления с регулятора при неисправности ДДвых.*) p_ddvh_off:=ddvh_off; (*исключение входного ДД из аварийного оповещения*) p_ddvyh_max:=ddvyh_max; (*максимальное значение выходного датчика давления*) p_ddvh_max:=ddvh_max; (*максимальное значение входного датчика давления*) p_Kp:=Kp; (*Пропорциональный коэффициент ПИД-регулятора*) p_Ti:=Ti; (*Интегральный коэффициент ПИД-регулятора*) p_count_num:=BYTE_TO_WORD(count_num); (*Количество номеров, на которое нужно отправить аварийные сообщения*) p_sbros:=sbros; (*Сброс аварии ПЧ разрешен*) p_t_sbros:=t_sbros; (*Задержка времени перед сбросом аварии ПЧ*) p_sbros_max:=sbros_max; (*Максимальное количество попыток сброса аварии ПЧ*) p_sbros_count:=sbros_count; (*Количество попыток сброса аварии*) p_ntp_yes:=ntp_yes; (*Разрешение синхронизации времени по интернет*) p_gmt:=gmt; (*Часовой пояс*) phone_num1:=listNum[0]; (*Присвоение первого телефонного номера*) phone_num2:=listNum[1]; (*Присвоение второго телефонного номера*) phone_num3:=listNum[2]; (*Присвоение третьего телефонного номера*) phone_num4:=listNum[3]; (*Присвоение четвертого телефонного номера*) phone_num5:=listNum[4]; (*Присвоение пятого телефонного номера*) bd:=0; END_IF; IF NOT pow THEN (*если произошло отключение питания*) strt_plc:=TRUE; (*выставляем флаг отключения питания*) END_IF; siz:=SIZEOF(bdsave); (*Размер базы данных*) siz_buf:=SIZEOF(buf_bdsave);




Ответить с цитированием