<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動化 > 設(shè)計應(yīng)用 > 基于Lonworks技術(shù)的網(wǎng)絡(luò)打印服務(wù)器設(shè)計

          基于Lonworks技術(shù)的網(wǎng)絡(luò)打印服務(wù)器設(shè)計

          作者: 時間:2006-05-26 來源:網(wǎng)絡(luò) 收藏
          本文描述的(NPS)可以為工業(yè)現(xiàn)場的多個智能裝置提供可靠的共享服務(wù),極大地節(jié)約了系統(tǒng)成本;并且還可以方便地對NPS的功能進(jìn)一步擴(kuò)充,構(gòu)成一個分布式控制系統(tǒng)。[1]是由Echelon公司開發(fā)的一種現(xiàn)場總線網(wǎng),具有通信可靠、抗干擾能力強的優(yōu)點,使其在航天控制、工業(yè)過程控制、樓宇自動化、通信等領(lǐng)域得到了廣泛的應(yīng)用。其采用的LonTalk協(xié)議完全支持OSI/ISO協(xié)議參考模型從物理層直至應(yīng)用層的全部7層服務(wù)。Toshiba公司的TMPN3150/3120神經(jīng)元芯片[2]內(nèi)嵌了LonTalk協(xié)議,LonTalk協(xié)議和一個網(wǎng)絡(luò)操作系統(tǒng)作為神經(jīng)元芯片的固件提供給用戶,方便了用戶開發(fā)。神經(jīng)元芯片支持多種通信介質(zhì)、多信道和多種通信速率。NPS硬件采用Toshiba公司的TMPN3150神經(jīng)元芯片,應(yīng)用程序開發(fā)和調(diào)試工具為Echelon公司的NodeBuilder[3],其編程語言為Neuron C語言L4,5]。NPS能夠與多達(dá)64個其他智能設(shè)備(ID―Intelligent Device)構(gòu)成總線型網(wǎng)絡(luò),通信介質(zhì)為雙絞線,通信速率在78kbps時最大通信距離為1 200 m。系統(tǒng)結(jié)構(gòu)如圖1所示。

          1 NPS硬件
          如圖2所示,NPS采用1塊TMPN315081AF神經(jīng)元芯片,配置1片64K8位Flash存儲器作為程序存儲器和1片128K8位RAM作為數(shù)據(jù)存儲器;神經(jīng)元芯片的CP0~CP4雙向通信接口和78kbps的收發(fā)器構(gòu)成Lon-works網(wǎng)絡(luò)接口;TMPN315081AF神經(jīng)元芯片I/O引腳的功能可通過程序靈活配置。在此,I/00~I(xiàn)/07引腳接機(jī)接口的8位數(shù)據(jù)線,I/08引腳接打印機(jī)選通線(STRB),I/09接打印機(jī)的“Busy”信號線,并要在應(yīng)用程序中用如下Neuron C語句配置:
          IO_0 output byte PrintData;
          IO_8 output bit PrintStb;
          IO_9 output bit PrintBusy;。

          2 NPS應(yīng)用程序
          NPS與各個智能節(jié)點之間為主從方式,通過查詢完成工作。網(wǎng)絡(luò)尋址為domain:subnet:node方式。網(wǎng)絡(luò)通信采用顯示報文格式。
          2.1 應(yīng)用程序運行機(jī)制
          TMPN315081AF神經(jīng)元芯片固化了LonTalk的全部七層協(xié)議[2],位于應(yīng)用層的調(diào)度程序(Scheduler)負(fù)責(zé)目標(biāo)應(yīng)用程序的啟動、任務(wù)調(diào)度運行,并且任務(wù)運行必須有一個特定的事件來觸發(fā)。根據(jù)這個調(diào)度機(jī)制,本文在NPS的應(yīng)用程序中實現(xiàn)了以下事件(Events)及其對應(yīng)任務(wù)的功能。
          (1) reset事件
          完成NPS的網(wǎng)絡(luò)地址設(shè)置,建立網(wǎng)絡(luò)的域和地址,并完成打印機(jī)初始化工作。
          (2)timer_expires事件
          在程序中定義了3個周期性定時器:
          stimer repeating sNetUpDTr=12;
          mtimer repeating mAddrTr=300;
          mtimer repeating mPollTr=1000;。

          秒級定時器sNetUpDTr啟動網(wǎng)絡(luò)更新,毫秒級定時器mAddrTr事件對應(yīng)的任務(wù)通過廣播報文查詢網(wǎng)絡(luò)上的節(jié)點地址,并更新程序中的所有節(jié)點列表。節(jié)點結(jié)構(gòu)定義如下:
          typedef struct
          { unsigned int ID_num;//唯一ID
          char ID_descrip[32];//描述網(wǎng)絡(luò)地址,定義在Neu-ron C的addrdefs.h文件中msg_out_addr ID_dest_addr;
          }ID_INFO;
          毫秒級定時器mPollTr事件激發(fā)查詢?nèi)蝿?wù),詢問網(wǎng)絡(luò)上的節(jié)點是否有打印信息。
          (3)msg_arrives事件
          當(dāng)收到報文時,此事件為真,其對應(yīng)的任務(wù)接收報文,根據(jù)報文類型字段,可以區(qū)分是命令報文還是欲打印數(shù)據(jù)報文。
          (4)iO_in()事件
          在程序中對應(yīng)when(iO_in(Print_Busy)==0){…},就是當(dāng)打印機(jī)一旦空閑,就啟動打印任務(wù),把程序中打印緩沖區(qū)的數(shù)據(jù)輸出到打印機(jī)。整個NPS應(yīng)用程序的運行機(jī)制如圖3所示,每個任務(wù)在執(zhí)行時都調(diào)用相應(yīng)的函數(shù)來完成預(yù)定功能,函數(shù)代碼不在此詳述。
          2.2 應(yīng)用程序通信協(xié)議
          之所以單獨提出這個問題,是因為通訊協(xié)議對網(wǎng)絡(luò)應(yīng)用程序至關(guān)重要。本文中,NPS和其他智能節(jié)點間的應(yīng)用層通信協(xié)議為兩級協(xié)議:第一層,顯式報文嚴(yán)格按照Neu-ron C定義的格式、填寫報文的個字段;第二層,對顯式報文中的數(shù)據(jù)段,應(yīng)該定義自己的用戶數(shù)據(jù)規(guī)約。
          最后,應(yīng)用程序在NodeBuider環(huán)境下編譯、連接后生成可執(zhí)行文件,寫入到Flash存儲器,經(jīng)變電站現(xiàn)場調(diào)試和測試,NPS能夠可靠地完成網(wǎng)絡(luò)打印功能。


          3 結(jié) 論
          網(wǎng)絡(luò)是一種高抗干擾性、高性價比的現(xiàn)場總線網(wǎng)技術(shù),本文NPS設(shè)計之所以采用這種技術(shù)就是考慮到工業(yè)現(xiàn)場往往具有很強的電磁干擾。從硬件、編程和開發(fā)工具對NPS的設(shè)計進(jìn)行較詳盡地描述,希望對從事Lonworks網(wǎng)絡(luò)技術(shù)開發(fā)應(yīng)用的讀者能稍有裨益。本裝置與變電站測控單元、保護(hù)單元配套,經(jīng)過現(xiàn)場驗證,工作穩(wěn)定可靠。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();