新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于DeviceNet總線的從設備通迅適配器設計

        基于DeviceNet總線的從設備通迅適配器設計

        作者: 時間:2012-11-29 來源:網絡 收藏


        send (Sbuffer,6);
        }
        }
        break;
        case 0x85;
        {if (buffer[6]= =0x02)
        Sbuffer[0]=0x85;
        Sbuffer[1]=0x64;
        Sbuffer[2]=0x8e;
        Sbuffer[3]=0x00;
        Sbuffer[4]=0x00;
        send (Sbuffer,6);
        }
        else
        {Sbuffer[0]=0x85;
        Sbuffer[1]=0x64;
        Sbuffer[2]=0x00;
        Sbuffer[3]=0x8e;
        Sbuffer[4]=0x01;
        Sbuffer[5]=0x00;
        send (Sbuffer,6);
        }
        }
        break;
        case 0x87;
        Sbuffer[0]=0x85;
        Sbuffer[1]=0x64;
        Sbuffer[2]=0x00;
        Sbuffer[3]=0x90;
        Sbuffer[4]=0x50;
        Sbuffer[5]=0x00;
        send (Sbuffer,6);
        break;
        case 0xA0;
        Sbuffer[0]=0x78;
        Sbuffer[1]=0xA1;
        Sbuffer[2]=0x07;
        send (Sbuffer,3);
        break;
        case 0xA1;
        Sbuffer[0]=0x78;
        Sbuffer[1]=0xA1;
        Sbuffer[2]=0x07;
        send (Sbuffer,3);
        break;
        }
        }
        void main ()
        {
        config1 ();
        XBYTE[0x4000]=0x22; //operation mode
        While (1)
        {;}
        }

        3 DeviceNet通訊適配器的收發中斷和時鐘中斷的設計
          CAN控制器和微處理器的數據交換可以使用中斷方式和周期輪詢的方式。從響應速度和執行的效率來講,我們的應用環境使用中斷的方式。因此我們必須編寫自己的收發中斷處理函數,其功能是將CAN控制器緩沖區中的報文拷貝到一個臨時的全局緩沖區,并將該緩沖區作為高層協議處理和底層收發處理的一個接口,這樣的設計具有良好的可擴展性。如果將來使用其它廠家的CAN控制器,所做的修改也僅僅是改動一些與具體硬件相應的幾個底層函數。我們只要定義好互相通訊的接口,就可以將軟件和硬件進行分離,在團隊開發的環境中可以加快工作的進度和效率。
          另外,通訊協議中經常要用到一些定時的功能,因而我們也需要在底層編寫一個定時中斷處理程序,該函數使用一個硬件定時器,以一個最小的計時單位周期性的為上層應用提供計時狀態。


        圖2 SJA1000的初始化流程

        4 DeviceNet通訊適配器的報文收發程序和分段服務
          這里所講的報文收發協議對不同的通訊協議有不同的定義。另外,CAN的數據長度不能超過8個字節,如何支持大于8個字節的報文要涉及到分段服務。分段協議信息由一個字節組成,其中高2位表示分段的類型,低6位作為分段的計數器,用來標識每個數據包,其計算方式是:fragmentCount=(fragmentcount+1) mod 64。下面是具體的分段的類型:


          因此,在程序的設計中應當加入對分段服務協議的支持。
          對于發送報文的處理與接收的過程是一個逆向過程。需要注意的是編寫程序的時候要嚴格按照DeviceNet協議規范的定義,否則將產生不可預測的錯誤,為將來的協議一致性測試和底層調試都帶來許多麻煩。

        5 DeviceNet通訊適配器的主程序的設計
          軟件由頭文件、初始化程序、功能子程序和主程序組成。
        軟件的組成結構提供了硬件和軟件升級的方便。軟件中將與主處理器、CAN控制器等硬件接口的部分比較獨立地設計,而主程序和功能子程序主要集中于協議的完成。對將來的硬件改型和可能的協議修改都提供了較大的方便。
          軟件以Franklin C51語言編寫,通過偉福E51L單片機開發裝置進行調試。
        軟件結構圖如下:



        5.1 軟件功能分解
          軟件由頭文件、初始化程序、功能子程序和主程序組成。其功能分解如下:
          頭文件:定義所有的參數、類結構和函數,定義要使用的硬件資源(如定時器和寄存器等)變量名稱;
        初始化程序:完成對主處理器的內存及硬件(如堆棧、定時器等)初試化,完成CAN控制器的初始化。
        功能子程序:詳見各模塊介紹。
        主程序組成:主控制流程。

        5.2 軟件各模塊功能詳述
          模塊按以下四個部分來介紹:頭文件,初始化程序,功能子程序,主程序
          說明:泵和閥的實現程序非常類似,兩者只相差一些參數,故此處以泵的源程序作為例子進行各個程序段的分析和說明。(詳見源程序)

        5.2.1 頭文件
        其主要操作為:
        包含(include)要使用的其它頭文件: reg51.h 51系列寄存器頭文件
        absacc.h 51系列硬件資源頭文件
        string.h C語言的字符操作頭文件
        定義(define)要使用的用戶自定義數據類型;定義類(class)ID;定義連接的類型;
        定義各實例(instacne)ID和定時器數量;定義全局狀態(status)字對應位的內容;
        定義全局事件(event)字對應位的內容;定義DeviceNet錯誤代碼和附加錯誤代碼;
        定義DeviceNet服務代碼;定義分段(fragment)值;定義連接狀態;其它附加的定義;
          類結構定義: Identity,DeviceNet,Connection,Message Router,Assembly,Discrete Output,
        Analog Input,Analog Output

        5.2.2 初始化程序
          其主要操作為:SJA1000初始化;定時器初始化;各結構對象初試化;

        5.2.3 功能子程序
          其主要操作為:具體定義在主程序中調用的各子程序;雙口RAM中斷子程序;定時器中斷子程序;

        5.2.4 主程序
          當實現所有的功能模塊以后,最重要的是如果構造一個有機的主程序模塊,將這些零散的模塊組織起來,進行系統的初始化工作。另外還要設計一個優化的循環體周期性的執行以對DeviceNet網絡上的報文產生動作。
          因為我們實現的是一個從站適配器,一般在輪詢的情況下只對主設備的請求報文產生相應的應答,而不會主動發送報文,除了上電時的重復MAC ID例行檢測。如何構造循環體是關鍵,我們這里采用了事件的方式,主循環體周期對網絡事件的不同可能的狀態產生動作。程序中定義不同的網絡事件,主程序循環體對代表這些事件的標志位不停的輪詢,當某個標志位因網絡事件的觸發而被置1的時候,主程序就進入相應的子程序進行對應事件的操作。操作完畢之后清楚標志位,退回到主程序循環中繼續輪詢所有的事件標志位。
        其主要操作為:設置數據緩沖區;定義全局變量;開時鐘;開中斷;進行主循環;

        結束語
          由本通訊適配器已于2002年3月13日在日本京都ASTEM RI通過ODVA一致性測試,其FCS已經成功的應用于2001年第2屆北京中國國際現場總線技術交流會暨展覽會,第3屆上海國際工業博覽會,吳忠儀表智能調節閥,東莞垃圾焚燒發電廠中的給水控制系統中。由于采用現場總線技術,取得了顯著的經濟效益。
        晶振相關文章:晶振原理
        上拉電阻相關文章:上拉電阻原理

        上一頁 1 2 3 4 下一頁

        關鍵詞: DeviceNet總線 從設備 通迅適配器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 青河县| 吉水县| 闵行区| 马关县| 铜山县| 梅州市| 南皮县| 修武县| 苍梧县| 建始县| 内乡县| 句容市| 宿州市| 司法| 西青区| 正安县| 鄱阳县| 平遥县| 宝兴县| 桂阳县| 永清县| 竹山县| 时尚| 鹤山市| 阿克陶县| 光山县| 石渠县| 江华| 鞍山市| 资兴市| 台山市| 东宁县| 碌曲县| 马公市| 翁牛特旗| 贵定县| 兰考县| 彭泽县| 乌海市| 苗栗县| 儋州市|