📄 zje_basefuncomm.pas
字号:
///////////////////////////////////////////////////////////////////////////////
//程序功能:读写串口函数区
///////////////////////////////////////////////////////////////////////////////
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 + -