睿遠(yuǎn)研究院丨IO-Link 事件解讀
前言
上篇我們介紹了ISDU的典型編碼格式和應(yīng)用案例,本篇我們就來詳細(xì)介紹下,ISDU的狀態(tài)機(jī),并把EVENT事件的邏輯,給大家好好解析下。
01 主站ISDU狀態(tài)機(jī)
如上圖所示,ISDU的狀態(tài)機(jī)的核心是請(qǐng)求,等待和響應(yīng)。
如果主站請(qǐng)求的是DPP參數(shù),即ISDU 0x00,0x01的參數(shù),從AL層還是走的ISDU邏輯,但底層走了DL_Read/WriteParam的邏輯,即走的是Page通道。也就是好端端的ISDU愣是被它拆分了兩個(gè)通道,增加了復(fù)雜性。
因?yàn)橥ǔWx寫ISDU的命令都很長,一個(gè)循環(huán)放不下,都是多個(gè)循環(huán)來拆包,組包。具體的幾個(gè)狀態(tài)如下:
??T2:觸發(fā)OD.req開始請(qǐng)求ISDU;
??T3:持續(xù)觸發(fā)寫請(qǐng)求,請(qǐng)求ISDU數(shù)據(jù);
??T4:開始計(jì)時(shí)器(ISDUTime),查看是否會(huì)超時(shí);
??T5:開始讀請(qǐng)求,對(duì)之前寫命令的讀請(qǐng)求;
??T6:如果從站開始回應(yīng),則停止定時(shí)器;
??T7:持續(xù)的讀取ISDU數(shù)據(jù);
??T8:全部讀取后,F(xiàn)lowCtrl為IDLE狀態(tài);
??T11:如果ISDU錯(cuò)誤,則觸發(fā)ISDUAbort命令,并向DL層確認(rèn)ISDU錯(cuò)誤;
??T13:通過OD.req來獲取相關(guān)參數(shù);
??T14:在正常PD交互中,采用IDLE的FlowCtrl進(jìn)行OD交互
??T15:如果通信中斷,消息處理通知DL_Mode處理模塊,需要把ISDU模塊去激活。
02 從站ISDU狀態(tài)機(jī)
從站ISDU的狀態(tài)機(jī)和主站的狀態(tài)很類似,請(qǐng)求、等待和響應(yīng)三個(gè)狀態(tài)缺一不可。
??T1:收到激活事件,從非激活狀態(tài)遷移到Idle狀態(tài),等待ISDU的命令
??T2:開始接收ISDU數(shù)據(jù),遷移狀態(tài)到Request_2
??T3:持續(xù)接受數(shù)據(jù),因?yàn)镺D的數(shù)據(jù)大,而每次循環(huán)一般就傳遞1~2個(gè)OD數(shù)據(jù),需要幾個(gè)循環(huán)才能傳輸完,每次接收的OD數(shù)據(jù)需要緩存,等待接收完畢
??T4:所有ISDU接收完畢后,觸發(fā)RecComplete事件,進(jìn)入wait狀態(tài),該狀態(tài)下尚未解析完成,如果主站查詢數(shù)據(jù),則回應(yīng)busy
??T5:從站回應(yīng)busy
??T6:從站做好準(zhǔn)備,遷移狀態(tài)到Response
??T7:等待主站的read命令,開始讀取數(shù)據(jù),調(diào)用OD.rsp來回應(yīng)主站
??T8:發(fā)送完成,觸發(fā)SendComplete事件,回到idle狀態(tài)
??T9:接收到ISDUAbort命令
??T10:接收ISDUAbort命令
??T11:接收ISDUAbort命令
??T12:SM模塊通知ISDU模塊,去激活,回到非激活狀態(tài)
??T13:收到ISDU Error消息,回到Idle狀態(tài)
??T14:在Idle狀態(tài)下,從站回應(yīng)no service的命令
??T15:如果ISDU Error觸發(fā)ISDU Abort
??T16:如果ISDU Error觸發(fā)ISDU Abort
03 Event事件解析
介紹完ISDU之后,我們來看一下事件。
事件有時(shí)候又稱為診斷,它也是通過OD字段來傳輸,它的發(fā)起端雖然是主站來發(fā)起請(qǐng)求,但是最初的發(fā)起還是從站,從站會(huì)在每次傳輸時(shí),在最后字節(jié)的一個(gè)bit置位,告訴主站自己有事件。
就好像小學(xué)生要回答問題,不能自己直接回答,得先舉手示意?????♀?。這時(shí)候老師(主站)會(huì)問學(xué)生(從站),你有什么事情或者你想回答什么問題(事件)嗎?這時(shí)候?qū)W生(從站)就會(huì)把自己的事情(事件)告訴老師(主站)。
Event在協(xié)議棧中以16 bit的EventCode存在,每個(gè)EventCode表示一個(gè)事件的定義;而所有的EventCode又可以分為三類:Error、Warning和Notification。
Error/Warning:簡單歸結(jié)為錯(cuò)誤,故障類,比較嚴(yán)重,該類事件以出現(xiàn)/消失成對(duì)出現(xiàn),如果出現(xiàn)了Error/Warning,需要維護(hù)人員去關(guān)注,直到它消失為止;
Notification:僅僅是通知,不是很嚴(yán)重,可能并不需要關(guān)注,它沒有出現(xiàn)/消失這種機(jī)制,就是見到的SingleShot。
事件上報(bào)
如上圖所示,上報(bào)事件通過查看從站的內(nèi)存里的數(shù)據(jù)來上報(bào),規(guī)范規(guī)定了一次性最大臨時(shí)存6個(gè)事件,共占用18個(gè)字節(jié),加上一個(gè)狀態(tài)字節(jié),共19字節(jié)。
事件的狀態(tài)機(jī)
最后看一下事件的狀態(tài)機(jī),這個(gè)就比較簡單了,主站狀態(tài)機(jī)如下:
主站的狀態(tài)機(jī)基本就是Idle和讀事件,讀完確認(rèn)就結(jié)束了。
從站也很簡單,就是觸發(fā)事件,讀取事件的時(shí)候,要凍結(jié)內(nèi)存,不能讓新事件寫入內(nèi)存,導(dǎo)致干擾。
結(jié)語
好了,本篇總結(jié)了ISDU的狀態(tài)機(jī)以及EVENT事件的業(yè)務(wù)邏輯,內(nèi)容有點(diǎn)多,希望大家慢慢消化。

提交
睿遠(yuǎn)研究院丨IO-Link ISDU詳解
睿遠(yuǎn)研究院丨IO-Link OD模塊解析
睿遠(yuǎn)研究院丨IO-LinkPD處理模塊
睿遠(yuǎn)研究院丨IO-Link M序列解析
睿遠(yuǎn)研究院丨IO-Link消息處理模塊