OPC-Client-動(dòng)態(tài)連接庫(kù)開(kāi)發(fā)和應(yīng)用_第1頁(yè)
OPC-Client-動(dòng)態(tài)連接庫(kù)開(kāi)發(fā)和應(yīng)用_第2頁(yè)
OPC-Client-動(dòng)態(tài)連接庫(kù)開(kāi)發(fā)和應(yīng)用_第3頁(yè)
OPC-Client-動(dòng)態(tài)連接庫(kù)開(kāi)發(fā)和應(yīng)用_第4頁(yè)
OPC-Client-動(dòng)態(tài)連接庫(kù)開(kāi)發(fā)和應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一、引言

現(xiàn)在有很多工業(yè)控制產(chǎn)品都支持OPCServer,如西門(mén)子SIMATICNET、WINCC、WINAC、Protool/pro,亞控公司組態(tài)王等,這些產(chǎn)品本身在一些需要實(shí)現(xiàn)很復(fù)雜的數(shù)據(jù)模型功能上還顯得缺乏,由于支持了OPC,我們就可以在VB或C++上通過(guò)OPC獲取數(shù)據(jù)進(jìn)而實(shí)現(xiàn)較復(fù)雜的功能〔如強(qiáng)大的數(shù)據(jù)庫(kù)管理或數(shù)據(jù)分析〕。本文討論了如何在VB中開(kāi)發(fā)一個(gè)動(dòng)態(tài)連接庫(kù),以方便開(kāi)發(fā)者實(shí)現(xiàn)對(duì)OPC效勞器的數(shù)據(jù)采集,將精力更多的放在界面開(kāi)發(fā)和數(shù)據(jù)處理上。二、功能設(shè)計(jì)

類(lèi)型設(shè)計(jì)為ActiveXDll,名稱(chēng):OPC_Dll.dll,可以在VB工程[引用]中加載,加載后通過(guò)創(chuàng)立類(lèi)BCA_OPC的實(shí)例來(lái)實(shí)現(xiàn)OPC數(shù)據(jù)通訊,BCA_OPC的調(diào)用功能如下:

1、配置初始化:Dll_Initial(strConfigFileAsString)AsBoolean

其中strConfigFile為連接OPC效勞器對(duì)應(yīng)的配置文件名稱(chēng)〔*.ini〕,用戶(hù)建立的配置文件應(yīng)遵循一定的格式〔在下面應(yīng)用中說(shuō)明〕,并且應(yīng)放在系統(tǒng)目錄下〔如C:\WINNT下〕。配置文件中包含了要連接的OPC效勞器名稱(chēng)、log文件名稱(chēng)、變量組定義及對(duì)應(yīng)組內(nèi)的變量定義〔本連接庫(kù)最多支持1024個(gè)變量通訊,對(duì)變量組的數(shù)目沒(méi)有限制〕。配置成功返回TRUE。

2、連接OPC效勞器:ConnectServer(OptionalIPAddressAsString)AsBoolean

IPAddress為可選的遠(yuǎn)程O(píng)PC效勞器所屬PC的IP地址,如“”,如果不提供IPAddress參數(shù),那么默認(rèn)為本機(jī)OPC效勞器。連接成功返回TRUE。

3、配置通訊變量〔組態(tài)OPC客戶(hù)機(jī)〕:SetConfiguration()AsBoolean

根據(jù)提供的ini配置文件組態(tài)OPC客戶(hù)機(jī)與效勞器的變量通訊,組態(tài)成功返回TRUE。

4、讀變量數(shù)據(jù):GetData(ItemNameAsString)

ItemName為變量名稱(chēng),必須與ini配置文件中的變量名稱(chēng)一致。本功能返回該變量的實(shí)際數(shù)據(jù)。

5、寫(xiě)變量數(shù)據(jù):WriteData(ItemNameAsString,ItemWriteDataAsVariant)

ItemName為變量名稱(chēng),ItemWriteData為變量數(shù)據(jù)。

三、實(shí)現(xiàn)代碼

1、在VB6.0中新建ActiveXDll工程,如下列圖:

