<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 電源與新能源 > 設(shè)計應(yīng)用 > 鋰離子電池組監(jiān)控系統(tǒng)研究與實現(xiàn) ― 上位機(jī)程序設(shè)計

          鋰離子電池組監(jiān)控系統(tǒng)研究與實現(xiàn) ― 上位機(jī)程序設(shè)計

          作者: 時間:2018-08-28 來源:網(wǎng)絡(luò) 收藏

          在鋰離子電池監(jiān)控系統(tǒng)中,除了下位機(jī)單片機(jī)系統(tǒng)電路板及其程序設(shè)計外,還需要上位機(jī)程序?qū)︿囯x子電池系統(tǒng)的進(jìn)行各種監(jiān)控管理設(shè)置。根據(jù)系統(tǒng)要求,上位機(jī)程序的主要功能有以下幾個:

          本文引用地址:http://www.ex-cimer.com/article/201808/387858.htm

          1.接收并顯示下位機(jī)采集的各路數(shù)據(jù)信息,包含16路鋰電池電壓、主回路充放電電流、4路溫度、電量等數(shù)據(jù)信息;

          2.設(shè)置下位機(jī)工作時需要配置的系統(tǒng)參數(shù);

          3.校正下位機(jī)上傳的各路數(shù)據(jù);

          4.根據(jù)需要保存下位機(jī)上傳的數(shù)據(jù)。

          該上位機(jī)程序采用VC++6.0編程工具進(jìn)行程序設(shè)計,本章對上位機(jī)程序的設(shè)計思想和內(nèi)容進(jìn)行了描述。

          5.1上位機(jī)程序

          開發(fā)平臺及相關(guān)技術(shù)上位機(jī)程序采用非常流行的可視化編程工具VC++6.0進(jìn)行開發(fā),為完成相應(yīng)的顯示和設(shè)置功能,程序采用了許多VC++6.0自帶的控件,同時應(yīng)用了多線程編程技術(shù)。

          5.1.1 VC++6.0簡介

          VC++6.0是微軟公司開發(fā)的編程平臺,具有強(qiáng)大的功能。本軟件是基于Windows系統(tǒng)開發(fā)的,編程語言采用的是C++語言,并且微軟給該軟件提供了功能強(qiáng)大的MFC(Microsoft Foundation Class)類庫。MFC中封裝了大部分Windows API函數(shù)和Windows控件,它包含的功能涉及到整個Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是從一個比較高的起點編程,故節(jié)省了大量的時間。另外,它提供了大量的代碼,指導(dǎo)用戶編程時實現(xiàn)某些技術(shù)和功能。因此,使用VC++可以使程序員更加方便的進(jìn)行應(yīng)用程序開發(fā)。

          5.1.2相關(guān)控件介紹

          系統(tǒng)使用了Edit Box控件、Static Text控件、Button控件、Group Box控件、Check Box控件、Combo Box控件、Tab Control控件和MSComm控件八個控件,本部分對這些控件進(jìn)行簡單介紹。

          1.Edit Box控件CEdit類提供了Windows編輯控件中的功能。編輯控件是一個子窗口矩形,用戶可以向其中輸入文本??梢酝ㄟ^對話模板或直接從代碼中創(chuàng)建一個編輯控件。

          在兩種情形下,首先調(diào)用CEdit構(gòu)造程序構(gòu)造CEdit對象,再調(diào)用Create成員函數(shù)創(chuàng)建Windows編輯控件并將其與CEdit對象連接。

          2.Static Text控件CStatic類提供了一個Windows靜態(tài)控件的性能。一個靜態(tài)控件用來顯示一個文本字符串、框、矩形、圖標(biāo)、光標(biāo)、位圖或增強(qiáng)的圖元文件。它可以被用來作為標(biāo)簽、框或用來分隔其它的控件。一個靜態(tài)控件不接收輸入,也不提供輸出;但是,如果它是用SS_NOTIFY風(fēng)格創(chuàng)建的,則它可以通知其父有關(guān)設(shè)備點擊的消息。

          3.Button控件類CButton提供了對Windows按鈕控件的操作。按鈕控件是一個小的矩形子窗口,可以通過單擊選中(按下)或不選中。按鈕可以單獨使用,也可以成組使用,它還可以具有文本標(biāo)題。在用戶單擊它的時候,按鈕通常要改變顯示外觀。

          典型的按鈕控件有:復(fù)選框、單選鈕和下壓式按鈕(push button)。一個CButton對象可以是它們中的一種,這由它的按鈕風(fēng)格和成員函數(shù)Create的初始化決定。

          4.Check Box控件CheckBox控件就是我們一般所說的復(fù)選框,通常用于某選項的打開或關(guān)閉。

          大多數(shù)應(yīng)用程序的“設(shè)置”對話框內(nèi)均有此控件。我們看到的可以打勾的就是CheckBox.該控件表明一個特定的狀態(tài)(即選項)是選定(on,值為1)還是清除(off,值為0)。在應(yīng)用程序中使用該控件為用戶提供“True/False”或“yes/no”的選擇。因為CheckBox彼此獨立工作,所以用戶可以同時選擇任意多個CheckBox,進(jìn)行選項組合。

          5.Combo Box控件類CCombo Box封裝了Windows組合框。組合框由一個列表框和一個靜態(tài)控件(或編輯控件)組成。列表框部分可以是一直顯示的,也可以是隱藏的,在用戶單擊編輯控件邊上的按鈕(下拉箭頭)時下拉該列表框。列表框中當(dāng)前選中的項(如果有的話)顯示在靜態(tài)控件或編輯控件中。如果組合框帶有下拉風(fēng)格,則當(dāng)用戶在編輯框中輸入列表項的開始字符時,對應(yīng)項(如果有的話)中的第一個將會加亮顯示。

          可以從對話框模板中建立一個CComboBox對象,也可以直接在代碼中創(chuàng)建。

          無論采用哪種方法,都要先調(diào)用CComboBox的構(gòu)造函數(shù)構(gòu)造一個CComboBox對象,然后調(diào)用成員函數(shù)Create創(chuàng)建控件并在CComboBox對象上應(yīng)用它。

          消息映射入口的格式如下:

          ON_Notification( id,memberFxn )

          其中id指定了發(fā)送通知的組合框控件的子窗口ID,而memberFxn是用于處理該通知的父成員函數(shù)的名字。

          父窗口的函數(shù)原型的格式如下:

          afx_msg void memberFxn( );

          6.Tab Control控件一個“標(biāo)簽控件”類似于一個筆記本中的分隔器,或一個文件柜上的標(biāo)簽。通過使用標(biāo)簽控件,應(yīng)用程序可以將一個窗口或?qū)υ捒虻南嗤瑓^(qū)域定義為多個頁面。

          每一頁包含了一套信息或一組控件,當(dāng)用戶選擇了相應(yīng)的標(biāo)簽時應(yīng)用程序就會顯示相應(yīng)的信息或控件。一種特殊類型的標(biāo)簽控件把標(biāo)簽顯示得像按鈕一樣。點擊一個按鈕將立即執(zhí)行一條命令而不是顯示一個頁。

          CTabCtrl類提供了Windows通用標(biāo)簽控件的性能。這個控件(也就是CTabCtrl類)只對運行在Windows 95和Windows NT 3.51或更新版本下的程序來說是可用的。

          7.Group Box控件Group Box控件本質(zhì)上確實是class CStatic的一個實例化對象。在一個對話框上布置好一個Group Box控件后,默認(rèn)ID為IDC_STATIC,這時候是無法在代碼里動態(tài)地控制它的隱藏/顯示屬性。必須給它一個新的ID號,比如IDC_GROUPBOX1,最后再給它關(guān)聯(lián)一個CStatic控件變量(這個你應(yīng)該自己會吧),然后就可以在必要時候(另一個控件被選擇)調(diào)用ModifyStyle(0,SWP_HIDEWINDOW/*SWP_SHOWWINDOW*/);實現(xiàn)Group Box的隱藏/顯示狀態(tài)的動態(tài)切換。

          8. MSComm控件Visual C++為我們提供了一種好用的ActiveX控件Microsoft Communications

          Control(即MSComm)來支持應(yīng)用程序?qū)Υ诘脑L問,在應(yīng)用程序中插入MSComm控件后就可以較為方便地實現(xiàn)對通過計算機(jī)串口收發(fā)數(shù)據(jù)。

          使用VC++提供的串行控件MSComm進(jìn)行編程,首先,在對話框中創(chuàng)建控件,若Control工具欄中缺少該控件,可通過菜單Project ——>Add to Project——> Components and Control插入即可,再將該控件從工具箱中拉到對話框中。此時,你只需要關(guān)心控件提供的對Windows通訊驅(qū)動程序的API函數(shù)的接口。換句話說,只需要設(shè)置和監(jiān)視MSComm控件的屬性和事件。

          在ClassWizard中為新創(chuàng)建的控件定義成員對象(CMSComm m_Serial),通過該對象便可以對串口屬性進(jìn)行設(shè)置,MSComm控件共有27個屬性,這里只介紹其中幾個常用屬性:CommPort設(shè)置并返回通訊端口號,缺省為COM1. Settings以字符串的形式設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位。

          PortOpen設(shè)置并返回通訊端口的狀態(tài),也可以打開和關(guān)閉端口。

          Input從接收緩沖區(qū)返回和刪除字符。

          Output向發(fā)送緩沖區(qū)寫一個字符串。

          InputLen設(shè)置每次讀入的字符個數(shù),缺省值為0,表明讀取接收緩沖區(qū)中的全部內(nèi)容。

          InBufferCount返回接收緩沖區(qū)中已接收到的字符數(shù),將其置0可以清除接收緩沖區(qū)。

          InputMode定義Input屬性獲取數(shù)據(jù)的方式(為0:文本方式;為1:二進(jìn)制方式)。

          RThreshold和SThreshold屬性,表示在OnComm事件發(fā)生之前,接收緩沖區(qū)或發(fā)送緩沖區(qū)中可以接收的字符數(shù)。

          打開所需串口后,需要考慮串口通信的時機(jī)。在接收或發(fā)送數(shù)據(jù)過程中,可能需要監(jiān)視并響應(yīng)一些事件和錯誤,所以事件驅(qū)動是處理串行端口交互作用的一種非常有效的方法。使用OnComm事件和CommEvent屬性捕捉并檢查通訊事件和錯誤的值。發(fā)生通訊事件或錯誤時,將觸發(fā)OnComm事件,CommEvent屬性的值將被改變,應(yīng)用程序檢查CommEvent屬性值并作出相應(yīng)的反應(yīng)。

          5.2上位機(jī)程序方案

          上位機(jī)程序主要完成數(shù)據(jù)顯示、參數(shù)設(shè)置、存儲器讀取、數(shù)據(jù)校正等功能。

          該程序通過串口與下位機(jī)板進(jìn)行通信,將需要顯示的信息和設(shè)置的參數(shù)等信息進(jìn)行傳輸。

          上位機(jī)程序功能框圖如下圖5.1所示。


          上一頁 1 2 下一頁

          關(guān)鍵詞: 測試 通信

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();