unit uAlarmCom; interface uses uSafeLog,uErrorInfo,SPComm,System.SysUtils,System.Classes; type //串口通讯速率为9600bps,数据位 8,校验位 无,停止位 1,16 进制 //最后 2 位 CRC 校验码也可以不用计算,直接用 16 进制 AA AA 代替 //控制单个继电器 21 05 00 00 FF 00 8B 5A { 21 1 字节 本模块地址 地址范围:01-FF 05 1 字节 功能代码 吸合某一路继电器 00 00 2 字节 寄存器地址 0000:继电器 Y0 地址; 0001:继电器 Y1 地址; 0002:继电器 Y2 地址; 0003:继电器 Y3 地址; 0004:继电器 Y4 地址; 0005:继电器 Y5 地址; 0006:继电器 Y6 地址; 0007:继电器 Y7 地址; FF 00 2 字节 输出数据 FF00:继电器吸合;0000:继电器断开 8B 5A 2 字节 CRC 校验 前面所有数据的 CRC 校验码 原数据返回:21 05 00 00 FF 00 8B 5A } TAlarmCom=class private Comm:TComm; FCommName:STRING; function IsError(var sError:string):boolean; public constructor Create; virtual; destructor Destroy; override; procedure Close(); function Open(CommName:string;var sError:string):boolean; function YellowLed(var sError:string):boolean; //黄灯 function RedLed(var sError:string):boolean; //红灯 function GreenLed(var sError:string):boolean; //绿灯 function CloseRedAndBuzzer(var sError:string):boolean; //红灯 蜂鸣器响 function RedAndBuzzer(var sError:string):boolean; //红灯 蜂鸣器响 function SparkGreen(var sError:string):boolean; //闪绿 蜂鸣器 function CloseAllLed(var sError:string):boolean; //全关 function OpenBuzzer(var sError:string):boolean; //蜂鸣器响 function CloseBuzzer(var sError:string):boolean; //蜂鸣器关闭 function CommRunStr(sError:string):boolean; end; var AlarmCom:TAlarmCom; implementation constructor TAlarmCom.Create; //参数固定 begin inherited; WorkLog.Debug('创建报警灯'); Comm:=TComm.Create(nil); comm.BaudRate:=9600; comm.StopBits:=_1; comm.ByteSize:=_8; //comm.Parity:=None; end; destructor TAlarmCom.Destroy; begin WorkLog.Debug('销毁报警灯'); Comm.Free; inherited Destroy; end; function TAlarmCom.IsError(var sError:string):boolean; begin TRY If Comm.Handle=0 then begin WorkLog.Debug('重新打开报警灯通讯'); Comm.StopComm; Comm.StartComm; //打开端口要延时一段时间才能往缓存发送数据 Sleep(200); end; Result:=true; EXCEPT on e:Exception do begin Result:=false; WorkLog.Error('报警灯出错:'+ChangeErrorInfo(E.Message)); sError:=ChangeErrorInfo('报警灯出错:'+ChangeErrorInfo(E.Message)); end; END; end; function TAlarmCom.YellowLed(var sError:string):boolean; //黄灯 2 begin Result:=IsError(sError); WorkLog.Debug('TAlarmCom报警灯:黄灯'); Comm.SendHex('21050002FF00AAAA'); end; function TAlarmCom.RedLed(var sError:string):boolean; //红灯 0 begin Result:=IsError(sError); WorkLog.Debug('报警灯:红灯'); Comm.SendHex('21050000FF00AAAA'); end; function TAlarmCom.GreenLed(var sError:string):boolean; //绿灯 1 begin Result:=IsError(sError); WorkLog.Debug('报警灯:绿灯'); Comm.SendHex('21050001FF00AAAA'); end; function TAlarmCom.CommRunStr(sError:string):boolean; //运行指令 '21050001FF00AAAA' begin Result:=IsError(sError); WorkLog.Debug('报警灯:绿灯'); Comm.SendHex(sError); end; function TAlarmCom.RedAndBuzzer(var sError:string):boolean; //红灯 蜂鸣器响 begin Result:=IsError(sError); WorkLog.Debug('报警灯:红灯 蜂鸣器响'); RedLed(sError); sleep(200); OpenBuzzer(sError); end; function TAlarmCom.CloseRedAndBuzzer(var sError:string):boolean; //关红灯 蜂鸣器响 begin Result:=IsError(sError); WorkLog.Debug('报警灯:关闭红灯和蜂鸣器'); Comm.SendHex('210500000000AAAA'); sleep(200); CloseBuzzer(sError); end; function TAlarmCom.SparkGreen(var sError:string):boolean; //闪绿 蜂鸣器 begin Result:=IsError(sError); //设备没有响一下,亮一下的功能,只能在线程中延时关闭 WorkLog.Debug('报警灯:闪绿 蜂鸣器'); GreenLed(sError); OpenBuzzer(sError); TThread.CreateAnonymousThread( procedure var sError:string; begin Sleep(1000); CloseBuzzer(sError); end ).Start; end; function TAlarmCom.CloseAllLed(var sError:string):boolean; //全关 begin Result:=IsError(sError); WorkLog.Debug('报警灯:全关'); Comm.SendHex('210500000000AAAA'); end; function TAlarmCom.OpenBuzzer(var sError:string):boolean; //蜂鸣器响 begin Result:=IsError(sError); WorkLog.Debug('报警灯:蜂鸣器响'); Comm.SendHex('21050103FF00AAAA'); end; function TAlarmCom.CloseBuzzer(var sError:string):boolean; //蜂鸣器关闭 begin Result:=IsError(sError); WorkLog.Debug('报警灯:蜂鸣器关闭'); Comm.SendHex('210500030000AAAA'); end; procedure TAlarmCom.Close(); begin WorkLog.Debug('关闭报警灯'); comm.StopComm; end; function TAlarmCom.Open(CommName:string;var sError:string):boolean; begin TRY WorkLog.Debug('打开报警灯:'+CommName); Comm.StopComm; comm.CommName:=CommName; comm.StartComm; Result:=true; EXCEPT on e:Exception do begin Result:=false; WorkLog.Error('报警灯出错:'+ChangeErrorInfo(E.Message)); sError:=ChangeErrorInfo('报警灯出错:'+ChangeErrorInfo(E.Message)); end; END; end; end.