搜档网
当前位置:搜档网 › VB与FXPLC串口通讯

VB与FXPLC串口通讯

VB与FXPLC串口通讯
VB与FXPLC串口通讯

VB与FXPLC串口通讯

一.前言

随着生产自动化程度的不断提高,可编程序控制器PLC得到了广泛的应用,特别是小型PLC 具有编程简单、性能可靠和价格低的特点,被大量应用于单机控制系统中,如啤酒的稀释控制、离心机控制等。作为设备维修技术人员,一般都能掌握PLC和计算机PC的应用知识,但如何利用PLC和PC来设计小型自控系统,实现简单的数据采集和监控操作,从而满足生产需要,却是一个要深入学习研究的问题。

面向生产操作,设计简单有效的控制系统,涉及到三部分的软件编程:

第一:PC上人机操作界面的设计。PC作为上位机,一般都是运行在Windows 98/2000操作系统下,利用微软提供的可视化编程软件Visual Basic 6.0,设备维修技术人员就可设计出优美的人机操作界面,只需进行主要操作功能编程和少量界面控制编程。

第二:实现生产工艺要求的PLC控制程序设计。因为是小型控制系统,其生产控制过程并不复杂,技术人员只要充分了解了生产工艺和控制要求,运用PLC编程工具,此部分设计编程并不难。

第三:PC与PLC通讯程序的设计。此部分的开发设计较难,需要掌握PC和PLC的有关通讯硬件驱动和通讯协议的知识。但对于小型控制系统来说,主要通过PC串口来通讯,所以通讯程序设计的关键是如何利用Visual Basic 6.0中的串口通信控件——MSComm控件,并根据PLC的串口通信协议设计出上下位机的数据交换程序。

下面以啤酒稀释自控系统设计为例,主要讲解PC和PLC通讯程序的设计要点。

二.啤酒稀释自控系统设计分析

1. 啤酒稀释控制要求

啤酒稀释是啤酒生产中一个重要环节,通过把高浓度的酒液与脱氧水按比例混合成稀释酒,从而提高啤酒产量和增加啤酒品种,稀释的控制过程很简单,主要步骤有:

1) 输入高浓度的浓度A和稀释后要达到的浓度B ;

2) 计算出加水量的百分比 [(B-A) / A]*100% ;

3) 根据此百分比和高浓酒的瞬时流量,计算出脱氧水要达到的流量;

4) 比较水的瞬时流量和计算出的流量,来控制水调节阀的开度,使水瞬时流量等于计算流量。

由于酒和水的瞬时流量是变化的,所以3)、4)步要反复进行。以上所有的计算功能和PID 调节功能都由PLC完成。

2. 啤酒稀释的人机操作界面:

人机操作主要用来输入啤酒浓度数据、操作命令,直观显示各种流量数据并记录偏差曲线,界面图如下:

3. 硬件配置

本例子中上位机PC选用联想奔腾Ⅱ品牌机,外加RS232转RS485通讯转换卡。下位机PLC 选用三菱FX2N-16MR,另加模拟输入模块FX2N-2AD 和模拟输出模块FX2N-2DA各一块,外加一个485串口通讯模块PC-485BD。

三. PC与PLC通讯程序设计分析

在分析具体的VB通讯程序之前,先要介绍有关VB串口通信控件MSComm的应用知识和

三菱PLC 通讯协议。

1. MSComm控件简介

如图所示是Mscomm控件的图标。

它可以用来提供简单的串行端口通信功能,也可以用来创建功能完备、事件驱动的高级通信工具。Mscomm控件提供了一系列标准通信命令的使用界面。使用它可以建立与串行端口的连接,通过串行端口再连接到其它设备(如调制解调器、PLC),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。

2. MSComm控件的基本属性

MSComm 控件有很多重要的属性,基本属性如下:

属性描述

CommPort 设置并返回通讯端口号。

Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。

Input 从接收缓冲区返回和删除字符。

Output 向传输缓冲区写一个字符串。

如下程序打开串行端口COM1

https://www.sodocs.net/doc/fc3601847.html,mPort = 1 使用 COM1

MSComm1.Settings = "9600,N,7,1" 9600波特率,无奇偶校验,7位数据,一个停止位。MSComm1.PortOpen = True ''''''''''''''''打开端口,开始通信。

3. MSComm控件的通信方式

通信控件有2种不同的方式来处理和解决各类通信软件的开发和设计问题。

(1)事件驱动

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如:当线路数据到达本端或CD线和RTS信号线状态发生变化时,要求我们使用相应的事件来跟踪和出理。在这些情况下, Mscomm控件将触发OnComm事件,CommEvent属性值也将被改变。所以在OnComm事件中读取CommEvent属性值就可以检测和处理通信错误等方面的问题。

(2)查询方式

利用定时器控件Timer,我们可以设计程序每隔一段时间去读取CommEvent的值并处理所发生错误和事件。

4. 本实例中采用的通讯方式

在本例子中,PC与PLC 采用无握手协议的串行通信,它们只用两根数据线 TD和RD、一根信号地线连接,数据通信采用查询方式。根据系统功能要求,PC需发送两种类型的命令:(1) 周期性命令,它由定时器触发引起,每隔0.5秒发送一次。用它来向PLC查询实时显示的数据。如酒、水的瞬时流量,调节阀开度等。

(2) 非周期性命令,它由操作者按动命令按钮引起,非周期性发送。用它来传送输入参数、操作命令给PLC 。

在啤酒稀释的人机操作界面中,有运行时不可见的通信控件(MSComm1)一个、定时器控

件一个Timer1。通信控件(MSComm1)用于初始化串口数据并打开串口;定时器控件(Timer1)用于每隔0.5秒执行通讯命令,把查询命令从PC发送到PLC,同时接收PLC返回的应答数据。设计通讯数据的发送和查询功能,必须掌握PLC所遵循的通讯协议。

5. 三菱FX系列PLC通讯协议

三菱FX系列PLC共有四种通信模式,本实例采用的是PLC与计算机专用协议通信方式(无须PLC编程,电脑直接读写操纵PLC),其通讯命令字和通讯格式介绍如下:

PC发送给PLC的通信命令字

命令字注释

BR 以1点为单位,读出位元件的状态

WR 以16点为单位,读出位元件的状态,或以1字为单位,读出字元件的值

BW 以1点为单位,写入位元件的状态

WW 以16点为单位,写入位元件的状态,或以1字为单位,写入值到字元件

BT 以1点为单位,设置/复位位元件

WT 以16点为单位,设置/复位位元件,或以1字为单位,写入值到字元件

RR 控制PLC运行RUN

RS 控制PLC停止STOP

PC 读出PLC设备类型

TT 连接测试

PC发送给PLC的通信命令格式

约定说明:ENQ为请求标志,ASCII值5,VB中以chr(5)表示;

ACK为正确标志,ASCII值6,VB中以chr(6)表示;

STX为请求标志,ASCII值2,VB中以chr(2)表示;

EXT为请求标志,ASCII值3,VB中以chr(3)表示;

表格中粗体字为需要求和效验的部分;

和效验为每一项的ASCII值的总和转换成十六进制后,取其低两位;

站号、PLC号、元件数量、和效验都是以十六进制表示;

等待延时为0-150毫秒,以十六进制0H-FH表示,如100ms为AH。

1) 批量读出位元件—BR指令格式

1 2 3 4 5 6 7 8 15 16 17

PC侧: ENQ 站号 PLC号 BR 延时首地址数量和校验 ACK 站号 PLC号

PLC侧: STX 站号 PLC号数据 EXT 和校验

9 10 11 12 13 14

例如:要读出站号为5的PLC的X40到X44共5点的状态值,延时100毫秒,假设PLC

中X40与X43为OFF,其余为ON,则指令数据如下:

注释:请求站号 PLC号命令延时元件首地址元件数量和校验

代码: ENQ 0 5 F F B R A X 0 0 4 0 0 5 4 7

ASCII码: 05H 30H 35H 46H 46H 42H 52H 41H 58 30H 30H 34H 30H 30H 35H 34H 37H

只要将以上代码以字符串形式(VB中可以表示为chr(5)&”05FFBRAX00400547”)发送到PLC,就会有正确的回应信息,如下:

注释:头站号 PLC号位元件状态值尾和校验

代码: STX 0 5 F F 0 1 1 0 1 EXT E 7

ASCII码: 02H 30H 35H 46H 46H 30H 31H 31H 30H 31H 03H 45H 37H

2) 批量读出字元件—WR指令格式

1 2 3 4 5 6 7 8 15 16 17

PC侧: ENQ 站号 PLC号 WR 延时首地址数量和校验 ACK 站号 PLC号

PLC侧: STX 站号 PLC号数据 EXT 和校验

9 10 11 12 13 14

该命令使用与BR命令相同。

3) 批量写入位元件—BW指令格式

1 2 3 4 5 6 7 8 9

PC侧: ENQ 站号 PLC号 BW 延时首地址数量写入值和校验

PLC侧: ACK 站号 PLC号

10 11 12

4) 批量写入字元件—WW指令格式

1 2 3 4 5 6 7 8 9

PC侧: ENQ 站号 PLC号 WW 延时首地址数量写入值和校验

PLC侧: ACK 站号 PLC号

10 11 12

6. VB通讯功能块设计分析

根据三菱PLC的通讯指令格式,在PC中编写数据查询功能块RevData( )和数据发送功能块SendData( ),就可以在定时中断处理块TIMER1( )中调用查询功能块RevData( ),实现PC界面数据定时刷新;在每一次操作命令执行时,调用数据发送功能块SendData( ),把控制值写入PLC中,从而实现控制。下面给出这两个功能块的设计程序。

1) 查询数据函数RevData( )

(没有和校验)

Sub RevPLC (iNo As String, iType As String, iAdd As String, iNum As String)

'''''''''''''''' iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量

Dim Stmp As String

Dim cha, j As Integer

Dim ChaCount As Integer

Dim Comm As String

Select Case iType

Case "D" ''''''''''''''''查询数据寄存器的值

Comm = "WR" ''''''''''''''''命令类型:数据字读

cha = Val("&H" & iNum) * 4 ''''''''''''''''数据寄存器的值为十六进制表示,占4个字符

Case "M", "X", "Y" ''''''''''''''''查询继电器触电的值

Comm = "BR" ''''''''''''''''命令类型:二进制位读

cha = Val("&H" & iNum)

End Select

iAdd = Right$("000" & iAdd, 4)

iNum = Right$("0" & iNum, 2)

Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum ''''''''''''''''输出命令格式ChaCount = 6 + cha ''''''''''''''''要返回字符个数

main.MSComm1.InBufferCount = 0 ''''''''''''''''输入缓冲区清零

main.MSComm1.Output = Stmp ''''''''''''''''设传送缓冲区内容为命令格式

Now=Second()

Do

DoEvents ''''''''''''''''转让控制权,以便让操作系统进行数据传输

If Second()-Now>1 Then Exit Sub

Loop Until main.MSComm1.InBufferCount = ChaCount ''''''''''''''''当接收到规定字符时停止循环RevDataTmp = Mid$(main.MSComm1.Input, 6, cha) ''''''''''''''''返回数据字符串保存在全局变量

''''''''''''''''RevDataTmp中

End Sub

2) 发送数据函数SendData( )

(没有和校验)

Sub SendPLC(iNo As String, iType As String, iAdd As String, iNum As String, ivalue As String) '''''''''''''''' iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量,ivalue为写入值

Dim Stmp As String

Dim Comm As String

Select Case iType

Case "D" ''''''''''''''''写数据寄存器的值

Comm = "WW" ''''''''''''''''命令类型:数据字写

ivalue = Right$("0000" + Hex$(Val(ivalue)), 4) ''''''''''''''''写入值转换成十六进制表示

Case "M" ''''''''''''''''写继电器触点的值

Comm = "BW" ''''''''''''''''命令类型:二进制位写

End Select

iAdd = Right$("000" & iAdd, 4)

iNum = Right$("0" & iNum, 2)

Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum & ivalue ''''''''''''''''输出命令格式

MSComm1.Output = Stmp ''''''''''''''''输出命令到传送缓冲区

Now= Second()

Do

DoEvents ''''''''''''''''转让控制权,以便让操作系统进行数据传输

If Second()-Now>1 Then Exit Sub

