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

📄 commclass.~pas

📁 delphi基于工业控制的串口通讯
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
    Sbuf[5]:=Sbuf[2]+Sbuf[3]+Sbuf[4]; //取得校验和
    SendByte(5);
end;
//写智能终端地址的命令
procedure TSPComm.WriteTerminalAddr(TerminalNo:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$B1;    //表示读单元集中器状态
    Sbuf[3]:=$2;  //表示三个字长
    Sbuf[4]:=Lo(TerminalNo);
    Sbuf[5]:=Sbuf[2]+Sbuf[3]+Sbuf[4]; //取得校验和
    SendByte(5);
end;
//写智能终端配置的命令
procedure TSPComm.WriteTerminalSet(ControllerAddr:integer;TerminalNo:integer;TerminalSet:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$B3;    //表示读单元集中器状态
    Sbuf[3]:=$5;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=Lo(TerminalSet);
    Sbuf[8]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]; //取得校验和
    SendByte(8);
end;
//*************************端口端命令*****************************************//
//读端口配置的命令
procedure TSPComm.ReadUportSet(ControllerAddr:integer;TerminalNo:integer;PortNo:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$C4;    //表示读单元集中器状态
    Sbuf[3]:=$5;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=LO(PortNo);
    Sbuf[8]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]; //取得校验和
    SendByte(8);
end;
//读端口数值的命令
procedure TSPComm.ReadUportReader(ControllerAddr:integer;TerminalNo:integer;PortNo:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$C6;    //表示读单元集中器状态
    Sbuf[3]:=$5;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=LO(PortNo);
    Sbuf[8]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]; //取得校验和
    SendByte(8);
end;
//写端口数值的命令
procedure TSPComm.WriteUportReader(ControllerAddr:integer;TerminalNo:integer;PortNo:integer;UportReader:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$C5;    //表示读单元集中器状态
    Sbuf[3]:=$9;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=LO(PortNo);
    Sbuf[8]:=Lo(UportReader);
    Sbuf[9]:=Hi(UportReader);
    Sbuf[10]:=Lo(UportReader div 65536);//Sbuf[10]:=Lo(UportReader div $10000);
    Sbuf[11]:=Hi(UportReader div 65536);//Sbuf[11]:=Hi(UportReader div $10000);
    Sbuf[12]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]+Sbuf[8]+Sbuf[9]+Sbuf[10]+Sbuf[11]; //取得校验和
    SendByte(12);
end;
//写端口配置的命令
procedure TSPComm.WriteUportSet(ControllerAddr:integer;TerminalNo:integer;PortNo:integer;UportSet:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$C3;    //表示读单元集中器状态
    Sbuf[3]:=$6;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=LO(PortNo);
    Sbuf[8]:=Lo(UportSet);
    Sbuf[9]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]+Sbuf[8]; //取得校验和
    SendByte(9);
end;
//端口开关开的命令
procedure TSPComm.WriteUportOpenClose(ControllerAddr:integer;TerminalNo:integer;PortNo:integer;UportOpen:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$C7;    //表示读单元集中器状态
    Sbuf[3]:=$6;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=LO(PortNo);
    Sbuf[8]:=Lo(UportOpen);
    Sbuf[9]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]+Sbuf[8]; //取得校验和
    SendByte(9);
    //EditSpcomStates(UportOpen,ControllerAddr,TerminalNo,PortNo);
end;

//读端口开关开状态的命令
procedure TSPComm.ReadUportOpenClose(ControllerAddr:integer;TerminalNo:integer;PortNo:integer);
begin
    Sbuf[0]:=$7e; //表示ox7e7e中的第一个7e
    Sbuf[1]:=$7e; //表示ox7e7e中的第二个7e
    Sbuf[2]:=$C8;    //表示读单元集中器状态
    Sbuf[3]:=$5;  //表示三个字长
    Sbuf[4]:=HI(ControllerAddr);       //被查询集中器号的高8位 调用HI函数
    Sbuf[5]:=Lo(ControllerAddr);       //被查询集中器号的低8位  调用Lo函数
    Sbuf[6]:=Lo(TerminalNo);           //被查询智能终端号的低8位  调用Lo函数
    Sbuf[7]:=LO(PortNo);
    Sbuf[8]:=Sbuf[2]+Sbuf[3]+Sbuf[4]+Sbuf[5]+Sbuf[6]+Sbuf[7]; //取得校验和
    SendByte(8);
end;
{
//^^^^^^^^^^^^^^^^^^^^^^^^^单片机计算机向发送指令^^^^^^^^^^^^^^^^^^^^^^^^^^^^^//
}
//回传集中器状态
function TSPComm.ToPCContStatus(ControllerAddr:Integer;ContStatus:Integer):String;
var
    IniContStatesData:TIniFile;
    f:TIniFile;
begin
    IniContStatesData:=TIniFile.Create(ExtractFileDir(application.Exename)+'\SystemSet.ini');
    Result:=IniContStatesData.ReadString('ContStatesData',intToStr(ContStatus),'');
    IniContStatesData.Free;
    MSGString:=IntToStr(ControllerAddr)+'号集中器'+Result;
    SendMSG;
end;
//回传集中器地址
function TSPComm.ToPCContAddress(ContAddr:Byte):Integer;
begin
    Result:=ContAddr;
    MSGString:='集中器地址是:'+IntToStr(Result);
    SendMSG;
end;
//回传集中器用户终端数
function TSPComm.ToPCTerminalCount(ContAddr:Byte;TerminalCount:Byte):Integer;
begin
    Result:=TerminalCount;
    MSGString:=IntToStr(ContAddr)+'号集中器的用户终端数:'+IntToStr(Result);
    SendMSG;
end;
//回传集中器网络测试状态
function TSPComm.ToPCReadIPStates(ContAddr:Byte;TerminalCount:Byte):Integer;
var
    tempstr:String;
    i:integer;
begin
    Result:=TerminalCount;
    MSGString:=IntToStr(ContAddr)+'号集中器未应答的用户终端数:'+IntToStr(Result)+'个。';
    if Result>0 then
    begin
        for i:=7 to 7+TerminalCount-1 do
        begin
            tempstr:='未应答终端号'+IntTostr(Rbuf[i]);
            MSGString:=MSGString+''+tempstr+',';
        end;
    end;
    SendMSG;
end;
//回传用户终端状态
function TSPComm.ToPCTerminalStatus(ControllerAddr:Integer;TerminalNo:Integer;Warninfo:Integer;TerminalStatus:Integer):String;
var
    IniTerminalStatesData:TIniFile;
    f:TIniFile;
    Warnif:String;
begin
    IniTerminalStatesData:=TIniFile.Create(ExtractFileDir(application.Exename)+'\SystemSet.ini');
    Result:=IniTerminalStatesData.ReadString('TerminalStatesData',intToStr(TerminalStatus),'');
    IniTerminalStatesData.Free;
    if Warninfo=0 then
    begin
        Warnif:='';
        Warnif:='已关告警';
    end;
    if Warninfo=1 then
    begin
        Warnif:='';
        Warnif:='已开告警';
    end;
    MSGString:=IntToStr(ControllerAddr)+'号集中器下的'+IntToStr(TerminalNo)+'号智能终端的状态为:'+Warnif+Result;
    SendMSG;
end;
//回传用户终端的地址
function TSPComm.ToPCTerminalAddr(TerminalNoAddr:Integer):Integer;
begin
    Result:=TerminalNoAddr;
    MSGString:='智能终端地址为:'+IntToStr(Result)+'号';
    SendMSG;
end;
//回传用户端口的读数
function TSPComm.ToPCUportRead(ControllerAddr:Integer;TerminalNoAddr:Integer;Uport:Integer;ReadData:Integer):Int64;
begin
    Result:=ReadData;
    if ReadData>1 then
    begin
        MSGString:=IntToStr(ControllerAddr)+'号集中器下的'+IntTostr(TerminalNoAddr)+'号智能终端下的'+IntToStr(Uport)+'号端口报警';
        SendMSG;
        if ValuesStr='1' then  //系统允许连动报警
        begin
            WriteUportOpenClose(ControllerAddr,TerminalNoAddr,Uport+4,ResultVlues);
        end;
        OpenMusic(ControllerAddr,TerminalNoAddr,Uport);
    end;
end;
//回传用户端口的配置
function TSPComm.ToPCUportSet(ControllerAddr:Integer;TerminalNoAddr:Integer;Uport:Integer;UportSet:Integer):String;
Var
    MyIni:TiniFile;
    Equipment:String;
    i:Integer;
begin
    Result:=IntToStr(UportSet);
    MyIni:=TIniFile.Create(ExtractFileDir(application.Exename)+'\SystemSet.ini');
    Equipment:=MyIni.ReadString('UportSetData','0x'+Pchar(Result),'');
    MyIni.Free;
    MSGString:=IntToStr(ControllerAddr)+'号集中器下的'+IntTostr(TerminalNoAddr)+'号智能终端下的'+IntToStr(Uport)+'号端口的设备配置为:'+Equipment;
    SendMSG;
end;

//接收处理事件
procedure TSPComm.ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
    i:Integer;
    icount:Integer;
    UportData:int64;
begin
    Receviewstring:='' ;
    move(buffer^,Rbuf,BufferLength);
    if ((inttohex(Rbuf[0],2) <>'7E') and (inttohex(Rbuf[1],2) <>'7E')) then exit; //
    for i:=0 to BufferLength-1 do
    Receviewstring:=Receviewstring + IntToHex(Rbuf[i],2)+' ' ;
    Receviewstring:=Receviewstring;
    //SHOWMESSAGE(Receviewstring);
    if ((Rbuf[0]=byte($7E)) and (Rbuf[1]=byte($7E))) then
    begin
        //***************集中器类*********************************************//
        //回传集中器状态
        if ((Rbuf[2]=byte($A0)) and (Rbuf[3]=byte($04)) and (Rbuf[7]=LO((Rbuf[2]+Rbuf[3]+Rbuf[4]+Rbuf[5]+Rbuf[6])))) then
        begin
            ToPCContStatus(Rbuf[4]*16+Rbuf[5],Rbuf[6]);
        end;
        //回传集中器地址
        if ((Rbuf[2]=byte($A2)) and (Rbuf[3]=byte($03)) and (Rbuf[6]=LO((Rbuf[2]+Rbuf[3]+Rbuf[4]+Rbuf[5])))) then
        begin
            //ContAddr:=Rbuf[4]*16+Rbuf[5];
            ToPCContAddress(Rbuf[4]*16+Rbuf[5]);
        end;
        //回传集中器用户终端数
        if ((Rbuf[2]=byte($A6)) and (Rbuf[3]=byte($04)) and (Rbuf[7]=LO((Rbuf[2]+Rbuf[3]+Rbuf[4]+Rbuf[5]+Rbuf[6])))) then
        begin
            ToPCTerminalCount(Rbuf[4]*16+Rbuf[5],Rbuf[6]);
        end;
        //回传集中器网络测试状态
        if Rbuf[2]=byte($A7)then// and (Rbuf[3]>=byte($04))) then
        begin
            ToPCReadIPStates(Rbuf[4]*16+Rbuf[5],Rbuf[3]-4);
        end;
        //***************用户终端类*******************************************//
        //回传集中器用下的户终端的状态
        if ((Rbuf[2]=byte($B0)) and (Rbuf[3]=byte($06)) and (Rbuf[9]=LO((Rbuf[2]+Rbuf[3]+Rbuf[4]+Rbuf[5]+Rbuf[6]+Rbuf[7]+Rbuf[8])))) then
        begin
            ToPCTerminalStatus(Rbuf[4]*16+Rbuf[5],Rbuf[6],Rbuf[7],Rbuf[8]);
        end;
        //回传户终端的地址
        if ((Rbuf[2]=byte($B2)) and (Rbuf[3]=byte($02)) and (Rbuf[5]=LO((Rbuf[2]+Rbuf[3]+Rbuf[4])))) then
        begin
            ToPCTerminalAddr(Rbuf[4]);
        end;
        //***************用户终端口类*****************************************//
        //回传户终端口的读数
        if ((Rbuf[2]=byte($C6)) and (Rbuf[3]=byte($09)) and (Rbuf[12]=LO(Rbuf[2]+Rbuf[3]+Rbuf[4]+Rbuf[5]+Rbuf[6]+Rbuf[7]+Rbuf[8]+Rbuf[9]+Rbuf[10]+Rbuf[11]))) then
        begin
            UportData:=(Rbuf[8])+(Rbuf[9])*256+(Rbuf[10])*256*256+(Rbuf[11])*256*256*256;
            ToPCUportRead(Rbuf[4]*16+Rbuf[5],Rbuf[6],Rbuf[7],UportData);
        end;
        //回传户终端口的配置
        if ((Rbuf[2]=byte($C4)) and (Rbuf[3]=byte($06)) and (Rbuf[9]=LO(Rbuf[2]+Rbuf[3]+Rbuf[4]+Rbuf[5]+Rbuf[6]+Rbuf[7]+Rbuf[8]))) then
        begin
            ToPCUportSet(Rbuf[4]*16+Rbuf[5],Rbuf[6],Rbuf[7],Rbuf[8]);
        end;
    end;
end;

end.

⌨️ 快捷键说明

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