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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于DeviceNet總線的從設(shè)備通迅適配器設(shè)計(jì)

          基于DeviceNet總線的從設(shè)備通迅適配器設(shè)計(jì)

          作者: 時(shí)間:2012-11-29 來(lái)源:網(wǎng)絡(luò) 收藏

            參數(shù)對(duì)象 在帶有可配置參數(shù)的設(shè)備中都用到了可選的參數(shù)對(duì)象。將為每個(gè)可配置的參數(shù)引入一個(gè)實(shí)例。參數(shù)對(duì)象帶有設(shè)備配置參數(shù),提供訪問(wèn)所有參數(shù)的標(biāo)準(zhǔn)組態(tài)工具。參數(shù)對(duì)象的配置選項(xiàng)屬性可以包括數(shù)值,量程,文本和限制等。
            應(yīng)用對(duì)象 配備了匯編對(duì)象或參數(shù)對(duì)象的設(shè)備通常至少應(yīng)包含一個(gè)應(yīng)用對(duì)象, 卷II的第六章DeviceNet對(duì)象庫(kù)中有大量的標(biāo)準(zhǔn)應(yīng)用對(duì)象。
            設(shè)備描述(Device Profiles) DeviceNet規(guī)范不僅僅是一個(gè)物理連接協(xié)議規(guī)范。它通過(guò)定義標(biāo)準(zhǔn)的設(shè)備模型促進(jìn)不同廠商設(shè)備之間的互操作性。屬于同一設(shè)備模型的所有設(shè)備都必須支持共同的標(biāo)識(shí)和通訊狀態(tài)數(shù)據(jù)。設(shè)備描述是針對(duì)各種設(shè)備而定義的。設(shè)備描述中包括設(shè)備各種特定的數(shù)據(jù)。符合設(shè)備類型描述的多個(gè)供貨商提供的簡(jiǎn)單設(shè)備(例:按鈕,馬達(dá)啟動(dòng)器,光電池,氣動(dòng)閥執(zhí)行器)在邏輯上是可互換的。

          設(shè)備描述包括下列各項(xiàng):
          l 設(shè)備對(duì)象模型定義-定義設(shè)備對(duì)象模型如上圖所示。通常用表格列出設(shè)備中存在的所有對(duì)象類,各類中的實(shí)例數(shù),各個(gè)對(duì)象如何影響行為,以及每個(gè)對(duì)象的公共接口。
          l 設(shè)備I/O數(shù)據(jù)格式定義-通常包含用于簡(jiǎn)化和加快數(shù)據(jù)傳輸?shù)膮R編對(duì)象的定義,匯編對(duì)象包含所需要的數(shù)據(jù)組件的地址(類,實(shí)例和屬性)。
          l 設(shè)備可配置參數(shù)的定義和訪問(wèn)這些參數(shù)的公共接口。該信息包含在電子數(shù)據(jù)文文件(EDS)中,EDS包含在設(shè)備的用戶文件中。
          DeviceNet規(guī)范定義了一個(gè)電子數(shù)據(jù)文文件(EDS),EDS是一個(gè)簡(jiǎn)單文件格式,供貨商可以將產(chǎn)品的特殊信息提供給其它供貨商。這樣可以具有友好的用戶配置工具,可以很容易的更新,無(wú)需經(jīng)常修正配置軟件工具。
            上面只講述了DeviceNet協(xié)議規(guī)范的概貌,DeviceNet協(xié)議規(guī)范還是相當(dāng)復(fù)雜的,整個(gè)協(xié)議規(guī)范有1000多頁(yè),有興趣的讀者可到ODVA官方網(wǎng)站下載。只有對(duì)協(xié)議規(guī)范有一定深度的理解后,才可以著手思考如何開發(fā)基于DeviceNet協(xié)議適配器的軟件系統(tǒng)。

          三、 軟件系統(tǒng)設(shè)計(jì)
            下面主要介紹通訊協(xié)議的設(shè)計(jì),軟件的實(shí)現(xiàn)是以DeviceNet協(xié)議規(guī)范的2.0版本為指導(dǎo)的。不同的應(yīng)用有不同的具體實(shí)現(xiàn),本文只給出設(shè)計(jì)的原理和指道思想及原則。
          1 DeviceNet通訊設(shè)備的上電狀態(tài)流圖
          每個(gè)設(shè)備上電以前都有一個(gè)例行的狀態(tài)流轉(zhuǎn)過(guò)程,該過(guò)程描述了設(shè)備能夠在DeviceNet上通訊之前必須完成的以下工作,例如重復(fù)MAC ID檢測(cè)等;以及對(duì)設(shè)備通訊產(chǎn)生影響的網(wǎng)絡(luò)事件。



          DeviceNet狀態(tài)流圖
            上圖是DeviceNet設(shè)備上電后的狀態(tài)流轉(zhuǎn)圖,其中一共有4個(gè)狀態(tài):發(fā)送重復(fù)MAC ID檢測(cè)報(bào)文狀態(tài),等待重復(fù)MAC ID檢測(cè)報(bào)文狀態(tài),在線狀態(tài),通訊出錯(cuò)狀態(tài)。設(shè)備在各個(gè)狀態(tài)之間的流轉(zhuǎn)是根據(jù)網(wǎng)絡(luò)的事件情況,如下所示:
          網(wǎng)絡(luò)事件/狀態(tài)轉(zhuǎn)換關(guān)系



          2 CAN芯片的初始化
            建立在CAN總線的通訊之前要預(yù)先有一些初始化過(guò)程。一般,獨(dú)立式CAN芯片SJA1000在上電后或者上電后軟件功能的重置時(shí)要初始化一下工作寄存器。當(dāng)系統(tǒng)上電后,處理器首先運(yùn)行自己的特殊初始化過(guò)程,然后再進(jìn)入SJA1000的連接建立過(guò)程(SJA1000的17號(hào)管腳獲得一個(gè)Reset低電平脈沖,并進(jìn)入Reset模式)。在初始化SJA1000的寄存器之前,主微處理器應(yīng)該檢測(cè)Reset的mode/request標(biāo)志,如果SJA1000已經(jīng)是Reset模式,因?yàn)樗械募拇嫫髦荒茉赗eset模式下進(jìn)行寫操作,所有的寄存器都將獲得的相應(yīng)的配置信息。
            當(dāng)完成所有的初始化工作后,SJA1000就進(jìn)入工作(Operation)模式,并且使CAN控制器的中斷功能有效。SJA1000的初始化流程如圖2所示。
            下面是一段用C51編寫的SJA1000初始化及一個(gè)模擬發(fā)送、接收過(guò)程的程序。
            程序說(shuō)明:主程序首先對(duì)SJA1000進(jìn)行初始化,config1(),把接收中斷打開;然后等待。
            當(dāng)監(jiān)測(cè)到網(wǎng)絡(luò)上有數(shù)據(jù)進(jìn)入SJA1000的buffer時(shí),進(jìn)入中斷服務(wù)程序service_int1()interrupt 2
            using 1,并把接收數(shù)據(jù)放入buffer數(shù)組中。
            首先判斷是否該數(shù)據(jù)是針對(duì)5號(hào)節(jié)點(diǎn)的,如果不是,則丟棄,否則接收。
            判斷收到的10個(gè)數(shù)據(jù)屬于哪一類,根據(jù)邏輯發(fā)送相應(yīng)響應(yīng)。
          發(fā)送程序send(UIN*value,int number)中,當(dāng)發(fā)送緩沖區(qū)為空,則將需要發(fā)送的數(shù)據(jù)(在Sbuffer中)發(fā)給Master設(shè)備。
          include
          include
          define UINT unsigned int
          UINT a;
          UINT buffer[10];
          UINT Sbuffer[6];
          UINT b=0;
          int i;
          sbit P1_0=P1^0;
          sbit P1_1=P1^1;
          sbit P1_3=P1^3;
          void config1() //對(duì)SJA1000進(jìn)行初始化
          {a=0;
          XBYTE[0x4000]=0x01; //復(fù)位模式
          XBYTE[0x4004]=0x11; //接收中斷使能,wake_up中斷使能
          XBYTE[0x4005]=0xFF; //Accept Mask Register設(shè)置
          XBYTE[0x4006]=0x00; //Bus Timing 0
          XBYTE[0x4007]=0x1C; //時(shí)鐘周期的設(shè)置
          XBYTE[0x4008]=0xFA; //輸出控制寄存器
          XBYTE[0x401F]=0x48; //clock divider
          EA=1;
          EX1=1;
          }
          void send(UINT*value,int number)
          {int i;
          do
          {
          }while(XBYTE[0x4002]4= =0); //發(fā)送緩沖區(qū)為空,才能繼續(xù)發(fā)送
          for(i=0;iXBYTE[0x400A+i]=value[i]; //將發(fā)送的內(nèi)容放入緩沖區(qū)
          XBYTE[0x4001]=0x01; //發(fā)送命令
          P1_0=!P1_0;
          P1_1=0;
          P1_3=!P1_3; //燈閃爍,以說(shuō)明在發(fā)送中
          XBYTE[0x7fff]=P1;
          }
          void service_int1() interrupt 2 using 1 //接收中斷服務(wù)程序
          {
          UINT count;
          UINT Status;
          int c;
          Status=XBYTE[0x4003]; //讀一次則清中斷
          if (b700)
          {for (c=0;c10;c++)
          {buffer[c]=XBYTE[0x4014+c]; //接收信息放入buffer中
          XBYTE[0x0000+10*b+c]=buffer[c];
          }
          b++;
          }
          XBYTE[0x4001]=0x04;
          if (buffer[0]= =0x85)
          switch (buffer[1]) //對(duì)buffer內(nèi)容進(jìn)行判斷,決定response內(nèi)容
          {
          case 0xc6;
          Sbuffer[0]=0x85;
          Sbuffer[1]=0x63;
          Sbuffer[2]=0x00;
          Sbuffer[3]=0xcb;
          Sbuffer[4]=0x00;
          send (Sbuffer,5);
          break;
          case 0x86;
          {if (buffer[7]= =0x00)
          Sbuffer[0]=0x85;
          Sbuffer[1]=0x63;
          Sbuffer[2]=0x00;
          Sbuffer[3]=0xcb;
          Sbuffer[4]=0x00;
          send (Sbuffer,5);
          }
          else
          {Sbuffer[0]=0x85;
          Sbuffer[1]=0x64;
          Sbuffer[2]=0x00;
          Sbuffer[3]=0x94;
          Sbuffer[4]=0x0e;
          Sbuffer[5]=0xff;
          晶振相關(guān)文章:晶振原理
          上拉電阻相關(guān)文章:上拉電阻原理


          評(píng)論


          技術(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); })();