




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
/OPC客戶端的自動化實現(xiàn)OPC是建立在COM,DCOM的基礎(chǔ)商的,因此絕大多數(shù)語言都可以很好的進(jìn)行開發(fā).在Net中開發(fā)客戶端有以下幾種方式:(1)
使用OPCNetAPI,需要用到OPCNetAPI.dll,.dll(2)
使用自動化接口,需要用到OPCDAAuto.dll(3)
使用自定義接口,需要用到多個Wrapper:OpcRcw。Ae。dll,OpcRcw。Batch.dll,n.dll,OpcRcw.Da.dll,OpcRcw。Dx.dll,OpcRcw。Hda。dll,OpcRcw.Sec.dll以上開發(fā)方式所需的動態(tài)鏈接庫可以從OPC基金會()的網(wǎng)站上下載,一些下載項目可能需要注冊,或成為基金會的成員。不同的方式有各自的有缺點,請參見…本文使用自動化接口,VB.Net語言進(jìn)行開發(fā),開發(fā)項目是無線射頻(RFID)卡方面的應(yīng)用,典型的如公交車,或公司考勤使用的刷卡機(jī).需要注意的是自動化接口存在一個“不是問題”的問題,數(shù)組下標(biāo)是以1開始的,而不是傳統(tǒng)計算機(jī)開發(fā)上的以0開始.不知道設(shè)計者頭腦是怎么想(有人知道嗎?);這可能會給一些語言的開發(fā)造成問題(有人碰到嗎,沒有你就是幸運的)需求:OPCDAAuto。dll或該Dll的Interop(一)
:客戶端開發(fā)流程OPC客戶端的開發(fā)主要遵循下圖所示的開發(fā)流程,下面就從以下幾個開發(fā)步驟進(jìn)行說明
?
(二)
:枚舉OPC服務(wù)器列表枚舉服務(wù)器主要是通過OPCServer接口的GetOPCServers方法來實現(xiàn)的,該方法會返回OPC服務(wù)器數(shù)組(以1為下界,上面已有說明),以下是代碼段'枚舉OPC服務(wù)器列表PrivateSubForm1_Load(ByValsenderAsSystem。Object,ByValeAsSystem。EventArgs)HandlesMyBase.LoadTryGlobalOPCServer=NewOPCAutomation。OPCServerClass()DimServerListAsObject=GlobalOPCServer。GetOPCServersForindexAsShort=LBound(ServerList)ToUBound(ServerList)’加入控件列表中,注意這里使用LBound和UBoundcbbServerList。Items.Add(ServerList(index))NextIfcbbServerList.Items.Count>0ThencbbServerList.SelectedIndex=0EndIfResetControlStatus()'設(shè)置控件狀態(tài)GlobalOPCServer=NothingCatchExAsExceptionMessageBox.Show("ListOPCserversfailed:"+Ex。Message,"OPCSample",MessageBoxButtons。OK)EndTryEndSub(三)
:連接OPC服務(wù)器自動化接口中連接到服務(wù)器是使用connect方法PublicOverridableSubConnect(ByValProgIDAsString,OptionalByValNodeAsObject=Nothing)ProgID指服務(wù)器的ProgID,Node代表網(wǎng)絡(luò)節(jié)點,如果是本機(jī)則放空即可。連接到服務(wù)器后,以下屬性需要特別注意:OPCServer.StartTime:服務(wù)器的啟動時間OPCServer。CurrentTime:服務(wù)器的當(dāng)前時間,各個客戶端可以通過這個屬性值完成一些同步的操作OPCGroups.DefaultGroupIsActive:以后添加的Group是否默認(rèn)激活OPCGroups。DefaultGroupDeadBand:Group的默認(rèn)死區(qū),變化量超過死區(qū)后將會觸發(fā)DataChange事件,合理的設(shè)置該值可以提高程序性能OPCGroups.Count:下屬組(Group)的數(shù)量OPCGroups.DefaultGroupLocalID:組(Group)的默認(rèn)通信區(qū)域編號,如1024OPCGroups.DefaultGroupUpdat(yī)eRate:組(Group)的默認(rèn)刷新率,該屬性也比較重要OPCGroups。DefaultGroupTimeBias:組(Group)的默認(rèn)時間偏差(四)
:添加組(Group)和項(Item)添加組和項需要用到Groups.Add和Items。AddItem方法,以下是原型:FunctionAdd(OptionalByValNameAsObject=Nothing)AsOPCAutomation。OPCGroupFunctionA(yù)ddItem(ByValItemIDAsString,ByValClientHandleAsInteger)AsOPCAutomation.OPCItem 組也有兩個重要的屬性 Group.UpdateRate:刷新率,該屬性通Groups的UpdateRate意義一樣,如果這個值有設(shè)置,則以這個值為準(zhǔn) Group。IsSubscribed:是否使用訂閱功能 以下是代碼段?'連接到指定的OPC服務(wù)器PrivateSubbtnConnectServer_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnConnectServer.ClickIfcbbServerList.Text<>""ThenConnectedOPCServer=NewOPCAutomation.OPCServerClass()TryConnectedOPCServer.Connect(cbbServerList.Text)'設(shè)置組集合的默認(rèn)屬性ConnectedOPCServer。OPCGroups。DefaultGroupIsActive=TrueConnectedOPCServer.OPCGroups.DefaultGroupDeadband=0'添加組ConnectedGroup=ConnectedOPCServer.OPCGroups。Add()ConnectedGroup。UpdateRate=3*1000'刷新慮,用于下面的DataChange事件ConnectedGroup.IsSubscribed=True'使用訂閱功能'添加項GlobalOPCItems(0)=ConnectedGroup.OPCItems.AddItem("Reader_Device.OpenCard",0)GlobalOPCItems(1)=ConnectedGroup.OPCItems。AddItem("Reader_Device.CloseCard”,1)GlobalOPCItems(2)=ConnectedGroup.OPCItems.AddItem("ReaderdNO”,2)RefreshServerStatus()'刷新服務(wù)器狀態(tài)CatchexAsExceptionConnectedOPCServer=NothingMessageBox。Show("OPCserverconnectfailed:”+ex。Message,"OPCSample”,MessageBoxButtons.OK)EndTryResetControlStatus()EndIfEndSub(五)
:讀寫操作與事件控制讀寫操作包括同步和異步兩種操作方式,以下是這幾個方法的原型:Group的同步讀事件SubSyncRead(ByValSourceAsShort,ByValNumItemsAsInteger,ByRefServerHandlesAsSystem。Array,ByRefValuesAsSystem。Array,ByRefErrorsAsSystem.Array,OptionalByRefQualitiesAsObject=Nothing,OptionalByRefTimeStampsAsObject=Nothing)
Group的同步寫事件SubSyncWrite(ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefValuesAsSystem.Array,ByRefErrorsAsSystem。Array)
Group的異步讀事件SubAsyncRead(ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefErrorsAsSystem。Array,ByValTransactionIDAsInteger,ByRefCancelIDAsInteger)
Group的異步寫事件SubAsyncWrite(ByValNumItemsAsInteger,ByRefServerHandlesAsSystem.Array,ByRefValuesAsSystem。Array,ByRefErrorsAsSystem.Array,ByValTransactionI(lǐng)DAsInteger,ByRefCancelIDAsInteger)如果使用異步的讀寫操作,那么還需要實現(xiàn)Group中的ReadComplete和WriteComplete兩個事件PublicEventAsyncReadComplete(ByValTransactionIDAsInteger,ByValNumItemsAsInteger,ByRefClientHandlesAsSystem。Array,ByRefItemValuesAsSystem.Array,ByRefQualitiesAsSystem。Array,ByRefTimeStampsAsSystem.Array,ByRefErrorsAsSystem.Array)
PublicEventAsyncWriteComplete(ByValTransactionIDAsInteger,ByValNumItemsAsInteger,ByRefClientHandlesAsSystem.Array,ByRefErrorsAsSystem.Array)其他相關(guān)的重要事件包括:Group數(shù)據(jù)變化時的通知事件PublicEventDataChange(ByValTransactionIDAsInteger,ByValNumItemsAsInteger,ByRefClientHandlesAsSystem.Array,ByRefItemValuesAsSystem。Array,ByRefQualitiesAsSystem.Array,ByRefTimeStampsAsSystem.Array)
Group的異步取消事件PublicEventAsyncCancelComplete(ByValCancelIDAsInteger)
Server(服務(wù)器)關(guān)閉通知事件PublicEventServerShutDown(ByValReasonAsString)
以下是這些實現(xiàn)的代碼段'讀取卡片指定的塊號的值PrivateSubbtnReadCard_Click(ByValsenderAsSystem。Object,ByValeAsSystem.EventArgs)IfNot(ConnectedGroupIsNothing)ThenTry’獲取塊號DimBlockNoAsShort=CByte(ReadBlockNo.Text)’如果要獲取數(shù)據(jù)的塊所對應(yīng)的項還沒有創(chuàng)建,就創(chuàng)建它IfGlobalOPCBlockItems(BlockNo)IsNothingThenGlobalOPCBlockItems(BlockNo)=ConnectedGroup.OPCItems。AddItem("Reader_Device.Block"&CStr(BlockNo),200+BlockNo)EndIf'準(zhǔn)備參數(shù)數(shù)組DimServerResultsAsSystem。ArrayDimServerErrorsAsSystem。ArrayDimServerHandles(1)AsIntegerServerHandles(1)=GlobalOPCBlockItems(BlockNo).ServerHandle’讀取值ConnectedGroup.SyncRead(OPCAutomation.OPCDataSource.OPCDevice,1,ServerHandles,ServerResults,ServerErrors)IfServerErrors(1)<>0ThenMsgBox("ReadCardFailed:"&ServerErrors(1))ElsetxtReadBlockNo.Text=ServerResults(1)EndIfCatchexAsExceptionMessageBox.Show("OPCserverReadCardfailed:"+ex.Message,"OPCSample",MessageBoxButtons.OK)EndTryEndIfEndSub
’寫卡片指定塊的值PrivateSubbtnWriteCard_Click(ByValsenderAsSystem.Object,ByValeAsSystem。EventArgs)IfNot(ConnectedGroupIsNothing)ThenTry'獲取塊號DimBlockNoAsShort=CByte(WriteBlockNo.Text)'如果要寫入數(shù)據(jù)的塊所對應(yīng)的項還沒有創(chuàng)建,就創(chuàng)建它IfGlobalOPCBlockItems(BlockNo)IsNothingThenGlobalOPCBlockItems(BlockNo)=ConnectedGroup.OPCItems.AddItem(”Reader_Device.Block"&CStr(BlockNo),200+BlockNo)EndIf'準(zhǔn)備參數(shù)數(shù)組DimServerValues(1)AsObjectDimServerErrorsAsArrayDimServerHandles(1)AsIntegerServerHandles(1)=GlobalOPCBlockItems(BlockNo).ServerHandleServerValues(1)=txtWriteBlockNo。Text’寫入值ConnectedGroup。SyncWrite(1,ServerHandles,ServerValues,ServerErrors)IfServerErrors(1)〈>0ThenMsgBox(”WriteCardFailed:"&ServerErrors(1))ElseMsgBox(”WriteCardSucceed")EndIfCat(yī)chexAsExceptionMessageBox。Show("OPCserverWriteCardfailed:"+ex.Message,”O(jiān)PCSample”,MessageBoxButtons。OK)EndTryEndIfEndSub(六)
:斷開服務(wù)器斷開服務(wù)器只要使用OPCServer的Disconnect方法幾個,以下是代碼段:'斷開到指定OPC服務(wù)器的連接PrivateSubbtnDisconnectServer_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnDisconnectServer.ClickIfNot(ConnectedOPCServerIsNothing)ThenTryConnectedOPCServer。Disconnect()CatchexAsExceptionMessageBox.Show(”O(jiān)PCserverdisconnectfailed:”+ex。Message,”O(jiān)PCSample”,MessageBoxButtons.OK)FinallyConnectedOPCServer=NothingResetControlStat(yī)us()EndTryEndIfEndSub(七)
:相關(guān)鏈接非常好的一個OPC技術(shù)網(wǎng)站OPC基金會網(wǎng)址國內(nèi)的一個比較好的OPC網(wǎng)站(八):全部源碼Imports
System.Runtime。InteropServices?Public
Class
Form1?
Dim
GlobalOPCServer
As
OPCAutomation。OPCServerClass
Dim
WithEvents
ConnectedOPCServer
As
OPCAutomation。OPCServerClass
Dim
WithEvents
ConnectedGroup
As
OPCAutomat(yī)ion.OPCGroupClass
?
Dim
GlobalOPCItems(4)
As
OPCAutomation。OPCItem
Dim
GlobalOPCBlockItems(64)
As
OPCAutomation.OPCItem
??
'枚舉OPC服務(wù)器列表?
Private
Sub
Form1_Load(ByVal
sender
As
System。Object,
ByVal
e
As
System。EventArgs)
Handles
MyBase。Load
Try?
GlobalOPCServer
=
New
OPCAutomation。OPCServerClass()
Dim
ServerList
As
Object
=
GlobalOPCServer.GetOPCServers?
For
index
As
Short
=
LBound(ServerList)
To
UBound(ServerList)
’加入控件列表中,注意這里使用LBound和UBound
cbbServerList.Items.Add(ServerList(index))
Next
If
cbbServerList.Items。Count
>
0
Then
cbbServerList.SelectedIndex
=
0?
End
If
ResetControlStat(yī)us()
'設(shè)置控件狀態(tài)
GlobalOPCServer
=
Nothing?
Cat(yī)ch
Ex
As
Exception
MessageBox。Show("List
OPC
servers
failed:
”
+
Ex.Message,
"OPCSample”,
MessageBoxButtons.OK)?
End
Try?
End
Sub?
’連接到指定的OPC服務(wù)器?
Privat(yī)e
Sub
btnConnectServer_Click(ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)
Handles
btnConnectServer。Click?
If
cbbServerList。Text
<〉
""
Then?
ConnectedOPCServer
=
New
OPCAutomation.OPCServerClass()?
Try?
ConnectedOPCServer。Connect(cbbServerList。Text)?
’設(shè)置組集合的默認(rèn)屬性
ConnectedOPCServer。OPCGroups.DefaultGroupIsActive
=
True?
ConnectedOPCServer.OPCGroups.DefaultGroupDeadband
=
0?
’添加組
ConnectedGroup
=
ConnectedOPCServer。OPCGroups.Add()
ConnectedGroup.Updat(yī)eRate
=
3
*
1000
'刷新慮,用于下面的DataChange事件?
ConnectedGroup.IsSubscribed
=
True
'使用訂閱功能?
'添加項
GlobalOPCItems(0)
=
ConnectedGroup.OPCItems.AddItem("Reader_Device。OpenCard",
0)?
GlobalOPCItems(1)
=
ConnectedGroup.OPCItems.AddItem("Reader_Device。CloseCard”,
1)
GlobalOPCItems(2)
=
ConnectedGroup.OPCItems。AddItem("ReaderdNO",
2)?
RefreshServerStatus()
’刷新服務(wù)器狀態(tài)?
Catch
ex
As
Exception?
ConnectedOPCServer
=
Nothing
MessageBox.Show("OPC
server
connect
failed
:
"
+
ex.Message,
”O(jiān)PCSample",
MessageBoxButtons.OK)
End
Try
ResetControlStatus()
End
If
End
Sub?
’服務(wù)器斷開事件通知
Private
Sub
OnServerShutDown(ByVal
Reason
As
String)
Handles
ConnectedOPCServer。ServerShutDown?
btnDisconnectServer_Click(Nothing,
New
EventArgs())?
End
Sub
?
Private
Sub
OnGroupDat(yī)aChange(ByVal
TransactionID
As
Integer,
ByVal
NumItems
As
Integer,
ByRef
ClientHandles
As
System。Array,
ByRef
ItemValues
As
System.Array,
ByRef
Qualities
As
System.Array,
ByRef
TimeStamps
As
System.Array)
Handles
ConnectedGroup.DataChange?
For
i
As
Integer
=
1
To
NumItems
If
Qualities(i)
=
OPCAutomation。OPCQuality.OPCQualityGood
Then?
Select
Case
ClientHandles(i)
Case
2?
txtCardNo.Text
=
CStr(ItemValues(i))
Case
200
'測試7張卡片
txtValueBlock0.Text
=
CStr(ItemValues(i))
Case
201
txtValueBlock1。Text
=
CStr(ItemValues(i))
Case
202?
txtValueBlock2。Text
=
CStr(ItemValues(i))
Case
203
txtValueBlock3.Text
=
CStr(ItemValues(i))
Case
204?
txtValueBlock4.Text
=
CStr(ItemValues(i))?
Case
205
txtValueBlock5.Text
=
CStr(ItemValues(i))
Case
206?
txtValueBlock6。Text
=
CStr(ItemValues(i))?
Case
207
txtValueBlock7。Text
=
CStr(ItemValues(i))
Case
Else?
End
Select
?
End
If
Next
End
Sub
??
’斷開到指定OPC服務(wù)器的連接?
Private
Sub
btnDisconnectServer_Click(ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)
Handles
btnDisconnectServer.Click?
If
Not
(ConnectedOPCServer
Is
Nothing)
Then?
Try?
ConnectedOPCServer.Disconnect()?
Catch
ex
As
Exception
MessageBox.Show("OPC
server
disconnect
failed:
"
+
ex.Message,
”O(jiān)PCSample",
MessageBoxButtons.OK)
Finally?
ConnectedOPCServer
=
Nothing?
ResetControlStatus()?
End
Try?
End
If?
End
Sub
?
’開卡,并返回卡號
Private
Sub
btnOpenCard_Click(ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)?
If
ConnectedGroup
IsNot
Nothing
Then
Try?
'準(zhǔn)備參數(shù)數(shù)組
Dim
ServerHandles(1)
As
Integer
Dim
ServerValues(1)
As
Object
Dim
ServerErrors
As
System。Array?
ServerHandles(1)
=
GlobalOPCItems(0)。ServerHandle?
ServerValues(1)
=
1
'寫入值,用于執(zhí)行OpenCard的操作?
ConnectedGroup.SyncWrite(1,
ServerHandles,
ServerValues,
ServerErrors)
If
ServerErrors(1)
<>
0
Then
MsgBox("OpenCardError:
”
&
ServerErrors(1))
End
If
ServerHandles(1)
=
GlobalOPCItems(2).ServerHandle?
Dim
ServerResult
As
System。Array
'讀取卡號?
ConnectedGroup.SyncRead(OPCAutomation.OPCDat(yī)aSource.OPCDevice,
1,
ServerHandles,
ServerResult,
ServerErrors)?
If
ServerErrors(1)
〈>
0
Then?
MsgBox("ReadCardNoError:
”
&
ServerErrors(1))?
Else?
txtCardNo。Text
=
ServerResult(1)?
End
If
Catch
ex
As
Exception
MessageBox.Show("OPC
server
Open
Card
failed:
”
+
ex。Message,
”O(jiān)PCSample",
MessageBoxButtons.OK)
End
Try
ResetControlStatus()
End
If?
End
Sub??
'讀取卡片指定的塊號的值
Private
Sub
btnReadCard_Click(ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)?
If
Not
(ConnectedGroup
Is
Nothing)
Then?
Try
'獲取塊號
Dim
BlockNo
As
Short
=
CByte(ReadBlockNo。Text)
'如果要獲取數(shù)據(jù)的塊所對應(yīng)的項還沒有創(chuàng)建,就創(chuàng)建它
If
GlobalOPCBlockItems(BlockNo)
Is
Nothing
Then?
GlobalOPCBlockItems(BlockNo)
=
ConnectedGroup.OPCItems.AddItem(”Reader_Device.Block"
&
CStr(BlockNo),
200
+
BlockNo)
End
If
'準(zhǔn)備參數(shù)數(shù)組
Dim
ServerResults
As
System.Array?
Dim
ServerErrors
As
System.Array?
Dim
ServerHandles(1)
As
Integer?
ServerHandles(1)
=
GlobalOPCBlockItems(BlockNo).ServerHandle
’讀取值
ConnectedGroup。SyncRead(OPCAutomation.OPCDataSource.OPCDevice,
1,
ServerHandles,
ServerResults,
ServerErrors)?
If
ServerErrors(1)
〈>
0
Then?
MsgBox("Read
Card
Failed:"
&
ServerErrors(1))
Else?
txtReadBlockNo.Text
=
ServerResults(1)
End
If?
Catch
ex
As
Exception?
MessageBox.Show(”O(jiān)PC
server
Read
Card
failed:
"
+
ex.Message,
"OPCSample”,
MessageBoxButtons.OK)?
End
Try
End
If
End
Sub??
’寫卡片指定塊的值?
Private
Sub
btnWriteCard_Click(ByVal
sender
As
System。Object,
ByVal
e
As
System.EventArgs)?
If
Not
(ConnectedGroup
Is
Nothing)
Then
Try
’獲取塊號
Dim
BlockNo
As
Short
=
CByte(WriteBlockNo.Text)?
’如果要寫入數(shù)據(jù)的塊所對應(yīng)的項還沒有創(chuàng)建,就創(chuàng)建它?
If
GlobalOPCBlockItems(BlockNo)
Is
Nothing
Then?
GlobalOPCBlockItems(BlockNo)
=
ConnectedGroup。OPCItems.AddItem(”Reader_Device.Block”
&
CStr(BlockNo),
200
+
BlockNo)?
End
If
’準(zhǔn)備參數(shù)數(shù)組
Dim
ServerValues(1)
As
Object?
Dim
ServerErrors
As
Array
Dim
ServerHandles(1)
As
Integer
ServerHandles(1)
=
GlobalOPCBlockItems(BlockNo)。ServerHandle
ServerValues(1)
=
txtWriteBlockNo。Text
’寫入值?
ConnectedGroup.SyncWrite(1,
ServerHandles,
ServerValues,
ServerErrors)?
If
ServerErrors(1)
<〉
0
Then?
MsgBox(”Write
Card
Failed:"
&
ServerErrors(1))?
Else
MsgBox("Write
Card
Succeed”)?
End
If?
Catch
ex
As
Exception?
MessageBox.Show(”O(jiān)PC
server
Write
Card
failed:
"
+
ex.Message,
”O(jiān)PCSample”,
MessageBoxButtons。OK)
End
Try?
End
If
End
Sub
'重設(shè)控件狀態(tài)
Private
Sub
ResetControlStat(yī)us()?
If
ConnectedOPCServer
Is
Nothing
Then?
btnConnectServer.Enabled
=
True
btnDisconnectServer.Enabled
=
False
btnReadCard.Enabled
=
False
btnWriteCard。Enabled
=
False?
btnOpenCard。Enabled
=
False?
btnCloseCard.Enabled
=
False
ReadBlockNo.Value
=
0?
WriteBlockNo.Value
=
0
txtReadBlockNo.Text
=
”"
txtWriteBlockNo.Text
=
”0000000000”
txtCardNo.Text
=
""
?
txtSrvStartTime.Text
=
""
txtSrvCurrTime.Text
=
”"
txtSrvGroupCount。Text
=
""?
txtSrvGroupDeadBand.Text
=
""
txtSrvGroupDefActive。Text
=
""?
txtSrvGroupLocalID。Text
=
”"?
txtSrvGroupTimeBias.Text
=
""
txtSrvRequestRate.Text
=
""?
Else
btnConnectServer.Enabled
=
False?
btnDisconnectServer.Enabled
=
True?
If
txtCardNo.Text
=
””
Then
btnReadCard。Enabled
=
False
btnWriteCard.Enabled
=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)窺鏡柜市場分析:預(yù)計2031年全球市場銷售額將達(dá)到2.04億美元
- ESG與央國企月度報告:5月ESG央國企策略超額收益為1.23%
- 初中思想品德教師工作總結(jié)
- 《電力信息系統(tǒng)網(wǎng)絡(luò)安全等級保護(hù)測評報告評審指南》(征求意見稿)
- 工業(yè)互聯(lián)網(wǎng)NFV虛擬化網(wǎng)絡(luò)在智能工廠中的實踐案例分析
- 藝術(shù)培訓(xùn)平臺用戶體驗優(yōu)化與市場競爭力提升報告
- 四季變換食品飲料行業(yè):飲料市場發(fā)展趨勢與競爭格局分析
- 物聯(lián)網(wǎng)技術(shù)概論 習(xí)題與答案
- 智能垃圾分類在2025年商業(yè)綜合體運營中的應(yīng)用研究報告
- 交通流量預(yù)測在智慧交通系統(tǒng)中的多尺度建模與仿真報告2025
- 醫(yī)院護(hù)士辭職申請書集合六篇(護(hù)士崗位辭職申請書)
- 靜脈注射 Microsoft PowerPoint 演示文稿課件
- 同濟(jì)大學(xué)論文答辯通用PPT模板
- AFC檢測技術(shù)規(guī)程
- 部編人教版二年級下學(xué)期數(shù)學(xué)期末學(xué)業(yè)質(zhì)量監(jiān)測復(fù)習(xí)課堂知識練習(xí)題
- 餐飲行業(yè)抖音代運營方案
- 《聰明人和傻子和奴才》 課件
- Fleischner指南解讀
- 建筑工地安全生產(chǎn)百日攻堅行動實施方案
- 電廠度電機(jī)維修技術(shù)規(guī)范書正式
- 年產(chǎn)40萬噸甲醇合成工藝設(shè)計
評論
0/150
提交評論