工控网首页
>

应用设计

>

睿远研究院丨IO-Link ISDU详解

睿远研究院丨IO-Link ISDU详解

2025/7/16 17:25:01

前言

很快又是一周,今天我们来好好聊聊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的取值范围从0x00000xFFFF,不过大部分都是被规范做了保留和定义,用户能自定义用的范围只有0x400xFE以及0x0100~0x3FFF

虽然范围有限,但绝对绰绰有余了,下图就是一个大概的划分。

图片

规范划分ISDU为2大部分,一部分是系统预定义的,index从0x020x3F;另一部分属于客户自定义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 70E2 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主从状态机解析