睿远研究院丨IO-Link规范解读(十):ISDU详解

电子说

1.4w人已加入

描述

前言

今天我们来好好聊聊ISDU。ISDU是Indexed service data unit的缩写,这个名字吧,也怪奇怪的,直接翻译叫索引服务数据单元,听起来更是怪怪的,小编更喜欢直接称他为从站的参数。传感器的各项参数设置都要靠它,它不仅可以设置参数,也可以作为只读参数来读取,甚至可以作为命令,基本是无所不能了。

1

ISDU总览

ISDU与PD数据不同,在请求的状态下才会发起,一般由主站发起相关请求,比如读ISDU和写ISDU。

ISDU的数据可以和PD数据一起传输,即在发送PD数据的同时发送ISDU数据,考虑到PD数据的及时性,ISDU作为OD数据,并非一次性发送完毕,而是把数据拆分到多个循环中,发送完毕由接收端来组装数据报文。

规范规定,ISDU的最大长度为231字节,这是一个很奇怪的数字。反正它一定得小于256。

——ISDU的通用结构——

IO-Link收发器

ISDU中对参数的标识采用了Index和subindex的组合,index的取值范围从0x0000~0xFFFF,不过大部分都是被规范做了保留和定义,用户能自定义用的范围只有0x40~0xFE以及0x0100~0x3FFF

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

IO-Link收发器

规范划分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

2

 ISDU的结构

ISDU分为读/写两个操作,这个和前面所讲的报文的读写是两个概念。报文的读写是指OD是主站发出还是从站发出,而ISDU的读写就是我把参数设置到从站内,还是从从站读取ISDU数据。

无论是读ISDU还是写ISDU,一开始都是写方向的报文,可以理解为给从站发送命令,因为读写ISDU就是一个命令。

命令发送完毕,就是读报文,这时候可能是读取ISDU的具体数值,也可能是从站对写ISDU的确认报文,这些报文是由从站发给主站的,所以是读操作。

理解完读写ISDU的命令后,我们看详细的报文结构

IO-Link收发器

I-Service作为ISDU的第一个报文的前4个bit,规定了读写方向和具体的模式,有用的就3个写,3个读,还有一个no service。我们简化它就是如下的公式:

IO-Link收发器

因为长度既用了第一个字节的后4bit,考虑到231字节的ISDU,又用了一个字节,导致感觉IO-Link又想节约字节,但又没有节约到位,增加了协议栈的复杂性。

如下图所示,这个ExtLength是若隐若现,犹抱琵琶半遮面;有时候有,有时候又没有,所以造成一个怪现象,你会发现,length这个字段从来没有16这个数值。

IO-Link收发器

length是一个感觉鸡肋的一个定义,现在这个index和subindex又是类似的,你这统一定义有index和subindex不就完了吗,非得定义一会有,一会没有,增加代码开发复杂度,又没有感觉字节节约到哪里去。下图给一个直观的感受。

IO-Link收发器

3

ISDU的FlowCtrl机制

ISDU比较重要的一个机制是FlowCtrl机制,即当一个ISDU需要通过多个M-Sequence来传输时,需要流控进行消息计数。

每次传输完一段数据,FlowCtrl就需要+1,如果FlowCtrl没有变化,说明上个传输的数据对端没有收到或者收到数据有误,需要重发。主站是ISDU的发起方,因此主站需要通过ISDU的数据长度和FlowCtrl两个组合进行传输完整性的判断。

FlowCtrl的详细定义如下:

IO-Link收发器

简化了看就是如下图:

IO-Link收发器

ISDU的通道是0x11,结合读写位和地址位的首位,有如下几个组合:

0xFx(1111xxxx):

写ISDU命令(start/IDLE)

0xEx(1110xxxx):

写ISDU命令(count)

0x7x(0111xxxx):

读ISDU命令(Start/IDLE)

0x6x(0xx0xxxx):

读ISDU命令(count)

举例来看:

IO-Link收发器

第一行 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的状态机做个简单的介绍,期待各位看官持续关注!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分