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