基于ModBus协议的变频器VC++控制系统
1、 前言
在工业控制领域中,经常要用变频器去控制交流电机的转速、转向等,尽管变频器自身带有控制面,具有简单、有效的特点,但由于现场操作不够方便,直观性差以及仅能实现单机控制等缺点,针对这些缺点,现在的变频器都带有rs485通信接口,使用户能方便灵活地选择变频器的强大功能,在windows下开发工控软件,可利用windows的丰富资源,方便地生成各种采单及美观大方的图形界面。
mobus协议是应用于电子控制器上的一种通用语言,通过此协议控制器之间可以相互通信,而visual c++ 6.0的activex控件----mscomm通信控制能够满足windows环境下开发微机的低层资源。本文介绍的方案使用mobus协议的ascⅱ传输模式,通过visual c++ 6.0编程实现windows环境下,台达vfd-s变频器的计算机控制系统
2、 系统硬件设计
现在一般的pc机都有rs232串口,但少有rs485口,而实现与变频器进行长距离且抗噪音干扰的通信,一般多采用一块rs232/485转换器,总体的系统方框图如图1 图1
目前,rs232/485转换器有无源和有源两种,如果通信距离较近,采用无源转换即可。可以购买也可以自己设计。
3、modbus协议下ascⅱ模式的通信过程及台达vfd-s型变频器的通信要求
3.1mobus协议规定的通信过程
modbus协议是一种可靠而有效的工业控制系统通信协议,得到了众多硬件厂商的支持,并广泛应用。modbus协议的数据通讯通过主机与从机之间查询/回应的方式实现,查询消息中的功能代码告知从设备要执行何种功能,数据段包含了从设备要执行的功能的附加消息。从设备产生回应消息,回应消息中的功能代码是查询消息中功能代码的回应,查询消息、回应消息中都有用于判断传输是否正确的错误检测域。
3.2 ascⅱ模式的通信数据格式
modbus协议系统中有两种有效的传输模式:ascⅱ(美国标准信息交换码)模式和rtu(远程终端装置)模式,ascⅱ模式通信时,在消息中的每个8-bit数据由两个ascⅱ字元所组成。例如,一个1-byte资料64h(十六进制表示法),以ascⅱ“ 64” 表示,包含了‘ 6’ (36h)及‘ 4’ (34h)。
ascⅱ模式:
ascⅱ模式采用lrc(longitudinal redundancy check)侦误值。lrc侦误值是将adr1至最后一个资料内容加总,得到之结果以256为单位,超出部分去除(例如得到结果为 1f 2h时则只取f2h),然后计算二次反补后得到的结果即为lrc侦误值。
3.3台达vfd-s型变频器的通信要求
vfd-s系列交流马达驱动器是内建rs485串联通讯介面,通讯埠(rj-11)位于控制回路端子,端子定义如下:
2:gnd 3:sg- 4:sg+ 5:+5v
2、5pin为参数设定器操作盘之电源,做rs485通信时,请勿使用!
使用rs485串联通讯介面时,每台vfd-s型必须预先在(9-00)指定通讯地址,电脑便根据其个别地址实施控制。
4、mscomm控件介绍
mscomm控件是微软公司开发的专门用于串行通信的控件,它是高级语言编写的串行通信程序和pc串口之间的桥梁,vc++ 6.0中提供了mscomm控件,用户可以在自己的应用程序嵌入mscomm控件,利用它可以方便的进行计算机串口的通信管理。
使用mscomm控件时,其中一个难点是对输入缓冲区或输出缓冲区的数据进行处理,因为向输出缓冲区写入的数据及从输入缓冲区读出的数据都是variant类型的数据,而程序中常用的通信数据既可能是文本型的字符串,又可能是二进制的数值,因此必须处理好字符串与variant类型数据间的转换及二进制数据与variant类型数据的转换。
以下代码简单介绍如何完成使用mscomm控件时如何接收和发送字符串或二进制数值:
ⅰ、收字符串
variant input1; //定义一个variant结构的变量
char *str;
int counts;
counts=mycomm.getinbuffercount(); //获取接收缓冲区中的字符数
if(counts>0)
{ input1=mycomm.getinput(); //将接收缓冲区内容读至input1中
str=(char*)(unsigned char*)input1.parray->pvdata;//将input1变量的数据指针赋值给字符指针
}
……
ⅱ、发送字符串
cstring senddata1;
senddata1=”atz”;
mycomm.setoutput(colevariant (senddata1));
ⅲ、接收二进制数据
variant input1; //定义variant类型变量
byte rxdata[2048],aa1; //定义存放二进制数据的数组
long len1,k;
colesafearray safearray1; //定义colesafearray类的实例
input1=mycomm.getinput();
safearray1=input1; //将variant变量赋值colesafearray类的实例
len1=safearray1.getonedimsize(); //使用colesafearray类的成员函数获取数据长度
for(k=0;k safearray1.getelement(&k,rxdata+k); //使用colesafearray类的成员函数将数据写入数组
ⅳ、发送二进制数据
cbytearray array1;
array1.removeall();
array1.setsize(3);
array1.setat(0,12);array1.setat(1,79);array1.setat(2,0xe2);
mycomm.setoutput(colevariant(array1));
5、通信程序编写
下面给出了利用pc机对vfd-s型台达变频器的串行通信控制程序:
⑴端口设置界面(如图3)
通过设置端口参数使控制程序跟变频器的(9-00 9-01 9-04)参数设定一致,从而能够保证正常通信,同时设置变频器的(2-00 2-01)参数,使得变频器的控制由rs485通讯界面输出。
⑵主界面(如图4)
主界面用来发送控制信息给变频器来控制电机的起止、反转、寸动和频率等。
⑶运行控制编程
发送控制信号: 主要代码(以正转运行为例)
if(nid==idc_radio1)
{ str0=":010620000012" ;
b="0x01"+0x06+0x20+0x00+0x00+0x12;
if(b>0xff)
b="b"&0x0ff;
b="b"^c; //求校验
b="b"+1;
str1.format("%02x",b);
}
str3=str0+str1+"/r/n";
mycomm.setoutput(colevariant(str3));
接收返回信息: 通过接收返回信息来监测变频器的状态,包括输出频率、输出电流、运转命令、变频器状态以及异常代码等。
为提高程序效率,通常接收数据的操作都在oncomm事件中进行的,主要代码:
…………
variant input1; //定义variant类型变量
char rxdata[2048]; //定义存放二进制数据的数组
long len1,k;
colesafearray safearray1; //定义colesafearray类的实例
cstring strdis;
switch(mycomm.getcommevent())
{ case 2:
input1=mycomm.getinput(); //收到 rthreshold 个字符
safearray1=input1; //将varaiant变量赋值给colesafearray类的实例
len1=safearray1.getonedimsize(); //使用colesafearray类的成员函数获取数据长度
for(k=0;k safearray1.getelement(&k,rxdata+k);
for(k=0;k { strdis+=rxdata[k]; }
………… //处理接收的信息
6、小结
本文介绍了通过vc++ 6.0的mscomm控件,遵照modbus协议中的ascⅱ模式实现了在windows环境下的计算机对变频器的参数传递,运行及频率控制以及实时监控。本人通过对整个控制系统的软硬件设计,实现了变频器的计算机控制,经试验表明系统的频率控制比使用外部avi输入更加精确,并且该系统具有简单、可靠、实用的优点。