




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、工控程序設(shè)計,學(xué)習(xí)情景2 串口設(shè)備的數(shù)據(jù)采集,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,2.3.1 學(xué)習(xí)要點 1.知識點:線程的概念,委托的概念和使用方法,線程的創(chuàng)建和啟動,工作者線程和用戶界面線程之間的數(shù)據(jù)傳遞,線程同步技 2.技能點:工作者線程的創(chuàng)建,串口數(shù)據(jù)接收和處理操作的封裝 2.3.2 任務(wù)描述 1.在前一個情景中完成了接收和處理單一串口設(shè)備數(shù)據(jù)的工作任務(wù)。實際應(yīng)用中,上位機需要連續(xù)地接收和處理下位機發(fā)送的數(shù)據(jù),而且在等待和接收數(shù)據(jù)的時候,用戶界面不能停止響應(yīng)。接收數(shù)據(jù)和響應(yīng)用戶輸入這兩個工作在宏觀上是同時進行的,為了滿足該需求,必須采用多線程模式來進行程序設(shè)計。 2.該教學(xué)情景通
2、過“在工作者線程中接收HSDZC電能綜合測試儀的”“HSDZC電能綜合測試儀數(shù)據(jù)接收和處理操作的封裝”這兩個實施步驟達到連續(xù)接收接收單個串口設(shè)備(下位機)數(shù)據(jù)的目的。,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,2.3.3 相關(guān)知識 1 多線程技術(shù)概述 (1)線程的概念 Windows是一個搶占式多任務(wù)操作系統(tǒng),在系統(tǒng)內(nèi)核中提供了對多線程的支持,多線程技術(shù)可以讓應(yīng)用程序在一個耗時的操作中能夠及時對用戶操作進行響應(yīng),并且從宏觀上達到多個任務(wù)“齊頭并進”的目的 進程是應(yīng)用程序的一個運行例程,是應(yīng)用程序的一次動態(tài)執(zhí)行過程。線程是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,但它可與同屬一個
3、進程的其它線程共享進程所擁有的全部資源。每個進程至少需要一個執(zhí)行線程,由系統(tǒng)自動創(chuàng)建,程序設(shè)計者可以根據(jù)需要創(chuàng)建其它線程。由于多個線程共享進程中的全局變量和系統(tǒng)資源,所以線程間的切換比較容易,通信也比較方便。,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,(2).NET Framework對多線程的支持 .NET平臺庫提供了Thread類對線程進行處理,該類包含在System.Threading命名空間中,程序中需要包含語句“using System.Threading;”。編程人員可以通過創(chuàng)建一個Thread類的實例來創(chuàng)建一個線程,并通過Thread類提供的方法對線程進行管理。Thread類的
4、常用屬性和方法如下表: 表2.3.1 Thread類的常用屬性和方法,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,2 委托的概念和使用方法 C#中的委托的作用相當(dāng)于C/C+中的函數(shù)指針,函數(shù)指針是一個函數(shù)的入口地址。必修使用函數(shù)指針的場合是:程序員A編寫了函數(shù)f,該函數(shù)中需要執(zhí)行另外一個參數(shù)和返回值已經(jīng)確定,但名字暫時不能確定函數(shù),所以給函數(shù)設(shè)置一個函數(shù)指針類型的形式參數(shù);當(dāng)程序員B使用函數(shù)f時,定義函數(shù)g,并把g的入口地址作為實際參數(shù)傳遞給函數(shù)f,這樣就可以在f中執(zhí)行函數(shù)g了。 線程的啟動是使用函數(shù)指針的一個典型例子,在啟動線程之前,先要給操作系統(tǒng)指明線程啟動后執(zhí)行哪一函數(shù)中包含的代碼,這時
5、就要把函數(shù)的指針傳遞給創(chuàng)建線程的函數(shù)。 回調(diào)(完成后通知)是使用函數(shù)指針的另外一個典型例子。如程序員A編寫了負責(zé)接收網(wǎng)絡(luò)數(shù)據(jù)的函數(shù)f1,程序員B編寫了負責(zé)處理數(shù)據(jù)的函數(shù)f2,那么就可以把f2的函數(shù)指針作為參數(shù)傳遞給函數(shù)f1,當(dāng)f1接收數(shù)據(jù)完畢后,自動調(diào)用f2。所以回調(diào)的特點是:站在程序員B的角度看,函數(shù)由自己編寫,但是不由自己調(diào)用,且不知道什么時候被調(diào)用(因為網(wǎng)絡(luò)速度有快有慢),函數(shù)編寫者要做的就是把函數(shù)指針傳遞出去。,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,定義委托的關(guān)鍵字是delegate,它是從System.Delegate類派生出來的。例如: delegate int SomeDe
6、legate(int p1,string p2); / int p1和string p2是被引用函數(shù)的參數(shù)類型和名稱。其中參數(shù)類型和參數(shù)的個數(shù)必須和被引用函數(shù)的類型與個數(shù)一致。 3 創(chuàng)建和啟動線程 一個線程必須和一個方法的入口(委托)關(guān)聯(lián)起來,線程啟動后,自動從該入口進入,執(zhí)行函數(shù)體中包含的內(nèi)容。 C#應(yīng)用程序啟動時,自動創(chuàng)建主線程,并進入Main方法開始執(zhí)行,其它線程需要在程序里自己定義和啟動。由于委托可以代表一個方法的入口 ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,所以創(chuàng)建線程實例時只需要在Thread類的構(gòu)造方法里傳入一個委托實例即可,這個委托名叫ThreadStart,已經(jīng)在線程命
7、名空間中定義作了定義: public delegate void ThreadStart(); 所以創(chuàng)建線程方式如下: ThreadStart functionEntrance = new ThreadStart(threadFunction); Thread t = new Thread(functionEntrance); 在委托ThreadStart的構(gòu)造方法里面?zhèn)魅氲氖欠椒?,這個方法可以是靜態(tài)方法,也可以是某個對象的方法。線程對象創(chuàng)建后,我們就可以調(diào)用其Start方法開始線程的執(zhí)行了。,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,我們可以在主線程里建立線程,也可以在線程里再創(chuàng)建線程,
8、線程啟動后會自動執(zhí)行委托實例代表的方法,線程執(zhí)行完后會自動銷毀并釋放其占用的資源。 在一個新線程中執(zhí)行帶參數(shù)的函數(shù),操作步驟如下: 定義線程函數(shù): private void paramThreadFunction(object param) /函數(shù)體 用ParameterizedThreadStart委托封裝線程函數(shù):,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,ParameterizedThreadStart functionEntrance = new ParameterizedThreadStart(paramThreadFunction); 創(chuàng)建線程對象 hread t = new T
9、hread(functionEntrance); 啟動線程 t.Start(param); /param為傳入的參數(shù),可以是任意對象,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,4 線程同步技術(shù) 多線程應(yīng)用程序中的的線程啟動后,執(zhí)行的先后順序是無法預(yù)知的,通常情況下多個線程會交錯執(zhí)行。但是在多個線程訪問共享數(shù)據(jù)的情況下,必須對數(shù)據(jù)的訪問進行同步。好比有兩路車,一路自東向西,一路自南向北運行,在一個十字路口交匯。在十字路口以外的區(qū)域可以看著私有區(qū)域,而十字路口則是共有區(qū)域,需要紅綠燈或交警來維護秩序,即確保在同一時刻只能有一路車進入,而另外一路車必須等待,這就是現(xiàn)實生活中的線程同步問題。,學(xué)習(xí)情
10、景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,下面的例子展示了一個讀數(shù)據(jù)線程和一個寫數(shù)據(jù)線程同時運行的情況: private static int a = new int5; static void Main(string args) Thread t1 = new Thread(new ThreadStart(threadFun1); Thread t2 = new Thread(new ThreadStart(threadFun2); t1.Start(); t2.Start(); private static void threadFun1() /線程函數(shù)1 while (true),學(xué)習(xí)情景2
11、.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收, for (int i = 0; i a.Length; i+) /將數(shù)組元素全部輸出 System.Console.Write(ai + ); System.Console.WriteLine(); private static void threadFun2() /線程函數(shù)2 int flag = 0,i; while (true) for (i = 0; i a.Length; i+) /將數(shù)組元素全部改為0或1 ai = flag; flag = flag = 0 ? 1 : 0; ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,下面采用Monitor類
12、來進行線程同步,使數(shù)據(jù)讀、寫操作稱為原子操作。即達到這樣的目的:在線程2寫數(shù)據(jù)時,線程1等待,在線程1讀數(shù)據(jù)時,線程2等待,使每次輸出的結(jié)果全部為0或全部為1。 當(dāng)調(diào)用Monitor類的Enter(Object obj)方法時,會獲取對象obj的獨占權(quán),直到調(diào)用Exit(Object obj)方法時,才會釋放對obj的獨占權(quán)。注意調(diào)用Enter方法的次數(shù)要和,調(diào)用Exit方法的次數(shù)相等。Monitor類還提供了TryEnter方法,該方法嘗試獲取obj對象的獨占權(quán),當(dāng)獲取獨占權(quán)失敗時,將返回false。實現(xiàn)代碼如下:,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,private static i
13、nt a = new int5; private static object obj = new object(); static void Main(string args) Thread t1 = new Thread(new ThreadStart(threadFun1); Thread t2 = new Thread(new ThreadStart(threadFun2); t1.Start(); t2.Start(); private static void threadFun1() while (true) Monitor.Enter(obj); /線程1進入臨界區(qū)活動時,線程2等
14、待 for (int i = 0; i a.Length; i+) System.Console.Write(ai + ); System.Console.WriteLine();,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,Monitor.Exit(obj); /線程1出臨界區(qū)后,線程2才可以進入 private static void threadFun2() int flag = 0,i; while (true) Monitor.Enter(obj); /線程2進入臨界區(qū)活動時,線程1等待 for (i = 0; i a.Length; i+) ai = flag; flag = fl
15、ag = 0 ? 1 : 0; Monitor.Exit(obj); /線程2出臨界區(qū)后,線程1才可以進入 ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,5 工作者線程向用戶界面線程傳遞數(shù)據(jù) 用戶界面線程簡稱UI線程,其主要特點是能響應(yīng)Windows消息,主要負責(zé)接收用戶輸入和向用戶展示程序執(zhí)行結(jié)果。為了及時響應(yīng)用戶的輸入,UI線程中不應(yīng)執(zhí)行費時的運算,更不能被阻塞。 工作者線程一般用于在后臺進行費時運算或和慢速設(shè)備打交道,這種線程不響應(yīng)Windows消息。在通信程序中,數(shù)據(jù)的發(fā)送和接收耗費的時間不確定。為了在通信過程中能夠響應(yīng)用戶輸入,通常在建立一個或多個工作者線程,在后臺完成通信任務(wù)。 工
16、作者線程向運行在UI線程中的用戶控件傳遞數(shù)據(jù)時,不能直接對對控件的屬性和方法進行調(diào)用,而要先定義一個委托,再用控件的Invoke方法,切換到UI線程去執(zhí)行委托所指向的函數(shù),來更新控件顯示的內(nèi)容。 在下面的程序中,工作線程每循環(huán)完一次,就更新UI線程中的控件屬性,向用戶報告當(dāng)前步驟。程序界面和后臺代碼如下:,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,圖2.3.1 工作者線程向UI線程傳遞數(shù)據(jù) private void btnRun_Click(object sender, EventArgs e) ThreadStart funEntrance = new ThreadStart(thread
17、Fun); Thread t = new Thread(funEntrance); t.IsBackground = true; t.Start(); ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,private delegate void crossThreadDelegate(int i); /定義委托 void showValue(int i) lblReport.Text = 執(zhí)行到了第 + i + 步; private void threadFun() crossThreadDelegate cdt = new crossThreadDelegate(showValue); for
18、(int i = 1; i = 5; i+) /Invoke方法將當(dāng)前線程切換到UI線程,再執(zhí)行委托指向的函數(shù) this.Invoke(cdt, i); /this指代當(dāng)前窗口 Thread.Sleep(1000); /延時,便于看清中間執(zhí)行過程 ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,下面的程序在工作者線程的線程函數(shù)中直接使用lblReport.Text屬性,而沒有用Invoke方法: private void threadFun() for (int i = 1; i = 5; i+) lblReport.Text = 執(zhí)行到了第 + i + 步; Thread.Sleep(1000
19、); 在運行時會捕獲到圖2.4.2所示的異常:,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,圖2.3.2 后臺線程向UI線程傳遞數(shù)據(jù),學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,使用委托和Invoke方法會使代碼復(fù)雜度增加,在實際應(yīng)用中,可以用匿名委托來簡化代碼: private delegate void crossThreadDelegate(); private void threadFun() for (int i = 1; i = 5; i+) crossThreadDelegate cdt = delegate /匿名委托(無函數(shù)名showValue) lblReport.Text
20、 = 執(zhí)行到了第 + i + 步; ; this.Invoke(cdt); /指向委托指向的函數(shù) Thread.Sleep(1000); ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,2.3.4 任務(wù)實施 1 在工作者線程中接收HSDZC電能綜合測試儀的數(shù)據(jù) (1)設(shè)計界面 在轉(zhuǎn)機性能測試中需要讀取HSDZC電能綜合測試儀采集到的3個數(shù)值:輸入功率、輸出功率和功率因數(shù),以測試電機效率,此時測試儀的是選擇測量方式1。程序設(shè)計時的界面如圖2.3.3,用3個文本框分別顯示輸入功率、輸出功率和功率因數(shù),控件名稱分別為txtSrgl、txtScgl和txtGlys。 該界面是整個鉆機性能測試系統(tǒng)主界面的
21、一部份,為了便于觀察和調(diào)試,在界面的右邊以十六進制形式顯示收到的數(shù)據(jù)幀,程序運行時的界面如圖2.3.4所示。,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,圖2.3.3 電機效率測試程序設(shè)計時界面,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,圖2.3.4 電機效率測試程序運行時界面,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,private void btnStart_Click(object sender, EventArgs e) /啟動工作者線程 ThreadStart funEntrance = new ThreadStart(threadFun); Thread t = new Thr
22、ead(funEntrance); t.IsBackground = true; stop = false; t.Start(); (3)編寫在工作者線程中執(zhí)行的函數(shù) 點擊“開始讀數(shù)”按鈕后時,啟動一個工作者線程,線程執(zhí)行函數(shù)threadFun中的內(nèi)容。threadFun在執(zhí)行時先打開串口,設(shè)置超時毫秒數(shù),并創(chuàng)建數(shù)據(jù)接收隊列recvBuf,然后就進入while循環(huán)開始不斷地接收串口數(shù)據(jù)并進行分析和顯示。while循環(huán)受到bool型變量stop的控制,可以通過設(shè)置該變量值為true,來結(jié)束線程中的循環(huán)。其中用到recvBuf對象和getBlock方法,它們的用法在前一節(jié)已經(jīng)進行了詳細說明。,學(xué)習(xí)
23、情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,private void threadFun() SerialPort sp = new SerialPort(COM1, 9600, Parity.None, 8, StopBits.One); try sp.Open(); catch (Exception ex) MessageBox.Show(打開串口失敗!); return; byte first; byte bRecv; /HSDZC在工作方式1時,數(shù)據(jù)幀長度為46字節(jié),學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,private void threadFun() SerialPort sp =
24、 new SerialPort(COM1, 9600, Parity.None, 8, StopBits.One); try sp.Open(); catch (Exception ex) MessageBox.Show(打開串口失??!); return; byte first; byte bRecv; /HSDZC在工作方式1時,數(shù)據(jù)幀長度為46字節(jié),學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,(4)編寫顯示數(shù)據(jù)到控件的showData方法 在線程函數(shù)中調(diào)用了showData方法顯示數(shù)據(jù),代碼如下: private delegate void crossThreadDelegate(); p
25、rivate void showData(byte b) float v; /跨線程訪問UI控件 crossThreadDelegate cdt = delegate /匿名委托 if (b = null) /沒有接收到數(shù)據(jù) txtSrgl.Text = Error; txtScgl.Text = Error; txtGlys.Text = Error; else ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,/以十六進制形式在txtData文本框中顯示數(shù)據(jù)幀的內(nèi)容 txtData.Text = CCheck.BinaryToHexString(b); /對浮點數(shù)進行解碼(用HexToFloa
26、t函數(shù)),并分別顯示在3個文本框中 v = HexToFloat(b4 + 9 * 3, b4 + 9 * 3 + 1, b4 + 9 * 3 + 2); txtSrgl.Text = v.ToString(0.00); /輸入功率(第9個數(shù)值) v = HexToFloat(b4 + 12 * 3, b4 + 12 * 3 + 1, b4 + 12 * 3 + 2); txtScgl.Text = v.ToString(0.00); /輸出功率(第12個數(shù)值) v = HexToFloat(b4 + 6 * 3, b4 + 6 * 3 + 1, b4 + 6 * 3 + 2); txtGly
27、s.Text = v.ToString(0.00); /功率因數(shù)(第6個數(shù)值) ; this.Invoke(cdt); ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,(5)編寫代碼處理“停止讀數(shù)”按鈕的點擊事件: private void btnStop_Click(object sender, EventArgs e) stop = true; /設(shè)置標志,使線程中的循環(huán)自然結(jié)束 2 HSDZC電能綜合測試儀數(shù)據(jù)接收和處理操作的封裝 在前一個步驟中已經(jīng)實現(xiàn)了串口數(shù)據(jù)接收、解析和顯示的功能,并且在工作者線程中接收和處理數(shù)據(jù),在此期間前臺的UI線程能響應(yīng)用戶輸入。從功能上看,已經(jīng)能夠滿足用戶需求
28、,但是從代碼的組織和管理角度看,該程序還有比較大問題:負責(zé)接收和處理數(shù)據(jù)的代碼和負責(zé)顯示的代碼混雜在一起,不能重復(fù)使用,若增加一個同類設(shè)備,很多代碼還要重寫,而且給查看和調(diào)試程序也帶來較大困難。下面用面向?qū)ο蠓椒▽Τ绦蜻M行重新設(shè)計。,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,(1)創(chuàng)建抽象類CPassiveCOMHelper,public class CPassiveCOMHelper public int readTimeOut,recvBufLength; /讀取超時毫秒數(shù),接收隊列大小 protected CRecvBuf recvBuf; /接收隊列 private bool sto
29、pFlag; /線程循環(huán)結(jié)束標志 private string portName; /串口名稱 private int baudRate, dataBits; /波特率,數(shù)據(jù)位數(shù) private StopBits stopBits; /停止位 private byte dataBlock; /一個完整的數(shù)據(jù)幀,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,public delegate void DataReceivedHandler(); public event DataReceivedHandler DataReceived; /數(shù)據(jù)接收完畢事件 /構(gòu)造方法 public CPassive
30、COMHelper(string portName, int baudRate, int dataBits, StopBits stopBits) this.portName = portName; this.baudRate = baudRate; this.dataBits = dataBits; this.stopBits = stopBits; this.readTimeOut = 500;/默認500毫秒讀取超時 this.recvBufLength = 100;/默認接收隊列大小為100字節(jié) ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,public void start() /啟
31、動線程 Thread t = new Thread(new ThreadStart(threadFun); t.IsBackground = true; stopFlag = false; t.Start(); public void stop() /停止線程循環(huán),自然終止線程 stopFlag = true; protected virtual byte getBlock(List li) /需要在派生類中重寫該方法,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,public byte getData() byte tmp = null; Monitor.Enter(this); /線程同步:
32、在進行g(shù)et操作時,不準進行set操作 if (dataBlock != null) tmp = new bytedataBlock.Length; dataBlock.CopyTo(tmp, 0); Monitor.Exit(this); return tmp; private void setData(byte tmp),Monitor.Enter(this); /線程同步:在進行set操作時,不準進行g(shù)et操作 dataBlock = tmp; Monitor.Exit(this); private void threadFun() recvBuf = new CRecvBuf(recv
33、BufLength); SerialPort sp = new SerialPort(portName, baudRate, Parity.None, dataBits, stopBits); try if (sp.IsOpen) sp.Close(); sp.Open(); ,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,catch return; byte first; byte bRecv; while (!stopFlag) try sp.ReadTimeout = readTimeOut; first = (byte)sp.ReadByte(); if (sp.BytesToRead + 1 recvBuf.maxLength) /堆積數(shù)據(jù)太多,學(xué)習(xí)情景2.3 單個串口設(shè)備數(shù)據(jù)的連續(xù)接收,(2)派生出具體類CHSDZC 在CPassiveCOMHelper類中實現(xiàn)了串口打開、關(guān)閉、線程創(chuàng)建、數(shù)據(jù)接收等基礎(chǔ)操作,其中有一個
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45222-2025食品安全事故應(yīng)急演練要求
- 上下鋪銷售合同范本
- 臨汾購房合同范本
- 2025年寧夏貨運從業(yè)資格證模擬考
- 勞務(wù)派人員合同范本
- 代理經(jīng)紀服務(wù)合同范本
- 農(nóng)村水電改造施工合同范本
- 修房勞動安全合同范本
- 醬菜批發(fā)合同范本
- 包租協(xié)議合同范例
- 磷酸鐵鋰電池工商業(yè)儲能項目施工組織設(shè)計方案
- 場地租賃安全管理協(xié)議書
- 震旦ad188維修手冊
- 數(shù)學(xué)物理方程(很好的學(xué)習(xí)教材)PPT課件
- 五金英語詞匯盤點
- 內(nèi)容講義說明案例nxt pop trainning
- GB-T-15894-2008-化學(xué)試劑-石油醚
- 工業(yè)自動化設(shè)備項目用地申請報告(模板)
- 作息時間調(diào)整告家長書
- 2021年羽毛球比賽規(guī)則及裁判手勢
- 標準色卡(建筑類)下載
評論
0/150
提交評論