摘要:在系統(tǒng)集成及軟件項目開發(fā)中會經(jīng)常使用串口或串口設備獲取相關設備信息進行數(shù)據(jù)的讀取和顯示,有時串口設備的接口類型可能是通過RS-232或RS-485方式進行連接,這對于有限個串口設備接入一臺計算機是可行的。但是如果用戶想通過一個設備來實現(xiàn)這些設備的聯(lián)網(wǎng),NPort無疑是最好的選擇。只要根據(jù)需求進行相關配置,用戶就可以方便地實現(xiàn)對硬件設備的遠程監(jiān)控。
關鍵詞:NPort系統(tǒng)集成串口設備
本文以我在一個系統(tǒng)集成軟件項目中通過Nport設備對4個大樓的28部電梯的上、下行狀態(tài)及電梯運行樓層的狀態(tài)監(jiān)控為例對Nport實現(xiàn)多串口設備監(jiān)控進行簡單介紹。
1 Nport概述
Nport又稱為串口設備聯(lián)網(wǎng)服務器,它可以在串口和以太網(wǎng)界面間輕易地執(zhí)行雙向數(shù)據(jù)的傳輸,從而使我們達到同時集中管理串口設備的目的。
2 軟件項目需求
連接方式:BA通訊盒(485)-〉moxa485轉(zhuǎn)tcp/ip(tcp/ip)-〉管理網(wǎng)交換機-〉集成服務器。
電梯分布:
一號樓:十部電梯,編號為3#-13#。其中3#-8#電梯所接NPort地址為:10.4.1.152。9#-13#電梯所接NPort地址為:10.4.1.153。
二號樓:十部電梯,編號為15#-24#。其中15#-19#電梯所接NPort地址為:10.4.1.156。20#-24#電梯所接NPort地址為:10.4.1.157。
三號樓:六部電梯,編號為25#-30#。其中25#電梯所接NPort地址為:10.4.1.158。26#-30#電梯所接NPort地址為:10.4.1.159。
四號樓:兩部電梯,編號為1#-2#。電梯所接NPort地址為:10.4.1.151。
讀取數(shù)據(jù):上下行狀態(tài)、橋箱所在樓層。
3 Nport配置
首先,在本機電腦保證能夠正常ping通每個連接Nport設備的計算機;然后,進行Nport配置。我們以其中一臺Nport設備為例:打開IE瀏覽器,在地址欄中輸入http://10.4.1.151,出現(xiàn)如下圖1.1所示的界面:
我們將串口設備的波特率統(tǒng)一設置為9600,將SerialPort Type設置為Real COM(如圖1.2)。)
點擊Submit按鈕,完成一臺Nport設備的設置,然后按照同樣的方式設置其他6臺設備。
我們下載Nport Window Driver Manager軟件進行串口和IP地址的設置。
設置完成后如下圖所示:
通過以上設置我們可以看出:10.4.1.151對應的串口為COM9;10.4.1.152對應的串口為COM10;10.4.1.153對應的串口為COM11;10.4.1.156對應的串口為COM14;10.4.1.157對應的串口為COM15;10.4.1.158對應的串口為COM12;10.4.1.159對應的串口為COM13。至此,完成了Nport配置。
4 相關串口通信協(xié)議及軟件實現(xiàn)
本協(xié)議共有兩條命令,全部是字節(jié)流形式,主機發(fā)送控制命令、BA板采用被動接收并以應答的方式發(fā)回電梯狀態(tài)信息,分別介紹如下:
4.1 發(fā)送命令格式
4.2 接收命令格式
4.3 軟件實現(xiàn)
巡查地址請求函數(shù):
//發(fā)送巡查地址請求命令(A1H+地址編號)
private void SendRequest(int index)
{ byte[]Data = new byte;
//開始標志A1H
Data[0] = 0xA1;
//獲得十六進制地址編號
byte HexNum = getHexNum (index);
Data = HexNum;
if(serialPort1.IsOpen)
{
serialPort1.Write(Data, 0, 2); //向串口寫入數(shù)據(jù)
}
}
由于電梯地址和串口的對應關系為:COM9:1#、2#;COM10:3#-13#;COM11:9#-13#;COM14:15#-19#;COM15:20#-24#;COM12:25#;COM13:26#-30#。
我們要輪流對這幾個COM口進行打開關閉操作,即先打開COM9然后關閉再打開COM10,依次類推,所以封裝一個COM口操作的函數(shù):
private void setNextAddressRequest(int index)
{ //切換COM端口,首先關閉串口
if (this.serialPort1.IsOpen)
{
this.serialPort1.Close();
}
try
{ string OTHER_INIT = \"INITIALIZE\";
string BAUD_RATE = \"BaudRate\";
string PORT_NAME = \"ADD\" + index.ToString() + \"PortName\";
string infoPath = Directory.GetCurrentDirectory();
serialPort1.BaudRate = Convert.ToInt32(iniOperater.read(OTHER_INIT, BAUD_RATE));
serialPort1.PortName = iniOperater.read(OTHER_INIT, PORT_NAME);
serialPort1.Open();
}
catch (Exception ex)
{
MessageBox.Show(\"端口被占用或未正常連接!\");
}
}
這樣在程序中只要index循環(huán)加一就可以循環(huán)打開和關閉串口了。
以1#電梯為例,當我們調(diào)用函數(shù)SendRequest(1)發(fā)送地址請求指令后返回如下數(shù)據(jù):82 00 05 00 00 15 03 16,在SerialPort_DataReceived()事件進行數(shù)據(jù)解析。根據(jù)協(xié)議:其中82H為開始標志,第7位03為運行樓層信息,狀態(tài)2為00,后半位轉(zhuǎn)換為四位二進制為0000,即UP和DN均為0說明電梯正在3樓停留,16為前幾個狀態(tài)字的異或結(jié)果,循環(huán)調(diào)用這兩個函數(shù)就可以獲得所有電梯的運行樓層和上下行狀態(tài)信息了。
最終軟件對于電梯監(jiān)控部分的實現(xiàn)界面如下圖所示:
5結(jié)論
可以看出,Nport在監(jiān)控多串口設備數(shù)據(jù)讀取方面的作用是十分強大和方便的。在本項目中將串口的通信類型統(tǒng)一設置成RealCOM方式(當然也可以設置為TCP/IP方式以Socket方式讀取數(shù)據(jù)),該項目已經(jīng)如期交付給顧客,目前正處于試運行階段,反映良好。
參考文獻:
[1]楊子杰.《串口通信多線程實現(xiàn)的分析》.計算機應用研究,2001年.
[2]麻志毅.面向?qū)ο蠓治雠c設計.機械工業(yè)出版社,2008年.
[3]劉甫迎,劉光會,王蓉.C#程序設計教程(第2版).北京:電子工業(yè)出版社,2008.
[4]張輝.《現(xiàn)代通信原理與技術》.西安電子科技大學出版社.2008 年7月.