2、在工程菜單中添加引用,如下列圖:

如果系統(tǒng)中沒(méi)有OPCAutomation,你需要安裝注冊(cè)O(shè)PC自動(dòng)化。一般裝了OPC支持的軟件,系統(tǒng)都支持OPC自動(dòng)化。

3、在工程中添加模塊,如下列圖:

模塊API_Function為軟件所需的一些API函數(shù)。

模塊Global_constants為一些系統(tǒng)常量

類(lèi)模塊BCA_OPC為實(shí)現(xiàn)主類(lèi)

類(lèi)模塊ItemInfo和ItemsInfo實(shí)現(xiàn)變量信息的封裝

4、以下為各模塊的程序代碼:

API_Function:

OptionExplicit'----------------------------------

'獲取一個(gè)與給定初始化文件指定域中的一個(gè)鍵相聯(lián)系的整數(shù)值(1)

PublicDeclareFunctionGetPrivateProfileIntLib"kernel32"Alias_

"GetPrivateProfileIntA"(ByVallpApplicationNameAsString,ByVallpKeyNameAsString,_

ByValnDefaultAsLong,ByVallpFileNameAsString)AsLong

'從一個(gè)初始化文件中獲取指定段的所有鍵和值(2)

PublicDeclareFunctionGetPrivateProfileSectionLib"kernel32"Alias_

"GetPrivateProfileSectionA"(ByVallpAppNameAsString,ByVallpReturnedStringAsString,_

ByValnSizeAsLong,ByVallpFileNameAsString)AsLong

'獲取初始化文件中的制定斷下的一個(gè)字符串(3)

PublicDeclareFunctionGetPrivateProfileStringLib"kernel32"Alias_

"GetPrivateProfileStringA"(ByVallpApplicationNameAsString,ByVallpKeyNameAsAny,_

ByVallpDefaultAsString,ByVallpReturnedStringAsString,ByValnSizeAsLong,_

ByVallpFileNameAsString)AsLongGlobal_constants:

OptionExplicit

OptionBase1

'Globalconstrants

'------------------------------

GlobalConstEnglish=&H409

GlobalConstOPC_DS_CACHE=1

GlobalConstOPC_DS_DEVICE=2BCA_OPC:

OptionExplicit

OptionBase1'InterfaceObjects接口對(duì)象

'----------------------------------------------------------------------------

'必須使用WithEvents來(lái)申明對(duì)象OPCServer和OPCGroup,

'WithEvents指定申明的對(duì)象用于處理對(duì)象的事件

DimWithEventsServerObjAsOPCServer

'定義OPCServer

DimGroupObjAsOPCGroup

'定義OPCGroup

DimWithEventsGroupCollectionAsOPCGroups'定義OPCGroups

DimItemCollectionAsOPCItems

'定義OPCItems

DimItemObjAsOPCItem

'定義OPCItem

'----------------------------------------------------------------------------

'GlobalVariables全局變量

'----------------------------------------------------------------------------

DimServerNameAsString

'OPC效勞器名稱(chēng)

DimServerConnectedAsBoolean

'OPC效勞器已連接標(biāo)志

'OPCServer和OPCGroup都有ServerHandle和ClientHandle參數(shù);

'ServerHandle用于OPC效勞器定位;ClientHandle用于OPC客戶(hù)端定位;

DimServerGroupHandle()AsLong

'效勞器-組句柄(索引)

DimServerItemHandle()AsLong

'效勞器-條目句柄

DimClientGroupHandle()AsLong

'客戶(hù)機(jī)-組句柄

DimClientItemHandle()AsLong

'客戶(hù)機(jī)-條目句柄

DimDll_is_InitialAsBoolean

'DLL初始化

DimConfiguration_is_SetAsBoolean

'是否已組態(tài)

DimTraceOnAsBoolean

'跟蹤開(kāi)關(guān)

DimTraceFileAsString

'跟蹤文件

DimConfigFileAsString

'組態(tài)文件

DimItemData(1024)AsVariant

