SFC 中动作的限定符
您可以为与步关联的 IEC 动作分配限定符。限定符定义了相应动作的执行行为,即以何种方式、何时以及执行多长时间。
限定符由库IecSfc.library中的功能块SFCActionControl处理。一旦安装了CODESYS SFC,该库就会自动集成到项目中。
有关更多信息,请参阅:使用 SFC 编程
| 非存储 | 只要步处于激活状态,该动作就处于激活状态。 |
| 优先复位 | 以 |
| 置位(存储) | 一旦步变为激活,即执行该动作。即使在步被停用之后,动作仍会继续执行,直到被复位。 |
| 时间限制 | 一旦步变为激活,即执行该动作。该动作一直执行,直到步被停用或指定的时间段结束。 |
| 时间延迟 | 如果在步变为激活之后指定的延迟时间已经结束,并且该步仍处于激活状态,则执行该动作。该动作一直执行,直到步被停用。 |
| 脉冲 | 该动作恰好执行两次:一次是在步变为激活时,另一次是在步被停用时。 |
| 存储且时间延迟 | 只有在步变为激活之后指定的延迟时间结束时,才开始执行该动作。该动作一直执行,直到被复位。 |
| 延迟且存储 | 只有在步变为激活之后指定的延迟时间结束并且该步仍处于激活状态时,才开始执行该动作。该动作一直执行,直到被复位。 |
| 存储且时间限制 | 一旦步变为激活,即执行该动作。该动作一直执行,直到指定的时间结束或被复位。 |
注意
带有限定符S、SD、DS或SL的动作在步变为非激活之后会继续运行。
对于限定符S、SD和DS,只有以R限定符对同一动作进行复位调用时,该动作才会结束。这种调用是结束该动作所必需的。
对于SL限定符,该动作在指定的时间结束后自动结束,或者通过以R进行的调用提前结束。
您必须以TIME常量的格式为L、D、SD、DS和SL限定符指定时间。
有关如何应用限定符的更多信息,请参阅:限定符示例。
提示
IEC 动作被停用时,还会再执行一次。这意味着CODESYS至少执行此类动作两次。这同样适用于带有P限定符的动作。
限定符示例
本节包含如何使用限定符的示例。
示例:通风系统中的排烟
动作的限定符决定该动作何时开始以及运行多长时间。本示例以顺序功能图(SFC)的三种实现方式展示同一个过程。这些实现方式的区别在于限定符的使用。
初始情况:通风系统使用烟雾传感器监视空气。当传感器检测到烟雾时,控制器立即启动排烟。
带有N限定符的 POU

该 POU 包含最简单的流程。当烟雾传感器检测到烟雾时,带有Ventilate动作的步变为激活。该步以N限定符调用该动作。只要传感器检测到烟雾,排烟就会运行。
以 SFC 创建一个 POU,并将名称更改为
Simple_N。有关更多信息,请参阅:以 SFC 创建 POU在所创建 POU 的声明部分中,创建以下布尔变量:
PROGRAM Simple_N VAR bSmokeDetected: BOOL; bVent: BOOL; END_VAR更改初始步的转移:点击该转移,然后使用输入助手
分配bSmokeDetected变量。在初始步的转移之后,添加一个名为
SmokeInSystem的步。更改
SmokeInSystem步的转移:点击该转移,然后使用输入助手
分配bSmokeDetected变量。添加NOT:NOT bSmokeDetected在设备树中,右键点击新创建的 POU
Simple_N,然后选择添加对象 → 动作...命令。指定名称Ventilate,并为实现语言设置结构化文本(ST)选项。在其中插入以下代码:
// The alternation simulates the running ventilator. bvent := NOT bvent;
点击
SmokeInSystem步,然后使用SFC → 插入关联动作命令添加动作关联。现在,N限定符将分配给关联的动作。
点击关联的右侧字段,然后使用输入助手
选择Ventilate动作。简单的排烟已设置完成。
带有两个N限定符的 POU

