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

📄 econv230p.pas

📁 Delphi编写的ModBus协议上位机软件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
//-----------------------------------------------------------
//* Copyright (c) 2001,北京易控微网科技有限公司
//* All rights reserved.
//*
//* 文件名称:econv230p.pas
//* 摘    要:主程序文件
//* 当前版本:2.30
//
//* 作    者:夏红健
//* 完成日期:2004年5月26日

//* 取代版本:2.21
//* 原作者  :夏红健
//* 完成日期:2005年6月2日

//* 修改说明:
//  1.增加用户订制波特率功能
//  2.终端错误帧数据采取丢弃处理
//  3.将STRTOINT函数改为STRTOINTDEF函数,防出错
//  4.将编程风格规范化
//-----------------------------------------------------------


unit econv230p; //单元名

interface

uses

//-----------------------------------------------------------
//* 外部单元说明:
// VaClasses, VaComm 串口通讯控件 版本 Version 2.01 (Info@varian-software.com)
// func 为外部函数库
// aboutp 为关于窗口
// tempp 为设置数据临时窗口
// filedefine 为teconfile类的定义
//-----------------------------------------------------------
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls, ComCtrls, Menus,  ExtCtrls, Buttons,
  VaClasses,VaComm, func, aboutp, tempp, filedefine;