'讀取變量數(shù)據(jù)的儲(chǔ)存地址

DimAllItemsInfoAsNewItemsInfo'log文件記錄操作

PrivateFunctionTrace(TraceMsgAsString)

IfTraceOn=TrueThen

DimfsAsObject,fAsObject

DimmHour,mMinute,mSecond,mMSecondAsString

Setfs=CreateObject("Scripting.FileSystemObject")

Setf=fs.OpenTextFile(TraceFile,8,-2)

mHour=Format(Fix(Timer/3600),"00")

mMinute=Format(Fix((Timer-mHour*3600)/60),"00")

mSecond=Format(Fix((Timer-mHour*3600-mMinute*60)),"00")

mMSecond=Format(Fix((Timer-Fix(Timer))*1000),"000")

f.Writeline"["&mHour&":"&mMinute&":"&mSecond&"."&mMSecond&"]

"&TraceMsg

f.Close

Setfs=Nothing

Setf=Nothing

EndIf

EndFunction'(1).DLL初始化

PublicFunctionDll_Initial(strConfigFileAsString)AsBoolean

DimResultAsString*255,fsAsObject,fAsObject

ConfigFile=strConfigFile

GetPrivateProfileString"TRACE","TraceOn",_

"ERROR",Result,255,ConfigFile

IfResult<>"ERROR"Then

IfResult=1Then

GetPrivateProfileString"TRACE","TraceFile",_

"ERROR",Result,255,ConfigFile

IfResult<>"ERROR"Then

TraceFile=Result

Else

TraceFile=App.Path&"\Trace.log"

EndIf

Setfs=CreateObject("Scripting.FileSystemObject")

Setf=fs.CreateTextFile(TraceFile,True)

f.Writeline("***BCA_OPCTraceStarted,BeiChenAutomation2003/ZhangPeng***")

f.Close

TraceOn=True

Else

TraceOn=False

EndIf

Dll_is_Initial=True

Dll_Initial=True

Trace">Dll_Initial"

Trace"<Dll_InitialOK"

Else

MsgBox"無(wú)法找到配置文件:"&strConfigFile,vbOKOnly,"錯(cuò)誤"

Dll_is_Initial=False

Dll_Initial=False

EndIf

EndFunction'(2).連接OPC效勞器

PublicFunctionConnectServer(OptionalIPAddressAsString)AsBoolean

Trace">ConnectServer"

IfDll_is_Initial=FalseThen

Trace"<ConnectServerCancelled,BecauseDll_Initialhasnotbeencalled"

ExitFunction

EndIf

IfNotServerConnectedThen

ServerName=GetServerName

OnErrorGoToErrorHandler

SetServerObj=NewOPCServer

ServerObj.ConnectServerName,IPAddress

ServerConnected=True

Trace"<ConnectServerOK"

Else

Trace"<Serverhasbeenconnected,Pleasedonotconnectitagain"

EndIf

ConnectServer=ServerConnected

ExitFunction

ErrorHandler:

Trace"<ConnectServerError,PleasebesurethatServerisrunning"

ConnectServer=False

EndFunction'(3).組態(tài)OPC客戶(hù)機(jī)

PublicFunctionSetConfiguration()AsBoolean

Trace">SetConfigurationstart..."

IfDll_is_Initial=FalseThen

Trace"<SetConfigurationCancelled,BecauseDll_Initialhasnotbeencalled"

ExitFunction

EndIf

IfServerConnected=FalseThen

Trace"<SetConfigurationCancelled,BecauseConnectServerhasnotbeencalled"

ExitFunction

EndIf

IfConfiguration_is_Set=TrueThen

Trace"<SetConfigurationCancelled,Becauseconfigurationhasbeenset"

ExitFunction

EndIf

'Begintoconfigure

Dimf_retAsLong,ReturnedStringAsString*1024,Valid_ReturnedStringAsString

DimReturnedString1AsString*1024,Valid_ReturnedString1AsString

DimSpace_posAsInteger,GroupNameAsString

DimSpace_pos1,Equal_posAsInteger,ItemNameAsString,ItemIndexAsLong