Loop Until main.MSComm1.OutBufferCount = 0 ''''''''''''''''当命令传送完时停止循环

End Sub

四.总结:

生产自控系统的设计要解决好三部分的问题:PC上人机操作界面的编制,PC与PLC的通信程序编写,PLC生产控制程序的编写。对于串行通信的单机自控系统,因为具有操作界面和生产工艺流程简单的特点,所以利用Visual Basic设计操作界面和利用PLC编程语言设计生产控制程序都比较方便,但对如何编写通信程序就比较陌生,也没有许多相关资料可学习。本文介绍的方法简单、实用,供各位参考。利用通信控件MSComm的OnComm事件和CommEvent属性还可以设计出功能更完善的通信程序。

VB6.0下MSComm控件实现串口通信

VB6.0下用MSComm控件实现串口通信 MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能,以下先对其属性进行详细的说明后再举一个例子进行说明: 1基本属性 CommPort O https://www.sodocs.net/doc/fc3601847.html,mPort[=value] Object为MSComm控件,value为整数值,标志端口号。 说明:该属性设置并返回通讯端口号,value的值可以设为1-16间的任意数(默认为1)。在打开端口之前必须先设置CommPort属性,当端口不存在时,如果用PortOpen属性打开它,MSComm控件会产生错误68(即设备无效的错误)。 Settings Objiect.Setting[=value] Object为MSComm控件,value为字符串类型,表示通讯端口的设置值。 说明:本属性用来设置并返回端口的波特率、奇偶校验位、数据位和停止位参数。当端口打开时,如果指定的value参数非法,则MSComm控件产生380号(非法属性值)错误。有效的value参数值由四个设置值组成,有如下格式:“BBBB,P,D,S”,其中BBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。Value的默认值为:“9600,N,8,1”,下面给出合法的波特率、奇偶校验位、数据位和停止位参数: 波特率:110,300,600,1200,2400,4800,9600(默认),14400,19200,28800,38400,56000,57600,115200,128000,256000。 奇偶校验值:E(偶校验,Even)、M(标记,Mark)、N(默认,Default,None)、O(奇校验,Odd)、S(空格,Space)。 数据位值:4,5,6,7,8(默认),9。 停止位值:1(默认),1.5,2。 PortOpen O bject.PortOpen[=value] Object为MSComm控件。Value为布尔类型,表明通讯端口的状态。 说明:本属性用来设置或返回通讯端口的状态(开或关)。在设计时本属性无效。 设置PortOpen属性为True时端口将会被打开。设置为False时将关闭端口并清除接收和传输缓冲区中的数据。当应用程序终止时,SMComm控件自动关闭串行端口。 在打开端口之前,必须给CommPort属性设置一个合法的端口号。如果CommPort属性被设置成一个非法的端口号,则在打开端口时,MSComm控件将产生错误码为68(表示设备无效)的错误。另外,串行端口设备必须支持Settings属性的当前设置值。如果Settings属性包含硬件不支持的通讯设置值,则硬件可能不会正常工作。如果在端口打开之前,DTREnable 或RTSEnable属性被设置为True,则在关闭总线时,这些属性将被设置为False。否则DTR 和RTS线仍将保持其先前的状态。 Input Object.Input Object为MSComm控件。

VB串口通信(附图教程)

界面如下: 代码如下: Private Sub Form_Load() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Else End If Combo1.AddItem "COM1" Combo1.AddItem "COM2" Combo1.AddItem "COM3" Combo1.AddItem "COM4" Combo1.AddItem "COM5" Combo1.AddItem "COM6" Combo1.AddItem "COM7" Combo1.AddItem "COM8" Combo1.AddItem "COM9" Combo1.AddItem "COM10"

Combo1.AddItem "COM11" Combo1.AddItem "COM12" Combo1.AddItem "COM13" Combo1.AddItem "COM14" Combo1.AddItem "COM15" Combo1.AddItem "COM16" Combo1.ListIndex = 2 Combo2.AddItem "256000" Combo2.AddItem "128000" Combo2.AddItem "115200" Combo2.AddItem "57600" Combo2.AddItem "38400" Combo2.AddItem "28800" Combo2.AddItem "19200" Combo2.AddItem "14400" Combo2.AddItem "12800" Combo2.AddItem "11520" Combo2.AddItem "9600" Combo2.AddItem "4800" Combo2.AddItem "2400" Combo2.AddItem "1200" Combo2.AddItem "600" Combo3.AddItem "无None" Combo3.AddItem "奇Odd" Combo3.AddItem "偶Even" Combo4.AddItem "4" Combo4.AddItem "5" Combo4.AddItem "6" Combo4.AddItem "7" Combo4.AddItem "8" Combo5.AddItem "1" Combo5.AddItem "2" https://www.sodocs.net/doc/fc3601847.html,mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"

vb串口通讯usb通讯,很有用哦

vb串口通讯usb通讯,很有用哦 VB 完成串口通信。一种是用VB 提供的具有强大功能的通信控件;另一种方法 是调用WINDOWS API 函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/ 输出完成,该方法简便易行,但有一定的局限性。一、利用通信控件(MSCOMM) 完成串口通信 VB 提供了通信控件MSCOMM,文件名为MSCOMM. VBX。该控件可设置串行通信 的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信的情况,进行收发数据的处理。每个通信控 件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。 1、通信控件的事件及基本属性 (1)事件 OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及 错误进行处理。通过对CommEvent 属性的判断可知当前的通信错误和事件,分别 对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM—EV—SEND 表示发送事件。这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。 (2)属性 CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。 Setting :设置通信的信息格式,为字符型。顺序为:波特率、校验、数据位、停止位。 PortOpen :布尔型、开关通信口。 InputLen :从接收缓冲区读取字符个数。

Input ,Output :读取接收缓冲区或写入发送缓冲区字符。 以上五种属性对串口完成基本的设置和操作,下面的三种属性是描述如何利用VB 提供的事件驱动机制来实现通 信。 CommEvent :返回通信过程中产生的错误信息及事件,了解通信状况。SThreshold :设置并返回不触发OnComm事件时发送缓冲区被允许的最少字符数。当缓冲区的字符少于设置的值时,则触发OnComm事件,并把CommEvent 设为MSCOMMM—EV—SEND。当SThreshold = 0 则禁止发送触发OnComm 事件,当SThreshold = 1 则发送缓冲区为空时就触发OnComm事件。利用这一属性,就可完成发送数据后的一系列操作。如:对刚发送的数据进行处理,当串口是和MODEM通信时,发送完数据后可进行拆除线路联接、挂机等操作。 RThreshold :设置并返回不触发OnComm事件时接收缓冲区被允许的最多字符数。当缓冲区的字符多于设置的值时,则触发OnComm 事件,并把CommEvent 设为MSCOMM—EV—RECEIVE,当RThreshold = 0 则禁止接收触发OnComm 事件,当RThreshold = 1 则接收缓冲区有一个或更多字符时就触发OnComm事件。利用这一属性,就可完成对串口接收数据的处理。 2、利用通信控件的实例 Sub Form1 —load () form1. show ′设置COM1 comm1. commport = 1 comm1. Setting = " 9600 ,o ,8 ,1" ′波特率:9600 奇校验,8位数据,1 位停止位 comm1. Inputlen = 0 ′读取接收缓冲区的所有字符

VB6.0串口操作

VB6.0串口操作 职业2010-12-22 11:30:58 阅读60 评论0 字号:大中小订阅 一直想通过计算机人机界面来控制单片机,感觉用软件控制硬件,即计算机控制是一件比较有意思的事情。 计算机与单片机的连接,是通过串口来实现的。如何实现,我想应该明白VB怎样来操作串口,实现VB 操作串口,就可以把单片机串口线接入计算机,从而实现真正的计算机控制单片机。 这其他是别人早已实现了的,我因为是刚接触,就写下来留作纪念吧。。。 开发软件:Visual Basic 6.0企业版(VB6) 新建一个工程:标准EXE。 接下来做Form界面。 代码: Private Sub Combo1_Click() If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作 MSComm1.PortOpen = False End If https://www.sodocs.net/doc/fc3601847.html,mPort = Combo1.ListIndex + 1 End Sub Private Sub Command1_Click() Dim Temp(0) As Byte Dim strBuff As String If Option3.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & Text1 MSComm1.Output = Temp '发送一个16进制 Else strBuff = Text1 End If

If MSComm1.PortOpen = False Then MsgBox "请打开串口" End If On Error GoTo uerror MSComm1.Output = strBuff uerror: End Sub Private Sub Command2_Click() On Error GoTo uerror '发现错误跳转到错误处理 If Command2.Caption = "关闭串口" Then MSComm1.PortOpen = False Command2.Caption = "打开串口" '按钮文字改变 Shape1.FillColor = &HFFFFC0 '灯颜色改变Else MSComm1.PortOpen = True Command2.Caption = "关闭串口" Shape1.FillColor = &HFF End If Exit Sub uerror: msg$ = "无效端口号" '错误显示 Title$ = "串口调试助手" x = MsgBox(msg$, 48, Title$) '48标示显示警告图标 End Sub Private Sub Command3_Click() Text2.Text = "" End Sub Private Sub Command4_Click() Text1.Text = "" End Sub Private Sub Form_Load() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Else End If Combo1.AddItem "COM1" Combo1.AddItem "COM2" Combo1.AddItem "COM3"

用VB实现Modbus RTU串行通讯工程实例

用VB实现Modbus RTU串行通讯工程实例 声明:网上看到的,觉得不错,稍微整理了一下分享给大家。 用VB实现Modbus RTU串行通讯 在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus 协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对VB和Twido PLC间的通讯进行说明。 对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。 VB程序通过利用MSComm控件很容易就能够实现。 1.通讯口初始化: MSComm1.Settings = "9600,n,8,1" https://www.sodocs.net/doc/fc3601847.html,mPort = 1 MSComm1.SThreshold = 0 If Not MSComm1.PortOpen Then MSComm1.PortOpen = True 2. CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。 Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer) Dim data As Integer Dim i As Integer Addressreg_crc = &HFFFF For i = 0 To j Addressreg_crc = Addressreg_crc Xor cmdstring(i) For j = 0 To 7 data = Addressreg_crc And &H1

VB串口通信详细讲解

VB串口通信 目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。VB支持面向对象的 程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。在VB应用程序可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。 利用VB提供的这些功能,我们可以有三种方法完成串口通信。一种是用VB提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/输出完成,该方法简便易行,但有一定的局限性。 一、利用通信控件(MSCOMM)完成串口通信 VB提供了通信控件MSCOMM,文件名为MSCOMM. VBX。该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。在通信过程中可以触 发On Comm 事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent属性来了解通信的情况,进行收发数据的处理。每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。 1、通信控件的事件及基本属性 (1)事件 On Comm :通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行 处理。通过对CommEvent属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM —EV—SEND表示发送事件。这些信息可从VB提供的常量文件CONSTANT. TXT中查出。

VB串口通信程序代码

vb中怎样用mscomm控件实现串口通信 本问分两部分均来自https://www.sodocs.net/doc/fc3601847.html, 第一部分jessezappy(晶晶) ================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = False https://www.sodocs.net/doc/fc3601847.html,mPort = 1 '假定是用COM1口 ' 设定传输速率等,可依照您的需求更改 MSComm1.Settings = "9600,N,8,1" MSComm1.PortOpen = True '---------初始化Modem------------- MSComm1.Output = "ATZ" MSComm1.Output = "AT&F" MSComm1.Output = "ATE0" MSComm1.Output = "ATM1" MSComm1.Output = "ATQ0" MSComm1.Output = "ATV0" '--------------------------拨号------------- MSComm1.Output ="ATDT163" '拨163 '---------------------------接通后 MSComm1.Output ="SDFJDKSJLKFA" '发送字符串 '--------------------- Private Sub MSComm1_OnComm() '用串口事件捕捉数据.. If MSComm1.InBufferCount Then ' 通讯埠中假如有资料的话, 则读取进来 InStringB = InStringB & MSComm1.Input ' 如果资料中有Chr(13) 和Chr(10) 的话, 则显示出来 If InStr(InStringB, vbCrLf) Then instring = instring & InStringB AddText Text3, InStringB, False InStringB = "" End If End If END SUB

VB中串口通讯的实现

VB中串口通讯的实现 一、概述 串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。 实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串甚至其实现方法和C、汇编相比,要更加快捷方便。下面,笔者就介绍一下在VB中实现串口通讯的方法。 在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。我们只要此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。下面,笔者就简要地介绍一下 MSComm控件的使用方法。 二、MSComm控件的主要属性、事件 1、MSComm的属性 由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。 Commport:设置通讯所占用的串口号。如设成1(默认值),表示对Com1进行操作。 Setting:对串口通讯的相关参数。包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。其默认值0,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。 Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。 Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。 Ouput:发送数据到输出寄存器。 InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。 InputMode:设置从输入寄存器中读取数据的形式。若值为0,则表示以文本形式读取;值为1,则表示以二式读取。 OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。

VB6 实时 串口通信 数据采集代码

VB6 实时串口通信数据采集代码 介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。 ----一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。 ----该仪表的串口数据通信协议是:数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。仪表每秒发送50帧检测数据,每帧数据由4个字节组成。第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即:1 x x x x x x x 则为负数;第八位为0,即:0 x x x x x x x 则为正数。 ----例如:0F0H 26H 87H 80H 0F0H 34H 62H 00H 表示-26.87 34.62。 ----通信传输速率为9600bps,则最快速度1.04ms发送一帧数据。

9600bps = 1200Bps这样计算出来的结果相当于8bits/Frame,现在串口中协议是10bits/Frame,求解方程1200 * 8 = x * 10得到x = 960Frame/s。1000/960 = 1.04167Frame/ms。仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。----为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下: RThreshold = 1 接收缓冲区收到一个字节产生OnComm事件 InputLen = 1 每次读取一个字节 ----仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms 时间(1000/50=20),然后再进行数据处理。①如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;②如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情

VB上位机串口通讯

'初始化代码 Private Sub Form_Load() '窗体被加载时产生 If MSComm1.PortOpen = True Then '串口查看是否打开,打开则关闭MsgBox "端口已经打开", 2 'MSComm1.PortOpen = False End If With MSComm1 .CommPort = 3 '设置串口3 .Settings = "9600,n,8,1" .InputLen = 0 '读取接收缓冲区所有字符 .InBufferSize = 1024 '设置接收缓冲区1024字节 .OutBufferSize = 512 '设置发送缓冲区512字节 .InputMode = comInputModeText. '采用文本传输 '.PortOpen = True '打开串口 .SThreshold = 0 '一发送数据就触发OnComm事件 .RThreshold = 1 '接收到一个字节就触发OnComm事件 .InBufferCount = 0 '清除发送缓冲区数据 .OutBufferCount = 0 '清除接收缓冲区数据 End With Text_send.Text = "" Text_recv.Text = "" Text_send_16.Text = "" End Sub '清空对话框数据 Sub Command3_Click(Index As Integer) Text_send.Text = "" Text_recv.Text = ""

Text_send_16.Text = "" End Sub '通讯端口选择 Private Sub Combo1_Click() If Combo1.Text = "com1" Then '通讯端口号设置 https://www.sodocs.net/doc/fc3601847.html,mPort = 1 'Text1 = 1 ElseIf Combo1.Text = "com2" Then https://www.sodocs.net/doc/fc3601847.html,mPort = 2 'Text1 = 2 ElseIf Combo1.Text = "com3" Then https://www.sodocs.net/doc/fc3601847.html,mPort = 3 'Text1 = 3 ElseIf Combo1.Text = "com4" Then https://www.sodocs.net/doc/fc3601847.html,mPort = 4 'Text1 = 4 Else https://www.sodocs.net/doc/fc3601847.html,mPort = 5 'Text1 = 5 End If End Sub Private Sub Combo2_Click() If Combo2.Text = "9600,e,8,1" Then MSComm1.Settings = "9600,e,8,1" ElseIf Combo2.Text = "9600,n,8,1" Then MSComm1.Settings = "9600,n,8,1" ElseIf Combo2.Text = "57600,n,8,1" Then MSComm1.Settings = "57600,n,8,1" End If End Sub '发送数据 Private Sub Command1_Click(Index As Integer) '判断是否选择了端口与通讯方式 If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2 Exit Sub End If

VB串口通讯控件MSComm详解

VB串口通讯控件MSComm详解 MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm 控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 1.MSComm控件两种处理通讯的方式 MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。 1.1 事件驱动方式 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。 1.2 查询方式 查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 2.MSComm 控件的常用属性 MSComm控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 下面分别描述: CommPort属性设置并返回通讯端口号。 语法https://www.sodocs.net/doc/fc3601847.html,mPort[value ] (value 一整型值,说明端口号。) 说明在设计时,value 可以设置成从1 到16 的任何数(缺省值为1)。但是如果用

VB串口数据接收方式

1、在OnComm 事件中接收数据: 这种方式能充分MSCOMM控件的特性。OnComm 事件还可以检查和处理通讯错误;可以通过检查CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。 Private Sub MSComm_OnComm () Select Case https://www.sodocs.net/doc/fc3601847.html,mEvent ' 错误 Case comEventBreak ' 收到Break。 Case comEventCDTO ' CD (RLSD) 超时。 Case comEventCTSTO ' CTS Timeout。 Case comEventDSRTO ' DSR Timeout。 Case comEventFrame ' Framing Error Case comEventOverrun '数据丢失。 Case comEventRxOver'接收缓冲区溢出。 Case comEventRxParity' Parity 错误。 Case comEventTxFull '传输缓冲区已满。 Case comEventDCB '获取DCB] 时意外错误 ' 事件 Case comEvCD ' CD 线状态变化。 Case comEvCTS ' CTS 线状态变化。 Case comEvDSR ' DSR 线状态变化。 Case comEvRing ' Ring Indicator 变化。 Case comEvReceive ' 收到RThreshold # of chars. Case comEvSend ' 传输缓冲区有Sthreshold 个字符' Case comEvEof ' 输入数据流中发现EOF 字符 End Select End Sub 2.轮循法采集数据: A、定时器轮循法 对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。实际上轮循法最大的好处在于集中处理数据而且不太占用CPU。轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThreshold、SThreshold为0,屏蔽ONCOMM事件。 InputMode = comInputModeBinary RThreshold = 0 SThreshold = 0 Private Sub TmrComm_Timer() '采用轮循法采集数据

手把手教你用VB实现Modbus RTU串行通讯工程实例

用VB实现Modbus RTU串行通讯在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对VB和Twido PLC间的通讯进行说明。 对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。 VB程序通过利用MSComm控件很容易就能够实现。 1.通讯口初始化:

MSComm1.Settings = "9600,n,8,1" https://www.sodocs.net/doc/fc3601847.html,mPort = 1 MSComm1.SThreshold = 0 If Not MSComm1.PortOpen Then MSComm1.PortOpen = True 2.CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。 Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer) Dim data As Integer Dim i As Integer Addressreg_crc = &HFFFF For i = 0 To j Addressreg_crc = Addressreg_crc Xor cmdstring(i) For j = 0 To 7 data = Addressreg_crc And &H1 If data Then Addressreg_crc = Int(Addressreg_crc / 2) Addressreg_crc = Addressreg_crc And &H7FFF Addressreg_crc = Addressreg_crc Xor &HA001 Else

简单的VB串口通讯入门

我的VB串口读写入门 首先需要的是在VB中增加一个microsoft comm control 6.0的控件。步骤就是:工程(project)->部件(components)->点击,出现对话框 下拉垂直滑动杆,找到“microsoft comm control 6.0”点击前面的矩形框,确定。 先介绍一下必须熟悉几个属性: CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 然后给大家一个读串口的小例程: Private Sub Form_Load() https://www.sodocs.net/doc/fc3601847.html,mPort = 1 '选择com1 Mscomm1.Settings = "9600,N,8,1" '设置波特率为9600,没有奇偶校验,8位数据位,1位结

束位 Mscomm1.InputLen = 0 '读取全部的输入缓冲区 If Mscomm1.PortOpen = False Then Mscomm1.PortOpen = True '端口打开 Mscomm1.RThreshold = 2 Mscomm1.SThreshold = 2 End Sub Private Sub Mscomm1_OnComm() '所有的通讯事件都可以激发MSComm1控件的OnComm 事件 Select Case https://www.sodocs.net/doc/fc3601847.html,mEvent Case comEvReceive '此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理 Text4 = Text4 & Mscomm1.Input Case comEvSend '此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理 End Select End Sub Unload 事件是当窗体从屏幕上删除时发生。将cancel 设置为任何非零的值可防止窗体被删除,但不能阻止其它事件,诸如从Microsoft Windows 操作环境中退出等。 Private Sub Form_Unload(Cancel As Integer) If Mcom.PortOpen = True Then Mcom.PortOpen = False End Sub 利用上面的小程序,我们就可以通过读到外设给串口发出的数据了。 如果要发数据到串口就更简单了: Private Sub SendC_Click() Dim sendbuff as string sendbuff = Text3 Mcom.Output = sendbuff End Sub 这样就可以将Text3中的数据发送到串口了。这就是一个最简单的串口读写例程了,操作的过程就是:初始化串口(端口、波特率等)->打开端口->利用接收buff读上传数据+发送buff写下传数据->完毕后关闭串口。 )

VB实现串口通讯

VB实现串口通讯 目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。VB 支持面向对象的程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。在VB 应用程序中可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。 利用VB 提供的这些功能,我们可以有三种方法完成串口通信。一种是用VB 提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API 函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/ 输出完成,该方法简便易行,但有一定的局限性。 一、利用通信控件(MSCOMM)完成串口通信 VB 提供了通信控件MSCOMM,文件名为MSCOMM. VBX。该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信的情况,进行收发数据的处理。每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。 1、通信控件的事件及基本属性 (1)事件 OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。通过对CommEvent 属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM—EV—SEND 表示发送事件。这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。 (2)属性 CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。 Setting :设置通信的信息格式,为字符型。顺序为:波特率、校验、数据位、停止位。 PortOpen :布尔型、开关通信口。 InputLen :从接收缓冲区读取字符个数。 Input ,Output :读取接收缓冲区或写入发送缓冲区字符。 以上五种属性对串口完成基本的设置和操作,下面的三种属性是描述如何利用VB 提供的事件驱动机制来实现通 信。 CommEvent :返回通信过程中产生的错误信息及事件,了解通信状况。

VB控件MSComm串口通讯实例教程

现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符 现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符均发送11位ASCII 码,一个起始位。在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。具体程序如下:控件简称:MSC Dim Out(12) As Byte '接收var中的值 Dim var As Variant '接收MSC.input中的数值 Dim nRece As Integer '计算MSC.inputbuffer的个数 Dim i As Integer, j As Integer '随即变量,计算循环 ************************************************************************** ** Private Sub Form_Load() ClearText With MSC .CommPort = 1 '设置Com1为通信端口 .Settings = "9600,E,7,2" '设置通信端口参数 9600赫兹、偶校验、7个数据位、2个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。 含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit) .InBufferSize = 40 '设置缓冲区接收数据为40字节 .InputLen = 1 '设置Input一次从接收缓冲读取字节数为1

VB_Net_串口通信程序

一 Imports System.IO.Ports Imports System.Text Public Class Form1 Dim RS232Com As New SerialPort Dim mPortName As String Public Sub OpenCOM() mPortName = Me.CmbCom.SelectedItem.ToString RS232Com = New SerialPort(mPortName, 9600, Parity.None, 8, StopBits.One) RS232Com.Encoding = Encoding.ASCII If Not RS232Com.IsOpen Then RS232Com.Open() End Sub Public Sub CloseCOM() If RS232Com.IsOpen Then RS232Com.Close() End Sub Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click Call OpenCOM() End Sub Private Sub BtnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClose.Click Call CloseCOM() End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For Each sp As String In SerialPort.GetPortNames Me.CmbCom.Items.Add(sp) Next Me.CmbCom.SelectedIndex = 0 End Sub Private Sub BtnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click RS232Com.Write(Me.TextBox1.Text) '即写命令过去 End Sub

相关主题