国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Ethercat學習-從站源碼解析(ECAT_Main)

這篇具有很好參考價值的文章主要介紹了Ethercat學習-從站源碼解析(ECAT_Main)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

ECAT_Main函數(shù)在MainLoop中輪詢,下面是ECAT_Main中的運行流程。

MBX_Main();

在MBX_Main中,獲取sMbxReceiveQueue中的數(shù)據(jù),包括COE的SDO和FOE。對SDO數(shù)據(jù)進行處理,然后回復Master。

    if ( bMbxRunning )
    {
        HW_EscReadWord(sm1Activate,(ESC_SYNCMAN_ACTIVE_OFFSET + SIZEOF_SM_REGISTER));
        sm1Activate = SWAPWORD(sm1Activate);
    }

bMbxRunning 在成功進入Bootstrap或者Pre-OP狀態(tài)的時候變?yōu)門RUE。這里讀取0x80E寄存器的值。SWAPWORD用于大小端的轉(zhuǎn)換,ESC是小端芯片,如果從機的MCU是大端的話需要進行轉(zhuǎn)換,這里用的小端的MCU,所以SWAPWORD沒什么作用。

    ALEventReg = HW_GetALEventRegister();
    ALEventReg = SWAPWORD(ALEventReg);

讀取AL事件請求寄存器0x220的值

    if ((ALEventReg & AL_CONTROL_EVENT) && !bEcatWaitForAlControlRes)
    {
        HW_EscReadWord( EscAlControl, ESC_AL_CONTROL_OFFSET);
        EscAlControl = SWAPWORD(EscAlControl);
        ALEventReg &= ~((AL_CONTROL_EVENT) | (SM_CHANGE_EVENT));
        AL_ControlInd((UINT8)EscAlControl, 0); 
    }

需要滿足的判斷條件有兩個:

  1. 0x220的bit0置1,也就是產(chǎn)生了主站狀態(tài)請求事件;
  2. bEcatWaitForAlControlRes標志位為FALSE。bEcatWaitForAlControlRes在一般狀態(tài)下是FALSE的,只有在safeop到OP狀態(tài)的轉(zhuǎn)換的時候,會先將bEcatWaitForAlControlRes標記為TRUE,然后等待OP條件滿足,例如:DC模式下,需要200ms內(nèi)穩(wěn)定收到PDO數(shù)據(jù),或者其他模式下需要收到一幀PDO數(shù)據(jù),如果nPdOutputSize為0,則不需要PDO接收PDO數(shù)據(jù)。在條件滿足后,從站會將bEcatWaitForAlControlRes標記為FALSE,然后設(shè)置狀態(tài)為OP。

進入這個判斷后:

  1. 讀取0x120寄存器的值,這個值就是主站請求的狀態(tài),
  2. 將ALEventReg的bit0和bit4清0。這里的清0主要是避免后續(xù)重復調(diào)用AL_ControlInd函數(shù)。這里清0只是清除變量里的值,若要寄存器清0,對0x120讀操作,0x220的bit0清0;對0x806進行讀操作,0x220的bit4清0。
  3. 調(diào)用AL_ControlInd設(shè)置狀態(tài)
    if ( (ALEventReg & SM_CHANGE_EVENT) && !bEcatWaitForAlControlRes && (nAlStatus & STATE_CHANGE) == 0 && (nAlStatus & ~STATE_CHANGE) != STATE_INIT )
    {
        ALEventReg &= ~(SM_CHANGE_EVENT);
        AL_ControlInd(nAlStatus & STATE_MASK, 0);
    }

需要滿足的判斷條件有四個:

  1. 0x220的bit4置1,也就是SM激活寄存器(SM配置寄存器+0x6)產(chǎn)生了變化
  2. bEcatWaitForAlControlRes標志位為FALSE
  3. 當前從站的狀態(tài)未報錯
  4. 當前從站的狀態(tài)不是INIT

進入這個判斷以后:

  1. 將ALEventReg的bit4清0
  2. 調(diào)用AL_ControlInd設(shè)置狀態(tài),這里的目的不是為了改變狀態(tài),因為填入的請求狀態(tài)參數(shù)是當前的狀態(tài)值。這里主要目的是當SM激活寄存器發(fā)生改變后,使用AL_ControlInd函數(shù)中的CheckSmSettings來檢查SM的配置。這也解釋了為什么在上一步會將ALEventReg的bit0和bit4都清0了。因為在上一步調(diào)用AL_ControlInd已經(jīng)檢查過了,不需要重復檢查了。
    if(bEcatWaitForAlControlRes)
    {
        AL_ControlRes();
    }

bEcatWaitForAlControlRes是在safeop轉(zhuǎn)換OP的時候標記未TRUE的,AL_ControlRes主要是判斷OP條件是否滿足,當條件滿足后會將從站狀態(tài)改變?yōu)镺P,并標記bEcatWaitForAlControlRes為FALSE。

    if (!(sm1Activate & SM_SETTING_ENABLE_VALUE))
    {
          AL_ControlInd(nAlStatus & STATE_MASK, 0);
    }

