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

📄 zje_basefuncomm.pas

📁 串口数据传输,用Tcomm或MSComm控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
///////////////////////////////////////////////////////////////////////////////
//程序功能:读写串口函数区
///////////////////////////////////////////////////////////////////////////////

unit ZjE_BaseFunComm;

interface

uses
  Classes,SysUtils,Nb30, Windows, dbtables, StrUtils, QDialogs,
  Forms, ExtCtrls, Dialogs, StdCtrls, Messages, WinProcs, WinSock,
  Controls, Registry, Printers, IniFiles, Variants, DB, Graphics,TZj_TComm;

type
  TReceiveDataEvent = procedure(Sender: TObject) of object;
  TCommonFunction = class
   private
     get_data : array[1..20] of integer;
     get_data_16 : array[1..40] of integer;
     get_data_error : array [1..200] of integer; //接收$25命令回响
     FOncomm : TReceiveDataEvent;
     Comm1: TComm;
     watch_port_timer: TTimer;
     get_room_name : string;
     input_len : integer ; //接收到的数据的下标
     command_type : integer ; //阻性和非阻性的标志
   public
    procedure checksum;   // 写校验字
    procedure clear;
    procedure purgecomm_all;
    procedure outputdata;
    procedure Delay(msecs:integer);
    constructor create;
    procedure oncomm(Sender: TObject);
    procedure ontimer(Sender: TObject);
    function  get_command(command_buf : array of byte): string;
    { *------------------------------读涵数begin--------------------------------* }
    function  ReadCommunicate(Icode_Build,Ichannel_count:integer;Scname:string;var aFquantity: array of Real;var SCommandInfo,SErrorInfo:string):Boolean;    //1读全通道剩余电量
           ////1读全通道(按通信板)剩余电量(栋号,房间数,板地址;var 每房间的剩余电量;var 主机发命令,从机发回的错误回执)
    function  ReadSingleRoom(SRoomCname,SMachine:string;var fQuantity,fRoom_power,FLimit_Power_Read,fUseQuantity,fRoom_angel:Real;var Icode_state:integer;var SCommandInfo,SErrorInfo:string):Boolean;    //5读单户数据
           //5读单户数据(用户房号,机器号;var 剩余电量,当前功率,当前功限,用电量/电量差,当前角度;var 电用状态;var 主机发命令,从机发回的错误回执)
    { *------------------------------读涵数end----------------------------------* }

    { *------------------------------写涵数begin--------------------------------* }
    function  WriteSingleRoom(SRoomCname,SMachine:string;fFillQuantity:Real;var SCommandInfo,SErrorInfo:string):Boolean;    //7设置单户电量(加电量)
           //7设置单户电量(用户房号,机器号;用补电量;var 主机发命令,从机发回的错误回执)
    { *------------------------------写涵数end----------------------------------* }


    //comm1: COM口;building_id:楼ID; board_count:通讯板数量;key_password: 卡密钥
    //全栋公共数据数据初始化1
    function setbuilding_1(comm_port : string; building_id : integer; board_count : integer; key_password : integer ; var SCommandInfo,SErrorInfo:string):boolean;

    //comm1: COM口;building_id:楼ID; count_1:购电数
    //全栋公共数据数据初始化2
    function setbuilding_2(comm_port : string; building_id : integer; count_1 : real; var SCommandInfo,SErrorInfo:string):boolean;

    //comm1: COM口;building_id:楼ID; count_1:透支电量数
    //全栋公共数据数据初始化3
    function setbuilding_3(comm_port : string; building_id : integer; count_1 : real; var SCommandInfo,SErrorInfo:string):boolean;

    //comm1: COM口;building_id:楼ID; start_time:开始时间; end_time : 关断时间
    //定时开关时间设置
    function setbuilding_open_close_time(comm_port : string; building_id : integer; start_time: ttime;
                                         end_time:ttime; var SCommandInfo,SErrorInfo:string) : boolean;

    //comm1: COM口;building_id:楼ID; power_limit :功率限制; board_adress :该楼的板地址数组; angle: 用户角度
    //该函数不在通讯协议中!!
    function setbuilding_powerlimit_angle(comm_port : string; building_id : integer; power_limit:real;
                                     board_adress : array of integer; angle : integer;
                                     var SCommandInfo,SErrorInfo:string) : boolean;

    //comm1: COM口;building_id:楼ID; power_limit :功率限制; board_adress :该楼的单个板地址;
    //设置全通道功率限制
    function setsingle_board_powerlimit(comm_port : string; building_id : integer; power_limit:real;
                                        board_adress : integer; var SCommandInfo,SErrorInfo:string ) : boolean;

    //comm1: COM口;building_id:楼ID; power_limit :阻性功限; board_adress :该楼的单个板地址; angle: 用户角度
    //设置全通道阻性功限/角度
    function setsingle_board_power_angle(comm_port : string; building_id : integer; power_limit:real;
                                     board_adress : integer; angle : integer;
                                     var SCommandInfo,SErrorInfo:string) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; p :用户是否受开关控制的标志
    //定时开关用户设置
    function setsingle_board_open_close_user(comm_port : string; building_id : integer;
                                             board_adress : integer; p : array of integer;
                                             var SCommandInfo,SErrorInfo:string) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; room_type : 房间性质; channel_no : 通道号
    //设置单用户数据初始化0
    function setroom_0(comm_port : string; building_id : integer; board_adress : integer;
                       room_type : integer; channel_no : integer; room_name : string;
                       var SCommandInfo,SErrorInfo:string) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; power_limit :功率限制; channel_no : 通道号
    //设置单用户功率限制
    function setroom_powerlimit(comm_port : string; building_id : integer; power_limit:real;
                                board_adress : integer; channel_no : integer;
                                var SCommandInfo,SErrorInfo:string ) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; room_quantity :房间电量; channel_no : 通道号
    //设置单用户电量
    function setroom_quantity(comm_port : string; building_id : integer; board_adress : integer;
                              channel_no : integer; room_quantity : real;
                              var SCommandInfo,SErrorInfo:string ) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  channel_no : 通道号
    //退房
    function return_room(comm_port : string; building_id : integer; board_adress : integer;
                         channel_no : integer; var SCommandInfo,SErrorInfo:string ) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  t1~~t8 :读取的用户剩余电量
    //读全通道剩余电量
    function get_single_board_quantity(comm_port : string; building_id : integer; board_adress : integer;
                                      var t1,t2,t3,t4,t5,t6,t7,t8 : real;
                                      var SCommandInfo,SErrorInfo:string): boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  power1~~power8 :读取的用户功率, state1~~state8 : 读取的用电状态
    //读全通道用电状态/功率
    function get_single_board_state_power(comm_port : string; building_id : integer; board_adress : integer;
                                      var power1,power2,power3,power4,power5,power6,power7,power8 : real;
                                      var state1,state2,state3,state4,state5, state6,state7,state8 : integer;
                                      var SCommandInfo,SErrorInfo:string): boolean;


    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  power_limit1~~power_limit8 :读取的用户功限,
    // differ1~~differ8 : 读取的电量差 ;  angle : 读取的角度; hinder : 读取的阻性
    //读全通道功限/电量差/角度/阻性
    function get_single_board_power_and_other(comm_port : string; building_id : integer; board_adress : integer;
                                      var power_limit1,power_limit2,power_limit3,power_limit4,power_limit5,power_limit6,power_limit7,power_limit8 : real;
                                      var differ1,differ2,differ3,differ4,differ5, differ6,differ7,differ8 : real;
                                      var angle : integer;
                                      var hinder : real;
                                      var SCommandInfo,SErrorInfo:string): boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  angle1~~angle8 :读取的角度;
    //读全通道用户角度
    function get_single_board_angle(comm_port : string; building_id : integer; board_adress : integer;
                                    var angle1,angle2,angle3,angle4,angle5,angle6,angle7,angle8 : integer;
                                    var SCommandInfo,SErrorInfo:string): boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; channel_no :通道号 ;
    //room_name : 房名; room_quantity : 剩余电量;room_power :功率;  room_power_limit :功限;
    //differ : 电量差; state : 状态;angle :角度;room_type : 性质
    //读单用户数据
    function get_single_room_data(FaddQ,FSQ:real;comm_port : string; building_id : integer; board_adress : integer;
                                  channel_no : integer;
                                  var room_name : string;
                                  var room_quantity,room_power, room_power_limit: real;
                                  var differ : real;
                                  var state,angle,room_type :integer;
                                  var SCommandInfo,SErrorInfo:string ) : boolean;
    //测试程序用
    function get_single_room_data_for_test(comm_port : string; building_id : integer; board_adress : integer;
                                  channel_no : integer;
                                  var room_name : string;
                                  var room_quantity,room_power, room_power_limit: real;
                                  var differ : real;
                                  var state,angle,room_type :integer;
                                  var SCommandInfo,SErrorInfo:string ) : boolean;


    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; channel_no :通道号 ;
    //add_value : 添加的电量
    //room_name : 房名; room_quantity : 剩余电量;room_power :功率;  room_power_limit :功限;
    //differ : 电量差; state : 状态;angle :角度;room_type : 性质
    //flag_res : 阻性和非阻性的标志, false 为非阻性, true 为阻性
    //添加电量
    function add_room_quantity(flag_res : boolean;comm_port : string; building_id : integer; board_adress : integer;
                                  channel_no : integer; add_value : real;

                                  var SCommandInfo,SErrorInfo:string ) : boolean;

    function get_building_error(comm_port : string; building_id : integer; var p1 : array of string;
                                var SCommandInfo,SErrorInfo:string) : boolean;

    function get_building_info(comm_port : string; building_id : integer;
                               var board_count ,key_password: integer;
                               var count_1,count_2 : real;
                               var SCommandInfo,SErrorInfo:string ): boolean;


