现在的位置: 首页 > 综合 > 正文

基于ModBus协议的变频器VC++控制系统

2013年04月01日 ⁄ 综合 ⁄ 共 3267字 ⁄ 字号 评论关闭

基于ModBus协议的变频器VC++控制系统

  1 前言

        在工业控制领域中,经常要用变频器去控制交流电机的转速、转向等,尽管变频器自身带有控制面,具有简单、有效的特点,但由于现场操作不够方便,直观性差以及仅能实现单机控制等缺点,针对这些缺点,现在的变频器都带有rs485通信接口,使用户能方便灵活地选择变频器的强大功能,在windows下开发工控软件,可利用windows的丰富资源,方便地生成各种采单及美观大方的图形界面。

       mobus协议是应用于电子控制器上的一种通用语言,通过此协议控制器之间可以相互通信,而visual c++ 6.0activex控件----mscomm通信控制能够满足windows环境下开发微机的低层资源。本文介绍的方案使用mobus协议的asc传输模式,通过visual c++ 6.0编程实现windows环境下,台达vfd-s变频器的计算机控制系统

2 系统硬件设计

       现在一般的pc机都有rs232串口,但少有rs485口,而实现与变频器进行长距离且抗噪音干扰的通信,一般多采用一块rs232/485转换器,总体的系统方框图如图1
1

       目前,rs232/485转换器有无源和有源两种,如果通信距离较近,采用无源转换即可。可以购买也可以自己设计。

3modbus协议下asc模式的通信过程及台达vfd-s型变频器的通信要求

    31mobus协议规定的通信过程

       modbus协议是一种可靠而有效的工业控制系统通信协议,得到了众多硬件厂商的支持,并广泛应用。modbus协议的数据通讯通过主机与从机之间查询/回应的方式实现,查询消息中的功能代码告知从设备要执行何种功能,数据段包含了从设备要执行的功能的附加消息。从设备产生回应消息,回应消息中的功能代码是查询消息中功能代码的回应,查询消息、回应消息中都有用于判断传输是否正确的错误检测域。

    32 asc模式的通信数据格式

       modbus协议系统中有两种有效的传输模式:asc(美国标准信息交换码)模式和rtu(远程终端装置)模式,asc模式通信时,在消息中的每个8-bit数据由两个asc字元所组成。例如,一个1-byte资料64h(十六进制表示法),以asc64”表示,包含了6’36h)及4’34h)。

       asc模式:

 

        asc模式采用lrclongitudinal redundancy check误值。lrc侦误值是将adr1至最后一个资料内容加总,得到之结果以256为单位,超出部分去除(例如得到结果为1f2h时则只取f2h),然后计算二次反补后得到的结果即为lrc误值。

    33台达vfd-s型变频器的通信要求

       vfd-s系列交流马达驱动器是内建rs485串联通讯介面,通讯埠(rj-11)位于控制回路端子,端子定义如下:

2gnd   3sg  4sg  5:+5v

25pin为参数设定器操作盘之电源,做rs485通信时,请勿使用!
   
使用rs485串联通讯介面时,每台vfd-s型必须预先在(9-00)指定通讯地址,电脑便根据其个别地址实施控制。
4mscomm控件介绍

      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

抱歉!评论已关闭.