PDA

Просмотр полной версии : Запись в файл



Alex12345
14.01.2013, 18:04
Здравствуйте !
имеется массив ar:array [1..1000] of real
нужно каждое ar[i] записать в *.txt файл
как это сделать?:confused:

Gans
14.01.2013, 18:35
Здравствуйте, 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 примера, один с текстовым файлом. Лишнее можете убрать и частично проект взять за основу.

Yegor
16.01.2013, 11:41
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

capzap
17.01.2013, 19:09
пока только на компьютер



SysFileOpen (врайт и клос тоже) не распознает как команду (((
пытаеться определить как переменную
видимо вы какую то библиотеку используете. которой, к сожалению, у меня нет :o

так возьмите и вставте http://kipshop.ru/CoDeSys/bibl/Lib_CoDeSys_PLC1xx_v8.12.zip
SysLibFile.lib

Yegor
18.01.2013, 09:56
пока только на компьютерЭто сложнее. Я показал как записывать на ПЛК. Для выкачивания файла можно воспользоваться консольными утилитами put/get. Пускай кто-нибудь ссылку на них даст, у кого есть.

svema201
13.03.2013, 02:01
Тренд пишется на жесткий, возможно открыть экзелем. А как же быть если требуется писать форматированную строку параметров в текстовик на компьютере?
Связь с ПЛК150 по ethernet, протокол овен.
SysFileWrite может писать в расшаренную сетевую папку с указанием абсолютного пути или никуда кроме памяти контроллера?

Yegor
13.03.2013, 09:25
SysFileWrite может писать в расшаренную сетевую папку с указанием абсолютного пути или никуда кроме памяти контроллера?Только в контроллер.

Если на компе у вас только кодесис и егошний ЧМИ, то единственный выход — писать в файл на контроллер и периодически доставать оттуда консольными утилитами put/get.

energvk
18.03.2015, 09:55
Добрый день! Не могу разобраться. Пишу структуру уставок в файл. После перезагрузки плк уставки должны читаться из файла, либо при ошибке чтения сбрасываться на настройки по умолчанию. Всё работает, ошибок не отследил, но при перезагрузке настройки сбрасываются на "по умолчанию", хотя ошибок чтения файла нет. Может где-то что-то не правильно?

Код:

IF bd<>0 THEN bd:=0; END_IF; (*&#200;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255;*)
tim_strt (IN:=strt_plc , PT:=T#10s); (*&#232;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255; &#241;&#242;&#224;&#240;&#242;&#224; &#239;&#235;&#234;*)
strt_plc:=tim_strt.q; (*&#239;&#238; &#238;&#234;&#238;&#237;&#247;&#224;&#237;&#232;&#232; 10 &#241;&#229;&#234;&#243;&#237;&#228; &#239;&#238;&#241;&#235;&#229; &#241;&#242;&#224;&#240;&#242;&#224; &#241;&#237;&#232;&#236;&#224;&#229;&#236; &#244;&#235;&#224;&#227; &#226;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#239;&#232;&#242;&#224;&#237;&#232;&#255;*)
rtr_a220 (CLK:= avar_220v AND NOT tim_strt.q, Q=> ); (*&#212;&#240;&#238;&#237;&#242; &#239;&#240;&#238;&#239;&#224;&#230;&#232; &#237;&#224;&#239;&#240;&#255;&#230;&#229;&#237;&#232;&#255;*)
rtr_strt (CLK:= strt_plc, Q=>); (*&#212;&#240;&#238;&#237;&#242; &#241;&#242;&#224;&#240;&#242;&#224; &#239;&#235;&#234;*)
IF hour=3 THEN period_save:=TRUE; END_IF; (*&#202;&#224;&#230;&#228;&#251;&#229; &#241;&#243;&#242;&#234;&#232; &#226; 3 &#247;&#224;&#241;&#224; &#239;&#240;&#238;&#232;&#241;&#245;&#238;&#228;&#232;&#242; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#229; &#237;&#224;&#241;&#242;&#240;&#238;&#229;&#234;*)
rtr_psave (CLK:=period_save, Q=>); (*&#212;&#240;&#238;&#237;&#242; &#239;&#229;&#240;&#232;&#238;&#228;&#232;&#247;&#229;&#241;&#234;&#238;&#227;&#238; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255;*)
(*bl_save(ENABLE:= TRUE, TIMELOW:= T#86399s, TIMEHIGH:= T#1s, OUT=> ); (*&#195;&#229;&#237;&#229;&#240;&#224;&#242;&#238;&#240; &#232;&#236;&#239;&#243;&#235;&#252;&#241;&#238;&#226; &#228;&#235;&#255; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255; &#241; &#231;&#224;&#228;&#224;&#237;&#237;&#251;&#236; &#239;&#229;&#240;&#232;&#238;&#228;&#238;&#236;*)*)
rtr_bls(CLK:= rtr_psave.Q OR savebut, Q=> ); (*savebut - &#226; &#234;&#238;&#237;&#244;&#232;&#227;&#243;&#240;&#224;&#246;&#232;&#232;*)

IF rtr_strt.Q THEN (*&#197;&#241;&#235;&#232; &#239;&#235;&#234; &#226;&#234;&#235;&#254;&#247;&#232;&#235;&#241;&#255;*)
bdstatus:=3; (*&#205;&#224;&#247;&#232;&#237;&#224;&#229;&#236; &#247;&#242;&#229;&#237;&#232;&#229; &#244;&#224;&#233;&#235;&#224;*)
ELSIF (rtr_a220.Q OR rtr_bls.Q) AND bdstatus=0 THEN (*&#197;&#241;&#235;&#232; &#239;&#238;&#255;&#226;&#232;&#235;&#241;&#255; &#241;&#232;&#227;&#237;&#224;&#235; &#232;&#241;&#247;&#229;&#231;&#237;&#238;&#226;&#229;&#237;&#232;&#255; &#237;&#224;&#239;&#240;&#255;&#230;&#229;&#237;&#232;&#255;, &#224; &#242;&#224;&#234;&#230;&#229; &#240;&#224;&#231; &#226; 24 &#247;&#224;&#241;&#224; &#232;&#235;&#232; &#239;&#238; &#237;&#224;&#230;&#224;&#242;&#232;&#254; &#234;&#238;&#239;&#234;&#232; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255;*)
bdstatus:=1; (*&#194;&#251;&#239;&#238;&#235;&#237;&#255;&#229;&#236; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#229;*)
END_IF;

CASE bdstatus OF
1: (*&#209;&#238;&#245;&#240;&#224;&#237;&#255;&#229;&#236; &#242;&#229;&#234;&#243;&#249;&#232;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#226; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#243; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;*)
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; (*&#209;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#229; &#228;&#224;&#237;&#237;&#251;&#245; &#226; &#244;&#224;&#233;&#235;*)

2: (*&#199;&#224;&#239;&#232;&#241;&#252; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#251; &#243;&#241;&#242;&#224;&#226;&#238;&#234; &#226; &#244;&#224;&#233;&#235;*)
file:=SysFileOpen('sets.bin', 'w'); (*&#206;&#242;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235; &#228;&#235;&#255; &#231;&#224;&#239;&#232;&#241;&#232;, &#229;&#241;&#235;&#232; &#244;&#224;&#233;&#235;&#224; &#237;&#229;&#242;, &#242;&#238; &#241;&#238;&#231;&#228;&#224;&#229;&#242;&#241;&#255; &#237;&#238;&#226;&#251;&#233;*)
IF file=0 THEN error_rwfile:=TRUE; (*&#206;&#248;&#232;&#225;&#234;&#224; &#238;&#242;&#234;&#240;&#251;&#242;&#232;&#255;/&#241;&#238;&#231;&#228;&#224;&#237;&#232;&#255; &#244;&#224;&#233;&#235;&#224;*)
RETURN; (*&#194; &#253;&#242;&#238;&#236; &#241;&#235;&#243;&#247;&#224;&#229; &#239;&#251;&#242;&#224;&#229;&#236;&#241;&#255; &#238;&#242;&#234;&#240;&#251;&#242;&#252; &#244;&#224;&#233;&#235; &#239;&#238;&#226;&#242;&#238;&#240;&#237;&#238;*)
ELSE
wr_byte:=SysFileWrite(file,ADR(bdsave),SIZEOF(bdsa ve)); (*&#207;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#231;&#224;&#239;&#232;&#241;&#224;&#237;&#237;&#251;&#245; &#225;&#224;&#233;&#242;*)
IF wr_byte=SIZEOF(bdsave) THEN (*&#197;&#241;&#235;&#232; &#240;&#224;&#226;&#237;&#238; &#240;&#224;&#231;&#236;&#229;&#240;&#243; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;*)
SysFileClose(file); (*&#199;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235;*)
bd.0:=SysFileClose(file); (*&#212;&#235;&#224;&#227; - &#212;&#224;&#233;&#235; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#231;&#224;&#239;&#232;&#241;&#224;&#237; &#232; &#231;&#224;&#234;&#240;&#251;&#242;*)
ELSE bd.1:=TRUE; (*&#212;&#235;&#224;&#227; - &#212;&#224;&#233;&#235; &#237;&#229; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;*)
END_IF;
END_IF;
bdstatus:=0; (*&#199;&#224;&#239;&#232;&#241;&#252; &#238;&#234;&#238;&#237;&#247;&#229;&#237;&#224;*)

3: (*&#215;&#242;&#229;&#237;&#232;&#229;*)
file:=SysFileOpen('sets.bin', 'r'); (*&#206;&#242;&#234;&#240;&#251;&#242;&#232;&#229; &#244;&#224;&#233;&#235;&#224; &#228;&#235;&#255; &#247;&#242;&#229;&#237;&#232;&#255;*)
IF file=0 THEN (*&#206;&#248;&#232;&#225;&#234;&#224; &#238;&#242;&#234;&#240;&#251;&#242;&#232;&#255; &#244;&#224;&#233;&#235;&#224; (&#244;&#224;&#233;&#235; &#237;&#229; &#241;&#243;&#249;&#229;&#241;&#242;&#226;&#243;&#229;&#242;)*)
bd.2:=TRUE; (*&#212;&#235;&#224;&#227; - &#205;&#229; &#237;&#224;&#233;&#228;&#229;&#237; &#244;&#224;&#233;&#235; &#241; &#243;&#241;&#242;&#224;&#226;&#234;&#224;&#236;&#232;*)
bdstatus:=5; (*&#207;&#229;&#240;&#229;&#245;&#238;&#228; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232;*)
ELSE
rd_byte:=SysFileRead(file,ADR(buf_bdsave),SIZEOF(b uf_bdsave)); (*&#209;&#247;&#232;&#242;&#251;&#226;&#224;&#229;&#236; &#228;&#224;&#237;&#237;&#251;&#229; &#232;&#231; &#244;&#224;&#233;&#235;&#224; &#226; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#243; (&#226; &#225;&#243;&#244;&#229;&#240;)*)
IF SIZEOF(buf_bdsave)=rd_byte THEN (*&#197;&#241;&#235;&#232; &#244;&#224;&#233;&#235; &#241;&#247;&#232;&#242;&#224;&#237;*)
SysFileClose(file); (*&#199;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235;*)
(* IF SysFileClose(file) THEN (*&#212;&#224;&#233;&#235; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#231;&#224;&#234;&#240;&#251;&#242;*)*)
bdstatus:=4; (*&#197;&#241;&#235;&#232; &#244;&#224;&#233;&#235; &#232;&#231;&#226;&#235;&#229;&#247;&#229;&#237; - &#234;&#238;&#239;&#232;&#240;&#243;&#229;&#236; &#226; &#225;&#224;&#231;&#243;*)
ELSE
bd.3:=TRUE; (*&#206;&#248;&#232;&#225;&#234;&#224; &#232;&#231;&#226;&#235;&#229;&#247;&#229;&#237;&#232;&#255; &#244;&#224;&#233;&#235;&#224;*)
bdstatus:=5; (*&#209;&#225;&#240;&#238;&#241; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;*)
(*END_IF;*)
END_IF;
END_IF;

4: (*&#209;&#238;&#245;&#240;&#224;&#237;&#255;&#229;&#236; &#225;&#243;&#244;&#229;&#240; &#226; &#242;&#229;&#234;&#243;&#249;&#243;&#254; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#243;*)
bdsave:=buf_bdsave;
bd.4:=TRUE; (*&#205;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#251; *)
bdstatus:=0;

5: (*&#209;&#225;&#240;&#238;&#241; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;*)
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; (*&#205;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232; &#241;&#225;&#240;&#238;&#248;&#229;&#237;&#251; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229;*)
bdstatus:=2;
END_CASE

IF bdsave.day_ust=0 THEN (*&#194; &#241;&#235;&#243;&#247;&#224;&#229; &#237;&#243;&#235;&#229;&#226;&#238;&#227;&#238; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#228;&#237;&#229;&#226;&#237;&#238;&#233; &#243;&#241;&#242;&#224;&#226;&#234;&#232;*)
bdstatus:=5; (*&#209;&#225;&#240;&#238;&#241; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;*)
END_IF;

IF bd.4 OR bd.5 THEN (*&#197;&#241;&#235;&#232; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232; &#241;&#225;&#240;&#238;&#248;&#229;&#237;&#251; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#232;&#235;&#232; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#232;&#231;&#226;&#235;&#229;&#247;&#229;&#237;&#251; &#232;&#231; &#244;&#224;&#233;&#235;&#224; - &#226;&#251;&#239;&#238;&#235;&#237;&#255;&#229;&#236; &#239;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#251;&#245;*)
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 (*&#207;&#238;&#241;&#235;&#229; &#239;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#255; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#233; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#251;&#236;, &#238;&#242;&#239;&#240;&#224;&#226;&#235;&#255;&#229;&#236; &#232;&#245; &#237;&#224; &#239;&#224;&#237;&#229;&#235;&#252;*)
p_hh:=hour; (*&#231;&#224;&#239;&#232;&#241;&#252; &#226; &#240;&#229;&#227;&#232;&#241;&#242;&#240;&#251; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#233; &#243;&#241;&#242;&#224;&#226;&#238;&#234; &#232; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#232;&#231; &#253;&#237;&#229;&#240;&#227;&#238;&#237;&#229;&#231;&#224;&#226;&#232;&#241;&#232;&#236;&#238;&#233; &#239;&#224;&#236;&#255;&#242;&#232;*)
p_mm:=minute;
p_ss:=second;
p_dd:=day;
p_mh:=month;
p_yy:=year;
p_hh_day:=hh_day; (*&#247;&#224;&#241;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#228;&#237;&#229;&#226;&#237;&#238;&#227;&#238; &#240;&#229;&#230;&#232;&#236;&#224;*)
p_mm_day:=mm_day; (*&#236;&#232;&#237;&#243;&#242;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#228;&#237;&#229;&#226;&#237;&#238;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;*)
p_hh_night:=hh_night; (*&#247;&#224;&#241;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#237;&#238;&#247;&#237;&#238;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;*)
p_mm_night:=mm_night; (*&#236;&#232;&#237;&#243;&#242;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#237;&#238;&#247;&#237;&#238;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;*)
p_Pin:=Pin; (*&#226;&#245;&#238;&#228;&#237;&#238;&#229; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#229;*)
p_Pout:=Pfact; (*&#226;&#251;&#245;&#238;&#228;&#237;&#238;&#229; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#229;*)
p_day_ust:=day_ust; (*&#228;&#237;&#229;&#226;&#237;&#224;&#255; &#243;&#241;&#242;&#224;&#226;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_night_ust:=night_ust; (*&#237;&#238;&#247;&#237;&#224;&#255; &#243;&#241;&#242;&#224;&#226;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_pid_ust:=pid_ust; (*&#226;&#251;&#245;&#238;&#228; &#226; &#226;&#238;&#235;&#252;&#242;&#224;&#245; &#241;&#232;&#227;&#237;&#224;&#235;&#224; &#243;&#239;&#240;&#224;&#226;&#235;&#229;&#237;&#232;&#255; &#241; &#240;&#229;&#227;&#243;&#235;&#255;&#242;&#238;&#240;&#224; &#239;&#240;&#232; &#237;&#229;&#232;&#241;&#239;&#240;&#224;&#226;&#237;&#238;&#241;&#242;&#232; &#196;&#196;&#226;&#251;&#245;.*)
p_ddvh_off:=ddvh_off; (*&#232;&#241;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#226;&#245;&#238;&#228;&#237;&#238;&#227;&#238; &#196;&#196; &#232;&#231; &#224;&#226;&#224;&#240;&#232;&#233;&#237;&#238;&#227;&#238; &#238;&#239;&#238;&#226;&#229;&#249;&#229;&#237;&#232;&#255;*)
p_ddvyh_max:=ddvyh_max; (*&#236;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#226;&#251;&#245;&#238;&#228;&#237;&#238;&#227;&#238; &#228;&#224;&#242;&#247;&#232;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_ddvh_max:=ddvh_max; (*&#236;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#226;&#245;&#238;&#228;&#237;&#238;&#227;&#238; &#228;&#224;&#242;&#247;&#232;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_Kp:=Kp; (*&#207;&#240;&#238;&#239;&#238;&#240;&#246;&#232;&#238;&#237;&#224;&#235;&#252;&#237;&#251;&#233; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242; &#207;&#200;&#196;-&#240;&#229;&#227;&#243;&#235;&#255;&#242;&#238;&#240;&#224;*)
p_Ti:=Ti; (*&#200;&#237;&#242;&#229;&#227;&#240;&#224;&#235;&#252;&#237;&#251;&#233; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242; &#207;&#200;&#196;-&#240;&#229;&#227;&#243;&#235;&#255;&#242;&#238;&#240;&#224;*)
p_count_num:=BYTE_TO_WORD(count_num); (*&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#237;&#238;&#236;&#229;&#240;&#238;&#226;, &#237;&#224; &#234;&#238;&#242;&#238;&#240;&#238;&#229; &#237;&#243;&#230;&#237;&#238; &#238;&#242;&#239;&#240;&#224;&#226;&#232;&#242;&#252; &#224;&#226;&#224;&#240;&#232;&#233;&#237;&#251;&#229; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#255;*)
p_sbros:=sbros; (*&#209;&#225;&#240;&#238;&#241; &#224;&#226;&#224;&#240;&#232;&#232; &#207;&#215; &#240;&#224;&#231;&#240;&#229;&#248;&#229;&#237;*)
p_t_sbros:=t_sbros; (*&#199;&#224;&#228;&#229;&#240;&#230;&#234;&#224; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#239;&#229;&#240;&#229;&#228; &#241;&#225;&#240;&#238;&#241;&#238;&#236; &#224;&#226;&#224;&#240;&#232;&#232; &#207;&#215;*)
p_sbros_max:=sbros_max; (*&#204;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#239;&#238;&#239;&#251;&#242;&#238;&#234; &#241;&#225;&#240;&#238;&#241;&#224; &#224;&#226;&#224;&#240;&#232;&#232; &#207;&#215;*)
p_sbros_count:=sbros_count; (*&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#239;&#238;&#239;&#251;&#242;&#238;&#234; &#241;&#225;&#240;&#238;&#241;&#224; &#224;&#226;&#224;&#240;&#232;&#232;*)
p_ntp_yes:=ntp_yes; (*&#208;&#224;&#231;&#240;&#229;&#248;&#229;&#237;&#232;&#229; &#241;&#232;&#237;&#245;&#240;&#238;&#237;&#232;&#231;&#224;&#246;&#232;&#232; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#239;&#238; &#232;&#237;&#242;&#229;&#240;&#237;&#229;&#242;*)
p_gmt:=gmt; (*&#215;&#224;&#241;&#238;&#226;&#238;&#233; &#239;&#238;&#255;&#241;*)
phone_num1:=listNum[0]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#239;&#229;&#240;&#226;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num2:=listNum[1]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#226;&#242;&#238;&#240;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num3:=listNum[2]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#242;&#240;&#229;&#242;&#252;&#229;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num4:=listNum[3]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#247;&#229;&#242;&#226;&#229;&#240;&#242;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num5:=listNum[4]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#239;&#255;&#242;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
bd:=0;
END_IF;

IF NOT pow THEN (*&#229;&#241;&#235;&#232; &#239;&#240;&#238;&#232;&#231;&#238;&#248;&#235;&#238; &#238;&#242;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#239;&#232;&#242;&#224;&#237;&#232;&#255;*)
strt_plc:=TRUE; (*&#226;&#251;&#241;&#242;&#224;&#226;&#235;&#255;&#229;&#236; &#244;&#235;&#224;&#227; &#238;&#242;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#239;&#232;&#242;&#224;&#237;&#232;&#255;*)
END_IF;
siz:=SIZEOF(bdsave); (*&#208;&#224;&#231;&#236;&#229;&#240; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;*)
siz_buf:=SIZEOF(buf_bdsave);

petera
18.03.2015, 10:41
Добрый день! Не могу разобраться. Пишу структуру уставок в файл. После перезагрузки плк уставки должны читаться из файла, либо при ошибке чтения сбрасываться на настройки по умолчанию. Всё работает, ошибок не отследил, но при перезагрузке настройки сбрасываются на "по умолчанию", хотя ошибок чтения файла нет. Может где-то что-то не правильно?

Код:

IF bd<>0 THEN bd:=0; END_IF; (*&#200;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255;*)
tim_strt (IN:=strt_plc , PT:=T#10s); (*&#232;&#237;&#232;&#246;&#232;&#224;&#235;&#232;&#231;&#224;&#246;&#232;&#255; &#241;&#242;&#224;&#240;&#242;&#224; &#239;&#235;&#234;*)
strt_plc:=tim_strt.q; (*&#239;&#238; &#238;&#234;&#238;&#237;&#247;&#224;&#237;&#232;&#232; 10 &#241;&#229;&#234;&#243;&#237;&#228; &#239;&#238;&#241;&#235;&#229; &#241;&#242;&#224;&#240;&#242;&#224; &#241;&#237;&#232;&#236;&#224;&#229;&#236; &#244;&#235;&#224;&#227; &#226;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#239;&#232;&#242;&#224;&#237;&#232;&#255;*)
rtr_a220 (CLK:= avar_220v AND NOT tim_strt.q, Q=> ); (*&#212;&#240;&#238;&#237;&#242; &#239;&#240;&#238;&#239;&#224;&#230;&#232; &#237;&#224;&#239;&#240;&#255;&#230;&#229;&#237;&#232;&#255;*)
rtr_strt (CLK:= strt_plc, Q=>); (*&#212;&#240;&#238;&#237;&#242; &#241;&#242;&#224;&#240;&#242;&#224; &#239;&#235;&#234;*)
IF hour=3 THEN period_save:=TRUE; END_IF; (*&#202;&#224;&#230;&#228;&#251;&#229; &#241;&#243;&#242;&#234;&#232; &#226; 3 &#247;&#224;&#241;&#224; &#239;&#240;&#238;&#232;&#241;&#245;&#238;&#228;&#232;&#242; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#229; &#237;&#224;&#241;&#242;&#240;&#238;&#229;&#234;*)
rtr_psave (CLK:=period_save, Q=>); (*&#212;&#240;&#238;&#237;&#242; &#239;&#229;&#240;&#232;&#238;&#228;&#232;&#247;&#229;&#241;&#234;&#238;&#227;&#238; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255;*)
(*bl_save(ENABLE:= TRUE, TIMELOW:= T#86399s, TIMEHIGH:= T#1s, OUT=> ); (*&#195;&#229;&#237;&#229;&#240;&#224;&#242;&#238;&#240; &#232;&#236;&#239;&#243;&#235;&#252;&#241;&#238;&#226; &#228;&#235;&#255; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255; &#241; &#231;&#224;&#228;&#224;&#237;&#237;&#251;&#236; &#239;&#229;&#240;&#232;&#238;&#228;&#238;&#236;*)*)
rtr_bls(CLK:= rtr_psave.Q OR savebut, Q=> ); (*savebut - &#226; &#234;&#238;&#237;&#244;&#232;&#227;&#243;&#240;&#224;&#246;&#232;&#232;*)

IF rtr_strt.Q THEN (*&#197;&#241;&#235;&#232; &#239;&#235;&#234; &#226;&#234;&#235;&#254;&#247;&#232;&#235;&#241;&#255;*)
bdstatus:=3; (*&#205;&#224;&#247;&#232;&#237;&#224;&#229;&#236; &#247;&#242;&#229;&#237;&#232;&#229; &#244;&#224;&#233;&#235;&#224;*)
ELSIF (rtr_a220.Q OR rtr_bls.Q) AND bdstatus=0 THEN (*&#197;&#241;&#235;&#232; &#239;&#238;&#255;&#226;&#232;&#235;&#241;&#255; &#241;&#232;&#227;&#237;&#224;&#235; &#232;&#241;&#247;&#229;&#231;&#237;&#238;&#226;&#229;&#237;&#232;&#255; &#237;&#224;&#239;&#240;&#255;&#230;&#229;&#237;&#232;&#255;, &#224; &#242;&#224;&#234;&#230;&#229; &#240;&#224;&#231; &#226; 24 &#247;&#224;&#241;&#224; &#232;&#235;&#232; &#239;&#238; &#237;&#224;&#230;&#224;&#242;&#232;&#254; &#234;&#238;&#239;&#234;&#232; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255;*)
bdstatus:=1; (*&#194;&#251;&#239;&#238;&#235;&#237;&#255;&#229;&#236; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#229;*)
END_IF;

CASE bdstatus OF
1: (*&#209;&#238;&#245;&#240;&#224;&#237;&#255;&#229;&#236; &#242;&#229;&#234;&#243;&#249;&#232;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#226; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#243; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;*)
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; (*&#209;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#232;&#229; &#228;&#224;&#237;&#237;&#251;&#245; &#226; &#244;&#224;&#233;&#235;*)

2: (*&#199;&#224;&#239;&#232;&#241;&#252; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#251; &#243;&#241;&#242;&#224;&#226;&#238;&#234; &#226; &#244;&#224;&#233;&#235;*)
file:=SysFileOpen('sets.bin', 'w'); (*&#206;&#242;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235; &#228;&#235;&#255; &#231;&#224;&#239;&#232;&#241;&#232;, &#229;&#241;&#235;&#232; &#244;&#224;&#233;&#235;&#224; &#237;&#229;&#242;, &#242;&#238; &#241;&#238;&#231;&#228;&#224;&#229;&#242;&#241;&#255; &#237;&#238;&#226;&#251;&#233;*)
IF file=0 THEN error_rwfile:=TRUE; (*&#206;&#248;&#232;&#225;&#234;&#224; &#238;&#242;&#234;&#240;&#251;&#242;&#232;&#255;/&#241;&#238;&#231;&#228;&#224;&#237;&#232;&#255; &#244;&#224;&#233;&#235;&#224;*)
RETURN; (*&#194; &#253;&#242;&#238;&#236; &#241;&#235;&#243;&#247;&#224;&#229; &#239;&#251;&#242;&#224;&#229;&#236;&#241;&#255; &#238;&#242;&#234;&#240;&#251;&#242;&#252; &#244;&#224;&#233;&#235; &#239;&#238;&#226;&#242;&#238;&#240;&#237;&#238;*)
ELSE
wr_byte:=SysFileWrite(file,ADR(bdsave),SIZEOF(bdsa ve)); (*&#207;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#231;&#224;&#239;&#232;&#241;&#224;&#237;&#237;&#251;&#245; &#225;&#224;&#233;&#242;*)
IF wr_byte=SIZEOF(bdsave) THEN (*&#197;&#241;&#235;&#232; &#240;&#224;&#226;&#237;&#238; &#240;&#224;&#231;&#236;&#229;&#240;&#243; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;*)
SysFileClose(file); (*&#199;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235;*)
bd.0:=SysFileClose(file); (*&#212;&#235;&#224;&#227; - &#212;&#224;&#233;&#235; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#231;&#224;&#239;&#232;&#241;&#224;&#237; &#232; &#231;&#224;&#234;&#240;&#251;&#242;*)
ELSE bd.1:=TRUE; (*&#212;&#235;&#224;&#227; - &#212;&#224;&#233;&#235; &#237;&#229; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;*)
END_IF;
END_IF;
bdstatus:=0; (*&#199;&#224;&#239;&#232;&#241;&#252; &#238;&#234;&#238;&#237;&#247;&#229;&#237;&#224;*)

3: (*&#215;&#242;&#229;&#237;&#232;&#229;*)
file:=SysFileOpen('sets.bin', 'r'); (*&#206;&#242;&#234;&#240;&#251;&#242;&#232;&#229; &#244;&#224;&#233;&#235;&#224; &#228;&#235;&#255; &#247;&#242;&#229;&#237;&#232;&#255;*)
IF file=0 THEN (*&#206;&#248;&#232;&#225;&#234;&#224; &#238;&#242;&#234;&#240;&#251;&#242;&#232;&#255; &#244;&#224;&#233;&#235;&#224; (&#244;&#224;&#233;&#235; &#237;&#229; &#241;&#243;&#249;&#229;&#241;&#242;&#226;&#243;&#229;&#242;)*)
bd.2:=TRUE; (*&#212;&#235;&#224;&#227; - &#205;&#229; &#237;&#224;&#233;&#228;&#229;&#237; &#244;&#224;&#233;&#235; &#241; &#243;&#241;&#242;&#224;&#226;&#234;&#224;&#236;&#232;*)
bdstatus:=5; (*&#207;&#229;&#240;&#229;&#245;&#238;&#228; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232;*)
ELSE
rd_byte:=SysFileRead(file,ADR(buf_bdsave),SIZEOF(b uf_bdsave)); (*&#209;&#247;&#232;&#242;&#251;&#226;&#224;&#229;&#236; &#228;&#224;&#237;&#237;&#251;&#229; &#232;&#231; &#244;&#224;&#233;&#235;&#224; &#226; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#243; (&#226; &#225;&#243;&#244;&#229;&#240;)*)
IF SIZEOF(buf_bdsave)=rd_byte THEN (*&#197;&#241;&#235;&#232; &#244;&#224;&#233;&#235; &#241;&#247;&#232;&#242;&#224;&#237;*)
SysFileClose(file); (*&#199;&#224;&#234;&#240;&#251;&#226;&#224;&#229;&#236; &#244;&#224;&#233;&#235;*)
(* IF SysFileClose(file) THEN (*&#212;&#224;&#233;&#235; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#231;&#224;&#234;&#240;&#251;&#242;*)*)
bdstatus:=4; (*&#197;&#241;&#235;&#232; &#244;&#224;&#233;&#235; &#232;&#231;&#226;&#235;&#229;&#247;&#229;&#237; - &#234;&#238;&#239;&#232;&#240;&#243;&#229;&#236; &#226; &#225;&#224;&#231;&#243;*)
ELSE
bd.3:=TRUE; (*&#206;&#248;&#232;&#225;&#234;&#224; &#232;&#231;&#226;&#235;&#229;&#247;&#229;&#237;&#232;&#255; &#244;&#224;&#233;&#235;&#224;*)
bdstatus:=5; (*&#209;&#225;&#240;&#238;&#241; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;*)
(*END_IF;*)
END_IF;
END_IF;

4: (*&#209;&#238;&#245;&#240;&#224;&#237;&#255;&#229;&#236; &#225;&#243;&#244;&#229;&#240; &#226; &#242;&#229;&#234;&#243;&#249;&#243;&#254; &#241;&#242;&#240;&#243;&#234;&#242;&#243;&#240;&#243;*)
bdsave:=buf_bdsave;
bd.4:=TRUE; (*&#205;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#241;&#238;&#245;&#240;&#224;&#237;&#229;&#237;&#251; *)
bdstatus:=0;

5: (*&#209;&#225;&#240;&#238;&#241; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;*)
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; (*&#205;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232; &#241;&#225;&#240;&#238;&#248;&#229;&#237;&#251; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229;*)
bdstatus:=2;
END_CASE

IF bdsave.day_ust=0 THEN (*&#194; &#241;&#235;&#243;&#247;&#224;&#229; &#237;&#243;&#235;&#229;&#226;&#238;&#227;&#238; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#228;&#237;&#229;&#226;&#237;&#238;&#233; &#243;&#241;&#242;&#224;&#226;&#234;&#232;*)
bdstatus:=5; (*&#209;&#225;&#240;&#238;&#241; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;*)
END_IF;

IF bd.4 OR bd.5 THEN (*&#197;&#241;&#235;&#232; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#232; &#241;&#225;&#240;&#238;&#248;&#229;&#237;&#251; &#237;&#224; &#231;&#224;&#226;&#238;&#228;&#241;&#234;&#232;&#229; &#232;&#235;&#232; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#232;&#231;&#226;&#235;&#229;&#247;&#229;&#237;&#251; &#232;&#231; &#244;&#224;&#233;&#235;&#224; - &#226;&#251;&#239;&#238;&#235;&#237;&#255;&#229;&#236; &#239;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#251;&#245;*)
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 (*&#207;&#238;&#241;&#235;&#229; &#239;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#255; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#233; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#251;&#236;, &#238;&#242;&#239;&#240;&#224;&#226;&#235;&#255;&#229;&#236; &#232;&#245; &#237;&#224; &#239;&#224;&#237;&#229;&#235;&#252;*)
p_hh:=hour; (*&#231;&#224;&#239;&#232;&#241;&#252; &#226; &#240;&#229;&#227;&#232;&#241;&#242;&#240;&#251; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#233; &#243;&#241;&#242;&#224;&#226;&#238;&#234; &#232; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#232;&#231; &#253;&#237;&#229;&#240;&#227;&#238;&#237;&#229;&#231;&#224;&#226;&#232;&#241;&#232;&#236;&#238;&#233; &#239;&#224;&#236;&#255;&#242;&#232;*)
p_mm:=minute;
p_ss:=second;
p_dd:=day;
p_mh:=month;
p_yy:=year;
p_hh_day:=hh_day; (*&#247;&#224;&#241;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#228;&#237;&#229;&#226;&#237;&#238;&#227;&#238; &#240;&#229;&#230;&#232;&#236;&#224;*)
p_mm_day:=mm_day; (*&#236;&#232;&#237;&#243;&#242;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#228;&#237;&#229;&#226;&#237;&#238;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;*)
p_hh_night:=hh_night; (*&#247;&#224;&#241;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#237;&#238;&#247;&#237;&#238;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;*)
p_mm_night:=mm_night; (*&#236;&#232;&#237;&#243;&#242;&#251; &#237;&#224;&#247;&#224;&#235;&#224; &#237;&#238;&#247;&#237;&#238;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;*)
p_Pin:=Pin; (*&#226;&#245;&#238;&#228;&#237;&#238;&#229; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#229;*)
p_Pout:=Pfact; (*&#226;&#251;&#245;&#238;&#228;&#237;&#238;&#229; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#229;*)
p_day_ust:=day_ust; (*&#228;&#237;&#229;&#226;&#237;&#224;&#255; &#243;&#241;&#242;&#224;&#226;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_night_ust:=night_ust; (*&#237;&#238;&#247;&#237;&#224;&#255; &#243;&#241;&#242;&#224;&#226;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_pid_ust:=pid_ust; (*&#226;&#251;&#245;&#238;&#228; &#226; &#226;&#238;&#235;&#252;&#242;&#224;&#245; &#241;&#232;&#227;&#237;&#224;&#235;&#224; &#243;&#239;&#240;&#224;&#226;&#235;&#229;&#237;&#232;&#255; &#241; &#240;&#229;&#227;&#243;&#235;&#255;&#242;&#238;&#240;&#224; &#239;&#240;&#232; &#237;&#229;&#232;&#241;&#239;&#240;&#224;&#226;&#237;&#238;&#241;&#242;&#232; &#196;&#196;&#226;&#251;&#245;.*)
p_ddvh_off:=ddvh_off; (*&#232;&#241;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#226;&#245;&#238;&#228;&#237;&#238;&#227;&#238; &#196;&#196; &#232;&#231; &#224;&#226;&#224;&#240;&#232;&#233;&#237;&#238;&#227;&#238; &#238;&#239;&#238;&#226;&#229;&#249;&#229;&#237;&#232;&#255;*)
p_ddvyh_max:=ddvyh_max; (*&#236;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#226;&#251;&#245;&#238;&#228;&#237;&#238;&#227;&#238; &#228;&#224;&#242;&#247;&#232;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_ddvh_max:=ddvh_max; (*&#236;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#226;&#245;&#238;&#228;&#237;&#238;&#227;&#238; &#228;&#224;&#242;&#247;&#232;&#234;&#224; &#228;&#224;&#226;&#235;&#229;&#237;&#232;&#255;*)
p_Kp:=Kp; (*&#207;&#240;&#238;&#239;&#238;&#240;&#246;&#232;&#238;&#237;&#224;&#235;&#252;&#237;&#251;&#233; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242; &#207;&#200;&#196;-&#240;&#229;&#227;&#243;&#235;&#255;&#242;&#238;&#240;&#224;*)
p_Ti:=Ti; (*&#200;&#237;&#242;&#229;&#227;&#240;&#224;&#235;&#252;&#237;&#251;&#233; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242; &#207;&#200;&#196;-&#240;&#229;&#227;&#243;&#235;&#255;&#242;&#238;&#240;&#224;*)
p_count_num:=BYTE_TO_WORD(count_num); (*&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#237;&#238;&#236;&#229;&#240;&#238;&#226;, &#237;&#224; &#234;&#238;&#242;&#238;&#240;&#238;&#229; &#237;&#243;&#230;&#237;&#238; &#238;&#242;&#239;&#240;&#224;&#226;&#232;&#242;&#252; &#224;&#226;&#224;&#240;&#232;&#233;&#237;&#251;&#229; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#255;*)
p_sbros:=sbros; (*&#209;&#225;&#240;&#238;&#241; &#224;&#226;&#224;&#240;&#232;&#232; &#207;&#215; &#240;&#224;&#231;&#240;&#229;&#248;&#229;&#237;*)
p_t_sbros:=t_sbros; (*&#199;&#224;&#228;&#229;&#240;&#230;&#234;&#224; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#239;&#229;&#240;&#229;&#228; &#241;&#225;&#240;&#238;&#241;&#238;&#236; &#224;&#226;&#224;&#240;&#232;&#232; &#207;&#215;*)
p_sbros_max:=sbros_max; (*&#204;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#234;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#239;&#238;&#239;&#251;&#242;&#238;&#234; &#241;&#225;&#240;&#238;&#241;&#224; &#224;&#226;&#224;&#240;&#232;&#232; &#207;&#215;*)
p_sbros_count:=sbros_count; (*&#202;&#238;&#235;&#232;&#247;&#229;&#241;&#242;&#226;&#238; &#239;&#238;&#239;&#251;&#242;&#238;&#234; &#241;&#225;&#240;&#238;&#241;&#224; &#224;&#226;&#224;&#240;&#232;&#232;*)
p_ntp_yes:=ntp_yes; (*&#208;&#224;&#231;&#240;&#229;&#248;&#229;&#237;&#232;&#229; &#241;&#232;&#237;&#245;&#240;&#238;&#237;&#232;&#231;&#224;&#246;&#232;&#232; &#226;&#240;&#229;&#236;&#229;&#237;&#232; &#239;&#238; &#232;&#237;&#242;&#229;&#240;&#237;&#229;&#242;*)
p_gmt:=gmt; (*&#215;&#224;&#241;&#238;&#226;&#238;&#233; &#239;&#238;&#255;&#241;*)
phone_num1:=listNum[0]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#239;&#229;&#240;&#226;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num2:=listNum[1]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#226;&#242;&#238;&#240;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num3:=listNum[2]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#242;&#240;&#229;&#242;&#252;&#229;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num4:=listNum[3]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#247;&#229;&#242;&#226;&#229;&#240;&#242;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
phone_num5:=listNum[4]; (*&#207;&#240;&#232;&#241;&#226;&#238;&#229;&#237;&#232;&#229; &#239;&#255;&#242;&#238;&#227;&#238; &#242;&#229;&#235;&#229;&#244;&#238;&#237;&#237;&#238;&#227;&#238; &#237;&#238;&#236;&#229;&#240;&#224;*)
bd:=0;
END_IF;

IF NOT pow THEN (*&#229;&#241;&#235;&#232; &#239;&#240;&#238;&#232;&#231;&#238;&#248;&#235;&#238; &#238;&#242;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#229; &#239;&#232;&#242;&#224;&#237;&#232;&#255;*)
strt_plc:=TRUE; (*&#226;&#251;&#241;&#242;&#224;&#226;&#235;&#255;&#229;&#236; &#244;&#235;&#224;&#227; &#238;&#242;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#239;&#232;&#242;&#224;&#237;&#232;&#255;*)
END_IF;
siz:=SIZEOF(bdsave); (*&#208;&#224;&#231;&#236;&#229;&#240; &#225;&#224;&#231;&#251; &#228;&#224;&#237;&#237;&#251;&#245;*)
siz_buf:=SIZEOF(buf_bdsave);
Коментарии очень помогли понять Ваш алгоритм:rolleyes:

energvk
18.03.2015, 10:47
Да,капец, как раз сижу пытаюсь их сконвертировать

energvk
18.03.2015, 10:50
Проще наверное так :)
17213

Amko
18.03.2015, 10:56
http://www.artlebedev.ru/tools/decoder/
Пользуйтесь на здоровье :)

energvk
18.03.2015, 10:59
http://www.artlebedev.ru/tools/decoder/
Пользуйтесь на здоровье :)

Супер, спасибо :)

energvk
19.03.2015, 16:14
Не могу найти ошибку, хоть тресни.

Текущий код:

(*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);

Где тут кроется ошибка?

energvk
19.03.2015, 16:50
Всё, нашел :)