type
  TMainForm = class(TForm)
    PAGECON: TPageControl;          
    INPUTSTATE: TTabSheet;             // 开关量输入页面
    COILSTATE: TTabSheet;              // 开关量输出页面
    HOLDREGISTER: TTabSheet;           // 保持寄存器页面
    INPUTREGISTER: TTabSheet;          // 输入寄存器页面
    PROTECT: TTabSheet;                // 保护页面
    COMMUNICATION: TTabSheet;          // 通讯页面
    HELP: TTabSheet;                   // 帮助页面
    DATADEF: TTabSheet;                // 数据定义页面
    POWER: TTabSheet;                  // 电度页面
    XIANGLIANG: TTabSheet;             // 相量图页面
    TESTRPT: TTabSheet;                // 测试报告页面

    helpMemo: TMemo;                   // 帮助MEMO
    datamemo: TMemo;                   // 数据定义MEMO
    sendmemo: TMemo;                   // 计算机发送数据MEMO
    revmemo: TMemo;                    // 计算机接收数据MEMO
    eventmemo: TMemo;                  // 事件MEMO
    testrptmemo: TMemo;                // 测试报告MEMO

    inputregistergrid: TStringGrid;    // 输入寄存器表
    protectgrid: TStringGrid;          // 保护数据表
    holdregistergrid: TStringGrid;     // 保持寄存器表
    coilstategrid: TStringGrid;        // 开关量输出表
    inputstategrid: TStringGrid;       // 开关量输入表
    PowerGrid: TStringGrid;            // 电度数据表
    xianglianggrid: TStringGrid;       // 相量数据表

    MainMenu: TMainMenu;

    m_rtutpye: TMenuItem;              // 终端类型子菜单

    fileopen: TMenuItem;             // 打开终端类型描述文件

    m_comset: TMenuItem;               // 通讯设置子菜单

    m_baudrate: TMenuItem;           // 波特率菜单
          b110: TMenuItem;             // 110
          b300: TMenuItem;             // 300
          b600: TMenuItem;             // 600
          b1200: TMenuItem;            // 1200
          b2400: TMenuItem;            // 2400
          b4800: TMenuItem;            // 4800
          b9600: TMenuItem;            // 9600
          b14400: TMenuItem;           // 14400
          b19200: TMenuItem;           // 19200
          b38400: TMenuItem;           // 38400
          b56000: TMenuItem;           // 56000
          b57600: TMenuItem;           // 57600
          b115200: TMenuItem;          // 115200
          b128000: TMenuItem;          // 128000
          b256000: TMenuItem;          // 256000
          buser: TMenuItem;            // 用户定义波特率

      m_protocol: TMenuItem;           // 通讯协议菜单
          MODBUSRTU1: TMenuItem;       // MODBUS RTU
          MODBUSASCII1: TMenuItem;     // MODBUS ASCII
          cdt1: TMenuItem;             // 其它协议 空

      m_port: TMenuItem;               // 通讯端口菜单
          COM11: TMenuItem;            // com0
          COM21: TMenuItem;            // com1
          COM31: TMenuItem;            // com2
          COM41: TMenuItem;            // com3
          COM51: TMenuItem;            // com4
          COM61: TMenuItem;            // com5
          COM71: TMenuItem;            // com6
          COM81: TMenuItem;            // com7
          COM91: TMenuItem;            // com8
          COM101: TMenuItem;           // com9

      m_verify: TMenuItem;             // 通讯奇偶校验菜单
          paritynone: TMenuItem;       // 无
          parityodd: TMenuItem;        // 奇校验
          parityeven: TMenuItem;       // 偶校验

      m_address: TMenuItem;            // 通讯终端地址菜单
          address1: TMenuItem;         // 1
          address2: TMenuItem;         // 2
          address3: TMenuItem;         // 3
          address4: TMenuItem;         // 4
          address5: TMenuItem;         // 5
          address6: TMenuItem;         // 6
          address7: TMenuItem;         // 7
          address8: TMenuItem;         // 8
          address9: TMenuItem;         // 9
          address10: TMenuItem;        // 10
          address11: TMenuItem;        // 11
          address12: TMenuItem;        // 12
          address13: TMenuItem;        // 13
          address14: TMenuItem;        // 14
          address15: TMenuItem;        // 15
          address16: TMenuItem;        // 16
          address17: TMenuItem;        // 17
          address18: TMenuItem;        // 18
          address19: TMenuItem;        // 19
          address20: TMenuItem;        // 20
          address21: TMenuItem;        // 21
          address22: TMenuItem;        // 22
          address23: TMenuItem;        // 23
          address24: TMenuItem;        // 24
          address25: TMenuItem;        // 25
          address26: TMenuItem;        // 26
          address27: TMenuItem;        // 27
          address28: TMenuItem;        // 28
          address29: TMenuItem;        // 29
          address30: TMenuItem;        // 30
          address31: TMenuItem;        // 31
          address32: TMenuItem;         // 接收等待时间菜单
    m_comcontrol: TMenuItem;         // 通讯启停控制菜单

    m_help: TMenuItem;                 // 帮助菜单
    m_about: TMenuItem;              // 关于菜单

    StatusBar1: TStatusBar;            // 通讯状态指示栏

    sendtimer: TTimer;                 // 发送时间定时器
    revtimer: TTimer;                  // 接收时间定时器
    readholdtimer: TTimer;             // 读保持寄存器定时器  自动读取
    readfifotimer: TTimer;             // 读FIFO定时器  自动读取

    PopupMenu1: TPopupMenu;            // 右键弹出菜单1 用在数据定义页面
    save: TMenuItem;                   // 保存数据定义文件
    saveas: TMenuItem;                 // 另存数据定义

    Save1: TSaveDialog;                // 保存对话框
    open1: TOpenDialog;                  // 串口通讯控件
    PopupMenu2: TPopupMenu;            // 右键弹出菜单2 用在保存帮助文件
    save2: TMenuItem;                  // 保存帮助文件

    rptbtn: TBitBtn;                   // 生成报告按钮
    saverptbtn: TBitBtn;               // 保存报告按钮
    ClrRptBtn: TBitBtn;                // 清除报告按钮

    Splitter1: TSplitter;
    Splitter2: TSplitter;

    Panel1: TPanel;
    Image1: TImage;
    XIEBO: TTabSheet;
    XieBoGrid: TStringGrid;
    N1: TMenuItem;
    TimerOut1: TTimer;
    N2: TMenuItem;
    VaComm1: TVaComm;                    // 相量图形显示

    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    // 菜单处理
    procedure fileopenClick(Sender: TObject); // 打开数据定义文件
    procedure b110Click(Sender: TObject);  // 修改波特率
    procedure MODBUSRTU1Click(Sender: TObject); // 修改协议
    procedure COM11Click(Sender: TObject); // 修改端口
    procedure paritynoneClick(Sender: TObject); // 修改奇偶校验
    procedure address1Click(Sender: TObject); // 修改地址
    procedure m_comcontrolClick(Sender: TObject); // 开停通讯
    procedure m_aboutClick(Sender: TObject);  // 显示关于窗口

    // 通讯定时器处理
    procedure VaComm1RxFlag(Sender: TObject); // 产生数据接收标志处理
    procedure revtimerTimer(Sender: TObject); // 接收定时器处理
    procedure sendtimerTimer(Sender: TObject); // 发送定时器处理
    procedure readholdtimerTimer(Sender: TObject); // 读保持寄存器间隔
    procedure readfifotimerTimer(Sender: TObject); // 读FIFO间隔

    // 文件保存
    procedure saveClick(Sender: TObject); // 保存数据定义
    procedure saveasClick(Sender: TObject); // 另存数据定义
    procedure save2Click(Sender: TObject); // 保存帮助

    // 终端数据处理
    procedure coilstategridSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean); // 遥控继电器
    procedure holdregistergridSelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean); // 修改保持寄存器
    procedure PowerGridSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);  // 修改电度初值
    procedure protectgridSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);  // 修改保护定值
    procedure inputregistergridSelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean); // 修改输入寄存器对应系数

    // 测试报告相关处理
    procedure saverptbtnClick(Sender: TObject);
    procedure rptbtnClick(Sender: TObject);
    procedure ClrRptBtnClick(Sender: TObject);
    procedure XieBoGridSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure N1Click(Sender: TObject);
    procedure TimerOut1Timer(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure VaComm1RxChar(Sender: TObject; Count: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  econfile: Teconfile;
  getfilename: string;
  smindex: integer;       // 存贮表格操作的列值
  comm_status: bool;      // 通讯状态,TRUE为运行状态,FALSE为停止状态
  poll_count: integer;
  read_index: integer;
  sendflag1: boolean;//特殊帧标志
  
procedure system_init;    // 系统初始化
procedure drawxiangliang; // 画相量图
procedure start_comm;     // 启动通讯
procedure stop_comm;      // 停止通讯

implementation


{$R *.DFM}



//----------------------系统初始化---------------------------
procedure system_init;
var
  temp: string;
begin
  with mainform do
  begin

    helpmemo.lines.loadfromfile('help.txt'); // 调入帮助文件

    datainit;  // 初始化变量
    comm_status := false;   // 通讯状态初始为停止
    smindex := 0;
    poll_count := 0;
    read_index := 0;
    sendflag1 :=  false;
    econfile := Teconfile.init; // 构造ECONFILE对象
    getdatafromfile(datamemo, getfilename, econfile);// 调入数据定义中的系统设置


    // 根据数据定义文件初始化界面
    if econfile.coilstatetotal>0 then displaycoilstate(econfile,coilstategrid);
    coilstate.TabVisible := econfile.coilstatetotal>0;

    if econfile.inputstatetotal>0 then displayinputstate(econfile,inputstategrid);
    inputstate.TabVisible := econfile.inputstatetotal>0;

    if econfile.holdregistertotal>0 then displayholdregister(econfile,holdregistergrid);
    holdregister.TabVisible := econfile.holdregistertotal>0;

    if econfile.inputregistertotal>0 then displayinputregister(econfile,inputregistergrid);
    inputregister.TabVisible := econfile.inputregistertotal>0;

    if econfile.setprotecttotal>0 then  displayprotect(econfile,protectgrid);
    protect.TabVisible := econfile.setprotecttotal>0;

    if econfile.setpowertotal>0 then displaypower(econfile,powergrid);
    power.TabVisible := econfile.setpowertotal>0;

    if econfile.setxiangliangtotal>0 then displayxiangliang(econfile,xianglianggrid);
    xiangliang.TabVisible := econfile.setxiangliangtotal>0;

    if econfile.setxiebototal>0 then displayxiebo(econfile,xiebogrid);
    xiebo.TabVisible := econfile.setxiebototal>0;

    mainform.pagecon.Visible := true;


    statusbar1.Panels[0].Text := '通讯未开始';
    temp := econfile.comm.mode;
    if (uppercase(temp)='RTU') then modbusrtu1.Checked:=true;
    if (uppercase(temp)='ASCII') then modbusascii1.Checked:=true;

    case econfile.comm.portnum of
      1: com11.Checked := true;
      2: com21.Checked := true;
      3: com31.checked := true;
      4: com41.checked := true;
      else com11.checked := true;
    end;

    case econfile.comm.parity of
      0: paritynone.Checked := true;
      1: parityodd.Checked := true;
      2: parityeven.checked := true;
    end;

    case econfile.comm.baudrate of
      110: b110.Checked := true;
      300: b300.Checked := true;
      600: b600.Checked := true;
      1200: b1200.Checked := true;
      2400: b2400.Checked := true;
      4800: b4800.Checked := true;
      9600: b9600.Checked := true;
      14400: b14400.Checked := true;
      19200: b19200.Checked := true;
      38400: b38400.Checked := true;
      56000: b56000.Checked := true;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -