?? 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 + -