摘要:变频器是工业自动化系统中的基本拖动设备。当应用环境非常恶劣,不适合于人在现场对变频器直接进行控制时就需要对变频器进行远程控制。主要介绍了如何用VC编写控制软件对变频器进行联网控制。
0 引言
变频器是工业自动化系统中的基本拖动设备,通常用于控制交流电机的转速和转向。如果变频器的工作现场环境比较恶劣,不适合于人在现场对变频器进行控制,那么就需要对变频器进行远程的联网控制。
1 基本组成
将变频器的RS485串口通过RS232/485转换器连接到计算机的串口组成网络,这个网络系统主要由三部分组成。
第一部分是变频器的网络功能部分,包括硬件和软件两部分。硬件部分是变频器控制板上CPU的串口经过RS485转换芯片(如MAX485)对外形成的一个RS485接口,通过这个接口可以将变频器接进控制网络。软件部分是变频器的通信程序。通过这个通信程序可使变频器在接收到计算机的下达指令后,根据指令做出相应的应答和动作。变频器上的通信程序主要包括串口初始化程序、命令读取和发送程序、命令判断程序及命令集。
第二部分是计算机控制程序。这个程序有人机对话功能,对变频器的状态可以进行远程监视与控制,对变频器的参数能进行修改。总之,人在现场可以对变频器进行的操作在这个控制软件上都应该可以实现。
第三部分是通信协议。这是计算机与变频器之间进行通信的依据。变频器的通信软件和计算机的控制软件都是按照这个通信协议所规定的信息格式进行编写的。
由这三部分构成的变频器远程控制网络就可以完成所希望的变频器远程控制功能。变频器远程控制网络组态图如图1所示。
图1 变频器远程控制网络组态图
2 在VC环境下编写计算机控制软件
用VC编写的计算机控制软件的主界面选用单文本界面,并且带Windows浏览窗口,界面的基类选用CFormView类。主界面显示了所控制的网络中变频器的构成及地址。各个变频器的详细信息显示选用了CpropertyPage类作对话框。CpropertyPage类是从Cobjec类一路继承发展而来,可以被看作是标签对话框。控制软件为各个变频器显示了两个方面的详细信息:一个是变频器的功能码信息,另一个是变频器的远程控制和当前状态。这两方面信息的显示每个都是用CpropertyPage类对话框。对于变频器的功能码显示,由于变频器的功能码由很多组构成,而且显示要求分组进行,所以应用Tab控件来进行分组选择切换。对于变频器的远程控制和当前状态界面我们调用了一些Text、Edit和Button控件。这些控件通过消息〔如BN_CLICKED,UpdateData(TRUE)等信息〕与相应的子程序相关联。一旦我们对变频器进行控制动作或程序收到变频器的反馈信息,界面就会有相应的变化。整个控制软件的程序流程如图2所示。
图2 控制软件程序流程图
从流程图上可以看出控制软件要求能不断地得到联网变频器的状态,这就要求控制软件不停地下发变频器的状态查询指令。这个功能通过在程序里设定了一个计时器SetTimer(1,10000,NULL)完成。定时器使控制软件每10s对变频器进行一次状态查询,检查变频器是否在线。如果在线就会反映这个变频器当前的各种状态,如果不在线会有相应的提示信息显示。计算机与变频器组网时软件的主界面图如图3所示。
图3 控制软件的主界面图
控制软件界面上显示的网络信息和各个变频器的参数信息都要配合相应的数据库才能完成。而对于网络中各个变频器状态信息的获得则要通过计算机串口上传至现场的变频器运行数据实现。下面就分别介绍控制软件是如何对数据库和计算机串口进行操作的。
3 应用DAO技术操作数据库
数据库是现代计算机应用的一个重要组成部分,是人们有效地进行数据存储、共享和处理的工具。有两种主要的数据库类型,即平面数据库和关系数据库。简而言之,平面数据库是一组记录的集合,数据库中的每一个记录都是由字段构成的,第一个字段则包含了与本条记录相关的特定信息。
而关系数据库就像是由若干个平面数据库连接在一起形成的。采用关系数据库能够建立一个记录集合与另一个记录集合之间的关系。在关系数据库中,每一个记录集合称为一张表,表之间的连接是通过关键字实现的,关键字用来确定一条记录的值。
这个控制软件的数据库使用的是平面数据库。数据库中存储了变频器网络的信息和网络中各个变频器的参数。数据库用Access建立,应用DAO作为数据库的访问接口。Microsoft Jet为像Access和Visual Basic这样的产品提供了数据引擎。DAO是使用Microsoft Jet数据库引擎来访问数据库的。VisualC++6.0提供了对DAO的封装,MFCDAO类封装了DAO的大部分功能,从而使VC程序可以使用MFCDAO类方便地进行数据库访问。
下面具体叙述是如何利用数据库完成软件的网络控制功能。首先用Access建立变频器网络的信息表,然后程序中建立一个基类为CdaoRecordset(DAO中封装的一个类)的类Cdata,该类与数据库中的变频器网络信息表相联系。当要在网络中添加一个变频器时,不仅要在变频器网络信息表上进行添加数据操作,还要在数据库中添加一个关于该变频器功能码的新表。对变频器网络信息表的添加操作用了一个CdaoRecordset类数据库指针m_leftptr。CdaoRecordset类是对DAO记录集对象的封装,代表从数据源中选择的一种记录,管理数据库中表里记录的操作。而要在数据库中添加一个新增变频器功能码的新表,需要设定一个CdaoDatabase类的变量。CdaoDatabase类是对DAO数据库对象的封装,它代表了一个数据库连接,管理数据库的操作和数据库中表的操作。下面是网络中添加一个变频器时对数据库的操作程序。
CComzDoc*pDoc=(CComzDoc*)GetDocument();
m_leftptr=&pDoc->m_Docptr;
CAddNodeDlgm_addnode;
if(m_addnode.DoModal()==IDOK)
{
m_leftptr->Open();
m_leftptr->AddNew();
m_leftptr->m_NodeAddress=
m_addnode.m_adddress;
m_leftptr->m_NodeName=
m_addnode.m_addnodename;
m_leftptr->m_NodeOrderCalled=
m_addnode.m_comturn;
m_leftptr->Update();
m_leftptr->Close();
CDaoDatabasem_pDatabase;
m_pDatabase.Open("ConverterPc
97.mdb");
CDaoTableDeftable(&m_pDatabase);
table.Create(m_addnode.m_addnodename);
table.CreateField("AutoIndex",dbInteger,2);
table.CreateField("ParaGroup",dbText,10);
table.CreateField("ParaNo",dbInteger,2);
table.CreateField("ParaName",dbText,100);
table.CreateField("ParaDefaultVal",dbInteger,2);
table.CreateField("ParaCoefficient",dbInteger,2);
table.CreateField("ParaDW",dbText,10);
table.CreateField("ParaModif",dbInteger,2);
table.CreateField("ParaMemo",dbText,255);
table.Append();
m_pDatabase.Close();
}
添加完成后,该变频器如果在线就完成初始化数据库命令,初始化变频器的功能码。在软件上显示变频器功能码数据库如图4所示。
图4 变频器功能码
对控制软件的数据库中表的删除及表中记录的删除和更新操作所采用的DAO类是一样的,只是使用的指令不同,这里就不再赘述。变频器功能码表中的具体数据,要通过串口通信从相应的变频器中获得,这就要用到VC对计算机串口编程。
4 计算机串口通讯编程
对于VC的计算机串口通信编程可以用多种方法实现。MSComm控件通过串行端口传输和接收数据,因此,可在编写计算机串口通信程序时使用MSComm控件。MSComm控件使用时比较方便,只要完成简单的串口初始化设置,然后调用相应的读写函数即可完成计算机串口通信操作。但是,使用MSComm控件在设置通信参数时是成批进行的,即数据传输速率、奇偶校验、数据位数和停止位数是作为一个参数进行设置的。这样使通信参数的设置和修改不太灵活自如,因此,不采用MSComm控件进行串行通信编程。利用Windows通信API函数进行串口通信编程可以非常灵活地进行串口参数的配置,但编程非常复杂,专业化程度较高,因此也没有采用。利用VC的标准通信函数inp,inpw,inpd,outp,outpw,outpd等直接对串口进行操作编程需要对硬件电路的结构原理非常了解,但这里并不需要对计算机的串口电路非常了解,因此同样没有采用。最终程序中应用的是第三方编写的串行通信Cserial类。下面对CSerial类进行解释。
CSerial::CSerial是类构造函数,不带参数,负责初始化所有类成员变量。
CSerial::Open是打开通信端口的成员函数,带两个参数,一个是串行端口号,另一个是波特率。
CSerial::Close是关闭通信端口的成员函数。类析构函数调用这个函数,因此可不用显式调用这个函数。
CSerial::SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料。这个函数返回一些到端口的实际字节数。
CSerial::ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。
CSerial::ReadData函数从端口接收缓冲区读入数据。第一个参数是缓冲区指针,第二个参数是个整数值,给出缓冲区的大小。
将CSerial.cpp和CSerial.h添加入源程序,在串口通信程序部分调用CSerial类的函数,可以很方便地完成通信功能。下面是在程序中用CSerial类编写通信程序,完成的功能是按既定的通信协议向变频器网络下传查询指令,并接收从站返回的信息。如果连发三次都没有接收到变频器的应答信息就显示变频器为离线状态。
CSerialSerial;
inti;
CStringm_mes;
Unsignedcharsend[14]={0x02,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x80,0x00,0x00,0x00};
for(i=1;i<=m_slname;i++)
{
send[2]=i;
unsignedcharu=send[0];
for(intl=1;l<13;l++)
{
u=u^send[l];
}
send[13]=u;
showaf=send[10];
if(Serial.Open(m_port,m_baudrate))
{
Serial.SendData(send,14);
}
Sleep(200);
if(Serial.ReadDataWaiting())
{
Serial.ReadData(recieve,14);
}
else
{
Serial.SendData(send,14);
Sleep(200);
if(Serial.ReadDataWaiting())
{
Serial.ReadData(recieve,14);
}
else
{
Serial.SendData(send,14);
Sleep(200);
if(Serial.ReadDataWaiting())
{
Serial.ReadData(recieve,14);
}
else
{
m_mes.Format("%disoffline",i);
m_recc.InsertString(-1,m_mes);
}
}
}
在与变频器的通信中要求计算机的串口号和通信速率是可变的。Open函数的两个参数就是计算机的串口号和通信速率,在调用该函数初始化串口时,将这两个参数按所希望的数赋值就可以正常通信了。如果要修改这两个参数,只要将修改值赋给这两个参数的变量,再调用一次Open函数从新初始化计算机串口即可。在Open函数中仅初始化了串口号、通信速率和8位数据位这三个参数,其它参数采用上一次串口初始化形成的参数数据。但是,在通信中还要求传送的数据为二进制数据、偶校验和有1位停止位,这就要求对Open函数进行修改。对Open函数的修改主要是对其中设备控制快(DCB)的修改。只要将旧的DCB结构改写为以下结构即可。
GetCommState(m_hIDComDev,&dcb);
dcb.BaudRate=nBaud;
dcb.ByteSize=8;
dcb.fParity=1;
dcb.fBinary=1;
dcb.Parity=EVENPARITY;
dcb.StopBits=ONESTOPBIT;
经过上述修改后,用Open函数初始化的串口就符合传送二进制数、偶校验、8位数据位、1位停止位和波特率及端口可变的要求,计算机可以和变频器进行正常的通信了。
5 组网实验
远程控制软件完成后进行组网实验。网络上用一台计算机连接两台变频器,对其中一台变频器执行正转起动到30Hz的控制命令,软件控制界面显示如图5所示。
图5 变频器器起动控制界面
6 结语
本文主要介绍了实现变频器远程网络控制的计算机控制软件如何编写。从软件的功能框架,数据库的操作和计算机串口通信3个方面进行了阐述,详细说明了在VC环境下来编写合乎我们要求的控制软件的方法,具有一定的实际参考价值。