Add more validation:

* ensure group is not empty
* ensure axis group with same name is created twice
* ensure group exists when adding axis
This commit is contained in:
2024-02-21 09:15:38 +01:00
parent f49a9d0ec4
commit 9dad4609d6
9 changed files with 56 additions and 50 deletions

View File

@@ -3,7 +3,6 @@ ecmc_plugin_safety
IMPORTANT: This plugin or ecmc does NOT offer any safety functionality. This plugin only offers a standard interface to an external safety system / safety PLC / safety relay!!!!
This plugin is designed for interfacing safety systems to ecmc motion axes.
# Loading of plugin
@@ -69,7 +68,7 @@ epicsEnvSet(RAMP_DOWN_CMD,"ec${ECMC_EC_MASTER_ID}.s${DRV_SLAVE}.ZERO.0")
epicsEnvSet(STANDSTILL_STAT,"ec${ECMC_EC_MASTER_ID}.s${DRV_SLAVE}.ZERO.1")
${SCRIPTEXEC} ${ecmc_plugin_safety_DIR}addSS1Group.cmd "NAME=first,EC_RAMP_DOWN_CMD=${RAMP_DOWN_CMD},EC_STANDSTILL_STAT=${STANDSTILL_STAT},DELAY_MS=500"
#- Add axes
# Add axes to group "first"
${SCRIPTEXEC} ${ecmc_plugin_safety_DIR}addAxisToGroup.cmd "NAME=first,AX_ID=1,VELO_LIM=1"
${SCRIPTEXEC} ${ecmc_plugin_safety_DIR}addAxisToGroup.cmd "NAME=first,AX_ID=2,VELO_LIM=1"
${SCRIPTEXEC} ${ecmc_plugin_safety_DIR}addAxisToGroup.cmd "NAME=first,AX_ID=3,VELO_LIM=1"

View File

