第一篇:電動(dòng)車(chē)控制器介紹
電動(dòng)車(chē)控制器介紹
電動(dòng)車(chē)控制器是用來(lái)控制電動(dòng)車(chē)電機(jī)的啟動(dòng)、運(yùn)行、進(jìn)退、速度、停止以及電動(dòng)車(chē)的其它電子器件的核心控制器件,它就象是電動(dòng)車(chē)的大腦,是電動(dòng)車(chē)上重要的部件。
我們開(kāi)發(fā)的智能型無(wú)刷電動(dòng)車(chē)控制器采用了美國(guó)cypress公司的方案,采用性能非常優(yōu)異單片機(jī)作為主控芯片,來(lái)實(shí)現(xiàn)控制和保護(hù)電動(dòng)車(chē)的電機(jī)、電池,使電動(dòng)車(chē)驅(qū)動(dòng)系統(tǒng)工作在最佳狀態(tài),從而提高產(chǎn)品的可靠性和使用壽命;采用霍爾電子無(wú)級(jí)調(diào)速系統(tǒng),具有欠壓保護(hù)、過(guò)流保護(hù)、堵轉(zhuǎn)保護(hù)等保護(hù)功能,可靠的對(duì)電動(dòng)車(chē)電機(jī)和電池進(jìn)行保護(hù),確保電動(dòng)車(chē)使用及安全;加入了全新的無(wú)刷電機(jī)控制器理論,具有反充電/EABS剎車(chē)功能,用戶(hù)在關(guān)掉電源的情況下可把電機(jī)鎖死,使車(chē)子很難推行,另外還加入1+1助力系統(tǒng),具有巡航功能,模式切換功能,實(shí)現(xiàn)了真正的智能型控制。
一、控制器功能:
1、工作電壓: DC 48V;
2、功率: 350W 450W 500W;
3、欠壓保護(hù): DC 41.5V ±1V(也可根據(jù)用戶(hù)要求設(shè)定);
4、電動(dòng)模式:霍爾電子無(wú)級(jí)調(diào)速系統(tǒng),調(diào)速范圍 0~100%,1.1~4.2V;
5、限流電流:≤17A(平均值),最大脈沖電流35A(根據(jù)用戶(hù)要求設(shè)定);
6、限速功能:最高車(chē)速可達(dá)35km/h~45km/h(根據(jù)電機(jī)而定),限速行駛速度控制在20km/h以?xún)?nèi);
7、啟動(dòng)方式:手柄控制啟動(dòng)快慢,控制靈活;
8、剎車(chē):EABS+機(jī)械剎,高/低電平;
9、巡航模式:具有自動(dòng)巡航和手動(dòng)巡航兩種功能可選,8秒進(jìn)入巡航,穩(wěn)定行駛速度,無(wú)須手柄控制;
10、1+1助力功能:控制器根據(jù)騎車(chē)者腳踏力的大小(速度快慢),給出相應(yīng)比例的電機(jī)動(dòng)力,實(shí)現(xiàn)了在騎行中輔以動(dòng)力,讓騎行者感覺(jué)更輕松,中軸轉(zhuǎn)速智能型;
11、堵轉(zhuǎn)保護(hù)功能:自動(dòng)判斷電機(jī)在過(guò)流時(shí)是處于完全堵轉(zhuǎn)狀態(tài)還是在運(yùn)行狀態(tài)
或電機(jī)短路狀態(tài),如過(guò)流時(shí)是處于運(yùn)行狀態(tài),控制器將限流值設(shè)定在固定值,以保持整車(chē)的驅(qū)動(dòng)能力;如電機(jī)處于純堵轉(zhuǎn)狀態(tài),則控制器2秒后將限流值控制在10A以下,起到保護(hù)電機(jī)和電池,節(jié)省電能;如電機(jī)處于短路狀態(tài),控制器則使輸出電流控制在2A以下,以確??刂破骷半姵氐陌踩?。
12、防飛車(chē)功能:解決了無(wú)刷控制器由于轉(zhuǎn)把或線(xiàn)路故障引起的飛車(chē)現(xiàn)象,同時(shí)
具有啟動(dòng)防飛車(chē)功能,提高了系統(tǒng)的安全性。
13、電機(jī)鎖功能:在關(guān)閉電門(mén)鎖的情況下,控制器能自動(dòng)將電機(jī)鎖死,實(shí)現(xiàn)了部
件級(jí)的防盜功能,解決了防盜型控制器在警戒狀態(tài)下控制器還必須工作,工作電流大的不利因素。
14、遙控功能:在關(guān)閉電門(mén)鎖的情況下,控制器通過(guò)遙控報(bào)警器自動(dòng)在將電機(jī)鎖
死的同時(shí)具有報(bào)警功能,實(shí)現(xiàn)了遙控與部件級(jí)的雙重防盜功能,解決了防盜型控制器在警戒狀態(tài)下控制器還必須工作,工作電流大的不利因素。并可在車(chē)場(chǎng)中通過(guò)遙控器尋車(chē)。
15、反充電功能:滑行時(shí)可對(duì)電池進(jìn)行反充電,在延長(zhǎng)了電池的行駛時(shí)間的同時(shí)
增加了電池的使用壽命,解決了電池在行駛時(shí)的行駛時(shí)間短和使用壽命不長(zhǎng)的問(wèn)題。
16、電機(jī)選擇:解決了正、反相繞阻電機(jī)之間不兼容的現(xiàn)象,方便了用戶(hù)的使用。17、120o/60o選擇:120o與60o電機(jī)可相互切換。
18、指示燈顯示代碼:
1、指示燈常滅:控制器進(jìn)入運(yùn)行狀態(tài);
2、指示燈亮0.5滅0.5秒閃爍一次,滅1秒:控制器進(jìn)入待機(jī)狀態(tài);
3、指示燈亮0.5滅0.5秒閃爍二次,滅1秒:剎車(chē)信號(hào);
4、指示燈亮0.5滅0.5秒閃爍三次,滅1秒:MOS損壞;
5、指示燈亮0.5滅0.5秒閃爍四次,滅1秒:飛車(chē)保護(hù);
6、指示燈亮0.5滅0.5秒閃爍五次,滅1秒:電流故障;
7、指示燈亮0.5滅0.5秒閃爍六次,滅1秒:電源電壓低保護(hù);
8、指示燈亮0.5滅0.5秒閃爍七次,滅1秒:霍爾信號(hào)故障;
9、指示燈亮0.5滅0.5秒閃爍八次,滅1秒:手柄信號(hào)未接。
二、使用方法:
1、在接線(xiàn)前先切斷電源,按接線(xiàn)圖所示連接各根導(dǎo)線(xiàn);
2、該控制器應(yīng)安裝在通風(fēng)、防水、防震部位;
3、控制器限速控制插頭應(yīng)放置容易操作的地方;
4、控制器接插件應(yīng)接插到位,禁止將控制器電源正負(fù)極反接;
5、測(cè)試后裝進(jìn)鋁殼之前,建議放電。
第二篇:電動(dòng)車(chē)控制器設(shè)計(jì)方案
電動(dòng)自行車(chē)控制器設(shè)計(jì)
電動(dòng)自行車(chē)控制器方案
2012/11/5
電動(dòng)自行車(chē)控制器設(shè)計(jì)
目錄
第一章 概述-------------3
第二章 系統(tǒng)需求分析-------4
第三章 控制器分析---------6
一、電動(dòng)車(chē)控制器框圖------6
二、控制器關(guān)鍵功能分析-----7
第四章 控制器設(shè)計(jì)----------9
一、硬件設(shè)計(jì)---------9
二、軟件設(shè)計(jì)----------12
電動(dòng)自行車(chē)控制器設(shè)計(jì)
第一章 概述
近年來(lái),隨著改革開(kāi)放和經(jīng)濟(jì)發(fā)展日益深刻,人民生活水平日漸提高,出行交通工具也發(fā)生前所未有的變化。老百姓出行不僅考慮快捷、方便,還追求時(shí)尚環(huán)保,因此近年來(lái)電動(dòng)自動(dòng)自行車(chē)日益受老百姓喜愛(ài)。作為電動(dòng)自行車(chē),其核心控制器則是電動(dòng)自行車(chē)的關(guān)鍵,控制的好壞決定車(chē)子的平穩(wěn)、安全、舒適,因此一個(gè)功能全面、可靠性強(qiáng)、符合要求的控制器決定了電動(dòng)自行車(chē)的質(zhì)量。為了使得電動(dòng)自行車(chē)有良好的體驗(yàn)和可靠的質(zhì)量保證,因此本文介紹一種控制器的設(shè)計(jì)方案。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
第二章 系統(tǒng)需求分析
1、具有安全檢測(cè)功能,檢測(cè)電池電壓,電流
需要檢測(cè)電池中電流,電池電流不能過(guò)大,防止損傷電池;
需要檢查電機(jī)中的電流,并且識(shí)別是否是電機(jī)堵轉(zhuǎn)還是車(chē)子上坡或者負(fù)載過(guò)大,并且限制電機(jī)電流17A以下,在15~17A間切換,防止大電流長(zhǎng)時(shí)間燒壞電機(jī);
檢測(cè)電池電壓,電池電壓大于電機(jī)額定電壓120%時(shí),發(fā)出報(bào)警鈴聲,提醒電壓過(guò)大,不能驅(qū)動(dòng)電機(jī);
2、顯示速度和里程數(shù)
利用三位數(shù)碼管顯示里程數(shù),范圍0~999Km,保證每分鐘更新一次;
用5個(gè)發(fā)光二極管顯示速度,表示5個(gè)檔位,每個(gè)檔位間隔速度為10Km/h,即表示的速度為10Km/h、20Km/h、30Km/h、40Km/h、50Km/h,速度在哪個(gè)檔位,對(duì)應(yīng)發(fā)光二極管閃亮。
3、具有轉(zhuǎn)向燈控制電路
當(dāng)打開(kāi)轉(zhuǎn)向燈開(kāi)關(guān)時(shí),對(duì)應(yīng)的轉(zhuǎn)向燈每隔0.5秒閃一次,每次持續(xù)0.5秒
電動(dòng)自行車(chē)控制器設(shè)計(jì)
4、照明燈控制電路
當(dāng)打開(kāi)照明燈時(shí),在儀表盤(pán)上顯示照明打開(kāi),用一個(gè)發(fā)光二極管。
5、具有報(bào)警功能
當(dāng)鑰匙開(kāi)關(guān)不再車(chē)上時(shí),若輪子速度有變化,即發(fā)出報(bào)警聲音。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
第三章 系統(tǒng)分析
一、電動(dòng)車(chē)控制器框圖
上圖是整車(chē)的控制系統(tǒng)框圖,主要有電源、電機(jī)、控制器等,其中控制器位于核心地位,是整個(gè)控制系統(tǒng)的關(guān)鍵,也是負(fù)責(zé)組織各個(gè)部分協(xié)調(diào)工作的中心。其具體的控制框圖如下圖所示:
電動(dòng)自行車(chē)控制器設(shè)計(jì)
電源降壓模塊燈管驅(qū)動(dòng)電路照控速盤(pán)電壓信號(hào)剎車(chē)信號(hào)信號(hào)轉(zhuǎn)換電路WM燈P向、轉(zhuǎn)明燈轉(zhuǎn)向燈、照明燈信號(hào)信號(hào)轉(zhuǎn)換電路PIC芯片信號(hào)轉(zhuǎn)換電路MOS驅(qū)動(dòng)電路電機(jī)電源輸出電路電機(jī)電路電流、電機(jī)電壓蜂鳴器P信號(hào)轉(zhuǎn)換電路WM三極管驅(qū)動(dòng)電路電機(jī)霍爾信號(hào)電壓、里程顯示輸出數(shù)碼管顯示電路電源
從圖中可以看出,控制器由單片機(jī)及其外圍電路構(gòu)成,包括輸入信號(hào)處理電路、輸出信號(hào)處理電路、電源電路等。
二、控制器關(guān)鍵功能分析 控制器功能:
1、改變電機(jī)速度
即調(diào)速功能,檢測(cè)車(chē)把電壓,根據(jù)車(chē)把設(shè)定速度來(lái)進(jìn)行速度設(shè)定。同時(shí)檢測(cè)霍爾傳感器計(jì)數(shù)值,作為當(dāng)前速度,通過(guò)PID調(diào)節(jié)來(lái)計(jì)算應(yīng)該輸出的PWM波。
2、剎車(chē)功能
檢測(cè)剎車(chē)信號(hào),當(dāng)剎車(chē)有效時(shí),將速度設(shè)定值強(qiáng)制變?yōu)榱?,輸出PWM也變?yōu)榱恪?/p>
電動(dòng)自行車(chē)控制器設(shè)計(jì)
3、有防過(guò)壓、過(guò)流檢測(cè)電路
檢測(cè)電源電壓,低壓報(bào)警,防止損傷電池; 檢測(cè)電源電流,當(dāng)電流過(guò)大時(shí)適當(dāng)降速,限制電流在合理區(qū)間,防止燒壞電機(jī)、電源。
4、顯示電池電壓、車(chē)速、里程數(shù)
將車(chē)子的速度用數(shù)碼管顯示在儀表盤(pán)上,將電池電壓通過(guò)發(fā)光二極管顯示在儀表盤(pán)上。
5、防盜
當(dāng)車(chē)子鎖上時(shí),車(chē)輪子有轉(zhuǎn)動(dòng)則報(bào)警。
6、照明燈控制開(kāi)關(guān)、轉(zhuǎn)向燈控制開(kāi)關(guān)
可以采用雙刀雙擲開(kāi)關(guān),一個(gè)可控制強(qiáng)電信號(hào),另一個(gè)給單片機(jī)進(jìn)行檢測(cè)。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
第四章 控制器設(shè)計(jì)
控制器是電動(dòng)自行車(chē)的核心,要實(shí)現(xiàn)的功能有:
1、可以改變電機(jī)速度
2、可以剎車(chē)
3、有防過(guò)壓、過(guò)流檢測(cè)電路
4、顯示電池電壓、車(chē)速、里程數(shù)
5、防盜
控制器不僅要具有所有功能并且引出相關(guān)信號(hào)線(xiàn),而且要有合適的外觀尺寸,并且可以對(duì)內(nèi)部電路進(jìn)行保護(hù)。
一、硬件設(shè)計(jì)
1、電機(jī)驅(qū)動(dòng)電路設(shè)計(jì)
由V1~V6六只功率管構(gòu)成的驅(qū)動(dòng)全橋可以控制繞組的通電狀態(tài)。按照功率管的通電方式,可以分為兩兩導(dǎo)通和三三導(dǎo)通兩種控制方式。由于兩兩導(dǎo)通方式提 供了更大的電磁轉(zhuǎn)矩而被廣泛采用。在兩兩導(dǎo)通方式下,每一瞬間有兩個(gè)功率管導(dǎo)通,每隔1/6周期即60°電角度換相一次,每只功率管持續(xù)導(dǎo)通 120°電角度,對(duì)應(yīng)每相繞組持續(xù)導(dǎo)通120°,在此期間相電流方向保持不變。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
為保證產(chǎn)生最大的電磁轉(zhuǎn)矩,通常需要使繞組合成磁場(chǎng)與轉(zhuǎn)子 磁場(chǎng)保持垂直。由于采用換相控制方式,其定子繞組產(chǎn)生的是跳變的磁場(chǎng),使得該磁場(chǎng)與轉(zhuǎn)子磁場(chǎng)的位置保持在60°~120°相對(duì)垂直的范圍 區(qū)間。
2、照明燈、轉(zhuǎn)向燈、速度顯示儀表
單片機(jī)檢測(cè)到照明燈亮暗,轉(zhuǎn)向燈亮暗及方向,將其顯示在儀表盤(pán)上,燈的亮暗是通過(guò)三個(gè)發(fā)光二極管來(lái)顯示的。由于一般的發(fā)光二極管20mA的電流就可以驅(qū)動(dòng),因此可以用單片機(jī)I/O引腳直接驅(qū)動(dòng)。
至于速度顯示,可以通過(guò)數(shù)碼管顯示,數(shù)碼管可以用三個(gè),顯示范圍是0.0 ~99.9KM/h,可以用三極管控制選擇端,每次選擇一個(gè)數(shù)碼管,進(jìn)行給值,單片機(jī)輸出的是四位信號(hào),可以顯示0~9的BCD碼,通過(guò)數(shù)碼管顯示驅(qū)動(dòng)芯片轉(zhuǎn)換為數(shù)碼管的7段碼,則選中的數(shù)碼管顯示對(duì)應(yīng)的數(shù)字,通過(guò)不斷給數(shù)碼管寫(xiě)值則可以達(dá)到看起來(lái)連續(xù)的效果。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
或者要節(jié)省成本,其實(shí)速度顯示可以?xún)H顯示檔位,比如0~5km/h、5~10km/h、10~15km/h、15~20km/h、20~25km/h 分為5檔,每檔對(duì)應(yīng)一個(gè)發(fā)光二極管,當(dāng)速度在對(duì)應(yīng)的檔位時(shí),對(duì)應(yīng)的發(fā)光二極管亮,其他的不亮。
3、電池電壓檢測(cè)電路
檢測(cè)電池電壓需要對(duì)電池電壓進(jìn)行采樣,采樣電路的作用是強(qiáng)弱分離,對(duì)單片機(jī)引腳進(jìn)行保護(hù),同時(shí)對(duì)電池電壓進(jìn)行變換,變到適合單片機(jī)A/D引腳采樣的范圍。
采樣電路可以先用電容進(jìn)行濾波,然后接上一個(gè)輸入電阻很大的變換電路,可以通過(guò)741等放大器實(shí)現(xiàn),然后對(duì)比較后的電壓進(jìn)行電阻分壓轉(zhuǎn)換,轉(zhuǎn)換到0~3.3V,適合單片機(jī)采樣。
4、電機(jī)電流檢測(cè)、電池電流檢測(cè)、漏電檢測(cè)
在待檢測(cè)的電路中串入阻值很小的電阻(注意大電流電路中電阻必須要有較大的功率),然后對(duì)電阻兩側(cè)的電壓取樣,經(jīng)過(guò)后級(jí)差值比較電路得出壓差。差值轉(zhuǎn)換可以采用741,然后在進(jìn)行放大縮小變化,轉(zhuǎn)換成0~3.3V的范圍,可以接入單片機(jī)A/D引腳進(jìn)行電壓檢測(cè),然后除以電阻及變比等即可得到對(duì)應(yīng)線(xiàn)路的電流。通過(guò)和每個(gè)線(xiàn)路設(shè)定電流閾值及車(chē)狀態(tài)檢測(cè),即可得到是否過(guò)流、是否漏電等信息。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
5、報(bào)警電路
單片機(jī)通過(guò)I/O引腳輸出報(bào)警信號(hào)開(kāi)關(guān),然后通過(guò)三極管驅(qū)動(dòng)蜂鳴喇叭來(lái)提示是否有緊急情況。通過(guò)不同頻率的信號(hào)分辨不同的報(bào)警信息。
6、防盜電路
防盜檢測(cè)其實(shí)是檢測(cè)輪子是否轉(zhuǎn)動(dòng)來(lái)實(shí)現(xiàn)的,即利用霍爾器件檢測(cè)速度,若速度大于某個(gè)去掉干擾后的閾值就認(rèn)為有被盜的可能,就驅(qū)動(dòng)蜂鳴喇叭報(bào)警。
二、軟件設(shè)計(jì)
1、軟件流程圖設(shè)計(jì)
電動(dòng)自行車(chē)控制器設(shè)計(jì)
上電檢查進(jìn)入主循環(huán)檢測(cè)速度輸入,設(shè)定速度輸入,剎車(chē)信號(hào)輸入,電源電壓檢測(cè)輸入速度PID計(jì)算,將PWM控制信號(hào)輸出儀表盤(pán)顯示速度
程序流程圖 1,主要流程圖,包括初始化、主循環(huán)。
電動(dòng)自行車(chē)控制器設(shè)計(jì)
檢測(cè)速度設(shè)定值,用單片機(jī)A/D轉(zhuǎn)換功能將模擬電壓轉(zhuǎn)換為數(shù)字信號(hào),低通濾波讀出單片機(jī)光碼盤(pán)計(jì)數(shù)器值,低通濾波增量式PID計(jì)算輸出值,并且進(jìn)行限速處理PWM輸出設(shè)定
程序流程圖 2,速度調(diào)整程序流程圖
電動(dòng)自行車(chē)控制器設(shè)計(jì)
已經(jīng)檢測(cè)到實(shí)際速度值,并且進(jìn)行低通濾波處理將速度信號(hào)分成三位,分別是十位,個(gè)位,小數(shù)位計(jì)算三位數(shù)字轉(zhuǎn)換成數(shù)碼管設(shè)定值,并且進(jìn)行輸出時(shí)序設(shè)置調(diào)用顯示子函數(shù)
程序流程圖 3,顯示子函數(shù)程序流程圖
電動(dòng)自行車(chē)控制器設(shè)計(jì)
速度PID計(jì)算剎車(chē)信號(hào)是否有效否進(jìn)行增量式PID計(jì)算,設(shè)定是將設(shè)定速度設(shè)為零,進(jìn)行PID計(jì)算,輸出PWM設(shè)定子函數(shù)
程序流程圖 4,速度調(diào)控流程圖
電動(dòng)自行車(chē)控制器設(shè)計(jì)
安全檢測(cè)子函數(shù)電源電流是否過(guò)大是否否進(jìn)行正常處理,顯示電壓是電流過(guò)大,進(jìn)行漏電判斷或者速度限制下一程序
程序流程圖 5,安全檢測(cè)程序流程圖
2、軟件功能設(shè)計(jì)
速度PID設(shè)計(jì):
1)可以采用增量式PID,在不同電壓、不同速度下比例積分微分系數(shù)有所不同;
2)帶剎車(chē)檢測(cè),剎車(chē)時(shí)將設(shè)定速度設(shè)為0,電機(jī)PWM輸出為零;
3)超速限制,當(dāng)速度超過(guò)20Km/h時(shí),進(jìn)行適當(dāng)減速,限制在20Km/h以下;
電動(dòng)自行車(chē)控制器設(shè)計(jì)
4)起步限速,開(kāi)始時(shí)速度慢慢上升,防止突然啟動(dòng)。
安全檢測(cè)設(shè)計(jì):
1)檢測(cè)電壓電流,當(dāng)電壓較低時(shí)報(bào)警,以免損壞電池; 2)電流檢測(cè),防止超過(guò)限制電流燒壞電機(jī)、電源或者電線(xiàn),當(dāng)電流大于最大電流時(shí),減速是電流在最大電流值以下附近一個(gè)區(qū)間內(nèi)波動(dòng);
3)上電檢測(cè),當(dāng)電機(jī)未開(kāi)動(dòng)時(shí),若有較大電流則可能漏電進(jìn)行報(bào)警;
4)當(dāng)車(chē)鑰匙拔出來(lái),并且開(kāi)啟報(bào)警功能后,若車(chē)輪子光碼盤(pán)有讀數(shù)說(shuō)明車(chē)子可能被盜,要進(jìn)行報(bào)警。
顯示設(shè)計(jì):
1)速度顯示設(shè)計(jì),用三段數(shù)碼管顯示速度的十位、個(gè)位和小數(shù)位,采用共陰極數(shù)碼管,LM373鎖存數(shù)字,三個(gè)IO口選通數(shù)碼管,一次顯示一位,每個(gè)循環(huán)周期控制一次; 2)照明燈顯示,主控電路用開(kāi)關(guān)實(shí)現(xiàn),單片機(jī)僅檢測(cè)開(kāi)關(guān)是否開(kāi)啟,并用一個(gè)IO口來(lái)控制三極管電路驅(qū)動(dòng)發(fā)光二極管來(lái)顯示是否開(kāi)啟照明燈,左右的轉(zhuǎn)向燈采用相同的設(shè)計(jì); 3)電源電壓顯示,將檢測(cè)到的電壓用多個(gè)發(fā)光二極管顯示,亮的越多電壓越高,當(dāng)電壓低于報(bào)警電壓時(shí),所有二極管熄滅,驅(qū)動(dòng)電路采用三極管驅(qū)動(dòng),每個(gè)循環(huán)周期進(jìn)行一次顯示。
第三篇:struts2_控制器介紹
struts2 控制器介紹
核心控制器FilterDispatcher
核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶(hù)來(lái)自己實(shí)現(xiàn)的。用戶(hù)在開(kāi)發(fā)Action和業(yè)務(wù)邏輯組件的同時(shí),還需要編寫(xiě)相關(guān)的配置文件,供核心控制器FilterDispatcher來(lái)使用。
Struts 2的工作流程相對(duì)于Struts 1要簡(jiǎn)單,與WebWork框架基本相同,所以說(shuō)Struts 2是WebWork的升級(jí)版本。Struts 2框架按照模塊來(lái)劃分,可以分為Servlet Filters、Struts核心模塊、攔截器和用戶(hù)實(shí)現(xiàn)部分。Struts 2框架結(jié)構(gòu)圖如圖3.1所示。
圖3.1 Struts 2框架結(jié)構(gòu)圖
一個(gè)請(qǐng)求在Struts 2框架中的處理大概分為以下幾個(gè)步驟。
客戶(hù)端提交一個(gè)(HttpServletRequest)請(qǐng)求,如上文在瀏覽器中輸入
http://localhost: 8080/bookcode/ch2/Reg.action就是提交一個(gè)(HttpServletRequest)請(qǐng)求。
請(qǐng)求被提交到一系列(主要是3層)的過(guò)濾器(Filter),如(ActionContextCleanUp、其他過(guò)濾器(SiteMesh等)、FilterDispatcher)。注意:這里是有順序的,先ActionContext CleanUp,再其他過(guò)濾器(Othter Filters、SiteMesh等),最后到FilterDispatcher。
FilterDispatcher是控制器的核心,就是MVC的Struts 2實(shí)現(xiàn)中控制層(Controller)的核心。
FilterDispatcher詢(xún)問(wèn)ActionMapper是否需要調(diào)用某個(gè)Action來(lái)處理這個(gè)(HttpServlet Request)請(qǐng)求,如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher則把請(qǐng)求的處理交給ActionProxy。
ActionProxy通過(guò)Configuration Manager(struts.xml)詢(xún)問(wèn)框架的配置文件,找到需要調(diào)用的Action類(lèi)。例如,用戶(hù)注冊(cè)示例將找到UserReg類(lèi)。
ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,同時(shí)ActionInvocation通過(guò)代理模式調(diào)用Action。但在調(diào)用之前,ActionInvocation會(huì)根據(jù)配置加載Action相關(guān)的所有Interceptor(攔截器)。
一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result。Struts 2的核心控制器是FilterDispatcher,有3個(gè)重要的方法:destroy()、doFilter()和Init(),可以在Struts 2的下載文件夾中找到源代碼,如代碼3.1所示。
代碼3.1 核心控制器FilterDispatcher
public class FilterDispatcher implements StrutsStatics, Filter {
/**
* 定義一個(gè)Log實(shí)例
*/
private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);
/**
* 存放屬性文件中的.STRUTS_I18N_ENCODING值
*/
private static String encoding;
/**
* 定義ActionMapper實(shí)例
*/
private static ActionMapper actionMapper;
/**
* 定義FilterConfig實(shí)例
*/
private FilterConfig filterConfig;
protected Dispatcher dispatcher;
/**
* 創(chuàng)建一個(gè)默認(rèn)的dispatcher,初始化filter
* 設(shè)置默認(rèn)的packages
*
*/
public void init(FilterConfig filterConfig)throws ServletException {
this.filterConfig = filterConfig;
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
String param = filterConfig.getInitParameter(“packages”);
String packages = “org.apache.struts2.static template org.apache.struts2.interceptor.debugging”;
if(param!= null){
packages = param + “ ” + packages;
}
this.pathPrefixes = parse(packages);
}
//銷(xiāo)毀filter方法
public void destroy(){
if(dispatcher == null){
LOG.warn(“something is seriously wrong, Dispatcher is not initialized(null)”);
} else {
dispatcher.cleanup();
}
}
/**
* 處理一個(gè)Action或者資源請(qǐng)求
*
* filter嘗試將請(qǐng)求同action mapping相匹配
* 如果找到,將執(zhí)行dispatcher的serviceAction方法
* 如果Action處理失敗, doFilter將建立一個(gè)異常
*
* 如果請(qǐng)求靜態(tài)資源
* 資源將被直接復(fù)制給 response
*
* 如果找不到匹配Action 或者靜態(tài)資源,則直接跳出
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {
HttpServletRequest request =(HttpServletRequest)req;
HttpServletResponse response =(HttpServletResponse)res;
ServletContext servletContext = getServletContext();
String timerKey = “FilterDispatcher_doFilter: ”;
try {
UtilTimerStack.push(timerKey);
request = prepareDispatcherAndWrapRequest(request, response);
ActionMapping mapping;
try {
mapping=actionMapper.getMapping(request, dispatcher.getConfigurationManager());
} catch(Exception ex){
LOG.error(“error getting ActionMapping”, ex);
dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
return;
}
if(mapping == null){
String resourcePath = RequestUtils.getServletPath(request);
if(“".equals(resourcePath)&& null!= request.getPathInfo()){
resourcePath = request.getPathInfo();
}
if(serveStatic && resourcePath.startsWith(”/struts“)){
String name = resourcePath.substring(”/struts“.length());
findStaticResource(name, request, response);
} else {
//為一個(gè)普通的request, 則通過(guò)
chain.doFilter(request, response);
}
return;
} /**
*這個(gè)方法詢(xún)問(wèn)ActionMapper是否需要調(diào)用某個(gè)Action來(lái)處理這個(gè)(request)請(qǐng)求,*如果ActionMapper決定需要調(diào)用某個(gè)Action,*FilterDispatcher則把請(qǐng)求的處理交給ActionProxy
dispatcher.serviceAction(request, response, servletContext, mapping);
} finally {
try {
ActionContextCleanUp.cleanUp(req);
} finally {
UtilTimerStack.pop(timerKey);
}
} }
… …
}
在doFilter()方法中,將調(diào)用dispatcher.serviceAction,該方法如果找到相應(yīng)的Action,將把用戶(hù)請(qǐng)求交給ActionProxy。serviceAction()代碼在Dispatcher.java中,如代碼3.2所示。
代碼3.2 Dispatcher類(lèi)
public class Dispatcher {.../**
* 為mapping加載類(lèi),并調(diào)用相應(yīng)的方法或者直接返回result
*
* 根據(jù)用戶(hù)請(qǐng)求的參數(shù),建立Action上下文
* 根據(jù)指定的Action’名稱(chēng)和包空間名稱(chēng),加載一個(gè)Action代理 ActionProxy
* 然后Action的相應(yīng)方法將被執(zhí)行,*/
public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping)throws ServletException {
Map
//如果存在一個(gè)值棧,則建立一個(gè)新的并復(fù)制以備Action使用
ValueStack stack =(ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
if(stack!= null){
extraContext.put(ActionContext.VALUE_STACK, ValueStackFactory.getFactory().createValueStack(stack));
}
String timerKey = ”Handling request from Dispatcher“;
try {
UtilTimerStack.push(timerKey);
String namespace = mapping.getNamespace();
String name = mapping.getName();
String method = mapping.getMethod();
Configuration config = configurationManager.getConfiguration();
//FilterDispatcher把請(qǐng)求的處理交給ActionProxy
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, extraContext, true, false);
proxy.setMethod(method);
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
//ActionMapping 直接返回一個(gè)result
if(mapping.getResult()!= null){
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
if(stack!= null){
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
}
} catch(ConfigurationException e){
LOG.error(”Could not find action or result", e);
sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);
} catch(Exception e){
throw new ServletException(e);
} finally {
UtilTimerStack.pop(timerKey);
}
} …
}
從上面代碼中可以看出來(lái),Struts 2用于處理用戶(hù)請(qǐng)求的Action實(shí)例,并不是用戶(hù)實(shí)現(xiàn)的業(yè)務(wù)控制器,而是Action代理。關(guān)于Action代理相關(guān)內(nèi)容,讀者可以參考攔截器章節(jié)的介紹。
★ 提示 ★
前面一直在說(shuō)Action可以是一個(gè)普通的Java類(lèi),與Servlet API完全分離,但是為了實(shí)現(xiàn)業(yè)務(wù)邏輯,Action需要使用HttpServletRequest內(nèi)容。
Struts 2設(shè)計(jì)的精巧之處就是使用了Action代理,Action代理可以根據(jù)系統(tǒng)的配置,加載一系列的攔截器,由攔截器將HttpServletRequest參數(shù)解析出來(lái),傳入Action。同樣,Action處理的結(jié)果也是通過(guò)攔截器傳入HttpServletResponse,然后由HttpServletRequest傳給用戶(hù)。
其實(shí),該處理過(guò)程是典型的AOP(面向切面編程)的方式,讀者可以在后面詳細(xì)了解到。Struts 2處理過(guò)程模型如圖3.2所示。
圖3.2 Struts 2處理過(guò)程模型
★ 說(shuō)明 ★
攔截器是Struts 2框架的核心,通過(guò)攔截器,實(shí)現(xiàn)了AOP(面向切面編程)。使用攔截器,可以簡(jiǎn)化Web開(kāi)發(fā)中的某些應(yīng)用,例如,權(quán)限攔截器可以簡(jiǎn)化Web應(yīng)用中的權(quán)限檢查。
3.1.2
業(yè)務(wù)控制器Action
業(yè)務(wù)控制器Action是由開(kāi)發(fā)者自己編寫(xiě)實(shí)現(xiàn)的,Action類(lèi)可以是一個(gè)簡(jiǎn)單的Java類(lèi),與Servlet API完全分離。Action一般都有一個(gè)execute()方法,也可以定義其他業(yè)務(wù)控制方法,詳細(xì)內(nèi)容將在后面介紹。
Action的execute()返回一個(gè)String類(lèi)型值,這與Struts 1返回的ActionForward相比,簡(jiǎn)單易懂。Struts 2提供了一個(gè)ActionSupport工具類(lèi),該類(lèi)實(shí)現(xiàn)了Action接口和validate()方法,一般開(kāi)發(fā)者編寫(xiě)Action可以直接繼承ActionSupport類(lèi)。編寫(xiě)Action類(lèi)后,開(kāi)發(fā)者還必須在配置文件中配置Action。一個(gè)Action的配置應(yīng)該包含下面幾個(gè)元素:
1、該Action的name,即用戶(hù)請(qǐng)求所指向的URL。
2、Action所對(duì)應(yīng)的class元素,對(duì)應(yīng)Action類(lèi)的位置。
3、指定result邏輯名稱(chēng)和實(shí)際資源的定位。
Action是業(yè)務(wù)控制器,筆者建議在編寫(xiě)Action的時(shí)候,盡量避免將業(yè)務(wù)邏輯放到其中,盡量減少Action與業(yè)務(wù)邏輯模塊或者組件的耦合程度。
3.1.3
業(yè)務(wù)模型組件
業(yè)務(wù)模型組件可以是實(shí)現(xiàn)業(yè)務(wù)邏輯的模塊,可以是EJB、POJO或者JavaBean,在實(shí)際開(kāi)發(fā)中,對(duì)業(yè)務(wù)模型組件的區(qū)分和定義也是比較模糊的,實(shí)際上也超出了Struts 2框架的范圍。不同的開(kāi)發(fā)者或者團(tuán)隊(duì),都有自己的方式來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯模塊,Struts 2框架的目的就是使用Action來(lái)調(diào)用業(yè)務(wù)邏輯模塊。例如一個(gè)銀行存款的業(yè)務(wù)邏輯模塊,如代碼3.3所示。
代碼3.3 模擬一個(gè)銀行業(yè)務(wù)的實(shí)現(xiàn)模塊
package ch3;
public class Bank {
//定義銀行賬戶(hù)
private String accounts;
//定義操作金額
private double money;
//屬性的getter和setter方法
public String getAccounts(){
return accounts;
}
public void setAccounts(String accounts){
this.accounts = accounts;
}
public double getMoney(){
return money;
}
public void setMoney(double money){
this.money = money;
}
//模擬銀行存款方法
public boolean saving(String accounts, double money){
//調(diào)用DAO等模塊讀寫(xiě)數(shù)據(jù)庫(kù)
return dosomeing();
}
}
上面實(shí)例在實(shí)際開(kāi)發(fā)中沒(méi)有任何意義,這里只是作為業(yè)務(wù)邏輯模塊來(lái)說(shuō)明,在執(zhí)行saving(String accounts,double money)方法時(shí),可以調(diào)用相應(yīng)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)其他組件,來(lái)實(shí)現(xiàn)存款操作。使用Action調(diào)用該業(yè)務(wù)邏輯組件可以在execute()方法中實(shí)現(xiàn),如代碼3.4所示。
代碼3.4 業(yè)務(wù)控制器Bank_Saving_Action
package ch3;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Bank_Saving_Action extends ActionSupport {
//定義銀行賬戶(hù)
private String accounts;
//定義操作金額
private double money;
public String execute()throws Exception {
//創(chuàng)建Bank實(shí)例
Bank bk=new Bank();
//調(diào)用存款方法
if(bk.saving(accounts, money)){
return SUCCESS;
}else{
return ERROR;
} }
//屬性的getter和setter方法
public String getAccounts(){
return accounts;
}
public void setAccounts(String accounts){
this.accounts = accounts;
}
public double getMoney(){
return money;
}
public void setMoney(double money){
this.money = money;
}
Bank_Saving_Action演示了對(duì)銀行存款業(yè)務(wù)邏輯組件的調(diào)用,這里是通過(guò)在Action中創(chuàng)建業(yè)務(wù)邏輯組件實(shí)例的方式實(shí)現(xiàn)的。在實(shí)際開(kāi)發(fā)中,可以使用靜態(tài)工廠獲得業(yè)務(wù)邏輯組件的實(shí)例或者使用IoC容器來(lái)管理。Action中不實(shí)現(xiàn)任何業(yè)務(wù)邏輯,只是負(fù)責(zé)組織調(diào)度業(yè)務(wù)邏輯組件。調(diào)用關(guān)系如圖3.3所示。
圖3.3 調(diào)用業(yè)務(wù)邏輯組件
★ 說(shuō)明 ★
業(yè)務(wù)控制器Action一般情況下不是直接創(chuàng)建業(yè)務(wù)邏輯組件實(shí)例,而是使用工廠模式或者是從Spring容器中獲得業(yè)務(wù)邏輯組件實(shí)例,這樣可以提高系統(tǒng)的性能。
3.1.4
視圖組件
Struts 1只能支持JSP作為視圖資源,而Struts 2的進(jìn)步之處就是可以使用其他視圖技術(shù),如FreeMarker、Velocity等。通過(guò)前面的學(xué)習(xí)和示例,讀者會(huì)知道Action的返回結(jié)果只是一個(gè)簡(jiǎn)單的字符串,也就是一個(gè)邏輯上的視圖名稱(chēng),要與實(shí)際視圖資源對(duì)應(yīng),必須通過(guò)配置文件來(lái)實(shí)現(xiàn)。
在struts.xml配置文件中,每一個(gè)Aciton定義都有name和class屬性,同時(shí)還要指定result元素。result元素指定了邏輯視圖名稱(chēng)和實(shí)際視圖的對(duì)應(yīng)關(guān)系。每個(gè)result都有一個(gè)type屬性,前面介紹的struts.xml中并沒(méi)有顯式指定type值,即使用了默認(rèn)的type類(lèi)型:dispatcher,該結(jié)果類(lèi)型支持JSP所謂視圖資源。
對(duì)于Struts 2的視圖技術(shù)和result返回類(lèi)型,后面將詳細(xì)介紹。
第四篇:電動(dòng)車(chē)控制器的標(biāo)準(zhǔn)和電動(dòng)車(chē)控制器購(gòu)買(mǎi)需要注意事項(xiàng)
電動(dòng)車(chē)控制器的標(biāo)準(zhǔn)和電動(dòng)車(chē)控制器購(gòu)買(mǎi)需要注意事項(xiàng) 提到電動(dòng)車(chē)最重要的部件,首先想到的就是電動(dòng)車(chē)控制器,而提到電動(dòng)車(chē)控制器品牌,首先想的一定是高標(biāo)科技。
作為一家集研發(fā)、生產(chǎn)、銷(xiāo)售為一體的國(guó)家級(jí)高新技術(shù)企業(yè),高標(biāo)科技目前擁有電動(dòng)車(chē)控制器、摩托車(chē)/電動(dòng)車(chē)防盜器、電動(dòng)車(chē)充電器以及電動(dòng)交通工具解決方案四大產(chǎn)品線(xiàn),是國(guó)內(nèi)領(lǐng)先的電動(dòng)交通工具控制系統(tǒng)解決方案供應(yīng)商?,F(xiàn)在光高標(biāo)科技一家就占了電動(dòng)車(chē)控制器32%的市場(chǎng)份額,特別威武霸氣啊對(duì)不對(duì)!
我的電動(dòng)車(chē)控制器被偷了之后,打算自己買(mǎi)一個(gè),然后聽(tīng)了朋友介紹,聽(tīng)說(shuō)高標(biāo)控制器很好,就去網(wǎng)上搜了下。高標(biāo)科技有自己的官方網(wǎng)站,就叫高標(biāo)商城,電動(dòng)車(chē)控制器、電動(dòng)車(chē)充電器、電動(dòng)車(chē)防盜器,在上面都有賣(mài)的。高標(biāo)本來(lái)就是大企業(yè),他們的合作伙伴都是全國(guó)整車(chē)制造前30強(qiáng),只生產(chǎn)高端先進(jìn)的產(chǎn)品,質(zhì)量好性能好,特別有保障。他們官網(wǎng)賣(mài)的東西也比較權(quán)威可信,而且不會(huì)出現(xiàn)自己去一般配件店買(mǎi)東西,人家惡意加價(jià)的情況。
正好我買(mǎi)的時(shí)候,高標(biāo)商城搞活動(dòng),還有折扣呢,感覺(jué)特別劃算。另外就是高標(biāo)控制器有自學(xué)習(xí)功能,能夠自動(dòng)識(shí)別電機(jī)角度、相位、相線(xiàn),方便消費(fèi)者自己更換電動(dòng)車(chē)控制器。而且高標(biāo)控制器從外觀上甩出其他品牌幾條街啊,就拿我原來(lái)那個(gè)充電器來(lái)說(shuō),做工真的一般,外觀真的真的很一般。我以前沒(méi)感覺(jué),結(jié)果這次拿到高標(biāo)控制器,才發(fā)現(xiàn)原來(lái)控制器可以做的那么高大上。整個(gè)控制器都是那種拉絲工藝做成的,顏色很正,用料也很考究。最后就是高標(biāo)控制器的防水性能也特別好,馬上夏天了,會(huì)經(jīng)常下雨,用個(gè)好點(diǎn)的控制器自己也省心啊。
第五篇:機(jī)房空調(diào)控制器系統(tǒng)介紹
上海中光信息工程有限公司
機(jī)房空調(diào)控制器介紹
通信運(yùn)營(yíng)商在基站建設(shè)中絕大部分基站采用民用舒適性空調(diào),由于舒適空調(diào)設(shè)計(jì)目的是為了在有人空間內(nèi),將溫度調(diào)整到人體比較舒適的溫度,其設(shè)計(jì)溫度為設(shè)定溫度正負(fù)1度左右。而基站內(nèi)的空調(diào)主要服務(wù)于設(shè)備,設(shè)備的溫度范圍根據(jù)規(guī)范要求有10度左右的溫寬。這就為通過(guò)節(jié)能型智能空調(diào)控制器對(duì)舒適性空調(diào)的溫度范圍進(jìn)行智能化控制,實(shí)現(xiàn)在基站這樣特定應(yīng)用場(chǎng)景中通過(guò)寬溫控制手段,從而避免空調(diào)壓縮機(jī)相對(duì)頻繁啟動(dòng)所造成的不必要的能源浪費(fèi),以實(shí)現(xiàn)節(jié)能的目的。
博德?tīng)柟?jié)能型空調(diào)智能節(jié)電器技術(shù)特點(diǎn):
1.全智能自動(dòng)控制:采用單片機(jī)進(jìn)行編程,所有設(shè)置功能全自動(dòng)執(zhí)行;
面板直觀顯示:控制器面板可直觀顯示設(shè)定的開(kāi)關(guān)機(jī)溫度,及機(jī)房溫度,方便本地查詢(xún);
2.設(shè)置功能:可設(shè)置空調(diào)開(kāi)關(guān)機(jī)的溫度,適應(yīng)不同應(yīng)用場(chǎng)景的需求。
3.空調(diào)控制方式:具有空調(diào)電源、面板、紅外控制等至少2種以上的控制方式,適不同類(lèi)
型空調(diào)。
4.監(jiān)控功能:設(shè)備配有RS485通信接口,提供開(kāi)放的通信協(xié)議(接口通信協(xié)議滿(mǎn)足
YD/T1363.3-2005中B.13要求)。方便客戶(hù)納入監(jiān)控系統(tǒng),可直接接入監(jiān)控采集器或其他智能采集設(shè)備。
5.電源安全性:多重防雷設(shè)計(jì),包括輸入電源、接口、器件均根據(jù)基站防雷相關(guān)標(biāo)準(zhǔn)設(shè)計(jì)了防雷保護(hù)措施。寬電壓設(shè)計(jì)工作穩(wěn)定。從而達(dá)到運(yùn)營(yíng)商級(jí)的產(chǎn)品。絕非民用級(jí)產(chǎn)品。
6.權(quán)限設(shè)置:系統(tǒng)設(shè)置了使用權(quán)限設(shè)定,避免了誤操作及越權(quán)操作。
7.消防安全:全金屬外殼,所以線(xiàn)纜均采用阻燃電纜及輔材。并設(shè)有消防聯(lián)動(dòng)接口,避免在火災(zāi)情況下啟動(dòng)空調(diào)。接入后火災(zāi)狀態(tài)下立即關(guān)閉空調(diào)。
8.程序自保護(hù)設(shè)計(jì):程序中對(duì)于空調(diào)設(shè)定溫度范圍設(shè)計(jì)有一點(diǎn)區(qū)間,任何誤設(shè)定或違反節(jié)能邏輯目的的設(shè)定均為無(wú)效設(shè)定。
9.低功耗:設(shè)備本身設(shè)計(jì)功耗極低,為毫安級(jí)功耗。
10.空調(diào)工作狀態(tài)反饋:具有空調(diào)工作狀態(tài)反饋設(shè)計(jì),確??照{(diào)的開(kāi)關(guān)可靠。
11.接口冗余設(shè)計(jì):可根據(jù)用戶(hù)需求預(yù)留增值功能接口,如空調(diào)過(guò)濾網(wǎng)堵塞狀態(tài)告警,方便維護(hù)人員的運(yùn)維工作。
12.免維護(hù):設(shè)備安裝后無(wú)需維護(hù),設(shè)備內(nèi)置自檢程序,如發(fā)現(xiàn)自身器件發(fā)生故障將自動(dòng)切出,恢復(fù)空調(diào)自運(yùn)行模式。