EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
锂离子电池组监控系统研究与实现 — 上位机程序设计 0 {9 a: @( d" z3 K
) T2 f ^4 m+ A8 N* V. b0 d! J: M0 T
在锂离子电池监控系统中,除了下位机 单片机系统电路板及其程序设计外,还需要上位机程序对锂离子电池系统的进行各种监控管理设置。根据系统要求,上位机程序的主要功能有以下几个: 1.接收并显示下位机采集的各路数据信息,包含16路锂电池电压、主回路充放电电流、4路温度、电量等数据信息; 2.设置下位机工作时需要配置的系统参数; 3.校正下位机上传的各路数据; 4.根据需要保存下位机上传的数据。# W( R* r3 q! p$ v5 R6 q# y; S
8 F6 n/ Q9 G# c: d6 ?) Z( S' u
该上位机程序采用VC++6.0编程工具进行程序设计,本章对上位机程序的设计思想和内容进行了描述。- J+ J! X2 \, k; n7 r
8 u1 j9 k' z1 Z0 k
5.1上位机程序 开发平台及相关技术上位机程序采用非常流行的可视化编程工具VC++6.0进行开发,为完成相应的显示和设置功能,程序采用了许多VC++6.0自带的控件,同时应用了多线程编程技术。
- s. ]9 t& A9 l
E _; t# r, d' T: q$ s3 |! F }5.1.1 VC++6.0简介 VC++6.0是微软公司开发的编程平台,具有强大的功能。本软件是基于Windows系统开发的,编程语言采用的是C++语言,并且微软给该软件提供了功能强大的MFC(Microsoft Foundation Class)类库。MFC中封装了大部分Windows API函数和Windows控件,它包含的功能涉及到整个Windows操作系统。MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC++可以使程序员更加方便的进行应用程序开发。
. \: {" ^2 \7 y, T. ~; ^! |6 \, {+ C' |! `8 v n; K! K5 A
5.1.2相关控件介绍 系统使用了Edit Box控件、Static Text控件、Button控件、Group Box控件、Check Box控件、Combo Box控件、Tab Control控件和MSComm控件八个控件,本部分对这些控件进行简单介绍。+ l/ C/ _ d5 G. L R9 s* Q( b6 m
$ I1 K2 _$ \! j0 u: |! l: t4 B: q1.Edit Box控件CEdit类提供了Windows编辑控件中的功能。编辑控件是一个子窗口矩形,用户可以向其中输入文本。可以通过对话模板或直接从代码中创建一个编辑控件。7 `0 R1 W, E! s) u
" x* F0 P4 v T. r! K1 O在两种情形下,首先调用CEdit构造程序构造CEdit对象,再调用Create成员函数创建Windows编辑控件并将其与CEdit对象连接。
. m& r+ u8 U' V+ j' D" i
# ~1 o9 z5 O Q' F* z2.Static Text控件CStatic类提供了一个Windows静态控件的性能。一个静态控件用来显示一个文本字符串、框、矩形、图标、光标、位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件不接收输入,也不提供输出;但是,如果它是用SS_NOTIFY风格创建的,则它可以通知其父有关设备点击的消息。
4 }9 M7 x7 H+ i5 R" G, \! E! A7 I" q1 W' q( f6 F. z8 n! P
3.Button控件类CButton提供了对Windows按钮控件的操作。按钮控件是一个小的矩形子窗口,可以通过单击选中(按下)或不选中。按钮可以单独使用,也可以成组使用,它还可以具有文本标题。在用户单击它的时候,按钮通常要改变显示外观。
3 B4 l5 @7 S# e. N, G+ p. H7 m) L6 _% U5 l/ x0 r% s* a
典型的按钮控件有:复选框、单选钮和下压式按钮(push button)。一个CButton对象可以是它们中的一种,这由它的按钮风格和成员函数Create的初始化决定。
[- D! O( t- Y" j4 s. T
) \. A+ _3 W( W; c4.Check Box控件CheckBox控件就是我们一般所说的复选框,通常用于某选项的打开或关闭。
/ T% i8 V2 F! q( r' h+ s" H) r. e3 I7 M7 x& j7 ~* i
大多数应用程序的“设置”对话框内均有此控件。我们看到的可以打勾的就是CheckBox.该控件表明一个特定的状态(即选项)是选定(on,值为1)还是清除(off,值为0)。在应用程序中使用该控件为用户提供“True/False”或“yes/no”的选择。因为CheckBox彼此独立工作,所以用户可以同时选择任意多个CheckBox,进行选项组合。7 R( ~. ~" {( h$ x7 g
" |+ T1 I; M5 f# L& P6 J
5.Combo Box控件类CCombo Box封装了Windows组合框。组合框由一个列表框和一个静态控件(或编辑控件)组成。列表框部分可以是一直显示的,也可以是隐藏的,在用户单击编辑控件边上的按钮(下拉箭头)时下拉该列表框。列表框中当前选中的项(如果有的话)显示在静态控件或编辑控件中。如果组合框带有下拉风格,则当用户在编辑框中输入列表项的开始字符时,对应项(如果有的话)中的第一个将会加亮显示。
! M8 x1 }, G% L. \8 n I- T8 q" D9 P& ^# X+ m
可以从对话框模板中建立一个CComboBox对象,也可以直接在代码中创建。
; i7 Z, m; s5 w2 l) G
- ~( }5 h; _& e5 L. j: ]: Z无论采用哪种方法,都要先调用CComboBox的构造函数构造一个CComboBox对象,然后调用成员函数Create创建控件并在CComboBox对象上应用它。
7 d1 _% i1 I8 f
$ j$ W1 z5 j! b消息映射入口的格式如下: ON_Notification( id,membe RFxn )
4 p3 {& G% v, R* Q9 @+ \; [& _
) w3 E$ G# w) a7 q/ v其中id指定了发送通知的组合框控件的子窗口ID,而memberFxn是用于处理该通知的父成员函数的名字。
8 t( Q# d% R# }% P5 c7 q) L3 z2 T
& d, M9 R h+ C& T4 Q$ b父窗口的函数原型的格式如下: afx_msg void memberFxn( ); 6.Tab Control控件一个“标签控件”类似于一个笔记本中的分隔器,或一个文件柜上的标签。通过使用标签控件,应用程序可以将一个窗口或对话框的相同区域定义为多个页面。
' X7 J5 K: r, C/ G2 d: q! D! j# X% z' H1 Y: t3 g/ J& C0 O3 y( l: q7 I
每一页包含了一套信息或一组控件,当用户选择了相应的标签时应用程序就会显示相应的信息或控件。一种特殊类型的标签控件把标签显示得像按钮一样。点击一个按钮将立即执行一条命令而不是显示一个页。0 v& f p2 S' v8 G" E
$ B, I) ]% T8 b- Y
CTabCtrl类提供了Windows通用标签控件的性能。这个控件(也就是CTabCtrl类)只对运行在Windows 95和Windows NT 3.51或更新版本下的程序来说是可用的。
( h( q- N" |( |- Z& }9 F4 O+ u5 E
7.Group Box控件Group Box控件本质上确实是class CStatic的一个实例化对象。在一个对话框上布置好一个Group Box控件后,默认ID为IDC_STATIC,这时候是无法在代码里动态地控制它的隐藏/显示属性。必须给它一个新的ID号,比如IDC_GROUPBOX1,最后再给它关联一个CStatic控件变量(这个你应该自己会吧),然后就可以在必要时候(另一个控件被选择)调用ModifyStyle(0,SWP_HIDEWINDOW/*SWP_SHOWWINDOW*/);实现Group Box的隐藏/显示状态的动态切换。
7 z; E: K7 \' \+ s/ c1 N* y! H
{+ j6 h7 c/ a8. MSComm控件Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications6 L' f4 `5 t& T. c, ?
7 y" I, S" O0 u; V! ~Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控件后就可以较为方便地实现对通过计算机串口收发数据。
1 o) T5 K0 B( m% ]; f; ~4 {) ]4 W2 @+ }: T
使用VC++提供的串行通信控件MSComm进行编程,首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project ——>Add to Project——> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows通讯驱动程序的API函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。/ p; d; B( i- ?7 i5 s5 Y% R3 ~7 O& k
( a) }; B) ^0 g" V, B# u2 X
在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性:CommPort设置并返回通讯端口号,缺省为COM1. Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
' t4 B" t3 d W' y
4 L9 g r' Y. X5 m0 ZPortOpen设置并返回通讯端口的状态,也可以打开和关闭端口。
0 `; y- t$ U7 U' J% ~+ L: I2 k* [, f$ p' @5 b. ~0 ^
Input从接收缓冲区返回和删除字符。
7 y- F; P) K& w/ B$ j
$ ~& {/ G# r1 EOutput向发送缓冲区写一个字符串。2 X. [ f. Y2 }& z
! B2 O! v. `8 H& I* ?) Z4 ^
InputLen设置每次读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。% |* ~# h0 J5 _% T# a5 U4 t
# Q' b6 X$ B6 m) KInBufferCount返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。
/ \/ t8 y( B7 ?1 I) F1 C
2 O3 V$ @( q, D9 H5 @- z8 B; J! MInputMode定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。
% q ~1 Q2 Y- `' a6 |6 x, @) I, m
, Q, z; L$ e- IRThreshold和SThreshold属性,表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。8 p& @* o6 Y2 \( M6 [8 d
! n2 E8 _2 B4 L) I: C打开所需串口后,需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通讯事件和错误的值。发生通讯事件或错误时,将触发OnComm事件,CommEvent属性的值将被改变,应用程序检查CommEvent属性值并作出相应的反应。0 X% M- f6 M' R* Q
2 {( V6 a3 g1 d1 W- X9 N! d5.2上位机程序方案 上位机程序主要完成数据显示、参数设置、存储器读取、数据校正等功能。 ! q0 {6 |" `) o9 B F
5 g0 X4 M5 [4 K1 G; I; ]- K该程序通过串口与下位机板进行通信,将需要显示的信息和设置的参数等信息进行传输。
5 {6 u- a2 g7 s- o( W0 Q3 B+ L. h7 U+ R/ i' A
上位机程序功能框图如下图5.1所示。 . S0 W3 I5 d$ M5 ~2 x0 B$ r' y
( f$ H+ G/ [# ~, h8 [0 s7 D/ h: k7 ? L6 t3 y* y0 {, K! M' b
# I# ]! q3 P0 x/ d( q, i
图中下位机通过串口与上位机进行数据通信。根据通信协议,将双方传输的数据进行转换,得到对应的数值,在进行相应的操作。
* B$ f) ^' M! t4 H! i, `- q9 L9 Z `$ ~, ^
下面分别对数据显示、参数设置、数据保存、数据校正等功能进行如下分析。 , o" J' ]1 R0 T0 t4 L/ v/ ^6 O
K4 ]0 A9 P, A
5.2.1数据显示 上位机程序的数据显示功能直接放置在主程序界面上,如下图5.2所示。 4 C/ O1 L% c$ r) T, g
( e$ d+ R, x& i: j4 v3 ` 8 t& s6 _; r- N6 [% B% f; J$ B
E8 a# j( n8 O$ ]$ p \0 B- Z% a* [主界面主要包含显示锂电池电压、温度、电流、电量、状态等信息的文本控件和参数设置、数据校正、存储器读写的按钮以及保存数据的选项,另外还可对串口号进行选择。 1 T& }; B( Q% c3 x' {# g* u
% A j) X. G# d) [7 w( M# d5.2.2参数设置 参数设置子窗口如图5.3所示。由于需要设置的参数较多,所以在参数设置子窗口中将所有参数分为系统参数、电流参数、电压参数、温度参数、均衡参数、电量参数和版本参数共七类,在一个复选页中进行显示和设置。 : w% `. q, @( D+ B* n: Y I
, S2 V1 M, h( r
; f) d }+ J& b" N4 W6 L+ r+ `; X# Q/ D& Y- p$ M7 N. N
系统参数包含电池类型、电池数、电池内阻、数据采样频率、睡眠模式使能、睡眠模式唤醒时间、用户权限、系统密码等。 " o& d- v' k5 B7 H1 e
$ e! X5 Q) n: d电流参数包含充电过载电流、放电过载电流、判断过载电流持续时间、短路电流、放电过流恢复时间、充电过流恢复时间、短路恢复时间等。
; |/ [8 {1 V/ W; }$ q [5 R# [
. h1 U9 `+ b7 _ c$ N电压参数包含过充电压、释放过充电压、过放电压、释放过放电压、最大不平衡电压、判断过充过放电压持续时间等。 $ U6 d1 G& B/ {. p4 ^' R
* p# |& A& t3 K+ J: F
温度参数包含外部温度通道1使能、外部温度通道2使能、判断温度超范围持续时间、可承受外部最高温度、释放可承受外部最高温度、可承受外部最低温度、释放可承受外部最低温度、可承受内部最高温度、释放可承受内部最高温度、可承受内部最低温度、释放可承受内部最低温度等。
) q% @: j, u( o, G$ W* e' i4 S- u/ O, W# Q; x" r( G- z
均衡参数包含均衡使能、每组均衡电池数、均衡模式、均衡开始电压、均衡压差等。
K" b: G( z6 {: i0 h# P! n
6 Z! p$ B0 l: x2 n# b电量测量参数包括电量测量电压一、测量电压二、测量电压三、测量电压四、测量电压五等。 - _5 q0 I, u0 r$ U' u; W7 h
. U4 O8 f$ ?1 H! e" Q) Z! d$ ~2 B另外,还有版本版本号、工厂名、设备编号等。
+ s5 {. N4 w' D) ?* l r* y4 ~+ g6 T" c& ?1 o( s. [
5.2.3数据校正 数据校正子窗口如图5.4所示。 2 A& e. c7 v: h9 N
; T' O7 G, P8 n$ V 0 Q3 ]3 \- ~8 u2 v: f% q: ^# O* }9 U
4 @9 S- |0 X; J3 ~8 R: C. I8 W校正采用线性修复法,即利用公式:A=K*S+B进行校正,其中A表示实际测量值,S表示通过系统获取的原始采样值,K为修正系数,B为修正基址。 . e& u- g6 V! {) \" |, t, F
. b" ^" ^7 H+ R3 ~校正过程中对,对每一路采样电路的采样值和实测值进行若干组采集。根据上述公式,每两组组成一个二元一次方程,计算出若干个修正系数和修正基址并求平均值,获得本路采样电路的修正系数和修正基址。 5 p( c n9 g- \% j E, G. F
3 I- N! \5 B/ H( M% V
在上位机软件中,接收下位机传送过来的21路信号的实测值和采样值。通过两次接收,可分别得到21路采样信号的两组实测值和采样值,按上述计算方法分别计算出各路采样电路的修正系数和修正基址,按通信协议发送给下位机。 9 u; M% @8 J$ A1 _7 b+ k* _5 n# |
. [# x0 T( n9 i4 ^! E) `& I
5.2.4存储器读写 存储器读写子窗口如图5.5所示。 : O! ]3 `9 _9 Z, ?2 ]: ~
) l9 F* i. P9 G9 e; D* l
! f: J+ g# h. Z+ \9 ^* f: | N# ~8 F$ M7 O( v8 X. l; J% ^ L( |
在存储器读写子窗口中,有读存储器、写存储器、存储器擦除三个按钮,可分别读出指定存储单元的数据、将指定数据写入指定单元、擦除存储器所有单元。
2 |- ]- x! k/ ]& S* h9 ]" e) e. J
( e2 C8 b8 p. g* i0 p, F9 _# t1 b4 p5.3上位机程序测试 - x0 ~8 K. I! _$ U7 h' W) [% x
|