Доброй ночи!
в ST не силен, прошу посмотреть матерых, правильно ли будет так организовать запись в файл. Запись нужна лишь для хранения уставок.
Т.к. форум не знает файлов типа .EXP, залил на файлообменник, прога доступна по ссылке
Ну, или просто код:
Код:
PROGRAM PLC_PRG
VAR
start1:BOOL;
start2:BOOL;
f1:DWORD;
Buffer_in: ARRAY[0..7] OF REAL;
Buffer_out: ARRAY[0..7] OF REAL;
timeout_1: TON := (PT := T#5s);
sfw:DWORD;
sfr:DWORD;
sfc:BOOL;
END_VAR
VAR_INPUT
per1_write:REAL;
per2_write:REAL;
per3_write:REAL;
per4_write:REAL;
per5_write:REAL;
per6_write:REAL;
per7_write:REAL;
per8_write:REAL;
write:BOOL;
read:BOOL;
END_VAR
VAR_OUTPUT
per1_read:REAL;
per2_read:REAL;
per3_read:REAL;
per4_read:REAL;
per5_read:REAL;
per6_read:REAL;
per7_read:REAL;
per8_read:REAL;
finish_write:BOOL; (*триггер успешной записи*)
finish_read:BOOL; (*триггер успешного чтения*)
END_VAR
Buffer_in[0] :=per1_write; (*формируем буфер из переменных для записи*)
Buffer_in[1] :=per2_write;
Buffer_in[2] :=per3_write;
Buffer_in[3] :=per4_write;
Buffer_in[4] :=per5_write;
Buffer_in[5] :=per6_write;
Buffer_in[6] :=per7_write;
Buffer_in[7] :=per8_write;
IF write=TRUE AND read=FALSE THEN (*команда на начало записи*)
f1 := SysFileOpen ('my_retain', 'w');
IF f1>0 THEN;
sfw:=SysFileWrite(f1, ADR(Buffer_in), SIZEOF(Buffer_in));
IF sfw=32 THEN;
sfc:=SysFileClose(f1);
finish_write:=TRUE; (*формирование флага успешной записи*)
timeout_1(IN := TRUE);
IF timeout_1.Q THEN
finish_write:=FALSE; (*сброс флага через время PT*)
timeout_1(IN := FALSE);
write:=FALSE;
END_IF
END_IF
END_IF
END_IF
IF read=TRUE AND write=FALSE THEN (*команда на начало чтения*)
f1:=SysFileOpen('my_retain', 'r');
IF f1>0 THEN;
sfr:=SysFileRead(f1, ADR(Buffer_out), SIZEOF(Buffer_out));
IF sfr=32 THEN;
sfc:=SysFileClose(f1);
SysMemCpy(ADR(per1_read), ADR(buffer_out[0]), SIZEOF(per1_read)); (*копируем из буфера чтения*)
SysMemCpy(ADR(per2_read), ADR(buffer_out[1]), SIZEOF(per2_read));
SysMemCpy(ADR(per3_read), ADR(buffer_out[2]), SIZEOF(per3_read));
SysMemCpy(ADR(per4_read), ADR(buffer_out[3]), SIZEOF(per4_read));
SysMemCpy(ADR(per5_read), ADR(buffer_out[4]), SIZEOF(per5_read));
SysMemCpy(ADR(per6_read), ADR(buffer_out[5]), SIZEOF(per6_read));
SysMemCpy(ADR(per7_read), ADR(buffer_out[6]), SIZEOF(per7_read));
SysMemCpy(ADR(per8_read), ADR(buffer_out[7]), SIZEOF(per8_read));
finish_read:=TRUE; (*формирование флага успешного чтения*)
timeout_1(IN := TRUE);
IF timeout_1.Q THEN
finish_read:=FALSE; (*сброс флага через время PT*)
timeout_1(IN := FALSE);
read:=FALSE;
END_IF
END_IF
END_IF
END_IF