睿远研究院丨IO-Link主从状态机解析
前言
书接上文,今天我们就来好好聊聊主从站的DL-Mode状态机,还请各位童鞋前排坐好!
01 主站状态机解析
主站的DL-Mode状态机有5个大状态,也是我们很熟悉的建立通信、开始、预操作、操作状态,各个状态之间通过一些命令来切换。
我们看一下每个事件的详细动作:
1 T1
从Idle_0到EstablishComm_1。清除wakeup的重试次数为0
2 T2~T4
从EstablishComm_1到Startup_2。依次以COM3~COM1来传出,一旦传输成功,则激活消息处理程序并配置为COMx
3 T5
从EstablishComm_1到Idle_0。三个速率都未成功,则退回Idle状态,并通知SM模块进入INACTIVE
4 T6
从Startup_2到Preoperate_3。SM模块请求PREOPERATE状态。激活OD、ISDU、Event三个模块进入Active状态,将MSG处理模块切换到PREOPERATE状态
5 T7
从Preoperate_3到Startup_2。 SM模块请求STARTUP状态。将MSG处理模块切换到STARTUP状态,去激活OD、ISDU、Event三个模块,返回STARTUP状态给SM模块
6 T8
从Preoperate_3到Idle_0。去激活所有处理程序,返回INACTIVE状态给系统管理
7 T9
从Preoperate_3到Idle_0。MSG检测到通信中断,则去激活所有处理程序,通知SM模块相关状态
8 T10
从Preoperate_3到Operate_4。 SM模块请求OPERATE状态。激活PD处理程序,将MSG处理模块切换到OPERATE状态;通知SM模块,DL已经进入OPERATE状态
9 T11
从Startup_2到Operate_4。 SM模块请求OPERATE状态。激活OD、ISDU、Event三个模块,将MSG处理模块切换到OPERATE状态
10 T12
从Operate_4到Startup_2SM模块请求STARTUP状态。将MSG处理模块切换到STARTUP状态,去激活OD、ISDU、Event三个模块,返回STARTUP状态给SM模块
11 T13
从Operate_4到Idle_0。SM模块设置SIO模式,去激活相关模块,返回INACTIVE状态
12 T14
从Operate_4到Idle_0。 MSG处理模块通过SM模块,与从站通信中断。去激活所有处理程序,返回COMLOST状态给SM模块
02 从站状态机解析
从站的状态机,看起来是不是和主站的很类似,但从站由于是被动式等待,它不像主站有主动发送3次报文的建立通信过程,它直接等待主站发送某一个速率的报文,一旦匹配就建立连接。其他三个状态和主站基本一致,它的切换主要是主站来发起切换命令。具体的事件如下:
1 T1
从Idle_0到EstablishComm_1,当检测到唤醒电流脉冲时,激活消息处理模块并切换状态;DL_Mode切换到ESTABCOM状态,通知SM模块
2 T2
从EstablishComm_1到Startup_2,当成功建立COM3、COM2或COM1模式中的任意一个传输速率时,切换状态。激活OD和Command模块,DL_Mode切换到COM1、COM2或者COM3,通知SM模块进行Mode的切换
3 T3
从Startup_2到Preoperate_3,当收到MCmd_PREOPERATE命令时,切换状态;当检测到非法的M序列类型时,返回到Startup_2状态
4 T4
从Preoperate_3到Operate_4,当收到MCmd_OPERATE命令时,切换状态;激活PD处理模块,DL_Mode通知SM模块
5 T5
从Startup_2到Operate_4,当收到MCmd_OPERATE命令且设备支持V1.0模式时,切换状态到Operate_4;激活PD处理模块,ISDU处理模块,Event处理模块,DL_Mode通知SM模块
6 T6
从Preoperate_3到Startup_2,当收到MCmd_STARTUP命令时,将状态设置为Startup_2;去使能ISDU、Event模块
7 T7
从Operate_4到Startup_2,当收到MCmd_STARTUP命令时,将状态设置为Startup_2;将模块(PD、ISDU、Event)置为非活动状态
8 T8
从Preoperate_3到Idle_0,当收到MCmd_FALLBACK命令时,等待TFBD的时间,然后将所有模块置为非活动状态,状态设置为Idle_0
9 T9
从Operate_4到Idle_0,当收到MCmd_FALLBACK命令时,等待TFBD的时间,然后将所有模块置为非活动状态,状态设置为Idle_
10 T10
从EstablishComm_1到Idle_0,当唤醒过程失败后,经过一段时间TDSIO后,从站进入SIO模式,将所有模块置为非活动状态,状态设置为Idle_0
11 T11
从Operate_4到Startup_2,当消息处理模块(MessageHandler)检测到非法的M序列类型时,将模块(PD、ISDU、Event)置为非活动状态,状态设置为Startup_2。DL_Mode通知SM模块进入Startup状态
12 T12
从Preoperate_3到Startup_2,当消息处理模块(MessageHandler)检测到非法的M序列类型时,将ISDU和Event handler置为非活动状态,状态设置为Startup_2;DL_Mode通知SM模块进入Startup状态
写在最后
如果大家正在使用睿远的从站协议栈,应该会发现其中有两个判断DL-Mode的函数:
第一个是判断当前是否为idle阶段,如果是idle阶段,在收到唤醒报文后,开始尝试建立连接;另一个就是判断当前DL的Mode是在哪个阶段,方便用户判断当前状态。
好了,本篇把主站和从站的DL-Mode状态机详细解析了一遍,相信大家对DL-Mode这个模块应当会更加熟悉了。下一期,我们就开始介绍最最重要的,IO-Link的消息模块。

提交
睿远研究院丨IO-Link数据链路层解析
睿远研究院丨IO-Link物理层编码解析
【睿远研究院】IO-Link物理层概览
IO-Link通信技术概述
睿远研究院丨IO-Link规范解读