时间逻辑运算符
*时间逻辑运算符*是指定有限自动机必须执行的时刻的机制 某些Julia语言运算符,并设置在条件之前/内部和状态中的转换处:
使用它们的地方 |
例子: <.^/在转换、内部条件以及方括号中指定的内部操作上 |
例如,使用时态逻辑运算符和"on"运算符组,您可以随时间更改变量的值。:
这里:
-
'en,du:y=x—-当进入状态A且处于活动状态时,变量’y’被赋值’x'。 立即执行此操作,并在状态处于活动状态时重复执行此操作。
-
'on after(2.5,sec):y=0`—如果状态A处于活动状态`2.5`或更多秒,则`y`变为'0`。
-
'on after(5,sec):y=-1—-如果状态A处于活动状态 `5’或更多秒,则`y’变为等于'-1'。
以下时态逻辑运算符在*Engee中可用*:
-
'后`—在设定数量的操作或时间后触发。 例如,'after(5,sec)'在当前状态开始后激活转换`5`秒;
-
`在'—它在特定步骤触发。 例如,当关联状态有一组`during`语句执行第十次(从一个开始计数)时,`at(10,tick)'在步骤中将为true;
-
"之前`-保持为真,直到达到某个时间点或状态机的时钟周期数。 例如,`before(3,sec)'被触发,直到自关联状态激活以来已经过了'3’秒;
-
`伯爵'-计数自参数中的布尔表达式变为true以来状态块被执行的次数。 例如,命令’on at(10,tick):y=count(true)
将将值`10`赋给变量`y
,如果状态在状态机的`10`步骤期间处于活动状态。; -
"持续时间`是`count`运算符的模拟,但它不是返回步数,而是返回指定布尔表达式保持true的时间。 例如,命令’on after(10,sec):y=duration(true,sec)'将为变量`y`赋值,如果状态在激活后的`10`秒后仍然处于活动状态,则该值将大于`10`;
-
[elased-et]—返回自进入当前状态以来经过的时间。 例如,如果状态已激活两秒或更长时间,则`et>=2`将为true。;
-
`每一个'-在状态机的设定步骤数之后触发,而关联的状态保持活动状态。 例如,如果关联状态为"10"步处于活动状态,则"on every(3,tick):y+=1"将使变量"y"连续递增1三次。
-
't,getSimulationTime`-返回当前模拟时间。 例如,如果仿真时间达到"10"秒,则"t>=10"为真。;
-
'临时计数`是一个计数器,可帮助您跟踪状态机已完成多少步骤或状态保持活动状态时已过了多少时间。 例如,调用’temporalCount(tick)`将显示状态机处于此状态的步骤数。 并且使用’temporalCount(sec)`将返回自激活此状态以来已经过了多少秒。
'后`
*after*是在转换上实现时态逻辑的运算符。 它有两个看涨期权:
语法 | 资料描述 | 例子: |
---|---|---|
'after(n,tick)`传递:q[<br>]`n`是正整数或表达式。 |
如果关联状态在激活后至少`n`个时钟周期内保持活动状态,则返回`true'。 否则,它返回’false'。 |
after(3,tick)[x>3] 当块在状态变为活动状态后至少被激活三次时,从当前状态退出,前提是’x>3'。 |
'after(n,sec) |
如果自当前状态变为活动状态以来至少经过了`n`个时间单位,则返回`true'。 否则,它返回’false'。 |
[after(1,tick) || x > 5] after(10,tick)[x > 5] after(n, tick){y = 20;} after(2, sec)[x < 3]{y = 0;} 为了更好地理解给出的示例,请考虑:
如果变量`x`的值大于`10`并且自转换开始以来已经`4`秒,那么变量`y`的值增加一。 |
`在'
*at*是检查某个动作是否在某个时间点发生的运算符。 它具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
`at(n,tick)'传递:q[<br>]'n’是正整数或表达式。 |
如果关联状态从激活之日起整整`n`个时钟周期保持活动状态,则返回`true'。 否则,它返回’false'。 |
at(5, tick)[y < 3] 为了更好地理解给出的示例,请考虑:
如果,在从关联状态激活的时刻起的第4个时钟周期的执行期间,变量`x`的值原来小于`7`,那么变量`y`将被赋值`8`。 |
"之前`
*before*是检查动作是否在指定时间之前发生的运算符。 它具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
'before(n,sec) |
如果自当前状态变为活动状态以来经过的时间单位少于"n",则返回"true"。 否则,它返回’false'。 |
before(3, sec)[x < 5] 如果状态激活后不到3秒,则会发生转换,前提是’x<5'。 |
'before(n,tick)'传递:q[<br>]'n’是正整数或表达式。 |
如果关联状态从激活之日起保持活动状态少于`n`个时钟周期,则返回`true'。 否则,它返回’false'。 |
before(4, tick)[y > 2] before(n, sec){z = 0;} before(1, msec)[x != 10]{y = 2;} 为了更好地理解给出的示例,请考虑:
如果自状态激活以来已经过了少于`5`秒并且变量`x`的值大于或等于`8`,则发生转换。 |
`伯爵'
*count*是一个运算符,它计算从传递的布尔表达式变为真的那一刻起关联状态块的执行次数。 *Count*运算符具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
'count(condition)'传递:q[<br>]'condition’是一个布尔表达式。 |
返回自表达式’n’变为true以来,当关联状态保持活动状态时所经过的状态机时钟周期数。 |
[count(x > 2) = 3] 如果变量`x`的值自关联状态激活以来一直保持两个以上的"3"时钟周期,则会发生转换。 |
"持续时间`
*持续时间*是一个运算符,用于检查特定条件保持为真的时间。 *Duration*运算符具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
'duration(condition)' |
返回自"条件"变为true以来经过的时间单位数。 如果条件为false,则返回'0'。 |
duration(x > 5) > 3 如果自`x`变为超过`5`以来已经过去了超过`3`秒,则会发生转换。 |
"过去了,等等`
*elapsed(et)*是一个运算符,用于跟踪自激活状态以来经过了多少时间。 *Elased*运算符具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
'et(sec)` 'et(msec)` 'et(usec)` 或 "经过(秒)` '经过(msec)` '经过(usec)` |
返回自关联状态变为活动状态以来经过的时间单位数。 |
elapsed(sec) >= 3 如果状态激活后已经过了3秒或更长时间,则会发生转换。 |
`每一个'
*every*是一个运算符,可帮助您以指定的频率执行操作。 它具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
'every(n,tick)`传递:q[<br>]`n`是正整数或表达式。 |
如果自关联状态激活以来经过的时钟周期数是"n"的倍数,则返回"true"。 |
every(3, tick) 为了更好地理解给出的示例,请考虑:
如果自关联状态的激活以来每四个时钟周期,变量`a`的值小于`5`,则将值`10`分配给变量`b`。 |
't,getSimulationTime`
*t(getSimulationTime)*是跟踪当前仿真时间的运算符。 它具有以下语法:
语法 | 资料描述 | 例子: |
---|---|---|
't` 或 "传真时间` |
返回自模拟开始以来的时间(以秒为单位)。 |
t >= 5 如果当前仿真时间已达到5秒或更长时间,则会发生转换。 |