用VB做的配料系统,现在界面部分已经基本完成,就差通讯和数据库报表查询~~头疼中
用MCSomm与RS-232通讯,具体过程如下
系统主要是控制六路斗秤下料,由在系统中输入所需料重后,点击“运行”斗秤的开关门电机控制关门——控制电震机震动——斗秤的称重传感器称重并返回数据,当数据和输入的数值相等时,电震机停止震动——称重传感器再次称重并输出到文本框——斗秤的开关门电机控制开门,等到称重传感器的值不再变化——斗秤关门,所有斗秤都关门(6路)——控制皮带电机转动,到达设定时间又开始新的一轮循环称重的实际值如果和给定值有差值,能在下一次循环中补偿,能用数据库记录每次每一路的数值并可以手动控制,比如点击“1号下料”1路电震机下料,点击“3号停止”3号电震机停止,点击“4号开门”四号斗秤开门,点击“6号关门”六号斗秤关门部分通讯代码如下:
串口初始化模块:
Private Sub Form_Initialize()
MSComm1.CommPort=1 使用COM1口
MSComm1.Settings=”9600,N,8,1”
MSComm1.InputLen=0 输入时读整个缓冲区
MSComm1.PortOpen=True 打开端口
End Sub
数据读取及显示模块:
Private Sub Command1_Click()
Dim Instring As String 第一变量
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3) 计算机发送指令(这句是什么意思?)Do While MSComm 1.inbuffercount<14 等待接收全部数据
Doevents
Loop
Instring=MSComm 1.Input 取重量数据并显示
Text1=Instring
End sub
退出模块:
Private Sub Form_QueryunLoad()
MSComm1.PortOpen=False 关闭端口
End sub以上是我找到的参考论文中的代码,这个是不是只能控制称重部分?只是1路的?我需要6路,并且可以完成上述复杂控制
而且可以在无料的时候测试秤的重量(皮重)测量到的数值可以被保存,并且发送给称重传感器的数据=输入数据+所侧皮重(6路分别都是)虚心求教完整代码及说明,本人对VB很菜,希望好心人帮忙~!!!!!!!!!!!!
我手里的所有分都拿出来了,谢谢谢谢谢谢谢~~~~~~~~~~~~~~~~~!!!!!!!!!QQ:71780622
用MCSomm与RS-232通讯,具体过程如下
系统主要是控制六路斗秤下料,由在系统中输入所需料重后,点击“运行”斗秤的开关门电机控制关门——控制电震机震动——斗秤的称重传感器称重并返回数据,当数据和输入的数值相等时,电震机停止震动——称重传感器再次称重并输出到文本框——斗秤的开关门电机控制开门,等到称重传感器的值不再变化——斗秤关门,所有斗秤都关门(6路)——控制皮带电机转动,到达设定时间又开始新的一轮循环称重的实际值如果和给定值有差值,能在下一次循环中补偿,能用数据库记录每次每一路的数值并可以手动控制,比如点击“1号下料”1路电震机下料,点击“3号停止”3号电震机停止,点击“4号开门”四号斗秤开门,点击“6号关门”六号斗秤关门部分通讯代码如下:
串口初始化模块:
Private Sub Form_Initialize()
MSComm1.CommPort=1 使用COM1口
MSComm1.Settings=”9600,N,8,1”
MSComm1.InputLen=0 输入时读整个缓冲区
MSComm1.PortOpen=True 打开端口
End Sub
数据读取及显示模块:
Private Sub Command1_Click()
Dim Instring As String 第一变量
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3) 计算机发送指令(这句是什么意思?)Do While MSComm 1.inbuffercount<14 等待接收全部数据
Doevents
Loop
Instring=MSComm 1.Input 取重量数据并显示
Text1=Instring
End sub
退出模块:
Private Sub Form_QueryunLoad()
MSComm1.PortOpen=False 关闭端口
End sub以上是我找到的参考论文中的代码,这个是不是只能控制称重部分?只是1路的?我需要6路,并且可以完成上述复杂控制
而且可以在无料的时候测试秤的重量(皮重)测量到的数值可以被保存,并且发送给称重传感器的数据=输入数据+所侧皮重(6路分别都是)虚心求教完整代码及说明,本人对VB很菜,希望好心人帮忙~!!!!!!!!!!!!
我手里的所有分都拿出来了,谢谢谢谢谢谢谢~~~~~~~~~~~~~~~~~!!!!!!!!!QQ:71780622
Dim Instring As String
' chr(2), chr(3) 是起始和停止标志字节
' 中间的数据是 AB03
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
' 底层设备的应答有 14 字节,这里采用轮询方式等待应答数据
Do While MSComm 1.inbuffercount <14
Doevents
Loop
'取重量数据并显示
Instring=MSComm 1.Input
Text1=Instring
End sub PC 端发送什么样的命令以及如何解释返回的数据,与应用层的协议有关。也就是你的配料系统微处理器是如何解释你的命令,返回什么样的应答数据。
搞清楚这些,通过编程实现连续动作还是单步操作,都不成问题。
我需要发送输入到文本框中的重量设定数据(10进制数),发送电动机、开关门电机、的开关控制(不知道这是什么样的命令)刚才在百度上查也没有查到,郁闷中~~~~~~~~~
我再查~~~~~~~~~~~~~~
9600bps波特率,8位数据位,1位停止位,无校验。
地址:十六进制表示的字节01H~1FH
命令:ASCII表示的英文字符'QUYA'
数据:ASCII 表示的十六进制
校验:ASCII 表示的前十六字节二进制加和的2个字节,转变为十六进制ASCII占4字节。命令格式:
地址(2字节) 命令(4字节) 数据(12字节) 校验(4字节) 数据格式:'AAMMNN000000'
Dim Instring As String 第一变量
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3) 计算机发送指令(这句是什么意思?)Do While MSComm 1.inbuffercount <14 等待接收全部数据
Doevents
Loop
Instring=MSComm 1.Input 取重量数据并显示
Text1=Instring
End sub 这一段我没有看明白,一般都是在mscomm的事件中控制字符串的接收的。
RThreshold属性必需设置,(按照你上面的协议此处应该设置为20)
同时inputmod 必需设置为1才可以接收2进制数据。接收数据在下面过程中写
Private Sub MSComm1_OnComm()
Dim Arey() As Byte
Dim Comm_Str As Variant
If MSComm1.CommEvent = 2 Then
Comm_Str = MSComm1.Input
Arey = Comm_Str End If
End Sub上面的Arey数组你就可以进行随心所欲的处理了。(我当时编程的时候把单词拼写错了,不好意思)同时你也可以将
RThreshold = 1
哪么你就可以对当前数据线上的数据进行地址判断了。同时你的这套系统应该使用的是485总线,这样就可以并联更多的设备,同时距离也不用受限制。记得给分。
Private Sub MSComm1_OnComm()
Dim Arey() As Byte
Dim Comm_Str As Variant
If MSComm1.CommEvent = 2 Then
Comm_Str = MSComm1.Input
Arey = Comm_Str End If
End Sub 上面的Arey数组你就可以进行随心所欲…
“这一段是什么意思呢?能简单解释一下吗?”
那我写上上面这段代码就可以完成我所需要的全部通讯吗?看着好简单哦~!呵呵
最好有代码的解释,我比较菜了~呵呵。下面是程序连接~~~~~要是好心帮我把里面的代码也解释一下就太太太太感激了~!http://download.csdn.net/source/468165
Comm1.PortOpen = False
End If
Comm1.CommPort = 6 '打開端口路
Comm1.PortOpen = True
Arey,為接收到的數據
只要能完成上述功能,怎样都可以
名称:从N通道读取模拟量输入数据
说明:按照当前格式返回模拟量输入模块8通道中第N通道输入值
格式:#AAN(CR)
#为分界符
AA(范围00~FF)表示模拟量输入模块的2位十六进制地址。
N表示由N通道读取数值,数值范围是0~7V
(CR)是终结符,用回车表示
响应:>(数据)(CR)
当输入模块的命令存在语法错误、模块通讯错误、没有专用地址时模块没有响应。
>是分界符
(数据)是第N 通道的数据输入值。
(CR)是终结符,用回车表示。
例如:命令 #120(CR)
响应 >+1.4567(CR)
命令查询地址为21h的模拟量输入模块的第0通道的输入值。
模拟量输入模块第0通道的输入值等于+1.4567。
注:其中返回值为A/D转换后的电压值,重量数值需要转换一下。
就用MODBUS-RTU通讯协议吧,http://hi.baidu.com/lbicecoffe/blog/item/fc73eaeede8f9bffb3fb95a9.html
#K1:1@ 表示打开第一个开关通道 #K1:0@ 表示关闭第一个开关通道 #K1@ 表示查询第一个开关通道状态
还有,#K@表示查询所有开关通道
传回 #K1:1@ 表示第1个开关通道的状态为开启 #K:00000010@ 表示对应的各开关通道状态设备AD通道格式与此相仿 #A1:0983@ 表示AD通道1的当前值为0983
马上要交了,好心人帮帮我吧~~~~~~~~~~~~~~~~~~~~~谢谢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我找的那些通讯协议都不可以吗?哭了~!!!!!!!!!!!!!
要什么样的才行啊~?要怎么找啊~?我的设计是串口——RS232——RS232 转 RS485谢谢提供编程例子~~~~~~~~!要控制多从机的,一对一通讯的例子已经有了。各位大哥大姐求救啊~!!!!!!!!!!跪谢~!!!!!!!!!!!!又开了一个感谢贴子,那个帖子的感谢分一同加上~!!!!!!!
http://topic.csdn.net/u/20080601/22/d7d39aa3-a974-42b2-8190-6db8d4365dec.html
其中第一字节是帧头,值为16进制的FF,表示这一组数据的开始,也就是你用MSComm1.Input这个方法取得串口数据时,取得的第一个字节的内容必须是255(也就是16进制的FF),如果不是255就表示这是一组垃圾数据。第二个字节有8个位(bit),其中第0、1、2位(bit)对应的是小数点位置,第3位(bit)对应NC等等依此类推,比如第二字节转换成二进制以后为00100000,
其对应为D7=0 D6=0 D5=1 D4=0 D3=0 D2=0 D1=0 D0=0,根据协议的解释D4=0表示称重不稳定,D5=1表示称重为负值等等第三至第五字节为具体的称重重量,以BCD码进行存储,其中低位在前高位在后,也就是说实际的重量应该用(第五字节的值*16*16+第四字节的值*16+第三字节的值)这种方法进行计算。
命令以#开始,以@结束,以:分隔 斗秤开关量输出:
功能码:01 1BYTE 0X01
地址:01-06 1BYTE 0X01——0X06
1为打开,0为关闭 1BYTE 0X01——0X00开关量输入(查询)
功能码:02 1BYTE 0X02
地址:01-06 1BYTE 0X01——0X06
1为以打开,0为已关闭 1BYTE 0X01——0X00电振机开关量输出:
功能码:03 1BYTE 0X01
地址:01-06 1BYTE 0X01——0X06
1为打开,0为关闭 1BYTE 0X01——0X00开关量输入(查询)
功能码:04 1BYTE 0X02
地址:01-06 1BYTE 0X01——0X06
1为以打开,0为已关闭 1BYTE 0X01——0X00
数字量输出
功能码:05 1BYTE 0X03
地址:01-06 1BYTE 0X01——0X06
输出数据 2BYTE 0X0000——0XFFFF数字量输入(查询)
功能码:06 1BYTE 0X04
地址:01-06 1BYTE 0X01——0X06
输入数据 2BYTE 0X0000——0XFFFF格式:#0X010X010X01@不知道还有什么欠缺或者不合理的地方~~~?如果按上面的协议应该怎么写呢?要检查所有开关是否关闭——如果关闭——称重传感器测皮重并把重量用10进制值显示在6个文本框(已经用D/A转换为数字量)——打开所有电振机——检测6个斗秤的重量和给定值(6个命令按钮中(我用的命令按钮显示数据)的10进制数据)相同时,哪一路相同了,关闭哪一路的电震机,等待电震机都关闭了,测所有斗秤重量,返回显示到另外6个命令按钮中。同时打开斗秤开关门,等待所有料都下完——斗秤关门,开始下一周期
我还真没听过没下位机,就要上位机凭空生出通讯协议,还要把东西做出来的,你们是什么学校什么专业什么老师啊,服了。
感谢大家的帮助~~~~~~~~·那我就听取大家的意见,随便弄代码吧不过,要是我这个控制6个东西的,代码应该怎么改呢?Private Sub Command1_Click()
Dim Instring As String
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
Do While MSComm 1.inbuffercount <14
Doevents
Loop
Instring=MSComm 1.Input
Text1=Instring
End sub 比如说这个
Instring=MSComm 1.Input
Text1=Instring 我需要把读到的六路数据放到六个命令按钮里显示
感谢大家的帮助~~~~~~~~·那我就听取大家的意见,随便弄代码吧不过,要是我这个控制6个东西的,代码应该怎么改呢?Private Sub Command1_Click()
Dim Instring As String
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
Do While MSComm 1.inbuffercount <14
Doevents
Loop
Instring=MSComm 1.Input
Text1=Instring
End sub 比如说这个
Instring=MSComm 1.Input
Text1=Instring 我需要把读到的六路数据放到六个命令按钮里显示
如果真要控制应该是根据用户的操作和通讯协议构造出一个数据帧,然后用Mscomm1.output把相关的指令发送下去,然后再通过mscomm1.input读取下位机返回的结果。
你那导师估计也没打算让你做出实际东西来,本科毕设过不过关键还是看工作量。工作量够了,答辩没严重问题就过了。只要你那套通讯协议包括 发送:设备地址、设备指令、指令参数 接收:设备地址、设备返回类型、设备返回参数 基本上就算完成任务了。我们毕业那年碰上本科教育评估,毕设检查得特严,但最后凡是工作量够的都过去了。
Private Sub commCOM_OnComm()
Select Case commCOM.CommEvent
Case comEvReceive
Dim DataReceived() As ByteIf commCOM.CommEvent = "#K:000000@" Then ‘所有的开关门都打开的话
commCOM.InputLen = 0commCOM.OutBufferCount = 0
commCOM.Output = "#KZ:111111@" ’打开所有电振机
End If
If commCOM.CommEvent = "#KZ:111111@" Then ‘所有电振机都是开的ReDim DataReceived(i) As Byte
DataReceived() = commCOM.Input
End If
Command1(12).Caption = DataReceived(0) ’将输入数据显示到6个按钮
Command1(13).Caption = DataReceived(1)
Command1(14).Caption = DataReceived(2)
Command1(15).Caption = DataReceived(3)
Command1(16).Caption = DataReceived(4)
Command1(17).Caption = DataReceived(5)End Select
End Sub
-----------------------------------------------------------------Public Function funSendCommand(Command As String) As Boolean
On Error GoTo lopError
'------------------------------------------------
Dim vResult() As Boolean
vResult(0) = Command1(6).Caption
vResult(1) = Command1(7).Caption
vResult(2) = Command1(8).Caption
vResult(3) = Command1(9).Caption
vResult(4) = Command1(10).Caption
vResult(5) = Command1(11).Caption If Not commCOM.PortOpen Then
GoTo lopError
Else With commCOM
.OutBufferCount = 0
.Output = "#AD@" + vResult ‘输出控制称重传感器和6个称重的数值
End With
End If
vResult = True
funSendCommand = vResult
For i = 6 To 11
For j = 12 To 17
frmindex.Controls("command" & j).Caption = "command" & i ‘当称重数值和给定值相同时
Next
End Sub
commCOM.OutBufferCount = 0
commCOM.Output = "#KZ:000000@" + "#K:111111@" + "#P:1" ’输出关闭所有电振机,打开所有秤门,打开皮带传输电机
Dim Start As Single
Start = Timer6 ‘延时
Do While Timer6 < Start + PauseTime
DoEvents
Loop
commCOM.Output = "#K:000000@" ’关闭所有秤门
'------------------------------------------------
Exit Sub
'----------------
lopError:
funSendCommand = False
End Sub
Public Function funGetData() As String
funGetData = vResult
End FunctionPublic Function funClearData()
vResult = ""
End Function
------------------------------------------------------------------------------------------
请问~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这么写可以吗?~~~~~~~~~~~~~~~~
会返回 14位结果 这是 通讯协议
从机返回:str(数据) & vbKeyReturn这种协议很方便实用,当时我用的Faulhaber(没拼错的话)电机控制器的传输协议也差不多就这个样子。你可以上网找找这个东西的资料,德国的空心杯电机公司。比如你要3号设备开始抖100下,可以这么定:
"A3Shake100" & vbKeyReturn再如要获得1号设备状态可以这么定:
"A1GetStatus0" & vbKeyReturn
然后在接受事件里面将返回的字符串取出来现在信息大爆炸,在搜索引擎搜“串口通讯”这么模糊的字眼会有很多重复信息和垃圾信息的。我们学校都快答辩了,你还有事件做么?