




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 OPC工具箱作OPC客戶端的應(yīng)用研究鄒紹云武漢理工大學(xué)湖北武漢430063e-mail: HYPERLINK mailto:Z Z摘要本文分析了OPC工具箱的工作原理,并利用OPC工具箱實現(xiàn)對OPC服務(wù)器包含項的值的讀寫操作。關(guān)鍵字:MATLABOPC服務(wù)器OPC工具箱AbstractThispaperanalyzestheworkingprincipleofOPCToolbox,andachievesreadingfromorwritingtoOPCserver.KeyWords:MATLABOPCServerOPCToolbox緒論OPC工具箱擴展了MATLAB工具箱仿真功能,使MATL
2、AB能夠和OPC服務(wù)器相互交換數(shù)據(jù)。OPC工具箱可以從符合OPC基金會數(shù)據(jù)存取標(biāo)準(zhǔn)的設(shè)備中讀、寫、記錄OPC數(shù)據(jù),如分布式控制系統(tǒng)、監(jiān)督控制系統(tǒng)和數(shù)據(jù)采集系統(tǒng),以及可編程邏輯控制器(PLC)。OPC工具箱使MATLAB和仿真器(Simulink)相應(yīng)OPC服務(wù)器或工具箱初始化事件,如關(guān)機、服務(wù)器錯誤或項值改變?;瘜W(xué)、制藥、發(fā)電及其它連續(xù)制造工業(yè)的工程師應(yīng)用OPC工具箱輸入設(shè)備數(shù)據(jù)到MATLAB里進行分析、可視化、仿真和快速原形算法。OPC工具箱使仿真模型能方便地應(yīng)用于在線監(jiān)控軟件和控制器測試軟件。本次仿真采用KEPWare.KEPServerEx.V4作為OPC服務(wù)器,模擬從編程邏輯控制器(P
3、LC)讀取和寫入數(shù)據(jù),并通過返回的數(shù)據(jù)繪出圖形。1OPC通訊技術(shù)簡介OPC(用于過程控制的OLE)規(guī)范是由OPC基金會建立的硬件和軟件接口標(biāo)準(zhǔn),它基于現(xiàn)有的OLE、組件對象模型COM(ComponentObjectModel)和分布式組件對象模型DCOM(DistributedCOM)技術(shù),已得到越來越多的硬件和軟件制造商的承認和支持,成為事實上的國際標(biāo)準(zhǔn)。1OPC通訊技術(shù)免去了硬件生產(chǎn)廠家為各種應(yīng)用軟件編寫單獨的驅(qū)動程序的重復(fù)勞動,使各種軟、硬件組成的復(fù)雜系統(tǒng)能夠可靠地交換數(shù)據(jù)并穩(wěn)定地運行。OPC采用客戶端/服務(wù)器結(jié)構(gòu)。OPC通訊包含三類對象:服務(wù)器(Server)、組(Group)和數(shù)據(jù)項
4、(Item),其層次模型如圖1所示。圖1OPC對象層次模型2OPC工具箱的基本工作原理(1)搜索可用的opc服務(wù)器為了建立與OPC服務(wù)器的連接,首先要知道OPC服務(wù)器的ID及其所在的主機名。1)在本地計算機上查詢所有可用的OPC服務(wù)器。hostInfo=opcserverinfo(localhost)得到結(jié)果如下:hostInfo=Host:localhostServerID:1x4cellServerDescription:1x4cellOPCSpecification:DA2DA2DA2DA2ObjectConstructor:1x4cell其中,Host:localhost表明搜索到的O
5、PC服務(wù)器在本地計算機上;ServerID:1x4cell表明在本地計算機上搜索到四個OPC服務(wù)器。四個OPC服務(wù)器所遵循的OPC規(guī)范都是DA2.0。ObjectConstruetor是指四個OPC服務(wù)器的制造商。2)驗證返回的OPC詳細信息:將OPC服務(wù)器ID信息賦值給allSevers數(shù)組allServers=hostInfo.ServerID執(zhí)行結(jié)果如下:allServers=Matrikon.OPC.TI5.1KEPware.KEPServerEx.V4Takebishi.Melsec.1OPC.SimaticHMI.HmiRTm.1本次仿真所用的OPC服務(wù)器是KEPware.KEPS
6、erverEx.V4。創(chuàng)建一個OPC數(shù)據(jù)訪問客戶端對象獲得主機名稱和OPC服務(wù)器ID后與OPC服務(wù)器進行連接,需要創(chuàng)建一個與服務(wù)器相對應(yīng)的opcda(OPC數(shù)據(jù)訪問)對象,其代碼如下:da=opcda(localhost,KEPware.KEPServerEx.V4)這樣就建立了一個與KEPware.KEPServerEx.V4對應(yīng)的OPC數(shù)據(jù)訪問對象。da=SummaryofOPCDataAccessClientObject:localhost/KEPware.KEPServerEx.V4ServerParametersHost:localhostServerID:KEPware.KEPSe
7、rverEx.V4Status:disconnectedTimeout:10seconds從上面執(zhí)彳丁結(jié)果可以看到Status:disconnected,也就是還沒有與OPC服務(wù)器建立連接。建立MATLAB與指定OPC服務(wù)器之間的連接連接服務(wù)器connect(da)顯示客戶端信息,確認客戶端已經(jīng)建立了連接da執(zhí)丁結(jié)果如下:SummaryofOPCDataAccessClientObject:localhost/KEPware.KEPServerEx.V4ServerParametersHost:localhostServerID:KEPware.KEPServerEx.V4Status:con
8、nectedTimeout:10secondsObjectParametersGroup:0-by-1dagroupobjectEventLog:0of1000events從執(zhí)彳丁結(jié)果Status:connected可以看出,OPC客戶端,也就是matlab與服務(wù)器建立了連接。瀏覽服務(wù)器的命名空間1)依據(jù)KEPware.KEPServerEx.V4服務(wù)器中已經(jīng)存在的項,通過部分匹配查找出所有需要的OPC項。KepItems=serveritems(da,*Channel_1.Device_1.Tag*)執(zhí)丁結(jié)果如下:KepItems=Channel_1.Device_1.Tag_1Channe
9、l_1.Device_1.Tag_2Channel_1.Device_1.Tag_3執(zhí)行結(jié)果顯示了所有包含Channel_1.Device_1.Tag字符串的OPC變量。2)將需要的OPC項名存儲到數(shù)組itmIDs中itmIDs=Channel_1.Device_1.Tag1,Channel_1.Device_1.Tag2,Channel_1.Device_1.Tag3;本次仿真的三個項模擬PLC的模擬量,是整型數(shù)據(jù)。創(chuàng)建一個OPC數(shù)據(jù)訪問組對象grp=addgroup(da,Group1)將項添加到組對象中創(chuàng)建組后才能夠添加項,下面將步驟四中定義的項(itmIDs)全部添加到創(chuàng)建的組對象(g
10、rp)中。itmCollection=additem(grp,itmIDs)執(zhí)行后itmCollection數(shù)組中存放著Group1中所有項的集合。配置OPC工具箱的屬性用SET命令配置OPC工具箱的屬性,用GET命令取回其屬性。下面的代碼是在兩分鐘內(nèi),每隔0.2秒登入一次數(shù)據(jù),numRecords是登入數(shù)據(jù)的次數(shù)。logDuration=2*60;logRate=0.2;numRecords=ceil(logDuration./logRate)配置組對象屬性,使其能獲取所有的數(shù)據(jù)。set(grp,UpdateRate,logRate,RecordsToAcquire,numRecords);
11、從OPC服務(wù)器中獲取數(shù)據(jù)調(diào)用START函數(shù)獲取數(shù)據(jù)。為了在程序繼續(xù)往下執(zhí)行前得到所有的數(shù)據(jù),調(diào)用WAIT函數(shù)。start(grp)wait(grp)上面語句執(zhí)行后,數(shù)據(jù)都登入到了內(nèi)存里面,需要從OPC工具箱引擎里取回。因為讀取上來的數(shù)據(jù)是時間序列數(shù)據(jù),需要將讀取上來的數(shù)據(jù)存儲到各個獨立的數(shù)組中。logIDs,logVal,logQual,logTime,logEvtTime=getdata(grp,double);查看工作區(qū)間中各個數(shù)據(jù)的大小whoslog*(9)繪制數(shù)據(jù)圖形下列代碼將數(shù)據(jù)圖形繪制在一條坐標(biāo)軸上,數(shù)據(jù)格式標(biāo)記(DATETICK)函數(shù)將X軸標(biāo)記轉(zhuǎn)換成格式化數(shù)據(jù)字符串。plot(l
12、ogTime,logVal);axistightdatetick(x,keeplimits)legend(logIDs)圖1模擬量數(shù)據(jù)繪制結(jié)果上圖注釋框控標(biāo)出紅線是Tag1的數(shù)據(jù)值變化曲線,綠線是Tag2的數(shù)據(jù)值變化曲線,藍線是Tag3的數(shù)據(jù)值變化曲線。通過上圖尚不能判斷所得數(shù)據(jù)的品質(zhì),所以通過下面的一段代碼將品質(zhì)不好的數(shù)據(jù)點用紅色標(biāo)出,品質(zhì)不確定的數(shù)據(jù)用橙色標(biāo)出。holdonisBadQual=strncmp(logQual,Bad,3);isRepeatQual=strncmp(logQual,Repeat,6);fork=1:size(logQual,2)badInd=isBadQual
13、(:,k);plot(logTime(badInd,k),logVal(badInd,k),ro,.MarkerFaceColor,r,MarkerEdgeColor,k)repInd=isRepeatQual(:,k);plot(logTime(repInd,k),logVal(repInd,k),ro,.MarkerFaceColor,0.80.50,MarkerEdgeColor,k)endholdoff圖2數(shù)據(jù)品質(zhì)標(biāo)志結(jié)果由于所有的數(shù)據(jù)品質(zhì)良好,所以沒有顯示標(biāo)識紅點或橙色點。(10)清除結(jié)束OPC工具箱對象后必須將其從OPC工具箱引擎中刪除,并自動刪除組對象和項對象。disconnec
14、t(da)delete(da)清除組對象isvalid(grp)從工作區(qū)間清除項的集合cleardagrpitmCollection以上分析的是MATLAB從OPC服務(wù)器讀取某個組中所有項的字段值,并用圖形顯示ItemID、Value、Quality、TimeStamp的全過程,及其使用的底層代碼的分析。其M文件代碼見附錄1。3.OPC工具箱的數(shù)據(jù)交換同步讀寫用OPC工具箱的同步讀寫操作與OPC服務(wù)器交換數(shù)據(jù)。與OPC服務(wù)器建立連接并建立相關(guān)對象da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);grp=addgroup(da,Grou
15、p1);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.Device_1.Tag_3;itmCollection=additem(grp,itmIDs);執(zhí)行同步讀操作默認讀操作從OPC服務(wù)器的高速緩存中獲取數(shù)據(jù)。1)讀一個值r=read(itmCollection(1)執(zhí)行結(jié)果如下:r=ItemID:Channel_1.Device_1.Tag_1Value:1004Quality:Good:Non-specificTimeStamp:2010611184539.4680Error:2)讀全部值r=re
16、ad(itmCollection)執(zhí)行結(jié)果如下:r=3x1structarraywithfields:ItemIDValueQualityTimeStampError查看項的具體數(shù)值r(1).Value執(zhí)行結(jié)果為:ans=3305當(dāng)OPC服務(wù)器在網(wǎng)絡(luò)上或不在本地上時,從設(shè)備讀取數(shù)據(jù)將花費更多的時間。從設(shè)備被讀取數(shù)據(jù)時,要將數(shù)據(jù)源指定為device。r=read(itm1,device)執(zhí)行同步寫操作1)給一個項賦值0write(itmCollection(1),0)再將數(shù)據(jù)讀取回來r=read(itmCollection(1)執(zhí)行結(jié)果:r=ItemID:Channel_1.Device_1.T
17、ag_1Value:6Quality:Good:Non-specificTimeStamp:201061184933.4060Error:從執(zhí)行結(jié)果可以看到其Value值由3350這樣的大數(shù)值變成了6,這是因為這個項的值是自動線性增長,當(dāng)寫入值0再讀回來的間隙增長到6了,但是仍可判斷出寫操作是成功執(zhí)行了的。2)給多個項賦值write(itmCollection,0,0,0)清除disconnect(da)delete(da)cleardagrpitmCollection3.2從OPC服務(wù)器采集數(shù)據(jù)創(chuàng)建OPC工具箱對象層次結(jié)構(gòu)da=opcda(localhost,KEPware.KEPServe
18、rEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.Device_1.Tag_3;grp=addgroup(da,Group1);itmCollection=additem(grp,itmIDs);配置數(shù)據(jù)采集持續(xù)時間Set(grp,UpdateRate,0.2);Set(grp,RecordsToAcquire,40);配置數(shù)據(jù)采集目標(biāo)數(shù)據(jù)被采集到磁盤和內(nèi)存。磁盤文件名是LoggingExample.olf,如果該文件名已存在,那么該文件原有的數(shù)據(jù)會被OPC工具箱引擎
19、采集上來的數(shù)據(jù)覆蓋。set(grp,LoggingMode,disk&memory);set(grp,LogFileName,LoggingExample.olf);set(grp,LogToDiskMode,overwrite);開始采集數(shù)據(jù)啟動組對象,等待兩秒鐘,并顯示最后獲取的數(shù)據(jù)值。start(grp)pause(2)sPeek=peekdata(grp,1)顯示項的ID和值disp(sPeek.Items.ItemID;sPeek.Items.Value);等待數(shù)據(jù)采集完成后,才繼續(xù)執(zhí)行后面的代碼。wait(grp,inf)獲取數(shù)據(jù)logIDs,logVal,logQual,logT
20、ime,logEvtTime=getdata(grp,double);whoslog*;清除disconnect(da)delete(da)cleardagrpitmCollection4OPC工具箱的事件查看事件創(chuàng)建OPC工具箱對象層次結(jié)構(gòu)da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.Device_1.Tag_3;grp=addgroup(da,Group1);itmCollection=ad
21、ditem(grp,itmIDs);開始數(shù)據(jù)采集將數(shù)據(jù)采集數(shù)設(shè)定為10條,并開始采集grp.RecordsToAcquire=10;start(grp)等待數(shù)據(jù)采集完畢wait(grp)查看事件日志在組對象采集數(shù)據(jù)時產(chǎn)生了兩個事件:開始和停止。客戶端的時間日志屬性值是一行二列的事件型數(shù)組。events=da.EventLog列出記錄在事件日志中的事件類型events.Type使用事件結(jié)構(gòu)中的字段獲取特定事件的信息。下面代碼顯示了停止事件的信息。stopdata=events(2).Data用停止時間減去開始時間,得到采集數(shù)據(jù)用掉的時間。loggingDuration=datenum(event
22、s(2).Data.LocalEventTime)-.datenum(events(1).Data.LocalEventTime);loggingSeconds=loggingDuration*24*60*60清除disconnect(da)delete(da)cleardagrpitmCollection使用默認回傳創(chuàng)建OPC工具箱對象層次結(jié)構(gòu)da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1.Tag_2,.Channel_1.De
23、vice_1.Tag_3;grp=addgroup(da,Group1);itmCollection=additem(grp,itmIDs);配置數(shù)據(jù)采集參數(shù)grp.RecordsToAcquire=20;grp.UpdateRate=0.5;配置回傳用默認數(shù)據(jù)回傳顯示在數(shù)據(jù)采集過程中的開始、數(shù)據(jù)獲取、停止事件。grp.StartFcn=opccallback;grp.StopFcn=opccallback;grp.RecordsAcquiredFcn=opccallback;grp.RecordsAcquiredFcnCount=5;開始數(shù)據(jù)采集start(grp)執(zhí)行結(jié)果:OPCStart
24、eventoccurredatlocaltime15:35:47GroupGroup1:0recordsacquired.等待數(shù)據(jù)采集完畢wait(grp)清除disconnect(da)delete(da)cleardagrpitmCollection4.3使用自定義回傳使用自定義回傳,用display_opcdata函數(shù)將獲取的數(shù)據(jù)實時繪制在圖形窗口中。創(chuàng)建OPC工具箱對象層次結(jié)構(gòu)da=opcda(localhost,KEPware.KEPServerEx.V4);connect(da);itmIDs=Channel_1.Device_1.Tag_1,.Channel_1.Device_1
25、.Tag_2,.Channel_1.Device_1.Tag_3;grp=addgroup(da,Group1);itmCollection=additem(grp,itmIDs);設(shè)置相關(guān)參數(shù)值設(shè)置數(shù)據(jù)更新速率為0.2秒,要獲取的數(shù)據(jù)為200條,每5秒鐘執(zhí)行一次回傳。set(grp,UpdateRate,0.5);set(grp,RecordsToAcquire,200);set(grp,RecordsAcquiredFcnCount,5);set(grp,RecordsAcquiredFcn,display_opcdata);獲取數(shù)據(jù)start(grp)wait(grp)執(zhí)行結(jié)果為動態(tài)繪制
26、變量曲線的圖形窗口,下圖是執(zhí)行結(jié)束時的圖片。圖3自定義數(shù)據(jù)回傳結(jié)束時數(shù)據(jù)圖(4)清除disconnect(da)delete(da)cleardagrpitmCollection5.使用OPC工具箱模塊讀寫數(shù)據(jù)在MATLAB的Simulink工具箱中,已經(jīng)有OPC配置模塊、OPC讀取數(shù)據(jù)模塊、OPC寫入數(shù)據(jù)模塊。OPCWrite模塊將輸入信號寫入到OPC服務(wù)器中,OPCRead模塊將數(shù)據(jù)從OPC服務(wù)器中讀取上來,并在Scope中顯示。另外,數(shù)據(jù)品質(zhì)顯示在Display模塊中,如果數(shù)值為192就說明數(shù)據(jù)品質(zhì)好。只要建立適當(dāng)?shù)哪P途涂梢酝瓿蓪PC服務(wù)器中數(shù)據(jù)的讀寫操作,并可以利用其他仿真工具完成
27、復(fù)雜的控制。本次仿真采用KEPWare.KEPServerEx.V4作為OPC服務(wù)器,模擬從編程邏輯控制器(PLC)讀取和寫入數(shù)據(jù),并通過返回的數(shù)據(jù)繪出圖形。首先設(shè)置“OPC配置模塊參數(shù)”選擇OPC服務(wù)器KEPWare.KEPServerEx.V4。OPCConfigReal-TimeOPCConfiguration圖4OPC服務(wù)器配置(1)數(shù)字量寫與讀使用KEPWare.KEPServerEx.V4中的數(shù)字量Channel_1.Device_1.K0.0作為數(shù)字量變量。首先利用“OPC寫模塊”將數(shù)值在0、1間變換的方波信號寫入OPC服務(wù)器中并賦值給Channel_l.Device_l.K0.
28、0,然后再將該變量的值從OPC服務(wù)器重讀取出來,如圖5所示。Cisplsyl圖5數(shù)字量寫與讀運行圖5所示模型后會得到圖6所示結(jié)果。圖6顯示,OPC服務(wù)器中的變量值隨著方波信號改變了,并且寫進去1后,變量值變?yōu)?1。其中,0值表示False,-1表示True。(2)短整型數(shù)據(jù)寫與讀首先在OPC服務(wù)器中建立一個Short型變量Channel_l.Device_l.TagK2。然后將一個整型常量20寫入給該項,再將該項的值讀取出來。圖7短整型數(shù)據(jù)寫與讀圖8短整型數(shù)據(jù)讀取結(jié)果運行后,可以從圖8中看到該整型變量的值已經(jīng)變成了20。浮點型數(shù)據(jù)寫與讀首先在OPC服務(wù)器中建立一個浮點型變量Channel_l.
29、Device_l.TagK4Float。然后將一個正弦信號寫入到該項,再將該項的值讀取上來,并將原正弦信號與采集上來的數(shù)據(jù)同時輸出給Scope3。Ch3nne.K4Fl2-3tQTScDpeB152|OPCRead2Display圖9浮點型數(shù)據(jù)寫與讀圖10浮點型數(shù)據(jù)讀取結(jié)果運行后,黃色光滑連續(xù)曲線是原正弦信號,紫色不光滑曲線是讀取上來的數(shù)值。從圖中可以看到,紫色曲線滯后黃色曲線一個固定的相位差,說明讀取上來的是先前寫下去的某個值。參考文獻胡劍行,陳沖,基于OPC技術(shù)的MATLAB實時過程控制系統(tǒng)J.福州大學(xué)學(xué)報,2008-9,36:36張昆,段其昌,張從力MATLAB與PLC之間的通訊技術(shù)J.自動化技術(shù)與應(yīng)用,2005,24(12):54-55郭發(fā)軍,鄒麗,王艷娟基于OPCActiveX組件MATLAB作為客戶端應(yīng)用研究J.科技資訊,2006:52劉志鴻,楊傳穎利用OPC+Toolbox在Matlab中實現(xiàn)實時數(shù)據(jù)的獲取J.附錄%在本地計算機上查詢所欲可用的OPC服務(wù)器hostInfo=opcserverinfo(localhost);%將OPC服務(wù)器ID
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題5.3 平面向量的數(shù)量積(原卷版)-2024年高考數(shù)學(xué)一輪復(fù)習(xí)精講精練寶典(新高考專用)
- 幼兒游戲教學(xué)案例
- 人教版(2024)七年級英語下冊Unit 6 學(xué)情調(diào)研測試卷(含答案)
- 路基拼寬施工方案
- 隧道風(fēng)機房施工方案
- 2025年新高考地理全真模擬試卷4(含答案解析)
- 2025年高考地理二輪復(fù)習(xí):綜合題答題技巧(含練習(xí)題及答案)
- 幕墻防火防雷施工方案
- Unit 6 reading2 教學(xué)設(shè)計 2024-2025學(xué)年譯林版(2024)七年級英語上冊
- 小學(xué)課本劇一年級《小白兔和小灰兔》-劇本
- 高中通用技術(shù)人教高二下冊目錄新型抽紙盒-
- 畜牧場經(jīng)營管理
- 課程思政示范課程申報書(測繪基礎(chǔ))
- ALeader 阿立得 ALD515使用手冊
- 神華陜西國華錦界電廠三期工程環(huán)評報告
- 飛行員航空知識手冊
- GB/Z 19848-2005液壓元件從制造到安裝達到和控制清潔度的指南
- GB/T 34936-2017光伏發(fā)電站匯流箱技術(shù)要求
- GB/T 12618.4-2006開口型平圓頭抽芯鉚釘51級
- 紅金大氣商務(wù)風(fēng)領(lǐng)導(dǎo)歡迎會PPT通用模板
- 學(xué)前教育學(xué)00383-歷年真題-試卷
評論
0/150
提交評論