We initially setup our software to ignore amplifier fault events, I think because there were a cascade of Amp Faults when an STO condition arose. This meant we were missing some important amp faults errors. We changed the software to report and stop on all amplifier faults unless the sourceName contains “602:”, which is the Kollmorgen error code for an STO fault.
This has worked reasonably well, and we are catching important amplifier faults that we were missing previously.
However, once in a while we get an amplifier fault where sourceName is set to “No faults active”, and when we check the Kollmorgen error log there is no matching error, which makes me think this error is coming from RapidCode.
Any idea what this error means? For now we have added it to the ignore list along with “602:”.
We are running RSI 8.1.6
“No faults active” comes directly from the AKD. You can confirm this by calling DRV.FAULTS and it will return “No faults active”. This string does not exist in RapidCode. Was your Axis.SourceGet() returning AMP_FAULT?
We don’t explicitly check the return from Axis.SourceGet() since we are in the RSIEventTypeAMP_FAULT event. So, it possible to get this event but the SourceGet() will be for a different error? Here is the snippet from our RSI Event handling function:
case RSIEventTypeAMP_FAULT:
{ // enclose in a block so we can have local variables
RSISource source = _axes[axis]->SourceGet();
QString sourceName = _axes[axis]->SourceNameGet(source);
if (!(sourceName.contains("602:") || sourceName.contains("No faults active")) ) // Don't log servo errors that are caused by a "602 Safe torque off" since we already no about the STO from the safety controller or "No fault active" amp faults
emit SendingFatalError(QString(STR("Amplifier fault source: %1 for motion ID %2 on axis %3 at %4\n")).arg(sourceName).arg(motionID).arg(axis).arg(QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs)),true);
if (sourceName.contains("No faults active")) // Log but don't EStop if we get a No faults active amp fault
qWarning() << QString(STR("Amplifier fault source: %1 for motion ID %2 on axis %3 at %4\n")).arg(sourceName).arg(motionID).arg(axis).arg(QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs));;
}
I think you’re ok calling SourceGet() there. In fact, I know your source is AMP_FAULT because RapidCode must have called DRV.FAULTS on the AKD (which returns “No faults active”). Are there any self-clearing faults on the AKD? I’m not aware of any but I’ll ask around.
We aren’t aware of any self-clearing faults. Another suggestion was that you could try DRV.WARNINGS to see if it returns something other than “No warnings active.”
So that would be a call to AKDASCIICommand with a parameter of "DRV.WARNINGS with a return of a blank string if there are no warnings, otherwise the string will be the warning if here is one present?
I also noticed there is a command to set the required duration of an amp. fault, which we currently don’t make, and so presumably we use the value 0. Would setting this to a non zero value be of any use?
DRV.WARNINGS returns “No warnings active” if there aren’t any warnings.
I don’t think Amp Fault duration will help here. The duration feature can be used to debounce an input if you are prone to false triggers. Since the Amp Fault bit here is actually a PDO bit coming from the drive via EtherCAT, we don’t need to worry about false triggers, at least in that way.
I have updated our code and when we get the “No faults active” amp fault I’m now calling DRV.WARNINGS to see if there is any additional information. Now we have to wait until the amp fault happens again.