睿远研究院丨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物理层编码解析