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

📄 main.pas

📁 给出一个工业PLC联网监控的例子
💻 PAS
📖 第 1 页 / 共 2 页
字号:
					Node2:= AddChild(Node1,snode);
					Node2.ImageIndex:=14;
				end;
			end;//此地址有效
		end;//设定值遍历
	end;//with trvAllDev.Items do
  trvAllDev.FullExpand;//展开所有节点
end;

procedure TfrmMain.FormShow(Sender: TObject);
var
	i:integer;
begin//完成用户初始化
	if DBOK then  //标志文件存在否
	begin
		if adoDBSrc.Active then	adoDBSrc.Close;
		//检测用户以便登录
		adoDBSrc.CommandText:='select username from user';
		adoDBSrc.Open;
		if adoDBSrc.RecordCount=0 then
			lblFirstRun.Visible:=True
		else
		begin //
			cbxUser.Items.Clear;
			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;
	end else
	begin
		showmessage('请您先安装ODBC数据库'+#13
		+'名称:PWS Access DB'+#13
		+'类型:Microsoft Access Driver (*.mdb)'+#13
		+'数据库名称:pt.mdb');
		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.sTime1:=FieldByName('SaveDataTime1').AsString;
			prjInfo.sTime2:=FieldByName('SaveDataTime2').AsString;
			prjInfo.sTime3:=FieldByName('SaveDataTime3').AsString;
			prjInfo.cPort:=FieldByName('ComPort').AsString;
			prjInfo.Baud:=FieldByName('BaundRate').AsString;
			prjInfo.defWin:=FieldByName('DefaultWindow').AsInteger;
		end;
		Active:=False;
	end;
	if (prjInfo.prjName<>'') and(Pos('未定义',prjInfo.prjName)<=0) then
		Caption:=Caption+'  ['+prjInfo.prjName+']';
	
	if not lblFirstRun.Visible then //初始化设备参数
	begin
		if adoDBSrc.Active then	adoDBSrc.Close;
		adoDBSrc.CommandText:='select * from DeviceDefine';
		adoDBSrc.Open;
		AddrCount:=adoDBSrc.RecordCount;
		PB1.Max:=AddrCount;//巡测标记条
		PB1.Min:=0;
		PB1.Step:=1;
		PB1.Position:=0;
		if AddrCount>0 then 	//PWSU:动态数组 使用时采用 SetLength 初始化
		begin
			SetLength(PWSU, AddrCount+1);
			SetLength(VAdd,AddrCount+1);//有效地址数组

			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 //初始化设备参数
end;

procedure TfrmMain.Image2Click(Sender: TObject);
begin
	Panel5.Visible:=False;
	panel5.SendToBack;
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); //如果没有收到采样信息增加出错计数
			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.meuStartClick(Sender: TObject);
begin
	//加入期限限制代码
	showmessage('加入期限限制代码');
	comm1.StopComm;
	comm1.StartComm;
	mSynComm.NextAddr:=True;
	Timer1.Enabled:=True;
	SB1.Panels[9].Text:='';
	PB1.Max:=RegisterAddrCount-1;
end;

procedure TfrmMain.meuStopClick(Sender: TObject);
begin
		//加入期限限制代码
	showmessage('加入期限限制代码');
	Timer1.Enabled:=False;
	Sleep(200);
	comm1.StopComm;
	SB1.Panels[9].Text:='';
	PB1.Position:=0;
end;

procedure TfrmMain.N10Click(Sender: TObject);
begin
	prcmenu('用户设置','select * from user')
end;

procedure TfrmMain.N21Click(Sender: TObject);
begin//
	 //	adoDBSrc.CommandText:='DeviceID, Addr, ReadValue, SaveTime';
	Panel5.BringToFront;
	Panel5.Visible:=True;
end;

procedure TfrmMain.btnSereachClick(Sender: TObject);
begin//

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('设备组群','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('您的串口设置有误!'+#13+'请再工程设置中重新设定!');
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:       //  数据正常
			begin
				if i<13 then //11位数据  #6XXRDDDDBC#13
					mV:=rData[5]+rData[6]+rData[7]+rData[8]
				else //15位数据  #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...';
			end;
		$15://Communication Error Code //#21XXREEBC#13      出错Len=9
			 begin
				 mV:=rData[5]+rData[6];
				 i:=strtointdef(mV,0);
				 case i of
					 01:mV:='Frame error';
					 02:mV:='Parity error';
					 03:mV:='BCC error';
					 04:mV:='Invalid message size';
					 05:mV:='Invalid command';
					 06:mV:='Invalid unit number';
					 07:mV:='Invalid address';
					 08:mV:='Address over range';
					 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;
			 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:='模拟运行中...';//
			end;
	end;// end case
	DrawTreeNode;
	mSynComm.NextAddr:=True;//信号标志亮
	mSynComm.CommErrCount:=0;
	inc(mSynComm.U_ID);     //采样地址增加
	if mSynComm.U_ID>=RegisterAddrCount then //巡检计数器处理代码
		mSynComm.U_ID:=0;   //从头开始
end;

end.

⌨️ 快捷键说明

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