//=======================   非阻性命令  =========================================================================
 

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  power1~~power16 :读取的用户功率, state1~~state16 : 读取的用电状态
    //读全通道用电状态/功率
    function get_single_board_state_power_16(comm_port : string; building_id : integer; board_adress : integer;
                                      var power1,power2,power3,power4,power5,power6,power7,power8 : real;
                                      var power9,power10,power11,power12,power13,power14,power15,power16 : real;
                                      var state1,state2,state3,state4,state5, state6,state7,state8 : integer;
                                      var state9,state10,state11,state12,state13, state14,state15,state16 : integer;
                                      var SCommandInfo,SErrorInfo:string): boolean;


    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; channel_no :通道号 ;
    //room_name : 房名; room_quantity : 剩余电量;room_power :功率;  room_power_limit :功限;
    //differ : 电量差; state : 状态;room_type : 性质
    //读单用户数据
    function get_single_room_data_16(FaddQ,FSQ:real;comm_port : string; building_id : integer; board_adress : integer;
                                  channel_no : integer;
                                  var room_name : string;
                                  var room_quantity,room_power, room_power_limit: real;
                                  var differ : real;
                                  var state,room_type :integer;
                                  var SCommandInfo,SErrorInfo:string ) : boolean;
    //测试程序用
    function get_single_room_data_16_for_test(comm_port : string; building_id : integer; board_adress : integer;
                                  channel_no : integer;
                                  var room_name : string;
                                  var room_quantity,room_power, room_power_limit: real;
                                  var differ : real;
                                  var state,room_type :integer;
                                  var SCommandInfo,SErrorInfo:string ) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址; p :用户是否受开关控制的标志
    //定时开关用户设置
    function setsingle_board_open_close_user_16(comm_port : string; building_id : integer;
                                             board_adress : integer; p : array of integer;
                                             var SCommandInfo,SErrorInfo:string) : boolean;
    //===========================================================================================

    function set_board_open_or_close(comm_port : string;board_adress : integer; p :integer;
                                     var SCommandInfo,SErrorInfo:string) : boolean;

    function setuse_quantity(comm_port : string; board_adress : integer;  use_quantity : real;
                              var SCommandInfo,SErrorInfo:string ) : boolean;

    function set_enabled_true(comm_port : string; board_adress : integer; channel_no : integer;
                              var SCommandInfo,SErrorInfo:string) : boolean;

    function set_single_open_or_close(comm_port : string; board_adress : integer; channel_no : integer;
                                      p :integer;  var SCommandInfo,SErrorInfo:string) : boolean;

    function setuse(comm_port : string; board_adress : integer; channel_no : integer;
                              var SCommandInfo,SErrorInfo:string) : boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  power_limit1~~power_limit16 :读取的用户功限,
    // differ1~~differ16 : 读取的电量差 ;
    //读全通道功限/电量差/角度/阻性
    function get_single_board_power_and_other_16(comm_port : string; building_id : integer; board_adress : integer;
                                      var power_limit1,power_limit2,power_limit3,power_limit4,power_limit5,power_limit6,power_limit7,power_limit8 : real;
                                      var power_limit9,power_limit10,power_limit11,power_limit12,power_limit13,power_limit14,power_limit15,power_limit16 : real;
                                      var differ1,differ2,differ3,differ4,differ5, differ6,differ7,differ8 : real;
                                      var differ9,differ10,differ11,differ12,differ13, differ14,differ15,differ16 : real;
                                      var SCommandInfo,SErrorInfo:string): boolean;

    //comm1: COM口;building_id:楼ID; board_adress :该楼的单个板地址;  t1~~t16 :读取的用户剩余电量
    //读全通道剩余电量
    function get_single_board_quantity_16(comm_port : string; building_id : integer; board_adress : integer;
                                      var t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16 : real;
                                      var SCommandInfo,SErrorInfo:string): boolean;
  end;

