Просмотр полной версии : Запись в файл
Alex12345
14.01.2013, 18:04
Здравствуйте !
имеется массив ar:array [1..1000] of real
нужно каждое ar[i] записать в *.txt файл
как это сделать?:confused:
Здравствуйте, Alex12345.
Здравствуйте !
имеется массив ar:array [1..1000] of real
нужно каждое ar[i] записать в *.txt файл
как это сделать?:confused:
а где находится файл? куда собираемся писать?
Александр Приходько
15.01.2013, 00:58
Рекомендую посмотреть данный пример:
http://kipshop.ru/Primeri/Samples_plc1xx/Samples/08_Archiver.zip
Находится он в разделе примеров.
http://www.owen.ru/forum/showthread.php?t=13588
Там 2 примера, один с текстовым файлом. Лишнее можете убрать и частично проект взять за основу.
VAR
ar: ARRAY [1..1000] OF REAL;
fileHandle, index: DWORD;
buf: STRING;
END_VAR
fileHandle := SysFileOpen('test.txt', 'w');
IF fileHandle > 0 THEN
FOR index := 1 TO 1000 DO
buf := CONCAT(REAL_TO_STRING(ar[index]), '$r$n');
SysFileWrite(fileHandle, ADR(buf), LEN(buf));
END_FOR
END_IF
SysFileClose(fileHandle);
Alex12345
17.01.2013, 17:54
Здравствуйте, Alex12345.
а где находится файл? куда собираемся писать?
пока только на компьютер
VAR
ar: ARRAY [1..1000] OF REAL;
fileHandle, index: DWORD;
buf: STRING;
END_VAR
fileHandle := SysFileOpen('test.txt', 'w');
IF fileHandle > 0 THEN
FOR index := 1 TO 1000 DO
buf := CONCAT(REAL_TO_STRING(ar[index]), '$r$n');
SysFileWrite(fileHandle, ADR(buf), LEN(buf));
END_FOR
END_IF
SysFileClose(fileHandle);
SysFileOpen (врайт и клос тоже) не распознает как команду (((
пытаеться определить как переменную
видимо вы какую то библиотеку используете. которой, к сожалению, у меня нет :o
пока только на компьютер
SysFileOpen (врайт и клос тоже) не распознает как команду (((
пытаеться определить как переменную
видимо вы какую то библиотеку используете. которой, к сожалению, у меня нет :o
так возьмите и вставте http://kipshop.ru/CoDeSys/bibl/Lib_CoDeSys_PLC1xx_v8.12.zip
SysLibFile.lib
пока только на компьютерЭто сложнее. Я показал как записывать на ПЛК. Для выкачивания файла можно воспользоваться консольными утилитами put/get. Пускай кто-нибудь ссылку на них даст, у кого есть.
svema201
13.03.2013, 02:01
Тренд пишется на жесткий, возможно открыть экзелем. А как же быть если требуется писать форматированную строку параметров в текстовик на компьютере?
Связь с ПЛК150 по ethernet, протокол овен.
SysFileWrite может писать в расшаренную сетевую папку с указанием абсолютного пути или никуда кроме памяти контроллера?
SysFileWrite может писать в расшаренную сетевую папку с указанием абсолютного пути или никуда кроме памяти контроллера?Только в контроллер.
Если на компе у вас только кодесис и егошний ЧМИ, то единственный выход — писать в файл на контроллер и периодически доставать оттуда консольными утилитами put/get.
Добрый день! Не могу разобраться. Пишу структуру уставок в файл. После перезагрузки плк уставки должны читаться из файла, либо при ошибке чтения сбрасываться на настройки по умолчанию. Всё работает, ошибок не отследил, но при перезагрузке настройки сбрасываются на "по умолчанию", хотя ошибок чтения файла нет. Может где-то что-то не правильно?
Код:
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(bdsa ve)); (*Ïîëó÷àåì êîëè÷åñòâî çàïèñàííûõ áàéò*)
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(b uf_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);
Добрый день! Не могу разобраться. Пишу структуру уставок в файл. После перезагрузки плк уставки должны читаться из файла, либо при ошибке чтения сбрасываться на настройки по умолчанию. Всё работает, ошибок не отследил, но при перезагрузке настройки сбрасываются на "по умолчанию", хотя ошибок чтения файла нет. Может где-то что-то не правильно?
Код:
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(bdsa ve)); (*Ïîëó÷àåì êîëè÷åñòâî çàïèñàííûõ áàéò*)
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(b uf_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);
Коментарии очень помогли понять Ваш алгоритм:rolleyes:
Да,капец, как раз сижу пытаюсь их сконвертировать
Проще наверное так :)
17213
http://www.artlebedev.ru/tools/decoder/
Пользуйтесь на здоровье :)
http://www.artlebedev.ru/tools/decoder/
Пользуйтесь на здоровье :)
Супер, спасибо :)
Не могу найти ошибку, хоть тресни.
Текущий код:
(*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(bdsa ve)); (*Получаем количество записанных байт*)
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(b uf_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);
Где тут кроется ошибка?
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot