| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 805 人关注过本帖
标题:基于vb的上位机智能仪表监控程序设计
只看楼主 加入收藏
xx19911130
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-3-16
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
基于vb的上位机智能仪表监控程序设计
毕业设计题目。老师要求用单片机和pc连一起,监视远程的电压 电流表的数值,还要波形图,再用excel显示出来。但是vb编程老师出现错误。属性里的控件不齐全。麻烦大神们帮我看看。
Dim myexcel As Excel.Application ' 定义 Application 对象变量
Dim mybook As Excel.Workbook ' 定义工作薄对象变量
Dim mysheet As Excel.Worksheet ' 定义工作表对象变量
Dim n As Integer ' 定义电子表格中已有内容的行数变量

'
程序代码:
"开始采集"程序代码:
Private Sub Command1_Click()
Timer1.Enabled = True
Timer2.Enabled = True
Call draw
Set myexcel = Excel.Application ' 启动 Excel 应用软件
Set mybook = myexcel.Workbooks.Open(" e:/meter.xls ") ' 打开 E 盘工作薄文件"
Set mysheet = mybook.Worksheets(1) 'mysheet指向工作薄中的第 1 张工作表
myexcel.Visible = True ' 显示 Excel 应用环境 (工作表可视)
n = mysheet.UsedRange.Rows.Count ' 获取电子表格中已有内容的行数
End SubPrivate Sub Command2_Click()
Timer1.Enabled = False ' 不允许 Timer1 计时
mybook.Save ' 保存工作薄
myexcel.Quit ' 关闭 Excel 应用软件
End Sub



程序代码:
'注意:在程序开始之前,必须清空发送和接收缓冲区,以免出错。
Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"   ' 设置波特率和发送字符格式
 = 1 ' 设置通讯串口
MSComm1.InputLen = 0 ' 设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据
MSComm1.InBufferSize = 512 ' 设置接收缓冲区512Byte
MSComm1.InBufferCount = 0
MSComm1.OutBufferSize = 512 ' 设置发送缓冲区512Byte
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 6 ' 每个字符到接收缓冲区都触发接收事件
MSComm1.SThreshold = 1
End Sub' 接收单片机发送的数据,并显示
Private Sub MSComm1_OnComm()
Dim inth() As Byte ' 存放输入的 Byte 型采样数据
Dim th(5) As Single ' 存放 Byte 型转为 Single型数据
Dim vol, cur As Single ' 电压、电流值
If  = comEvReceive Then
inth = MSComm1.Input ' 输入 Byte 型数据存入inth
For i = 0 To 5
th(i) = inth(i) ' 把 Byte 型转换为 Single 型存入 t h
Next i
If (inth(0) Xor inth(1) Xor inth(2) Xor inth(3) Xor inth(4)) = inth(5) Then
' 异或校验正确时:
vol = th(2) * 256 + th(1) ' 计算电压采样值(二进制变十进制)
vol = 50 * vol / 1024 ' 计算电压测量值
vol = Format$(vol, "0.0")
cur = th(4) * 256 + th(3) ' 计算电流采样值(二进制变十进制)
cur = 100 * cur / 1024 ' 计算电流测量值
cur = Format$(cur, "0.0")
If th(0) = 1 Then
Text1t.Text = vol & " V" ' 文本框显示 1 号表测量值
Text1h.Text = cur & " I"
n = n + 1 ' 电子表格中已有内容的行数 +1(即指向首个空行)
mysheet.Cells(n, 1).Value = Time ' 当前时间存入单元格
mysheet.Cells(n, 2).Value = vol '1 号表电压值存入第 n 行 2 列单元格
mysheet.Cells(n, 3).Value = cur '1 号表电流值存入第 n 行 2 列单元格
End If
If th(0) = 2 Then
Text2t.Text = vol & " V" ' 文本框显示2 号表测量值
Text2h.Text = cur & " I"
mysheet.Cells(n, 4).Value = Time ' 当前时间存入第 n 行 4 列单元格
mysheet.Cells(n, 5).Value = vol ' 2 号表电压值存入第 n 行 5 列单元格
mysheet.Cells(n, 6).Value = cur '2 号表电流值存入第 n 行 6 列单元格
End If
End If
mybook.Save ' 保存工作薄(读 1 次表保存 1 次)
End If
Select Case  ' 设置oncomm事件,读取片机内存的值
Case comEvReceive
Inputsignal = MSComm1.Input
Text2.Text = Asc(Inputsignal) ' 单片机内存的值用Text2显示出
Case Else
End Select
End Sub' 绘制坐标系子函数
Private Sub Picture1_Paint() '绘制坐标系
Dim x As Integer
Dim y As Integer
Picture1.Scale (-100, 70)-(1600, -10) '定义坐标系'画坐标系
Picture1.ForeColor = RGB(200, 5, 200)
Picture1.DrawWidth = 1
Picture1.Line (0, 0)-(0, 65)
Picture1.Line (0, 0)-(1550, 0) '画电压坐标点(以10v为1个单位)
Picture1.ForeColor = RGB(0, 0, 255)
Picture1.DrawWidth = 4
For y = 0 To 60 Step 10
Picture1.PSet (0, y)
Next y '画电压坐标点(以1v为1个单位)
Picture1.ForeColor = RGB(0, 0, 255)
Picture1.DrawWidth = 2
For y = 1 To 59
Picture1.PSet (0, y)
Next x '画时间坐标点(以1小时为1个单位)
For x = 0 To 1440 Step 60
Picture1.PSet (x, 0)
Next x '画时间坐标点(以6小时为1个单位)
Picture1.ForeColor = RGB(0, 0, 255)
Picture1.DrawWidth = 4
Picture1.PSet (720, 0)
Picture1.PSet (360, 0)
Picture1.PSet (1080, 0)
Picture1.PSet (1440, 0)
End SubPrivate Sub Time1_Timer()
Dim out(2) As Byte ' 定义向仪表发送读指令的数组
No = No + 1 ' 改变仪表地址(No 在通用声明中定义)
If No = 1 Then
out(0) = &H1 '1 号仪表地址 1 存入 out(0)
out(1) = &H0 ' 读控制字 0 存入 out(1)
out(2) = out(0) Xor out(1) ' 异或校验存入 out(2)
MSComm1.Output = out ' 发送 1 号仪表的读数指令
End If
If No = 2 Then
out(0) = &H2 '2 号仪表地址 2 存入 out(0)
out(1) = &H0 ' 读控制字 0 存入 out(1)
out(2) = out(0) Xor out(1) ' 异或校验存入 out(2)
MSComm1.Output = out ' 发送 2 号仪表的读数指令
End If
If No = 2 Then ' 若测量系统只有两只仪表时
No = 0 ' 表地址变量清 0(从第 1 只表开始)
End If
End SubPrivate Sub Time2_Timer()
'用来实时提取串口数据并实时绘图。测电压可每分钟提取一次数据
Dim t As Single
t = Val(Text2.Text) '绘制电压实时变化曲线
'绘制电压实时变化曲线
Picture1.ForeColor = RGB(0, 0, 255)
Picture1.DrawWidth = 3
x = x + 1
Picture1.PSet (x, t)
If x > 1440 Then
Picture1.Cls
x = 0 '刷新坐标系
Call Paint
End Sub

 
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 单片机 工作表 excel 电流表 仪表 
2014-03-25 16:50
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:10 
1、第一代码段中,有一行,不知道是你发上来出现了错误还是原来的就是源代码就错了。
  End SubPrivate Sub Command2_Click()
这行应该在 sub 后面, private 前面 这里换行。
再找一下,第二个代码段中,也存在这个问题, SubPrivate 都连在一起了。

2、 cur = Format$(cur, "0.0")
cur 是一个单精度的浮点数据, 你经过 format 后,得到的结果再给 它,又还原成当小于1时,不显示前导 0 ,后面小数倒给四舍五入的。
    如果仅仅是四舍五入,应该使用 round 函数。

3、Text1t ,Text1h ,Text2t ,Text2h ,这四个文本框在界面上没看到。

4、这个代码真是直写的,可以看出没怎么优化。

授人于鱼,不如授人于渔
早已停用QQ了
2014-03-26 09:36
vbvcr51
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:18
帖 子:364
专家分:1724
注 册:2013-11-3
收藏
得分:10 
通信用到握手协议技术吗? 虽然距离短,不会直接就传数据了吧
2014-03-26 12:45
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
它就是直接传数据。

上位机发 三字节,
1字节,选择 表号,
2字节,地址,永远是 0
3字节, XOR 校验字节。 1 Xor 2

下位机数据,6字节
1字节,表示 表号、
2,3 字节,表示 电压,高位在后
4,5 字节,表示 电流,高位在后
6 字节,XOR校验  ((( 1 XOR 2 )xor 3) xor 4 ) xor 5

电压:得到的值, *50 再 /1024 ,得到
电流:得到的值,*100 再 /1024

看的稀里糊涂。

[ 本帖最后由 风吹过b 于 2014-3-26 14:40 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2014-03-26 14:39
水到渠成VB
Rank: 1
来 自:黑龙江
等 级:新手上路
帖 子:21
专家分:5
注 册:2013-9-24
收藏
得分:0 
错误出现在哪?
2014-04-04 16:06
gly121521635
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-10-25
收藏
得分:0 
lz有串口调试助手代码没?可以让我拜读一下不?
2014-11-02 20:03
快速回复:基于vb的上位机智能仪表监控程序设计
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026420 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved