摘要:.NET2.0新增SerialPort類為串口通信提供了強大的工具。該文重點闡述將DCS改造為FCS實驗裝置后,上位機是如何利用這一工具實現與控制系統之間的數據通信,從而證明采用C#串行通信類可以使串行通信程序的設計具有更強的實用性和靈活性,使串口數據傳輸變得更方便和可靠。
關鍵詞:.NET2.0;SerialPort類;FCS系統
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)29-0323-02
Design of Serial Communication between PC and FCS Experimental System Based on .NET2.0 Serial Port Resources
LI Lin
(Changzhou Institute of Engineering Technology,Changzhou 213164,China)
Abstract: New class SerialPort of .NET2.0has provided a powerful tool for the serial communication. This paper focuses on how the master PC use this tool to finish the data communications with control system after the transformation from DCS to FCS experimental device. It is proved that the use of C # serial communication class can make the design of serial communication program more practical and flexible, so that the serial data transmission has become more convenient and reliable.
Key words: .NET2.O; serialPort class; FCS
我院有一套1999年購置的DCS(集散控制系統)實驗裝置,經過多年使用設備的性能已經下降,同時技術上已過時,另外,實驗控制操作臺DOS界面的顯示和操作極為不便,不能很好地完成教學實驗任務。于是,我們設想在原有DCS系統的基礎上,外加一些簡單的控制裝置,快速地改造DCS系統,以少量的投資快速地建立一套先進的FCS(現場總線系統)裝置,此外,該系統控制操作臺的界面需要改造為操作簡便而直觀Windows窗體形式。
1 DCS實驗系統改造基本思路
該實驗裝置是由控制對象和控制操作臺兩大部分組成。控制對象如圖1所示,以熱水鍋爐為核心,配有循環水泵、高位水箱、水槽組成的供排水系統和手動切換閥組等,對象中安裝了各類檢測變送儀表和執行機構,是一套微縮了的常用生產過程裝置;操作臺則將控制對象中的儀表信號和電氣負載轉移到信號接線板上并提供配電端子,接線板上方有十余塊各種儀表類和電氣類實驗板。整套系統包括有流量、壓力、液位、溫度四大熱工參數的10個測量點,及電動調節閥、變頻器、晶閘管開關等電力拖動類執行器3個控制點。
上位機采用普通PC機,是通過圖形界面方式顯示控制對象,并通過鼠標及鍵盤操作讀出測量點參數,或寫入要求達到的參數值。經過設計,改造后整個裝置的基本原理如圖2所示。
筆者主要負責上位機功能的實現,這主要包括兩個方面的內容,一是Windows平臺的系統界面及相關功能,二是與下位的串行數據傳輸。經過討論和實踐我們采用Visual studio2005平臺的C#語言作為開發工具,而數據通信借助了C#的SerialPort 類。
2 .NET2.0的串口通訊技術簡介
微軟的NET Framework 2.0 類庫包含了SerialPort 類,可以方便地實現所需要串口通訊的多種功能,其基本技術如下:
1) 命名空間
System.IO.Ports命名空間包含了控制串口重要的SerialPort類,該類提供了同步 I/O 和事件驅動的 I/O、對管腳和中斷狀態的訪問以及對串行驅動程序屬性的訪問。
2) 串口的通訊參數
串口通訊最常用的參數就是通訊端口號及通訊格式(波特率、數據位、停止位和校驗位)。
① 通訊端口號
[PortName]屬性獲取或設置通信端口,包括但不限于所有可用的 COM 端口,該屬性返回類型為String。通常情況下,PortName正常返回的值為 COM1、COM2……,所以用戶進行串口設備的配置是十分方便的。
② 通訊格式
SerialPort類對分別用[BaudRate]、[DataBits]、[StopBits] 、[Parity]屬性設置通訊格式中的波特率、數據位、停止位和校驗位,其中[Parity]和[StopBits]分別是枚舉類型,Parity類型中枚舉了Odd(奇)、Even(偶)、Mark、None、Space,StopBits枚舉了None、One、OnePointFive、Two。
SerialPort類提供了七個重載的構造函數,既可以對已經實例化的SerialPort對象設置上述相關屬性的值,也可以使用指定的端口名稱、波特率和奇偶校驗位數據位和停止位直接初始化 SerialPort 類的新實例。
3) 串口的打開和關閉
調用SerialPort類的Open()和Close()方法就可以實現串口的打開和關閉。
4) 數據的發送和讀取
Serial類調用重載的Write和WriteLine方法發送數據,其中WriteLine可發送字符串并在字符串末尾加入換行符,讀取串口緩沖區的方法有許多,其中除了ReadExisting和ReadTo,其余的方法都是同步調用,線程被阻塞直到緩沖區有相應的數據或大于ReadTimeOut 屬性設定的時間值后,引發ReadExisting異常。
5) DataReceived事件
DataReceived事件在接收到了[ReceivedBytesThreshold]設置的字符個數或接收到了文件結束字符并將其放入了輸入緩沖區時被觸發。
3 實驗系統改造中的串口通訊設計
系統的數據傳輸主要有兩種情況,一是寫入,即直接要求控制系統通過相關控制點的操作,使有關參數達到寫入的值;第二種是讀出,即從總線中讀出當前某參數的值,顯示在操作臺界面的相應位置。對于上位機來說,前一種操作比較簡單,只要按照一定的格式向串口發送數據即可,后一種則略微復雜,先要向串口發送讀數請求,稍加延時后再從串口讀相應的參數,并對讀入參數進行合法性檢驗,將合法的數據顯示在界面的相應位置,不合法的參數則要放棄,同時界面提示再次讀入。至于這一過程中下位機的數據讀寫和處理則不屬于本文論述的范圍。
3.1 串口的數據格式設計
為了便于上下位機讀寫參數,所以數據(二進制)全部采用字符串表示,傳輸的數據采用定長格式,不采用握手協議,不設停止位和奇偶校驗,又因為實驗系統中各參數的值都不大,所以用兩個字節就能夠滿足要求:
X-XXX-XXXXXXXXXXXX
其中3位熱工參數位的含義分別為:001表示液位,010表示溫度,011表示壓力,100表示流量。例如:10001000000010100表示寫入參數值1(即溫度值)為20℃。
3.2 參數設置
serialPort1.PortName = \"COM1\";//串口名
serialPort1.BaudRate = 9600;//波特率
serialPort1.Parity = Parity.None;//不作奇偶校驗
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;//停止位為1位
serialPort1.Handshake = Handshake.None;//不使用握手協議
serialPort1.ReadBufferSize = 4096;
serialPort1.ReadTimeout = 500;
3.3 具體實現
一般來說,實現串口通信首先是設置通信參數,然后打開串口,再進行讀寫,完成后關閉串口,以下是發出讀指令并讀入數據的代碼片段,由于篇幅所限,這里的代碼并不完整:
private void frmDisplay_Load(object sender, EventArgs e)
{
//發送讀取指令。0表示為要讀取數據,001表示為液位。
string parameter = this.Text.Trim();//檢查參數是哪一個
switch (parameter)
{
case \"液位調節\":
this.serialPort1.Open();//打開端口連接
this.serialPort1.WriteTimeout = 500;//設置超時
this.serialPort1.WriteLine (\"00010000000000000000\");//寫串口,發送讀數請求
…… //延時1S
this.serialPort1.ReadTimeout = 500;
string str= this.serialPort1.ReadExisting();//從接收緩沖讀取全部數據
this.serialPort1.Close(); //關閉串口
CheckData(str);//檢查讀入數據的合法性,并將結果顯示在界面上
break;
case \"溫度調節\":
……
}
……
}
4 結束語
本文就DCS實驗系統改造過程中如何應用.NET的串口通訊技術進行上位機和控制系統的數據傳輸進行了闡述,從中可以清楚地看到,Visual studio 2005在串口通訊方面已為我們提供了十分有力而又便捷的工具,使我們在即使沒有握手協議的情況下,也能方便地實現串口的數據通訊。
參考文獻:
[1] 何文才,杜鵬,劉培鶴,等.基于VB.NET的PC機和MCS-51單片機之間的串行通信[J].北京電子科技學院學報,2006,14(4).
[2] 韓中華,趙貞麗,丁志文.基于C#串行類的PC機與IC卡讀寫器串行通信的實現[J].科技廣場,2007(3).
[3] James Foxall.Visual C# 2005入門經典[M].北京:人民郵電出版社,2007.