@@ -1,28 +0,0 @@
>>
Script is used : e3TemplateGenerator.bash
Script Path : /home/anderssandstrom/plugin_ecmc/e3-tools/e3TemplateGenerator
Script Version : 1.0.8
Script Run Time : 2020Mar22-1607-33CET
User : anderssandstrom
e3-tools Hash : bf03d40
>>
>> git diff
>>
>> git diff --cached
>>
>> git diff HEAD
>>
>> Your sources are located in e3-ecmcPlugin_Simple.
>>
EPICS_MODULE_NAME : ecmcPlugin_Simple
E3_MODULE_SRC_PATH : ecmcPlugin_Simple
E3_TARGET_URL : https://github.com/anderssandstrom
>>
e3 module name : e3-ecmcPlugin_Simple
e3 target url full : https://github.com/anderssandstrom/e3-ecmcPlugin_Simple.git
>>
e3 module is located in siteMods

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -182,8 +182,7 @@ void ecmcSS1SafetyGroup::validateCfgs() {
}
}
void ecmcSS1SafetyGroup::validateAxes() {
void ecmcSS1SafetyGroup::validateAxes() {
// Ensure that axis is not linked twice to group
for(std::vector<safetyAxis*>::iterator iaxis = axes_.begin(); iaxis != axes_.end(); ++iaxis) {
int axisLinkedCounter = 0;
@@ -213,11 +212,19 @@ void ecmcSS1SafetyGroup::validateAxes() {
}
}
int axisCounter = 0;
// Check axis object exists and valid
for(std::vector<safetyAxis*>::iterator saxis = axes_.begin(); saxis != axes_.end(); ++saxis) {
if(!getAxisValid((*saxis)->axisId_)) {
throw std::runtime_error( "Safety: Ecmc Axis object not valid.");
}
axisCounter++;
}
// do not allow empty group
if(axisCounter == 0) {
printf("Safety %s: Error, group empty (axis count zero)\n",sName_);
throw std::runtime_error( "Safety: Error, empty group not allowed.");
}
}

View File

@@ -37,13 +37,32 @@ int setCfgString(const char* cfgString) {
return 0;
}
ecmcSS1SafetyGroup* getGroupFromName(const char *name) {
// Find group by name
for(std::vector<ecmcSS1SafetyGroup*>::iterator psafetyGroup = safetyGroups.begin(); psafetyGroup != safetyGroups.end(); ++psafetyGroup) {
bool found = strcmp(name, (*psafetyGroup)->getName().c_str()) == 0;
if(found) {
return (*psafetyGroup);
}
}
return NULL;
}
int createSafetyGroup(const char *name,
const char *ec_rampdown_cmd,
const char *ec_standstill_status,
int time_delay_ms) {
// ensure group does not already exist
ecmcSS1SafetyGroup* safetyGroup = getGroupFromName(name);
if( safetyGroup ) {
printf("Safety: Error, group %s already defined. Plugin will unload.\n");
throw std::runtime_error( "Safety: Error, group already defined.");
}
// create new ecmcSS1SafetyGroup object
ecmcSS1SafetyGroup* safetyGroup = NULL;
safetyGroup = NULL;
// create asynport name for new object ()
memset(portNameBuffer, 0, ECMC_PLUGIN_MAX_PORTNAME_CHARS);
@@ -61,7 +80,6 @@ int createSafetyGroup(const char *name,
if(safetyGroup) {
delete safetyGroup;
}
return ECMC_PLUGIN_SAFETY_ERROR_CODE;
}
safetyGroups.push_back(safetyGroup);
@@ -74,16 +92,17 @@ int addAxisToSafetyGroup(const char *groupName,
int axisId,
double veloLimit,
int standStillTimeMs) {
// Find group by name
for(std::vector<ecmcSS1SafetyGroup*>::iterator psafetyGroup = safetyGroups.begin(); psafetyGroup != safetyGroups.end(); ++psafetyGroup) {
bool found = strcmp(groupName, (*psafetyGroup)->getName().c_str()) == 0;
if(found) {
(*psafetyGroup)->addAxis(axisId,veloLimit,standStillTimeMs);
return asynSuccess;
}
ecmcSS1SafetyGroup* grp = getGroupFromName(groupName);
if( !grp ) {
printf("Safety: Error, group %s not found. Plugin will unload.\n",groupName);
throw std::runtime_error( "Safety: Error, group not found.");
}
return asynError;
grp->addAxis(axisId,veloLimit,standStillTimeMs);
return asynSuccess;
}
void deleteAllSafetyGroups() {
@@ -98,17 +117,26 @@ void deleteAllSafetyGroups() {
}
int validate() {
int groupCount = 0;
for(std::vector<ecmcSS1SafetyGroup*>::iterator psafetyGroup = safetyGroups.begin(); psafetyGroup != safetyGroups.end(); ++psafetyGroup) {
if(*psafetyGroup) {
try {
(*psafetyGroup)->validate();
groupCount++;
}
catch(std::exception& e) {
printf("Exception: %s. Plugin will unload.\n",e.what());
printf("Safety: %s. Plugin will unload.\n",e.what());
return ECMC_PLUGIN_SAFETY_ERROR_CODE;
}
}
}
// Do not allow loaded plugin with no group configured
if(groupCount == 0) {
printf("Saftey: Error, group count 0. Plugin will unload.\n");
return ECMC_PLUGIN_SAFETY_ERROR_CODE;
}
return 0;
}
@@ -120,7 +148,7 @@ int executeSafetyGroups() {
(*psafetyGroup)->execute();
}
catch(std::exception& e) {
printf("Exception: %s. Plugin will unload.\n",e.what());
printf("Safety: %s. Plugin will unload.\n",e.what());
return ECMC_PLUGIN_SAFETY_ERROR_CODE;
}
}
@@ -165,7 +193,7 @@ int ecmcAddSS1SafetyGroup(const char* name, const char* ec_rampdown_cmd,const ch
}
if(time_delay_ms <= 0) {
printf("Error: time_delay invalid.\n");
exit (1);
exit (EXIT_FAILURE);
}
try {
@@ -173,7 +201,7 @@ int ecmcAddSS1SafetyGroup(const char* name, const char* ec_rampdown_cmd,const ch
}
catch(std::exception& e) {
printf("Exception: %s. Add safety group failed.\n",e.what());
exit (1);
exit (EXIT_FAILURE);
}
return asynSuccess;
@@ -224,24 +252,24 @@ int ecmcAddAxisToSafetyGroup(const char* name, int axis_id, double velo_lim, int
if(axis_id <= 0) {
printf("Error: Invalid axis id.\n");
exit (1);
exit(EXIT_FAILURE);
}
if(velo_lim < 0) {
printf("Error: Invalid velocity limit.\n");
exit (1);
exit(EXIT_FAILURE);
}
if(stand_still_time < 0) {
printf("Error: Invalid stand still filter time.\n");
exit (1);
exit(EXIT_FAILURE);
}
try {
return addAxisToSafetyGroup(name,axis_id, velo_lim, stand_still_time);
}
catch(std::exception& e) {
printf("Exception: %s. Add axis to safety group failed.\n",e.what());
exit (1);
exit(EXIT_FAILURE);
}
return asynSuccess;