아래 함수는 지속적으로 통신라인을 체크해서 통신에 문제가 발생하는 문자 메세지를 발생하는 함수입니다.
그런데 가끔 통신이 불량해도
문자메세지발송함수실행("통신라인 에러 발생 !!");
이 함수가 실행되지 않는것 같습니다.
혹시 아래의 함수중 무엇인가가 틀린 부분이 있을지요?.
저는 도무지 찾을수가 없군요... 모두 정상적인것 같은데.....
고수님들 버그한번 찾아봐 주세요....
논리상에 버그가 있을까요????.
전역으로 설정되있는 변수들...
LastSendRecvOkTime: TDateTime; // 마지막으로 장비와 정상적인 통신을 했던 시간. ..
LastSendRecvOkTimeReadCho:integer;// 이시간(초)만틈 통신이 되지 않으면 이벤트 발생 .. 0 이면 무시됨...
IsSendRecvState:integer;// 지금 장비와의 통신상태 0=초기화 1=정상 통신중 2=통신되지 않는중
timeout1:bool;
chkLastTImeInterVal,IsTime,cho:Double; // 임시변수들..
LastSendRecvOkTimeReadCho := 5; // 5초로 설정..통신이 되다가 않될경우 5초간 통신이 않되면 문자메세지 발송.
result ==> 1 이면 정상적인 통신상태 , 1이 아니면 통신 불량 -실시간으로 result 값을 계속 체크중이다..
주기적으로 호출하는 함수 내부 로직...
==================================================================
result :=톨신상태체크함수(); // 1 이면 정상적인 통신상태 , 1이 아니면 통신 불량
if result = 1 then begin
LastSendRecvOkTime :=now;
if IsSendRecvState = 2 then begin // 통신되지 않다가 다시 통신 되었으면...
IsSendRecvState := 1;
문자메세지발송함수실행("통신라인복구됨");
end else
if IsSendRecvState = 0 then begin // 한번도 통신된적이 없었다..
IsSendRecvState := 1;
end;
end else begin
if (LastSendRecvOkTimeReadCho >0) and(LastSendRecvOkTime >0) and (IsSendRecvState <>2) then begin // 통신 잘되다가 않된경우가 발생하면..
IsTime :=now;
if IsTime >= LastSendRecvOkTime then begin //
chkLastTImeInterVal:= IsTime-LastSendRecvOkTime; // 지금 시간에서 마지막으로 통신이 잘되던 시간을 빼서 경과시간을 구한다..
timeout1:=false;
end else begin
chkLastTImeInterVal := LastSendRecvOkTime -IsTime; // 혹시라도 지금시간이 마지막저장된시간보다 작으면 무조건 시간초과로 인식하게함
timeout1:=true;
end;
cho :=Trunc(((chkLastTImeInterVal)*24*60*60)); // 마지막 데이타수신후에 시간경과된 시간을 초로 환산한다.. 혹시 이부분이 문제가??.
if (cho >=LastSendRecvOkTimeReadCho) or timeout1 then begin
IsSendRecvState :=2;
문자메세지발송함수실행("통신라인 에러 발생 !!");
end;
end;
end;
=============================================================
|