這里應(yīng)該還是對郵箱配置進行檢查,但是因為我的郵箱一直都是激活狀態(tài),所以全程沒有進入到這個條件中去。

        if ( ALEventReg & (MAILBOX_READ_EVENT) )
        {
            u16dummy = 0;
            HW_EscWriteWord(u16dummy,u16EscAddrSendMbx);
            ALEventReg &= ~(MAILBOX_READ_EVENT);
            MBX_MailboxReadInd();
        }

需要滿足的判斷條件一個:

  1. SM1通道有事件發(fā)生,主站讀取了SM1中的數(shù)據(jù);

進入這個判斷后:

  1. 寫取SM1的第一個字節(jié),用于清除0x220中的SM1事件的置位。
  2. 清除變量中相應(yīng)位置的置位。
  3. MBX_MailboxReadInd查看發(fā)送隊列中是否還有待發(fā)送的數(shù)據(jù),如果有,將數(shù)據(jù)寫入SM1的緩存中
        if ( ( (sm1Activate & SM_SETTING_REPAET_REQ_MASK) && !bMbxRepeatToggle )
            ||( !(sm1Activate & SM_SETTING_REPAET_REQ_MASK) && bMbxRepeatToggle ))
        {
            MBX_MailboxRepeatReq();
            if (bMbxRepeatToggle)
            {
                sm1Activate |= SM_SETTING_REPEAT_ACK;
            }
            else
            {
                sm1Activate &= ~SM_SETTING_REPEAT_ACK; 
            }

            sm1Activate = SWAPWORD(sm1Activate);
            HW_EscWriteWord(sm1Activate,(ESC_SYNCMAN_ACTIVE_OFFSET + SIZEOF_SM_REGISTER));
        }

判斷條件一個:

  1. 重復請求位(SM配置寄存器+0x6 的bit1)是否翻轉(zhuǎn),bMbxRepeatToggle是上一次bit1的值。

進入這個判斷后:

  1. 調(diào)用MBX_MailboxRepeatReq將之前保存的上一包數(shù)據(jù)重新寫入郵箱之中,并且更新bMbxRepeatToggle的值。
  2. 寫重復請求應(yīng)答位(SM配置寄存器+0x7 的bit1),該位與重復請求位相同時,表示PDI對前面設(shè)置的重復請求應(yīng)答。其實也可以理解為主站翻轉(zhuǎn)+0x6的bit1來告訴從站需要重傳,然后主站一直檢測+0x7的bit1,發(fā)現(xiàn)翻轉(zhuǎn)后,說明重傳數(shù)據(jù)已經(jīng)放入郵箱了,主站再去讀從站郵箱里的數(shù)據(jù)。
        ALEventReg = HW_GetALEventRegister();
        ALEventReg = SWAPWORD(ALEventReg);
        if ( ALEventReg & (MAILBOX_WRITE_EVENT) )
        {
            ALEventReg &= ~(MAILBOX_WRITE_EVENT);
            MBX_CheckAndCopyMailbox();
        }

重新讀取0x220的寄存器的值,或者這個值已經(jīng)變了。

判斷SM0事件是否發(fā)生了,主機是否有數(shù)據(jù)寫進來了

如果SM0數(shù)據(jù)發(fā)生了,那么先將變量ALEventReg相應(yīng)的位清0,然后調(diào)用MBX_CheckAndCopyMailbox將有效數(shù)據(jù)寫入 sMbxReceiveQueue中。sMbxReceiveQueue會在MBX_Main()里面進行處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-475496.html

到了這里,關(guān)于Ethercat學習-從站源碼解析(ECAT_Main)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于STM32F407-LAN9252的EtherCAT從站協(xié)議移植過程

    基于STM32F407-LAN9252的EtherCAT從站協(xié)議移植過程

    EtherCAT移植過程 前言:剛拿到一個EtherCAT的開發(fā)需求,本來想安心當個CV戰(zhàn)士的,結(jié)果在網(wǎng)上找了一圈,只有https://www.hexcode.cn/article/5e3ee9a835616641b2daef97?這篇寫的相對詳細,看來偷不了懶了,只有自己重新整理開發(fā)了。 1 、需求 基于STM32F407芯片、LAN9253芯片(自帶PHY芯片),驗

    2024年02月09日
    瀏覽(30)
  • HttpRunner3.x 源碼解析(2)-main_run執(zhí)行用例

    HttpRunner3.x 源碼解析(2)-main_run執(zhí)行用例

    當在終端運行輸入httprunner run 目錄或者文件名,則會調(diào)用main_run函數(shù),并傳入目錄/文件名來執(zhí)行測試用例。 對于extra_args中的值,如果在os.path.exists不存在,則將其加入extra_args_new中。 如果存在,則將其加入用例列表? tests_path_list 1)如果列表? tests_path_list長度為0,說明用例文

    2023年04月09日
    瀏覽(19)
  • 學習C這么久了,main函數(shù)的這三個參數(shù)你見過嗎?

    學習C這么久了,main函數(shù)的這三個參數(shù)你見過嗎?

    ??作者簡介: 花想云 ,在讀本科生一枚,C/C++領(lǐng)域新星創(chuàng)作者,新星計劃導師,阿里云專家博主,CSDN內(nèi)容合伙人…致力于 C/C++、Linux 學習。 ?? 專欄簡介:本文收錄于 Linux從入門到精通 ,本專欄主要內(nèi)容為本專欄主要內(nèi)容為Linux的系統(tǒng)性學習,專為小白打造的文章專欄。

    2024年02月05日
    瀏覽(20)
  • DEVICENET轉(zhuǎn)ETHERCAT網(wǎng)關(guān)連接ethercat通訊協(xié)議詳細解析

    DEVICENET轉(zhuǎn)ETHERCAT網(wǎng)關(guān)連接ethercat通訊協(xié)議詳細解析

    你有沒有遇到過生產(chǎn)管理系統(tǒng)中,設(shè)備之間的通訊問題?兩個不同協(xié)議的設(shè)備進行通訊,是不是很麻煩?今天,我們?yōu)榇蠹医榻B一款神奇的產(chǎn)品,能夠?qū)⒉煌瑓f(xié)議的設(shè)備進行連接,讓現(xiàn)場的數(shù)據(jù)交換不再困擾! 遠創(chuàng)智控YC-ECT-DNT是一款DEVICENET從站功能的通訊網(wǎng)關(guān),可以將DEVI

    2024年02月13日
    瀏覽(17)
  • Apache Doris 聚合函數(shù)源碼閱讀與解析|源碼解讀系列

    Apache Doris 聚合函數(shù)源碼閱讀與解析|源碼解讀系列

    筆者最近由于工作需要開始調(diào)研 Apache Doris,通過閱讀聚合函數(shù)代碼切入 Apache Doris 內(nèi)核,同時也秉承著開源的精神,開發(fā)了 array_agg 函數(shù)并貢獻給社區(qū)。筆者通過這篇文章記錄下對源碼的一些理解,同時也方便后面的新人更快速地上手源碼開發(fā)。 聚合函數(shù),顧名思義,即對一

    2024年01月25日
    瀏覽(15)
  • React源碼解析18(5)------ 實現(xiàn)函數(shù)組件【修改beginWork和completeWork】

    React源碼解析18(5)------ 實現(xiàn)函數(shù)組件【修改beginWork和completeWork】

    經(jīng)過之前的幾篇文章,我們實現(xiàn)了基本的jsx,在頁面渲染的過程。但是如果是通過函數(shù)組件寫出來的組件,還是不能渲染到頁面上的。 所以這一篇,主要是對之前寫得方法進行修改,從而能夠顯示函數(shù)組件,所以現(xiàn)在我們在index.js文件中,修改一下jsx的寫法。修改成函數(shù)組件

    2024年02月13日
    瀏覽(22)
  • Ethercat學習-GD32以太網(wǎng)學習

    Ethercat學習-GD32以太網(wǎng)學習

    1、GD32F4以太網(wǎng)簡介 GD32F4系列以太網(wǎng)模塊包含10/100Mbps以太網(wǎng)MAC,數(shù)據(jù)的收發(fā)都通過DMA進行操作,支持MII(媒體獨立接口)與RMII(簡化的媒體獨立接口)兩種與物理層(PHY)通訊的標準接口。 2、以太網(wǎng)模框圖簡介 ? 以太網(wǎng)需要外接一個PHY(以太網(wǎng)芯片)才可以進行通信。與PH

    2024年02月06日
    瀏覽(16)
  • Init函數(shù)和main函數(shù)

    go語言中init函數(shù)用于包(package)的初始化,該函數(shù)是go語言的一個重要特性。 有下面的特征: 兩個函數(shù)的執(zhí)行順序: 對同一個go文件的init()調(diào)用順序是從上到下的。 對同一個package中不同文件是按文件名字符串比較“從小到大”順序調(diào)用各文件中的init()函數(shù)。 對于不同的packa

    2024年02月09日
    瀏覽(22)
  • 【深度學習】分類損失函數(shù)解析

    【深度學習】分類損失函數(shù)解析

    在分類任務(wù)中,我們通常使用各種損失函數(shù)來衡量模型輸出與真實標簽之間的差異。有時候搞不清楚用什么,下面是幾種常見的分類相關(guān)損失函數(shù)及其 解析,與代碼示例 。 二元交叉熵損失(Binary Cross Entropy Loss,BCELoss): torch.nn.BCELoss() 是用于二元分類的損失函數(shù)。它將模型

    2024年02月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包