modbus与visa
时间:10-02
整理:3721RD
点击:
经常看到大家使用串口有问题,这里发一点不用VISA通信的资料。
基于MScomm32 和LabVIEW 的串口通信技术
摘要:串行通信是一种常用的数据传输方法,它用于计算机与外设,或者计算机与计算机之间的通信。本文针对串口通信技术,详细介绍了串口通信控件MSCOMM32.OCX在LabVIEW7.1 下的使用方法,并介绍了串行通信中断接收及数据处理的技巧。作者已经把该技术成功运用到了部队和工业控制的实际项目中。
关键词:串行通信 中断 ACTIVEX MSCOMM32.OCX LabVIEW
The Serial communication technique Based on MSCOMM32 and LabVIEW7.1
Abstract:Serial communication is a common-used method to transfer the data, it can be used in the communication between the computer and the peripheral equipment, or between the computer and the computer(two computers). This paper introduces the way how to use the MSCOMM32.OCX in the LabVIEW 7.1,which is a kind of control used in the serial communication., and introduced the skill of how to manage the data interrupt reception and the data procession. We have put this technique into the actual item of army and the industry control successfully.
Key Word: Serial communication Interrupt ACTIVEX MSCOMM32.OCX LabVIEW
1前言
工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道。大多数计算机和许多仪器都配有RS-232接口,使得串行通信非常方便和流行。
MSCOMM32.OCX是一个专门用于串口通信的ACTIVEX控件,它提供了使用RS-232来进行数据通信的所有协议,常用的代码式编程语言(如:VC++ 、VB、DELPHI等)为该控件提供了标准的事件处理函数、过程,并通过属性和方法提供了串行通信的设置。它使用户能够方便地访问Windows串行通信驱动程序的大多数特性,包括输入、输出缓冲区的大小及决定何时使用流控制命令挂起数据传输等,使得此控件在工业控制上需要串行通信的场合变得流行起来。LabVIEW是美国国家仪器公司开发的一种图形化编程语言,专门用于计算机测控技术。LabVIEW内置了串口通信的8个功能函数,可以分别实现串口初始化、串口写、串口读、检测串口缓存、中断以及关闭串口等功能。这6个节点函数容易理解,故得到了大多数工程师的使用。但是,比较而言,MSCOMM32 控件更好,因为它有中断函数处理功能,可以实现中断式的接收数据,而LabVIEW自带的串口通信功能节点却只可以实现查询式的数据接收。查询方式,即一个进程中的某一线程定时地查询串口的接收缓冲区,如果缓冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会占用大量的CPU时间。在一些实时性要求高的场合,采用查询处理不符合现场需要。另外,由于MSCOMM32 控件可以单独设置串口的每一个引脚,便于实现高级的用户自定义功能,而LabVIEW自带的串口通信节点却无法实现。鉴于MSCOMM32 的一些优点,本论文将详细介绍在LabVIEW7.1的环境下如何使用MSCOMM32来开发带有中断数据接收功能的串口通信程序。这也是作者长期处理串口通信技术的一个经验总结。
2 中断式串口通信技术的实现
2.1MSCOMM32控件的使用思想
MSComm控件共有27个属性。使用前一定要对常用的属性进行设置。指定串口号,设置通信参数,指定接收缓冲区大小,清空接收缓冲区,设置数据获取方式,设置读取方式,打开指定的串口。打开所需串口后,就考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通信事件和错误的值。发生通信事件或错误时将触发OnComm事件,CommEvent属性的值将被改变,应用程序通过检查CommEvent属性值并作出相应的反应。串口的中断需要通过Register For Events来注册中断事件,串口使用完毕需要关闭串口,通过Unregister For Events撤销对中断节点的注册,并通过Close Reference关闭ActiveX自动化控件。
2.2 在LabVIEW中加载MSCOMM32.OCX控件
MSCOMM32.OCX控件是一种ACTIVEX控件。ACTIVEX采用客户机/服务器模式进行不同应用程序的链接,调用其它应用程序的对象时,这个应用程序被作为客户端。自己创建的对象被其它应用程序调用时,这个应用程序被用作服务器。LabVIEW既可以作为ACTIVEX采用客户端,又可以作为ACTIVEX服务器。在这里我们使用LabVIEW作为客户端进行ACTIVEX的调用。LabVIEW提供有加载外部AXTIVEX控件的功能,使用前需把MSCOMM32.OCX控件加载到LabVIEW环境中。
在LabVIEW的工具菜单“Tools >> Advanced >> Import ActiveX Controls”将Microsoft的串口控件-“Microsoft Communications Control,version 6.0”添加到LabVIEW环境中,存放在缺省路径即可,这样在User Controls Palette里面就可以找到这个控件。
图1 添加ActiveX控件
图2 选择MSCOMM32控件
2.3 MSCOMM32控件初始化
将串口控件(电话机符号)放置在Front Panel上,在框图程序中用控件属性就可以对其进行编程,实现所需要的功能。 在实际操作的时候,一个串口资源只可以有一个MSCOMM控件与之相对应,如果在一个程序中同时需要进行多个串口的通信,则必须调出多个MSCOMM控件进行编程。
首先把LabVIEW中切换到框图程序环境,可以发现一个带有MSCOMM字样的控件。现在就可以按照VC++等代码式编程语言的编程思想,对此控件进行属性的配置。在ALLFUNCTIONS>>COMMUNICATION>>ACTIVEX下,调出Property Node节点,放于Block Diagram中。如果把其Refnum 和MSCOMM32控件的Refnum相联接,就可以发现其对应的所有属性函数,只要按照要求设置其属性,就可以操作这个控件了。
图3 放置控件
图4 MSCOMM32 的属性函数
图5 MSCOMM32控件的初始化
2.4 数据的发送和接收
MSCOMM32控件可以接收二进制字节型数据或者字符串,这个可以通过Input Mode属性设置,0默认为ComInputModeText,1为ComInputModeBinary。使用output函数发送数据,使用input函数接收接收数据。在数据的发送和接收前的串口初始化程序里需要提前设置好发送缓存和接收缓存的大小,控件默认为InBufferSize=1024BYTE,OutBufferSize=512BYTE。RThreshold为接收中断门槛,默认为0,表示不产生中断,此时程序的编写采用查询式通信,如果设置为其它整数,比如1,则接收缓冲区每收到一个字符就会产生中断,SThreshold 为发送中断门槛,若设为0,不产生中断,若为1,则当传输缓冲区完全空时,控件产生中断事件。在本论文中,为了实现接收中断方式的串口通信,需要把SThreshold设为0,RThreshold设置为1。
在发送数据时,如果是静态数据,可以直接通过一个Hex String的常数与数据发送区联接,或者通过一个10进制的常量经Numeric to HexString的转换送数据发送区;如果是动态数据,比如:D7H、F5H、00H、01H,则需要通过字节型数组进行数据的转换后,进行发送。作者在作串口通信程序时,采用了以下的方法:先构造一个10进制数的数组215、245、0、1,然后通过ByteArray to String函数转换数据类型,再紧接着使用String to ByteArray函数节点,然后再通过To Variant节点把ByteArray函数转换成Variant类型送入数据发送区,则即相当于把D7H、F5H、00H、01H这4个字节的数据发送出去了。切记,一定按照这个原则,否则数据发送不出去,或则不正确。
Variant to Data节点和To Variant节点存放在在ALL FUNCTIONS>>COMMUNICATION>>ACTIVEX下。数据接收的时候,通过Variant to Data节点把变体数据转换成LabVIEW可以显示的数据类型,如果是字节型数组就设置转换为ByteArray类型;如果是字符型数据,就转换成String格式。
2.5中断方式的使用
本论文中提到的中断处理包括了2层含义,第一是程序的编写采用了LabVIEW自带的事件处理机制控件,即使用事件机制响应按钮操作,第二是串口通信数据接收采用中断方式处理。
先介绍一下LabVIEW的事件处理机制。Event Structure位于Function模板>>Structure子模板中。当没有任何事件发生时,就会处于睡眠状态,直到有一个或多个预先设定的事件发生时,Event Structure才会自动苏醒,并根据发生的事件执行用户预先设定的动作。本论文就采用了若干个按钮,来发送不同的命令字, LabVIEW的中级程序员对此已经很熟悉,在此就不再详述。在LabViEW中操作AXTIVEX使用中断函数是通过RegEventCallback节点来实现的,使用这个节点需要对它进行配置。在编程时,先把它的Event管脚与MSCOMM32的Refum相联接,这时RegEventCallback节点就会含有MSCOMM32 的中断函数OnComm的信息了。下一个关键的步骤就是设定并配置中断服务程序了。这时,右键点击RegEventCallback节点的VIRef管脚,选择Creat CallBackVI ,则程序自动生成一个中断函数的子VI和VIRef管脚相联。然后,双击这个子VI,进入其后面的程序框图,编辑自己需要的中断服务程序。作者设计了一个接收数据的中断服务处理。把MSCOMM32的COMMEVENT 属性函数 的VIRef与Control ref相联,在后面使用一个CASE结构进行 判别和处理。因Oncomm=2时 为接收中断,则把CASE 2设置为Default CASE,再在其结构内部通过一个 Input函数把数据读出来,用Variant To Data 节点把数据变为想要的数据类型 ,在这里作者把 它设置为了字节型数组类型。中断服务程序就编写完毕。这个接收的数据可以设置为全局变量,从而把数值送到主程序进行显示。这样 ,平时没有数据接收时,程序处于睡眠状态,当有接收数据超过了接收中断门槛,就会产生中断服务,把接收到的数据传到主程序进行显示出来。如果直接显示接收到的数据,那么是10进制的字节型数组;如果把字节型数组再通过ByteArray to String节点进行数据类型转换,就可以显示为16进制的字符串。此时,若在主程序中对接收到数据进行判别和处理,就可以做出适合各种用途的串口通信程序了。
图6 MSCOMM32控件的字节型数据发送
图7 RegEventCallback节点的使用
图8 串口通信程序框图
图9 MSCOMM32串口通信测试软件
3 结束语
采用LabVIEW调用MSCOMM32.OCX 可以实现中断式的串口数据接收,扩展了LabVIEW软件自带的串口通信方式;同时由于LabVIEW具有事件处理结构 ,也可以采用事件思想发送数据;再加上LabVIEW的打包程序,就可以快速生成脱离LabVIEW而运行的安装软件。综合使用,就可以根据应用的需要,利用LabVIEW 的G语言的优势,快速的构建一个基于数据流的串口通信软件,从而加快项目进程。
参考文献:
[1] 杨乐平,李海涛等,Lab VIEW高级程序设计,.清华大学出版社,2003.4.
[2] 杨乐平,李海涛,杨磊,Lab VIEW程序设计与应用,.电子工业出版社,2005.1.
[3] 侯国屏,王坤,叶齐鑫,LabVIEW7.1编程与虚拟仪器设计,北京:清华大学出版社,2005.2
[4] 李现勇,Visual C++串口通信技术与工程实践(第二版),人民邮电出版社,2004.7
基于MScomm32 和LabVIEW 的串口通信技术
摘要:串行通信是一种常用的数据传输方法,它用于计算机与外设,或者计算机与计算机之间的通信。本文针对串口通信技术,详细介绍了串口通信控件MSCOMM32.OCX在LabVIEW7.1 下的使用方法,并介绍了串行通信中断接收及数据处理的技巧。作者已经把该技术成功运用到了部队和工业控制的实际项目中。
关键词:串行通信 中断 ACTIVEX MSCOMM32.OCX LabVIEW
The Serial communication technique Based on MSCOMM32 and LabVIEW7.1
Abstract:Serial communication is a common-used method to transfer the data, it can be used in the communication between the computer and the peripheral equipment, or between the computer and the computer(two computers). This paper introduces the way how to use the MSCOMM32.OCX in the LabVIEW 7.1,which is a kind of control used in the serial communication., and introduced the skill of how to manage the data interrupt reception and the data procession. We have put this technique into the actual item of army and the industry control successfully.
Key Word: Serial communication Interrupt ACTIVEX MSCOMM32.OCX LabVIEW
1前言
工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道。大多数计算机和许多仪器都配有RS-232接口,使得串行通信非常方便和流行。
MSCOMM32.OCX是一个专门用于串口通信的ACTIVEX控件,它提供了使用RS-232来进行数据通信的所有协议,常用的代码式编程语言(如:VC++ 、VB、DELPHI等)为该控件提供了标准的事件处理函数、过程,并通过属性和方法提供了串行通信的设置。它使用户能够方便地访问Windows串行通信驱动程序的大多数特性,包括输入、输出缓冲区的大小及决定何时使用流控制命令挂起数据传输等,使得此控件在工业控制上需要串行通信的场合变得流行起来。LabVIEW是美国国家仪器公司开发的一种图形化编程语言,专门用于计算机测控技术。LabVIEW内置了串口通信的8个功能函数,可以分别实现串口初始化、串口写、串口读、检测串口缓存、中断以及关闭串口等功能。这6个节点函数容易理解,故得到了大多数工程师的使用。但是,比较而言,MSCOMM32 控件更好,因为它有中断函数处理功能,可以实现中断式的接收数据,而LabVIEW自带的串口通信功能节点却只可以实现查询式的数据接收。查询方式,即一个进程中的某一线程定时地查询串口的接收缓冲区,如果缓冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会占用大量的CPU时间。在一些实时性要求高的场合,采用查询处理不符合现场需要。另外,由于MSCOMM32 控件可以单独设置串口的每一个引脚,便于实现高级的用户自定义功能,而LabVIEW自带的串口通信节点却无法实现。鉴于MSCOMM32 的一些优点,本论文将详细介绍在LabVIEW7.1的环境下如何使用MSCOMM32来开发带有中断数据接收功能的串口通信程序。这也是作者长期处理串口通信技术的一个经验总结。
2 中断式串口通信技术的实现
2.1MSCOMM32控件的使用思想
MSComm控件共有27个属性。使用前一定要对常用的属性进行设置。指定串口号,设置通信参数,指定接收缓冲区大小,清空接收缓冲区,设置数据获取方式,设置读取方式,打开指定的串口。打开所需串口后,就考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用OnComm事件和CommEvent属性捕捉并检查通信事件和错误的值。发生通信事件或错误时将触发OnComm事件,CommEvent属性的值将被改变,应用程序通过检查CommEvent属性值并作出相应的反应。串口的中断需要通过Register For Events来注册中断事件,串口使用完毕需要关闭串口,通过Unregister For Events撤销对中断节点的注册,并通过Close Reference关闭ActiveX自动化控件。
2.2 在LabVIEW中加载MSCOMM32.OCX控件
MSCOMM32.OCX控件是一种ACTIVEX控件。ACTIVEX采用客户机/服务器模式进行不同应用程序的链接,调用其它应用程序的对象时,这个应用程序被作为客户端。自己创建的对象被其它应用程序调用时,这个应用程序被用作服务器。LabVIEW既可以作为ACTIVEX采用客户端,又可以作为ACTIVEX服务器。在这里我们使用LabVIEW作为客户端进行ACTIVEX的调用。LabVIEW提供有加载外部AXTIVEX控件的功能,使用前需把MSCOMM32.OCX控件加载到LabVIEW环境中。
在LabVIEW的工具菜单“Tools >> Advanced >> Import ActiveX Controls”将Microsoft的串口控件-“Microsoft Communications Control,version 6.0”添加到LabVIEW环境中,存放在缺省路径即可,这样在User Controls Palette里面就可以找到这个控件。
图1 添加ActiveX控件
图2 选择MSCOMM32控件
2.3 MSCOMM32控件初始化
将串口控件(电话机符号)放置在Front Panel上,在框图程序中用控件属性就可以对其进行编程,实现所需要的功能。 在实际操作的时候,一个串口资源只可以有一个MSCOMM控件与之相对应,如果在一个程序中同时需要进行多个串口的通信,则必须调出多个MSCOMM控件进行编程。
首先把LabVIEW中切换到框图程序环境,可以发现一个带有MSCOMM字样的控件。现在就可以按照VC++等代码式编程语言的编程思想,对此控件进行属性的配置。在ALLFUNCTIONS>>COMMUNICATION>>ACTIVEX下,调出Property Node节点,放于Block Diagram中。如果把其Refnum 和MSCOMM32控件的Refnum相联接,就可以发现其对应的所有属性函数,只要按照要求设置其属性,就可以操作这个控件了。
图3 放置控件
图4 MSCOMM32 的属性函数
图5 MSCOMM32控件的初始化
2.4 数据的发送和接收
MSCOMM32控件可以接收二进制字节型数据或者字符串,这个可以通过Input Mode属性设置,0默认为ComInputModeText,1为ComInputModeBinary。使用output函数发送数据,使用input函数接收接收数据。在数据的发送和接收前的串口初始化程序里需要提前设置好发送缓存和接收缓存的大小,控件默认为InBufferSize=1024BYTE,OutBufferSize=512BYTE。RThreshold为接收中断门槛,默认为0,表示不产生中断,此时程序的编写采用查询式通信,如果设置为其它整数,比如1,则接收缓冲区每收到一个字符就会产生中断,SThreshold 为发送中断门槛,若设为0,不产生中断,若为1,则当传输缓冲区完全空时,控件产生中断事件。在本论文中,为了实现接收中断方式的串口通信,需要把SThreshold设为0,RThreshold设置为1。
在发送数据时,如果是静态数据,可以直接通过一个Hex String的常数与数据发送区联接,或者通过一个10进制的常量经Numeric to HexString的转换送数据发送区;如果是动态数据,比如:D7H、F5H、00H、01H,则需要通过字节型数组进行数据的转换后,进行发送。作者在作串口通信程序时,采用了以下的方法:先构造一个10进制数的数组215、245、0、1,然后通过ByteArray to String函数转换数据类型,再紧接着使用String to ByteArray函数节点,然后再通过To Variant节点把ByteArray函数转换成Variant类型送入数据发送区,则即相当于把D7H、F5H、00H、01H这4个字节的数据发送出去了。切记,一定按照这个原则,否则数据发送不出去,或则不正确。
Variant to Data节点和To Variant节点存放在在ALL FUNCTIONS>>COMMUNICATION>>ACTIVEX下。数据接收的时候,通过Variant to Data节点把变体数据转换成LabVIEW可以显示的数据类型,如果是字节型数组就设置转换为ByteArray类型;如果是字符型数据,就转换成String格式。
2.5中断方式的使用
本论文中提到的中断处理包括了2层含义,第一是程序的编写采用了LabVIEW自带的事件处理机制控件,即使用事件机制响应按钮操作,第二是串口通信数据接收采用中断方式处理。
先介绍一下LabVIEW的事件处理机制。Event Structure位于Function模板>>Structure子模板中。当没有任何事件发生时,就会处于睡眠状态,直到有一个或多个预先设定的事件发生时,Event Structure才会自动苏醒,并根据发生的事件执行用户预先设定的动作。本论文就采用了若干个按钮,来发送不同的命令字, LabVIEW的中级程序员对此已经很熟悉,在此就不再详述。在LabViEW中操作AXTIVEX使用中断函数是通过RegEventCallback节点来实现的,使用这个节点需要对它进行配置。在编程时,先把它的Event管脚与MSCOMM32的Refum相联接,这时RegEventCallback节点就会含有MSCOMM32 的中断函数OnComm的信息了。下一个关键的步骤就是设定并配置中断服务程序了。这时,右键点击RegEventCallback节点的VIRef管脚,选择Creat CallBackVI ,则程序自动生成一个中断函数的子VI和VIRef管脚相联。然后,双击这个子VI,进入其后面的程序框图,编辑自己需要的中断服务程序。作者设计了一个接收数据的中断服务处理。把MSCOMM32的COMMEVENT 属性函数 的VIRef与Control ref相联,在后面使用一个CASE结构进行 判别和处理。因Oncomm=2时 为接收中断,则把CASE 2设置为Default CASE,再在其结构内部通过一个 Input函数把数据读出来,用Variant To Data 节点把数据变为想要的数据类型 ,在这里作者把 它设置为了字节型数组类型。中断服务程序就编写完毕。这个接收的数据可以设置为全局变量,从而把数值送到主程序进行显示。这样 ,平时没有数据接收时,程序处于睡眠状态,当有接收数据超过了接收中断门槛,就会产生中断服务,把接收到的数据传到主程序进行显示出来。如果直接显示接收到的数据,那么是10进制的字节型数组;如果把字节型数组再通过ByteArray to String节点进行数据类型转换,就可以显示为16进制的字符串。此时,若在主程序中对接收到数据进行判别和处理,就可以做出适合各种用途的串口通信程序了。
图6 MSCOMM32控件的字节型数据发送
图7 RegEventCallback节点的使用
图8 串口通信程序框图
图9 MSCOMM32串口通信测试软件
3 结束语
采用LabVIEW调用MSCOMM32.OCX 可以实现中断式的串口数据接收,扩展了LabVIEW软件自带的串口通信方式;同时由于LabVIEW具有事件处理结构 ,也可以采用事件思想发送数据;再加上LabVIEW的打包程序,就可以快速生成脱离LabVIEW而运行的安装软件。综合使用,就可以根据应用的需要,利用LabVIEW 的G语言的优势,快速的构建一个基于数据流的串口通信软件,从而加快项目进程。
参考文献:
[1] 杨乐平,李海涛等,Lab VIEW高级程序设计,.清华大学出版社,2003.4.
[2] 杨乐平,李海涛,杨磊,Lab VIEW程序设计与应用,.电子工业出版社,2005.1.
[3] 侯国屏,王坤,叶齐鑫,LabVIEW7.1编程与虚拟仪器设计,北京:清华大学出版社,2005.2
[4] 李现勇,Visual C++串口通信技术与工程实践(第二版),人民邮电出版社,2004.7