Код:
PROGRAM File_IP
VAR
BUFER: ARRAY [1..76] OF BYTE;(*Буфер для чтения и записи файла local_addres.dat*)
EMAC: STRING; (*Смвольные значения в файле*)
IP: STRING(11); (*Смвольные значения в файле*)
GATE: STRING(11); (*Смвольные значения в файле*)
MASK: STRING(11); (*Смвольные значения в файле*)
StatusOfFile: INT:=100;
f: DWORD;
statusf: DWORD;
END_VAR
(*Используются глобальные переменные в модуле Modbus slave -регистры для обмена с панелью
dwIP: DWORD;
dwGATE: DWORD;
dwMASK: DWORD;
*)
CASE StatusOfFile OF
0: (*проверить не изменялись ли значения в панели и если да, то новые значения поместить в буфер*)
IF dwIP <> IP4hex_DECODE(IP) THEN
_STRING_TO_BUFFER(IP4_TO_STRH(dwIP), 27, ADR(BUFER), SIZEOF(BUFER)); StatusOfFile:=10;
END_IF
IF dwGATE <> IP4hex_DECODE(GATE) THEN
_STRING_TO_BUFFER(IP4_TO_STRH(dwGATE), 45, ADR(BUFER), SIZEOF(BUFER));StatusOfFile:=10;
END_IF
IF dwMASK <> IP4hex_DECODE(MASK) THEN
_STRING_TO_BUFFER(IP4_TO_STRH(dwMASK), 63, ADR(BUFER), SIZEOF(BUFER)); StatusOfFile:=10;
END_IF
10: (*сохранить предыдущее состояние файла*)
statusf:=SysFileCopy('local_addres.bak', 'local_addres.dat');StatusOfFile:=11;
11: (*открыть файл на запись*)
f:=SysFileOpen('local_addres.dat', 'w');StatusOfFile:=12;
12: (*записать буфер в файл*)
statusf:=SysFileWrite(f, ADR(BUFER), SIZEOF(BUFER));StatusOfFile:=102;
(*Эта часть выполняется однократно после старта ПЛК*)
100: (*Открыть файл на чтение*)
f:=SysFileOpen('local_addres.dat', 'r');
IF f=0 THEN
StatusOfFile:=200; (*Нет такого файла*)
ELSE
StatusOfFile:=101; (*ОК, файл существует*)
END_IF
101: (*Прочитать файл в буфер*)
statusf:=SysFileRead(f, ADR(BUFER), SIZEOF(BUFER));StatusOfFile:=102;
102: (*Закрываем файл*)
SysFileClose(f);StatusOfFile:=103;
103: (*Текущие значения из файла в панель*)
dwIP:=IP4hex_DECODE(IP);
dwGATE:=IP4hex_DECODE(GATE);
dwMASK:=IP4hex_DECODE(MASK);
StatusOfFile:=0;
200: (*Если файла нет, то попробовать его восстановить*)
statusf:=SysFileCopy('local_addres.dat', 'local_addres.bak');StatusOfFile:=201;
201:
IF statusf=0 THEN
(*старой версии файла нет, создать новый*)
_STRING_TO_BUFFER('EMAC=6A:77:00:22:01:98$n$rIP=C0:A8:01:41$n$rGATE=C0:A8:01:01$n$rMASK=FF:FF:FF:00$n$r', 0, ADR(BUFER), SIZEOF(BUFER));
StatusOfFile:=11; (*Записать новый файл*)
ELSE
StatusOfFile:=100;
END_IF
END_CASE
EMAC:=BUFFER_TO_STRING(ADR(BUFER), SIZEOF(BUFER), 5, 21);
IP:=BUFFER_TO_STRING(ADR(BUFER), SIZEOF(BUFER), 27, 37);
GATE:=BUFFER_TO_STRING(ADR(BUFER), SIZEOF(BUFER), 45, 55);
MASK:=BUFFER_TO_STRING(ADR(BUFER), SIZEOF(BUFER), 63, 73);