DimNumItemsAsLong,ItemIDs(1)AsString,ClientHandles(1)AsLong,Serverhandles()AsLong

DimErrors()AsLong

ReturnedString=""

ReturnedString1=""

OnErrorGoToErrorHandler

SetGroupCollection=ServerObj.OPCGroups

GroupCollection.DefaultGroupIsActive=False

f_ret=GetPrivateProfileSection("GROUP",ReturnedString,1024,ConfigFile)

Valid_ReturnedString=Left(ReturnedString,f_ret+1)

DoUntilInStr(Valid_ReturnedString,Chr(0))<0

Space_pos=InStr(Valid_ReturnedString,Chr(0))

GroupName=Left(Valid_ReturnedString,Space_pos-1)

IfGroupName=""Then

GoTonxt3

EndIf

SetGroupObj=GroupCollection.Add(GroupName)

GroupObj.IsSubscribed=False

Trace"<Addgroup:"&GroupName&"OK"

SetItemCollection=GroupObj.OPCItems

ItemCollection.DefaultIsActive=True

f_ret=GetPrivateProfileSection(GroupName,ReturnedString1,1024,ConfigFile)

Valid_ReturnedString1=Left(ReturnedString1,f_ret+1)

DoUntilInStr(Valid_ReturnedString1,Chr(0))<0

Space_pos1=InStr(Valid_ReturnedString1,Chr(0))

ItemName=Left(Valid_ReturnedString1,Space_pos1-1)

IfItemName=""Then

GoTonxt2

EndIf

IfInStr(ItemName,"UpdateRate")>0OrInStr(ItemName,"IsSubscribed")>0Then

GoTonxt1

EndIf

ItemCollection.DefaultRequestedDataType=GetItemDataType(ItemName)

ItemIndex=ItemIndex+1

NumItems=1

ItemIDs(1)=ItemName

ClientHandles(1)=ItemIndex

ItemCollection.AddItemsNumItems,ItemIDs,ClientHandles,Serverhandles,Errors

AllItemsInfo.ItemInfo_AddItemName,GroupName,ItemIndex,Serverhandles(1)

Trace"<AddItem:"&ItemName&"OK"

nxt1:

Valid_ReturnedString1=Mid(Valid_ReturnedString1,Space_pos1+1)

Loop

nxt2:

f_ret=GetPrivateProfileInt(GroupName,"UpdateRate",0,ConfigFile)

GroupObj.UpdateRate=f_ret

Trace"<Setgroup:"&GroupName&"UpdateRate="&f_ret&"OK"

f_ret=GetPrivateProfileInt(GroupName,"IsSubscribed",0,ConfigFile)

GroupObj.IsSubscribed=IIf(f_ret=1,True,False)

GroupObj.IsActive=True

Trace"<Setgroup:"&GroupName&"IsSubscribed="&f_ret&"OK"

Valid_ReturnedString=Mid(Valid_ReturnedString,Space_pos+1)

SetGroupObj=Nothing

SetItemCollection=Nothing

Loop

nxt3:

Trace"<SetConfigurationend"

Configuration_is_Set=True

SetConfiguration=True

ExitFunction

ErrorHandler:

Trace"<SetConfigurationError,Pleasebesurethatconfigfileiscorrect"

Configuration_is_Set=False

EndFunction'獲取效勞器名稱(chēng)

PrivateFunctionGetServerName()AsString

DimResultAsString*255

GetPrivateProfileString"SERVER","Server",_

"ERROR",Result,255,ConfigFile

GetServerName=RemoveSpaces(Result)

EndFunction'獲取效勞器連接狀態(tài)

PrivateFunctionGetConnectStatus()AsBoolean

GetConnectStatus=ServerConnected

EndFunction'功能塊:移除空格

PrivateFunctionRemoveSpaces(ItemAsString)AsString

DimResultAsString

DimiAsInteger

i=1

While(Mid$(Item,i,1)<>Chr(0))

Result=Result&Mid$(Item,i,1)

i=i+1

Wend

RemoveSpaces=Result

