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

📄 tcpmod.pas

📁 delphi开发的基于 gprsd数据采集程序
💻 PAS
字号:
unit TcpMod;

interface

uses
  SysUtils, Classes, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient,Dialogs,record_define, DB, ADODB,Term,windows, IdUDPBase,
  IdUDPServer,IdSocketHandle;

type
     TClientHandleThread = class(TThread)
     private
         CB: TCommBlock;
         procedure HandleInput;
     protected
         procedure Execute; override;
     end;
type
  TTcpModule = class(TDataModule)
    IdTCPClient1: TIdTCPClient;
    ADOQuery1: TADOQuery;
    ADOStoredProc1: TADOStoredProc;
    ADOConnection1: TADOConnection;
    IdUDPServer1: TIdUDPServer;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
    ClientHandleThread: TClientHandleThread;
    procedure Tcp_connect;
    procedure Tcp_disconnect;
    procedure refresh;

    procedure ADOinit(ADOStoredProc1: TADOStoredProc);

    procedure send_data(buf:array of char;data_len:byte);
  end;

function refresh_opera:integer;stdcall;
var
  TcpModule: TTcpModule;
implementation

uses Unit1, Unit3;

{$R *.dfm}

{ TTcpModule }

procedure TTcpModule.Tcp_connect;
begin
    try
      self.IdTCPClient1.Connect(10000);
      ClientHandleThread := TClientHandleThread.Create(True);
      ClientHandleThread.FreeOnTerminate:=True;
      ClientHandleThread.Resume;
    except
      //on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
    end;
end;

procedure TTcpModule.Tcp_disconnect;
begin
    try
       ClientHandleThread.Terminate;
       IdTCPClient1.Disconnect;
    except
    end;
end;

procedure TClientHandleThread.HandleInput;
var
    str:string;
begin
     char_to_str(cb.tcp_data,cb.data_long,str);
     if form3_show then
        form3.Memo1.Lines.Add(str);
     //insert_blank(str);
     //showmessage(str);
     mainform.term_set.deal_data(cb.tcp_data,cb.data_long);
end;

procedure TClientHandleThread.Execute;
var
    i:integer;
begin
  while not Terminated do
  begin
    if not TcpModule.IdTCPClient1.Connected then
         Terminate
    else
    try
       TcpModule.IdTCPClient1.ReadBuffer(cb,sizeof(cb));
       Synchronize(HandleInput);
    except
    end;
  end;
end;

procedure TTcpModule.DataModuleCreate(Sender: TObject);
var
    connect_file:textfile;
    connect_str:string;
begin
    assignfile(connect_file,'connect.ini');
    Reset(connect_file);
    readln(connect_file,connect_str);
    closefile(connect_file);

    ADOQuery1.ConnectionString:=connect_str;
    self.ADOConnection1.ConnectionString:=connect_str;

    //040518修改
    //Tcp_connect;
end;

procedure TTcpModule.DataModuleDestroy(Sender: TObject);
begin
    //040518修改
    //Tcp_disconnect;
end;

procedure TTcpModule.refresh;
var
    hThread:Thandle;
    ThreadID:DWord;
begin
    //创建线程,同时线程函数被调用
    hthread:=CreateThread(nil,0,@refresh_opera,nil,0,ThreadID);
    if hThread=0 then
       showmessage('创建线程失败');
end;

function refresh_opera:integer;stdcall;
var
    sql_str:string;
    i,gprs_id:integer;
    term_id:byte;
    term_obj:TTerm;
