摘 要:本文分析了組態軟件串口設備通信的原理及開發方法,并提出了一種使用VC++6.0開發組態軟件串口設備通信模塊的具體實現方法。
關鍵字:組態軟件,串口設備通信,VC++6.0
1、前言:
工業控制組態軟件的開發和使用已經有幾十年的歷史,現在很多從事工業控制的公司都在使用甚至開發自己的組態軟件。在開發組態軟件的過程中,組態軟件的通信是一個非常重要的模塊,使用組態軟件設計出顯示畫面以后,要接收現場的采集數據,形成動態畫面,反映工業現場的各種狀態,并能夠對現場設備進行控制,這些都依賴于組態軟件的通信模塊。現場的測控設備大多都采用標準的通信接口,而串行接口是測控設備所采用的最常見的一種通信接口。本文首先分析了開發組態軟件串口設備通信的方法,然后提出了一種使用VC++6.0開發組態軟件串口設備通信模塊的具體實現方法。
2、組態軟件與測控設備的通信原理
組態軟件通過I/O驅動程序從現場測控設備獲得實時數據,對數據進行加工處理后,一方面以圖形方式顯示在計算機屏幕上,來反映現場設備的運行狀況;另一方面按照組態要求和操作人員的指令將控制數據送給I/O設備,對執行機構實施控制或調整控制參數。
一般情況下,I/O驅動程序是與設備相關的,即一種設備的驅動程序只能驅動該類的設備。設備制造商會提供PC與設備間進行數字通信的接口協議和物理接口標準。物理接口標準規定使用何種通信介質、鏈路層的接口標準,如RS232、RS485、以太網等;接口協議規定通信雙方約定的命令及數據響應格式、數據校驗方式等。I/O 驅動程序主要是按照接口協議的規定向設備發送數據請求命令,對返回數據進行拆包,從中分離出所需數據(即組態的數據連接項和設備狀態數據)。多數設備的通信接口協議都有若干條讀寫命令,分別用來讀寫設備上不同類別的數據,而每一條命令又可以讀寫同類別的多條數據,具體能讀寫幾條是由接口協議規定的。使用組態軟件做I/O數據連接的工程技術人員不必了解這些細節,只需按照I/O 驅動程序的說明書組態數據庫變量與設備數據項的對應關系即可。I/O 驅動程序主要以數據包為單位進行數據處理,這樣會大大提高通信效率。通信過程如圖1所示:
[align=center]

圖1、組態軟件通信原理框圖[/align]
3、組態軟件中串口設備通信方法設計
在工業控制領域,常把現場測控設備分成3種類型,一種是可獨立工作、能夠完成特定數據輸入輸出功能的設備,如用于模擬量輸入輸出、數字量輸入輸出的各種板卡;另一種設備是本身不直接處理數據輸入輸出,但起到管理其它設備工作的設備,如串行口設備;第三種設備是本身具有處理數據輸入輸出的功能,但只有和第一種設備一起才構成完整工作系統的設備:如PLC設備、智能儀器儀表等;不同類型的設備的工作方式有所不同,其對應的通信方法的設計也有所不同。而第三種設備是最常用的一種設備,他們的通信方式,主要是對串行口進行操作,因此在這里把他們叫做串口設備,下面結合實例給出用VC++6.0設計組態軟件串口設備通信的方法。
選用VC++來開發,是因為使用VC++開發的軟件運行效率高,程序代碼較短,運行速度快,能夠充分利用32位操作系統多任務多線程的優勢。利用VC++6.0開發串口通信一般有兩種方法,一種是直接使用Windows API函數進行編程,另一種是使用MSCOMM控件來進行串口編程,采用后一種方法在程序實現上相對第一種方法比較簡單,因為MSCOMM控件封裝了大量Windows API函數,使用MSCOMM控件進行編程,用戶只需考慮如何使用MSCOMM控件所提供的屬性和事件,以驅動API函數的接口來完成工作。
在組態軟件中實現串行設備的通信實際上就是開發不同串行設備的驅動程序,它一般分為兩個部分,一是對串行口的設置、初始化、以及讀寫操作,二是根據不同設備的通信協議對從串行口讀寫的數據幀進行處理,取出其中的有用數據。
3.1串口屬性設置對話框設計
新建一個工程,在該工程中插入MSCOMM控件,建立一個對話框,(set_com)加入以下控件:

