定义全局变量:
Private Const space As Integer = 15 '定义比较值的浮动范围常量
Private i As Integer '定义活动变量
Private j As Integer '定义活动变量
在定位仪的范围比较当中每次得到的当前值都需要同它的上一个值作比较,而且它们之间的差额是固定的,一直为15,故而将其定义为常量,在VB中常量是用关键字Const来定义的;i和j为活动变量,可以灵活运用,比如在for循环中,因为程序中多次用到过活动变量,所以将其定义为全局变量。这些变量都只用在当前的程序当中,所以都定义为私有类型,不可被访问的。
Public Function sort(currentform As Form, sorted As Variant, num As Integer) As Boolean '冒泡排序
Dim min As Integer '定义存放最小数的下标值
Dim temp As Integer '定义临时变量
Dim i As Integer
For i = 0 To num – 1 '循环做比较
min = i
For j = i + 1 To num – 1 '循环将第一个值与其他值作判断
If sorted(i) > sorted(j) Then min = j
Next j
temp = sorted(i) '将最小值放到最小下标的位置上
sorted(i) = sorted(min)
sorted(min) = temp
Next i
sort = True
End Function
以上程序是一段冒泡排序代码,定义为public型,可以让外程序访问,VB中定义返回类型是放在函数参数后的,例如上面的as Boolean,这样函数返回值就是布尔类型的,currentform As Form定义访问该函数的窗口名称,sorted是数组,而Variant是一种类型,因为在VB中没有指针类型,所以用该类型可以包含一些其他的类型,这里用到的就是代替指针类型,作为传址调用,num是数组的长度。最后的sort = True就是如果程序执行结束并且正确则函数会返回TRUE,否则为FALSE,但如果不加这句,那么无论是对错都是返回FALSE,而且这样定义的好处是在调用程序当中只需定义一个布尔变量让其等于该函数就可以了。VB中函数没有固定的返回语句,要么是通过函数本身返回,要么是通过参数返回。本函数就是通过函数本身返回值的。
Public Function Average(currentform As Form, data As Variant) As Integer
'算平均值
Average = (data(2) + data(3) + data(4)) \ 3
End Function
该函数是取出存放从传感器端得到数据的数组中的第3,4,5个值作平均值运算,然后通过函数本身返回。因为传感器在测量过程中偶尔有一两个异常的值是很正常的,所以取其得到的7个数存放到数组中,再将其排序,然后去中间的三个做平均,这样就准确很多。在VB中“\”是整数运算符,“/”是浮点数运算符,“mod”是取余运算符。打她仍然是数组,利用的传址调用。
'ka, kb值的范围比较
Public Function CheckValue(currentform As Form, currentka As Integer, currentkb As Integer, prevka As Integer, prevkb As Integer) As Boolean
If prevka - 15 < currentka < prevka + 15 And prevkb - 15 < currentkb < prevkb + 1
Then CheckValue = True '判断值的范围
End Function
该函数是比较范围值的,currentka 和currentkab是要作比较的两个值,prevka 和prevkab是上次得到的标准值,用来被比较的。因为上下两个值的差额一直是常量15,只需用变量对其进行加减就可以,CheckValue = True 是通过函数将值返回的。
'定义将数据显示到界面函数
Public Function showdata(currentform As Form, currentlocation As Integer, leftka As Integer, leftkb As Integer, rightka As Integer, rightkb As Integer) As Boolean
Dim j As Integer '定义活动变量
Dim distl, distr As Integer '定义存放左右距离的变量
distl = leftkb - leftka '计算左前的当前距离值
distr = rightkb - rightka '计算左后当前的距离值
currentform.lqka(currentlocation) = leftka '将值写到左前的ka文本框中
currentform.lqkb(currentlocation) = leftkb '将值写到左前的kb文本框中
currentform.lqdist(currentlocation) = distl '将值写到左前的dist文本框
currentform.lhka(currentlocation) = rightka '将值写到左后的ka文本框中
currentform.lhkb(currentlocation) = rightka '将值写到左后的kb文本框中
currentform.lhdist(currentlocation) = distr '将值写到左后的dist文本框
End Function
该函数用于将得到的平均值显示在前段的可视界面中。currentlocation 定义的是传感器现在停止的位置是相对于开始位置所检测的第几个,由于距离这个变量时通过ka和kb相减得来的,故而在此函数中进行运算。currentform 是调用本函数的窗口。在做GUI时将相同名字的文本框设定为一个组,那么只需要在名称栏里填写组名,在下面的index栏中填写相应的索引值,这样就可以在函数调用该文本框时采用currentform.lqka(currentlocation)形式,也就是说lqka是组名,而括号中的currentlocation 在此充当了下标的角色,这样来指定将后面得到的值赋给第几个对应的文本框。
Public Function showothers(currentform As Form, leftva As Integer, leftvb As Integer, leftpa As Integer, leftpb As Integer, leftcount As Integer, leftshutter As Integer, rightva As_ Integer, rightvb As Integer, rightpa As Integer, rightpb As Integer, rightcount As Integer, rightshutter As Integer) As Boolean
currentform.lqva = leftva '将值写到左前的va文本框中
currentform.lqvb = leftvb '将值写到左前的vb文本框中
currentform.lqpa = leftpa '将值写到左前的pa文本框中
currentform.lqpb = leftpb '将值写到左前的pb文本框中
currentform.lqcount = leftcount '将值写到左前的count文本框中
currentform.lqshutter = leftshutter '将值写到左前的shutter文本框中
currentform.lhva = rightva '将值写到左后的va文本框中
currentform.lhvb = rightvb '将值写到左后的vb文本框中
currentform.lhpa = rightpa '将值写到左后的pa文本框中
currentform.lhpb = rightpb '将值写到左后的pb文本框中
currentform.lhcount = rightcount '将值写到左后的count文本框中
currentform.lhshutter = rightshutter '将值写到左后的shutter文本框中
End Function
本函数作用是时时更换辅助值栏中数据的变动。在VB中如果代码很长,想分成两行写,那么需要在上一行的结尾处加一个“_”下划线,这样系统会默认此行和下一行为同一行。因为该程序得到的值职位辅助作用,故而无需像上面那样经过计算再赋值,只需将得到的值直接赋给界面的控件就可以了。
与传感器接口方面,应用端口号为实际应用中使用号,本设计完成基本的读写存储功能,帮此不在本设计中完成,留待实用中根据需要修改。PC端口号由于PC端为本设计运行端,为主端口,故为FFH。消息最大等待时间必须在0到150ms(0到F),当等于0时默认为100 ms。具体计算公式如下。读数据时:wait time=T0+T2/TW(两者中较长的那个)+T3+T4+T5,写数据时:wait time=T0+T1+T2/TW+T3;其中T0,T3,T5=1/波特率 * 命令长度 * 各自系数,T1为扫描时间,T2为通信时间,T4为通信延时,TW为设定的通信时间。根据本产品已提供信息,设置等待时间为100ms,既值为0或A。和校验既是将和校验之前的内容求和,舍其高位,留其低位作为和校验。
根据以上分析和详细设计,作程序如下:
数据写模块
Public Sub WriteData(Sta_NO As String, Sta_Type As String, Start_loc As String, Sta_Num As String, iValue As String)
Dim Stmp As String
Select Case Sta_Type
Case "D"
Comm = "WW"
iValue = right$("0000" + Hex$(Val(iValue)), 4)
Case "M"
Comm = "BW"
End Select
Start_loc=right$("000"&Start_loc,4) '取四位
Sta_Num=right$("0"&Sta_NO,2) '取两位
Sum_ch = Hex(CInt("H&" & Sta_NO) + CInt("&HFF") + CInt("&H" & Comm) + CInt("&HA") + CInt("&H" & Sta_Type) + CInt("&H" & Start_loc) + CInt("&H" & iValue))
'求和
Sum_ch = Hex(CInt("H&" & Sum_ch) - CInt("H&" & Sum_ch) / CInt("HFF") * CInt("HFF")) '舍高位,取低位
Sum_ch=right$("0"&Sum_ch,2) '取后两位
Stmp = Chr$(5) & Sta_NO & "FF" & Comm & "A" & Sta_Type & Strat_loc & Sum_ch
MSComm1.Output = Stmp
Now = Second()
Do
DoEvents
If Second() - Now > 1 Then
Exit Sub
Loop Until main.MSComm1.OutBufferCount = 0
End Sub
数据读模块
Public Sub ReadData(Sta_NO As String, Sta_Type As String, Start_loc As String, Sta_Num As String)
Dim Stmp As String
Dim cha, j As String
Dim cha_count As Integer
Select Case Sta_Type
Caes "D"
Comm = "WR"
Cha=Val("&H"&Sta_Num)*4 '十六进制表示,占4个字符
Case "M"
Comm = "BR"
cha = Val("&H" & Sta_Num)
End Select
Start_loc=right$("000"&Start_loc,4) '取四位
Sta_Num=right$("0"&Sta_NO,2) '取两位
Sum_ch = Hex(CInt("H&" & Sta_NO) + CInt("&HFF") + CInt("&H" & Comm) + CInt("&HA") + CInt("&H" & Sta_Type) + CInt("&H" & Start_loc)) '求和
Su