var
  ZjCommFun: TCommonFunction;



  comport : string;          //串口接在哪个com口
  FirstTickCount:longint;   //开始接收数据的起始时间
  receive_flag : boolean;  //接收到数据的标志
  reacho_i : integer;     //回响是正确回响还是错误回响的标志
 // deal_finish : boolean;     //处理完成的标志

  sendbuf:array[0..5] of byte; //送出数据时用的字节数组
  sendbuf1 : array[0..0] of byte;
  info_type : integer;  //信息类型

  receivebuf_first : array[0..24] of byte;//接收到的信息
  receivebuf_first_1 : array[0..200] of byte;//$25号命令接收到的信息

  Hour_start, Min_start, Sec_start, MSec_start: Word;
  Hour_end, Min_end, Sec_end, MSec_end: Word;

  check_channel : array[1..8] of TCheckBox;
  p:array[1..8] of integer;

  error_s :string;
  get_command_len_25 : integer;
  get_s :string;


implementation

constructor TCommonFunction.create;
begin
  inherited Create;
  comm1 := tcomm.Create(nil);
  FOncomm :=  self.oncomm;
  comm1.OnReceiveData := FOncomm;
  comm1.BaudRate := br9600;
  comm1.DataBits := DB8;
  comm1.Parity := None;
  comm1.StopBits :=  SB1;
  comm1.PortOpen := false;
  comm1.RThreshold := 1;
  comm1.InputLen := 0;
  if comm1.PortOpen = true then comm1.PortOpen := false;

  watch_port_timer := TTimer.Create(nil);
  watch_port_timer.Enabled := false;
  watch_port_timer.OnTimer := ontimer;
