Добрый день! Не могу разобраться. Пишу структуру уставок в файл. После перезагрузки плк уставки должны читаться из файла, либо при ошибке чтения сбрасываться на настройки по умолчанию. Всё работает, ошибок не отследил, но при перезагрузке настройки сбрасываются на "по умолчанию", хотя ошибок чтения файла нет. Может где-то что-то не правильно?
Код:
Код:
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; (*Íà÷èíàåì ÷òåíèå ôàéëà*)
ELSIF (rtr_a220.Q OR rtr_bls.Q) AND bdstatus=0 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]:=114555541;
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);