📄 filedefine.~pas
字号:
unit filedefine;
interface
uses
Windows, Messages, SysUtils, Classes, Grids, VaComm, Graphics, Controls,
StdCtrls, Dialogs;
const
COILMAX = 256;
INPUTSTATEMAX = 256;
HOLDREGISTERMAX = 256;
INPUTREGISTERMAX = 256;
SETPARMAX = 256;
SETPROTECTMAX = 64;
SETPOWERMAX = 64;
EVENTTYPEMAX = 64;
NOTDEFINE = '没有定义';
NOVALUE = '0';
NOTINPUT = false;
NOTON = false;
companyname = '易控微网科技产品测试软件V2.30 ';
NOTFIND = '找不到';
TOOBIG = '超出范围';
type
Tbuffer = array [1..1024] of byte;
tbase1 = record
name: string;
value: boolean;
end;
tbase2 = record
name: string;
value: string;
end;
tbase3 = record
name: string;
address1: string;
address2: string;
address3: string;
end;
tsndbuf = record
index: integer;
buffer: array[0..49]of string; // 正常发送帧
empty: boolean;
full: boolean;
end;
tcom = record
mode: string;
portnum: integer;
databits: integer;
stopbits: integer;
baudrate: integer;
userbaud: integer;
parity: integer;
timepoll: integer;
timeout: integer;
rtuaddress: integer;
sendbuffer1: tsndbuf; // 正常发送帧
sendbuffer2: tsndbuf; // 特殊帧存放
sendbuffer3: string;
sendbuffer4: string;
sendbuffer: string; // 数据送出帧
end;
teconfile = class
filename: string;
coilstatetotal: integer;
inputstatetotal: integer;
holdregistertotal: integer;
inputregistertotal: integer;
eventtypetotal: integer;
setpartotal: integer;
setprotecttotal: integer;
setpowertotal: integer;
setxiangliangtotal: integer;
setxiebototal: integer;
comm: Tcom;
analysbuffer: Tbuffer;
coilstatearray: array [1..COILMAX] of tbase1;
inputstatearray: array [1..INPUTSTATEMAX] of tbase1;
holdregisterarray: array [1..HOLDREGISTERMAX] of tbase2;
inputregisterarray: array [1..INPUTREGISTERMAX] of tbase2;
eventtypearray: array[1..EVENTTYPEMAX]of tbase2;
setpararray: array[1..SETPARMAX]of tbase3;
setprotectarray: array[1..SETPROTECTMAX]of tbase3;
setpowerarray: array[1..SETPOWERMAX]of tbase3;
xiangliangarray: array [1..12] of tbase3;
xieboarray: array [1..42] of tbase3;
constructor init;
procedure changfilename(temp: string);
procedure changcoilstatetotal(temp: integer);
procedure changinputstatetotal(temp: integer);
procedure changholdregistertotal(temp: integer);
procedure changinputregistertotal(temp: integer);
procedure changeventtypetotal(temp: integer);
procedure changsetpartotal(temp: integer);
procedure changsetprotecttotal(temp: integer);
procedure changsetpowertotal(temp: integer);
procedure changxiangliangtotal(temp: integer);
procedure changxiebototal(temp: integer);
end;
var
fifocount: integer;//FIFO 计数器
receiveString: string;//ASCLL 方式接收字符串
revbuff: array [0..1024] of byte;//接收缓冲区
sendflag: boolean;//启动发送帧标志
timeoutcount: integer;//超时计数,大于5,超时发下一帧
revcount: integer;//接收字节计数器
beginaddress: integer;
readcoilcount: integer;
readinputcount: integer;
cyclesend: integer;
xiev: string;
xiei: string;
Procedure datainit;
procedure fileerr(temp: string);
function getdata(temp: string; col: integer; tempmemo: Tmemo): string;
procedure getcoilstatedata(tempmemo: Tmemo; econfile: Teconfile);
procedure getinputstatedata(tempmemo: Tmemo; econfile: Teconfile);
procedure getholdregisterdata(tempmemo: Tmemo; econfile: Teconfile);
procedure getinputregisterdata(tempmemo: Tmemo; econfile: Teconfile);
procedure getsetpardata(tempmemo: Tmemo; econfile: Teconfile);
procedure getsetprotectdata(tempmemo: Tmemo; econfile: Teconfile);
procedure getsetpowerdata(tempmemo: Tmemo; econfile: Teconfile);
procedure getxiangliangdata(tempmemo: Tmemo; econfile: Teconfile);
procedure geteventtypedata(tempmemo: Tmemo; econfile: Teconfile);
procedure getcomdata(tempmemo: Tmemo; econfile: Teconfile);
procedure getxiebodata(tempmemo: Tmemo; econfile: Teconfile);
function changbaudrate(temp: integer): TVaBaudrate;
function changdatabits(temp: integer): TVadatabits;
function changstopbits(temp: integer): TVastopbits;
function changportnum(temp: integer): integer;
function changparity(temp: integer): TVaparity;
procedure getdatafromfile(var tempmemo: Tmemo; filename: string; econfile: Teconfile);
procedure displaycoilstate(const econfile: Teconfile; tempgrid: Tstringgrid);
procedure displayinputstate(const econfile: Teconfile; tempgrid: Tstringgrid);
procedure displayholdregister(const econfile: Teconfile; tempgrid: Tstringgrid);
procedure displayinputregister(const econfile: Teconfile; tempgrid: Tstringgrid);
procedure displayprotect(const econfile:Teconfile; tempgrid: Tstringgrid);
procedure displaypower(const econfile:Teconfile; tempgrid: Tstringgrid);
procedure displayxiangliang(const econfile: Teconfile; tempgrid: Tstringgrid);
procedure displayxiebo(const econfile: Teconfile; tempgrid: Tstringgrid);
procedure readholdregister(econfile: Teconfile);
procedure readfifo(econfile: Teconfile);
procedure settime(econfile: Teconfile);
procedure addsendbuffer2(econfile: Teconfile; temp: string);
implementation
procedure fileerr(temp: string);
begin
showmessage('文件定义错误:' + temp);
exit;
end;
function changbaudrate(temp: integer): TVaBaudrate;
begin
case temp of
110: changbaudrate := br110;
300: changbaudrate := br300;
600: changbaudrate := br600;
1200: changbaudrate := br1200;
2400: changbaudrate := br2400;
4800: changbaudrate := br4800;
9600: changbaudrate := br9600;
14400: changbaudrate := br14400;
19200: changbaudrate := br19200;
38400: changbaudrate := br38400;
56000: changbaudrate := br56000;
57600: changbaudrate := br57600;
115200: changbaudrate := br115200;
128000: changbaudrate := br128000;
256000: changbaudrate := br256000
else
begin
changbaudrate := br9600;
end;
end;
end;
function changdatabits(temp: integer): TVadatabits;
begin
case temp of
4: changdatabits := db4;
5: changdatabits := db5;
6: changdatabits := db6;
7: changdatabits := db7;
8: changdatabits := db8
else changdatabits := db8
end;
end;
function changstopbits(temp: integer): TVastopbits;
begin
case temp of
1: changstopbits := sb1;
15: changstopbits := sb15;
2: changstopbits := sb2
else changstopbits := sb1;
end;
end;
function changportnum(temp: integer): integer;
begin
changportnum := temp;
end;
function changparity(temp: integer): TVaparity;
begin
case temp of
0: changparity := paNone;
1: changparity := paOdd;
2: changparity := paEven;
3: changparity := paMark;
4: changparity := paSpace
else changparity := paNone;
end;
end;
constructor teconfile.init;
var i: integer;
begin
comm.mode := 'ASCII';
comm.portnum := 1;
comm.databits := 8;
comm.stopbits := 1;
comm.baudrate := 9600;
comm.userbaud := 9600;
comm.parity := 0;
comm.rtuaddress := 1;
comm.sendbuffer := '';
for i:=0 to 49 do
begin
comm.sendbuffer1.index := 0;
comm.sendbuffer1.buffer[i] := '';
comm.sendbuffer1.empty := true;
comm.sendbuffer1.full := false;
comm.sendbuffer2.index := 0;
comm.sendbuffer2.buffer[i] := '';
comm.sendbuffer2.empty := true;
comm.sendbuffer2.full := false;
end;
coilstatetotal := 0;
inputstatetotal := 0;
holdregistertotal := 0;
inputregistertotal := 0;
setpartotal := 0;
setprotecttotal := 0;
setpowertotal := 0;
for i:=1 to COILMAX do
begin
coilstatearray[i].Name := NOTDEFINE;
coilstatearray[i].value := NOTON;
end;
for i:=1 to INPUTSTATEMAX do
begin
inputstatearray[i].Name := NOTDEFINE;
inputstatearray[i].value := NOTINPUT;
end;
for i:=1 to HOLDREGISTERMAX do
begin
holdregisterarray[i].Name := NOTDEFINE;
holdregisterarray[i].value := NOVALUE;
end;
for i:=1 to INPUTREGISTERMAX do
begin
inputregisterarray[i].Name := NOTDEFINE;
inputregisterarray[i].value := NOVALUE;
end;
for i:=1 to SETPARMAX do
begin
setpararray[i].name := NOTDEFINE;
setpararray[i].address1 := NOVALUE;
setpararray[i].address2 := NOVALUE;
setpararray[i].address3 := NOVALUE;
end;
for i:=1 to SETPROTECTMAX do
begin
setprotectarray[i].name := NOTDEFINE;
setprotectarray[i].address1 := NOVALUE;
setprotectarray[i].address2 := NOVALUE;
setprotectarray[i].address3 := NOVALUE;
end;
for i:=1 to SETPOWERMAX do
begin
setpowerarray[i].name := NOTDEFINE;
setpowerarray[i].address1 := NOVALUE;
setpowerarray[i].address2 := NOVALUE;
setpowerarray[i].address3 := NOVALUE;
end;
end;
procedure teconfile.changfilename(temp: string);
begin
filename := temp;
end;
procedure teconfile.changcoilstatetotal(temp: integer);
begin
coilstatetotal := temp;
end;
procedure teconfile.changinputstatetotal(temp: integer);
begin
inputstatetotal := temp;
end;
procedure teconfile.changholdregistertotal(temp: integer);
begin
holdregistertotal := temp;
end;
procedure teconfile.changinputregistertotal(temp: integer);
begin
inputregistertotal := temp;
end;
procedure teconfile.changsetpartotal(temp: integer);
begin
setpartotal := temp;
end;
procedure teconfile.changsetprotecttotal(temp: integer);
begin
setprotecttotal := temp;
end;
procedure teconfile.changsetpowertotal(temp: integer);
begin
setpowertotal := temp;
end;
procedure teconfile.changeventtypetotal(temp: integer);
begin
eventtypetotal := temp;
end;
procedure teconfile.changxiangliangtotal(temp: integer);
begin
setxiangliangtotal := temp;
end;
procedure teconfile.changxiebototal(temp: integer);
begin
setxiebototal := temp;
end;
function getdata(temp: string; col: integer; tempmemo: Tmemo): string;
var
i, j, k: integer;
temstr: string;
begin
with Tempmemo do
begin
j := 0;
k := 0;
for i:=col to lines.Count do
begin
temstr := Lines.Strings[i];
k := pos(temp, temstr);
if k>0 then
begin
j := i;
break;
end
end;
if ((i<>j)or(k=0)) then
begin
getdata := 'xx';
exit;
end;
delete(temstr, 1, k + length(temp)-1); //删除冒号以前字符 [文件名]
temp := temstr;
j := length(temp);
k := pos(':', temp);
temp := copy(temp, k+1, j-k);
temp := trimleft(temp);
j := length(temp);
k := pos(' ', temp);
delete(temp, k, j-k+1);
getdata := temp;
end;
end;
procedure getcoilstatedata(tempmemo: Tmemo; econfile: Teconfile);
var
i, j, k, l: integer;
temstr: string;
temp, temp1: string;
begin
with tempmemo do
begin
j := 0;
k := 0;
temp := '[输出开关量名称]';
for i:=0 to lines.Count do
begin
temstr := Lines.Strings[i];
k := pos(temp, temstr);
if k>0 then
begin
j := i;
break;
end;
end;
if ((i<>j)or(k=0)) then
begin
fileerr(NOTFIND+temp);
exit;
end;
i := i + 1;
temstr := Lines.Strings[i];
k := pos('---', temstr);
j := 0;
while k=0 do
begin
temp := '[序号]';
if pos(temp, temstr)=0 then
begin
i := i + 1;
temstr := Lines.Strings[i];
k := pos('---', temstr);
continue;
end;
temp1 := getdata(temp, i, tempmemo);
if strtointdef(temp1,300)>econfile.coilstatetotal then
begin
fileerr(inttostr(i)+'行 '+ temp + '值超出[输出开关量数]');
exit;
end;
l := strtointdef(temp1,0);
temp := '[名称]';
temp1 := getdata(temp, i, tempmemo);
econfile.coilstatearray[l].name := temp1;
j := j + 1;
if j>=econfile.coilstatetotal then
begin
exit;
end;
i := i + 1;
temstr := Lines.Strings[i];
k := pos('---',temstr);
end;
end;
end;
procedure getinputstatedata(tempmemo: Tmemo; econfile: Teconfile);
var
i, j, k, l: integer;
temstr: string;
temp, temp1: string;
begin
with tempmemo do
begin
j := 0;
k := 0;
for i:=0 to lines.Count do
begin
temp := '[输入开关量名称]';
temstr := Lines.Strings[i];
k := pos(temp, temstr);
if k>0 then
begin
j := i;
break;
end;
end;
if ((i<>j)or(k=0)) then
begin
fileerr(NOTFIND + temp);
exit;
end;
i := i + 1;
temstr := Lines.Strings[i];
k := pos('---', temstr);
j := 0;
while k=0 do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -