前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IO-Link通信笔记(三)——M序列与M序列类型

IO-Link通信笔记(三)——M序列与M序列类型

原创
作者头像
京畿提督
发布2024-06-21 11:45:11
810
发布2024-06-21 11:45:11
举报
文章被收录于专栏:IO-LinkIO-Link

从这一期开始,笔者将开始深度剖析IOL内部各部分内容,将尽可能地把其功能、重点、注意事项等介绍清晰,方便各位开发者的理解。

一、M序列

在上一节中各位开发者已经知道,M序列是IOL通信过程中主从见信息交互的最小报文单元,包含了一条主站发出的报文和一条从站回复的报文。这些报文中携带的信息指示主站想要执行的动作或者表示从站携带信息的含义。这里来解释一下M序列中各个字节的功能。

·M序列控制字(MC)

该字节是从主站发出的第一个字节,包含一位读\写方向、两位通信通道、五位索引地址

b7

b6

b5

b4

b3

b2

b1

b0

R\W

channel

address

address

address

address

address

address

bit0-4:address-通信地址或数据流计数

在进行直接参数页的读取或写入过程时,用来对直接参数页1与2的字节地址进行索引。bit4 = 0时,bit0-3这四位共16个地址数就是索引直接参数页1的16个数据;bit4 = 1时,bit0-3这四位共16个地址数就是索引直接参数页2的16个数据。

在进行ISDU通信时,bit0-3这四位则变成ISDU数据流的累加计数,从0累加到15再循环。bit4则表示状态控制,配合bit0-3组合成不同的状态指令,指示当前是准备开始还是等待连接等。

bit5-6:channel-通信通道

这两位指示主站当前要对哪一个通信通道进行操作。因为IOL协议字节资源有限并且部分内容并不需要很频繁地交互。因此,设置了通信通道,根据当前要操作的通信通道,在有限的字节内就可以携带不同内容的数据。

00-过程数据;主站当前无任何需求,从站只需要周期上报PD

01-直接参数页;主站将要索引直接参数

10-事件诊断;主站获知从站上报事件,将要获取详细事件信息

11-ISDU;参数读写交互

bit7:R\W-读写方向

主站指示从站,当前主站要进行的操作方向

0-写入 1-读取

·M序列类型与主站校验和(CKT)

该字节是主站发出的第二个字节,携带了两位的M序列类型检查指示代码和六位校验和。其中M序列类型指示代码用来让从站检查主站使用的M序列类型是否与从站使用的M序列类型一致,若不一致从站会忽略主站发来的一切数据,也就无法建立稳定的连接。六位的校验和则是一个特殊的求和校验,主从之间都要满足相同的规则,一旦计算得到的校验和不匹配,设备将舍弃数据。校验和的计算方法会在下一期文章中详细说明。

b7

b6

b5

b4

b3

b2

b1

b0

M-Type

M-Type

checksum

checksum

checksum

checksum

checksum

checksum

bit0-5:checksum

整条序列多有字节计算得到的校验和

bit6-7:M序列类型指示代码

00-type0 01-type1 10-type2 11-保留

·从站状态与从站校验和(CKS)

该字节是从站回复的消息序列最后一个字节。携带了一位事件发生标志位、一位PD有效位、六位校验和。

b7

b6

b5

b4

b3

b2

b1

b0

Event Flag

PD status

checksum

checksum

checksum

checksum

checksum

checksum

bit0-5:checksum

与主站CKT字节的checksum相同计算方法得到的校验和

bit6:PD status-PD数据有效指示为

该位如果为0,则表示从站可以提供有效的的PD。如果该位为1,则表示整个通信周期内的从站提供的所有PD都是无效的。

0-PD有效 1-PD无效

bit7:Event flag-事件发生标志位

该位是从站向主站上报的,指示从站当前有事件发送,需要主站立即将通信通道切换到事件通道,从设备中读取当前发生的事件详细信息并做出相应的处理。这对设备正常工作极其有必要。

0-没有事件发生 1-有事件发生

二、M序列类型

在知道了M序列各个字节功能之后,就该来认识一下主从之间数据到底是以什么样的格式交互的。IOL提供了多种M序列类型,开发者根据开发设备的需要,选择合适的M序列类型,满足不同的交互需求。

M序列的常规格式为:

主站:MC+CKT+OD_n+PDout_n

从站:OD_n+PDin_n+CKS

这里值得注意的是,PD数据在主站和从站中,会有额外的角标in或者out。这些角标指示PD数据的传输方向。所有PD数据均以主站为目标,PDout为主站发出的PD数据(主站–>从站),PDin为主站接收的PD数据(从站–>主站)。至于“_n”则表示字节数量,若没有数量角标则表示一个字节。

M序列类型Type_0:

Type_0这个序列类型是所有设备都应该支持的最基本类型。该类型只互相传输一个字节的OD,没有PD。正因为该类型没有PD,设备运行结果不能立即获取,都需要主站完成一次ISDU传输后才能得到,具有一定的滞后性,因此虽然该类型是设备应该支持的最基本类型,绝大多数设备却不会使用该类型。

格式:

主站读:MC+CKT

从站回:OD+CKS

主站写:MC+CKT+OD

从站回:CKS

M序列类型Typ_1_x:

Type_1_1:

该类型互相传输两个字节的PD,没有OD,整个PD左侧高位右侧低位,若PD携带的数据为大于8bit,则PDin_1为高字节PDin_2为低字节。正因为该类型不支持传输OD,也使得该类型不能完成常规意义上的ISDU交互。ISDU是要在OD字节上依次携带信息,来指示ISDU服务的目标地址和数据内容,若没有OD的支持,这些信息就没办法实现,因此,该类型适合参数很少,仅使用直接参数页2作为参数交互的设备。

