1、 前言
在工業(yè)控制領(lǐng)域中,經(jīng)常要用變頻器去控制交流電機(jī)的轉(zhuǎn)速、轉(zhuǎn)向等,盡管變頻器自身帶有控制面,具有簡(jiǎn)單、有效的特點(diǎn),但由于現(xiàn)場(chǎng)操作不夠方便,直觀性差以及僅能實(shí)現(xiàn)單機(jī)控制等缺點(diǎn),針對(duì)這些缺點(diǎn),現(xiàn)在的變頻器都帶有rs485通信接口,使用戶能方便靈活地選擇變頻器的強(qiáng)大功能,在windows下開發(fā)工控軟件,可利用windows的豐富資源,方便地生成各種采單及美觀大方的圖形界面。
mobus協(xié)議是應(yīng)用于電子控制器上的一種通用語言,通過此協(xié)議控制器之間可以相互通信,而visual c++ 6.0的activex控件————mscomm通信控制能夠滿足windows環(huán)境下開發(fā)微機(jī)的低層資源。本文介紹的方案使用mobus協(xié)議的ascⅱ傳輸模式,通過visual c++ 6.0編程實(shí)現(xiàn)windows環(huán)境下,臺(tái)達(dá)vfd-s變頻器的計(jì)算機(jī)控制系統(tǒng)
2、 系統(tǒng)硬件設(shè)計(jì)
現(xiàn)在一般的pc機(jī)都有rs232串口,但少有rs485口,而實(shí)現(xiàn)與變頻器進(jìn)行長(zhǎng)距離且抗噪音干擾的通信,一般多采用一塊rs232/485轉(zhuǎn)換器,總體的系統(tǒng)方框圖如圖1
目前,rs232/485轉(zhuǎn)換器有無源和有源兩種,如果通信距離較近,采用無源轉(zhuǎn)換即可。可以購(gòu)買也可以自己設(shè)計(jì)。
3、mobus協(xié)議下ascⅱ模式的通信過程及臺(tái)達(dá)vfd-s型變頻器的通信要求
3.1mobus協(xié)議規(guī)定的通信過程
mobus協(xié)議是一種可靠而有效的工業(yè)控制系統(tǒng)通信協(xié)議,得到了眾多硬件廠商的支持,并廣泛應(yīng)用。mobus協(xié)議的數(shù)據(jù)通訊通過主機(jī)與從機(jī)之間查詢/回應(yīng)的方式實(shí)現(xiàn),查詢消息中的功能代碼告知從設(shè)備要執(zhí)行何種功能,數(shù)據(jù)段包含了從設(shè)備要執(zhí)行的功能的附加消息。從設(shè)備產(chǎn)生回應(yīng)消息,回應(yīng)消息中的功能代碼是查詢消息中功能代碼的回應(yīng),查詢消息、回應(yīng)消息中都有用于判斷傳輸是否正確的錯(cuò)誤檢測(cè)域。
3.2 ascⅱ模式的通信數(shù)據(jù)格式
mobus協(xié)議系統(tǒng)中有兩種有效的傳輸模式:ascⅱ(美國(guó)標(biāo)準(zhǔn)信息交換碼)模式和rtu(遠(yuǎn)程終端裝置)模式,ascⅱ模式通信時(shí),在消息中的每個(gè)8-bit數(shù)據(jù)由兩個(gè)ascⅱ字元所組成。例如,一個(gè)1-byte資料64h(十六進(jìn)制表示法),以ascⅱ“64”表示,包含了‘6’(36h)及‘4’(34h)。
ascⅱ模式:
ascⅱ模式采用lrc(longitudinal redundancy check)偵誤值。lrc偵誤值是將adr1至最后一個(gè)資料內(nèi)容加總,得到之結(jié)果以256為單位,超出部分去除(例如得到結(jié)果為1f2h時(shí)則只取f2h),然后計(jì)算二次反補(bǔ)后得到的結(jié)果即為lrc偵誤值。
3.3臺(tái)達(dá)vfd-s型變頻器的通信要求
vfd-s系列交流馬達(dá)驅(qū)動(dòng)器是內(nèi)建rs485串聯(lián)通訊介面,通訊埠(rj-11)位于控制回路端子,端子定義如下:
2:gnd 3:sg- 4:sg+ 5:+5v
2、5pin為參數(shù)設(shè)定器操作盤之電源,做rs485通信時(shí),請(qǐng)勿使用!
使用rs485串聯(lián)通訊介面時(shí),每臺(tái)vfd-s型必須預(yù)先在(9-00)指定通訊地址,電腦便根據(jù)其個(gè)別地址實(shí)施控制。
4、mscomm控件介紹
mscomm控件是微軟公司開發(fā)的專門用于串行通信的控件,它是高級(jí)語言編寫的串行通信程序和pc串口之間的橋梁,vc++ 6.0中提供了mscomm控件,用戶可以在自己的應(yīng)用程序嵌入mscomm控件,利用它可以方便的進(jìn)行計(jì)算機(jī)串口的通信管理。
使用mscomm控件時(shí),其中一個(gè)難點(diǎn)是對(duì)輸入緩沖區(qū)或輸出緩沖區(qū)的數(shù)據(jù)進(jìn)行處理,因?yàn)橄蜉敵鼍彌_區(qū)寫入的數(shù)據(jù)及從輸入緩沖區(qū)讀出的數(shù)據(jù)都是variant類型的數(shù)據(jù),而程序中常用的通信數(shù)據(jù)既可能是文本型的字符串,又可能是二進(jìn)制的數(shù)值,因此必須處理好字符串與variant類型數(shù)據(jù)間的轉(zhuǎn)換及二進(jìn)制數(shù)據(jù)與variant類型數(shù)據(jù)的轉(zhuǎn)換。
以下代碼簡(jiǎn)單介紹如何完成使用mscomm控件時(shí)如何接收和發(fā)送字符串或二進(jìn)制數(shù)值:
ⅰ、收字符串
variant input1; //定義一個(gè)variant結(jié)構(gòu)的變量
char *str;
int counts;
counts=mycomm.getinbuffercount(); //獲取接收緩沖區(qū)中的字符數(shù)
if(counts>0)
{ input1=myco
mm.getinput(); //將接收緩沖區(qū)內(nèi)容讀至input1中
str=(char*)(unsigned char*)input1.parray->pvdata;//將input1變量的數(shù)據(jù)指針賦值給字符指針
}
……
ⅱ、發(fā)送字符串
cstring senddata1;
senddata1=”atz”;
mycomm.setoutput(colevariant (senddata1));
ⅲ、接收二進(jìn)制數(shù)據(jù)
variant input1; //定義variant類型變量
byte rxdata[2048],aa1; //定義存放二進(jìn)制數(shù)據(jù)的數(shù)組
long len1,k;
colesafearray safearray1; //定義colesafearray類的實(shí)例
input1=mycomm.getinput();
safearray1=input1; //將variant變量賦值colesafearray類的實(shí)例
len1=safearray1.getonedimsize(); //使用colesafearray類的成員函數(shù)獲取數(shù)據(jù)長(zhǎng)度
for(k=0;k safearray1.getelement(&k,rxdata+k); //使用colesafearray類的成員函數(shù)將數(shù)據(jù)寫入數(shù)組
ⅳ、發(fā)送二進(jìn)制數(shù)據(jù)
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機(jī)對(duì)vfd-s型臺(tái)達(dá)變頻器的串行通信控制程序:
⑴端口設(shè)置界面(如圖3)
通過設(shè)置端口參數(shù)使控制程序跟變頻器的(9-00 9-01 9-04)參數(shù)設(shè)定一致,從而能夠保證正常通信,同時(shí)設(shè)置變頻器的(2-00 2-01)參數(shù),使得變頻器的控制由rs485通訊界面輸出。
⑵主界面(如圖4)
主界面用來發(fā)送控制信息給變頻器來控制電機(jī)的起止、反轉(zhuǎn)、寸動(dòng)和頻率等。
⑶運(yùn)行控制編程
發(fā)送控制信號(hào): 主要代碼(以正轉(zhuǎn)運(yùn)行為例)
if(nid==idc_radio1)
{ str0=":010620000012" ;
b="0x01"+0x06+0x20+0x00+0x00+0x12;
if(b>0xff)
b="b"&0x0ff;
b="b"︿c; //求校驗(yàn)
b="b"+1;
str1.format("%02x",b);
}
str3=str0+str1+"\r\n";
mycomm.setoutput(colevariant(str3));
接收返回信息: 通過接收返回信息來監(jiān)測(cè)變頻器的狀態(tài),包括輸出頻率、輸出電流、運(yùn)轉(zhuǎn)命令、變頻器狀態(tài)以及異常代碼等。
為提高程序效率,通常接收數(shù)據(jù)的操作都在oncomm事件中進(jìn)行的,主要代碼:
…………
variant input1; //定義variant類型變量
char
rxdata[2048]; //定義存放二進(jìn)制數(shù)據(jù)的數(shù)組
long len1,k;
colesafearray safearray1; //定義colesafearray類的實(shí)例
cstring strdis;
switch(mycomm.getcommevent())
{ case 2:
input1=mycomm.getinput(); //收到 rthreshold 個(gè)字符
safearray1=input1; //將varaiant變量賦值給colesafearray類的實(shí)例
len1=safearray1.getonedimsize(); //使用colesafearray類的成員函數(shù)獲取數(shù)據(jù)長(zhǎng)度
for(k=0;k safearray1.getelement(&k,rxdata+k);#p#分頁(yè)標(biāo)題#e#
for(k=0;k { strdis+=rxdata[k]; }
………… //處理接收的信息
6、小結(jié)
本文介紹了通過vc++ 6.0的mscomm控件,遵照mobus協(xié)議中的ascⅱ模式實(shí)現(xiàn)了在windows環(huán)境下的計(jì)算機(jī)對(duì)變頻器的參數(shù)傳遞,運(yùn)行及頻率控制以及實(shí)時(shí)監(jiān)控。本人通過對(duì)整個(gè)控制系統(tǒng)的軟硬件設(shè)計(jì),實(shí)現(xiàn)了變頻器的計(jì)算機(jī)控制,經(jīng)試驗(yàn)表明系統(tǒng)的頻率控制比使用外部avi輸入更加精確,并且該系統(tǒng)具有簡(jiǎn)單、可靠、實(shí)用的優(yōu)點(diǎn)。
轉(zhuǎn)載請(qǐng)注明出處。