摘 要:介绍了西门子MicroMaster变频器的RS-485通信协议,利用VB6.0中的ActiveX控件MSComm6.0通信控件实现 Windows98下单台微机与多台变频器的串行通信控制,并能实时检测各个变频器的运行状态。
关键词:变频器、PC机、VB6.0、ActiveX控件、RS-485、事件驱动
一、前言
在许多数控设备中,经常要用变频器去控制交流电机的转速、转向。在某些地方,需要用一台工控PC机灵活地控制多台变频器,以达到控制各交流电机的目的。针对这一需要,一些公司(如德国的西门子、日本东芝、三菱等公司)推出了带有RS485通信接口的变频器,使用户能够方便灵活地选择变频器的强大功能。
在Windows98下开发工控软件,可以利用Windows98的丰富资源,方便地生成各种菜单及美观大方的图形界面,软件产品质量高且开发周期短。Visual Basic6.0是Microsoft公司推出的功能强大的Windows开发软件,只能在Windows环境下运行开发32位的应用程序。但在Windows环境下,系统完全接管了各种硬件资源,不允许用户直接控制串行口的中断管理。如何在Windows环境下开发微机的底层资源,已成为当今工业控制软件的一大热点和难点。
本文利用VB6.0的ActiveX控件——Microsoft Communication控件,方便地实现Windows98环境下与多台西门子MicroMaster变频器的串行通信接口,成功地实现了用单台PC机对多台交流异步电动机的灵活控制。
二、系统的总体设计
图1为系统的总体方框图,这里只重点突出PC机与变频器RS485的接口部分。RS485的驱动器可带32个接收器,在波特率为 100Kbps时,通信距离可达到1.2km;通信距离为15m,波特率可达到10Mbps 。在工业现场,RS485是应用较多的一种通信
方式。图中PC机通过RS485接口卡与多个变频器相连接,最多达到32台。每个变频器被赋予各自的地址码用以识别身份,这样上位机便能通过RS485通信线,对挂在上面的变频器进行控制操作。
三、变频器的串口通信协议
对于西门子MicroMaster变频器。其通信方式为RS-485,波特率最高可达19200bps;1位起始位,8位数据位,1位奇偶效验位,1位停止位。变频器接收控制的通信协议如下:
STX:起始字符,02H。
LGE:发送字节数,对于MicroMASTER,为0CH(12个字节)。
ADR:变频器的地址码,取值范围为0-31(bit:0-4位),bit5为1时为广播发送。
PKE:为一16位的字,用来控制变频器的运行参数设置,各bit的含义如下:
对于MicroMaster,控制位为0001时,读变频器的参数;控制位为0010时,写参数到变频器的RAM和EEPROM。bit11未用,置为0。变频器的参数值详见说明书。
IND:为16位的字,未用,置为0。
VAL:为16位的变频器参数,与PKE一起将运行参数写入到变频器中。
STW:为16位的字,用来控制变频器的运行动作。各位的具体含义详见说明书。
HSW:为16位的字,用来控制变频器的输出频率。满频的值为16384(400HZ)对应100%的输出频率,最大满频的值为32767,即200%的输出频率。当取值为32768-65535时,表示反向的输出频率从0-200%变化,电机反转。
BBC:效验字符,为前面所有字节的异或和。
若变频器#2(地址码为02H)以满频的25%输出频率,则以上各参数的值如下:
同时,变频器也向上位机回送状态数据,其通信协议如下:
与上位机向北变频器发送的控制字相比,变频器回送的状态字只是以ZSW代替了STW,HIW代替了HSW,其余字的含义是一样的。
ZSW:为16位的字,用来指示变频器的当前运行状态。各位的具体含义详见说明书。
HIW:为16位的字,代表变频器的输出频率,其定义与HSW是一样的。
因此,对于变频器能通过面板按键的设置功能,通过以上的通信协议也一样能实现。并且通过RS-485通信线最多能同时控制32台变频器,同时各变频器的运行状态也能实时地回送给上位机,这就大大地方便了用户,增加了控制系统的灵活性。
四、Viscal Basic 6.0下对变频器进行串行通信控制
1、VB6.0中的ActiveX控件MSComm
在Windows环境下,操作系统完全接管了各种硬件资源,不允许用户直接控制串行口的中断管理。以往程序员只能通过数目众多的API函数来控制串口。 VB6.0下提供了一个ActiveX控件Microsoft Communication Control 6.0,简称MSComm控件。用户可以在自己的应用程序嵌入MSComm控件,利用它可以方便地进行计算机串口的通信管理。
在vb6.0开发环境中,MSComm通信控件可直接从VB的ToolBox中加入窗体Form,即可用其进行通信。若ToolBox中无此控件,则用Tools的Custom Controls将MSComm.VBX从Windows的System子目录中加入VB的ToolBox中。
MSComm控件有许多属性(Property),其中一些重要的属性如下:
CommPort:设置串口号;类型:short 。
Settings:设置串口通信参数;类型:Csting 。
PortOpen:设置或返回通信口的状态;类型:BOOL 。
InputMode:设置从缓冲区读取数据的格式;类型:long 。
Input:从接收缓冲区读取数据;类型:VARIANT 。
Output:向发送缓冲区写入数据;类型:VARIANT 。
InBufferCount:接收缓冲区中的字节数;类型:short 。
OutBufferCount:发送缓冲区中的字节数;类型:short 。
CommEvent:设置或返回Input每次读出的字节数;类型:short 。
CommEvent:串口事件;类型:short 。
其中串口号(CommPort)设置为1、2等表示COM1、COM2。参数设置(Settings)的格式为“B,P,D,S”B表示波特率,P表示奇偶校验(N:无校验,E:偶校验,O:奇校验),D表示字节有效位数,S表示停止位数。串口状态为BOOL变量,TRUE表示打开串口,FALSE表示关闭串口。InputMode使程序能方便地选择从缓冲区读取数据的格式,设置为0时,为字符串格式(Text),设置为1时,为二进制格式(Binary)。InputLen设置或返回的是用Input从缓冲区读字符串时每次读出的字符个数,这个性质对于读出数据块中长数据串非常有用。
另外,MSComm控件提供了两种方法来处理串口通:上面属性的InBufferCount和OutBufferCount用于串口的查询方式;对于较复杂的通信任务,可通过SetCommEvent()函数设置串口要响应的事件,当相应事件或串口错误事件发生时,系统会激活OnComm()事件,在OnComm()中添加用户的处理代码,则可实现类似DOS中断的串口处理程序。
2、变频器串口通信控制检测的软件编程
在项目窗体中嵌入MSComm通信控件之后,为了用该控件控制一个串口进行通信操作,还必须在应用程序中插入该控件。为此为程序的某个对话框插入MSComm控件,控件名为MSCOMM1,并为其添加两个定时器控件(TimPeriodic和TimNonPeriodic)和一个命令按钮控件CmdNonPeriodic 。通信控件用于访问串口、发送和接收数据;周期定时器控件(TimPeriodic)用于控制每秒由计算机向各数据点发送周期性命令;命令按钮控件与非周期定时器控件(TimNonPeriodic)用于发送非周期性命令。MicroMaster变频器回送的状态信息一帧位14个字节。为此,程序编制上采用事件驱动的通信方式,串口每接受14个字符边激活一个OnComm()事件,在OnComm()消息处理函数中加入相应的处理代码,用来读取状态字ZSW和HIW各位的状态参数,并做出相应的处理,如显示、报警等等。下面简要给出用事件驱动方式读出变频器回送状态字的程序源代码。设RS-485的口地址为PC机的串口2的地址,波特率为9600bps 。
(1)窗体中各控件初始设置:TimPeriodic为1s,TimNonPeriodic为0.5s
Sub Form_Load()
Mscomm1.CommPort=2 ’选用COM2串行口
MsComm1.setting=”9600,N8,1” ’波特率为9600,无奇偶校验,8位数据位,一位停止位
Mscomm1.InputLen=0 ’Input将读取接收缓冲区的全部内容
Mscomm1.InputLenSize=1024 ’设置接收缓冲区的字节长度
Mscomm1.PortOpen=0 ’打开通信口
Mscomm1.InBufferCount=0 ’清除发送缓冲区数据
Mscomm1.OutBufferCount=0 ’清除接收缓冲区数据
TimPeriodic.inteval=1000 ’设置1s定时间隔,使遥测命令每隔1s发送1次
TimNonPeriodic.inteval=500 ’设置0.5s定时间隔,查询命令按钮是否处于激活状态以确定是否发送周期性命令
CmdPressed=False ’命令按钮为未激活状态
DuringPeriodic=False ’周期命令数据传输尚未开始
DuringNonPeriodic=False ’非周期命令数据传输尚未开始
End Sub
(2)非周期性命令的发送:根据命令按钮状态及周期性命令数据传输状态,在TimNonPeriodic定时器的中断程序中发送非周期性命令。
Sub CmdNonPeriodic_Click()
CmdPressed=True ’命令按钮激活
End Sub
Sub TimNonperiodic_Timer()
If DuringPeriodic=True OR Cmdpressed=False Then Exit Sub ’如周期命令数据传输尚未结束或命令按钮处于激活
状态,则退出发送非周期性命令程序。
CmdPressed=False ’命令按钮恢复为未激活状态
Call SendData(NonPeriodic_COMMAND) ’发送非周期性命令
Mscomm1.Rthreshold=R_NONPERIODIC_BYTE‘发送非周期性命令后,设置Rthreshold属性,使主站接收所设定的字节数
后引发OnComm事件
End Sub
(3)TimPeriodic定时器程序:在TimPeriodic定时器的中断程序中发送周期性命令。
Sub TimPeriodic_Timer()
If DuringNonPeriodic=True Then Exit Sub ’如非周期命令数据传输尚未结束,则退出发送非周期性命令程序。
DuringPeriodic=True ’设置周期命令数据传输状态为正在进行中
Call SendData(NonPeriodic_COMMAND) ’发送非周期性命令
Mscomm1.Rthreshold=R_PERIODIC_BYTE’设置Rthreshold属性,使主站接收R_PERIODIC_BYTE个字节,引发OnComm事件
End Sub
(4)OnComm事件程序:根据Rthreshold属性设置值,当接收缓存区内接收到相应字节的字符时,引发OnComm事件,在中断程序中接收数据。
Sub Mscomm1_OnComm()
Select Case Mscomm1.commEvent ’在此插入处理各种不同错误或事件的代码
Case MSCOMM_EV_RECEIVE
ReceiveString$=Mscomm1.Input
Select Case Mscomm1.Rthreshold
Case R_PERIODIC_BYTE‘周期性命令的应答数据
Call DisposeDate(NonPeriodic_CommAND) ’处理接收数据
DuringPeriodic=False ’设置周期命令数据传输状态为结束
Case R_NONPERIODIC_BYTE ’非周期性命令的应答数据
Call DisposeData(NonPeriodic_CommAND) ’处理接收数据
DuringNonPeriodic=False ’设置非周期命令数据传输状态结束
End Select
End Select
End Sub
上述程序中,因MicroMaster变频器回送的状态信息一帧为14个字节,所以R_NONPERIODIC_BYTE和R_PERIODIC_BYTE 。对于变频器回送的状态信息则利用Windows的消息处理函数OnComm()进行处理。在消息处理函数中,将变频器回送的14个状态字一次全部读到所定义的变量参数中,然后程序再从变量参数中分别读取各状态字,在屏幕上显示、判断并报警。
五、结束语
本文利用VB6.0下的ActiveX控件和MicroMaster变频器RS-485的串行通信功能,实现了在Windows09环境下用单台PC机控制多台变频器的任务,并能实时检测各变频器的运行状态。整个控制系统灵活方便,具有很大的实用性。