新聞中心

        EEPW首頁 > 設計應用 > 基于EtherCAT的DSP應用軟件在線更新方法研究*

        基于EtherCAT的DSP應用軟件在線更新方法研究*

        作者:梁學修1,劉濤2,姚路3,楊學志1,蔣杰1(1.工業和信息化部計算機與微電子發展研究中心(中國軟件評測中心),北京 100048;2.機械工業儀器儀表綜合技術經濟研究所,北京 100055;3.珞石(北京)科技有限公司,北京 100085) 時間:2022-04-20 來源:電子產品世界 收藏
        編者按:主要研究使用EtherCAT總線在線更新TI C2000系列DSP應用軟件的方法。移植EtherCAT總線從站到C2000系列DSP上,針對C2000系列DSP設計編寫了相應的BootLoader程序,開發了簡單的應用程序。試驗研究表明:使用此方法可以在線快速通過EtherCAT總線更新C2000系列DSP的應用程序,此方法有效。

        *基金項目:國家重點研發計劃“智能機器人重點專項”(2019YFB1310200)

        本文引用地址:http://www.104case.com/article/202204/433275.htm

        作者簡介:梁學修(1987—),男,博士,研究方向智能檢測與控制。

        通訊作者:劉濤(1971—),男,高級工程師,研究方向儀器儀表、自動化等領域。

        0   引言

        (以太網控制自動化技術)是一個開放架構,以以太網為基礎的現場總線系統,是由德國的Beckhoff公司研發,由于有通訊周期短、通訊抖動小的特點,在工業自動化設備中被廣泛應用[1]。TI的C2000系列是一種支持單周期乘法和浮點運算的數字信號處理器,由于它的穩定性,在工業場合中多用于開發工控產品[2]。一方面為了應對工業應用環境中僅通過更新應用軟件即可實現的新需求;另一方面由于工業現場中復雜的接線和惡劣的運行環境,也導致人們不愿意直接拆卸設備,因而需要一種能設備應用程序的方法。

        本文給出了一種可以使用總線技術C2000系列工控產品應用程序的方法。本文以TI公司C2000系列中常用的28335基礎的某款工控產品對該研究方法進行闡述。

        1   從站移植

        物理層EtherCAT總線需要專門的EtherCAT從站控制器ESC(EtherCAT Slave Controller),軟件層Beckhoff公司提供了相應的協議棧[3]。移植EtherCAT到28335上需要從硬件層和軟件層著手。

        硬件的ESC芯片可選擇Beckhoff公司的ET1100。在硬件層除了需要ESC芯片外還需要1個PHY芯片,PHY芯片選擇KSZ8081MNX。硬件架構如圖1所示。

        image.png

        ET1100的硬件接線圖中需要關注的是ET1100的B12引腳應當接到DSP28335的外部中斷信號上面,在EtherCAT通信過程中,ET1100收到1幀數據后會在B12引腳上面產生1個上升沿信號[4-5],本文設計以中斷的方式通知DSP28335接收到了1幀數據。在本文設計中將DSP28335和ESC芯片之間通過DSP28335的外部總線進行通訊,將ET1100掛載在DSP28335的Zone7上面。

        軟件層,根據硬件配置更改從站代碼中ecat_def.h相應的宏即可,配置這些宏需參考設計的硬件和軟件。根據本文的設計,配置了以下這些宏。

        #define MAKE_PTR_TO_ESC

        #define ESC_16BIT_ACCESS

        #define MAILBOX_SUPPORTED

        #define COE_SUPPORTED

        ((MEM_ADDR ESCMEM *)0x00200000)

        1

        1

        1

        本研究中將ET1100掛載在了DSP28335的Zone7上面,因此配置MAKE_PTR_TO_ESC這個宏地址為DSP28335的Zone7的起始地址0x200000;DSP28335是1個16位的DSP,因此配置ESC_16BIT_ACCESS為1;在更新工控產品的程序時需要傳輸多幀數據,因此配置支持郵箱操作,即配置MAILBOX_SUPPORTED為1;傳輸數據幀時需要用到COE的OBJ因此配置COE_SUPPORTED為1。

        從站的正常運行還需要ET1100的配置文件,主要描述ET1100的配置信息,在本文設計中不會用到POD(過程數據)傳輸數據,因此使用Beckhoff公司提供的默認配置文件即可。

        移植完從站后,編譯程序,下載到DSP里面,連接網線使用主站掃描軟件掃描從站,控制從站的狀態切換到PreOP即可。由于在PreOP狀態的時候就可以進行郵箱SDO的通訊了,應用程序只用到了SDO郵箱數據,因此只切換到PreOP即可。

        2   BootLoader軟件設計

        DSP28335燒寫程序可以通過TI的仿真器完成,也可將編譯生成的hex文件根據DSP28335的啟動方式使用串口更新程序。在工業現場中,更新程序一般由技術支持人員完成,顯然使用開發人員用的工具仿真器來更新程序是不合理的,這里既涉及分工問題,又涉及公司程序安全問題。根據DSP28335的啟動方式使用串口自動更新程序,需要硬件中添加額外的電路,顯然這是不經濟的。編寫BootLoader程序下載到DSP28335里面,運行此程序使用和工業現場使用的一樣的通訊技術來更新程序,既不會涉及公司代碼安全,也不用額外添加硬件,因此此種方法比較經濟。

        2.1 BootLoader軟件的技術要點

        BootLoader主要功能包括:①建立與上位機的通訊;②擦寫DSP28335芯片內部flash;③建立應用程序執行的工作環境,包括堆棧以及中斷向量的設計。這些功能也就是BootLoader程序的技術要點。

        EtherCAT在運行到PreOP狀態后,主站將數據發送給從站,需要設計一個讀寫的OBJ,因此在從站代碼中需添加1個與BootLoader通訊專用的OBJ,在移植成功的從站代碼中的cia402appl.h文件的DefCiA402AxisObjDic數組中添加一行代碼:

        {NULL,NULL, 0x2000, {DEFTYPE_UNICODE_STRING, 0 | (OBJCODE_VAR << 8)}, sEntryDesc0x4000, aName0x4000, &CiA_Axis.Objects.HexDowload,NULL, SDOWriteHexData, 0x0000 }

        其中,0x2000是一個可以由制造商自定義的OBJ,SDOWriteHexData是主站在向從站發送數據時從站自動調用的函數,在此函數中,本文要實現程序的下載功能。涉及程序代碼安全,BootLoader不提供讀DSP內部數據的方法。

        BootLoader與主站建立通訊后,需要將主站下載的程序數據寫入到flash固定的位置,因此BootLoader需要具備擦寫DSP內部flash的功能。擦寫DSP內部flash的方法可參考DSP的相應庫文件和函數說明。在使用DSP28335的庫函數時,庫函數需要運行在RAM中,而且在進行flash的擦寫操作時不能被中斷打斷[6-7]。將DSP28335的flash操作函數運行在RAM中需要將這些庫文件鏈接到RAM中,并且在BootLoader程序初始化時將flash操作的函數拷貝到RAM中,具體操作如下:

        Flash28_API:

        { - l F l a sh28335_AP I _V210. l i b ( . e c o n s t ) -

        lFlash28335_API_V210.lib(.text)}

        LOAD = FLASHA,

        RUN = RAML0,

        LOAD_START(_Flash28_API_LoadStart),

        LOAD_END(_Flash28_API_LoadEnd),

        RUN_START(_Flash28_API_RunStart),PAGE = 0

        其中,LOAD=FLASHA,描述的是Flash28335_A P I _ V 2 1 0 . l i b 庫文件加載區是FLASHA中,RUN=RAML0,描述的是Flash28335_API_V210.lib庫運行的地方是RAML0中。在BootLoader程序初始化時需執行的代碼是:

        memcopy(&Flash28_API_LoadStart, &Flash28_API_LoadEnd, &Flash28_API_RunStart);

        執行這段代碼將Flash28335_API_V210.lib的代碼從加載區拷貝到運行區。另外在調用庫中的flash擦寫函數之前使用DINT關掉中斷,調用結束使用EINT打開中斷。

        在BootLoader程序執行結束運行應用程序之前準備好應用程序運行的環境,通常包括清bss段,拷貝全局數據,中斷向量表遷移。在DSP28335這個平臺上,bss段的清理和全局數據的拷貝可由_c_int00函數實現,因此在BootLoader跳到應用程序中執行時第1次調用_c_int00即可,調用它既完成了應用程序的準備工作,又完成了從BootLoader到應用程序的跳轉。

        DSP28335的中斷向量表固定存放在起始地址是0x000D00、長度為0x100的空間中,因此修改此地址空間的內容就是修改中斷向量表,將1個中斷向量表PieVectTableInit的數據拷貝到此空間,完成中斷向量的配置。因此在BootLoader跳到應用程序執行之前修改向量空間的內容,或在應用程序中修改向量空間的內容,即可完成中斷向量的重新配置,通過在應用程序中修改中斷向量空間內容,完成中斷向量表的重新配置。

        2.2 BootLoader軟件架構

        在解決了BootLoader軟件設計的技術要點后,設計BootLoader程序架構。設計BootLoader程序執行流程圖如圖2所示。

        BootLoader程序執行時首先進行程序初始化,包括EtherCAT從站的初始化,flash的初始化。初始化結束后檢查是否已經下載了應用程序,如果沒有應用程序,則執行EtherCAT的從站程序,在死循環中調用從站的main函數;如果有應用程序則校驗應用程序的CRC值,校驗通過則執行應用程序,校驗失敗則執行EtherCAT的從站程序,在死循環中調用從站的mian函數。

        在BootLoader執行EtherCAT從站的main函數時涉及了更新應用程序邏輯,在EtherCAT主站給從站發送命令時,從站調用SDOWriteHexData,在SDOWriteHexData中執行更新應用程序的邏輯,在這個函數中處理了主站發送的數據包,設計相應的數據包格式為:幀數據長度|| CMD || 數據長度 || addr || 數據 || CRC,從站處理數據包的流程如圖3所示。

        image.png

        image.png

        在更新應用程序時從站分別檢查OBJ的可訪問性,數據幀長度,CRC校驗,以及相應的命令,找到相應命令后,執行具體的操作。在本設計中,設計了擦flash的命令和寫flash的命令。主站在更新從站的應用程序時,首先發送擦flash的命令,擦除flash之后,再發命令寫flash。

        主站發送的更新應用程序的命令中包含了程序的數據,這些數據從編譯的hex文件中提取,hex文件參照Intel Hex文件格式進行提取。提取完hex文件中的數據后將其打包成從站可以識別的數據包,此數據包可由主站發送給從站用于更新程序。

        3   結論

        通過本文設計的方法,將提取后的hex文件數據進行打包加密后,然后使用相應的程序更新工具,將更新文件的數據下載給相應的設備,實現了程序的更新。證明了此方法可以在線快速通過EtherCAT總線更新C2000系列DSP的應用程序,此方法有效。

        參考文獻:

        [1] 郇極,劉艷強.工業以太網現場總線EtherCAT驅動程序設計及應用[M].北京:北京航空航天大學出版社, 2010.

        [2] 于廣,孫漢青,王志平,等. C2000系列DSP在線程序更新研究[J].單片機與嵌入式系統應用,2013,13(3):78-79.

        [3] CHUN-RONG S , YAN-QIANG L , JI H . EtherCATIndustrial Ethernet Fieldbus and Its Driver Design[J]. Manufacturing Automation, 2007.

        [4] 馬軍賢, 周侗, 楊志家,等. EtherCAT從站的設計與實現[J].自動化與儀表, 2011(08):37-40.

        [5] 孫士超,王偉東,杜志江.實時以太網EtherCAT從站的硬件系統設計[J].單片機與嵌入式系統應用,2014(08):52-55.

        [6] 姚勝東.工業以太網現場總線EtherCAT的應用[J].儀表技術,2014(8):4-6.

        [7] 高鵬.基于DSP的EtherCAT工業以太網從站驅動設計[D].北京:北京交通大學.

        (本文來源于《電子產品世界》雜志2020年9月期)



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 临泽县| 民勤县| 潼南县| 陇南市| 丹阳市| 喀喇| 枣庄市| 织金县| 德惠市| 万源市| 定兴县| 新乡市| 韶山市| 邵阳市| 平和县| 泌阳县| 湖口县| 遂川县| 桦甸市| 藁城市| 平湖市| 涞源县| 宜兰县| 全州县| 通化县| 芷江| 仁化县| 山东省| 镇巴县| 东平县| 辽阳市| 彭山县| 涟水县| 平果县| 喀喇沁旗| 乌拉特中旗| 崇义县| 翁源县| 南木林县| 密云县| 老河口市|