Troubleshooting PLC fault: CompactLogix L33ER

AutomationTechBrian

Lifetime Supporting Member
Join Date
Jul 2013
Location
St. Cloud, MN
Posts
669
I need a little help figuring out how to fix a fault in a customer's CompactLogix. The guy said the fault happened when he was jogging the machine. I looked up the fault and attached the screenshot below. I'll add more photos in separate posts. I'm guessing a value went out of range, but the .ACC in the array value is challenging my thoughts on how to confirm that it is indeed the problem, and how I should go about fixing it. I'm being cautious. Do you see something here that jumps out as the probable solution?

Two more screen captures will follow, along with a pic of the rack.

Fault.png
 
The value in the ACC is 16. While your array has 16 elements, they are numbered 0-15. So, the logic is pointing to array element #16 which does not exist. Consider adding something like a Limit (LIM) with 0 for the low limit and 15 for the high limit. Place that before the instructions that are using the variable addressing (rung 8 before the SUB).

OG
 
Last edited:
Or put an [AND L_PunchCounter.ACC 16 L_PunchCounter.ACC] instruction before the EQU test on rung 7, assuming that once the .ACC reaches 16 it should reset to 0.

Or an [XIO L_PunchCounter.DN] at the beginning of rung 7, assuming L_PunchCounter.PRE is 15.

Caveat: those are blind guesses; I certainly have no idea how the process operates..
 
Last edited:
Most important, make sure you include logic to prevent it from executing if it ever goes about that setpoint from your counter. drbitboy or my suggestions will get you there. Otherwise, we will be troubleshooting a similar problem all over again in the future.

We also need to make sure it is resetting back to zero once we hit our limit.

OG

EDIT: This brings back memories of my days at A-B/RA. My first Logix 5000 system service call was this exact type of problem.
 
Last edited:
Cool... I'm just trying to figure out if I'll be able to reset that value without unintended consequences. I have my Logix 5000 VM going, with the offline file.

I was trying to figure out how you knew the value of the .ACC. I didn't realize rung 7 had the value until a minute ago. It was captured purely by coincidence.
 
So, I see the reset on rung 9. It should have reset. And do you think it didn't reset because of scan order? In other words, it faulted before rung 9 could execute?
 
16 caused the fault which stopped it from incrementing. I just assumed that the screenshots happened after it had faulted.

The ?? under Source A of the SUB told us where it had faulted and fortunately the screenshot showed that tag in the rung above. If we didn't see it there, I, or someone else, would have asked you to show us that counter.

I think the problem is probably that the counter needed to go to 15 instead of 16. Or if it must be 16, then the array needs to be larger. One or the other needs to be fixed. And yes, the reset instruction would only execute after we have already faulted on rung 8. The order isn't really the issue though. The preset or the array size is the issue.

OG
 
Last edited:
So, it's in program mode right now. I've never used test mode... only remember watching someone use it. What's the best way to reset the counter? Would I have to change the value offline and download? Or is there a way to toggle the reset without tripping the fault first?
 
Ok... I see what is happening. I'm thinking there must be up to 16 different points that are punched per part. The count must associate values in the array to the current punch instruction. ...At least that's what I'm thinking right now. I'll keep studying the program.
 
HUGE caveat: none of us posting here know this process; I see the word "Punch" and think "nine fingers - remaining;" YOU NEED TO REALLY UNDERSTAND THIS PROCESS before becoming known as the guy that followed advice from the Internet. Unless the fault is bizarrely intentional to stop the process because an unsafe condition occurred, it is likely that someone made a mistake programming this process.

So, assuming the following will be taken with a dump truck full of salt ...

As long as discrete output Local:1:O.RangeEn.13 is 0, you can do whatever you want to the accumulator and should will not cause another [Array subscript too large] fault on Rung 8. How you ensure that bit is 0 (e.g. temporary force), and what that means, and whether it is safe, and remembering to remove however you did it, is your problem.

But since you are back in program mode and the PLC is not running, I suggest fixing the logic to prevent the fault in the first place. The hard part is understanding the process (see caveat above). The canonical questions are

  • How long has this current software been running on this process?
  • Has this problem happened before?
The easiest way I can see to do that is to move Rung current 9, which RESets the counter, to between current Rung 6 (the CTU that would presumably be the only place that would increment .ACC's value to 16 in the first place) and Rung 7.

Also, when you move current Rung 9, I would consider removing the [XIC Local:1:I.RangeActive.13] from that rung i.e. from current Rung 9. The only way the .ACC can become 16 in the first place is on a falling edge of Local:1:I.RangeActive.13, which means the RESet would usually occur anyway, because the .DN will also be 1 when .ACC increments to 16. I say usually because there is an obscure, difficult to debug, edge case in some PLCs*, where the Local:1:I.RangeActive.13 bit could be 0 on current Rung 6, and 1 on later rungs, e.g. on current Rung 9, which would prevent the RESet. In fact, the .ACC could, with an impossible sequence of state for the .13 bit, be incremented well beyond 16.

* I am pretty sure it can happen in ControlLogix (according to Ron Beaufort's bootcamp videos - caveat: IIRC), not so sure about CompactLogix.

And as long as we are on the topic of obscure bugs, I would replace the RESet with a [CLR L_PunchCounter.ACC], because otherwise the RESet, in addition to putting a 0 into the value of L_PunchCounter.ACC], would also assign 0 to the value of L_PunchCounter.EN, which means another falling edge of Local:1:I.RangeActive.13 (i.e. rising edge of [XIC Local:1:I.RangeActive.13] would be detected on the next scan by the CTU on Rung 6, even though the value of Local:1:I.RangeActive.13 did not change.
 

Similar Topics

Hey when I turn on my Siemens PLC CPU 216-2 after runing 10 minute it's stop and showing SF indication after I turn off and some time later turn...
Replies
0
Views
108
Hello everyone, It is the first time to use automation studio of B&R PLC How can I see the ladder diagram of the current program and search for...
Replies
8
Views
2,138
Hello! My name is Luke and I started training about a month ago at a company to repair and remanufacture PLCs. I've done a lot of training and...
Replies
3
Views
1,619
I was troubleshooting a customer's machine today, and I came across a couple of questions that I need your thoughts on. 1. At the end of the...
Replies
11
Views
3,566
Hello everyone, Background: We have a Directlogic 405 PLC that has an output card that has all solenoids on it. These solenoids are on plugs with...
Replies
9
Views
2,872
Back
Top Bottom