异步错误事件 (S7-1200, S7-1500) DIS_IRT: 禁用中断事件 (S7-1500) 说明 通过指令“DIS_IRT”,可禁用新中断和异步错误事件的处理过程。“禁用”的意思是,如果发 生中断事件,则 CPU 的操作系统产生以下响应: • 它既不会调用中断 OB 和异步错误 OB, • 也不会在未对中断 OB 或异步错误 OB 进行编程的情况下触发正常响应。 如果禁用中断和异步错误事件,则这种禁用对所有优先级都起作用。只能通过指令“EN_IRT (页 3114)”或暖启动/冷启动取消禁用。 说明 请记住,当对指令“DIS_IRT”进行编程时,将放弃发生的所有中断。 参数 下表列出了“DIS_IRT”指令的参数: 参数 声明 数据类型 存储区 说明 MODE Input BYTE I、Q、M、D、L 或常 量 指定禁用哪些中断和异步错误。 OB_NR Input INT I、Q、M、D、L 或常 量 OB 编号 RET_VAL Return INT I、Q、M、D、L 在指令执行过程中如果发生错误,则 返回值将包含错误代码。 有关有效数据类型的更多信息,请参见“有效数据类型概述
由于调用程序错误 OB 后变量“READ_ERR.peOB_unmasked_active”的值仍显示为“TRUE”,需 复位该值。如果指令“MSK_FLT”执行不成功(“MSK_FLT.execute”的值为“FALSE”),则复位变 量“maskedProgErrs”。 程序段 2(“MSK_FLT”): 当常开触点(“MSK_FLT.execute”)的信号状态为“TRUE”时,执行“MSK_FLT”指令。 变量“progErrMask_Details”和“accessErrMask_Details”用于指定需控制的同步错误事件: • 使用“progErrMask_Details”,指定待屏蔽的程序错误。 • 在该示例中,访问错误(“accessErrMask_Details”)未屏蔽。 在输入参数 PRGFLT_SET_MASK(“MSK_FLT.progErrSetMask”)和 ACCFLT_SET_MASK (“MSK_FLT.accessErrSetMask”)中,需控制的同步错误事件将存储为数据类型 DWORD。 输出参数 RET_VAL(“MSK_FLT.returnValue”)将指示未屏蔽任何错误。在输出参数 PRGFLT_MASKED(“maskedProgErrs”)和 ACCFLT_MASKED(“maskedAccessErrs”)中,将 显示当前已屏蔽的同步错误事件。程序段 3(“DMSK_FLT”): 当常开触点(“DMSK_FLT.execute”)的信号状态为“TRUE”时,执行“DMSK_FLT”指令。在输入 参数 PRGFLT_RESET_MASK(“DMSK_FLT.progErrResetMask”)和 ACCFLT_RESET_MASK (“DMSK_FLT.accessErrResetMask”)中,需取消屏蔽的同步错误事件将存储为数据类型 DWORD。 输出参数 RET_VAL(“DMSK_FLT.returnValue”)将指示所有指定的错误均已取消屏蔽。 在输出参数 PRGFLT_MASKED(“maskedProgErrs”)和 ACCFLT_MASKED (“maskedAccessErrs”)中,将显示当前已屏蔽的同步错误事件。程序段 4(函数块“SLI_FB_genErr_SyncErrEv”): 如果变量“testErrorEvent.index”的返回值大于“10”,则触发一个程序错误。 程序段 5(“READ_ERR”): “READ_ERR”指令读取事件状态寄存器。在输入参数 PRGFLT_QUERY (“READ_ERR.progErrSetMask”)和 ACCFLT_QUERY(“READ_ERR.accessErrSetMask”)中, 待读取的同步错误事件将存储为数据类型 DWORD。 • 案例 1 - 程序错误未触发。未设置任何屏蔽: 输出参数 RET_VAL(“READ_ERR.returnValue”)将指示至少一个查询到的错误未进行屏 蔽。 在输出参数 PRGFLT_CLR(“READ_ERR.occuredMskProgErrs”)和 ACCFLT_CLR (“READ_ERR.occuredMskAccessErrs”)中,将显示当前正在发生的错误事件。 • 案例 2 - 程序错误已触发,但未屏蔽。 MSK_FLT、DMSK_FLT 未激活。将执行编程错误 OB。• 案例 3 - 屏蔽已触发的程序错误: MSK_FLT 激活。DMSK_FLT 和程序错误 OB 未激活。 根据结构“occProgErrMask_Details”,发生以下程序错误: • 案例 4 - 取消屏蔽已触发的程序错误: MSK_FLT、DMSK_FLT 和程序错误 OB 激活。 程序段 6(函数“SLI_occured_SyncErrEv”): 通过调用函数“SLI_occured_SyncErrEv”,将读取的程序错误 occuredMskAccessErrs 和访问的 错误 occuredMskProgErrs 转换为结构“occProgErrMask_Details”和“occAccErrMask_Details”。 程序代码 有关上述示例的更多信息和程序代码,请参见“指令的示例。EN_IRT: 启用中断事件 (S7-1500) 说明 可使用此指令来启用已通过指令“DIS_IRT (页 3112)”禁用的新中断和异步错误事件的处理过 程。即,发生中断事件时,CPU 操作系统将按照以下某种方式进行响应: • 调用中断 OB 或异步错误 OB。 或 • 如果未编程中断 OB 或异步错误 OB,则不会触发指定的响应。DIS_IRT 和 EN_IRT 的编程示例 (S7-1200, S7-1500) 简介 在以下示例中,可通过指令“DIS_IRT”禁用循环中断 OB (OB33) 的执行,使用指令“EN_IRT”再 次启用 OB33。 数据的存储 创建以下结构和变量,将数据存储在全局数据块中。OB“SLI_ciOB_AsyncEvent”的结果 如果常开触点(“testOB.execute”)的信号状态为“TRUE”,则执行“TP”指令。变量 “testOB.execute”将自动复位为信号状态“FALSE”。变量“testTime”的值将递增,直至与变量 “testTimeLimit”的值相对应。函数“SLI_FC_AsyncEvent”的结果 程序段 1: 如果常开触点(“DIS_IRT.execute”)的信号状态为“TRUE”,则执行“DIS_IRT”指令。根据输入 参数 MODE(“DIS_IRT.mode”),指定将使用的操作模式“2”。根据输入参数 OB_NR (“DIS_IRT.obNbr”),寻址 OB33 并禁止执行。 输出参数 RET_VAL(“DIS_IRT.returnValue”)可用于指示本示例中的执行过程是否出错。将 “DIS_IRT”的处理结果保存在变量“DIS_IRT.done”中。也可复位变量“EN_IRT.done”。 变量“testOB.testTime”的值将不再递增。然而,指令“TP”的 IEC 定时器仍会在后台继续计数。程序段 2: 如果常开触点(“#tempDIS”)的信号状态为“TRUE”,则复位变量“DIS_IRT.execute”。 程序段 3: 如果常开触点(“EN_IRT.execute”)的信号状态为“TRUE”,则执行“EN_IRT”指令。根据输入参 数 MODE(“EN_IRT.mode”),指定将使用的操作模式“2”。根据输入参数 OB_NR (“EN_IRT.obNbr”),寻址 OB33 并再次启用该 OB 的执行过程。 输出参数 RET_VAL(“EN_IRT.returnValue”)可用于指示本示例中的执行过程是否出错。将 “EN_IRT”的处理结果保存在变量“EN_IRT.done”中。也可复位变量“DIS_IRT.done”。 变量“testOB.testTime”的值仍将递增,或根据指令“TP”的 IEC 定时器更改。DIS_AIRT: 延时执行较高优先级中断和异步错误事件 (S7-1200, S7-1500) 说明 使用“DIS_AIRT”,延时优先级高于当前组织块的中断 OB 的处理。 在一个组织块中可以多次调用“DIS_AIRT”。操作系统将计数“DIS_AIRT”的调用次数。每次执行 “DIS_AIRT”,都会使处理越来越延时。要取消延时,必须执行“EN_AIRT (页 3122)”指令。处 理延时将一直继续,直至“EN_AIRT (页 3122)”的执行次数与“DIS_AIRT”的调用次数相等,或 者当前 OB 已在运行中。 每次调用“DIS_AIRT”都会增加延时时间;当前值可在参数 RET_VAL 处获取。EN_AIRT: 启用执行较高优先级中断和异步错误事件 (S7-1200, S7-1500) 说明 发生中断时,使用“EN_AIRT”启用由“DIS_AIRT (页 3121)”指令延时的组织块处理。 执行“EN_AIRT”时,将取消在调用“DIS_AIRT (页 3121)”时由操作系统记录的一个延时处理。 要取消所有延时,“EN_AIRT”的执行次数必须与“DIS_AIRT (页 3121)”的调用次数相同。示 例:“DIS_AIRT (页 3121)”已经调用了五次。这样,处理过程也将延时五次。之后,要取消 所有五次延时,需调用“EN_AIRT”指令五次。 在“EN_AIRT”指令的 EN_AIRT 参数中,可以查询“RET_VAL”执行后尚未启用的中断延时次数。 RET_VAL 参数的值为“0”,表示由“DIS_AIRT (页 3121)”启用的所有延时均已取消。