睿遠研究院丨IO-Link ISDU詳解
前言
很快又是一周,今天我們來好好聊聊ISDU。ISDU是Indexed service data unit的縮寫,這個名字吧,也怪奇怪的,直接翻譯叫索引服務數(shù)據(jù)單元,聽起來更是怪怪的,小編更喜歡直接稱他為從站的參數(shù)。傳感器的各項參數(shù)設置都要靠它,它不僅可以設置參數(shù),也可以作為只讀參數(shù)來讀取,甚至可以作為命令,基本是無所不能了。
01 ISDU總覽
ISDU與PD數(shù)據(jù)不同,在請求的狀態(tài)下才會發(fā)起,一般由主站發(fā)起相關請求,比如讀ISDU和寫ISDU。
ISDU的數(shù)據(jù)可以和PD數(shù)據(jù)一起傳輸,即在發(fā)送PD數(shù)據(jù)的同時發(fā)送ISDU數(shù)據(jù),考慮到PD數(shù)據(jù)的及時性,ISDU作為OD數(shù)據(jù),并非一次性發(fā)送完畢,而是把數(shù)據(jù)拆分到多個循環(huán)中,發(fā)送完畢由接收端來組裝數(shù)據(jù)報文。
規(guī)范規(guī)定,ISDU的最大長度為231字節(jié),這是一個很奇怪的數(shù)字。反正它一定得小于256。
ISDU的通用結(jié)構(gòu)
ISDU中對參數(shù)的標識采用了Index和subindex的組合,index的取值范圍從0x0000~0xFFFF,不過大部分都是被規(guī)范做了保留和定義,用戶能自定義用的范圍只有0x40~0xFE以及0x0100~0x3FFF。
雖然范圍有限,但絕對綽綽有余了,下圖就是一個大概的劃分。
規(guī)范劃分ISDU為2大部分,一部分是系統(tǒng)預定義的,index從0x02到0x3F;另一部分屬于客戶自定義ISDU區(qū)域以及行規(guī)使用的范圍。
??系統(tǒng)參數(shù)(System)
0x02~0x0F 系統(tǒng)參數(shù)使用
??客戶標識(Identification)0x10~0x1F 客戶的標識信息等
??診斷信息(Diagnosis)
0x20~0x27 從站的診斷信息
??行規(guī)參數(shù)(Profile)
0x31~0x3F從站行規(guī)使用,比如SSP
??建議區(qū)域(Preferred)
0x40~0xFE 從站設備首選的自定義ISDU空間
??擴展區(qū)域(Extended)
0x0100~0x3FFF 可以可使用的擴展區(qū)域
??行規(guī)指定(Profile specific)
0x4000~0x4FFF 從站行規(guī)使用,比如SSP
02 ISDU的結(jié)構(gòu)
ISDU分為讀/寫兩個操作,這個和前面所講的報文的讀寫是兩個概念。報文的讀寫是指OD是主站發(fā)出還是從站發(fā)出,而ISDU的讀寫就是我把參數(shù)設置到從站內(nèi),還是從從站讀取ISDU數(shù)據(jù)。
無論是讀ISDU還是寫ISDU,一開始都是寫方向的報文,可以理解為給從站發(fā)送命令,因為讀寫ISDU就是一個命令。
命令發(fā)送完畢,就是讀報文,這時候可能是讀取ISDU的具體數(shù)值,也可能是從站對寫ISDU的確認報文,這些報文是由從站發(fā)給主站的,所以是讀操作。
理解完讀寫ISDU的命令后,我們看詳細的報文結(jié)構(gòu)
I-Service作為ISDU的第一個報文的前4個bit,規(guī)定了讀寫方向和具體的模式,有用的就3個寫,3個讀,還有一個no service。我們簡化它就是如下的公式:
因為長度既用了第一個字節(jié)的后4bit,考慮到231字節(jié)的ISDU,又用了一個字節(jié),導致感覺IO-Link又想節(jié)約字節(jié),但又沒有節(jié)約到位,增加了協(xié)議棧的復雜性。
如下圖所示,這個ExtLength是若隱若現(xiàn),猶抱琵琶半遮面;有時候有,有時候又沒有,所以造成一個怪現(xiàn)象,你會發(fā)現(xiàn),length這個字段從來沒有16這個數(shù)值。
length是一個感覺雞肋的一個定義,現(xiàn)在這個index和subindex又是類似的,你這統(tǒng)一定義有index和subindex不就完了嗎,非得定義一會有,一會沒有,增加代碼開發(fā)復雜度,又沒有感覺字節(jié)節(jié)約到哪里去。下圖給一個直觀的感受。
03 ISDU的FlowCtrl機制
ISDU比較重要的一個機制是FlowCtrl機制,即當一個ISDU需要通過多個M-Sequence來傳輸時,需要流控進行消息計數(shù)。
每次傳輸完一段數(shù)據(jù),F(xiàn)lowCtrl就需要+1,如果FlowCtrl沒有變化,說明上個傳輸?shù)臄?shù)據(jù)對端沒有收到或者收到數(shù)據(jù)有誤,需要重發(fā)。主站是ISDU的發(fā)起方,因此主站需要通過ISDU的數(shù)據(jù)長度和FlowCtrl兩個組合進行傳輸完整性的判斷。
FlowCtrl的詳細定義如下:
簡化了看就是如下圖:
ISDU的通道是0x11,結(jié)合讀寫位和地址位的首位,有如下幾個組合:
??0xFx(1111xxxx):
寫ISDU命令(start/IDLE)
??0xEx(1110xxxx):
寫ISDU命令(count)
??0x7x(0111xxxx):
讀ISDU命令(Start/IDLE)
??0x6x(0xx0xxxx):
讀ISDU命令(count)
舉例來看:
??第一行 70 52 表示主站要寫一個ISDU命令,93 15 86表示ISDU index 15的命令,這個命令就是讀取序列號
??第二行,主站要讀取從站的回應了,這時候從站尚未回應,則返回系統(tǒng)忙
??第三行,主站再次讀取從站的ISDU回應,這時候從站準備好數(shù)據(jù),準備輸出,按照ISDU res+的格式回應。
首先是D113 表示正確回應,字節(jié)數(shù)在19個。后續(xù)跟著相關數(shù)據(jù)。30 31 34 38 34 32 表示ASCII,轉(zhuǎn)換成字符串就是01 48 42,最后一個2E是校驗碼。
??第四行和第五行就是接著第三行沒有輸出完的數(shù)據(jù)繼續(xù)輸出。前面兩個字節(jié),E1 70和E2 40都是主站發(fā)出的數(shù)據(jù),表示繼續(xù)讀取從站的數(shù)據(jù)。
??整體ISDU回應的數(shù)據(jù)就是01 48 42 52 b0 00 02 D9 。
結(jié)語
OK,本篇詳細介紹了ISDU的報文結(jié)構(gòu)以及讀寫的示例,下篇就ISDU的狀態(tài)機做個簡單的介紹,期待各位看官持續(xù)關注!

提交
睿遠研究院丨IO-Link OD模塊解析
睿遠研究院丨IO-LinkPD處理模塊
睿遠研究院丨IO-Link M序列解析
睿遠研究院丨IO-Link消息處理模塊
睿遠研究院丨IO-Link主從狀態(tài)機解析