begin
    with mainform.term_set.members do
    begin
       for i:=0 to Count-1 do
            TTerm(items[i]).worked:=false;
    end;
    
    sql_str:='select * from vterminfo';
    with TcpModule do
    begin
       ADOQuery1.Close;
       ADOQuery1.SQL.Clear;
       ADOQuery1.SQL.Add(sql_str);
       ADOQuery1.Open;
       ADOQuery1.First;
       for i:=0 to ADOQuery1.RecordCount-1 do
       begin
           //term_obj:=TTerm.Create;
           gprs_id:=ADOQuery1.FieldByName('GPRS_ID').AsInteger;
           term_id:=ADOQuery1.FieldByName('TER_ID').AsInteger;
           term_obj:=mainform.term_set.find_term(gprs_id,term_id);
           if term_obj=nil then
           begin
                term_obj:=TTerm.Create;
                term_obj.gprs_id:=ADOQuery1.FieldByName('GPRS_ID').AsInteger;
                term_obj.term_id:=ADOQuery1.FieldByName('TER_ID').AsInteger;
                term_obj.app_id:=ADOQuery1.FieldByName('APP_ID').AsInteger;
                term_obj.well_id:=ADOQuery1.FieldByName('WELL_ID').AsInteger;
                term_obj.summit_type:=ADOQuery1.FieldByName('SUMMIT_TYPE').AsInteger;
                term_obj.collect_inteval:=ADOQuery1.FieldByName('COLLECT_INTERVAL').AsInteger;
                term_obj.packet_inteval:=ADOQuery1.FieldByName('SUMMIT_INTERVAL').AsInteger;
                term_obj.remedy_count_max:=ADOQuery1.FieldByName('REMEDY_COUNT').AsInteger;
                if term_obj.summit_type=TEMP_SUMMIT then
                    term_obj.second_count:=term_obj.collect_inteval
                else
                    term_obj.second_count:=term_obj.packet_inteval;
                term_obj.remedy_cound:=0;
                term_obj.remedy_interval:=REMEDY_SECOND;
                term_obj.worked:=true;
                term_obj.obtained:=true;

                mainform.term_set.members.Add(term_obj);
           end
           else
           begin
                term_obj.app_id:=ADOQuery1.FieldByName('APP_ID').AsInteger;
                term_obj.well_id:=ADOQuery1.FieldByName('WELL_ID').AsInteger;
                term_obj.summit_type:=ADOQuery1.FieldByName('SUMMIT_TYPE').AsInteger;
                term_obj.collect_inteval:=ADOQuery1.FieldByName('COLLECT_INTERVAL').AsInteger;
                term_obj.packet_inteval:=ADOQuery1.FieldByName('SUMMIT_INTERVAL').AsInteger;
                term_obj.remedy_count_max:=ADOQuery1.FieldByName('REMEDY_COUNT').AsInteger;
                term_obj.worked:=true;
           end;
           ADOQuery1.Next;
       end;
       ADOQuery1.Close;
    end;

    i:=0;
    with mainform.term_set.members do
    begin
       while i<count do
       begin
            if TTerm(items[i]).worked=false then
            begin
               Remove(items[i]);
               i:=i-1;
            end;
            i:=i+1;
       end;
    end;

    //form3.add_term_to_listview;
end;

procedure TTcpModule.ADOinit(ADOStoredProc1: TADOStoredProc);
var
    para:TParameter;
    i:integer;
    connect_file:textfile;
    connect_str:string;
begin
    ADOStoredProc1.Parameters.Clear;
    para:=ADOStoredProc1.Parameters.AddParameter;
    para.Name:='APP_ID';
    para.DataType:=ftInteger;

    para:=ADOStoredProc1.Parameters.AddParameter;
    para.Name:='WELL_ID';
    para.DataType:=ftInteger;

    para:=ADOStoredProc1.Parameters.AddParameter;
    para.Name:='COLLECT_TIME';
    para.DataType:=ftDateTime;

    para:=ADOStoredProc1.Parameters.AddParameter;
    para.Name:='DATA_COUNT';
    para.DataType:=ftDateTime;

    for i:=1 to 32 do
    begin
        para:=ADOStoredProc1.Parameters.AddParameter;
        para.Name:='DATA'+inttostr(i);
        para.DataType:=ftInteger;
    end;
    ADOStoredProc1.ProcedureName:='DATA_CALC';

    assignfile(connect_file,'connect.ini');
    Reset(connect_file);
    readln(connect_file,connect_str);
    //readln(connect_file,proc_name_str);
    closefile(connect_file);

    ADOStoredProc1.ConnectionString:=connect_str;
end;

procedure TTcpModule.send_data(buf: array of char; data_len: byte);
begin
     self.IdUDPServer1.SendBuffer('10.70.18.7',6868,buf,data_len);
end;

procedure TTcpModule.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
   str:string;
   buf: array [0..255] of char;
   data_len,i: byte;
begin
    AData.Read(buf,AData.Size);
    data_len:=AData.Size;

    {char_to_str(buf,data_len,str);
    if form3_show then
        form3.Memo1.Lines.Add(str);}
    mainform.term_set.deal_data(buf,data_len);
end;

end.

⌨️ 快捷键说明

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