VB采集监测系统求助

齐达内 2015-09-12 11:16:48
]本人用vb制作的采通集设备电压电流监测系统,通信协议MODBUS-RTU。MSCOMM控件。现在已经成功做到用vb和一两个下位机采集模块通信,但模块共有六个(下位机编号1——6)。我目前的方法是在VB的BOTTON按钮中建立发送命令字符串,然后用TIMER定时器每隔一秒给下位机要数,接收到下位机信息后再显示出来。如果就这样做,在timer里面做 for t= 1to 6的一个循环发送,这样系统时间长了是否会崩溃?有没有更好的办法呢?这是定时器部分源代码,请大家帮忙给看看:
Private Sub Timer1_Timer()
If temp > 2 Then
temp = 1
End If
If temp = 1 Then
Text2.Text = "01 03 00 03 00 0C B5 CF" ‘向一号主机发送查询命令
ElseIf temp = 2 Then
Text2.Text = "02 03 00 03 00 0C B5 FC" ’向二号主机发送查询命令
End If
temp = temp + 1
Text17.Text = Now
If Check1.Value = 1 Then
Call Command6_Click
End If
End Sub


================================================================================
这是接收到下位机信息后我的处理代码
Private Sub MSComm1_OnComm()
Static cnt, count As Integer
Dim receive_cnt As Integer
Dim i As Integer
Dim a, b, c, d, e, x As Long
Dim Buffer As Variant
Dim Arr() As Byte
Dim s As String
Dim l(6)
Select Case MSComm1.CommEvent
Case comEvReceive
receive_cnt = MSComm1.InBufferCount


Buffer = MSComm1.Input

Arr = Buffer

s = ""
For i = 0 To receive_cnt - 1 Step 1

If Arr(i) > 15 Then
s = s + Hex(Arr(i)) + " "
Else
s = s + "0" + Hex(Arr(i)) + " "
End If
cnt = cnt + 1
Next i

If Arr(0) = 1 Then ‘接收字符串首位为1,则主机编号为1
Text3 = (Arr(3) * 256 + Arr(4)) / 300
Text4 = (Arr(5) * 256 + Arr(6)) / 300
Text5 = (Arr(7) * 256 + Arr(8)) / 300
Text6 = (Arr(9) * 256 + Arr(10)) / 300
Text7 = (Arr(11) * 256 + Arr(12)) / 300
Text8 = (Arr(13) * 256 + Arr(14)) / 300
Text9 = (Arr(15) * 256 + Arr(16)) / 1500
Text10 = (Arr(17) * 256 + Arr(18)) / 1500
Text11 = (Arr(19) * 256 + Arr(20)) / 1500
Text12 = (Arr(21) * 256 + Arr(22)) / 1500
Text13 = (Arr(23) * 256 + Arr(24)) / 1500
Text14 = (Arr(25) * 256 + Arr(26)) / 1500
If Arr(0) = 2 Then ’接收字符串首位为2,则主机编号为2
下面代码也是将信息写入text文本框中,我就不写了
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨狗先飞 2015-09-14
  • 打赏
  • 举报
回复
RS485 每一线路最多大约支持32个设备,物理条件决定的。 用定时器的话只能轮询,一个发完通讯下一个,所以接的设备越多,一个循环需要的时间越多,6个设备大约要花掉6~10秒,取决于你定时器的间隔和通讯数据本身占用的传输时间。如果有数据响应要求的话,这个就需要考虑了,毕竟设备接的越多,一个循环所要花掉的时间越多。
qq_30626551 2015-09-13
  • 打赏
  • 举报
回复
请问楼主, If Check1.Value = 1 Then Call Command6_Click End If 如果你发送的查询字符串改变时,还是要先点check1,停止查询后,再点击command1重新查询吗?有没有办法省去点击check1这一过程?
a56817911 2015-09-13
  • 打赏
  • 举报
回复
引用 3 楼 sun19821124 的回复:
如果像这样用定时器处理的话,最多能收发几个下位机呢?十个行吗?我现在要求就是每秒采集所有设备状态然后实时显示设备状态参数
我也是刚学的,我觉得数量上是可以的,另外一方面也要取决于你下位机的响应速度吧,呵呵。
齐达内 2015-09-12
  • 打赏
  • 举报
回复
如果像这样用定时器处理的话,最多能收发几个下位机呢?十个行吗?我现在要求就是每秒采集所有设备状态然后实时显示设备状态参数
笨狗先飞 2015-09-12
  • 打赏
  • 举报
回复
不会崩溃,这样可以
a56817911 2015-09-12
  • 打赏
  • 举报
回复
你用do循环比用timer好。 do until jcancel = true doevent 发送串口命令读取1#数据 do until instr(A,vbcr) = true A = 串口.input loop 处理数据 发送串口命令读取2#数据 do until instr(A,vbcr) = true A = 串口.input loop 处理数据 。。。 。。。 loop

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