This commit is contained in:
2024-02-21 12:36:41 +01:00
parent c37198d7b5
commit a6dd5f8b02
4 changed files with 12 additions and 10 deletions

View File

@@ -3,10 +3,12 @@ ecmc_plugin_safety
IMPORTANT: This plugin or ecmc does NOT offer any safety certified 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.
This plugin is designed for interfacing safety systems, see example in below picture, to ecmc motion axes.
![Safety system](docs/safetyplc.png)
# SS1-t
The plugin supports stopping axes according to a concept described as SS1-t, see blow picture. In SS1-t the STO (or removal of power) from the axes are delayed for a certain defined time allowing a controlled rampdown of velocity. The rampdown of the axis is handled by the non-safe motion controller while the removal of power (or triggering of STO) after the time delay is handled by a safetry system. This makes it possible to stop moving axes in a controlled way and disable the drives before the power is interrupted (or STO triggered). This will result in a safer system and less harware failures and error messages.
The plugin supports stopping axes according to a concept described as SS1-t, see below picture. In SS1-t the STO (or removal of power) from the axes are delayed for a certain defined time allowing a controlled rampdown of velocity. The rampdown of the axis is handled by the non-safe motion controller while the removal of power (or triggering of STO) after the time delay is handled by a safety system, . This makes it possible to stop moving axes in a controlled way and disable the drives before the power is interrupted (or STO triggered). This will result in a safer system and less harware failures and error messages.
After the time delay expires, hopfully all axes are at standstill and power is already removed from the drives.
@@ -28,8 +30,8 @@ The ecmcAddSS1SafetyGroup() adds a SS1 safety group. The command takes the follo
```
ecmcAddSS1SafetyGroup(<name>, <ec_rampdown_cmd>, <ec_standstill_status>,<time_delay_ms>)
<name> : Name of group.
<ec_rampdown_cmd> : Ethercat entry input for rampdown cmd.
<ec_standstill_status> : Ethercat entry output for group standstill status.
<ec_rampdown> : Ethercat entry input for rampdown cmd.
<ec_axes_at_rest> : Ethercat entry output for group standstill status.
<time_delay_ms> : Time delay of STO [ms].
```
Each group is interfacing the safety system through the same I/O (ethercat).

BIN
docs/safetyplc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

View File

@@ -16,18 +16,18 @@
#-
#- Arguments:
#- NAME : Name of safety group
#- EC_RAMP_DOWN_CMD : Ethercat entry for rampd down command (cmd from safety PLC/system)
#- EC_STANDSTILL_STAT : Ethercat entry for axes at standstill status (feedback to safety PLC/system)
#- EC_RAMP_DOWN : Ethercat entry for rampd down command (cmd from safety PLC/system)
#- EC_AXES_STANDSTILL : Ethercat entry for axes at standstill status (feedback to safety PLC/system)
#- DELAY_MS : Time between rampdown command and STO
#-
#################################################################################
#- ecmcAddSS1SafetyGroup(<name>, <ec_rampdown_cmd>, <ec_standstill_status>,<time_delay_ms>)
#- <name> : Name of group.
#- <ec_rampdown_cmd> : Ethercat entry input for rampdown cmd.
#- <ec_standstill_status> : Ethercat entry output for group standstill status.
#- <ec_rampdown> : Ethercat entry input for rampdown cmd.
#- <ec_standstill> : Ethercat entry output for group standstill status.
#- <time_delay_ms> : Time delay of STO [ms].
ecmcAddSS1SafetyGroup("${NAME}","${EC_RAMP_DOWN_CMD}","${EC_STANDSTILL_STAT}",${DELAY_MS=0})
ecmcAddSS1SafetyGroup("${NAME}","${EC_RAMP_DOWN}","${EC_AXES_STANDSTILL}",${DELAY_MS=0})
#- Load SS1 group records
dbLoadRecords("ss1.template","P=${ECMC_PREFIX},NAME=${NAME}")

View File

@@ -56,7 +56,7 @@ int createSafetyGroup(const char *name,
// ensure group does not already exist
ecmcSS1SafetyGroup* safetyGroup = getGroupFromName(name);
if( safetyGroup ) {
printf("Safety: Error, group %s already defined. Plugin will unload.\n");
printf("Safety: Error, group %s already defined. Plugin will unload.\n",name);
throw std::runtime_error( "Safety: Error, group already defined.");
}