?? main.pas.~117~
字號:
for I := 0 to adoDBSrc.RecordCount - 1 do
begin
cbxUser.Items.Add(adoDBSrc.FieldByName('username').AsString);
adoDBSrc.Next;
end;
SB1.Panels[9].Text:='操作員登錄中......';
if adoDBSrc.Active then adoDBSrc.Close;
end;
with adoDBSrc do //顯示工程信息
begin
if Active then Active:=False;
adoDBSrc.CommandText:='select * from projectConfig';
adoDBSrc.Open;
if True then
begin
prjInfo.prjName:=FieldByName('ProjectName').AsString;
prjInfo.sTime:=FieldByName('SaveDataTime').AsInteger;
prjInfo.cPort:=FieldByName('ComPort').AsString;
prjInfo.Baud:=FieldByName('BaundRate').AsString;
end;
Active:=False;
end;
if (prjInfo.prjName<>'') and(Pos('未定義',prjInfo.prjName)<=0) then
Caption:=Caption+' ['+prjInfo.prjName+']';
if not lblFirstRun.Visible then //初始化設(shè)備參數(shù)
begin
if adoDBSrc.Active then adoDBSrc.Close;
adoDBSrc.CommandText:='select * from DeviceDefine';
adoDBSrc.Open;
AddrCount:=adoDBSrc.RecordCount;
PB1.Max:=AddrCount;//巡測標(biāo)記條
PB1.Min:=0;
PB1.Step:=1;
PB1.Position:=0;
if AddrCount>0 then //PWSU:動態(tài)數(shù)組 使用時采用 SetLength 初始化
begin
SetLength(PWSU, AddrCount+1);
SetLength(VAdd,AddrCount+1);//有效地址數(shù)組
with adoDBSrc do
begin
mSynComm.U_ID:=0; Randomize;
for I := 0 to AddrCount - 1 do
begin
PwsU[i].Enabled:=FieldByName('Enabled').AsBoolean;
if PwsU[i].Enabled then
begin
VAdd[mSynComm.U_ID]:=i;
inc(mSynComm.U_ID);
end;
PwsU[i].PWSUint:=FieldByName('UnitID').AsInteger;
PwsU[i].PWSName:=FieldByName('DeviceName').AsString;
PWSU[i].Addr:=FieldByName('RegisterAddr').AsInteger;
PWSU[i].Name:=FieldByName('Name').AsString;
PWSU[i].Max:=FieldByName('MaxValue').AsInteger;
PWSU[i].Min:=FieldByName('MinValue').AsInteger;
PWSU[i].Value:=0;
adoDBSrc.Next;
end;
RegisterAddrCount:=mSynComm.U_ID;
mSynComm.U_ID:=0;
end;
if adoDBSrc.Active then adoDBSrc.Close;
DrawTreeNode;
end;//if AddrCount>0 then
end;//if not lblFirstRun.Visible then //初始化設(shè)備參數(shù)
end;
procedure TfrmMain.Timer1Timer(Sender: TObject);
var
i:integer;
scmd,sErr:string;
begin
i:=VAdd[mSynComm.U_ID]; //工作代碼
if PWSU[i].Enabled then //MkPTCmd(U,A,L); //采用word模式讀寫操作
begin
mSynComm.CurrentUnit:=PwsU[i].PWSUint;
mSynComm.CurrentAddr:=PWSU[i].Addr;
scmd:=MkPTCmd(PwsU[i].PWSUint,PWSU[i].Addr,2);
if mSynComm.NextAddr then //上次通訊正確返回
begin
if scmd<>'' then
begin
SB1.Panels[9].Text:=scmd;
comm1.writecommdata(pchar(scmd),Length(scmd)); //采用word模式讀寫操作.
end;
inc( mSynComm.CommErrCount); //如果沒有收到采樣信息增加出錯計(jì)數(shù)
mSynComm.NextAddr:=False;
end;
if mSynComm.CommErrCount>5 then
begin
mSynComm.NextAddr:=True;
mSynComm.CommErrCount:=0;
sErr:=FormatDateTime('dddddd',now)+Format('------站號:%d通訊失敗!',[PwsU[i].PWSUint]);
meoRunEvent.Lines.Add(sErr);
mSynComm.NextAddr:=True;//跳出陷阱
inc(mSynComm.U_ID);
end;
end;
PB1.Position:=mSynComm.U_ID;
end;
procedure TfrmMain.RunOnOff(runon: boolean);
begin
btnStart.Enabled:=not runon;
btnStop.Enabled:=runon;
meuStart.Enabled:=not runon;
meuStop.Enabled:=runon;
if runon then
SB1.Panels[9].Text:='系統(tǒng)正在監(jiān)控...'
else
SB1.Panels[9].Text:='系統(tǒng)停止監(jiān)控...';
end;
procedure TfrmMain.UpdateMenu(Fun_ID: integer);
var
mFg:boolean;
begin
case Fun_ID of
-1: begin
mFg:=False;
btnStart.Enabled:=mFg;
btnStop.Enabled:=mFg;
N7.Enabled:=mFg;
N8.Enabled:=mFg;
N10.Enabled:=mFg;
meuStart.Enabled:=mFg;
meuStop.Enabled:=mFg;
SB1.Panels[9].Text:='未登錄系統(tǒng)......';
end;
2,1:begin
mFg:=True; ////////////////////////
N7.Enabled:=mFg;
N8.Enabled:=mFg;
N10.Enabled:=mFg;
SB1.Panels[9].Text:='管理員登錄...';
end;
0:begin
mFg:=True; ////////////////////////
N7.Enabled:=not mFg;
N8.Enabled:=not mFg;
N10.Enabled:=not mFg;
SB1.Panels[9].Text:='操作員登錄...';
end;
end;
end;
procedure TfrmMain.meuSereachClick(Sender: TObject);
begin //歷史記錄查詢
RzURLLabel1.Click;
end;
procedure TfrmMain.meuStartClick(Sender: TObject);
begin //加入期限限制代碼
if not Manger then
begin
if MessageDlg('您確認(rèn)要開始監(jiān)控嗎?',mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
CanOP:=True;
end;
if CanOP or Manger then
begin
comm1.StopComm;
comm1.StartComm;
mSynComm.NextAddr:=True;
Timer1.Enabled:=True;
Timer2.Enabled:=True;
SB1.Panels[9].Text:='';
PB1.Max:=RegisterAddrCount-1;
RunOnOff(True);
end;
end;
procedure TfrmMain.meuStopClick(Sender: TObject);
begin
if not Manger then
begin
if MessageDlg('您確認(rèn)要停止監(jiān)控嗎?',mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
CanOP:=True;
end;
if CanOP or Manger then
begin
Timer1.Enabled:=False;
Timer2.Enabled:=False;
Sleep(200);
comm1.StopComm;
SB1.Panels[9].Text:='';
PB1.Position:=0;
RunOnOff(False);
end;
end;
procedure TfrmMain.N10Click(Sender: TObject);
begin
prcmenu('用戶設(shè)置','select * from user')
end;
procedure TfrmMain.N5Click(Sender: TObject);
begin
Close;
end;
procedure TfrmMain.N7Click(Sender: TObject);
begin
prcmenu('工程信息','select * from projectConfig')
end;
procedure TfrmMain.N8Click(Sender: TObject);
begin
prcmenu('設(shè)備組群','select * from DeviceDefine');
end;
procedure TfrmMain.prcmenu(meuInfo, DBSql: string);
begin
//加入期限限制代碼
showmessage('加入期限限制代碼');
lblConfig.Caption:=meuInfo;
if adoDBSrc.Active then
adoDBSrc.Close;
adoDBSrc.CommandText:=DBSql;
adoDBSrc.Open;
Panel4.Visible:=False;
Panel1.Align:=alClient;
Panel1.Visible:=True;//工程信息
end;
procedure TfrmMain.SetCommPort(cPort, Baud: string);
var
reg : TRegistry;
ts : TStrings;
i : integer;
commFlg:boolean;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\serialcomm',false);
ts := TStringList.Create;
reg.GetValueNames(ts);
commFlg:=False;
for i := 0 to ts.Count -1 do
begin
if reg.ReadString(ts.Strings[i])=cPort then commFlg:=True;
end;
ts.Free;
reg.CloseKey;
reg.free;
Comm1.StopComm;
if commFlg then
begin
Comm1.CommName:=cPort;
Comm1.BaudRate:=strtointdef(Baud,9600);
Comm1.StartComm;
SB1.Panels[5].Text:=cPort;
SB1.Panels[7].Text:=Baud;
end else
Showmessage('您的串口設(shè)置有誤!'+#13+'請?jiān)俟こ淘O(shè)置中重新設(shè)定!');
end;
procedure TfrmMain.lblRecivedChange(Sender: TObject);
var
rData,mU,mV:string;
i:integer;
begin//收到通訊返回信息,解碼處理顯示
rData:=lblRecived.Text;
i:=length(rData);
if i>9 then mU:=rData[2]+rData[3];
case ord(rData[1])of
$6: // 數(shù)據(jù)正常
begin
if i<13 then //11位數(shù)據(jù) #6XXRDDDDBC#13
mV:=rData[5]+rData[6]+rData[7]+rData[8]
else //15位數(shù)據(jù) #6XXRDDDDDDDDBC#13
mV:=rData[5]+rData[6]+rData[7]+rData[8]+rData[9]+rData[10]+rData[11]+rData[12];
//處理收到的值
i:=VAdd[mSynComm.U_ID];
PwsU[i].Value:=strtointdef(mV,0);
txtUnitNo.Caption:=inttostr(mSynComm.CurrentUnit);
txtDevName.Caption:=PwsU[i].PWSName;
txtDevAddrName.Caption:=PwsU[i].Name;
RzLEDDisplay1.Caption:=mV;
edtDecStatus.Text:='OK...';
PWSU[i].CommErr:='';
end;
$15://Communication Error Code //#21XXREEBC#13 出錯Len=9
begin
mV:=rData[5]+rData[6];
i:=strtointdef(mV,0);
case i of
01:mV:='數(shù)據(jù)幀錯誤';
02:mV:='校驗(yàn)錯誤';
03:mV:='幀校驗(yàn)錯誤';
04:mV:='Invalid message size';
05:mV:='Invalid command';
06:mV:='Invalid unit number';
07:mV:='地址定義錯';
08:mV:='地址超范圍';
09:mV:='Invalid data size';
10:mV:='Invalid range';
11:mV:='Invalid data';
end;
//處理通訊出錯信息代碼
i:=VAdd[mSynComm.U_ID];
txtUnitNo.Caption:=inttostr(mSynComm.CurrentUnit);
txtDevName.Caption:=PwsU[i].PWSName;
txtDevAddrName.Caption:=PwsU[i].Name;
RzLEDDisplay1.Caption:='';
edtDecStatus.Text:=mV;
PWSU[i].CommErr:=mV;
end;
$5: //模擬通訊
begin
i:=VAdd[mSynComm.U_ID];
txtUnitNo.Caption:=inttostr(mSynComm.CurrentUnit);
txtDevName.Caption:=PwsU[i].PWSName;
txtDevAddrName.Caption:=PwsU[i].Name;
PwsU[i].Value:=random(5432);
RzLEDDisplay1.Caption:=Format('%d',[PwsU[i].Value]);
edtDecStatus.Text:='模擬運(yùn)行中...';//
PWSU[i].CommErr:='';
end;
end;// end case
DrawTreeNodeValue;//DrawTreeNode;
mSynComm.NextAddr:=True;//信號標(biāo)志亮
mSynComm.CommErrCount:=0;
inc(mSynComm.U_ID); //采樣地址增加
if mSynComm.U_ID>=RegisterAddrCount then //巡檢計(jì)數(shù)器處理代碼
mSynComm.U_ID:=0; //從頭開始
end;
procedure TfrmMain.Timer2Timer(Sender: TObject);//保存數(shù)據(jù)
var
st1:TDateTime;
t,tt:Extended ;
ts:TTimeStamp;
begin // 計(jì)算從開始到現(xiàn)在的時間(秒)
ts:=DateTimeToTimeStamp(prjInfo.SavDataTime) ;
t:=TimeStampToMSecs(ts);
st1:=Now;
ts:=DateTimeToTimeStamp(St1);
tt:=TimeStampToMSecs(ts);
t:=(tt-t)/60000; ;//毫秒->秒->分鐘
if t>prjInfo.sTime then //保存數(shù)據(jù)
begin
prjInfo.SavDataTime:=St1;
savDataFromTreeNode;
end;
end;
procedure TfrmMain.savDataFromTreeNode;
var
UID,grcount,p,v,v1,i:integer;
snode,s,UName:string;
begin
grcount:= trvAllDev.Items.Count;
with adoDBSrc do //adoDBSrc.
begin
if Active then Close;
CommandText:='select DeviceID, DeviceName, AddrName, ReadValue, SaveTime from RecordData';
if not Active then Open;
for I := 0 to grcount - 1 do //讀取現(xiàn)在的顯示值
begin
snode := trvAllDev.Items[I].Text;//節(jié)點(diǎn)的標(biāo)簽
p:=pos('-',snode);
if p>0 then //站號
begin //'PWS'+inttostr(PwsU[i].PWSUint)+'-'+PwsU[i].PWSName; //站號
Append;
s:=Copy(snode,4,p-4);
val(s,v,v1);
if V1=0 then UID:= v;//站號
UName:=Copy(snode,p+1,Length(snode)-p);//設(shè)備名
end;
p:=pos('[',snode);
v:=pos(']',snode);
if (p>0) and (v>0) then //PWSU[i].Name+'['____']'
begin
Append;
FieldByName('DeviceID').AsInteger:=UID;
FieldByName('DeviceName').AsString:=UName;
FieldByName('SaveTime').AsDateTime:=Now;
s:=Copy(snode,p+1,v-p-1);
val(s,v,v1);
if V1=0 then // 正常 PWSU[i].Name+'['+Format('%4x',[PWSU[i].Value])+']'
begin
FieldByName('ReadValue').AsInteger:= v;
s:=Copy(snode,1,Length(snode)-p-1);//地址名
FieldByName('AddrName').AsString:=s;
end else
begin //PWSU[i].Name+'['+PWSU[i].CommErr+']'; 出錯
FieldByName('AddrName').AsString:=s;
FieldByName('ReadValue').AsInteger:=-1;//出錯時默認(rèn)賦值-1
end;
Post;
end;
end; //遍歷結(jié)束
Close;//關(guān)閉數(shù)據(jù)庫
end; // //adoDBSrc.
end;
end.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -