基于MoBus协议的变频器VC
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于 MoBus 协议的变频器 VC++控制系统 控制系统
2011-9-26 20:35:00 来源:
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
目前,rs232/485 转换器有无源和有源两种,如果通信距离较近,采用无源转换即可。
可以购买也可以自己设计。
3、mobus 协议下 ascⅱ模式的通信过程及台达 vfd-s 型变频器的通信要求 3.1mobus 协议规定的通信过程 mobus 协议是一种可靠而有效的工业控制系统通信协议,得到了众多硬件厂商的支 持,并广泛应用。
mobus 协议的数据通讯通过主机与从机之间查询/回应的方式实现, 查询消息中的功能代码告知从设备要执行何种功能, 数据段包含了从设备要执行的功 能的附加消息。
从设备产生回应消息,回应消息中的功能代码是查询消息中功能代码 的回应,查询消息、回应消息中都有用于判断传输是否正确的错误检测域。
3.2 ascⅱ模式的通信数据格式
mobus 协议系统中有两种有效的传输模式:ascⅱ(美国标准信息交换码)模式和 rtu (远程终端装置)模式,ascⅱ模式通信时,在消息中的每个 8-bit 数据由两个 ascⅱ字 元所组成。
例如,一个 1-byte 资料 64h(十六进制表示法),以 ascⅱ“64”表示,包 含了‘6’(36h)及‘4’(34h)。
ascⅱ模式:
ascⅱ模式采用 lrc(longitudinal redundancy check)侦误值。
lrc 侦误值是将 adr1 至最 后一个资料内容加总,得到之结果以 256 为单位,超出部分去除(例如得到结果为 1f2h 时则只取 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=myco mm.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=":010*********" ; 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 控件, 遵照 mobus 协议中的 ascⅱ模式实现了在 windows 环境下的计算机对变频器的参数传递,运行及频率控制以及实时监控。
本人 通过对整个控制系统的软硬件设计,实现了变频器的计算机控制,经试验表明系统的 频率控制比使用外部 avi 输入更加精确,并且该系统具有简单、可靠、实用的优点。
。