📄 econv230p.pas
字号:
//-----------------------------------------------------------
//* 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 + -