问题:系统中残留有少量烟雾。因此,排烟必须再运行5秒。
该 POU 通过一个附加步来处理后续运行时间。当烟雾传感器检测到烟雾时,带有Ventilate动作的步变为激活。该步以N限定符调用该动作。
当传感器不再检测到烟雾时,控制器切换到步NoSmokeMore。排烟继续运行。该步之后的转移以条件NoSmokeMore.t > t#5s评估隐式步变量。该变量包含该步已处于激活状态的时间。
5秒后,条件得到满足,该步变为非激活。Ventilate动作的执行也随之结束。
以 SFC 创建一个 POU,并将名称更改为
Advanced_N_N。有关更多信息,请参阅:以 SFC 创建 POU在所创建 POU 的声明部分中,创建以下布尔变量:
PROGRAM Advanced_N_N VAR bSmokeDetected: BOOL; bVent: BOOL; END_VAR更改初始步的转移:点击该转移,然后使用输入助手
分配bSmokeDetected变量。在初始步的转移之后,添加一个名为
SmokeInSystem的步。更改
SmokeInSystem步的转移:点击该转移,然后通过输入助手
分配变量bSmokeDetected。添加NOT:NOT bSmokeDetected在设备树中,右键点击新创建的 POU
Advanced_N_N,然后选择添加对象 → 动作...命令。指定名称Ventilate,并为实现语言设置结构化文本(ST)选项。在其中插入以下代码:
bvent := NOT bvent;
点击
SmokeInSystem步,然后通过菜单SFC → 插入关联动作插入动作关联。现在,N限定符将分配给关联的动作。
点击关联的右侧字段,然后使用输入助手
选择Ventilate动作。在
SmokeInSystem步的转移之后添加一个名为NoSmokeMore的步,并添加一个条件为NoSmokeMore.t > t#5s的转移。点击
NoSmokeMore步,然后使用SFC → 插入关联动作命令添加动作关联。现在,N限定符将分配给关联的动作。
点击关联的右侧字段,然后使用输入助手
选择Ventilate动作。5秒后,排烟将停止。
带有S和R限定符的 POU

问题:系统中残留有少量烟雾。因此,排烟必须再运行5秒。
在这里,控制器同样会立即启动排烟。SmokeInSystem步以S限定符调用Ventilate动作。但是,在NoSmokeMore步期间排烟会继续运行,因为该动作以S限定符存储,只有通过R才会结束。
该 POU 通过一个附加的NoSmokeMore步来解决后续运行时间问题。5秒后,条件得到满足,该步变为非激活。
附加的After_5sec步以R限定符调用Ventilate动作。该步复位该动作,从而在5秒后停止排烟。
以 SFC 创建一个 POU,并将名称更改为
Advanced_S_R。有关更多信息,请参阅:以 SFC 创建 POU在所创建 POU 的声明部分中,创建以下布尔变量:
PROGRAM Advanced_S_R VAR bSmokeDetected: BOOL; bVent: BOOL; END_VAR更改初始步的转移:点击该转移,然后使用输入助手
分配bSmokeDetected变量。在初始步的转移之后,添加一个名为
SmokeInSystem的步。更改
SmokeInSystem步的转移:点击该转移,然后通过输入助手
分配变量bSmokeDetected。添加NOT:NOT bSmokeDetected在设备树中,右键点击新创建的 POU
Advanced_S_R,选择添加对象 → 动作...命令。指定名称Ventilate,并为实现语言设置结构化文本(ST)选项。在其中插入以下代码:
bvent := NOT bvent;
点击
SmokeInSystem步,然后通过菜单SFC → 插入关联动作插入动作关联。点击关联的左侧字段,然后使用输入助手
选择S限定符。点击关联的右侧字段,然后使用输入助手
选择Ventilate动作。简单的排烟已设置完成。
5秒后停止排烟在
SmokeInSystem步的转移之后添加一个名为NoSmokeMore的步,并添加一个条件为NoSmokeMore.t > t#5s的转移。在
NoSmokeMore步的转移之后再添加一个名为After_5sec的步,并添加一个条件为TRUE的转移。点击
After_5sec步,然后使用SFC → 插入关联动作命令添加动作关联。点击关联的左侧字段,然后使用输入助手
选择R限定符。点击关联的右侧字段,然后使用输入助手
选择Ventilate动作。排烟将停止。