首页 >> 大全

VB6.0封装MSComm控件以采集Alicat流量计数据

2023-09-19 大全 29 作者:考证青年

封装控件采集流量计数据

文章目录 三、控件使用案例

前言

流量计支持 ASCII协议,为了方便测量,并将流量计集成到VB6.0测量程序中,利用VB6.0自带的控件实现了集成。

一、采集指令

在测量程序中用到的指令为:

1)A:质量流量数据返回指令;

2)AV:体积流量返回指令;

3)A@=B:设置控件设备号;

上述指令中的A和B均为设备ID号,支持A-Z的设备号。

二、控件封装过程 1.程序设计简要说明

vb6.0从数据库查询数据__数据的封装与解封装

硬件逻辑:打开设备(comID)->采集数据, ->检测数据状态->读取数据->关闭设备

质量流量测量:->发送指令->读取数据并存储

体积流量采集:->发送指令->读取数据并存储

支持通过发送其他指令。

2.程序对象界面如下

添加控件,属性窗口可修改为自定义名称为。双击控件会产生()控件,这是采集数据事件。

3.程序代码如下

代码页的代码如下:

Option Base 1 '限定动态数组下标从1开始Dim baudRate As Long '波特率
Dim comNum As Integer '通道号
Dim check As String '校验码
Dim dataBits As Integer '数据位数
Dim stopBits As Integer '停止位数
Dim revStr As String '记录原始接收数据
Public dataStr As String '记录字符串数据
Dim cntForRev As Integer
Dim devID As String '设备号
Public readyRead As Boolean '判断数据是否存放完成Private Function IsHex(c As String) As IntegerIf c >= "0" And c <= "9" ThenIsHex = Val(c) - Val("0")ElseIf c >= "a" And c <= "f" ThenIsHex = Asc(c) - Asc("a") + 10ElseIf c >= "A" And c <= "F" ThenIsHex = Asc(c) - Asc("A") + 10ElseIsHex = 16End If
End FunctionPublic Function revMassFlowData() '读取质量流量readyRead = FalseCall collectData
End FunctionPublic Function revVolFlowData() '读取体积流量readyRead = FalseCall getVolumetricFlowRate
End FunctionPublic Function returnCnt()returnCnt = cntForRev
End FunctionPrivate Function analysData(temStr As String) As StringDim sz As LongDim i As LongDim str As Stringstr = ""sz = Len(temStr)For i = 0 To sz - 2 Step 2str = str + Chr(Val("&H" + Left(temStr, 2)))temStr = Right(temStr, sz - i - 2)Next ianalysData = str
End FunctionPrivate Sub MSCommCls_OnComm()Static cnt As IntegerDim receive_cnt As IntegerDim i As IntegerDim Buffer As VariantDim Arr() As ByteDim s As StringreadyRead = FalsecntForRev = cntForRev + 1'    Static num As Integer
'    Text1.Text = Text1.Text + "计数:" + CStr(num) + "; "
'    num = num + 1Select Case MSCommCls.CommEventCase comEvReceivereceive_cnt = MSCommCls.InBufferCount   '接收缓冲区的字节数' 往暂存区存二进位资料Buffer = MSCommCls.Input' 指定给位元组阵列以便处理Arr = Buffers = ""For i = 0 To receive_cnt - 1If Arr(i) > 15 Then
'                    s = s + Hex(Arr(i)) + " "revStr = revStr + Hex(Arr(i))
'                    Text1.Text = Text1.Text & sElse
'                    s = s + "0" + Hex(Arr(i)) + " "revStr = revStr + "0" + Hex(Arr(i))
'                    Text1.Text = Text1.Text & sIf "0" + Hex(Arr(i)) = "0D" Then '判断结尾dataStr = analysData(revStr)readyRead = TrueEnd IfEnd Ifcnt = cnt + 1Next i'            Text1.Text = Text1.Text & sIf cnt >= 300 Then'Text1.Text = ""cnt = 0Exit SubEnd IfCase comEvSendCase comEvEOFEnd Select
End SubPrivate Function collectData()Dim s As StringDim sz As Integer '记录输入字符串个数Dim i As Integer, cnt As IntegerDim a As IntegerDim temStr As StringDim deviceID As StringDim send_buf() As ByteReDim send_buf(1024)dataStr = ""revStr = ""cntForRev = 0cnt = 0'确定设备地址If devID = "" ThendeviceID = "41" '设备默认为AElsedeviceID = CStr(Hex(Asc(devID)))End Ifs = deviceID & "0D0D"call sendOrders(s)  '发送指令
End FunctionPublic Function openDevice(comID As Integer) As Boolean'初始化基本配置以便选择Dim i As IntegerDim temStr As String'数据初始化dataStr = ""revStr = ""cntForRev = 0'串口If comID >= 1 And comID <= 256 ThencomNum = comIDElseopenDevice = FalseExit FunctionEnd If'波特率If baudRate = 300 Or baudRate = 600 Or baudRate = 1200 Or baudRate = 2400 Or baudRate = 4800 Or baudRate = 9600 _Or baudRate = 19200 Or baudRate = 38400 Or baudRate = 56000 Or baudRate = 57600 Or baudRate = 115200 ThenElsebaudRate = 19200End If'校验码If check <> "N" And check <> "O" And check <> "E" Thencheck = "N"End If'数据位If dataBits <> 8 And dataBits <> 7 And dataBits <> 6 ThendataBits = 8End If'停止位If stopBits <> 2 And stopBits <> 1 ThenstopBits = 1End If'打开串口On Error Resume NextErr.Clear'连接串口If MSCommCls.PortOpen = True ThenMSCommCls.PortOpen = FalseEnd IfMSCommCls.CommPort = comNumMSCommCls.Settings = CStr(baudRate) + "," + check + "," + CStr(dataBits) + "," + CStr(stopBits) '设置波特率及数据帧格式MSCommCls.InputLen = 0             '读取接收缓冲区的所有字符MSCommCls.InBufferSize = 256       '数据接受缓冲区大小MSCommCls.OutBufferSize = 256      '数据发送缓冲区大小MSCommCls.RThreshold = 1          '接受一个字节就产生ON_COMM事件'MSComm1.SThreshold = 1          '发送缓冲区空触发发送事件'MSComm1.InputMode = comInputModeText  '字节模式'设定 InputMode 以读取二进位资料MSCommCls.InputMode = comInputModeBinaryMSCommCls.PortOpen = TrueIf Err.Number ThenIf Err.Number = 8002 Then'MsgBox "串口" + CStr(comNum) + "不存在!", vbOKOnly, "警告"openDevice = FalseExit FunctionElseIf Err.Number = 8005 Then'MsgBox "串口" + CStr(comNum) + "已打开!", vbOKOnly, "警告"openDevice = TrueElse'其他错误'Text1.Text = "收到错误码:" + CStr(Err.Number)Err.ClearopenDevice = FalseExit FunctionEnd IfElseopenDevice = TrueEnd If'        Text1.Text = CStr(MSComm1.Settings)openDevice = TrueEnd FunctionPublic Function changeDevID(deviceID1 As String, deviceID2 As String) As BooleanIf deviceID2 >= "A" And deviceID2 <= "Z" And deviceID1 >= "A" And deviceID1 <= "Z" ThendevID = deviceID2changeDevID = TrueElsechangeDevID = FalseExit FunctionEnd IfDim orders As Stringorders = CStr(Hex(Asc(deviceID1))) & "403D" & CStr(Hex(Asc(deviceID2))) & "0D0D"Call sendOrders(orders)changeDevID = TrueEnd FunctionPublic Function initDevID(deviceID As String)If deviceID >= "A" And deviceID <= "Z" ThendevID = deviceIDElseExit FunctionEnd IfEnd FunctionPrivate Function getVolumetricFlowRate()Dim orders As StringDim deviceID As String'初始化数据dataStr = ""revStr = ""cntForRev = 0'确定设备地址If devID = "" ThendeviceID = "41"ElsedeviceID = CStr(Hex(Asc(devID)))End Iforders = deviceID & "560D0D"Call sendOrders(orders)End FunctionPublic Sub sendOrders(ordersHex As String)Dim s As StringDim sz As Integer '记录输入字符串个数Dim i As Integer, cnt As IntegerDim a As IntegerDim temStr As StringDim deviceID As StringDim send_buf() As ByteReDim send_buf(1024)dataStr = ""revStr = ""cntForRev = 0cnt = 0s = ordersHexsz = Len(s)temStr = s'判断所有字符是否为16进制For i = 0 To sz - 1If IsHex(Left(temStr, 1)) = 16 Then'MsgBox "发送内容必须为16进制形式", vbOKOnly, "警告"Exit SubEnd IftemStr = Right(temStr, sz - 1 - i)Next iDo While (sz)a = IsHex(Left(s, 1))sz = sz - 1s = Right(s, sz)If sz <> 0 Thena = a * 16 + IsHex(Left(s, 1))sz = sz - 1s = Right(s, sz)End Ifcnt = cnt + 1send_buf(cnt) = aLoopIf cnt > 128 Then cnt = 128ReDim Preserve send_buf(cnt) '保留原始数据并改变字符串长度'    Text1.Text = CStr(send_buf())MSCommCls.Output = send_buf() '发送16进制ASCII码字节流
'    curT = timeGetTime '记录发送时间
End SubPublic Sub initDevice(rates As Long, checkCode As String, dataBit As Integer, stopBit As Integer)'初始化基本配置baudRate = rates
'    comNum = comIDcheck = checkCodedataBits = dataBitstopBits = stopBit
End SubPublic Sub closeDevice()If MSCommCls.PortOpen = True ThenMSCommCls.PortOpen = FalseEnd If
End Sub

三、控件使用案例 1.窗口界面

控件注册后,添加控件,左上角空白区域。

2.代码页代码

代码页的代码如下:

Private Sub Command1_Click() '打开设备
'    MSCommV21.initDevID ("A") '默认为A,其他需要初始化,用于打开设备前
'    MSCommV21.initDevice 3, 200, "N", 8, 1 '除端口号外,其他都为默认值,alicat不用设置, 用于打开设备前MSCommV21.openDevice (3)
'    MSCommV21.changeDevID "C", "A" '用于打开设备后,更改设备号,以方便多个ALICAT流量计使用
End SubPrivate Sub Command2_Click()Dim s As String
'    MSCommV21.revMassFlowData '质量流量MSCommV21.revVolFlowDataDoDoEventsLoop While MSCommV21.readyRead = FalseText1.Text = MSCommV21.dataStr
End SubPrivate Sub Command3_Click()MSCommV21.closeDevice
End Sub

3.源代码访问

源码及控件:

链接:

提取码:e9yn

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了