引言 計算機串行通信是計算機與控制設備(如變頻器)進(jìn)行數據傳送的一種通信方式,也是實(shí)現工業(yè)自動(dòng)控制經(jīng)常用到的通信模式。每一種通信方式都嚴格約定了與其對應的通信協(xié)議。要確保計算機與變頻器之間能正常通信,就必須遵照變頻器通信協(xié)議編寫(xiě)通信程序。本文就帶有rs-485通信接口的日普變頻器作為研究對象,設計了變頻器網(wǎng)絡(luò )監控的方案,實(shí)現了對變頻器各項參數的在線(xiàn)監視和控制。以下就圍繞如何在c++builder編程環(huán)境下,利用api函數編寫(xiě)計算機與日普變頻器(rp3200)之間的串行通信程序進(jìn)行闡述。 串行通信 串行通信在工業(yè)系統控制的范疇中一直占據著(zhù)極其重要的地位,串行端口(rs-232)是計算機上的標準配置,常用于連接調制解調器來(lái)傳輸數據,在計算機的硬件設備管理器中可以看到,定義為com1、com2等。常用的串行通信方式有兩種,分別是rs-232和rs-485,本文以rs-485方式為例進(jìn)行介紹。 使用c++builder api函數編寫(xiě)通信程序 c++builder本身不提供單獨的串行通信組件,這不是說(shuō)它不能使用這項功能,而是必須使用一些windowsapi函數來(lái)達到這個(gè)目的。windowsapi是由操作系統提供的函數,這些函數可以為程序設計人員提供相當多的執行功能,就連操作系統本身也是由這些api函數所組成,由于已經(jīng)將win32api均聲明進(jìn)去了,因此在中使用api時(shí)只要直接使用即可。使用時(shí)必須以api函數的定義使用,才可以得到正確的結果,尤其參數的定義更是重要,使用時(shí)必須注意和定義相符,否則執行結果將會(huì )出錯,以下就先說(shuō)明這些必備的函數。 c++builder中與串行通信相關(guān)的api函數 c++builder本身并不提供單獨的串行通信組件,而是使用一些windowsapi的函數來(lái)達到此目的。這些函數是由操作系統所提供,可以為程序設計人員提供相當多的執行功能。api中與串行通信相關(guān)的函數約有20個(gè),以下對經(jīng)常使用的函數作以討論。 打開(kāi)串行端口 hcomm=createfile(comno,generic_read|generic_write, 0,null,open_existing,1,0) 函數參數定義如下: hcomm:createfile()函數的返回值,程序使用此返回值進(jìn)行相關(guān)的串行端口操作。 comno:定義串行端口號,為com1、com2等。 generic_read|generic_write:對串行端口的讀/寫(xiě)操作。 0:是否共享串行端口,通常不會(huì )將串行端口與其它程序共享,因此設為0,否則為1。 null:函數的返回值hcomm是否可被子程序繼承,此處設為不可繼承。 open_existing:打開(kāi)端口的方式,串行端口是一種設備,必須指定為open_existing方式。 1:使用同步或異步方式傳輸數據,變頻器為異步方式,因此設為1。 0:由于使用串行端口編程,設為0。 得到串行端口狀態(tài) getcommstate(hcomm,&dcb) 函數參數定義如下: hcomm:createfile()函數的返回值。 dcb:串行端口控制塊地址,負責對串行端口參數進(jìn)行設置,具體參數如下: dcb.baudrate:設置串行端口的波特率,有19200kb/s、9600kb/s、4800kb/s幾種,一般為:9600kb/s。 dcb.bytesize:設置串行端口的數據位數,有5、6、7、8幾種,變頻器數據位數為8。 dcb.parity:設置串行端口的校驗位檢查,有none、even、odd幾種,設為none。 dcb.stopbits:設置串行端口的停止位數,有1、1.5、2幾種,變頻器的停止位數為1。 設置串行端口狀態(tài) setcommstate (hcomm,&dcb) 函數參數定義與getcommstate()函數相同。 向串行端口寫(xiě)數據 writefile(hcomm,senddata,bs,&lrc,null) 函數參數定義如下: hcomm:createfile()函數的返回值。 senddata:寫(xiě)數據的地址。 bs:寫(xiě)入數據的字節數。 lrc:被寫(xiě)入的數據地址。 null:寫(xiě)入數據的同步檢查,串行端口采用同步通信時(shí)可以設為null。 清除串行端口的錯誤或將串行端口當前的數據狀態(tài)送至輸入緩沖區 clearcommerror(hcomm,&dwerror,&cs) 函數參數定義如下: hcomm:createfile()函數的返回值。 dwerror:返回錯誤信息代碼。 cs:指向串行端口狀態(tài)的結構變量。 從串行端口的輸入緩沖區讀出數據 readfile(hcomm,inbuff,cs.cbinque,&nbytesread,null);函數參數定義如下: hcomm:createfile()函數的返回值。 inbuff:指向用來(lái)存儲數據的地址。 cs.cbinque:讀取數據的字節數。 nbytesread:總的讀取字節數。 null:如果不進(jìn)行后臺工作,串行端口設為null。 關(guān)閉串行端口 closehandle(hcomm) 函數參數定義如下: hcomm:createfile()函數的返回值。 變頻器的監控系統設計 硬件連接框圖 本文設計的監控系統采用平衡發(fā)送和差分接收方式實(shí)現通信。由于傳輸線(xiàn)通常使用雙絞線(xiàn),又是差分傳輸,所以有極強的抗共模干擾的能力。rs-485最大的通信距離可達1219m,rs-485最大傳輸速率為10mb/s。rs-485采用半雙工工作方式,支持多點(diǎn)數據通信。總線(xiàn)網(wǎng)絡(luò )拓撲一般采用終端匹配的總線(xiàn)型結構。 rs-485總線(xiàn)一般最大支持32個(gè)節點(diǎn)。 本設計采用帶有rs-485接口的日普變頻器(rp3200)控制電機運轉,上位計算機和變頻器進(jìn)行通訊,計算機通過(guò)讀寫(xiě)變頻器的參數來(lái)監控變頻器的運行狀態(tài)。上位機為主控計算機,下位機為被控變頻器(最多為31個(gè))。主控和被控之間的串行控制信號始終是主控啟動(dòng)傳送,被控對此作出響應。某一個(gè)時(shí)刻,主控和一個(gè)被控進(jìn)行信號傳送,所以要預先給每個(gè)被控分配地址號,并由主控指定地址執行發(fā)送。被控接收到主控來(lái)的信號后執行其功能,并返回應答給主控。由于計算機本身支持rs-232串行通信方式,所以需要用rs-232與rs-485轉換器將計算機與變頻器連接起來(lái)。上位機與變頻器控制組網(wǎng)結構如圖1所示。 ![]() 此變頻器控制命令和方式有三種:數字面板控制、端子控制和rs-485通訊控制,變頻器的默認出廠(chǎng)設置為變頻器控制面板控制,這不符合我們與pc 機通訊的要求,為了能使變頻器與 pc機之間通訊,我們對變頻器作如下設置: 操作方式選擇 在數字面板中選擇參數設定,將運行方式按表1設置為rs-485運行方式。 ![]() 通信參數設定 通信地址設定:定義設備地址 1 – 31,在線(xiàn)不允許兩個(gè)設備占用一個(gè)地址 傳送中斷檢測時(shí)間:設定 范圍為:0-60sec 通信規格設定: 接口:rs-485 同步方式:異步 傳輸參數: 波特率:可從 1200,2400,4800,9600,19200 等中選擇 停止位:固定為 1位 變頻器通信命令介紹 通信數字元格式 數字元格式如圖2所示。 ![]() 糾錯方法 在信息后加checksum, checksum等于所有字節(hex)之和的最后一字節,轉換為ascii碼。 數據包格式 類(lèi)似modbus ascii格式,格式如下。 header akp1p0 d3d2d1d0 s delimiter 格式解析: 【header】:3ah 【delimiter】:0dh,0ah a、k、p1p0、d3d2、d1d0、s分別為單字節十六進(jìn)制數,轉換為ascii碼。 【a】:從機(變頻器)地址。變頻器地址范圍為(1-31),a必須存在。 注:地址a=00h時(shí)對所有從機有效,且所有從機不回送響應信息。故a=00h只能發(fā)送運行命令操作。 【k】:數據包功能代碼。 【p1p0】:參數序號。參數標號,兩字節十六進(jìn)制數。 【d3d2d1d0】:參數值:去掉小數點(diǎn)的參數值,共四字節的十六進(jìn)制數,先發(fā)高位,后發(fā)低位。 【s】:和校驗字。s是上面所有字節十六進(jìn)制之和(a+k+p1p0+d3+d2+d1+d0)取最后一字節(bit7-bit0)值,轉換為ascii碼。 其中k、p、d3d2d1d0參數定義如表3所示。 ![]() 通信主程序的設計架構 設計通信主程序的主要功能是:實(shí)現計算機對變頻器的運行控制和狀態(tài)監視,即構成一個(gè)閉環(huán)監控系統。程序設計架構如圖3示。 ![]() 1#變頻器在運行狀態(tài)下改變它的“設定頻率”為35.00hz 方法如下: 35.00去掉小數為3500d=0dach a=1=01h (變頻器地址為“01h”) k=04h (運行參數設定為“04h”) p1p0=0001h (運行時(shí)設定頻率為“0001h”) d3=00h (數據高字節為“00h”) d2=00h (數據次高字節為“00h”) d1=0dh (數據次字節為“0dh”) d0=ach (數據低字節為“ach”) s=c9h (和校驗字節為“c9h”) 。╯=0bh+04h+00h+01h+00h+00h+00h+0dh+ach=c9h) 主機先后依次發(fā)送字節如下的數據包ascii: 3ah,30h,42h,30h,34h,30h,30h,30h,31h,30h,30h,30h,30h,30h,44h,41h,43h,43h,39h,0dh,0ah 變頻器回復主機相同數據。 部分通信代碼如下: 打開(kāi)通訊端口代碼 char *comno; dcb dcb; string temp; temp=“com”+inttostr(rdcom-》itemindex+1); comno=temp.c_str() ; hcomm=createfile(comno,generic_ read|generic_write,0,null,open_existing,0,0); if(hcomm==invalid_handle_value) { statusbar1-》simpletext=“打開(kāi)通信端口錯誤!”; return; } else statusbar1-》simpletext=“端口已打開(kāi)!”; sleep(100); getcommstate(hcomm,&dcb); dcb.baudrate=cbr_9600; dcb.bytesize =8; dcb.parity =noparity; dcb.stopbits =onestopbit; setcommstate(hcomm,&dcb); if(!setcommstate(hcomm,&dcb)) { statusbar1-》simpletext=“通信端口設置錯誤!”; closehandle(hcomm); return; } 發(fā)送數據代碼 int i=0; unsigned char sends[21]; unsigned long lrc,bs; sends[0]=3ah; //header sends[1]=30h; //a sends[2]=31h; sends[3]=30h;//k sends[4]=34h; sends[5]=30h; //p1 sends[6]=30h; sends[7]=30h; //p0 sends[8]=31h; sends[9]=30h; //d3 sends[10]=30h; sends[11]=30h;//d2 sends[12]=30h; sends[13]=30h; //d1 sends[14]=44h; sends[15]=41h; //d0 sends[16]=43h; sends[17]=43h; //s sends[18]=39h; sends[19]=0dh; //delimiter sends[20]=0ah; for(i=0;i++;i《21) { if(hcomm==0) return; writefile(hcomm,sends,1,&lrc,null); } 接收數據代碼 int ln; unsigned long lrc,bs; char inbuff[1024]; dword nbytesread,dwevent,dwerror; comstat cs; if(hcomm==0) { mreceive-》text=“讀取過(guò)程有問(wèn)題,已跳出!”; return; } if(hcomm==invalid_handle_value) { mreceive-》text=“讀取過(guò)程有問(wèn)題,已跳出!”; return; } clearcommerror(hcomm,&dwerror,&cs); if(cs.cbinque) { readfile(hcomm,inbuff,cs.cbinque,&nbytesread,null); inbuff[cs.cbinque]=`\0`; mreceive-》text=inbuff; interceptrece(mreceive-》text); } else mreceive-》text=“未讀取到數據!”; 以上代碼在winxp sp2操作系統, c++builder6 編程環(huán)境下調試編譯通過(guò)。 結語(yǔ) 通過(guò)對帶有rs-485通信接口的日普系列變頻器的研究,設計了可行的變頻器網(wǎng)絡(luò )監控系統方案,在c++builder編程環(huán)境下,利用api函數,實(shí)現了變頻器各項參數的在線(xiàn)監測與控制。提高了變頻器控制的自動(dòng)化水平。 |