版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 測控網(wǎng)絡(luò)課程設(shè)計(jì)</b></p><p><b> 一、實(shí)踐要求</b></p><p> 本次實(shí)踐以開發(fā)DCS測控系統(tǒng)為最終目的,要求掌握DCS測控系統(tǒng)的工作原理,學(xué)習(xí)組態(tài)王工控組態(tài)軟件的使用方法,根據(jù)要求完成工程組態(tài);掌握MODBUS通信協(xié)議的原理,開發(fā)具有MODBUS通訊功能的智能儀表,最終完成和組態(tài)工程之
2、間的通訊。</p><p><b> 二、實(shí)踐內(nèi)容</b></p><p> 分為兩大部分:1、組態(tài)王基本操作 2、 MODBUS通訊</p><p><b> 具體內(nèi)容:</b></p><p> 熟悉組態(tài)王軟件安裝,基本開發(fā)環(huán)境,采用構(gòu)建簡單的工程(采用仿真數(shù)據(jù)和設(shè)備,工程應(yīng)包含PID功
3、能),計(jì)劃時(shí)間1天;</p><p> 根據(jù)罐區(qū)工藝的要求,完成相應(yīng)的組態(tài)工程,實(shí)現(xiàn)對(duì)原油儲(chǔ)罐的監(jiān)控,計(jì)劃時(shí)間2天;</p><p> 掌握MODBUS通訊協(xié)議的工作原理,在MSP430F5438單片機(jī)上編程實(shí)現(xiàn)MODBUS客戶端服務(wù)程序,要求通過串行口將現(xiàn)場的溫度、泵狀態(tài)、流量等參數(shù)上傳到上位機(jī)上,計(jì)劃時(shí)間3天。</p><p> 在單片機(jī)上編程實(shí)現(xiàn)流量、溫
4、度上下限及儀表地址和波特率等參數(shù)設(shè)置功能,同時(shí)能從上位機(jī)對(duì)儀表參數(shù)進(jìn)行設(shè)置,計(jì)劃時(shí)間2天。</p><p> 優(yōu)化設(shè)計(jì),要求當(dāng)出現(xiàn)通訊錯(cuò)誤時(shí)在上位機(jī)和單片機(jī)上都要做出相應(yīng)的反應(yīng),計(jì)劃時(shí)間0.5天。</p><p> ① 上位機(jī)采用高級(jí)語言編程,實(shí)現(xiàn)對(duì)現(xiàn)場智能儀表的控制。</p><p> ?、?熟悉現(xiàn)場總線測控網(wǎng)絡(luò)系統(tǒng),搭建PROFIBUS網(wǎng)絡(luò),實(shí)現(xiàn)對(duì)ET200
5、S和S7-200的控制。</p><p><b> 組態(tài)王部分</b></p><p><b> 一、設(shè)計(jì)要求</b></p><p> 根據(jù)罐區(qū)工藝的要求,完成相應(yīng)的組態(tài)工程,實(shí)現(xiàn)對(duì)原油儲(chǔ)罐的監(jiān)控。</p><p><b> 1、罐區(qū)工藝流程圖</b></p&g
6、t;<p> 2- 儲(chǔ)油罐進(jìn)口電動(dòng)閥;3- 儲(chǔ)油罐排污電動(dòng)閥;4- 儲(chǔ)油罐出口電動(dòng)閥;5- 泵</p><p> 圖1:罐區(qū)工藝流程圖</p><p><b> 2、具體要求</b></p><p> ?。?)監(jiān)測各罐的液位(0-20m)/ (0-1m)/溫度(0-100度)(現(xiàn)場儀表4-20mA輸出)。</p>
7、<p> (2)根據(jù)各罐液位控制各罐出口電動(dòng)閥(H>16m, 關(guān)進(jìn)口閥,選擇最低液位的罐進(jìn)油;H<2m,關(guān)出口閥,選擇最高液位的罐出油),手動(dòng)遙控排污閥。</p><p> 液位H>15.5m高報(bào)警, H>17m高高報(bào)警; </p><p> 液位H<2m低報(bào)警, H<1.5m低低報(bào)警。 </p><p>
8、界位>1m高報(bào)警, 界位>1.5m高高報(bào)警; </p><p> 界位<0.5m低報(bào)警, H<0.2m低低報(bào)警;</p><p> ?。?)啟動(dòng)泵組設(shè)置出入口流量(100M3/h,200M3/h,250M3/h)</p><p><b> 二、設(shè)計(jì)內(nèi)容</b></p><p> (一)組態(tài)數(shù)
9、據(jù)庫: 數(shù)據(jù)庫-----數(shù)據(jù)詞典</p><p><b> ?。ǘ┙M態(tài)畫面</b></p><p> 畫面1:工藝流程總畫面</p><p><b> 對(duì)畫面的基本說明:</b></p><p> 主要功能:對(duì)油罐液位的監(jiān)測。</p><p> 泵總開關(guān)控制進(jìn)口的3
10、個(gè)泵的總開和總關(guān);</p><p> 泵總關(guān)閉控制出口的3個(gè)泵的總關(guān)和總開;</p><p> 當(dāng)同時(shí)按下泵提示和某一個(gè)泵的按鈕,顯示該泵的詳細(xì)信息; </p><p> 液位報(bào)警和界位報(bào)警時(shí)記錄相應(yīng)的報(bào)警事件;</p><p> 液位實(shí)時(shí)和歷史曲線記錄油罐液位的變化情況。</p><p> 畫面2:各泵彈出
11、式放大畫面(包括參狀態(tài)/型號(hào)等),點(diǎn)擊總畫面上的泵彈出此畫面</p><p> 1、編寫事件命令語言:當(dāng)同時(shí)按下泵提示和某一個(gè)泵的按鈕,顯示該泵的參數(shù)信息。</p><p><b> 2、彈出畫面</b></p><p> 畫面3:液位/界位報(bào)警畫面</p><p><b> 報(bào)警設(shè)置:</b&g
12、t;</p><p> 低低、低、高、高高報(bào)警值設(shè)置:</p><p><b> 液位報(bào)警畫面:</b></p><p> 畫面4:液位/溫度/界位各一個(gè)實(shí)時(shí)趨勢圖和歷史趨勢圖</p><p> 實(shí)時(shí)趨勢圖: 選擇工具箱中的 工具,在畫面上繪制一實(shí)時(shí)趨勢曲線窗口。在曲線定義選項(xiàng)卡中選擇要實(shí)時(shí)反映的變量。</
13、p><p> 歷史趨勢圖: 對(duì)于要以歷史趨勢曲線形式顯示的變量,必須設(shè)置變量的記錄屬性。在“定義變量”對(duì)話框中單擊“記錄和安全區(qū)”屬性頁,將不記錄改為數(shù)據(jù)變化記錄,變化靈敏為:0。在工程瀏覽器窗口左側(cè)的“工程目錄顯示區(qū)”中雙擊“系統(tǒng)配置”中的“歷史數(shù)據(jù)記錄”選項(xiàng),彈出“歷史記錄配置”對(duì)話框。</p><p><b> 實(shí)時(shí)和歷史趨勢圖:</b></p>
14、<p> 畫面4:報(bào)表畫面(液位,溫度,界位)</p><p> 報(bào)表分為實(shí)時(shí)數(shù)據(jù)報(bào)表和歷史數(shù)據(jù)報(bào)表。</p><p><b> (3)優(yōu)化設(shè)置</b></p><p><b> 1、組態(tài)操作權(quán)限</b></p><p> 優(yōu)先級(jí)分 1~999 級(jí),1 級(jí)最低999 級(jí)最高。每個(gè)
15、操作者的優(yōu)先級(jí)別只有一個(gè)。系統(tǒng)安全區(qū)共有64 個(gè),用戶在進(jìn)行配置時(shí)。每個(gè)用戶可選擇除“無”以外的多個(gè)安全區(qū),即一個(gè)用戶可有多個(gè)安全區(qū)權(quán)限。</p><p> 設(shè)置油罐用戶組,將管理員、操作員看成用戶,并設(shè)置管理員優(yōu)先級(jí)最高,并設(shè)置相應(yīng)的密碼。 配置 運(yùn)行現(xiàn)象 登陸界面</p><p> 2、通過鏈接切換畫面</p&
16、gt;<p> 增加報(bào)警畫面、趨勢圖、報(bào)表畫面,通過右側(cè)鏈接</p><p><b> (4)畫面命令語言</b></p><p> 變量說明:g1、g2、g3、g4代表每個(gè)油罐的液位,in代表泵總開,out代表泵總關(guān),in1、in2、in3、in4代表每個(gè)油罐的入口閥門,out1、out2、out3、out4代表每個(gè)油罐的出口閥門,clear1、
17、clear2、clear3、clear4代表手動(dòng)排污閥。bengin1,2,3和bengout1,2,3代表進(jìn)口泵和出口泵。</p><p> num代表泵輸入總流量的比</p><p> num=bengin1*1 + bengin2*2 + bengin3*2.5;</p><p> num1代表泵輸出總流量的比</p><p>
18、 num1=bengout1*1 + bengout2*2 + bengout3*2.5;</p><p> 設(shè)置每個(gè)油罐跟液位相關(guān)的系數(shù)值</p><p> xishu1=0.25;</p><p> xishu2=0.2;</p><p> xishu3=0.15;</p><p> xishu4=0.3
19、;</p><p> if(in==1 && num>0)</p><p><b> {</b></p><p> 如果油罐1液位最低,增加油罐1的液位</p><p> if(g1<=g2 && g1<=g3 && g1<=g4 &
20、& g1<16)</p><p><b> {</b></p><p><b> in1=1;</b></p><p><b> in2=0;</b></p><p><b> in3=0;</b></p><p&
21、gt;<b> in4=0;</b></p><p> g1=g1+num*xishu1;</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p
22、> 如果油罐2液位最低,增加油罐2的液位</p><p> if(g2<g1 && g2<=g3 && g2<=g4 && g2<16)</p><p><b> {</b></p><p><b> in1=0;</b></p&g
23、t;<p><b> in2=1;</b></p><p><b> in3=0;</b></p><p><b> in4=0;</b></p><p> g2=g2+xishu2*num;</p><p><b> }</b>&
24、lt;/p><p><b> else</b></p><p><b> {</b></p><p> 如果油罐3液位最低,增加油罐3的液位</p><p> if(g3<g1 && g3<g2 && g3<=g4 && g3&l
25、t;16)</p><p><b> {</b></p><p><b> in1=0;</b></p><p><b> in2=0;</b></p><p><b> in3=1;</b></p><p><b&g
26、t; in4=0;</b></p><p> g3=g3+xishu3*num;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> 如果油罐4
27、液位最低,增加油罐4的液位</p><p> if(g4<g1 && g4<g2 && g4<g3 && g4<16)</p><p><b> {</b></p><p><b> in1=0;</b></p><p>
28、<b> in2=0;</b></p><p><b> in3=0;</b></p><p><b> in4=1;</b></p><p> g4=g4+xishu4*num;</p><p><b> }</b></p>&l
29、t;p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(out==1 && num1>0)</p&g
30、t;<p><b> {</b></p><p> 如果油罐1液位最高,降低油罐1的液位</p><p> if(g1>=g2 && g1>=g3 && g1>=g4 && g1>2)</p><p><b> {</b><
31、/p><p><b> out1=1;</b></p><p><b> out2=0;</b></p><p><b> out3=0;</b></p><p><b> out4=0;</b></p><p> g1=g1
32、-xishu1*num1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> 如果油罐2液位最高,降低油罐2的液位</p><p> if(g2>=g
33、1 && g2>=g3 && g2>=g4 && g2>2)</p><p><b> {</b></p><p><b> out1=0;</b></p><p><b> out2=1;</b></p><
34、p><b> out3=0;</b></p><p><b> out4=0;</b></p><p> g2=g2-xishu2*num1;</p><p><b> }</b></p><p><b> else</b></p&g
35、t;<p><b> {</b></p><p> 如果油罐3液位最高,降低油罐3的液位</p><p> if(g3>=g1 && g3>=g2 && g3>=g4 && g3>2)</p><p><b> {</b><
36、/p><p><b> out1=0;</b></p><p><b> out2=0;</b></p><p><b> out3=1;</b></p><p><b> out4=0;</b></p><p> g3=g3
37、-xishu3*num1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> 如果油罐4液位最高,降低油罐4的液位</p><p> if(g4>=g
38、1 && g4>=g2 && g4>=g3 && g4>2)</p><p><b> {</b></p><p><b> out1=0;</b></p><p><b> out2=0;</b></p><
39、p><b> out3=0;</b></p><p><b> out4=1;</b></p><p> g4=g4-xishu4*num1;</p><p><b> }</b></p><p><b> }</b></p>
40、<p><b> }}}</b></p><p> if(clear1==1 || clear2==1 || clear3==1 || clear4==1)</p><p><b> 手動(dòng)排污</b></p><p><b> {</b></p><p>
41、 g1=g1-clear1*0.1;</p><p> g2=g2-clear2*0.1;</p><p> g3=g3-clear3*0.1;</p><p> g4=g4-clear4*0.1;</p><p> //jiewei1=jiewei1-0.1*clear1;</p><p> //jiewe
42、i2=jiewei2-0.1*clear2;</p><p> //jiewei3=jiewei3-0.1*clear3;</p><p> //jiewei4=jiewei4-0.1*clear4;</p><p><b> }</b></p><p> 如果液位大于16,關(guān)閉相應(yīng)的進(jìn)口閥</p>
43、<p> if(g1>=16)</p><p><b> {in1=0;}</b></p><p> if(g2>=16)</p><p><b> {in2=0;}</b></p><p> if(g3>=16)</p><p>&l
44、t;b> {in3=0;}</b></p><p> if(g4>=16)</p><p><b> {in4=0;}</b></p><p> 如果液位小于2,關(guān)閉相應(yīng)出口閥</p><p><b> if(g1<=2)</b></p><
45、;p><b> {out1=0;}</b></p><p><b> if(g2<=2)</b></p><p><b> {out2=0;}</b></p><p><b> if(g3<=2)</b></p><p><
46、b> {out3=0;}</b></p><p><b> if(g4<=2)</b></p><p><b> {out4=0;}</b></p><p> if(num==0)</p><p><b> {</b></p>&
47、lt;p><b> in1=0;</b></p><p><b> in2=0;</b></p><p><b> in3=0;</b></p><p><b> in4=0;</b></p><p><b> }</b&g
48、t;</p><p> if(num1==0)</p><p><b> {</b></p><p><b> out1=0;</b></p><p><b> out2=0;</b></p><p><b> out3=0;<
49、/b></p><p><b> out4=0;</b></p><p><b> }</b></p><p><b> (5)運(yùn)行總畫面</b></p><p> ?。?)與PLC通信設(shè)置</p><p> 在工程瀏覽器中選擇設(shè)備—com
50、1—新建,如下圖,配置com口跟PLC連接。</p><p> 設(shè)置bengin1,2,3和bengout1,2,3分別與Q0.0等相聯(lián)系,可觀察到PLC輸出指示燈會(huì)隨著這些變量的改變和改變。</p><p><b> 三、組態(tài)王部分總結(jié)</b></p><p> 組態(tài)王是組態(tài)王軟件是一種通用的工業(yè)監(jiān)控軟件,它融過程控制設(shè)計(jì)、現(xiàn)場操作以及
51、工廠資源管理于一體,將一個(gè)企業(yè)內(nèi)部的各種生產(chǎn)系統(tǒng)和應(yīng)用以及信息交流匯集在一起,實(shí)現(xiàn)最優(yōu)化管理,操作方便,界面美觀。組態(tài)王軟件結(jié)構(gòu)由工程管理器、工程瀏覽器及運(yùn)行系統(tǒng)三部分構(gòu)成。通過這次課程設(shè)計(jì),我們學(xué)會(huì)了如何建立一個(gè)組態(tài)王工程,如何設(shè)計(jì)界面,編寫命令語言、以及報(bào)警事件、趨勢曲線和報(bào)表的相關(guān)制作,權(quán)限的設(shè)置,以及與實(shí)際設(shè)備的簡單通信,通過本次實(shí)習(xí),我想在以后工作中,我們會(huì)更好的應(yīng)用此例軟件,完成工業(yè)監(jiān)控。</p><p&
52、gt;<b> 智能儀表部分</b></p><p> 一、MODBUS ASCII和MODBUS RTU通訊協(xié)議簡介</p><p> Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了控制
53、器請(qǐng)求訪問其它設(shè)備的過程,如果回應(yīng)來自其它設(shè)備的請(qǐng)求,以及怎樣偵測錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。</p><p> 兩種串行傳輸模式:RTU 模式和 ASCII 模式。</p><p><b> RTU傳輸模式:</b></p><p> 當(dāng)設(shè)備使用RTU (Remote Terminal Unit) 模式在Modbus
54、 串行鏈路通信, 報(bào)文中每個(gè)8位字節(jié)含有兩個(gè)4 位十六進(jìn)制字符。這種模式的主要優(yōu)點(diǎn)是較高的數(shù)據(jù)密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每個(gè)報(bào)文必須以連續(xù)的字符流傳送。</p><p> RTU 模式每個(gè)字節(jié)( 11 位 ) 的格式為 :</p><p> 編碼系統(tǒng): 8位二進(jìn)制,報(bào)文中每個(gè)8 位字節(jié)含有兩個(gè)4 位十六進(jìn)制字符(0–9, A–F。)</p>
55、<p> Bits per Byte: 1 起始位,8 數(shù)據(jù)位,首先發(fā)送最低有效位,1 位作為奇偶校驗(yàn),1停止位。</p><p><b> ASCII傳輸模式</b></p><p> 當(dāng) Modbus 串行鏈路的設(shè)備被配置為使用ASCII (American Standard Code for Information Interchange) 模式
56、通信時(shí), 報(bào)文中的每個(gè) 8 位子節(jié)以兩個(gè)ASCII 字符發(fā)送。</p><p> ASCII 模式每個(gè)字節(jié)( 10 位 ) 的格式為 :</p><p> 編碼系統(tǒng): 十六進(jìn)制,ASCII 字符 0-9,A-F。報(bào)文中每個(gè)ASCII 字符含有1 十六進(jìn)制字符。</p><p> Bits per Byte: 1 起始位,7 數(shù)據(jù)位,首先發(fā)送最低有效位,1 位奇
57、偶校驗(yàn),1 停止位。</p><p><b> 03讀保持寄存器</b></p><p> 上位機(jī)發(fā)送數(shù)據(jù)格式:</p><p> “ : ” ADDRESS 03 ADDRH ADDRL NUMH NUML LRC 0X0D 0X0A</p><p> 正確時(shí)變頻器返回?cái)?shù)據(jù)格式:</p><
58、p> “ : “ ADDRESS 03 BYTECOUNT DATA1 DATA2 DATA3 DATAN LRC 0D 0A</p><p> 06 寫單個(gè)保持寄存器值</p><p> 上位機(jī)發(fā)送數(shù)據(jù)格式:</p><p> “ : “ ADDRESS 06 ADDRH ADDRL DATAH DATAL LRC 0X0D 0X0A</p&g
59、t;<p> 正確時(shí)變頻器返回?cái)?shù)據(jù)格式:</p><p> “ : “ ADDRESS 06 ADDRH ADDRL DATAH DATAL LRC 0X0D 0X0A</p><p> 二、MODBUS ASCII編程以及與組態(tài)王通信</p><p><b> 1、變量定義</b></p><p>
60、; unsigned char ERR[21]= " Input LRC ERROR!"; //出錯(cuò)時(shí)顯示字符</p><p> unsigned char RX[32]; //單片機(jī)接受數(shù)據(jù)數(shù)組</p><p> unsigned char TX[32]; //03功能時(shí)單片機(jī)發(fā)送數(shù)據(jù)數(shù)組</p><p> unsigned char
61、TX6[32]; //06功能時(shí)單片機(jī)發(fā)送數(shù)據(jù)數(shù)組</p><p> unsigned char Buf[10]; //存儲(chǔ)數(shù)據(jù)的數(shù)組</p><p> unsigned int flag; // 上位機(jī)發(fā)送數(shù)據(jù)標(biāo)志位</p><p> unsigned int flag1; //單片機(jī)應(yīng)答數(shù)據(jù)標(biāo)志位</p><p> unsigne
62、d int flow; // 流量值</p><p> unsigned int temperature; //溫度值</p><p> unsigned char LRC; //上位機(jī)發(fā)送數(shù)據(jù)校驗(yàn)碼</p><p> unsigned char LRCt; //單片機(jī)應(yīng)答數(shù)據(jù)校驗(yàn)碼</p><p> 2、通過UART中斷完成上位機(jī)給
63、單片機(jī)發(fā)送</p><p><b> 編程思路:</b></p><p> 通過UART中斷,實(shí)現(xiàn)上位機(jī)給單片機(jī)發(fā)送數(shù)據(jù),當(dāng)單片機(jī)接受到:,表示上位機(jī)要向單片機(jī)發(fā)送指令,相應(yīng)標(biāo)志位置1,當(dāng)再次發(fā)生中斷時(shí),就開始接受數(shù)據(jù),同時(shí)存入RX[32]的數(shù)組里,直到接收到回車換行符,則發(fā)送命令結(jié)束。此時(shí)發(fā)送標(biāo)志位置1,進(jìn)入應(yīng)答程序。</p><p>
64、 #pragma vector=USCI_A1_VECTOR</p><p> __interrupt void USCI_A1_ISR(void)</p><p><b> {</b></p><p> while (!(UCA1IFG & UCTXIFG)); // 判斷是否發(fā)送完畢</p
65、><p> if(UCA1RXBUF == ':') //:為起始標(biāo)志,如果開始,標(biāo)志位flag置位</p><p><b> {</b></p><p><b> flag = 1;</b></p><p><b> }</b></p>&
66、lt;p> if(flag==1) //當(dāng)標(biāo)志位flag置位說明發(fā)送命令開始,開始接受命令數(shù)據(jù)</p><p><b> {</b></p><p> RX[0] = ':';</p><p> if(UCA1RXBUF != 0x0D && UCA1RXBUF != 0x0A ) //只要不是回
67、車換行符,就依次將數(shù)據(jù)存入接受數(shù)組RX中,同時(shí)計(jì)數(shù)變量tempnumb加1</p><p><b> {</b></p><p> tempnumb++;</p><p> RX[tempnumb] = UCA1RXBUF ;</p><p><b> }</b></p>&l
68、t;p> if(UCA1RXBUF == 0x0D) //若是回車</p><p><b> {</b></p><p> tempnumb++;</p><p> RX[tempnumb] = 'D' ;</p><p><b> }</b></p>
69、<p> if(UCA1RXBUF == 0x0A) //若是換行</p><p><b> {</b></p><p> tempnumb++;</p><p> RX[tempnumb] = 'A' ;</p><p> flag=0; //接受標(biāo)志位清零
70、</p><p> flag1=1; //發(fā)送標(biāo)志位置1</p><p> TTXX(); //調(diào)用發(fā)送數(shù)據(jù)函數(shù)</p><p><b> }</b></p><p><b> }</b></p><p><b>
71、; }</b></p><p> 3、單片機(jī)通過UART中斷向上位機(jī)發(fā)送應(yīng)答指令</p><p><b> 編程思路:</b></p><p> 先計(jì)算上位機(jī)發(fā)送數(shù)據(jù)的校驗(yàn)碼,如果和發(fā)送的校驗(yàn)碼相同,單片機(jī)再應(yīng)答。設(shè)置寄存器地址0001,存儲(chǔ)流量數(shù)據(jù);設(shè)置寄存器0002,存儲(chǔ)溫度數(shù)據(jù)。然后判斷是03號(hào)功能還是06號(hào)功能,若是
72、03號(hào)功能,按照相應(yīng)的格式發(fā)送數(shù)據(jù),若是06號(hào)功能,按照命令更改數(shù)據(jù),并返回應(yīng)答命令。</p><p> void TTXX()</p><p><b> {</b></p><p><b> int i;</b></p><p><b> int j;</b><
73、/p><p> unsigned int b;</p><p> unsigned int c;</p><p> unsigned int d;</p><p> In_LRC(); //計(jì)數(shù)上位機(jī)發(fā)送命令校驗(yàn)碼</p><p> if(RX[8]=='1') //如果地址為寄存器0001,發(fā)
74、送流量數(shù)據(jù)</p><p> shitohex(flow);</p><p> if(RX[8]=='2') //如果地址位寄存器0002,發(fā)送溫度數(shù)據(jù)</p><p> shitohex(temperature); </p><p> if(RX[3]=='0' && RX[4]==
75、'3') //如果是03號(hào)功能</p><p><b> {</b></p><p> if((LRCHi == RX[tempnumb-3]) &&(LRCLo == RX[tempnumb-2])) //如果上位機(jī)發(fā)送校驗(yàn)碼正確</p><p><b> {</b></p&g
76、t;<p> for(b=0;b<=4;b++)</p><p><b> { </b></p><p> TX[b] = RX[b];</p><p><b> }</b></p><p> temp = asciitohex(RX[tempnumb-4]); //計(jì)
77、算單片機(jī)要發(fā)送數(shù)據(jù)的字節(jié)數(shù)</p><p> TX[5] = hextoascii(((temp*2)>>4)&0x0F);</p><p> TX[6] = hextoascii((temp*2)&0x0F);</p><p> for(i=0;i<temp*4;i+=2)</p><p><b
78、> {</b></p><p> TX[7+i] = hextoascii(Buf[i]); //要發(fā)送的數(shù)據(jù)</p><p> TX[8+i] = hextoascii(Buf[i+1]);</p><p><b> }</b></p><p> tempnumt = 7+i; //統(tǒng)計(jì)數(shù)據(jù)
79、長度,用于計(jì)算校驗(yàn)碼</p><p> Out_LRC(); //計(jì)算單片機(jī)發(fā)送數(shù)據(jù)校驗(yàn)碼</p><p> TX[7+i] = LRCtHi;</p><p> TX[8+i] = LRCtLo;</p><p> TX[9+i] = 0x0D;</p><p> TX[10+i] = 0x0A; <
80、/p><p> for(j=0;j<=(10+i);j++) //單片機(jī)發(fā)送數(shù)據(jù)</p><p><b> {</b></p><p> while (!(UCA1IFG & UCTXIFG)); // 判斷是否發(fā)送完畢</p><p> UCA1TXBUF=TX[j];
81、</p><p><b> }</b></p><p><b> }</b></p><p> else //如果校驗(yàn)碼不正確,返回錯(cuò)誤代碼 Input LRC ERROR!只能通過串口調(diào)試看到</p><p><b> {</b></p><p
82、> ERR[19]='8';</p><p> ERR[20]=TX[4];</p><p> for(d=0;d<=20;d++)</p><p><b> {</b></p><p> while (!(UCA1IFG & UCTXIFG));
83、// 判斷是否發(fā)送完畢</p><p> UCA1TXBUF=ERR[d] ; </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(RX[3]=
84、='0' && RX[4]=='6') //如果是06號(hào)功能</p><p><b> {</b></p><p> for(c=0;c<=tempnumb;c++)</p><p><b> {</b></p><p> TX6
85、[c] = RX[c];</p><p> while (!(UCA1IFG & UCTXIFG)); // 判斷是否發(fā)送完畢</p><p> UCA1TXBUF=TX6[c];</p><p><b> }</b></p><p> selflow(TX6[10]);
86、 //設(shè)置流量值</p><p> seltemp(TX6[11]); //設(shè)置溫度值</p><p><b> }</b></p><p> flag1=0; //單片機(jī)發(fā)送標(biāo)志位清零</p><p> tempnumb=0; //上位機(jī)發(fā)送數(shù)據(jù)計(jì)算值清零</p>
87、<p><b> } </b></p><p><b> 4、輔助模塊部分</b></p><p> ?。?)、LRC校驗(yàn)?zāi)K</p><p><b> 編程思路 :</b></p><p> LRC 的計(jì)算, 對(duì)報(bào)文中的所有的連續(xù)8 位字節(jié)相加,忽略任何進(jìn)位
88、,然后求出其二進(jìn)制補(bǔ)碼。</p><p> unsigned char *auchMsg; 指向含有用于生成LRC 的二進(jìn)制數(shù)據(jù)報(bào)文緩沖區(qū)的指針,</p><p> unsigned short usDataLen; 報(bào)文緩沖區(qū)的字節(jié)數(shù).</p><p> unsigned char MODBUS_LRC(unsigned char *auchMsg, uns
89、igned short usDataLen)</p><p><b> {</b></p><p> unsigned char uchLRC = 0 ; // LRC 初始化</p><p> while (usDataLen--) // 完成整個(gè)報(bào)文緩沖區(qū)</p><p> uchLRC += *auchMs
90、g++ ; //緩沖區(qū)字節(jié)相加,無進(jìn)位</p><p> return ((unsigned char)(-((char)uchLRC))) ; // 返回二進(jìn)制補(bǔ)碼</p><p><b> }</b></p><p> ?。?)發(fā)送和應(yīng)答校驗(yàn)碼計(jì)數(shù)程序</p><p> void In_LRC()</p&
91、gt;<p><b> {</b></p><p> unsigned int a;</p><p> for(a=1;a<(tempnumb-3);a+=2)</p><p><b> {</b></p><p> tempRX[(a-1)/2] = (asciito
92、hex(RX[a])<<4) | asciitohex(RX[a+1]);</p><p><b> }</b></p><p> LRC=MODBUS_LRC(&tempRX[0],(tempnumb-4)/2); //進(jìn)行LRC效驗(yàn)計(jì)算</p><p> LRCHi = hextoascii((LRC>>
93、;4)&0x0F);</p><p> LRCLo = hextoascii(LRC&0x0F);</p><p><b> }</b></p><p> void Out_LRC()</p><p><b> {</b></p><p> unsi
94、gned int c;</p><p> for(c=1;c<tempnumt;c+=2)</p><p><b> {</b></p><p> tempTX[(c-1)/2] = (asciitohex(TX[c])<<4);</p><p> tempTX[(c-1)/2] = (asci
95、itohex(TX[c])<<4) | asciitohex(TX[c+1]);</p><p><b> }</b></p><p> LRCt=MODBUS_LRC(&tempTX[0],(tempnumt-1)/2); //進(jìn)行LRC效驗(yàn)計(jì)算</p><p> LRCtHi = hextoascii((LRCt&
96、gt;>4)&0x0F);</p><p> LRCtLo = hextoascii(LRCt&0x0F); </p><p><b> }</b></p><p> ?。?)進(jìn)制之間轉(zhuǎn)換程序</p><p> 由于發(fā)送和讀取的數(shù)據(jù)是字符,而寄存器中數(shù)據(jù)多按照十六進(jìn)制存儲(chǔ),故需要各種進(jìn)制間的相
97、互轉(zhuǎn)換。</p><p> //十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼</p><p> unsigned char hextoascii(unsigned char hex)</p><p><b> {</b></p><p> if(hex<=0x09)</p><p> return
98、 hex+0x30;</p><p><b> else</b></p><p> return hex+0x37;</p><p><b> }</b></p><p> //ASCII碼轉(zhuǎn)換為十六進(jìn)制的數(shù)</p><p> unsigned char ascii
99、tohex(unsigned char ascii)</p><p><b> {</b></p><p> if(ascii<=0x39)</p><p> return ascii-0x30;</p><p><b> else</b></p><p>
100、return ascii-0x37;</p><p><b> }</b></p><p> //十進(jìn)制轉(zhuǎn)十六進(jìn)制,由于組態(tài)王通信時(shí)會(huì)自動(dòng)將十六進(jìn)制數(shù)轉(zhuǎn)換位十進(jìn)制數(shù),因此需要在單片機(jī)內(nèi)將十進(jìn)制數(shù)轉(zhuǎn)換位十六進(jìn)制數(shù),這樣組態(tài)王讀到的就是十進(jìn)制的數(shù)據(jù)。</p><p> unsigned char shitohex(unsigned int s
101、hi)</p><p><b> {</b></p><p> int i,b,d,c;</p><p><b> int a=0;</b></p><p><b> d=4;</b></p><p> char shiliu[10];<
102、/p><p> while (shi) //shi代表相應(yīng)的十進(jìn)制數(shù)</p><p><b> {</b></p><p> c=shi%16; //每次除以16取余求得相應(yīng)的十六進(jìn)制數(shù)</p><p> shi=shi/16;</p><p> shiliu[a] = c;
103、</p><p><b> a++;</b></p><p><b> }</b></p><p> for(i=a;i<=4;i++) //得到的數(shù)據(jù)首位倒置,才是要求的十六進(jìn)制數(shù)</p><p><b> {</b></p><p>
104、 shiliu[i]=0;</p><p><b> }</b></p><p> for(b=0;b<4;b++)</p><p><b> {</b></p><p><b> d--;</b></p><p> Buf[b]=shi
105、liu[d];</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> ?。?)波特率,流量、溫度的設(shè)置</p><p><b> //選定流量
106、</b></p><p> void selflow(unsigned char selflow)</p><p><b> {</b></p><p> switch(selflow)</p><p><b> {</b></p><p> case
107、'0':flow=100; break;</p><p> case '1':flow=1799; break; </p><p> case '2':flow=5000; break;</p><p> default:flow=1799; break;</p><p><b&
108、gt; }</b></p><p><b> }</b></p><p><b> //選定溫度</b></p><p> void seltemp(unsigned char seltemp)</p><p><b> {</b></p>
109、<p> switch(seltemp)</p><p><b> {</b></p><p> case '0':temperature=1;break;</p><p> case '1':temperature=20; break; </p><p> ca
110、se '2':temperature=100; break;</p><p> default:temperature=20; break;</p><p><b> }</b></p><p><b> }</b></p><p><b> //設(shè)定波特率<
111、/b></p><p> void selbps(unsigned char selbps)</p><p><b> {</b></p><p> switch(selbps)</p><p><b> {</b></p><p> case '0&
112、#39;: UCA1CTL1 |= UCSSEL_1; // 時(shí)鐘源選擇</p><p> UCA1BR0 = 0x1B; //1200 </p><p> UCA1BR1 = 0x00;</p><p> UCA1MCTL = 04; &l
113、t;/p><p><b> break;</b></p><p> case '1': UCA1CTL1 |= UCSSEL_1; // 時(shí)鐘源選擇</p><p> UCA1BR0 = 0x0D; //2400
114、 </p><p> UCA1BR1 = 0;</p><p> UCA1MCTL = 0X0A; </p><p><b> break;</b></p><p> case '2': UCA1CTL1 |= UCSSEL_1; // 時(shí)鐘源選擇</p>
115、<p> UCA1BR0 = 6; //4800 </p><p> UCA1BR1 = 0;</p><p> UCA1MCTL = 0x0C;</p><p> UCA1CTL1 &= ~UCSWRST; // 使能串
116、口功能</p><p> UCA1IE |= UCRXIE; // 使能接收中斷</p><p> _BIS_SR(GIE); </p><p><b> break;</b></p><p> case '3': UCA1CTL1 |= UCSSEL_1;
117、 // 時(shí)鐘源選擇</p><p> UCA1BR0 = 3; //9600 </p><p> UCA1BR1 = 0;</p><p> UCA1MCTL = 06; </p><p> UCA1CTL1 &=
118、 ~UCSWRST; // 使能串口功能</p><p> UCA1IE |= UCRXIE; // 使能接收中斷</p><p> _BIS_SR(GIE); </p><p><b> break;</b></p><p> default:UCA1CTL1
119、|= UCSSEL_1; // 時(shí)鐘源選擇</p><p> UCA1BR0 = 3; // 32768hz/3=9600</p><p> UCA1BR1 = 0;</p><p> UCA1MCTL = 06; </p><p><b> break;</b
120、></p><p><b> }</b></p><p><b> }</b></p><p> 5、實(shí)驗(yàn)現(xiàn)象: 測試IO設(shè)備界面</p><p> 組態(tài)王畫面:實(shí)現(xiàn)讀寫功能</p><p> 三、MODBUS RTU編程以及與組態(tài)王通信</p>
121、<p><b> 1、變量定義</b></p><p> int R_flag=1; // 延時(shí)3.5字符標(biāo)志</p><p> int R_flag1=0;</p><p> int R_flag2=1;</p><p> unsigned char Crc_RX[32]; //存儲(chǔ)上位機(jī)發(fā)送的
122、字符的數(shù)組</p><p> unsigned char Crc_TX[32]; //存儲(chǔ)單片機(jī)應(yīng)答的字符的數(shù)組</p><p> unsigned int crcnumt; // 統(tǒng)計(jì)上位機(jī)發(fā)送字符數(shù)據(jù)長度</p><p> unsigned int crcnumr; //統(tǒng)計(jì)單片機(jī)應(yīng)答數(shù)據(jù)長度</p><p> unsigned
123、 char CRCHi8; //上位機(jī)發(fā)送數(shù)據(jù)的校驗(yàn)碼高位</p><p> unsigned char CRCLo8; //上位機(jī)發(fā)送數(shù)據(jù)的校驗(yàn)碼低位</p><p> unsigned char CRCtHi8; //單片機(jī)發(fā)送數(shù)據(jù)的校驗(yàn)碼高位</p><p> unsigned char CRCtLo8; //單片機(jī)應(yīng)答數(shù)據(jù)的校驗(yàn)碼低位</p>
124、;<p> unsigned char Buf[10]; //測試數(shù)據(jù)</p><p> 2、設(shè)計(jì)延時(shí)3.5字符控制發(fā)送和接受數(shù)據(jù)的開始和接受</p><p> while (1) //接收 起始 結(jié)束 判斷函數(shù)</p><p><b> {</b></p><p> if(R_fla
125、g1==1)</p><p><b> {</b></p><p> if(count_leg==300) //此時(shí)間遠(yuǎn)大于3.5個(gè)字符,確保通信的正確</p><p><b> {</b></p><p><b> RTU_T();</b></p>&l
126、t;p> R_flag = 1;</p><p> count_leg=0;</p><p> R_flag1=0;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>
127、</p><p> count_leg=count_leg+1;</p><p><b> }</b></p><p><b> }</b></p><p> 3、通過UART中斷完成上位機(jī)給單片機(jī)發(fā)送</p><p> 編程思路:通過UART中斷完成上位機(jī)給單片機(jī)
128、發(fā)送,當(dāng)延時(shí)大于3.5個(gè)字符,R_flag==1,依次將值存入 Crc_RX[]數(shù)組中 ,再判斷,若延時(shí)大于3.5個(gè)字符,則發(fā)送結(jié)束,R_flag1=1。</p><p> #pragma vector=USCI_A1_VECTOR</p><p> __interrupt void USCI_A1_ISR(void)</p><p><b> {&
129、lt;/b></p><p> if(R_flag==1)</p><p><b> {</b></p><p> Crc_RX[crcnumr] = UCA1RXBUF;</p><p> crcnumr++;</p><p> if(crcnumr==8)</p>
130、<p><b> { </b></p><p> R_flag1=1;</p><p><b> R_flag=0;</b></p><p><b> } </b></p><p><b> }</b></p><
131、;p> 4.通過UART中斷完成單片機(jī)應(yīng)答上位機(jī)</p><p> 首先計(jì)算校驗(yàn)碼,若校驗(yàn)碼正確,計(jì)算應(yīng)答指令每位的值,存入Crc_TX[]中。</p><p> void RX_TX()</p><p><b> {</b></p><p> unsigned int b;</p><
132、;p> In_CRC(); //計(jì)算上位機(jī)發(fā)送數(shù)據(jù)的校驗(yàn)碼</p><p> if((CRCHi8 == Crc_RX[crcnumr-2])&&(CRCLo8 == Crc_RX[crcnumr-1]))</p><p> { //若校驗(yàn)碼正確</p><p> for(b=0;b<2;b++)</p>&l
133、t;p><b> { </b></p><p> Crc_TX[b] = Crc_RX[b];</p><p><b> }</b></p><p> Bytenum(); //計(jì)算單片機(jī)應(yīng)答的字節(jié)數(shù)</p><p> Out_CRC(); //計(jì)算單片機(jī)應(yīng)答數(shù)據(jù)的校驗(yàn)碼</p
134、><p><b> }</b></p><p><b> }</b></p><p> void RTU_T() //通過該程序?qū)rc_TX[]發(fā)送到上位機(jī)</p><p><b> {</b></p><p><b> int i;
135、 </b></p><p><b> int j;</b></p><p><b> RX_TX();</b></p><p> for(j=0;j<=200;j++) ; // 延時(shí)4毫秒——發(fā)送開始</p><p> for(i=0;i<=(crc
136、numt+1);i++) </p><p><b> {</b></p><p> while (!(UCA1IFG & UCTXIFG)); // 判斷是否發(fā)送完畢 </p><p> UCA1TXBUF =Crc_TX[i];</p><p><b> }<
137、;/b></p><p> for(j=0;j<=200;j++) ; // 延時(shí)4毫秒——發(fā)送結(jié)束</p><p> crcnumr=0;</p><p><b> }</b></p><p><b> 5、輔助模塊</b></p><p&g
138、t; ?。?)CRC校驗(yàn)程序</p><p><b> 編程思路:</b></p><p> 1. 將一個(gè)16 位寄存器裝入十六進(jìn)制FFFF (全1). 將之稱作CRC 寄存器.</p><p> 2. 將報(bào)文的第一個(gè)8位字節(jié)與16 位CRC 寄存器的低字節(jié)異或,結(jié)果置于CRC 寄存器.</p><p> 3.
139、將CRC 寄存器右移1位(向LSB 方向), MSB 充零. 提取并檢測LSB.</p><p> 4. (如果LSB 為0): 重復(fù)步驟3 (另一次移位).</p><p> (如果LSB 為1): 對(duì)CRC 寄存器異或多項(xiàng)式值0xA001 (1010 0000 0000 0001).</p><p> 5. 重復(fù)步驟3 和 4,直到完成8 次移位。當(dāng)做完此
140、操作后,將完成對(duì)8位字節(jié)的完整操作。</p><p> 6. 對(duì)報(bào)文中的下一個(gè)字節(jié)重復(fù)步驟2 到5,繼續(xù)此操作直至所有報(bào)文被處理完畢。</p><p> 7. CRC 寄存器中的最終內(nèi)容為CRC 值.</p><p> 8. 當(dāng)放置CRC 值于報(bào)文時(shí),如下面描述的那樣,高低字節(jié)必須交換。</p><p><b> 數(shù)據(jù)表:&
141、lt;/b></p><p> static unsigned char auchCRCHi[] = {</p><p> 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,</p><p> 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 組態(tài)王課程設(shè)計(jì)---基于組態(tài)王的液位控制系統(tǒng)
- 組態(tài)王小區(qū)自動(dòng)大門課程設(shè)計(jì)
- 組態(tài)王課程設(shè)計(jì)--基于組態(tài)王的儲(chǔ)液罐液位控制
- 水煤漿氣化工藝的組態(tài)設(shè)計(jì)(組態(tài)王設(shè)計(jì))課程設(shè)計(jì)
- 基于組態(tài)王單容水箱控制課程設(shè)計(jì)
- 四層電梯plc換氣系統(tǒng)組態(tài)王課程設(shè)計(jì)報(bào)告
- 組態(tài)王實(shí)例
- 基于組態(tài)王軟件的中央空調(diào)課程設(shè)計(jì)計(jì)算書
- 基于組態(tài)王的智能家居課程設(shè)計(jì)--門禁系統(tǒng)的設(shè)計(jì)
- 組態(tài)王網(wǎng)絡(luò)配置
- 組態(tài)王畢業(yè)設(shè)計(jì)---組態(tài)王技術(shù)在銑打機(jī)床中的應(yīng)用
- 組態(tài)王課程設(shè)計(jì)報(bào)告--反應(yīng)器液位的檢測與監(jiān)控
- 組態(tài)王教程——很實(shí)用
- 組態(tài)王_采用plc的停車場控制_和_四層電梯控制--課程設(shè)計(jì)
- 課程設(shè)計(jì)~基于fx2n_plc及組態(tài)王的氣動(dòng)機(jī)械手監(jiān)控
- 組態(tài)王工程界面.rar
- 組態(tài)王工程界面.rar
- 組態(tài)王工程界面.rar
- 組態(tài)王工程界面.rar
- 組態(tài)王中的配方管理
評(píng)論
0/150
提交評(píng)論