睿远研究院丨IO-Link ISDU详解
前言
很快又是一周,今天我们来好好聊聊ISDU。ISDU是Indexed service data unit的缩写,这个名字吧,也怪奇怪的,直接翻译叫索引服务数据单元,听起来更是怪怪的,小编更喜欢直接称他为从站的参数。传感器的各项参数设置都要靠它,它不仅可以设置参数,也可以作为只读参数来读取,甚至可以作为命令,基本是无所不能了。
01 ISDU总览
ISDU与PD数据不同,在请求的状态下才会发起,一般由主站发起相关请求,比如读ISDU和写ISDU。
ISDU的数据可以和PD数据一起传输,即在发送PD数据的同时发送ISDU数据,考虑到PD数据的及时性,ISDU作为OD数据,并非一次性发送完毕,而是把数据拆分到多个循环中,发送完毕由接收端来组装数据报文。
规范规定,ISDU的最大长度为231字节,这是一个很奇怪的数字。反正它一定得小于256。
ISDU的通用结构
ISDU中对参数的标识采用了Index和subindex的组合,index的取值范围从0x0000~0xFFFF,不过大部分都是被规范做了保留和定义,用户能自定义用的范围只有0x40~0xFE以及0x0100~0x3FFF。
虽然范围有限,但绝对绰绰有余了,下图就是一个大概的划分。
规范划分ISDU为2大部分,一部分是系统预定义的,index从0x02到0x3F;另一部分属于客户自定义ISDU区域以及行规使用的范围。
⭐️系统参数(System)
0x02~0x0F 系统参数使用
⭐️客户标识(Identification)0x10~0x1F 客户的标识信息等
⭐️诊断信息(Diagnosis)
0x20~0x27 从站的诊断信息
⭐️行规参数(Profile)
0x31~0x3F从站行规使用,比如SSP
⭐️建议区域(Preferred)
0x40~0xFE 从站设备首选的自定义ISDU空间
⭐️扩展区域(Extended)
0x0100~0x3FFF 可以可使用的扩展区域
⭐️行规指定(Profile specific)
0x4000~0x4FFF 从站行规使用,比如SSP
02 ISDU的结构
ISDU分为读/写两个操作,这个和前面所讲的报文的读写是两个概念。报文的读写是指OD是主站发出还是从站发出,而ISDU的读写就是我把参数设置到从站内,还是从从站读取ISDU数据。
无论是读ISDU还是写ISDU,一开始都是写方向的报文,可以理解为给从站发送命令,因为读写ISDU就是一个命令。
命令发送完毕,就是读报文,这时候可能是读取ISDU的具体数值,也可能是从站对写ISDU的确认报文,这些报文是由从站发给主站的,所以是读操作。
理解完读写ISDU的命令后,我们看详细的报文结构
I-Service作为ISDU的第一个报文的前4个bit,规定了读写方向和具体的模式,有用的就3个写,3个读,还有一个no service。我们简化它就是如下的公式:
因为长度既用了第一个字节的后4bit,考虑到231字节的ISDU,又用了一个字节,导致感觉IO-Link又想节约字节,但又没有节约到位,增加了协议栈的复杂性。
如下图所示,这个ExtLength是若隐若现,犹抱琵琶半遮面;有时候有,有时候又没有,所以造成一个怪现象,你会发现,length这个字段从来没有16这个数值。
length是一个感觉鸡肋的一个定义,现在这个index和subindex又是类似的,你这统一定义有index和subindex不就完了吗,非得定义一会有,一会没有,增加代码开发复杂度,又没有感觉字节节约到哪里去。下图给一个直观的感受。
03 ISDU的FlowCtrl机制
ISDU比较重要的一个机制是FlowCtrl机制,即当一个ISDU需要通过多个M-Sequence来传输时,需要流控进行消息计数。
每次传输完一段数据,FlowCtrl就需要+1,如果FlowCtrl没有变化,说明上个传输的数据对端没有收到或者收到数据有误,需要重发。主站是ISDU的发起方,因此主站需要通过ISDU的数据长度和FlowCtrl两个组合进行传输完整性的判断。
FlowCtrl的详细定义如下:
简化了看就是如下图:
ISDU的通道是0x11,结合读写位和地址位的首位,有如下几个组合:
🔑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的命令,这个命令就是读取序列号
💥第二行,主站要读取从站的回应了,这时候从站尚未回应,则返回系统忙
💥第三行,主站再次读取从站的ISDU回应,这时候从站准备好数据,准备输出,按照ISDU res+的格式回应。
首先是D113 表示正确回应,字节数在19个。后续跟着相关数据。30 31 34 38 34 32 表示ASCII,转换成字符串就是01 48 42,最后一个2E是校验码。
💥第四行和第五行就是接着第三行没有输出完的数据继续输出。前面两个字节,E1 70和E2 40都是主站发出的数据,表示继续读取从站的数据。
💥整体ISDU回应的数据就是01 48 42 52 b0 00 02 D9 。
结语
OK,本篇详细介绍了ISDU的报文结构以及读写的示例,下篇就ISDU的状态机做个简单的介绍,期待各位看官持续关注!

提交
睿远研究院丨IO-Link OD模块解析
睿远研究院丨IO-LinkPD处理模块
睿远研究院丨IO-Link M序列解析
睿远研究院丨IO-Link消息处理模块
睿远研究院丨IO-Link主从状态机解析