串行通訊的PLC遠程控制
可編程控制器PLC的應用絕大部分都是通過編寫梯形圖的方式實現程序控制的,但對于智能低壓開關系統來講,其分、斷的控制往往要求由主控操作室遠程控制來完成。按傳統的方法,主控室要對某一個開關柜進行操作,須先發一個控制命令,PLC接收到該控制命令后,再由PLC程序執行該命令,該段程序必須用梯形圖或邏輯指令編程,當開關柜數目巨大或要求多路設備同時控制時,PLC的程序編寫就比較復雜,尤其是采用脈沖型輸出控制而不是用電平保持型控制時更是如此。因為開關柜的分、合控制須兩路繼電器輸出分別控制“分閘”和“合閘”,而不是由單路繼電器保持輸出控制,使繼電器輸出與開關柜分合一致??紤]這些因素,本文采用串行通訊實現PLC的控制,PLC本機無須任何梯形圖或邏輯指令,這樣不僅實現簡單而且方便可靠。
一、低壓監控系統設計
(一)系統設計要求
依據用戶的實際要求,智能低壓開關柜不僅能在當地手動進行分、合,而且具有系統零位、時控和遠方控制的功能,其控制回路的電氣控制圖如圖1所示。圖1中SV 為轉換開關,當1、2通時,為當地時控方式;9、10通時為手動方式;5、6通時為遠程控制。當開關柜工作在遠方控制方式時,當PLC輸出觸點#107- #113閉合時,KM線圈加載得電,KM常開觸點閉合,并形成回路使KM線圈始終得電,此時PLC輸出觸點#107-#113釋放,當PLC輸出觸點 #105-115吸合時,KA線圈得電,KA常閉繼電路斷開,使KM線圈回路失電,KM常開觸點斷開,當KM線圈常開觸點斷開后,PLC#1052115 輸出觸點釋放,開關維持斷開狀態。圖中#901-#903作為PLC的輸入觸點。
(二)設計方案簡述
本系統針對低壓系統的實際要求設計,實現開關柜的遠程控制。主站通過電力專用modem與遠方子站RTU進行雙向通訊,主站發出控制命令,子站接收主站控制命令并轉發到PLC,并將PLC的執行結果及時反饋給主站,控制時間在1~2s完成。
監控系統分為三級:主站、變電站當地子站、PLC和儀表設備。主站借助GPS時鐘精確定時,操作員可將任何時候的停電和啟動設置進主站,由主站自動發出控制命令,該監控系統極適合路燈及景觀燈的控制。
圖1 控制回路的電氣控制原理圖
二、通訊協議及處理方法
(一)主站與子站的通訊協議
主站采用電力系統遠動循環規約與子站進行通信,但遠動循環規約中僅有主站對子站的單點遙控命令,為此主站端必須對CDT規約進行擴展,我們借用遙信報文的格式,將主站端需要控制的低壓開關狀態,用遙信報文下發到子站,為此僅需將下發的遙信報文中的開關狀態內容分析出來,分別放置在yk_road[0]、 yk_road[1]、yk_road[2]、yk_road[3]四個字節中,支持對32路低壓斷路器的控制。報文由同步字、控制字和信息字三部分組成,其格式如下:
同步字為6個字節:0dbh,09h,0dbh,09h,0dbh,09h;控制字為6個字節:控制字節、幀類別、幀長度、源站址、目的站址、CRC校驗;信息字為幀長度×6個字節,本文因為控制點數在32個以內,所以信息字僅為6個字節:功能碼、1到8組開關柜控制狀態、9到16組開關柜控制狀態、17到24組開關柜控制狀態、備用開關柜控制狀態、CRC校驗。整個控制報文18個字節,這樣既符合CDT規約的通信格式,又不增加RTU的通信報文分析負擔。
在該規約處理中,關鍵為實時判斷出同步字頭,然后根據幀類別區別遙控選擇命令、遙控執行命令、遙控轍消命令、系統對時和成組開關控制命令,分析出遙控數據存放在yk_road[0]~yk_road[3]中,并置相應標志,再由遠動測量裝置將命令進行分析轉換發給
PLC。實現該規約的分析方法voidinterruptCntReach1()函數如下:
voidinterruptCntReach1()/*串口1每收到一個字節中 斷一次的中斷處理程序*/
{ cntreach[1]++; /*每接收一個字節,中斷 接收計數器加1*/
stat=sio_read(p[1],data,1);/*從串口1緩沖區讀入一 個字節數據放到data[0]中*/
if(ok[1]==0){/*如未判斷到同步字節,以下分析同步 字頭*/
switch(tp[1]){
case0:if(data[0]==0xd7)tp[1]++; break;
case1:if(data[0]==0x09)tp[1]++;
else tp[1]=0; break;
case2:if(data[0]==0xd7)tp[1]++;
else tp[1]=0; break;
case3:if(data[0]==0x09)tp[1]++;
else tp[1]=0; break;
case4:if(data[0]==0xd7)tp[1]++;
else tp[1]=0; break;
case5:if(data[0]==0x09)
{ ok[1]=1;cntreach[1]=0; }
else tp[1]=0; break;
default:break; } }
if((ok[1]==1)&&(cntreach[1]、=0))/*已判斷到同步字頭后,以下分析報文內容*/
{Rx_buf[1][cntreach[1]-1]=data[0];
if(cntreach[1]==3)LGn[1]=Rx_buf[1][2];
if(cntreach[1]>=(LGn[1]*6+6))
{step_flag[1]=1;/*置報文同步標志*/
CODE[1]=Rx_buf[1][1]; /*幀類別*/
switch(CODE[1]){
case0x61:…/*遙控選擇命令處理*/
case0xc2:…/*遙控執行命令處理*/
case0xb3:…/*遙控轍消命令處理*/
case0x7a:…/*系統對時,*/
case0xf4:if(Rx_buf[1][6]==0xf0)/*分析出遙控數 據,并置相應標志*/
if(Rx_buf[1][2]==1)
{yk_road[0]=Rx_buf[1][7];
yk_road[1]=Rx_buf[1][8];
yk_road[2]=Rx_buf[1][9];
yk_road[3]=Rx_buf[1][10];
yk.road=1;yx1_state[0]=1;} break;
default:break;
}reset_point(1);/*復位各種標志的函數*/
} }sio_flush(p[1],0); }
(二)子站與松下PLC的通信協議
松下PLC通信協議MEWTOCOL2COM為廠家專門設計的協議,采用ASCII碼的方式傳送,用應答方式實現PC機與松下Fp1PLC之間的通信。由子站端RTU發出/命令信息0,FP1PLC響應,其基本格式如圖2。
其命令代碼Commandcode由2~3個ASCII字符組成,共26種,主要有:RCS為讀一個觸點數據;WCS為寫一個觸點數據;RCP為讀多個觸點數據;WCP為寫多個觸點數據;RS為讀定時器和計數器的設定值;WS為寫定時器和計數器的設定值;RCC為將多個觸點數據以字方式讀入;WCC為將多個觸點數據以字方式寫入;因此,通過對這26種命令組合分析,可以完全構成由遠程對PLC進行控制,而PLC本身無需編寫任何梯形圖。通過分析測試,例如對 PLC下發ASCII數據串“%01#RCCX00000001**\xod”,共19個字節,其中X是輸入數據類型,Y是輸出數據類型,數據串末尾是回車符,必須用\xod代替,其中報文可以不計算BCH校驗碼,用**代替,該報文實現了以字方式讀01號PLC中的輸入從0000到0001數據,共32 路輸入數據。PLC收到該報文后,立即回17個字節的數據串,前6個數據為/%01#RC0,后8個數據為2個字的輸入點數據,每個字數據用4個字節,每個字符可表示4位輸入點的狀態,設計了Read_fp1_input()函數實現報文分析轉換方法。
對PLC的輸出控制用WCC命令實現,其基本數據串格式為“%01#WCCY000000030000000000000000**/xod”,該報文實現了以字方式置01號PLC中的輸出點從0000到0003數據,控制數據內容為16個字節,每個字符可表示4位輸出點的狀態,共64路輸出數據。因為每個低壓開關柜需要“開”、“斷”2 路輸出控制,實際此命令只可控制32路開關。為了系統可靠,低壓開關設計為脈沖控制型,為此必須用通信命令
來實現PLC輸出觸點的同時輸出,延時一段后再對PLC進行求反輸出控制。設計Write_fp1_output()函數實現了具體報文轉換成輸出數據下發給PLC的方法。
Read_fp1_input() /*讀FP1PLC輸入數據的 處理函數*/
{unsignedcharfp1_read[19]=/%01#RCCX00000001* *\x0d0;intn;
memcpy(SendBuffer,fp1_read,19);
receive_ok=0; termintrr=0;count=0;
sio_putb(p[6],SendBuffer,19);
while(count<wait_time)
{if(termintrr)
{if(Test_buf[6][3]==0x24)
{Test_buf[6][6]=Asc_to_Hex(Test_buf[6][6]);
Test_buf[6][7]=Asc_to_Hex(Test_buf[6][7]);
Test_buf[6][8]=Asc_to_Hex(Test_buf[6][8]);
Test_buf[6][9]=Asc_to_Hex(Test_buf[6][9]);
Test_buf[6][10]=Asc_to_Hex(Test_buf[6][10]);
Test_buf[6][11]=Asc_to_Hex(Test_buf[6][11]);
Test_buf[6][12]=Asc_to_Hex(Test_buf[6][12]);
Test_buf[6][13]=Asc_to_Hex(Test_buf[6][13]);
yx_road[0]=((Test_buf[6][6]&0x0f)*16+Test_buf [6][7]);
yx_road[1]=((Test_buf[6][8]&0x0f)*16+Test_buf [6][9]);
yx_road[2]=((Test_buf[6][10]&0x0f)*16+Test_ buf[6][11]);
yx_road[3]=((Test_buf[6][12]&0x0f)*16+Tes buf[6][13]);
step_flag[6]=1; count = wait_time+1;
} } }}
Asc_to_Hex(charx)/*ASCII碼轉換成十六進制數 */
{ if(x<=0x39)x=x&0x0f; else x=x-“A”+ return x;}
Hex_to_Asc(charx,inthigh)/*十六進制數的高、 轉換成ASCII碼*/
{if(high==1)x=((x&0xf0)>>4)&0x0f; else x&0x0f;
if(x>9)x=x+-A。-10; elsex=x+0x30;
return(x);}
Write_fp1_output()/*控制FP1PLC輸出,并合成 沖的處理函數*/
{unsignedcharfp1_write[35]=/%01#WCCY0000 00000000000000**\x0d0;
intn;
memcpy(SendBuffer,fp1_write,35);
receive_ok=0; termintrr=0; count=0;
SendBuffer[16]=Hex_to_Asc(~yk_road[0],1);
SendBuffer[17]=Hex_to_Asc(~yk_road[0],0);
SendBuffer[18]=Hex_to_Asc(~yk_road[1],1);
SendBuffer[19]=Hex_to_Asc(~yk_road[1],0);
SendBuffer[20]=Hex_to_Asc(yk_road[2],0);
SendBuffer[21]=Hex_to_Asc(~yk_road[2],0);
SendBuffer[28]=Hex_to_Asc(yk_road[0],1);
SendBuffer[29]=Hex_to_Asc(yk_road[0],0);
SendBuffer[30]=Hex_to_Asc(yk_road[1],1);
SendBuffer[31]=Hex_to_Asc(yk_road[1],0);
sio_putb(p[6],SendBuffer,35);
while(count<wait_time)
{if(termintrr) count=count+1;}
count=0;
while(count<36){if(count>30)
{memcpy(SendBuffer,fp1_write,35);
receive_ok=0; termintrr=0;
sio_putb(p[6],SendBuffer,35);
count=40;
}}sleep(1);
Read_fp1_input();/*讀PLC得觸點狀態數據*/
yx_duiwei();/*遙信數據對位*/
Send_yx();} /*將遙信數據上送*/
(三)控制的實現
我們為系統操作員在主站端設計了兩種控制方式,第1種為手動遙控:在后臺的圖形界面中,點擊進入相應的變電站,再進入路燈和景觀燈所在的控制界面,界面中每一組路燈對應變電站的一個低壓抽屜柜,操作員用鼠標選擇路燈和景觀燈的“開”、“滅”狀態,再將所有的開滅狀態組成字節數據,用CDT報文下發給變電站的 RTU。RTU收到路燈控制命令后,將報文解析和重組,用MEWTOCOL2COM通信協議將控制數據傳送給PLC。PLC將按照系統操作員在后臺的設置執行控制命令,RTU將控制結果及時反饋給主站端,主站端將這一控制過程作為一條記錄存入數據庫,可以事后查詢。第2種控制方式為時控:操作員用鼠標選擇在××年××月××日××時××分或星期幾時的路燈和景觀燈的/開0、/滅0狀態,將這些數據存入數據庫,當設定時間到達時系統自動發出這些數據,系統可以根據RTU的反饋信息確定控制是否成功,并可決定是否重發。
因為對PLC的控制是在子站RTU完成的,為控制的實時性,我們采用C語言編程實現了對PLC的通信控制,確保PLC中無需編寫任何梯形圖邏輯。由于系統主站與子站之間的通信是基于十六進制數據的CDT規約,而 MEWTOCOL2COM通信協議是基于ASCII碼的數據通信,為此設計了兩個函數用于基于ASCII字符數據的發送和接收。其中發送數據函數 Sio_putb(),其使用格式見Read_fp1_input()程序。另一個數據接收中斷處理處理函數為本設計的關鍵,為方便和可靠,本文設計的中斷觸發信號為“串行口收到回車符(十六進制的0dH)”,確保PLC每應答完一幀完整的報文,RTU才進入中斷處理,并在中斷處理程序中完成報文數據的分析,大大提高了快速性和可靠性。這種方法在基于ASCII字符的通信中極為有效。本文RTU有6個串口,串口1為與主站的全雙工通信通道,串口6為與 PLC通信通道,用sio_term_irq(p[6],TermCome,0x0d);函數指明串口6只有收到回車符(0x0d)才響應中斷 voidinterruptTerm2Come(),其他的為變電站內的微機保護監控裝置、發電機、直流電源屏、變壓器通信通道,本文不做贅述。其中斷函數初始化及中斷處理程序參見文獻。
三、結語
利用串行通信實現對PLC的遠程控制,可以方便在主站后臺端改變對底端設備的控制邏輯和運行方式,PLC中無需編寫任何梯形圖程序,這在設備遠程控制中有重要意義。該項目2004年在廈門海滄大橋多個變電站正式投運,達到了設計要求,實現了全橋低壓設備的遠方控制.
文章版權歸西部工控xbgk所有,未經許可不得轉載。