许立新
(上海通用汽车有限公司,上海 201206)
一台使用FANUC-160C 数控系统的进口卧式加工中心,投产后不久偶尔出现完成备刀后既不动作、也不报警的“死机”现象,大约每周出现二次,复位和急停操作都无法恢复,只能关机。该机床使用了C-执行器(C-EXE)。发生故障时CNC 在执行的M661 代码(备刀命令),等待M-功能结束。后来查出故障原因是PMC 与C-EXE 配合使用时,因为忽略了PMC分割段运行机理,程序出现了漏洞导致竞争冒险。
下面按照分析故障的过程进行叙述。
机床备刀过程是将主轴上换下来的旧刀从待刀位送回刀库,再把下一把刀从刀库转移到待刀位;在这个过程中,刀具数据信息(刀具号、刀具寿命等)也要同步转移;因为刀具数据管理由C-EXE 处理,所以在执行备刀命令M661 过程中,根据实际步骤C-EXE 也要同步运行。
从M661 功能没有结束开始追踪,文中箭头所指方向为程序逻辑执行方向。
①M661 结束[M661FN=0]←②M06 等待[M06WAT=1]←③未执行备刀第8 步[TCF-08=0]←④未执行备刀第7 步[TCF-07=0]←⑤刀具检索未完成[TSROK=0]←⑥未执行备刀第4 步[TCF-04=0]←⑦未执行备刀第3 步[TCF-03=0]←⑧C-EXE 相关[CEXBSY=1,CEXFIN=1]。
由于CEXBSY 和CEXFIN 信号比较复杂,停止逆向追踪。CEXBSY 信号是PMC 向C-EXE 发出的任务请求信号,梯形图中有10 处置位和10 处复位CEXBSY 信号。CEXFIN 信号是C-EXE 向PMC 发出的C-EXE的任务完成信号,梯形图中没有写这个信号。
[确定目标]:焦点是CEXBSY≠0 和CEXFIN≠0;方向是PMC 的10 项任务和C-EXE。
[任务1]:WORK DATA RESET JOB;
[任务2]:TOOL DATA RESET JOB;
[任务3]:TOOL CALLING STEP-3;
[任务4]:WORK COUNTER UPDATE STEP-1;
[任务5]:CYCCLE TIME MONITOR STEP-1;
[任务6]:SL FLAG SET STEP-2;
[任务7]:TL COUNT-UP STEP-1;
[任务8]:M034 ACTION STEP-1;
[任务9]:BT FLAG RESET JOB STEP-2;
[任务10]:SET DATA TRIGGER;
10 项任务与C-EXE 的应答方式是相同的。
依次检查10 项任务,寻找不同之处:
9 项任务的触发信号都是“0”,所以这9 项任务都不会向C-EXE 发出任务请求。只有[任务3]的触发信号TCF-02 是“1”,但是因为条件不满足,所以[任务3]的任务选通信号TCF-3 没有接通。与2.1 节的追踪结果“会合”了,怀疑是[任务3]有问题。
分析[任务3]的梯型图(图1):
(1)在Net4 上,因为[TCF-03=0],所以不能置位CEXBSY 信号。
(2)假设一:当时正在执行[任务3],TCF-03 信号曾经是“1”,当时置位了CEXBSY 信号,然后关断TCF-03 信号。
因为Net1 中TCF-03 信号是自锁的,如果要关断它,则需要上一次循环时Net8[TSROK=1],因此Net5[TCF-04=1];既然[TCF-04=1],那么Net6 就能够复位CEXBSY 了;这与实际状态[CEXBSY=1]不符,所以假设一不成立。
(3)假设二:当时在等待执行[任务3],即[CEXBSY=1]是由其他任务置位的。
因为其他任务还没有完成,所以[CEXBSY=1];当其他任务完成后,使[CEXBSY=0,CEXFIN=0]成立,就可以执行[任务3]了,符合逻辑,证明假设二成立,所以不是[任务3]出的问题。
[更新目标]:焦点是CEXBSY≠0 和CEXFIN≠0;方向是PMC 的9 项任务和C-EXE。
至此,我们需要先研究PMC 和C-EXE 的联合应用。
Net1[Step1]:在没有其他任务时(CEXBSY=0,CEXFIN=0),处于任务使能状态,如果有触发信号(TCF-02=1),则任务选通(TCF-03=1)并且自锁。
Net2,3[Step2]:如果任务选通,就一次性传送任务数据到C-EXE(CEDT00、CEDT04、……);到下一个循环周期时CEXBSY=1,就不再传送了。
Net4[Step3]:如果任务选通,就置位CEXBSY 信号(向C-EXE 发出任务请求命令)
Net5[Step6]:收到C-EXE 任务完成信号(CEXFIN=1)后,就发出PMC 的任务完成命令(TCF-04=1)。
Net6[Step7]:收到PMC 的任务完成命令,就复位CEXBSY 信号(通知C-EXE 任务结束)。
Net7,8[Step9]:如果C-EXE 的返回代码[CEDT02]是“0”,就发出PMC 的任务结束命令(TSRCOK=1);
Net1[Step10]:到下一个循环周期时,由PMC 的任务结束命令(TSRCOK=1)关断任务选通信号(TCF-03=0),结束任务;当收到C-EXE 发出的允许接收新任务命令(CEXFIN=0)后,则再次处于任务使能状态(其它任务也处于使能状态)。
[A]:如果成功获取CEXBSY 和CEXFIN 的状态则向下运行,执行[B]和[C]。
[B]:如果状态为[CEXBSY=1,CEXFIN=0](收到PMC 的任务请求命令[CEXBSY=1],对应Net4),则向下运行,执行[D];否则执行[C]。
[C][Step8]:如果状态为[CEXBSY=0,CEXFIN=1](收到PMC 的任务结束命令[CEXBSY=0]时,对应Net6);则置[CEXFIN=0](通知PMC 允许接收新任务,对应Net1[Step10]);
[D][Step4]:如果成功获取任务数据(组)CEDT00、…,则向下运行,执行[E]和[F]。
[E][Step4]:执行PMC 请求的任务。(根据[CEDT00]的任务代码,选择执行相应的函数;完成任务后把返回代码写入[CEDT02]中,对应Net7)。
[F][Step5]:完成PMC 请求的任务后,如果仍然CEXBSY=1,则置CEXFIN=1(通知PMC 任务完成,对应Net5)。
整个PMC 和C-EXE 的应答关系如表1 所示。
小结:在[C]中,只要CEXBSY=0,C-EXE 就会置CEXFIN=0;所以排除了CEXFIN≠0 的因素。
[更新目标]:焦点CEXBSY≠0;方向是PMC 的9项任务。
为了确定到底是哪个任务出了问题,采用设置痕迹标识位的方法,具体方法如下:
修改梯形图,分别为各项任务设置“痕迹标识位”(R20.0~R21.1);在每项任务“置位”和“复位”CEXBSY 的同时也“置位”和“复位”各自的“痕迹标识位”。在出现“死机”时,如果哪一个“痕迹标识位”还是“1”,则就是哪一项任务出了问题。
增加标识位后,再次出现“死机”时,R20.6=1;说明是[任务7]出了状况。
[锁定目标]:[任务7]没有复位CEXBSY!
(1)根据[锁定目标],Net14 没有复位CEXBSY;当时状态是[CEXBSY=1,CEXFIN=1];
表1 PMC 与C-EXE 应答关系顺序表
(2)逆向追踪:箭头所指方向为程序逻辑执行方向。Net14[CEXBSY≠0]←Net9[TLCU-1=0]←上一循环周期Net16[TLCUFN=1]←[TLCU-1=1,CEXFIN=1]。
说明在上一循环周期时[TLCU-1=1,CEXFIN=1]是成立的。那么,为什么排在前面的Net14 没有执行而后面的Net16 却执行了?
分析:顺序程序没有逻辑错误,猜测是PMC 运行时发生了冲突。
回顾PMC 程序的执行原理,梳理相关概念(参考图4,图5)。
(1)扫描周期:8 ms。
(2)扫描PMC 时间:5 ms(FS160C);即在8 ms 内有5ms 执行PMC 程序,3 ms 由NC 使用。
(3)5 ms 分为两部分:①处理高级段:执行Level1程序,每个扫描周期都要执行一次;②处理低级段:剩余时间执行Level2 程序,每个扫描周期只能执行一部分。
(4)分割段:Level2 程序按分配的时间分割成n个段,每个扫描周期执行一个段。
(5)运行方式:循环执行。
(6)循环周期:8×n ms,执行一遍PMC 程序的时间。
假设:①两个分割段的“接缝”在Net14 和Net15之间(见图6);②在执行Net14 后和Net15 之前这段时间内,C-EXE 把CEXFIN 由“0”变为“1”。分析如下:
(1)在执行Net14 时,因为[TLCU-1=1,CEXFIN=0],所以没有复位CEXBSY,保持[CEXBSY=1],此时结束了当前分隔段。
(2)接着执行3 ms“NC 处理”(参考图5),然后开始下一个扫描周期,首先执行高级段,在这段间内C-EXE 把CEXFIN 信号变为“1”。
(3)再从下一分割段起点Net15 开始执行;因为此时[TLCU-1=1,CEXFIN=1],如果[CEDT02=0],则Net16 置[TLCUFN=1]。
(4)下一个循环周期,执行到Net9 时就会关断任务选通信号(TLCU-1=0)。
(5)再次执行到Net14 时,因为[TLCU-1=0,CEXFIN=1],则还是不能复位CEXBSY。;
上述推理符合PMC 运行原理,此假设成立!
小结:由于CEXFIN 信号在一个循环周期内能够发生变化,且这个变化又导致在复位CEXBSY 之前关断了它的复位条件,所以就再无法复位CEXBSY 了。
参见图7,增加一个CEXFIN 信号的同步信号CFIN_B,用CFIN_B 替代原来所有的CEXFIN 信号;因为CFIN_B 信号在一个循环周期内不会有变化,所以就不会发生冲突了。
经过长期使用没有再出现状况,证明整改有效。
(1)PMC 对X-信号进行两种缓冲处理
扫描缓冲处理:每隔2 ms,扫描[机床X-信号]传送到[X-信号存储器]一次;Level1 程序使用的X-信号来自[X-信号存储器]。
同步缓冲处理:每次开始执行Level2 时,同步[X-信号存储器]传送到[X-信号同步存储器]一次;Level2 程序使用的X-信号来自[X-信号同步存储器],且在Level2 扫描周期中对信号进行锁存。
因此,Level2 程序中的X-信号要比Level1 程序中的X-信号滞后,最多时可能滞后一个循环周期。
(2)PMC 直接使用R、E、D-信号,不进行缓冲处理
R、E、D-信号是内部存储器信号,它们的状态源于PMC 顺序程序,只要符合顺序逻辑就不会发生冲突。
也会有的,因为每隔8 ms 就要刷新一次Level1 程序;假设在Level1 程序中写的一个R-信号,且这个信号在Level2 程序中多次引用;这个R-信号在一个循环周期(8×n ms)内状态是会发生变化的,如果该变化发生在引用这个R-信号的两个分割段之间就可能会发生冲突。
在使用FANUC 数控系统进行机床设计时,经常会使用C-执行器、Macro-执行器和Fanuc-Picture等配合PMC 进行控制。这些执行器能够直接“写”PMC 内部存储器(R、E、D 等地址),虽然灵活方便了,但是也引入了导致竞争冒险的因素。
对于PMC 来说这些执行器都属于外部设备,相互之间的通讯信号就要遵循DI/DO 信号的处理规则!Level2 程序使用来自执行器的输入信号都需要经过同步缓冲处理;保持这些信号状态在执行Level2 程序过程中不会变化,避免发生冲突。
[1]FANUC PMC ladder language programming manual[Z].B-61863E/10,1997.