5 状态机

5 状态机

EtherCAT主站的许多部分都是以有限状态机(FSM)来实现的。虽然这导致在某些方面增加了复杂性,但是也提供了许多新的可能性。

下面的短代码示例表明了如何读取所有从站状态,并且还说明了“顺序化”编程的限制。

1   ec_datagram_brd( datagram , 0x0130 , 2); // prepare datagram
2   if( ec_master_simple_io (master , datagram )) return -1;
3   slave_states = EC_READ_U8 ( datagram -> data ); // process datagram

ec_master_simple_io()函数提供了一个简单的接口,用于同步发送单个数据报并接收其结果1。 在内部,它将指定的数据报进行排队,调用ec_master_send_datagrams()函数发送一个带有队列数据报的帧,然后主动等待其接收。

这种顺序化方法非常简单,仅反映在三行代码中。 缺点是,主站在等待数据报接收的时间内被阻塞。 当只有一个实例使用主站时并没有困难,但是如果更多的实例想(同步地)使用主站,则不可避免地要考虑顺序化模型的替代方案。

如果希望多个实例同步发送和接收数据报,必须对主站访问进行顺序化。 使用现在的方法,将导致每个实例都要有一个动态等待的阶段,由于巨大的时间开销,尤其在实时环境中,这是不可接受的。

一种可能的解决方案是,顺序化地执行所有实例,以对其数据报进行排队,然后将控制权提供给下一个实例,而不是等待数据报接收。 最后,总线IO由更高等级的实例完成,这意味着所有排队的数据报都被发送和接收。 下一步是再次执行所有实例,然后处理它们接收的数据报并发出新的数据报。

使用这种方法的结果是所有实例在将控制权返回到较高等级的实例时必须保持它们的状态。 显而易见,在这种情况下应当使用有限状态机模型。 第5.1节将介绍一些用到的理论,而下面的列表显示了通过将上面的示例编写为状态机的基本方法:

1   // state 1
2   ec_datagram_brd ( datagram , 0x0130 , 2); // prepare datagram
3   ec_master_queue (master , datagram ); // queue datagram
4   next_state = state_2 ;
5   // state processing finished

在所有的实例执行它们的当前状态并且将它们的数据报进行排队之后,数据报将被发送和接收。 然后执行各自的下一状态:

1   // state 2
2   if ( datagram -> state != EC_DGRAM_STATE_RECEIVED ) {
3   next_state = state_error ;
4   return; // state processing finished
5   }
6   slave_states = EC_READ_U8 ( datagram -> data ); // process datagram
7   // state processing finished .

有关主站代码中使用的状态机编程概念的介绍,请参见第5.2节。

5.1 状态机理论

有限状态机[9]是一种具有输入和输出的行为模型,其中输出不仅取决于输入,还取决于输入的历史。有限状态机(或有限自动机)的数学定义是一个六元组(Σ,Γ,S,s0,δ,ω),其中

  • 输入字母表Σ,其中Σ ≠ ∅,包含所有输入符号,
  • 输出字母表Γ,其中Γ ≠ ∅,包含所有输出符号,
  • 状态集合S,其中S ≠ ∅,
  • 初始状态集合s0,其中s0⊆S; s0 ≠ ∅,
  • 转移函数δ:S×Σ → S×Γ
  • 输出函数 ω。

状态转移函数δ通常由状态转移表或状态转移图指定。转移表提供了状态机行为的矩阵视图(见表5.1)。矩阵的行对应于状态(S = {s0,s1,s2}),列对应于输入符号(Γ= {a,b,ε})。某一行i和列j中的内容表示在状态si中读取某个输入符号σj的情况下的下一状态(以及可能的输出)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值