許曉君,許建坪
(川東鉆探公司,重慶 400021)
在未來過程控制技術(shù)的發(fā)展中,計算機通訊技術(shù)的應用前景將是十分可觀的。因此PLC與上位機之間的通信顯得尤其的重要,PLC可以多種方式與上位機通信,比如:VC++,VB,組態(tài)軟件,LabVIEW等都能勝任此工作。盡管組態(tài)軟件有著明顯卓越的性能,但是由于它昂貴的費用使得很難找到一種方法適用于所有的通信系統(tǒng)。因此針對中小型規(guī)模的控制系統(tǒng),人們更傾向于使用高級語言來編寫一些簡單、更實用、更經(jīng)濟的通信程序。因此,找到一種高性價比的通信方案,具有積極的工程意義[3]。利用VC++實現(xiàn)PLC與上位機的通信實現(xiàn)簡單,界面更加友好和人性化。
通用PC的工作方式是等待請求,PLC則采用循環(huán)掃描工作方式,兩者的差異在于PC針對的是人,而PLC針對的是設備[4]。
整個工作過程可分為5個階段:自診斷,與編程器、計算機或其他PLC設備等通信,輸入采樣,用戶程序執(zhí)行,輸出刷新.這5個工作階段稱為一個掃描周期,時間為0.2ms(如圖1所示)。
圖1 PLC工作過程示意圖
西門子的S7-300可編程控制器有不同性能級別的多種通信處理器模塊,CP 340,CP 341適合點對點的通信連接。西門子的s7-200小型PLC主要是通過EM-277通信模塊來構(gòu)建網(wǎng)絡,支持Profibus現(xiàn)場總線通信系統(tǒng)[6]。三菱公司的FX2系列小型PLC也配有良好的通信接口和支持多種通信模式,下面重要介紹三菱公司的FX2系列的PLC與計算機的通訊。
FX-232AW接口模塊用于FX2系列PLC與計算機的通信。但FX2系列PLC的編程接口采用RS422標準,而計算機的串口采用RS232標準,RS232與RS422標準在信號的傳送、邏輯電平方面均不相同。因此,作為實現(xiàn)PLC計算機通信的接口電路,必須將RS422標準轉(zhuǎn)換成RS232標準[5]。同時在實現(xiàn)上述轉(zhuǎn)換中采用光電耦合技術(shù)。PLC與計算機的硬件連接如圖2所示。
將計算機的RS232的4號和5號引腳(即RS,CS)短接,這樣對計算機發(fā)送數(shù)據(jù)來說,PLC總是處于就緒狀態(tài)。也就是說,計算機在任何時候都可以將數(shù)據(jù)送到PLC內(nèi)。又由于RS232接口的20腳和6腳交叉相連接。因此,這樣對計算機接收數(shù)據(jù)來說,必須等待至PLC處于準備就緒狀態(tài)。由此組成了PLC與計算機間的通訊硬件連接。
圖2 FX-232AW與PLC和計算機的接線圖
FX2系列PLC與計算機之間的通信采用RS232標準,其傳輸速率固定為9 600 bit/s,奇偶校驗位采用偶校驗,數(shù)據(jù)以幀為單位發(fā)送和接收。FX2系列與計算機之間的通信是以主機發(fā)出的初始命令,PLC對其作出響應的方式進行通信。數(shù)據(jù)的格式如圖3-2(1)所示,奇偶校驗位采用偶校驗。如圖3(2)為字符STX(021-1)的書定格式。七段數(shù)據(jù)位為ASCII碼。
圖3 數(shù)據(jù)格式的規(guī)定
上位機可以實現(xiàn)對PLC的RAM區(qū)數(shù)據(jù)進行讀、寫、強制置位或復位等操作,并通過請求信號ENQ、響應信號ACK和NAK,來協(xié)調(diào)與PLC的通信應答[7]。
本程序采用Microsoft Communications Control(MSComm)控件,采用事件驅(qū)動的方式實現(xiàn)PLC與上位機的串口通信。如果應用程序需要訪問多個串行端口,必須使用多個MSComm控件[8]。本程序主要部分包括:MSComm控件初始化程序,數(shù)據(jù)的發(fā)送程序,數(shù)據(jù)的FCS校驗程序,數(shù)據(jù)接收程序。下面對這些程序?qū)崿F(xiàn)做簡單的說明。
(1)MSComm控件初始化
這部分程序放在主對話框的OnInitDialog()函數(shù)中,主要程序如下:
if(m_CommCtrl.GetPortOpen())
m_CommCtrl.SetPortOpen(FALSE);
m_CommCtrl.SetCommPort(1);
if(!m_CommCtrl.GetPortOpen())
m_CommCtrl.SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("串口打開失敗");
m_CommCtrl.SetSettings("9600,e,7,2");//波特率 9600,校驗,7位數(shù)據(jù)位,兩個停止位
m_CommCtrl.SetRThreshold(1);//當串口接收緩沖區(qū)中有多于或者等于1個字符時觸發(fā)OnComm事件接收數(shù)據(jù)
//清除緩沖區(qū)數(shù)據(jù)
m_CommCtrl.SetInputLen(0);
m_CommCtrl.GetInput();
(2)數(shù)據(jù)發(fā)送程序
數(shù)據(jù)發(fā)送由點擊主對話框中的相應按鈕觸發(fā),實現(xiàn)函數(shù)如下:
void CPLC_TestDlg::OnSend()
{
CString fcs;
char enter_flag = 13;
char xing_flag = 42;
fcs = FCS(m_sendstr);
UpdateData(TRUE);
m_sendstr += fcs + xing_flag + enter_flag;
m_CommCtrl.SetOutput(COleVariant(m_sendstr));//數(shù)據(jù)發(fā)送
}
(3)數(shù)據(jù)的FCS程序
校驗碼(FCS)是通過異或來實現(xiàn)的,實現(xiàn)函數(shù)如下:
CString CPLC_TestDlg::FCS(CString m_str)
{
UINT mid_data = 0, zuo = 0;
int icount = m_str.GetLength();
for(int i=0; i<icount; i++)
mid_data ^= m_str.GetAt(i);
m_str.Format("%02X",mid_data);
return m_str;
}
(4)數(shù)據(jù)接收程序
添加MCComm控件的消息處理函數(shù)OnComm(),當數(shù)據(jù)緩存區(qū)字符消息事件,就會執(zhí)行該函數(shù),函數(shù)實現(xiàn)如下:
void CPLC_TestDlg::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];
CString strtemp;
if(bReceive)
{
if(m_CommCtrl.GetCommEvent() == 2)
{
variant_inp = m_CommCtrl.GetInput();
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for(k=0; k<len; ++k)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0; k<len; ++k)
{
BYTE bt = *(char*)(rxdata+k);
strtemp.Format("%c", bt);
m_recievestr += strtemp;
} } }
UpdateData(FALSE);}
PLC在分布式系統(tǒng)中得到了越來越廣泛的應用.在這種控制方式中,PLC與上位機的通信是系統(tǒng)設計中的一個重要組成部分。大型PLC可以多種方式與上位機通信,本文利用VC++6.0中的MSComm控件開發(fā)了簡單PLC與上位機進行通信的用戶界面,可長期運行良好,其中一個界面如圖4所示。
圖4 通信用戶界面
[1]代保華.PLC與計算機的通信[J].交通與計算機,1998,16(4).
[2]陳齊忠.PLC及其與計算機的通訊[J].石油化工自動化,2003(06): 6-41.
[3]Gao Qinhe.PLC application of technology and design examples[J].Post & Telecom Press, Beijing, July 2004.
[4]廖常初.FX系列PLC編程及應用[M].北京:機械工業(yè)出版社,2005.
[5]王兆義.可編程控制器教程[M].北京:機械工業(yè)出版社,1993.
[6]范逸之.Visual Basic與RS-232串行通信控制最新版[M].北京:中國青年出版社,2002.
[7]許 毅.基于PC與S7-200實現(xiàn)自由通信協(xié)議的研究[J].武漢理工大學學報,2002(4):512-515.
[8]Nelson M.串口通訊開發(fā)指南[M].北京:中國水利水電出版社, 1999:20-45.