睿遠研究院丨IO-LinkPD處理模塊
前言
一年一度的IO-Link成員大會即將在德國法蘭克福召開,如果有小伙伴要前去觀摩的,歡迎評論區舉手留言哈!
1 主站消息狀態機回顧
上回我們講到消息處理模塊最重要的M-Sequence Type以及主從站的消息狀態機,主站的消息狀態機會稍微復雜一點,我們在開發主站協議棧的時候,也碰到一些無法理解的規則。
在規范中DL_WRITE和DL_READ都是通過Page通道讀寫通信參數的,應該都是在Startup階段才能進行,是不允許在PREOP和OP階段進行的。但是小編在1.1.3版本時就發現一個問題,從PREOP切換到OP時,需要DL_WRITE發送切換模式的命令,同時發送一個masterCycletime的寫入指令,這個指令也是DL_Write的命令。
這就造成了一個困惑,雖然在狀態機中DL_Write_DeviceMode這個命令屬于單獨的命令,在PREOP階段也適用,但是DL_Write(0x01, "MasterCycleTime")可是確確實實的DL_Write,理論上不應該出現在PREOP階段的它,卻出現了,直到目前最新的1.1.4版本尚未給任何說明。
具體如下圖,DL_Write(0x01, "MasterCycleTime")這條命令是在從PREOP切換到OP前發出的,也就是其還在PREOP階段。
好了,我們希望下個版本能夠解決這個問題,同時各位小伙伴也可以測試一下自家的主站是否會發出DL_Write(0x01, "MasterCycleTime")這個命令。
這條命令僅僅在這個圖中出現了一次,在其他地方再無提及,猜測這個命令未必是必須的,因為主站通知從站我的mastercycletime也沒有多大作用,畢竟從站都是被動式應答,只有主站詢問了,從站才會回答。
2 關于ProcessData
下面來講講PD處理模塊,在1.0時代,IO-Link規范規定了PD交互的多種方式,要求每次交互就2字節,PD和OD交錯運行,PD多余2個字節,就得拆包,多次發送,這個效率可想而知,非常低下,因此1.1版本做了重大改革,廢除了這種低下的方式。
1.1版本后,每次最大32字節PD數據,中間還可以夾帶OD數據,大大提升發送效率;當然對于像RFID這種上百個字節的,還是需要拆分字節,多次發送,再組包。
3 主從站的PD狀態機
3.1 主站PD狀態機
為了兼容1.0版本,狀態機里還把遺留的PDInInterleave放到了里面,從1.1版本來看,PD就兩個狀態,Inactive狀態(即Startup和PREOP所處的裝狀態)和PDSingle狀態(即OP所處的狀態)。。
3.2 從站PD狀態機
從站的PD狀態機也比較簡單,從inactive狀態被激活后,進入active狀態,Handle PD主要是1.0版本的遺留,在多個字節數據挨個處理的時候來回在PD Active和Handle PD之間交互,而1.1版本,直接進行DL_PDInputUpdate就行了。
3.3 總結
綜上所述,PD就是簡單的收發數據,沒有太多的處理,應該算IO-Link協議棧內部最簡單的模塊了。
那么拿到睿遠的IO-Link協議棧怎么處理PD數據呢,雖然簡單,但PD也是IO- Link最重要的數據,對于老版本的睿遠協議棧,可以直接操作PDE_PDIn和PDE_PDOut這個指針就行了。
按照大端排序的原則,PDE_PDIn[0]就是上傳主站PD數據的最左邊的那個字節,因為PDE_PDIn的內存是動態創建的,故要避免指針越界的問題。
在新版本中我們封裝了一個函數:
UIntegerT8 CeresStackSetPDInData(UIntegerT8 *pdin_data, UIntegerT8 pdin_len)
通過該函數,可以盡量避免指針越界的問題。
對于SSP的版本,進一步封裝了直接給測量值賦值的函數,這個就后續在SmartSensorProfile這個章節再講了。
END 結語
本期的內容就先到這里,提前做個劇透,下篇內容我們就一起看看最復雜的OD模塊是如何運作的,它包括了ISDU,Event等模塊,也是IO-Link最為核心的功能。

提交
睿遠研究院丨IO-Link M序列解析
睿遠研究院丨IO-Link消息處理模塊
睿遠研究院丨IO-Link主從狀態機解析
睿遠研究院丨IO-Link數據鏈路層解析
睿遠研究院丨IO-Link物理層編碼解析