該對話框用于對串口的屬性進行設置,但是這里并不是對串口進行真正的設置,而只是把一些參數保存到變量當中。在實際的應用中可能會用到其他更多的屬性,但以上屬性是最常用的幾個屬性,為了簡化說明,在本設計中,只對以上一個屬性進行設置,其他屬性都采用默認的屬性設置。MSCOMM控件有兩種通信方式-事件驅動方式和查詢方式,為了簡化說明,在這里也只采用其中的一種通信方式-事件驅動方式。
3.2打開串口及數據處理設計
在這一步驟里應該包括以下功能:
(1) 用戶能夠選擇所要使用的串行設備
(2) 根據3.1中設置的參數,對串口進行設置
(3) 打開串口,對數據進行處理,保存到緩沖區
為了簡化說明,在這里省略功能(1)的設計,假設我們所設計的組態軟件只與一種設
備進行通信(我們采用OMRON PLC,以C200HE PLC為例,通信協議采用上位機鏈接通信)
3.2.1串口屬性設置及打開串口
新建一個支持Activex控件的對話框(test_com),從控件工具欄中把MSCOMM控件拖到該對話框中,并為該控件添加控制變量:m_ctrlComm。在test_com::OnInitDialog()函數中設置串口屬性,程序如下所示:
//把set_com對話框中設置的串口屬性賦值給para
para=btl+”,”+jojy+”,”+sjw+”,”+tzw+”,”;
//打開串口
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(selcom); //選擇串口
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("cannot open serial port");
//設置串口屬性
m_ctrlComm.SetSettings(para); //波特率,校驗,數據位,停止位
m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據
m_ctrlComm.SetRThreshold(1);
//參數1表示每當串口接收緩沖區中有多于或等于1個字符時將引發一個接收數據的OnComm事件
m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度為0
m_ctrlComm.GetInput();//先預讀緩沖區以清除殘留數據
return TRUE;
3.2.2響應串口事件,對數據進行處理
上位機發送數據到PLC的過程實際上就是根據該PLC的通信協議,把命令字符串發送到串行口,上位機接收PLC數據的過程實際上是把接收到的數據根據PLC通信協議里規定的幀格式,把有用數據取出來的過程。
(1)OMRON PLC(C200HX)的通信協議
本文的通信協議采用的是上位機鏈接通信。上位機鏈接通信通過在上位機與PLC之間交換命令和應答實現的。在一次交換中傳輸的命令和應答數據稱為一幀,一個幀最多可包含131個數據字符。
命令幀格式如下:

識別碼和正文取決于傳輸的上位機鏈接命令。當傳送一個組合命令時,還將有第二個識別碼(子識別碼)。FCS(幀檢查順序)碼由上位機計算,并設置在命令幀中,命令幀最多可以有131個字符長,一個等于或大于132字符的命令必須分成若干幀。命令分段,使用回車定界符(CHR$(13)),而不是終止符。終止符必須用在最后幀的末尾。
應答幀格式
識別碼和正文取決于接收到的上位機鏈接命令,結束碼表示命令完成的狀態(即是否有錯誤發生),當應答超過132字符,它必須分成若干幀。在每個幀的末尾將自動設置一個定界符(CHR$(13))代替終止符。終止符必須設置在最后幀的末尾。
(2)響應OnComm事件,對數據進行處理
// 發送事件
void test_com::OnSend ()
{
// 根據(1)中的命令幀格式,寫出需要傳出的命令碼字符串CString m_send
// 將這個字符串發送到串行口
m_ctrlComm.SetOutput (COleVariant (m_send));
}
// 接收事件
void test_com::OnComm ()
{
if (m_ctrlComm.GetCommEvent () = 2) //事件值為2表示接收緩沖區內有字符
{
COle Variant m_input = m_ctrlComm.GetInput ();
//m_input中的數據即為接收到的數據,根據應答幀格式取出其中的有效數據
UpdateData (FALSE);
}
}
4、結論
通過在實際開發中的具體應用,提出組態軟件中串口設備通信模塊的具體實現方法,在實際應用中具有重要的應用價值。
參考文獻
[1] 馬國華 《監控組態軟件及其應用》清華大學出版社 2001.8
[2] 王亞民 陳青劉暢生 王水平 《組態軟件設計與開發》2003.4
[3] 李現勇 《Visual C++串口通信技術與工程實踐》 人民郵電出版社 2002.5