EndFunctionPrivateSubClass_Initialize()

Configuration_is_Set=False

Dll_is_Initial=False

ServerConnected=False

EndSub'DLL終止

PrivateSubClass_Terminate()

SetServerObj=Nothing

'釋放ServerObj

SetGroupCollection=Nothing

'釋放GroupCollection

SetItemCollection=Nothing

'釋放ItemCollection

ServerConnected=False

Dll_is_Initial=False

Configuration_is_Set=False

Trace"<Dllisterminate"

EndSub

'全局?jǐn)?shù)據(jù)改變

PrivateSubGroupCollection_GlobalDataChange(ByValTransactionIDAsLong,ByValGroupHandleAsLong,ByValNumItemsAsLong,ClientHandles()AsLong,ItemValues()AsVariant,Qualities()AsLong,TimeStamps()AsDate)

DimiAsInteger,GroupNameAsString,ItemNameAsString

Trace"<==GlobalDataChange!Followingisthedata:"

GroupName=GroupCollection.GetOPCGroup(GroupHandle).Name

Trace"<==GroupName:"&GroupName&"NumberofItems:"&NumItems

Fori=1ToNumItems

ItemData(ClientHandles(i))=ItemValues(i)

Trace"<==Item'sName:"&AllItemsInfo.GetItem_Name(ClientHandles(i))&"Values:"&ItemValues(i)&"ChangedData:"&TimeStamps(i)

Next

Trace"<==GlobalDataChangeEnd"

EndSub

'獲取單個(gè)變量數(shù)據(jù)

PublicFunctionGetData(ItemNameAsString)

Trace">GetDatastart:ItemName="&ItemName

IfDll_is_Initial=FalseThen

Trace"<GetDataCancelled,BecauseDll_Initialhasnotbeencalled"

ExitFunction

EndIf

IfServerConnected=FalseThen

Trace"<GetDataCancelled,BecauseConnectServerhasnotbeencalled"

ExitFunction

EndIf

IfConfiguration_is_Set=FalseThen

Trace"<GetDataCancelled,Becauseconfigurationhasnotbeenset"

ExitFunction

EndIf

DimItemClientHandleAsLong

ItemClientHandle=AllItemsInfo.GetItem_ClientHandle(ItemName)

GetData=ItemData(ItemClientHandle)

Trace"<GetDataOK:ItemData="&GetData

EndFunction'寫(xiě)入單個(gè)變量數(shù)據(jù)

PublicFunctionWriteData(ItemNameAsString,ItemWriteDataAsVariant)

Trace">WriteDatatoWinccstart..."

Trace">ItemName:"&ItemName&"Value:"&ItemWriteData

IfDll_is_Initial=FalseThen

Trace"<WriteDataCancelled,BecauseDll_Initialhasnotbeencalled"

ExitFunction

EndIf

IfServerConnected=FalseThen

Trace"<WriteDataCancelled,BecauseConnectServerhasnotbeencalled"

ExitFunction

EndIf

IfConfiguration_is_Set=FalseThen

Trace"<WriteDataCancelled,Becauseconfigurationhasnotbeenset"

ExitFunction

EndIf

OnErrorGoToErrorHandler

SetGroupObj=GroupCollection.GetOPCGroup(AllItemsInfo.GetItem_Group(ItemName))

SetItemObj=GroupObj.OPCItems.GetOPCItem(AllItemsInfo.GetItem_ServerHandle(ItemName))

ItemObj.WriteItemWriteData

Trace"<WriteDatatoWinccOK"

SetGroupObj=Nothing

SetItemObj=Nothing

ExitFunction

ErrorHandler:

Trace"<WriteDatatoWinccError,PleasemakesureItem'sNameandWrite-dataiscorrect"

SetGroupObj=Nothing

SetItemObj=Nothing

EndFunction

'列舉某個(gè)變量的屬性

PrivateFunctionGetItemProperty(ItemIDAsString)

DimCountAsLong,iAsLong

DimPropertyIDs()AsLong

DimDescriptions()AsString

DimDataTypes()AsInteger