end;

procedure TCommonFunction.clear;
var i : integer;
begin
  for i:=0 to 24 do
  receivebuf_first[i] := $00;

  for i:=0 to 200 do
  receivebuf_first_1[i] := $00;
end;

function  TCommonFunction.get_command(command_buf : array of byte): string;
var i: integer;
    s :string;
begin
  s := '';
  for i:=low(command_buf) to High(command_buf) do
  begin
    s := s + inttohex(command_buf[i],2) + '  ';
  end;
  result := s ;
end;

procedure TCommonFunction.ontimer(Sender: TObject);
begin
  if  (((GetTickCount-FirstTickCount) >= Longint(2000)) and (receive_flag = false)) then
  begin
    comm1.CommTimer.Enabled := false;
    comm1.PortOpen := false;
    watch_port_timer.Enabled := false;
   // showmessage('接收失败!!');   //如果本句放在前面会有问题,它会等,那么本来时间
                                  //控件应该enabled为 false ,确由于本句停顿,依然在运行
    exit;
  end;

  if receive_flag = true then
  begin
    comm1.CommTimer.Enabled := false;
    comm1.PortOpen := false;
    watch_port_timer.Enabled := false;
  //  showmessage('接收成功!!');
    exit;
  end;

end;

procedure TCommonFunction.oncomm(Sender: TObject);
var
  x :integer;
  ft:pbyte;  //字节指针
  sum : integer;
  s : string;
  i,len : integer;
  count_h : string;
  count_l : string;
  count : integer;
  count_s : string;
  // s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11 : string;
  k : integer;
  count_variant : variant ;
  data_count : integer;
  command_len_25 : integer; //$25号命令回响的长度
  s1 :string;
begin
  {
  if (info_type = $25) then
  begin
    //第一次一定要等到 6 个字节!!
    if (input_len = 0) and (comm1.DataCount < 6) and (comm1.DataCount > 0) then
    begin
      //receive_flag := true;
      reacho_i := 0 ;
      error_s := '回响数据长度不够!!' ;
      exit;

⌨️ 快捷键说明

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