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

📄 commclass.~pas

📁 delphi基于工业控制的串口通讯
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
//******************************************************************************
//*本单元功能是继承了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 + -