📄 commclass.~pas
字号:
//******************************************************************************
//*本单元功能是继承了Comm的一个类模块 *
//*单元名称:CommClass *
//*单元功能:232-485通讯 *
//*具体描述: *
//*开发作者:张志华 *
//*电子邮件:E-mail(MSN):luer88@163.net; QQ:29763034 TEL:13088096280 *
//*开发日期:2004-10-11 *
//*使用方法:用户需要向串口发送指定的字符的时候只需要调用相应的命令函数,然后再*
///*调用统一的发送函数SendByte(x:integer)其中X表示该命令需要发送的BUF的个数 *
//*属 性: *
//*修改日期: *
//******************************************************************************
//************************函数里参数的定义如下********************************//
//ControllerAddr :integer;//集中器
//TerminalNo :Integer;//用户终端
//PortNo :Integer;//端口号
//TerminalCount :Integer;//用户终端数
//TerminalSet :Integer;//用户终端数
//UportReader :Integer;//端口读数
//UportSet :Integer;//端口配置
//UportOpen :Integer;//端口开关开
//UportClose :Integer;//端口开关关
//************************函数里参数的定义如上********************************//
unit CommClass;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs,Contnrs,Variants,StdCtrls
,IniFiles,UnitCommSet,SPComm;
const
WM_SHOWMESSAGE = WM_USER + 100;
type
TSPComm = class(TComm)
private
MyCommName :String;//串口名称
MyBaudRate :integer;//波特率
Sbuf :array[0..12] of byte; //发送字符的数组
Rbuf :array[0..255] of byte; //接收字符的数组
protected
procedure InitInf;//初始化信息
public
Sendviewstring :string; //向串口发送的字符
Receviewstring :string; //接收串口回传的字符
MSGString :String;//信息显示的字符
PublicStr :String;//公共字符串
ContStatus :Integer; //集中器状态返回的Rbuf[]的值
//ContAddr :Byte; //回传集中器地址返回的Rbuf[]的值
ControllerAddr :integer;//集中器
constructor Create(AOwner: TComponent);
destructor destroy;override;
procedure Start; //打开串口
procedure Stope; //关闭串口
procedure ReadContStatus(ControllerAddr:integer); //读集中器状态
procedure ReadContAddress; //读集中器地址
procedure ReadContTerminalCount(ControllerAddr:integer); //读用户终端数
procedure ReadIPStates(ControllerAddr:integer); //读网络测试状态
procedure WriteContAddr(ControllerAddr:integer);//写集中器地址
procedure WriteContTerminalCount(ControllerAddr:integer;TerminalCount:integer);//写用户终端数
procedure ReadTerminalStatus(ControllerAddr:integer;TerminalNo:integer); //读智能终端状态的命令
procedure ReadTerminalSet(ControllerAddr:integer;TerminalNo:integer);//读智能终端配置的命令
procedure ReadTerminalAddr;//读智能终端地址的命令
procedure WriteTerminalSet(ControllerAddr:integer;TerminalNo:integer;TerminalSet:integer);//写智能终端配置的命令
procedure WriteTerminalAddr(TerminalNo:integer);//写智能终端地址的命令
procedure ReadUportSet(ControllerAddr:integer;TerminalNo:integer;PortNo:integer);//读端口配置的命令
procedure ReadUportReader(ControllerAddr:integer;TerminalNo:integer;PortNo:integer);//读端口数值的命令
procedure WriteUportReader(ControllerAddr:integer;TerminalNo:integer;PortNo:integer;UportReader:integer); //写端口数值的命令
procedure WriteUportSet(ControllerAddr:integer;TerminalNo:integer;PortNo:integer;UportSet:integer);//写端口配置的命令
procedure WriteUportOpenClose(ControllerAddr:integer;TerminalNo:integer;PortNo:integer;UportOpen:integer);//端口开关开的命令
procedure ReadUportOpenClose(ControllerAddr:integer;TerminalNo:integer;PortNo:integer);//读端口开关开状态的命令
//串口通讯事件
procedure ReceiveData(Sender:TObject;Buffer:Pointer;BufferLength:Word);
procedure SendMSG;
//procedure SendMESSAGE;
function SendByte(x:integer):boolean; //读集中器状态 x表示循环的次数
//****************单片机回传的字符的处理的函数************************//
function ToPCContStatus(ControllerAddr:Integer;ContStatus:Integer):String; //回传集中器状态
function ToPCContAddress(ContAddr:Byte):Integer; //回传集中器地址
function ToPCTerminalCount(ContAddr:Byte;TerminalCount:Byte):Integer; //回传集中器用户终端数
function ToPCReadIPStates(ContAddr:Byte;TerminalCount:Byte):Integer; //回传集中器网络测试状态
function ToPCTerminalStatus(ControllerAddr:Integer;TerminalNo:Integer;Warninfo:Integer;TerminalStatus:Integer):String;//回传用户终端状态
function ToPCTerminalAddr(TerminalNoAddr:Integer):Integer; //回传用户终端的地址
function ToPCUportRead(ControllerAddr:Integer;TerminalNoAddr:Integer;Uport:Integer;ReadData:Integer):Int64;//回传用户端口的读数
function ToPCUportSet(ControllerAddr:Integer;TerminalNoAddr:Integer;Uport:Integer;UportSet:Integer):String;//回传用户端口的配置
end;
implementation
uses UnitPublic, UnitMain;
{
******************************** TMyComm****************************************
}
constructor TSPComm.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Outx_CtsFlow:=False;
Outx_DsrFlow:=False;
Outx_XonXoffFlow:=False;
ParityCheck:=False;
InitInf; //初始化过程
OnReceiveData:=ReceiveData;
end;
destructor TSPComm.destroy;
begin
Stope;
inherited;
end;
//把系统设置的初始化;
procedure TSPComm.InitInf;
var
f :TIniFile;
begin
f:=TIniFile.Create(ExtractFileDir(application.Exename)+'\SystemSet.ini');
try
MyCommName:=f.ReadString('CommSeting','CommName',''); //服务端口号
MyBaudRate:=StrToint(f.ReadString('CommSeting','BaudRate','')); //服务端口号
except
frm_CommSet:=Tfrm_CommSet.Create(self);
frm_CommSet.ShowModal;
frm_CommSet.Free;
f.Free;
Exit;
end;
f.Free;
end;
procedure TSPComm.SendMSG;
begin
if Length(MSGString)<>0 then
begin
SendMessage(frm_Main.Handle,WM_SHOWMESSAGE,Integer(PChar(MSGString+' '+DateTimeToStr(now))),0);
end;
end;
//打开串口
procedure TSPComm.Start;
begin
CommName:=MyCommName;
BaudRate:=MyBaudRate;
try
StartComm;
PublicStr:='系统占用的是'+MyCommName+'串口 已经打开 波特率为:'+IntToStr(MyBaudRate);
except
Application.MessageBox('系统错误!','系统打开串口失败!',MB_ok);
frm_CommSet:=Tfrm_CommSet.Create(self);
frm_CommSet.ShowModal;
frm_CommSet.Free;
Exit;
end;
end;
//关闭串口
procedure TSPComm.Stope;
begin
try
StopComm;
except
Application.MessageBox('系统错误!','系统关闭串口失败!',MB_ok);
Exit;
end;
end;
//自定义发送函数
function TSPComm.SendByte(x:integer):boolean;
var
i:integer;
commflg:boolean;
begin
Sendviewstring:='' ;
commflg:=true;
for i:=0 to x do
begin
if not WriteCommData(@Sbuf[i],1) then
begin
commflg:=false;
break;
end;
//发送字节时的延时
//sleep(100);
Sendviewstring:=Sendviewstring +inttohex(Sbuf[i],2)+' ' ;
end;
Sendviewstring:=Sendviewstring;
result := commflg;
end;
{
//^^^^^^^^^^^^^^^^^^^^^^^^^计算机向单片机发送指令^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
}
//*************************集中器命令*****************************************//
//发送读集中器状态的命令
procedure TSPComm.ReadContStatus(ControllerAddr:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$A0; //表示读单元集中器状态
Sbuf[3]:=$3; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=Lo(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Sbuf[2]+Sbuf[3]+ Sbuf[4]+Sbuf[5]; //取得校验和
SendByte(6);
end;
//读集中器地址
procedure TSPComm.ReadContAddress;
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$A2; //表示读单元集中器状态
Sbuf[3]:=$3; //表示三个字长
Sbuf[4]:=0; //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=0; //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Sbuf[2]+Sbuf[3]+ Sbuf[4]+Sbuf[5]; //取得校验和
SendByte(6);
end;
//读用户终端数
procedure TSPComm.ReadContTerminalCount(ControllerAddr:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$A6; //表示读单元集中器状态
Sbuf[3]:=$3; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=Lo(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Sbuf[2]+Sbuf[3]+ Sbuf[4]+Sbuf[5]; //取得校验和
SendByte(6);
end;
//读网络测试状态
procedure TSPComm.ReadIPStates(ControllerAddr:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$A7; //表示读单元集中器状态
Sbuf[3]:=$3; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=Lo(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Sbuf[2]+Sbuf[3]+ Sbuf[4]+Sbuf[5]; //取得校验和
SendByte(6);
end;
//写集中器地址
procedure TSPComm.WriteContAddr(ControllerAddr:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$A1; //表示读单元集中器状态
Sbuf[3]:=$3; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=LO(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]; //取得校验和
SendByte(6);
end;
//写用户终端数
procedure TSPComm.WriteContTerminalCount(ControllerAddr:integer;TerminalCount:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$A5; //表示读单元集中器状态
Sbuf[3]:=$4; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=Lo(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=LO(TerminalCount);//用户终端数
Sbuf[7]:=Sbuf[2]+Sbuf[3]+ Sbuf[4]+Sbuf[5]+Sbuf[6]; //取得校验和
SendByte(7);
end;
//***********************智能终端命令*****************************************//
//读智能终端状态的命令
procedure TSPComm.ReadTerminalStatus(ControllerAddr:integer;TerminalNo:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$B0; //表示读单元集中器状态
Sbuf[3]:=$4; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=Lo(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Lo(TerminalNo); //被查询智能终端号的低8位 调用Lo函数
Sbuf[7]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]; //取得校验和
SendByte(7);
end;
//读智能终端配置的命令
procedure TSPComm.ReadTerminalSet(ControllerAddr:integer;TerminalNo:integer);
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$B4; //表示读单元集中器状态
Sbuf[3]:=$4; //表示三个字长
Sbuf[4]:=HI(ControllerAddr); //被查询集中器号的高8位 调用HI函数
Sbuf[5]:=Lo(ControllerAddr); //被查询集中器号的低8位 调用Lo函数
Sbuf[6]:=Lo(TerminalNo); //被查询智能终端号的低8位 调用Lo函数
Sbuf[7]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]; //取得校验和
SendByte(7);
end;
//读智能终端地址的命令
procedure TSPComm.ReadTerminalAddr;
begin
Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
Sbuf[2]:=$B2; //表示读单元集中器状态
Sbuf[3]:=$2; //表示三个字长
Sbuf[4]:=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -