工控网首页
>

应用设计

>

S7系列PLC如何应用空组织块来避免CPU停机

S7系列PLC如何应用空组织块来避免CPU停机

2013/8/6 13:23:15

为避免发生某种错误时CPU进入停机,可以在CPU中建立一个对应的空的组织块。用户可以利用OB中的变量声明表提供的信息来判别错误的类型。 根据S7 CPU检测到并且用户可以通过组织块对其进行处理的错误分为异步错误和同步错误。

异步错误是与PLC的硬件或操作系统密切相关的错误,与程序执行无关。异步错误的后果一般都比较严重。异步错误对应的组织块为OB70~OB73和OB80~OB87,有最高的优先级。操作系统检测到一个异步错误时,将启动相应的OB。

OB执行时出现故障S7-300 CPU的操作系统调用OB80。这样的故障包括循环时间超出、执行OB时应答故障、向前移动时间以致于跃过了OB的启动的时间、CLR后恢复RUN方式。 如果当循环中断OB仍在执行前一次调用时,该OB块的启动事件发生,操作系统调用OB80。如果OB80未编程,CPU变为STOP方式,可以使用SFC39至42封锁或延时和在使用时间故障OB。 如果在同一个稍描周期中由于扫描时间超出OB80被调用两次,CPU就变为STOP方式,可以通过在程序中适当的位置调用SFC43“RE_TRIGR”来避免这种情况。 打开OB80可以从OB80的临时变量中得到故障信息,见图7-14所示

变量 类型 描述 OB80_EV_CLASS BYTE 事件级别和标识:B#16#35 OB80_FLT_ID BYTE 故障代码 OB80_PRIORITY BYTE 优先级:在RUN方式时OB80以优先级26运行,OB请求缓冲区溢出时以优先级28运行 OB80_OB_NUMBR BYTE OB号 OB80_RESERVED_1 BYTE 保留 OB80_RESERVED_2 BYTE 保留 OB80_ERROR_INFO WORD 故障信息:根据故障代码 OB80_ERR_EV_CLASS BYTE 引起故障的启动事件的事件级别 OB80_ERR_EV_NUM BYTE 引起故障的启动事件的事件号 OB80_OB_PRIORITY BYTE 故障信息:根据故障代码 OB80_OB_NUM BYTE 故障信息:根据故障代码 OB80_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间4

与电源(仅对S7-400)或后备电池有关的故障事件发生时,S7-300 CPU的操作系统调用OB81,表7-7为OB81的变量申明表。 如果OB81未编程,CPU并不转换为STOP方式。可以使用SFC39至42来禁用、延时或再使用电源故障(OB81)。 OB81_EV_CLASS BYTE 事件级别和标识:B#16#38,离去事件;B#16#39,到来事件 OB81_FLT_ID BYTE 故障代码 OB81_PRIORITY BYTE 优先级:可通过STEP 7选择(硬件组态) OB81_OB_NUMBR BYTE OB号 OB81_RESERVED_1 BYTE 保留 OB81_RESERVED_2 BYTE 保留 OB81_MDL_ADDR INT 位0至2:机架号;位3:0=备用CPU,1=主站CPU;位4至7:1111 OB81_RESERVED_3 BYTE 仅与部分故障代码有关 OB81_RESERVED_4 BYTE OB81_RESERVED_5 BYTE OB81_RESERVED_6 BYTE OB81_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间如果模块具有诊断能力又使能了诊断中断,当它检测到错误时,它输出一个诊断中断请求给CPU,以及错误消失时,操作系统都会调用OB82。当一个诊断中断被触发时,有问题的模块自动地在诊断中断OB的起动信息和诊断缓冲区中存入4个字节的诊断数据和模块的起始地址。可以用SFC39至42来禁用、延时或再使用诊断中断(OB82),表7-8描述了诊断中断OB82的临时变量。

OB82_EV_CLASS BYTE 事件级别和标识:B#16#38,离去事件;B#16#39,到来事件 OB82_FLT_ID BYTE 故障代码 OB82_PRIORITY BYTE 优先级:可通过SETP 7选择(硬件组态) OB82_OB_NUMBR BYTE OB号 OB82_RESERVED_1 BYTE 备用 OB82_IO_FLAG BYTE 输入模板:B#16#54;输出模板:B#16#55 OB82_MDL_ADDR WORD 故障发生处模板的逻辑起始地址 OB82_MDL_DEFECT BOOL 模板故障 OB82_INT_FAULT BOOL 内部故障 OB82_EXT_FAULT BOOL 外部故障 OB82_PNT_INFO BOOL 通道故障 OB82_EXT_VOLTAGE BOOL 外部电压故障 OB82_FLD_CONNCTR BOOL 前连接器未插入 OB82_NO_CONFIG BOOL 模板未组态 OB82_CONFIG_ERR BOOL 模板参数不正确 OB82_MDL_TYPE BYTE 位0至3:模板级别;位4:通道信息存在;位5:用户信息存在;位6:来自替代的诊断中断;位7:备用 OB82_SUB_MDL_ERR BOOL 子模板丢失或有故障 OB82_COMM_FAULT BOOL 通讯问题 OB82_MDL_STOP BOOL 操作方式(0:RUN,1:STOP) OB82_WTCH_DOG_FLT BOOL 看门狗定时器响应 OB82_INT_PS_FLT BOOL 内部电源故障 OB82_PRIM_BATT_FLT BOOL 电池故障 OB82_BCKUP_BATT_FLT BOOL 全部后备电池故障

OB82_RESERVED_2 BOOL 备用 OB82_RACK_FLT BOOL 扩展机架故障 OB82_PROC_FLT BOOL 处理器故障 OB82_EPROM_FLT BOOL EPROM故障 OB82_RAM_FLT BOOL RAM故障 OB82_ADU_FLT BOOL ADC/DAC故障 OB82_FUSE_FLT BOOL 熔断器熔断 OB82_HW_INTR_FLT BOOL 硬件中断丢失 OB82_RESERVED_3 BOOL 备用 OB82_DATE_TIME DATE_AND_TIME

OB被调用时的日期和时间在编写OB82的程序时,要从OB82的起动信息中获得与出现的错误有关的更确切的诊断信息,例如是哪一个通道出错,出现的是哪种错误。使用SFC51“RDSYSST”也可以读出模块的诊断数据,用SFC52“WR_USMSG”可以将这些信息存入诊断缓冲区。 现在通过结合模板的短线诊测应用和SFC51来说明诊断中断组织块OB82的使用方法。

首先,在SIMATIC管理器中新建一个项目,插入一个300站。硬件组态,在机架上插入CPU 315-2DP和一块具有中断功能模拟量输入模块SM331,配置SM331模块的“Inputs”选项,选择0-1通道组为2线制电流(2DMU),其它通道组为电压,并注意模块的量程卡要与设置的相同。选中“Enable”框中的“Diagnostic Interrupt”选项,选中“Diagnostics”选项中的0-1通道组中的“Group Diagnostics”和“with Check for Wire Break”选项,如图7-15所示。

点击OK,然后双击CPU 315-2DP,选择“Interrupts”选项,可以看到CPU支持OB82,见图7-16所示。硬件组态完成后,保存编译,下载到CPU中。

然后完成诊断程序。OB82程序当在硬件组态中设定的诊断中断发生后执行,但OB82执行时可以通过它的临时变量OB82_MDL_ADDR读出产生诊断中断的模块的逻辑地址。STEP 7不能时时监控程序的运行。 在SIMATIC管理器中S7 Program(1)下插入一个STL Source文件STL Source(1),如图7-17所示。

打开OB1,在“Libraries”→“Standard Libraries”→“System Function Blocks”下找到SFC51“RDSYSST DIAGNSTC”,按F1键,出现SFC51在线帮助信息,在帮助信息的最低部点击“Example for module diagnostics with the SFC51”,然后点击“STL Source File”,选中全部STL Source源程序拷贝到STL Source(1)中,编译保存。这是在Blocks中生成OB1、OB82、DB13和SFC51。 打开OB82,对其中的程序做简单的修改,将19和20行的程序拷贝到go:后面,如图7-18所示。再进行保存,下载到CPU中。

下载完成后,将CPU上的模式选择开关切换到“RUN”状态,此时,CPU上的“RUN”灯和“SF”灯会亮,SM331模块上的“SF”灯也会亮。同时,查看CPU的诊断缓冲区可以获得相应的故障信息。 打开DB13数据块,在线监控,见图7-19所示。因为通道断线是一到来事件,所以诊断信息存储到COME数组中。

本例中COME数组字节的含义接受如下: COME[1]=B#16#D:表示通道错误,外部故障和模块问题; COME[2]=B#16#15:表示此段信息为模拟量模块的通道信息; COME[3]=B#16#0:表示CPU处于运行状态,无字节2中标示的故障信息; COME[4]=B#16#0:表示无字节3中标示的故障信息; COME[5]=B#16#71:表示模拟量输入; COME[6]=B#16#8:表示模块的每个通道有8个诊断位; COME[7]=B#16#8:表示模块的通道数; COME[8]=B#16#3:表示0通道错误和1通道错误,其他通道正常; COME[9]=B#16#10:表示0通道断线; COME[10]=B#16#10:表示1通道断线; COME[11]=B#16#0:表示2通道正常,其他通道与2通道相同。 当组态的模块插入/拔出后或在SETP 7下修改了模块的参数并在“RUN”状态把所做修改下载到CPU后,CPU操作系统调用OB83。 在“RUN”、“STOP”和“STARTUP”状态时每次组态的模块插入或拔出,就产生一个插入/拔出中断(电源模块、CPU、适配模块和IM模块不能在这种状态下移出)。该中断引起有关CPU的诊断缓冲区和系统状态表的记录 如果在“RUN”状态下拔出组态的模块,OB83期启动。由于仅以一秒的间隔监视模块的存在,如果模块被直接访问或当过程映像被刷新时可能首先检测出访问故障。如果在“RUN”状态下插入一块模块,操作系统检查插入模块的类型是否与组态的记录一致,如果模块类型匹配,于是OB83被启动并且参数被赋值。可以借助SFC39至42来禁用、延时或再使用插入/拔出模块中断(OB83),表7-9描述了插入/拔出模块中断OB83的临时变量。

OB83_EV_CLASS BYTE 事件级别和标识:B#16#32,模块参数赋值结束;B#16#33,模块参数赋值启动;B#16#38,模块插入;B#16#39,模块拔出或无反应,或参数赋值结束 OB83_FLT_ID BYTE 故障代码 OB83_PRIORITY BYTE 优先级,可通过STEP 7选择(硬件组态) OB83_OB_NUMBR BYTE OB号 OB83_RESERVED_1 BYTE 块模块或接口模块标识 OB83_MDL_ID BYTE 范围:B#16#54,外设输入(PI);B#16#55,外设输出(PQ) OB83_MDL_ADDR WORD 有关模块的逻辑起始地址 OB83_RACK_NUM WORD B#16#A0,接口模块号;B#16#C4,机架号或DP站号(低字节)或DP主站系统ID(高字节) OB83_MDL_TYPE WORD 有关模块的模块类型 OB83_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

当CPU检测到MPI网络的接口故障、通信总线的接口故障或分布式I/O网卡的接口故障时,操作系统调用OB84。故障消除时也会调用该OB块,即事件到来和离去时都调用该OB。表7-10描述了CPU硬件故障OB84的临时变量。 OB84_EV_CLASS BYTE 事件级别和标识:B#16#38,离去事件;B#16#39,到来事件 OB84_FLT_ID BYTE 故障代码 OB84_PRIORITY BYTE 优先级,可通过STEP 7选择(硬件组态) OB84_OB_NUMBR BYTE OB号 OB84_RESERVED_1 BYTE 备用 OB84_RESERVED_2 BYTE 备用 OB84_RESERVED_3 WORD 备用 OB84_RESERVED_4 DWORD 备用 OB84_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

在以下情况下将会触发优先级错误中断: 产生了一个中断事件,但是对应的OB块没有下载到CPU; 访问一个系统功能块的背景数据块时出错; 刷新过程映像表时I/O访问出错,模块不存在或有故障。 在编写OB85的程序时,应根据OB85的起动信息,判定是哪个模块损坏或没有插入。可以使用SFC39至42封锁或延时并使能优先级故障OB,表7-11描述了优先级故障OB85的临时变量。 

OB85_EV_CLASS BYTE 事件级别和标识 OB85_FLT_ID BYTE 故障代码 OB85_PRIORITY BYTE 优先级,可通过STEP 7选择(硬件组态) OB85_OB_NUMBR BYTE OB号 OB85_RESERVED_1 BYTE 备用 OB85_RESERVED_2 BYTE 备用 OB85_RESERVED_3 INT 备用 OB85_ERR_EV_CLASS BYTE 引起故障的事件级别 OB85_ERR_EV_NUM BYTE 引起故障的事件号码 OB85_OB_PRIOR BYTE 当故障发生时被激活OB的优先级 OB85_OB_NUM BYTE 当故障发生时被激活OB的号码 OB85_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

出现下列故障或故障消失时,都会触发机架故障中断,操作系统将调用OB86:扩展机架故障(不包括CPU 318),DP主站系统故障或分布式I/O故障。故障产生和故障消失时都会产生中断。 在编写OB86的程序时,应根据OB86的起动信息,判断是哪个机架损坏或找不到。可以使用SFC39至42封锁或延时并使能OB86,表7-12描述了机架故障OB86的临时变量。

OB86_EV_CLASS BYTE 事件级别和标识:B#16#38,离去事件;B#16#39,到来事件 OB86_FLT_ID BYTE 故障代码 OB86_PRIORITY BYTE 优先级,可通过STEP 7选择(硬件组态) OB86_OB_NUMBR BYTE OB号 OB86_RESERVED_1 BYTE 备用 OB86_RESERVED_2 BYTE 备用 OB86_MDL_ADDR WORD 根据故障代码 OB86_RACKS_FLTD ARRAY[0..31] 根据故障代码 OB86_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

这里也通过一个例子来说明OB86的使用。新建一个项目,插入一个300站,进行硬件组态。在机架中插入CPU 315-2DP,选择DP作为主站,在DP主站下添加一个ET200M从站,并在从站中插入一个模拟量输入模块SM331,如图7-20所示。

这里也通过一个例子来说明OB86的使用。新建一个项目,插入一个300站,进行硬件组态。在机架中插入CPU 315-2DP,选择DP作为主站,在DP主站下添加一个ET200M从站,并在从站中插入一个模拟量输入模块SM331,如图7-20所示。

然后双击CPU,选择“Interrupts”选项,可以看到CPU支持OB86,见图7-21所示。硬件组态完成后,保存编译,下载到CPU中。

OB86程序当在通讯发生问题后或者访问不到配置的机架或站时执行,此时程序可能还可能需要调用OB82和OB122等组织块,当OB86执行时可以通过它的临时变量读出产生的故障代码和事件类型,通过它们的组合可以得到具体错误信息,同时也可以读出产生错误的模块地址和机架信息。STEP 7不能时时监控程序的运行,可以用“Variable Table”监控实时数据的变化。  

打开组织块OB86编写程序,程序如图7-22所示

该程序也可以转化成梯形图,但程序中要将OB86的临时变量OB86_RACKS_FLTD ARRAY[0..31]改成OB86_z23 DWORD。 把程序下载到CPU后,在“Blocks”插入“Variable Table”,如图7-23所示。然后打开,填入MB0、MB1、MW2、MD4并点击 键就可以得到相关信息了。

在使用通信功能块或全局数据(GD)通信进行数据交换时,如果出现下列通信错误,操作系统将调用OB87: 接受全局数据时,检测到不正确的帧标识符(ID); 全局数据通信的状态信息数据块不存在或太短; 接受到非法的全局数据包编号。 如果用于全局数据通信状态信息的数据块丢失,需要用OB87生成该数据块将它下载到CPU。可以使用SFC39至42封锁或延时并使能通信错误OB,表7-13描述了通信错误OB86的临时变量。 OB87_EV_CLASS BYTE 事件级别和标识 OB87_FLT_ID BYTE 故障代码 OB87_PRIORITY BYTE 优先级,可通过SETP 7选择(硬件组态) OB87_OB_NUMBR BYTE OB号 OB87_RESERVED_1 BYTE 备用 OB87_RESERVED_2 BYTE 备用 OB87_RESERVED_3 WORD 根据故障代码 OB87_RESERVED_4 DWORD 根据故障代码 OB87_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

同步错误是与执行用户程序有关的错误,程序中如果有不正确的地址区、错误的编号和错误的地址,都会出现同步错误,操作系统将调用同步错误OB。 同步错误组织块包括OB121用于对程序错误的处理和OB122用于处理模块访问错误。同步错误OB的优先级与检测到出错的块的优先级一致。因此OB121和OB122可以访问中断发生时累加器和其他寄存器中的内容,用户程序可以用它们来处理错误。

同步错误可以用SFC36“MASK_FLT”来屏蔽,使某些同步错误不触发同步错误OB的调用,但是CPU在错误寄存器中记录发生的被屏蔽的错误。用错误过滤器中的一位来表示某种同步错误是否被屏蔽。错误过滤器分为程序错误过滤器和访问错误过滤器,分别占一个双字。 调用SFC37“DMSK_FLT”并且在当前优先级被执行完后,将解除被屏蔽的错误,并且清楚当前优先级的事件状态寄存器中相应的位。 可以用SFC38“READ_ERR”读出已经发生的被屏蔽的错误。 对于S7-300(CPU318除外),不管错误是否被屏蔽,错误都会被送入诊断缓冲区,并且CPU的“组错误”LED会被点亮。 可以在不同的优先级屏蔽某些同步错误。在这种情况下,在特定的优先级中发生这类错误时不会停机,CPU把该错误存放到错误寄存器中。但是无法知道是什么时候发生的错误,也无法知道错误发生的频率。

有关程序处理的故障事件发生时CPU操作系统调用OB121,OB121与被中断的块在同一优先级中执行,表7-14描述了编程错误OB121的临时变量。

OB121_EV_CLASS BYTE 事件级别和标识 OB121_SW_FLT BYTE 故障代码 OB121_PRIORITY BYTE 优先级=出现故障的OB优先级 OB121_OB_NUMBR BYTE OB号 OB121_BLK_TYPE BYTE 出现故障块的类型(在S7-300时无有效值在这里记录) OB121_RESERVED_1 BYTE 备用 OB121_FLT_REG WORD 故障源(根据代码)。如:转换故障发生的寄存器;不正确的地址(读/写故障);不正确的定时器/计数器/块号码;不正确的存储器区 OB121_BLK_NUM WORD 引起故障的MC7命令的块号码(S7-300无效) OB121_PRG_ADDR WORD 引起故障的MC7命令的块号码(S7-300无效) OB121_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

OB121程序在CPU执行错误时执行,此错误不包括用户程序的逻辑错误和功能错误等,例如当CPU调用一个未下载到CPU中的程序块,CPU会调用OB121,通过临时变量“OB121_BLK_TYPE”可以得出出现的错误的程序块。使用STEP 7不能时时监控程序的运行,可以用“Variable Table”监控实时数据的变化。 打开事先已经插入的OB121编写程序,如图7-24所示。

接着在项目“Blocks”下插入FC1,打开FC1编写程序,如图7-25所示。

然后打开OB1编写程序,如图7-26所示。 先将硬件和OB1下载到CPU中,此时CPU能正常运行。在“Blocks”下插入“Variable Table”,然后打开,填入MW0和M10.0,并点击键,程序运行正常。将M10.0置为“true”后,CPU就报错停机,查看CPU的诊断缓冲区信息,发现为编程错误,这是将OB121也下载到CPU中,再将M10.0置为“true”,CPU会报错但不停机,MW0立刻为“W#16#88”,“W#16#88”表示为OB程序错误,检查发现FC1未下载。下载FC1后,在将M10.0置为“true”,这是CPU不会再报错,程序也不会在调用OB121。

当对于模块的数据访问出现故障时CPU的操作系统调用OB122,OB122与被中断的块的同一优先级中执行,表7-15描述了I/O访问错误OB121的临时变量。

OB122_EV_CLASS BYTE 事件级别和标识 OB122_SW_FLT BYTE 故障代码 OB122_PRIORITY BYTE 优先级=出现故障的OB的优先级 OB122_OB_NUMBR BYTE OB号 OB122_BLK_TYPE BYTE 出现故障块的类型(在S7-300时无有效值在这里记录) OB122_MEM_AREA BYTE 存储器区和访问类型:位7至4,访问类型-0、位访问-1、字节访问-2、字访问-3;位3至0,存储器区-0、I/O区-1、过程映像输入或输出-2 OB122_MEM_ADDR WORD 出现故障的存储器地址 OB122_BLK_NUM WORD 引起故障的MC7命令的块号码(S7-300无效) OB122_PRG_ADDR WORD 引起故障的MC7命令的块号码(S7-300无效) OB122_DATE_TIME DATE_AND_TIME OB被调用时的日期和时间

同样,在这里运用一个例子来说明OB122的用法。首先,新建一个项目,插入一个300的站,进行硬件组态。插入一个CPU 315-2DP和一个模拟量输入模块SM331。同时配置SMM331的“Inputs”选项,把所有通道设置为电压类型,注意模块的量程卡要与设置的相同,并把模块的逻辑输入地址设置为256…257,如图7-27所示。

组态完成后,编译保存并下载到CPU中。 OB122程序在出现I/O访问错误是被调用,通过临时变量“OB122_SW_FLT”可以读出错去代码,通过“OB122_BLK_TYPE”得出出错的程序块,通过“OB122_MEM_ADDR”可以读出发生错误的存储器地址使用STEP 7不能时时监控程序的运行,可以用“Variable Table”监控实时数据的变化。 打开在“Blocks”下插入的OB122编写程序,如图7-28所示。

该程序也可以转换为梯形图。 接着打开OB1编写程序,如图7-29所示。

先将硬件组态和OB1下载到CPU中,这是CPU运行正常。在“Blocks”下插入“Variable Table”,然后打开,填入MW0、MW2、MW4、MW6和M10.0,点击键,程序运行正常。将M10.0置为“true”,CPU会报错并停机,查看CPU的诊断缓冲区信息,发现为I/O访问错误。将OB122下载到CPU中,再将M10.0置为“true”,CPU会报错但不停机,检查并修改OB1程序,如图7-30所示。

重新下载OB1,CPU不再报错,程序运行正常。 对于某些同步错误,可以调用系统功能SFC44,为输入模块提供一个替代错误值,以便使程序能继续执行。如果错误发生在输入模块,可以在用户程序中直接替代。如果是输出模块错误,输出模块将自动地用组态时定义的值替代。替代值虽然不一定能反映真实的过程信号,但是可以避免终止用户程序和进入STOP模式。

投诉建议

提交

查看更多评论
其他资讯

查看更多

助力企业恢复“战斗状态”:MyMRO我的万物集·固安捷升级开工场景方案

车规MOSFET技术确保功率开关管的可靠性和强电流处理能力

未来十年, 化工企业应如何提高资源效率及减少运营中的碳足迹?

2023年制造业“开门红”,抢滩大湾区市场锁定DMP工博会

2023钢铁展洽会4月全新起航 将在日照触发更多商机