格式:

主站读:MC+CKT

从站回:PDin_1+PDin_2+CKS

主站写:MC+CKT+PDout_1+PDout_2

从站回:CKS

Type_1_2:

该类型与Type_0类似,也是只传输OD,区别是,该类型传输两个字节的OD,没有PD。值得注意的是,在进行页和诊断通信通道传输过程中,只关注第一个OD字节,其余字节的OD用0x00占位。

格式:

主站读:MC+CKT

从站回:OD_1+OD_2+CKS

主站写:MC+CKT+OD_1+OD_2

从站回:CKS

Type_1_V:

该类型是可变消息长度的M序列,其只传输OD,但是OD的字节数量是可以发生改变的,每个周期交互m字节。值得注意的是,在进行页和诊断通信通道传输过程中,只关注第一个OD字节,其余字节的OD用0x00占位。

虽然该类型叫可变长度的M序列,但是实际上,它的长度只可以在8和32这两个长度之间变化,并且定义的变化也并非是在运行过程中任何时候都可以发生变化,而是由开发人员在设备出厂之前,从程序中预先定义好长度,在连接主站后,主站通过获取从站的信息来知道应用的Type_1_V的具体OD字节数量是8还是32。也就是说,完全可以将其理解为,加长版的Type_0。

格式:

主站读:MC+CKT

从站回:OD_1+OD_2+…+OD_m+CKS

主站写:MC+CKT+OD_1+OD_2+…+OD_m

从站回:CKS

代码语言:javascript
复制
#if ((OD_LEN_OPERATE != 8)&&(OD_LEN_OPERATE != 32))
  #error For M-sequence type 1_V, OD_LEN_OPERATE must be 8 or 32
#endif
​
#if ( (OD_LEN_PREOPERATE != 8)&&(OD_LEN_PREOPERATE != 32) )
  #error: For M-Sequence TYPE_1_V in pre-operate mode 8 or 32 bytes of on-request data must be specified
#endif

M序列类型Type_2_x:

Type_2_x是市面上大多数智能传感器设备选择的M序列类型,因为这一系列类型中,会同时携带若干字节的OD和若干字节的PD,既能实现ISDU传输满足较大参数的读写,又可以实时上报设备的过程数据,使用起来最为方便。

Type_2_1:

该类型每个周期传输一个字节的PDin和一个字节的OD

格式:

主站读:MC+CKT

从站回:OD+PDin+CKS

主站写:MC+CKT+OD

从站回:PDin+CKS

Type_2_2:

该类型每个周期携带两个字节的PDin和一个字节的OD。该类型也是较为常见的使用类型,足以满足绝大多数设备的工况。

格式:

主站读:MC+CKT

从站回:OD+PDin_1+PDin_2+CKS

主站写:MC+CKT+OD

从站回:PDin_1+PDin_2+CKS

Type_2_3:

该类型携带一个字节的PDout和一个字节的OD

格式:

主站读:MC+CKT+PDout

从站回:OD+CKS

主站写:MC+CKT+PDout+OD

从站回:CKS

Type_2_4:

该类型携带两个字节的PDout和一个字节的OD

格式:

主站读:MC+CKT+PDout_1+PDout_2

从站回:OD+CKS

主站写:MC+CKT+PDout_1+PDout_2+OD

从站回:CKS

Type_2_5:

该类型携带一个字节的PDout、一个字节的PDin、一个字节的OD

格式:

主站读:MC+CKT+PDout

从站回:OD+PDin+CKS

主站写:MC+CKT+PDout+OD

从站回:PDin+CKS

Type_2_6:

该类型携带两个字节的PDout、两个字节的PDin、一个字节的OD

格式:

主站读:MC+CKT+PDout_1+PDout_2

从站回:OD+PDin_1+PDin_2+CKS

主站写:MC+CKT+PDout_1+PDout_2+OD

从站回:PDin_1+PDin_2+CKS

Type_2_v:

该类型携带n个字节的PDout、m字节的PDin、k字节的OD。其中n和m的范围是0-32,k的取值范围为1、2、8、32。与Type_1_v一样,虽然名义上是可变长度的M序列,但是其长度都是要在程序内预先定义好,在建立联系的时候主站获取从站的M序列类型与字节数量,而不像MODBUS那样报文内有专门的字节指示本条序列一共有多少个字节来实现动态可变。

格式:

主站读:MC+CKT+PDout_1+PDout_2+…+PDout_n

从站回:OD_1+OD_2+…+OD_k+PDin_1+PDin_2+…+PDin_m+CKS

主站写:MC+CKT+PDout_1+PDout_2+…+PDout_n+OD_1+OD_2+…+OD_k

从站回:PDin_1+PDin_2+…+PDin_m+CKS

M序列类型Type_3:

该序列类型暂不支持。


以上是本节的全部内容,如果各位读者仍然存在疑惑可以私信发送问题,笔者会一一解答并积累一期文章的内容更新出来。

笔者内容也许会存在错误,欢迎志同道合的开发者一起讨论。我们共同进步!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、M序列
    • ·M序列控制字(MC)
      • ·M序列类型与主站校验和(CKT)
        • ·从站状态与从站校验和(CKS)
        • 二、M序列类型
          • M序列类型Type_0:
            • M序列类型Typ_1_x:
              • Type_1_1:
              • Type_1_2:
              • Type_1_V:
            • M序列类型Type_2_x:
              • Type_2_1:
              • Type_2_2:
              • Type_2_3:
              • Type_2_4:
              • Type_2_5:
              • Type_2_6:
              • Type_2_v:
            • M序列类型Type_3:
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档