一、引言
变频器被广泛应用于工业控制现场的交流传动之中。通常变频器控制由操作面板来完成,也可通过输入外部的控制信号来实现。由于PC机具有键盘、显示器、打印机等外设及大容量硬盘和丰富的软件资源;在Win98下运用VC、VB等软件可编制人机界面友好、控制管理较强的控制软件,在进行实时数据采集和控制任务时,具有集成度高、控制处理能力强、工作可靠稳定等特点。因此,如何实现PC机与变频器之间的通信控制一直是本领域所要研究的课题,本文以Sanken公司IHF变频器为例,说明了PC机与变频器之间的通讯编程设计方法。
二、PC机与变频器的通讯
1、单机通讯
图1所示为变频器与计算机组成的单机通讯图。在该系统中计算机与IHF变频器之间通过RS232C串口进行双向通讯。

2、多机通讯
在IHF系列变频器中,通讯接口有两个,即RS232C和RS485。一台计算机最多可联控32台IHF变频器,其框图如图2所示,图3所示为接线图。


3、通讯协议
IHF系列变频器的通讯协议参数为:

每台变频器只能有一个唯一的通讯地址,由Cdl47参数设定。波特率应与计算机一致,一般为4800或9600,由Cdl48参数设定。例如:若要改变变频器8的设定输出频率为40Hz,则计算机指令的发送格式为:
变频器在收到与数据码写入格式相吻合的指令格式时,将产生应答码“eFFF0”,若不相吻合,则应答码为“eFFFA”。
三、程序设计方案选择
常用的串行通讯有以下几种方案:
1、直接利用C语言的通信功能,采用TC等工具来开发。这种方案较适合DOS环境。由于本系统采用Windows98,它屏蔽了对底层通讯的调用,而且TC开发可视化界面较困难。
2、直接利用Active控件来实现。这种方案的特点是方便、可靠,只需要在使用前安装控件并在注册表中注册后即可使用。但它的通用性不够好。
3、利用Windows
API函数实现通信功能。这种方案较适合我们的开发环境和通讯要求。
经过以下考虑,选择了(3)方案:
(1)直接在主程序中利用Windows
API函数。
(2)利用动态链接库(DLL)将Windows
API函数封装起来,为主程序提供通讯函数。
方法2的优点有:可节约空间、节约开发时间,可方便地供采用其他语言的程序调用,灵活、易于修改和扩充功能。
四、软件设计
1、系统软件结构
在系统中,为用户设计了良好的可视化人机界面,使用户可通过鼠标与键盘预先协调所要进行的工作,使系统自动运行。同时进行实时数据采集和各种控制功能切换,并根据用户的要求,检测相关数据,自动生成各种曲线。考虑到用户的实际需求,系统包含如下几个主要部分:
(1)转速开环变频调速系统;
(2)转速闭环变频调速系统;
(3)矢量控制变频调速系统;
其中,各部分是相互平行的,而且由于存在相似性,各部分之间可以使用公用模块以减少程序的复杂度。系统结构框图如图4所示:

2、软件流程图
软件采用模块化结构设计。分别设置有初始化串口程序、发送变频器初始化参数、设置采样时间、动态演示曲线、关闭串口程序,软件流程图如图5所示。

3、程序设计
(1)基本通信函数
(1)SetCom():打开并设置串口。
void SetCom(int baudrate)
{BOOl success;
hCom=CreateFile("COM",//指定串口
GENERIC_READ|GENERIC_WRITE,//设置读写模式
0, //共享模式,此项必须为零
NULL, //安全属性
OPEN_EXISTING,//安全模式
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED//设异频通信
NULL);//通信中必须设为NULL
if(hCom!=INVALID_HANDLE_VALUE)//若句柄有效
if(GetCommState(hCom,&hdc))
hdcb.BaudRate=9600; //设置串口参数
hdcb.ByteSize=8;
hdcb.Parity=NOPARITY;
hdcb.StopBits=Bits=ONESTOPBIT;
success=SetCommState(hCom,&hdcb);
……
(2)ComSend():发送一个字符。
BOOL ComSend(char outbuff)//发送一个字符
{char*send;BOOL success;
unsigned long dwLength; dwLength=1;
send=&outbuff;
success=WriteFile(hCom,//打开串口的句柄
send,//指向存储发出数据的存储区
dwLength,//要发出的字节数
&dwLength,//实际发出的字节数
……
(3)ComRecceive():接受一个字符
char ComReceive()//接收一个字符
{unsigned long nBytesRead;
if(ReadFile(hCom //打开串口的句柄
inbuff,//接受缓冲区
1,//要读取的字节数
&nBytesRead,//实际读取的字节数
NULL))
{return inbuff[0];//返回收到的字符
PurgeComm(hCom,PURGE_RXCLEAR);//清除没有读字节的缓冲区
…… |
(2)电文通讯函数
在基本通讯函数的基础上,根据变频器电文的具体形式,实现发送、接收变频器电文的功能。
(1)QuerySend():发送电文
void QuerySend(char op)
char send[20];
switch(op)
case'A':
melength=7;send[0]='*';send[1]='0';send[2]'1';
send[3]=op
sum=send[0]+send[1]+send[2]+send[3];…//计算校验和
send[4]=sum;
send[5]=0x000D;send[6]=0x000A;
for(i=0;i<=5;i++){
ComSend(send[i])//发送电文
……
(2)QueryReceive():接收电文(即变频器应答电文)
BOOL QueryReceive()
ch=ComReceive();int j=0;
if(ch=='*')//遇结束符停止接收
rec[0]=ch;
while(ch!=0x000D)//遇结束符停止接收
j=j+1;ch=ComReceive();
rec[j]=ch;//收到的电文放在数组rec[]
if(rec[1]!='0')||(rec[2]!='1')) return FALSE;
switch(rec[3])//取操作码
case'A':
sum+rec[0]+rec[1]+rec[2]+rec[3]+rec[4]+rec[5]+rec[6]+rec[7]+rec[8];…//校验和
if((rec[9]!=sum))return FALSE;
…… |
(3)用户界面
在设置好变频器的参数后,启动变频器,通过定时调用动态链接库函数向变频器发“读频率”指令,并从变频器返回的电文取出频率或电流值,根据用户要求动态的显示其曲线。
实现用户界面的部分程序如下:
void CDialogShow::DrawCurve(CDC*pDC,int k)
int i;float f;
QuerySend('C');//
调用动态链接库函数向变频器发“读频率”指令
if(QueryReceive())
f=Getrealfdata();//调用动态链接库函数在变频器返回的电文取频率值
i=m_cord_bottom-Round (f)*5;//转化为坐标轴上相应点的纵坐标
CPen*pen;
pen=new CPen(PS_SOLID,1,RGB(0,255,0));//生成绿颜色的画笔
CPen*oldPen=pDC->SelectObject(pen2);
if(m_count+k<=m_cord_right)//判断是否已到了屏幕的最右端,m-count用来表示点的横坐标,
{pDC->MoveTo(m_count,m_previous_y);//根据当前频率制作曲线
pDC->LineTo(m_count+k,i);
m_previous_y=i;//m_previous_y用来保存前一点的纵坐标值
m_count=m_count+k;
if(m_count+k>m_cord_right)//判断是否已到了屏幕的最右端,如果是准备开始平移
{for (int p=m_count-k;p>=m_cord_left;p++)
for(int j=m_cord_top;j<=cord_bottom;j++)
if(pDC->GetPixel(p,j)==RGB(p,255,0))
pixel_y[p-m_cord_left]=j;//用数组pixel_y来保存该曲线各点的纵坐标值
…… |
其中X轴和Y轴是分开来画的,与频率曲线类似,坐标轴Y轴也要随着时间的延伸而不停平移。可通过对坐标轴区载不断刷新重画,实现坐标不断左移的视觉效果。
此外,还在应用程序中添加了气泡帮助,当用户点击屏幕上的点时,能打开一个气泡似的小窗口,在这个窗口中将显示该点对应的时刻和频率值。
五、结束语
控制软件充分利用了PC机的大容量硬盘和丰富的软件资源,在进行实时数据采集和控制任务时,具有界面友好、集成度高、控制处理能力强、工作可靠稳定等特点。经实际运用证明,本软件设计合理,使用方便,为实现多台变频器分部控制提供了软件支持。
|