技术中心
 
 

Windows98下单台PC与多台变频器的串行通信控制

   日期:2007-04-09     来源:中国测控网     作者:管理员    

一、前言

在许多数控设备中,经常要用变频器去控制交流电机的转速、转向。在某些地方,需要用一台工控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属性设置值,当接收缓存区内接收到相应字节的字符

 
  
  
  
  
 
更多>同类技术
 
全年征稿 / 资讯合作
 
推荐图文
推荐技术
可能喜欢