摘 要: 設(shè)計(jì)了電源監(jiān)控系統(tǒng),利用485總線構(gòu)建上位機(jī)PC機(jī)與多臺TI公司的DSP TMS320F2812的連接,利用VB.NET編寫了串口通信程序和Modbus通信協(xié)議,并利用多線程技術(shù)實(shí)時(shí)對多臺DSP數(shù)據(jù)進(jìn)行處理和狀態(tài)顯示。搭建平臺,實(shí)驗(yàn)證明滿足上位機(jī)對多臺DSP數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性和準(zhǔn)確性。
關(guān)鍵詞: .NET; 電源監(jiān)控; 485總線;多線程
隨著特種電源用于大規(guī)模的生產(chǎn),對特種電源的集中監(jiān)控成為迫切需要。特種電源參數(shù)多,數(shù)據(jù)傳輸量大。一方面上位機(jī)在完成對多臺電源的狀態(tài)詢問的同時(shí)要保證控制指令及時(shí)傳輸?shù)较挛粰C(jī),另一方面上位機(jī)要實(shí)時(shí)地顯示電源參數(shù)并繪制運(yùn)行曲線。本設(shè)計(jì)采用485總線,下位機(jī)電源控制器基于TI公司的DSP TMS320F2812,上位機(jī)與下位機(jī)通信采用VB.NET的SerialPort串行通信類,軟件的編寫在VS2008環(huán)境下實(shí)現(xiàn)。
1 監(jiān)控系統(tǒng)結(jié)構(gòu)
監(jiān)控系統(tǒng)結(jié)構(gòu)(如圖1)包括:上位PC機(jī)、多臺DSP、232/485轉(zhuǎn)換口、并聯(lián)2個(gè)120 Ω的終端電阻、屏蔽雙絞線。485總線連接采用半雙工通信方式,以上位PC機(jī)為主機(jī)、多臺DSP為從機(jī)的主從式結(jié)構(gòu)?,F(xiàn)場控制單元以DSP為核心,一方面負(fù)責(zé)電源各項(xiàng)數(shù)據(jù)的采集與處理,控制電源的自動運(yùn)行;另一方面接收上位機(jī)的控制命令,對命令進(jìn)行解析判斷后及時(shí)調(diào)整電源的運(yùn)行參數(shù)。上位機(jī)通過232/485轉(zhuǎn)換口連接到485總線上,進(jìn)行狀態(tài)數(shù)據(jù)和控制命令的雙向傳輸,通過上位機(jī)軟件實(shí)時(shí)獲取現(xiàn)場電源的運(yùn)行數(shù)據(jù)和參數(shù),而且可以在線修改工藝參數(shù)和遠(yuǎn)程控制電源運(yùn)行。
2 監(jiān)控軟件設(shè)計(jì)
監(jiān)控軟件設(shè)計(jì)包括通信協(xié)議的制定,上位機(jī)軟件的編寫和DSP程序的設(shè)計(jì)。通信協(xié)議除了制定上位機(jī)和DSP通信的數(shù)據(jù)幀格式,還規(guī)定了數(shù)據(jù)收發(fā)時(shí)狀態(tài)的轉(zhuǎn)換機(jī)制。上位機(jī)程序利用SerialPort類和多線程技術(shù)完成與多臺DSP的通信,同時(shí)利用VB.NET中多線程技術(shù)和客戶自定義事件實(shí)現(xiàn)通信,同時(shí)進(jìn)行數(shù)據(jù)處理、狀態(tài)顯示、曲線繪制等功能。
2.1 通信協(xié)議
因?yàn)橄到y(tǒng)采用一主多從的結(jié)構(gòu),所以通信采用Modbus協(xié)議實(shí)現(xiàn)。Modbus協(xié)議包括ASCII和RTU,考慮到所需傳輸?shù)臄?shù)據(jù)量比較大,本設(shè)計(jì)使用RTU協(xié)議。協(xié)議棧的實(shí)現(xiàn)是基于狀態(tài)機(jī)的操作,狀態(tài)轉(zhuǎn)換如圖2所示。
\
為了滿足基本的監(jiān)控目標(biāo),本設(shè)計(jì)實(shí)現(xiàn)了Modbus-RTU協(xié)議的基本讀寫功能,也就是功能號為03 10的功能,其功能說明如表1所示。
基本的協(xié)議幀應(yīng)答數(shù)據(jù)如表2、表3所示。
2.2軟件設(shè)計(jì)
上位機(jī)軟件結(jié)構(gòu)如圖3所示。
程序初始化時(shí),從數(shù)據(jù)庫中讀取設(shè)備參數(shù)列表,根據(jù)讀取的設(shè)備個(gè)數(shù)實(shí)例化設(shè)備類,新建各設(shè)備的對象。每臺設(shè)備對象是在VB2008設(shè)計(jì)的自定義控件,每一個(gè)控件的數(shù)據(jù)處理和顯示單元是一個(gè)獨(dú)立的線程。每臺設(shè)備下發(fā)數(shù)據(jù)和接收數(shù)據(jù)都要經(jīng)過先進(jìn)先出集合SendQueue和RecQueue。從發(fā)送集合SendQueue中取出數(shù)據(jù),通過串行通信類SerialPort與下位機(jī)進(jìn)行數(shù)據(jù)通信,從接收集合RecQueue中取出數(shù)據(jù)進(jìn)行相應(yīng)設(shè)備的狀態(tài)顯示。
2.2.1 通信程序設(shè)計(jì)
通信部分采用兩個(gè)線程。一個(gè)是發(fā)送線程,從發(fā)送集合SendQueue中取出數(shù)據(jù),并從串行端口中發(fā)送數(shù)據(jù),在發(fā)送結(jié)束后添加接收數(shù)據(jù)事件(等待數(shù)據(jù)的接收)。另一個(gè)是數(shù)據(jù)處理線程,從接收集合RecQueue中取出接收到的數(shù)據(jù),判斷DSP設(shè)備的地址,然后以產(chǎn)生事件的形式通知對相應(yīng)設(shè)備數(shù)據(jù)的處理。
(1) SerialPort初始化
SerialPort通信參數(shù)的初始化在主窗體加載中完成,程序如下:
port = New System.IO.Ports.SerialPort()
port.PortName =“com1” //打開串行端口1
port.BaudRate=9 600 //設(shè)置波特率為9 600 b/s
port.DataBits=8 //8位數(shù)據(jù)位
port.StopBits=System.IO.Ports.StopBits.One //1位停止位
port.Parity=System.IO.Ports.Parity.None //無奇偶校驗(yàn)
port.Open() //打開串行端口1
(2)數(shù)據(jù)接收事件DataReceived
AddHandler port.DataReceived, AddressOf Me.DataRec
//添加接收事件
//接收事件處理程序
Private Sub DataRec(ByVal sender As Object,ByVal e As
System.IO.Ports. SerialDataReceivedEventArgs)
Dim Bytes As Integer
Bytes = port.BytesToRead
//獲取數(shù)據(jù)緩沖區(qū)數(shù)據(jù)的字節(jié)數(shù)
Dim recData as Byte(Bytes-1) //接收數(shù)據(jù)數(shù)組
If Bytes > 0 Then
port.Read(recData, 0, Bytes)
//讀取數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)到數(shù)組
End If
2.2.2 上位機(jī)程序設(shè)計(jì)
(1)多線程技術(shù)
首先根據(jù)建立的設(shè)備對象數(shù)量,為每個(gè)對象建立一個(gè)獨(dú)立的線程,用于負(fù)責(zé)該設(shè)備的所有實(shí)時(shí)通信、實(shí)時(shí)狀態(tài)顯示和數(shù)據(jù)庫讀寫操作,接著啟動各線程。采用多線程平行處理后,程序具有了很好的可定制性,只要根據(jù)實(shí)際需求修改線程數(shù)量即可實(shí)現(xiàn)對不同設(shè)備數(shù)量系統(tǒng)的監(jiān)控,既簡單又可靠。
(2) 并發(fā)性問題
因?yàn)樯衔粰C(jī)通過一個(gè)串行端口與多臺DSP通信,每臺設(shè)備發(fā)送數(shù)據(jù)和數(shù)據(jù)處理都需要訪問SendQueue和RecQueue,所以須要避免在同一時(shí)刻訪問集合而產(chǎn)生的沖突。本設(shè)計(jì)使用VB的SynLock關(guān)鍵字,使用該關(guān)鍵字可以定義必須在線程之間同步的一定范圍的語句。通過執(zhí)行該操作,將鎖住該集合,其他設(shè)備的數(shù)據(jù)要想訪問該集合,必須等待占用此集合的操作結(jié)束并釋放此鎖后才能進(jìn)行,這樣就避免了同時(shí)操作集合而引發(fā)的沖突。
(3) 客戶自定義事件
因?yàn)榻邮盏降臄?shù)據(jù)需要顯示、數(shù)據(jù)處理、保存數(shù)據(jù)庫、繪制曲線等工作,如何保證這些工作能夠并行地開展成為要解決的關(guān)鍵問題。本設(shè)計(jì)采用VB的客戶自定義事件,把上述工作都放入到事件的集合中,當(dāng)產(chǎn)生事件時(shí),就對集合中的每一項(xiàng)工作進(jìn)行并行處理,這樣即實(shí)現(xiàn)了“一主多播”。
2.2.3 DSP程序設(shè)計(jì)
DSP在執(zhí)行其他任務(wù)的同時(shí)能及時(shí)上傳數(shù)據(jù)和接收上位機(jī)數(shù)據(jù),提高工作效率。F2812采用中斷發(fā)送、中斷接收方式。下面僅以發(fā)送為例,流程圖如圖4所示。
通過對監(jiān)控軟件的設(shè)計(jì),搭建485總線,用PC電腦連接多臺DSP控制器。實(shí)驗(yàn)證明,本系統(tǒng)滿足數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性和準(zhǔn)確性,符合特種電源監(jiān)控系統(tǒng)的實(shí)際要求。
參考文獻(xiàn)
[1] 陽憲惠,工業(yè)數(shù)據(jù)通信與控制網(wǎng)絡(luò)[M].北京:清華大學(xué)出版社,2003.
[2] TROELSEN A..NET 3.5與VB 2008高級編程[M].北京:清華大學(xué)出版社, 2009.
[3] 蘇奎峰.TMS320X281xDSP原理及C程序開發(fā)[M]. 北京:北京航空航天大學(xué)出版社, 2008.
[4] Modicon. Modbus Protocol Reference Guide[Z]. 1996.6