VB实现与西门子变频器通讯

介绍西门子 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 控件 MicrosoftCommunication 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 机控制多台变频器的任务, 并能实时检测各变频器的运行状态。 整个控制系统灵活方便, 具有很大的实用性。