diff --git a/src/ecmcSafetyGroup.cpp b/src/ecmcSafetyGroup.cpp index 89acd21..d3a12a8 100644 --- a/src/ecmcSafetyGroup.cpp +++ b/src/ecmcSafetyGroup.cpp @@ -80,26 +80,28 @@ ecmcSafetyGroup::ecmcSafetyGroup(const char *name, rampDownCmd_ = 0; axesAreStandstill_ = 0; rampDownCmdOld_ = 0; - + axesAreStandstillOld_ = 0; + printEnableStatus_ = 1; + // Config defaults cfgDbgMode_ = 0; parseConfigStr(cfg_string); initAsyn(); if(cfgDbgMode_) { - printf("Safety: Safety group created:\n" + printf("Safety %s: Safety group created:\n" " Name: %s\n" " I/O for rampdown command from saftey PLC: %s\n" " I/O for axes standstill status: %s\n" " STO delay [ms]: %d\n" " Configuration string: %s\n", - sName_,sEcRampDownCmdNameOrg_,sEcAxesStandStillStatOrg_, - delayMs_,sConfig_); + sName_,sName_,sEcRampDownCmdNameOrg_, + sEcAxesStandStillStatOrg_,delayMs_,sConfig_); } } ecmcSafetyGroup::~ecmcSafetyGroup() { if(cfgDbgMode_) { - printf("Safety: Cleanup\n"); + printf("Safety %s: Cleanup\n",sName_); } free(sName_); @@ -178,24 +180,26 @@ void ecmcSafetyGroup::validateCfgs() { } if(cfgDbgMode_) { - printf("Safety: I/O link parsed:\n" + printf("Safety %s: I/O link parsed:\n" " name: %s\n" " masterid: %d\n" " slaveid: %d\n" " alias: %s\n" " bit: %d\n", + sName_, sEcRampDownCmdNameOrg_, masterIdRampDown, slaveIdRampDown_, aliasRampDown_, bitRampDown_); - printf("Safety: I/O link parsed:\n" + printf("Safety %s: I/O link parsed:\n" " name: %s\n" " masterid: %d\n" " slaveid: %d\n" " alias: %s\n" " bit: %d\n", + sName_, sEcAxesStandStillStatOrg_, masterIdStandStill, slaveIdStandStill_, @@ -217,9 +221,10 @@ void ecmcSafetyGroup::stripBits() { } if(cfgDbgMode_) { - printf("Safety: I/O bit removed:\n" + printf("Safety %s: I/O bit removed:\n" " before: %s\n" " after: %s\n", + sName_, sEcRampDownCmdNameOrg_, sEcRampDownCmdNameStrip_); } @@ -233,9 +238,10 @@ void ecmcSafetyGroup::stripBits() { } if(cfgDbgMode_) { - printf("Safety: I/O bit removed:\n" + printf("Safety %s: I/O bit removed:\n" " before: %s\n" " after: %s\n", + sName_, sEcAxesStandStillStatOrg_, sEcAxesStandStillStatStrip_); } @@ -333,7 +339,7 @@ void ecmcSafetyGroup::execute() { if(ecEntryRampDown_->readBit(bitRampDown_, &data)) { // Disable all axes - setAxesEnable(0); // disable + setAxesDisable(); // disable setAxesSafetyInterlocks(0); // stop setAxesStandstillStatus(0); // set output throw std::out_of_range("Safety: Read rampdown cmd failed"); @@ -342,7 +348,11 @@ void ecmcSafetyGroup::execute() { rampDownCmd_ = data == 0; if(cfgDbgMode_ && rampDownCmdOld_ != rampDownCmd_) { - printf("Safety: Ramp down cmd changed state %d\n",rampDownCmd_); + if(rampDownCmd_) { + printf("Safety %s: Ramp down cmd active\n",sName_); + } else { + printf("Safety %s: Ramp down cmd not active\n",sName_); + } } // set safety interlock in ecmc @@ -350,6 +360,14 @@ void ecmcSafetyGroup::execute() { // check if axes are standstill to safety PLC axesAreStandstill_ = checkAxesStandstill(); setAxesStandstillStatus(axesAreStandstill_); + // Disable + if(axesAreStandstill_ && rampDownCmd_) { + setAxesDisable(); + } else { + printEnableStatus_ = true; + } + + /* //Needed functions in motion.h int getAxisBusy(int axisIndex, @@ -367,10 +385,19 @@ void ecmcSafetyGroup::execute() { void ecmcSafetyGroup::setAxesStandstillStatus(int standstill) { + if(axesAreStandstillOld_ != standstill) { + if(standstill) { + printf("Safety %s: Axes are not moving\n",sName_); + } else { + printf("Safety %s: Axes are moving\n",sName_); + } + } + if(ecEntryStandstill_->writeBit(bitStandStill_, standstill > 0)) { throw std::out_of_range("Safety: Read rampdown cmd failed"); } + axesAreStandstillOld_ = standstill; } // Check standstill axes @@ -393,13 +420,18 @@ bool ecmcSafetyGroup::checkAxisStandstill(int axisId, double veloLimit) { } // Set safety interlock -void ecmcSafetyGroup::setAxesEnable(int enable) { +void ecmcSafetyGroup::setAxesDisable() { for(std::vector::iterator saxis = axes_.begin(); saxis != axes_.end(); ++saxis) { if(!*saxis) { - throw std::runtime_error( "Safety: Axis object NULL."); + throw std::runtime_error("Safety: Axis object NULL."); } - setAxisEnable((*saxis)->axisIndex_,enable); + setAxisEnable((*saxis)->axisIndex_,0); } + + if(printEnableStatus_ && cfgDbgMode_) { + printf("Safety %s: Axes are beeing disabled\n",sName_); + } + printEnableStatus_ = 0; } // Set safety interlock @@ -432,7 +464,7 @@ void ecmcSafetyGroup::addAxis(int axisId, double veloLimit,int standStillTimeMs) axesCounter_++; if(cfgDbgMode_) { - printf("Safety: Added axis %d to safety group \"%s\"\n",axisId,sName_); + printf("Safety %s: Added axis %d to safety group\n",sName_,axisId); } return; diff --git a/src/ecmcSafetyGroup.h b/src/ecmcSafetyGroup.h index 43ee546..c51bc59 100644 --- a/src/ecmcSafetyGroup.h +++ b/src/ecmcSafetyGroup.h @@ -65,7 +65,7 @@ class ecmcSafetyGroup : public asynPortDriver { void stripBits(); void connectToDataSources(); void setAxesSafetyInterlocks(int stop); - void setAxesEnable(int enable); + void setAxesDisable(); void setAxesStandstillStatus(int standstill); bool checkAxesStandstill(); bool checkAxisStandstill(int axisId, double veloLimit); @@ -101,7 +101,9 @@ class ecmcSafetyGroup : public asynPortDriver { int slaveIdStandStill_; int bitStandStill_; int axesAreStandstill_; - + int axesAreStandstillOld_; + int printEnableStatus_; + char aliasRampDown_[EC_MAX_OBJECT_PATH_CHAR_LENGTH]; char aliasStandStill_[EC_MAX_OBJECT_PATH_CHAR_LENGTH];