DimPropertyValues()AsVariant

DimErrors()AsLong

ServerObj.QueryAvailablePropertiesItemID,Count,PropertyIDs,Descriptions,DataTypes

ServerObj.GetItemPropertiesItemID,Count,PropertyIDs,PropertyValues,Errors

Trace"=====GetItemIDPropertyStart======"

Fori=1ToCount

Trace"="&PropertyIDs(i)&"

"&Descriptions(i)&"

"&PropertyValues(i)

Next

Trace"=====GetItemIDPropertyEnd======"

EndFunction

'獲取某個(gè)變量的數(shù)據(jù)類(lèi)型

PrivateFunctionGetItemDataType(ItemIDAsString)AsLong

DimCountAsLong

DimPropertyIDs(1)AsLong

DimPropertyValues()AsVariant

DimErrors()AsLong

Count=1

PropertyIDs(1)=1

ServerObj.GetItemPropertiesItemID,Count,PropertyIDs,PropertyValues,Errors

GetItemDataType=PropertyValues(1)

EndFunction

'效勞器關(guān)閉

PrivateSubServerObj_ServerShutDown(ByValReasonAsString)

Trace"!Dllisshutdown,FollowingistheReason:"

Trace"!"&Reason

ServerObj.Disconnect

Configuration_is_Set=False

Dll_is_Initial=False

ServerConnected=False

EndSub

'獲取效勞器連接狀態(tài)

PublicPropertyGetServer_Connected()AsBoolean

Server_Connected=Configuration_is_Set

EndPropertyItemInfo:

OptionExplicitPublicItemNameAsString

PublicGroupNameAsString

PublicItemServerHandleAsLong

PublicItemClientHandleAsLongItemsInfo:

OptionExplicitDimCollection_ItemsInfoAsNewCollection

'定義OPCItem信息PublicFunctionItemInfo_Add(NameAsString,GroupAsString,ClientHandleAsLong,ServerHandleAsLong)

DimInfoAsNewItemInfo

WithInfo

.ItemName=Name

.GroupName=Group

.ItemClientHandle=ClientHandle

.ItemServerHandle=ServerHandle

EndWith

Collection_ItemsInfo.AddInfo

EndFunction'獲取Item屬于的組名

PublicFunctionGetItem_Group(ItemIDAsString)AsString

DimInfoAsItemInfo

ForEachInfoInCollection_ItemsInfo

IfInfo.ItemName=ItemIDThen

GetItem_Group=Info.GroupName

ExitFunction

EndIf

Next

EndFunction'獲取Item的ServerHandle

PublicFunctionGetItem_ServerHandle(ItemIDAsString)AsLong

DimInfoAsItemInfo

ForEachInfoInCollection_ItemsInfo

IfInfo.ItemName=ItemIDThen

GetItem_ServerHandle=Info.ItemServerHandle

ExitFunction

EndIf

Next

EndFunction'獲取Item的ClientHandle

PublicFunctionGetItem_ClientHandle(ItemIDAsString)

DimInfoAsItemInfo

ForEachInfoInCollection_ItemsInfo

IfInfo.ItemName=ItemIDThen

GetItem_ClientHandle=Info.ItemClientHandle

ExitFunction

EndIf

Next

EndFunction'獲取Item的名稱(chēng)

PublicFunctionGetItem_Name(ItemClientHandleAsLong)

DimInfoAsItemInfo

ForEachInfoInCollection_ItemsInfo

IfInfo.ItemClientHandle=ItemClientHandleThen

GetItem_Name=Info.ItemName

ExitFunction

EndIf

Next

EndFunction將以上代碼輸入VB并編譯生成OPC_DLL.dll文件,完成后注冊(cè)。OPC調(diào)用函數(shù)請(qǐng)參閱opcdataaccessautov2-02_76文件。四、應(yīng)用介紹

1、

新建ini配置文件〔保存于系統(tǒng)目錄下〕,如wincc.ini。注意組中定義的變量名稱(chēng)必須存在于OPCServer中!右邊//后的內(nèi)容僅

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論