0 引言
閥門(mén)制造的質(zhì)量越來(lái)越受到行業(yè)與廣大用戶的重視,特別是高壓、大口徑、低溫等特殊工況下工作的閥門(mén)及重要輸送管道上的閥門(mén),若開(kāi)啟或關(guān)閉過(guò)程中發(fā)生機(jī)械故障,其后果不可設(shè)想。閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)系統(tǒng)可以完整地記錄被測(cè)閥門(mén)在開(kāi)啟與關(guān)閉的全過(guò)程中所需的時(shí)間(開(kāi)度)與轉(zhuǎn)矩、時(shí)間(開(kāi)度)與位移的關(guān)系,并以數(shù)據(jù)顯爾、趨勢(shì)曲線、輸出最大值及報(bào)表等多種形式,反映閥門(mén)的制造與裝配質(zhì)量信息,供技術(shù)人員進(jìn)行統(tǒng)計(jì)、計(jì)算和分析,以獲得產(chǎn)品的性能指標(biāo),可幫助企業(yè)提高產(chǎn)品質(zhì)量。
閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)系統(tǒng)以PC機(jī)為控制處理中心,由閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)裝置采集數(shù)據(jù),然后用異步串行通信方式傳給PC機(jī),實(shí)現(xiàn)由PC機(jī)對(duì)整個(gè)檢測(cè)過(guò)程的自動(dòng)控制。VB在開(kāi)發(fā)可視化環(huán)境下的檢測(cè)系統(tǒng)控制軟件時(shí)有其獨(dú)特的優(yōu)勢(shì)。首先,人機(jī)界面的建立比其它工具簡(jiǎn)單、快速;其次VB提供了串行通信控件,使開(kāi)發(fā)者可以開(kāi)發(fā)串行通信和系統(tǒng)程序,而功能上也提供了不少為用戶所設(shè)想的簡(jiǎn)便之處。本義介紹的閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)系統(tǒng)中的有關(guān)程序即選用了VB作為編程工具。
1 閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)裝置與PC機(jī)的串行通信
用VB開(kāi)發(fā)串行通信程序一般有兩種方法:
①利用Windos的通信API函數(shù)
Windows SDK提供了完備的API接口函數(shù),利用API函數(shù)編寫(xiě)的串口通信程序功能更強(qiáng)大、更豐富,但編寫(xiě)復(fù)雜,其復(fù)雜化和專業(yè)化使很多開(kāi)發(fā)者望而卻步。
②采用通信控件實(shí)現(xiàn)
使用控件是VB的一大優(yōu)勢(shì),其編寫(xiě)程序較為簡(jiǎn)單,大多數(shù)VB程序員使用微軟公司的MSComm控件來(lái)進(jìn)行串行通信程序的開(kāi)發(fā)。
筆者編寫(xiě)的用于閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)裝置與PC機(jī)的串行通信程序,主要利用了MSComm控件的一些屬性與方法。MSComm控件提供了標(biāo)準(zhǔn)的事件處理函數(shù)、過(guò)程,通過(guò)設(shè)置串行通信的參數(shù)(端口號(hào)、波特率等),比較容易實(shí)現(xiàn)串行通信。
1.1 閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)系統(tǒng)通信協(xié)議
閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)裝置與PC機(jī)之間采用RS232異步串行通信接口通信,數(shù)據(jù)傳輸速率為9600bps,1位開(kāi)始位,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn)位。檢測(cè)裝置不斷發(fā)送檢測(cè)數(shù)據(jù)。每個(gè)數(shù)據(jù)塊由4個(gè)字節(jié)組成,第一個(gè)字節(jié)的前三位定義為二進(jìn)制常數(shù)1ll,是每個(gè)數(shù)據(jù)塊的開(kāi)始標(biāo)志,其余3個(gè)字節(jié)的前三位均為二進(jìn)制常量000;每?jī)蓚€(gè)字節(jié)的后五位表示一個(gè)十進(jìn)制數(shù),高位在前,低位在后。如圖1所示。
1.2 MSComm控件的主要屬性和事件
MSComm控件有很多屬性,其中最基本的有以下幾個(gè):
1.3 本裝置通信控件的屬性
本裝置通信控件MSComm1重要屬性設(shè)置如下:
rt=
gs=“9600,n,8,
ferStze=
ode=1’輸入輸出的數(shù)據(jù)類型為二進(jìn)制
hold=
en=7’指定由串行口一次讀入的字符串長(zhǎng)度
MSComm控件提供了OnComm事件,用于通信錯(cuò)誤或通信事件發(fā)生時(shí),用戶可在OnComm事件中編寫(xiě)代碼。
1.4 數(shù)據(jù)處理
對(duì)接收的每個(gè)數(shù)據(jù)塊,要通過(guò)一個(gè)簡(jiǎn)單算法,將二進(jìn)制格式數(shù)據(jù)轉(zhuǎn)換成兩個(gè)十進(jìn)制表示的數(shù)據(jù)。編寫(xiě)數(shù)據(jù)處理函數(shù)如下:
Function BtoD(d1 as byte,d2 as byte)as integer
BtoD=(d1 And&H10)/16*2^9_
+(dl And&H8)/ 8*2^8_
+(d1 And&H4)/ 4*2^7_
+(dl And&H2)/2*2^6_
+(d1 And&H1)/1*2^5_
+(d2 And&H10)/16*2^4_
+(d2 And &H8)/8*2^3_
+(d2 And &H4)/4*2^2_
+(d2 And &H2)/2*2^1_
+(d2 And &H1)/1*2^0_
End Function
1.5 發(fā)送命令程序
為了發(fā)送一個(gè)4字節(jié)二進(jìn)制數(shù){7E,01,F6,oA}數(shù)據(jù)傳輸命令,它必須先存到一個(gè)形式為Byte的動(dòng)態(tài)數(shù)組,然后再將此動(dòng)態(tài)數(shù)組傳送出去。采用單擊命令按鈕方式發(fā)送傳輸命令,過(guò)程如下:
Private Sub cmdstart_Click()‘開(kāi)始按鈕
Dim outA()As Byte
……
outA()=ChrB(&H7E)&ChrB(l)&ChrB(&HF6)&ChrB(&HA)
=outA’向閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)裝置發(fā)送數(shù)據(jù)傳輸命令
U1max=0’數(shù)據(jù)1最大值存儲(chǔ)變量清零
U2max=
T=Val()’數(shù)據(jù)采樣時(shí) 間間隔
CT=Va1()’數(shù)據(jù)采樣時(shí)間
d=True’啟動(dòng)接收閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)裝置數(shù)據(jù)定時(shí)器
End Sub
1.6 接收數(shù)據(jù)程序
接收數(shù)據(jù)是一個(gè)自動(dòng)的周期性過(guò)程,通過(guò)子過(guò)程來(lái)實(shí)現(xiàn),由定時(shí)器開(kāi)啟。接收數(shù)據(jù)時(shí),每次要判斷第一個(gè)字節(jié)是否為一個(gè)數(shù)據(jù)塊的起始字節(jié),只有是則連接的4個(gè)字節(jié)才為正確的數(shù)據(jù),否則查看下一字節(jié)。通過(guò)設(shè)置en=7來(lái)實(shí)現(xiàn)每次從接收緩沖區(qū)內(nèi)讀取七個(gè)字節(jié)的數(shù)據(jù),以保證每一個(gè)周期能讀取一個(gè)數(shù)據(jù)塊。接收數(shù)據(jù)子過(guò)程如下:
Sub ReceriveData()
Dim Buf()As Byte
Dim i As Integer
Dim Temp As Integer
Dim c(3) As Byte
Dim U1%,U2%
Buf()=
For i=LBound (Buf)To UBound(Buf)’查找數(shù)據(jù)塊的第一個(gè)字節(jié)
If Buf(i)\32=7 Then
Temp=i
Exit For
End If
Next
For i=0 To 3’讀取一個(gè)數(shù)據(jù)塊
c(i)= Buf(TemP+i)
Next
U1=BtoD(c(0),c(1))’調(diào)用數(shù)據(jù)處理函數(shù)求數(shù)據(jù)1
U2=BtoD(c(2),c(3))’調(diào)用數(shù)據(jù)處理函數(shù)求數(shù)據(jù)2
If U1>U1 max Then’求數(shù)據(jù)1的最大值
Ulmax=U1
End If
If U2>U2max Then’求數(shù)據(jù)2的最大值
U2maX=U2
End If
End Sub
1.7 通訊錯(cuò)誤的處理
由于外界干擾或電壓波動(dòng)等原因,PC機(jī)和閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)知檢測(cè)裝置之間的通信可能會(huì)出現(xiàn)錯(cuò)誤,如接收緩沖區(qū)溢出、連接端口超速等。這些可能發(fā)生的事件都能在代碼中引起運(yùn)行錯(cuò)誤。為了處理這些錯(cuò)誤,須要將錯(cuò)誤處理代碼添加到程序中。通過(guò)控件中的OnComm事件可以捕捉和處理錯(cuò)誤。在通信過(guò)程中所發(fā)生的通信錯(cuò)誤是CommEvent屬性返回的。當(dāng)CommEVent屬性值發(fā)生改變時(shí),表明有通信錯(cuò)誤,就會(huì)產(chǎn)生OnComm事件。同時(shí),可以利用自動(dòng)引發(fā)OnComm事件的特點(diǎn)在接收過(guò)程中加入狀態(tài)顯示碼。通信錯(cuò)誤的處理程序如下:
Private Sub MSComm1_OnComm()
Select Case ent
case ComEventFrame’數(shù)據(jù)幀錯(cuò)誤
X=MsgBox(Framing Error!,16)
…錯(cuò)誤處理
Case ComEventOverrun’連接端口超速
X=MsgBox(“數(shù)據(jù)丟失!”,16)
…錯(cuò)誤處理
……
End Select
End Sub
2 保存數(shù)據(jù)
通過(guò)串口傳送過(guò)來(lái)的數(shù)據(jù)經(jīng)過(guò)處理后,連同對(duì)應(yīng)的時(shí)間參數(shù),送入數(shù)據(jù)庫(kù),供MIS系統(tǒng)查詢、繪制趨勢(shì)曲線、打印報(bào)表等使用。數(shù)據(jù)表結(jié)構(gòu)如表1所示:
表1 數(shù)據(jù)表結(jié)構(gòu)
列名 |
數(shù)據(jù)類型 |
可否為空 |
說(shuō)明 |
T |
Integer(2) |
NOT NULL |
時(shí)間(主鍵) |
U1 |
Integer(4) |
NOT NULL |
數(shù)據(jù)1 |
U2 |
Integer(4) |
NOT NULL |
數(shù)據(jù)2 |
列名
數(shù)據(jù)類型
可否為空
說(shuō)明
T
Integer(2)
NOT NULL
時(shí)間(主鍵)
U1
Integer(4)
NOT NULL
數(shù)據(jù)1
U2
Integer(4)
NOT NULL
數(shù)據(jù)2
3 繪制趨勢(shì)曲線
將采集到的數(shù)據(jù)繪制成趨勢(shì)曲線(U1-T和U2-T),進(jìn)行統(tǒng)計(jì)、計(jì)算和分析,以得到產(chǎn)品的性能指標(biāo)。
3.1 繪圖方法的使用
在VB中,最方便使用的繪圖組件是圖片框(Picture Box),此組件可以使用相關(guān)的繪圖方法將數(shù)據(jù)繪到圖片框中,使結(jié)果顯示在其上。在繪制趨勢(shì)曲線中只需用到直線的繪制方法,在VB中畫(huà)直線是邁過(guò)Line方法來(lái)實(shí)現(xiàn)的,它的語(yǔ)法為:
[step] [x1,x1] [step](x2,y2)[,<顏色>[,B[F]]
其中,x1,y1為直線的起點(diǎn)坐標(biāo),x2,y2為直線的終點(diǎn)坐標(biāo),顏色用于設(shè)置直線的顏色,B、F為繪制矩形時(shí)所用。當(dāng)使用Line方法繪制連結(jié)的線時(shí),前一條線的終點(diǎn)就是后一條線的起點(diǎn)。線的寬度取決于DrawWidth屬性值,線型取決于DrawStyle屬性值。執(zhí)行Line方法后,CurrentX和CurrentY性被參數(shù)設(shè)置為終點(diǎn)。
3.2 插值公式的使用
間門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)系統(tǒng)中PC機(jī)接收的數(shù)據(jù)為每隔一定時(shí)間間隔采樣、處理和讀取的,為了能更好地顯示曲線的趨勢(shì)走向,需要使用插值法求中間點(diǎn)。常用牛頓插值公式計(jì)算中間點(diǎn)坐標(biāo)。牛頓插值公式如下:
牛頓插值公式是一個(gè)遞推公式,當(dāng)需要增加一個(gè)節(jié)點(diǎn)時(shí),只要多計(jì)算一行就可以了,比較方便實(shí)用。利用該公式即可騙寫(xiě)出在繪制趨勢(shì)曲線過(guò)程中用到的構(gòu)造牛頓插值公式子過(guò)程。
3.3 繪制趨勢(shì)曲線
讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù),利用牛頓插值函數(shù)及Line方法,可得到如圖2所示的檢測(cè)結(jié)果趨勢(shì)曲線(U1-T和U2-T)
程序代碼如下:
Private Sub DrawNewTonGraph(Xmin As Single,Xmax As Single,stp As Single,m1 As Integer,m2 As Integer,k As Single,c,Pie As object)
’Stp為橫坐標(biāo)繪圖步長(zhǎng);m1為曲線的橫坐標(biāo)數(shù)據(jù)在數(shù)據(jù)表中的字段名,m2為曲線的縱坐標(biāo)數(shù)據(jù)在數(shù)據(jù)表中的字段名;k為曲線比例系數(shù);c為曲線的顏色;Pic為繪圖的圖片框
Dim x As Single ‘X坐標(biāo)
Dim y As Single ‘Y坐標(biāo)
NewTonInterpolationl ml,m
dth=
yle=vbSolid’設(shè)置曲線線型
x=Xmin
y=NewTonInterpolation2(x)’用牛頓插值公式求X點(diǎn)的y值
(x,y),c’設(shè)置起點(diǎn)
x=x+Stp
While x<Xmax
y=NewTonInterpolation2(x)
-(x,y*k),c’由上一次的位置畫(huà)至此點(diǎn)
x=x+stp
Wend
x=Xmax
y=NewTonInterpolation2(x)
-(x,y*k),C
End Sub
4 結(jié)束語(yǔ)
閥門(mén)啟閉動(dòng)態(tài)轉(zhuǎn)矩檢測(cè)系統(tǒng)為一主從式系統(tǒng),上位機(jī)為PC機(jī),應(yīng)用程序全部用VB開(kāi)發(fā),由PC機(jī)實(shí)現(xiàn)對(duì)整個(gè)檢測(cè)過(guò)程的自動(dòng)控制,可以完整地記錄被測(cè)閥門(mén)在開(kāi)啟與關(guān)閉的全過(guò)程中所需的時(shí)間(開(kāi)度)與轉(zhuǎn)矩、時(shí)間(開(kāi)度)與位移的關(guān)系,并以數(shù)據(jù)顯示、趨勢(shì)曲線、輸出最大值及報(bào)表等形式,反映閥門(mén)的制造與裝配質(zhì)量信息。本文中給出的原程序均巳在VB6.0環(huán)境下調(diào)試通過(guò),其中的編寫(xiě)方法對(duì)其他類似的檢測(cè)系統(tǒng)也有一定的借鑒作用。
參考文獻(xiàn)
[1] 范逸之.利用Visual Basic實(shí)現(xiàn)串并行通信技術(shù).北京:清華大學(xué)出版社,2001.
[2] 范逸之.Visual Basic與分布式監(jiān)控系統(tǒng)[M].北京:清華大學(xué)出版社,2002.
(轉(zhuǎn)載)