diff --git a/GNUmakefile b/GNUmakefile index 6a4533a..93c5c7e 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -2,6 +2,9 @@ include /ioc/tools/driver.makefile MODULE = ecmc_plugin_safety +# "Transfer" module name to plugin +USR_CFLAGS +=-DECMC_PLUGIN_MODULE_NAME=${MODULE} + BUILDCLASSES = Linux ARCH_FILTER = deb10% @@ -16,7 +19,7 @@ OPT_CXXFLAGS_YES = -O3 # dependencies ECmasterECMC_VERSION = v1.1.0 -ecmc_VERSION = 9.6 +ecmc_VERSION = sandst_a ################################################################################ # THIS RELATES TO THE EtherCAT MASTER LIBRARY diff --git a/src/ecmcPluginSafety.c b/src/ecmcPluginSafety.c index c24349d..ac15844 100644 --- a/src/ecmcPluginSafety.c +++ b/src/ecmcPluginSafety.c @@ -8,11 +8,14 @@ * Created on: jan 29, 2024 * Author: anderssandstrom * +* Instructions: +* - IMPORTANT: Add "USR_CFLAGS +=-DECMC_PLUGIN_MODULE_NAME=${MODULE}" to GNUMakefile +* - All functions and ecmcPluginData struct must be declared static \*************************************************************************/ // Needed to get headers in ecmc right... #define ECMC_IS_PLUGIN -#define ECMC_PLUGIN_VERSION 0 +#define ECMC_PLUGIN_VERSION 1 #ifdef __cplusplus extern "C" { @@ -31,11 +34,11 @@ static int alreadyLoaded = 0; static int destructs_ = 0; /** Optional. - * Will be called once after successfull load into ecmc. + * Will be called once after successful load into ecmc. * Return value other than 0 will be considered error. * configStr can be used for configuration parameters. **/ -int safetyConstruct(char *configStr) +static int construct(char *configStr) { if(alreadyLoaded) { @@ -50,19 +53,19 @@ int safetyConstruct(char *configStr) /** Optional function. * Will be called once at unload. **/ -void safetyDestruct(void) +static void safetyDestruct(void) { destructs_ = 1; deleteAllSafetyGroups(); } /** Optional function. - * Will be called each realtime cycle if definded - * ecmcError: Error code of ecmc. Makes it posible for + * Will be called each realtime cycle if defined + * ecmcError: Error code of ecmc. Makes it possible for * this plugin to react on ecmc errors * Return value other than 0 will be considered to be an error code in ecmc. **/ -int safetyRealtime(int ecmcError) +static int safetyRealtime(int ecmcError) { if(destructs_) return 0; @@ -71,10 +74,10 @@ int safetyRealtime(int ecmcError) return 0; } -/** Link to data source here since all sources should be availabe at this stage +/** Link to data source here since all sources should be available at this stage * (for example ecmc PLC variables are defined only at enter of realtime) **/ -int safetyEnterRT(){ +static int safetyEnterRT(){ return validate(); } @@ -82,37 +85,12 @@ int safetyEnterRT(){ * Will be called once just before leaving realtime mode * Return value other than 0 will be considered error. **/ -int safetyExitRT(void){ +static int safetyExitRT(void){ return 0; } -//// Plc function for clear of buffers -//double fft_clear(double index) { -// return (double)clearFFT((int)index); -//} -// -//// Plc function for enable -//double fft_enable(double index, double enable) { -// return (double)enableFFT((int)index, (int)enable); -//} -// -//// Plc function for trigg new measurement (will clear buffers) -//double fft_trigg(double index) { -// return (double)triggFFT((int)index); -//} -// -//// Plc function for enable -//double fft_mode(double index, double mode) { -// return (double)modeFFT((int)index, (FFT_MODE)((int)mode)); -//} -// -//// Plc function for enable -//double fft_stat(double index) { -// return (double)statFFT((int)index); -//} - // Register data for plugin so ecmc know what to use -struct ecmcPluginData pluginDataDef = { +static struct ecmcPluginData pluginDataDef = { // Allways use ECMC_PLUG_VERSION_MAGIC .ifVersion = ECMC_PLUG_VERSION_MAGIC, // Name @@ -124,170 +102,19 @@ struct ecmcPluginData pluginDataDef = { , // Plugin version .version = ECMC_PLUGIN_VERSION, - // Optional construct func, called once at load. NULL if not definded. - .constructFnc = safetyConstruct, - // Optional destruct func, called once at unload. NULL if not definded. + // Optional construct func, called once at load. NULL if not defined. + .constructFnc = construct, + // Optional destruct func, called once at unload. NULL if not defined. .destructFnc = safetyDestruct, - // Optional func that will be called each rt cycle. NULL if not definded. + // Optional func that will be called each rt cycle. NULL if not defined. .realtimeFnc = safetyRealtime, // Optional func that will be called once just before enter realtime mode .realtimeEnterFnc = safetyEnterRT, // Optional func that will be called once just before exit realtime mode .realtimeExitFnc = safetyExitRT, // PLC funcs -// .funcs[0] = -// { /*----fft_clear----*/ -// // Function name (this is the name you use in ecmc plc-code) -// .funcName = "fft_clear", -// // Function description -// .funcDesc = "double fft_clear(index) : Clear/reset fft[index].", -// /** -// * 7 different prototypes allowed (only doubles since reg in plc). -// * Only funcArg${argCount} func shall be assigned the rest set to NULL. -// **/ -// .funcArg0 = NULL, -// .funcArg1 = fft_clear, -// .funcArg2 = NULL, -// .funcArg3 = NULL, -// .funcArg4 = NULL, -// .funcArg5 = NULL, -// .funcArg6 = NULL, -// .funcArg7 = NULL, -// .funcArg8 = NULL, -// .funcArg9 = NULL, -// .funcArg10 = NULL, -// .funcGenericObj = NULL, -// }, -// .funcs[1] = -// { /*----fft_enable----*/ -// // Function name (this is the name you use in ecmc plc-code) -// .funcName = "fft_enable", -// // Function description -// .funcDesc = "double fft_enable(index, enable) : Set enable for fft[index].", -// /** -// * 7 different prototypes allowed (only doubles since reg in plc). -// * Only funcArg${argCount} func shall be assigned the rest set to NULL. -// **/ -// .funcArg0 = NULL, -// .funcArg1 = NULL, -// .funcArg2 = fft_enable, -// .funcArg3 = NULL, -// .funcArg4 = NULL, -// .funcArg5 = NULL, -// .funcArg6 = NULL, -// .funcArg7 = NULL, -// .funcArg8 = NULL, -// .funcArg9 = NULL, -// .funcArg10 = NULL, -// .funcGenericObj = NULL, -// }, -// .funcs[2] = -// { /*----fft_trigg----*/ -// // Function name (this is the name you use in ecmc plc-code) -// .funcName = "fft_trigg", -// // Function description -// .funcDesc = "double fft_trigg(index) : Trigg new measurement for fft[index]. Will clear buffers.", -// /** -// * 7 different prototypes allowed (only doubles since reg in plc). -// * Only funcArg${argCount} func shall be assigned the rest set to NULL. -// **/ -// .funcArg0 = NULL, -// .funcArg1 = fft_trigg, -// .funcArg2 = NULL, -// .funcArg3 = NULL, -// .funcArg4 = NULL, -// .funcArg5 = NULL, -// .funcArg6 = NULL, -// .funcArg7 = NULL, -// .funcArg8 = NULL, -// .funcArg9 = NULL, -// .funcArg10 = NULL, -// .funcGenericObj = NULL, -// }, -// .funcs[3] = -// { /*----fft_mode----*/ -// // Function name (this is the name you use in ecmc plc-code) -// .funcName = "fft_mode", -// // Function description -// .funcDesc = "double fft_mode(index, mode) : Set mode Cont(1)/Trigg(2) for fft[index].", -// /** -// * 7 different prototypes allowed (only doubles since reg in plc). -// * Only funcArg${argCount} func shall be assigned the rest set to NULL. -// **/ -// .funcArg0 = NULL, -// .funcArg1 = NULL, -// .funcArg2 = fft_mode, -// .funcArg3 = NULL, -// .funcArg4 = NULL, -// .funcArg5 = NULL, -// .funcArg6 = NULL, -// .funcArg7 = NULL, -// .funcArg8 = NULL, -// .funcArg9 = NULL, -// .funcArg10 = NULL, -// .funcGenericObj = NULL, -// }, -// .funcs[4] = -// { /*----fft_stat----*/ -// // Function name (this is the name you use in ecmc plc-code) -// .funcName = "fft_stat", -// // Function description -// .funcDesc = "double fft_stat(index) : Get status of fft (NO_STAT, IDLE, ACQ, CALC) for fft[index].", -// /** -// * 7 different prototypes allowed (only doubles since reg in plc). -// * Only funcArg${argCount} func shall be assigned the rest set to NULL. -// **/ -// .funcArg0 = NULL, -// .funcArg1 = fft_stat, -// .funcArg2 = NULL, -// .funcArg3 = NULL, -// .funcArg4 = NULL, -// .funcArg5 = NULL, -// .funcArg6 = NULL, -// .funcArg7 = NULL, -// .funcArg8 = NULL, -// .funcArg9 = NULL, -// .funcArg10 = NULL, -// .funcGenericObj = NULL, -// }, .funcs[0] = {0}, // last element set all to zero.. // PLC consts - /* CONTINIOUS MODE = 1 */ -// .consts[0] = { -// .constName = "fft_CONT", -// .constDesc = "FFT Mode: Continious", -// .constValue = CONT -// }, -// /* TRIGGERED MODE = 2 */ -// .consts[1] = { -// .constName = "fft_TRIGG", -// .constDesc = "FFT Mode :Triggered", -// .constValue = TRIGG -// }, -// /* TRIGGERED MODE = 2 */ -// .consts[2] = { -// .constName = "fft_NO_STAT", -// .constDesc = "FFT Status: Invalid state", -// .constValue = NO_STAT, -// }, -// /* TRIGGERED MODE = 2 */ -// .consts[3] = { -// .constName = "fft_IDLE", -// .constDesc = "FFT Status: Idle state (waiting for trigger)", -// .constValue = IDLE -// }, -// /* TRIGGERED MODE = 2 */ -// .consts[4] = { -// .constName = "fft_ACQ", -// .constDesc = "FFT Status: Acquiring data", -// .constValue = ACQ -// }, -// /* TRIGGERED MODE = 2 */ -// .consts[5] = { -// .constName = "fft_CALC", -// .constDesc = "FFT Status: Calculating result", -// .constValue = CALC -// }, .consts[0] = {0}, // last element set all to zero.. }; diff --git a/src/ecmcSafetyPlgWrap.h b/src/ecmcSafetyPlgWrap.h index b9592b0..a20dd13 100644 --- a/src/ecmcSafetyPlgWrap.h +++ b/src/ecmcSafetyPlgWrap.h @@ -25,11 +25,11 @@ int setCfgString(const char* cfgString); * \param[in] name Name of safety group.\n * \param[in] ec_rampdown_cmd Name of ethercat entry for ramp down command\n * \param[in] ec_standstill_status Name of ethercat entry all axis standstill status\n - * \param[in] time_delay_ms Timedelay between ec_rampdown_cmd going high untill STO is triggered by safety relay.\n + * \param[in] time_delay_ms Timedelay between ec_ramp-down_cmd going high until STO is triggered by safety relay.\n * * \return 0 if success or otherwise an error code.\n */ -//int createSafetyGroup(name,ec_rampdown_cmd,ec_standstill_status, time_delay_ms); +//int createSafetyGroup(name,ec_ramp-down_cmd,ec_standstill_status, time_delay_ms); /** \brief Deletes all created objects\n * @@ -41,8 +41,8 @@ void deleteAllSafetyGroups(); * * This tells the safety lib to connect to ecmc to find it's data sources.\n * This function should be called just before entering realtime since then all\n - * data sources in ecmc will be definded (plc sources are compiled just before runtime\n - * so are only fist accesible now).\n + * data sources in ecmc will be defined (plc sources are compiled just before runtime\n + * so are only fist accessible now).\n * \return 0 if success or otherwise an error code.\n */ int validate();