3 利用VB编写通信程序
利用VB提供的定时器控件和MSComm通讯控件,可以很方便地编制面向对象的应用程序,命令 传递、数据交换、图形显示在定时器控件和通讯控件中完成。
使用MSComm通讯控件的第一步是建立与串行口的连接。通过设置CommPort , PortOpen和Se ttings属性来打开串行端口。
CommPort属性:设置或返回通讯端口号。注意:每个使用的MSComm控件对应着一个串行端口 。如果应用程序要访问多个串行端口,例如应用程序需要和多个下位PLC通讯,必须使用多 个使用MSComm控件。
Settings属性:以字符串的形式设置或返回串行通讯协议。该属性值由4个设置值组成,有如 下的形式:“BBBB, P, D, S”, BBBB为波特率,P为奇偶校验,D为数据位数,S为停止 位 数。在实现上位机和PLC的通讯中,Settings属性值的设置应该根据下位机PLC的D8120单元 的值来设定。Fx系列的标准通讯参数为9600,E,7,1
PortOpen属性:设置并返回通讯端口的状态。将PorlOpen属性设置为True打开端口,将Port Open属性设置为False关闭端口。注意:打开端口建立连接之前,必须先用CommPort, Sett ings属性正确指定端口号(必须是物理或逻辑存在的端口)和通讯协议,一旦打开端口后, 不可以随便更改CommPort , Settings属性的设置,如果在程序运行中必须更改这两项属性 ,应该先关闭端口,改变设置值之后,再重新打开端口。
端口打开后,就创建了空的接收和发送缓冲区,端口关闭缓冲区被清零。MSComm控件提供了 一系列的属性来管理这些缓冲区。
1nBufferSize和OutBufferSize属性:分配接收和发送缓冲区内存的大小。
InBufferCount和OutBuffeiCount属性:分别获得接缓冲区和发送缓冲区中字节的数目。在程 序执行过程中,将这两个属性的值设置为零,即可清空接收或发送缓冲区。
Rthreshold和Sthreshold属性:设定OnComm事件发生前,接收或发送缓冲区中可以存放的字 节数。将这两个属性值设置为零,可以抑制相应的OnComm事件发生。
Input属性:获取输入缓冲区中的数据,并将保存在输人缓冲区的数据删除。
Output属性:向发送缓冲区写人数据。
InputLen属性:设置并返回Input属性从接收缓冲区读取的字符数。如果把Input属性设置为 零,在使用Input属性时,MSComm控件将读取接收缓冲区的所有内容。
通信口初始化程序举例如下:
Private Sub Form_Load() 进行通讯端口和初始化设置。
MSComm1.CommPort=1
MSComm1.Settings=“9600,e,7,1”端口设置:波特率为9600bit/s、偶校验、7位数据 位、1位停止位。
MSComm1.InputMode=comInputModeText '文本字符串接收方式
MSComm1.InBufferSize=1024 '输入数据接收缓冲区长度
MSComm1.OutBufferSize=512 '输出数据缓冲区长度
MSComm1.RThreshold=0 '每接受到字符就产生接受中断
MSComm1.SThreshold=0 '禁止发送中断,进行无条件发送
If MSComm1.PortOpen=False Then
MSComm1.PortOpen=True '打开串行通信接口COM1
End If
End Sub
4 机械手监控软件的实现
利用计算机语言VB编写的机械手监控程序主要分为以下几部分:登陆及选择控制方式画面、 手动控制界面和自动控制界面。手动控制界面与自动控制界面如图4所示。
上位计算机主要完成运动命令的生成,在获取机械手传感器信息的基础上,完成机械手动作 在计算机屏幕上的实时显示。在机械手出现故障时,允许通过手动控制界面的按钮来远程控 制机械手动作。下位机PLC完成对电磁阀的控制从而驱动气动执行元件。
手动控制界面主要由状态显示区、按钮控制区、位置显示区、时间显示区以及各种交互控制 按钮组成。如图4(a)所示。按钮控制区的按钮通过用户程序和PLC与各电磁阀的线圈相连 ,实现远程控制气缸动作。每个气缸控制按钮的多少是与电磁阀的线圈数相对应的,如果是 三位五通阀则有三个按钮,二位五通阀有两个按钮。
自动循环控制界面主要由状态显示区、按钮控制区、位置显示区、时间显示区、报警区以及 日志报告区等。如图4(b)所示。匣置显示区的各状态显示是通过PC与PLC实时通信实现的 。
4.1 控制命令的发送:手动控制界面与自动循环控制界面中控制命令都是通过按钮控制区 的按钮发送出去的,在发送控制命令之前,必须先形成控制命令帧。通常,按钮对PLC的控 制是对中间辅助继电器的控制,是软件对PLC内部写命令过程,该过程是通过WriteToPLC() 函数实现的,其程序如下:
Public Sub WriteToPLC()
Dim DUMMY As String
If MSComm1.PortOpen=False Then
MSComm1.PortOpen=True ''''''打开通信端口Comm1
End If
MSComm1.InputLen=0 '''''初始化通信端口Comm1
MSComm1.Output=MWRITE)nCmdCounter) '''''通信端口Comm1写出数据包
End Sub
控制界面中的所有的写命令又是通过数组MWRITE()来实现的。其元素包括举例如下:
MWRITE(1)=Chr$(2)+“1”+“0111011”+Chr$(3)+“89” '''手爪夹持M136置1
MWRITE(2)=Chr$(2)+“1”+“0111010”+Chr$(3)+“88” '''''手爪松开M136置 0
4.2 定时读取机械手状态信息:在状态显示区内,显示的是手爪气缸、手臂气缸、升降气 缸、扭转气缸和手腕气缸的电磁阀的工作状态。当按钮控制区的按钮被按下时,状态显示区 的状态指示灯将被点亮,表示PLC的某个对应的输出端子正在工作。该信号是通过与PLC进行 的实时数据交换得到的,是PLC的端子的实时状态。同样地,在位置显示区,显示的是机械 手运动气缸的活塞杆位置状态,是否到达左右极限。当活塞杆到达极限位置,相应的位置显 示区的极限报警灯将被点亮,表示PLC的某个对应的输入端子正在工作。该信号也是通过与P LC进行的实时数据交换得到的,是PLC的端子的实时状态。软件对PLC各个元器件状态的获取 是通过读命令和软件的定时器控件Timer()来实现的。读命令是通过函数ReadFromPLC()实 现的。其程序为:
Public Sub ReadFromPLC()
Dim DUMMY As String
''''向计算机发送读取命令''''''''''''
If MSComm1.PortOpen=False Then
MSComm1.PortOpen=True
End If
''读取D数据寄存器的数据''''''
MSComm1.InputLen=0
MSComm1.Output=ReadCmd(nCounter) '''''''从MSComm1.Output发送数组ReadCmd(20) 中的字符串
Do
DUMMY=DoEvents()
Loop Until MSComm1.InBufferCount >=6
ReturnData(nCounter)=MSComm1.Input
将MSComm1.Input接收到的信号存放在数组ReturnData()中,然后根据接收到的数据分配给 用户界面中的各种状态显示。
手控界面中的所有的读命令又是通过数组ReadCmd()来实现的。其元素包括举例如下:
ReadCmd(0)=Chr$(2)+“0”+“100001”+Chr$(3)+“55” '''读取D0数据
5 结束语
通过机械手监控系统的具体程序,系统地阐述了VB环境下的PC与PLC编程口通信应用程序的 设计方法。系统运行表明,用PLC编程口与VB通信控件编写的实时通讯程序可靠、稳定,很 好地满足了机械手实时监控系统的应用要求。
[参考文献]
[1] 郁汉琪,郭健,等.可编程序控制器原理及应用[M].北京:中国电力出版社 ,2004.
[2] 刘圣才,李春葆.Visual Basic 6程序设计导学[M].北京:清华大学出版社 ,2002.