⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filedefine.~pas

📁 自已用DELPHI编写的MODBUS测试软件及源代码
💻 ~PAS
📖 第 1 页 / 共 4 页
字号:
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 + -