简介
在程序执行过程中,同步和异步指令有着显著不同。
“同步”和“异步”属性与指令调用与执行间的时间顺序相关。
以下情况适用于同步指令:同步指令调用完成时,指令执行也完成。
而异步指令,则情况有所不同:异步指令调用完成时,异步指令的执行不一定完成。这也就意味着,异步指令的执行可以跨多次调用。在 CPU 中,异步指令的执行与用户程序循环同时进行。异步指令在 CPU 中生成待处理的作业。
异步指令通常用于传输数据(例如,模块的数据记录、通信数据、诊断数据)。
同步/ 异步指令之间的不同之处
下图显示了异步指令和同步指令处理的不同之处。在该图中,CPU 在指令执行完成(如,完成传输数据记录)之前,调用该异步指令五次。
对于同步指令,每次调用时都会完全执行。
① 第一次调用异步指令,开始执行
② 中间调用异步指令,继续执行
③ 最后一次调用异步指令,执行完成
④ 每次调用后,作业会完全通过同步指令进行处理。
完全处理的作业的持续时间
异步指令作业的并行处理
CPU 可同时执行多个异步指令作业。在以下情况下,CPU 将并行执行多个作业:
● 用于异步指令的作业会启动,而该指令的其它作业仍在运行中。
● 但不超出该指令可同时运行的作业最大数目。
下图显示了 WRREC 指令中两个作业的并行处理。在一段时间内,两个指令同时执行。
为作业分配指令调用
要跨多个调用执行一个指令,CPU 需向该指令正在运行的作业唯一指定一个后续调用。
CPU 可通过以下两种方式为作业分配一个调用,具体取决于指令的类型:
● 使用指令的背景数据块(“SFB” 类型)
● 使用指令的作业标识输入参数。在异步指令的执行过程中,这些输入参数必须与执行过程中的各调用相匹配。
示例:“Create_DB” 指令的作业由输入参数 LOW_LIMIT、UP_LIMIT、COUNT、ATTRIB 和 SRCBLK 标识
下表列出了标识指令的输入参数。
异步指令的状态
异步指令通过块参数 STATUS/RET_VAL 和 BUSY 显示指令的状态。有些异步指令也会使用块参数 DONE 和 ERROR 显示。
下图显示了两个异步指令 WRREC 和 CREATE_DB 的执行
① 输入参数 REQ 用于启动作业,执行异步指令。
② 输出参数 DONE 用于指示该作业已完成且无错误。
③ 输出参数 BUSY 用于指示作业是否正在执行。BUSY =1 时,为该异步指令分配资
源。BUSY = 0 时,未分配资源。
④ 输出参数 ERROR 用于指示发生了错误。
⑤ 输出参数 STATUS/RET_VAL 用于提供有关作业执行的状态信息。发生错误后,输出参数 STATUS/RET_VAL 用于接收错误信息。
资源的使用
异步指令在执行过程中将占用 CPU 中的资源。根据 CPU 类型和指令的不同,资源的使用具有一定限制。CPU 可同时执行最大数目的异步指令作业。在作业成功完成后或在出错后,这些资源将再次可用。
示例:对于 RDREC 指令,S7-1500 CPU 可以并行处理最多 20 个作业。
如果超出指令的最大并行作业数量,则会出现以下情况:
● 该指令将在块参数 STATUS 中返回错误代码 80C3(资源不足)。
● CPU 将停止执行作业,直至资源再次可用。
说明
低层级的异步指令
某些异步指令可使用一个或多个低层级的异步指令进行处理。下表列出了这种相关性。
请注意,每条级别较低的指令通常占用指令资源池中的一个资源。
责任编辑:lq
全部0条评论
快来发表一下你的评论吧 !