diff --git a/404.html b/404.html index a8e3e85f0..5dc222011 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ -404 Page not found

Error

Woops. Looks like this page doesn't exist ¯\_(ツ)_/¯.

Go to homepage

Page not found!

\ No newline at end of file +404 Page not found

Error

Woops. Looks like this page doesn't exist ¯\_(ツ)_/¯.

Go to homepage

Page not found!

\ No newline at end of file diff --git a/categories/index.html b/categories/index.html index 926fb7838..a3579e1a7 100644 --- a/categories/index.html +++ b/categories/index.html @@ -1,8 +1,8 @@ -Categories :: ecmccfg

category :: -Categories

    \ No newline at end of file +Categories
    \ No newline at end of file diff --git a/index.html b/index.html index 70494cc30..0c5fafe46 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,6 @@ -ecmccfg :: ecmccfg
    navigation

    ecmccfg

    A configuration framework for ECMC Motion Control Module for EPICS.

    License GitHub

    This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -10,4 +10,4 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

    Latest release

    GitHub release (latest by date)

    Download

    GitHub top language

    \ No newline at end of file +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

    Latest release

    GitHub release (latest by date)

    Download

    GitHub top language

    \ No newline at end of file diff --git a/index.json b/index.json index f72282bd4..c7e6c4157 100644 --- a/index.json +++ b/index.json @@ -1 +1 @@ -[{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/build/","title":"build at PSI","tags":[],"description":"","content":" These instructions only work at PSI!\n Build at PSI, using driver.makefile by default this module is only build for RHEL7 and Epics \u0026gt;=R7.0.5\nbuild on login cluster make [LIBVERSION] [clean] [uninstall] install check a particular version check the module loads for version dev, Epics R7+ and ECMC version dev, note MASTER_ID=-1 which runs ECMC in master-less mode. Make proper adjustments to match your needs in terms of versions.\niocsh -7 -r \u0026#34;ecmccfg,dev \u0026#39;ECMC_VER=dev,MASTER_ID=-1\u0026#39;\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/","title":"manual","tags":[],"description":"","content":"ecmccfg A configuration framework for ECMC Motion Control Module for EPICS.\nPurpose The configuration framework contains the necessary files to configure an EPICS IOC for EtherCAT based motion control and DAQ.\n Topics build at PSI introduction general motion PLC knowledge base provided common user commands addAxis.cmd addDataStorage.cmd addMaster.cmd addSlave.cmd addSlaveKL.cmd addVirtualAxis.cmd applyAxisSynchronization.cmd applyConfig.cmd applySlaveConfig.cmd configureAxis.cmd configureSlave.cmd configureVirtualAxis.cmd loadPLCFile.cmd loadPlugin.cmd setAppMode.cmd setDiagnostics.cmd Example IOC require the configuration module with optional version require ecmccfg \u0026lt;VERSION\u0026gt; add a coupler and slave # slave 0 {ecmcEK1100} ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EK1100\u0026#34; # SLAVE_ID is automatically incremented # slave 1 {ecmcEL1018} ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EL1018\u0026#34; # skip slaves 2..6 # slave 7 {ecmcEL2008}, with optional SLAVE_ID ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=E2008, SLAVE_ID=7\u0026#34; #-- ATTENTION, this only work for certain slaves, as the EPICS templates have to be migrated before # slave 9 {ecmcEL2008}, with optional SLAVE_ID and P_SCRIPT ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=E2008, SLAVE_ID=7, P_SCRIPT=mXsXXX\u0026#34; add more slaves and apply configuration to the slaves # slave 8 {ecmcEL7037}, configure slave with optional SLAVE_ID ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureSlave.cmd, \u0026#34;HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B, SLAVE_ID=8\u0026#34; # slave 9 {ecmcEL7037}, addSlave, with immediate call off applySlaveConfig # slave with global configuration ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EL7037\u0026#34; ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applySlaveConfig, \u0026#34;CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; # slave with local configuration, in this case provided by the module `ECMC_AGIR` epicsEnvSet(\u0026#34;CFG_ROOT\u0026#34;, \u0026#34;${ECMC_AGIR_DIR}/\u0026#34;) ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EP7211-0034_ALL\u0026#34; ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applySlaveConfig.cmd, \u0026#34;LOCAL_CONFIG=${CFG_ROOT}AM8211_AGIR.cfg\u0026#34; apply the configuration ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applyConfig.cmd additional configuration manually set binaryOutput01 to 1\necmcConfigOrDie \u0026#34;Cfg.WriteEcEntryIDString(${ECMC_EC_SLAVE_NUM_DIG_OUT},binaryOutput01,1)\u0026#34; adding a physical motor axis classic config epicsEnvSet(\u0026#34;DEV\u0026#34;, \u0026#34;STEST-MYDEVICE\u0026#34;) ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureAxis.cmd, \u0026#34;CONFIG=./cfg/axis_1\u0026#34; yaml config ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addAxisYaml.cmd, \u0026#34;FILE=./AM8111_CSV_minimum.yaml, ECMC_TMPDIR=/tmp/\u0026#34; adding a virtual motor axis ${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, \u0026#34;CONFIG=./cfg/axis_11_virt\u0026#34; adding synchronization ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_1_sync\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_11_sync\u0026#34; loading a PLC from file classic PLC-file ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; pure yaml based PLC ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1.yaml, ECMC_TMPDIR=/tmp/\u0026#34; yaml definition, with classic PLC-file, Note: file key in yaml config will overwrite anything in the code key! ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1File.yaml, ECMC_TMPDIR=/tmp/\u0026#34; go active ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/","title":"addAxis.cmd","tags":[],"description":"","content":"description Script for adding axis EPICS PVs.\ndetails Adds an motion axis.\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/","title":"addDataStorage.cmd","tags":[],"description":"","content":"description Script for adding dataStorage.\ndetails Adds dataStorage buffer.\nauthor Anders Sandstroem\n paramters DS_SIZE Size of data buffer.\nDS_ID (optional), default 0, buffer ID\nDS_TYPE (optional), default 0, 0: Normal Buffer, 1: Ring Buffer, 2: FIFO Buffer\nSAMPLE_RATE_MS (optional), default 1\nDS_DEBUG (optional), default 0, 0: No debug printouts, 1: Debug printouts\n Example calls:\n call for 1000 elements at 10 Hz ${SCRIPTEXEC} ${ecmccfg_DIR}addDataStorage.cmd \u0026#34;DS_ID=1, DS_SIZE=1000, SAMPLE_RATE_MS=100\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/","title":"addDomain.cmd","tags":[],"description":"","content":"description Script for adding an EtherCAT domain.\ndetails Adds an EtherCAt domain.\nauthor Anders Sandström\n paramters EXE_RATE (optional) Execution rate [cycles] defaults 0 (same EC_RATE)\nEXE_OFFSET (optional) Execution offset cycles [cycles] defaults 0\nALLOW_OFFLINE (optional) Allow domain to be offline defaults 0\n All EtherCAT entries generated after this command will be assigned\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/","title":"addEcDataItem.cmd","tags":[],"description":"","content":"description Script for adding a ethercat data item.\ndetails The ethercat data item allows for accessing alreday configured ethercat domain data in a flexible\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/","title":"addEcSdoRT.cmd","tags":[],"description":"","content":"description Script for adding asyn SDO object (access to SDO:s in realtime)\ndetails Add SDO for async access during realtime operation\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/","title":"addEncoder.cmd","tags":[],"description":"","content":"description Script for adding an extra encoder to an axis.\ndetails Adds an encoder to the last configured axis.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/axis_1_enc_2.enc\nDEV (optional) device name, i.e. MOTOR1\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if vars needed for later use).\nCFG_MACROS (optional) Substitution macros for config file\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}addEncoder.cmd, \u0026#34;CONFIG=./cfg/linear_1_enc_3.enc\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/","title":"addMaster.cmd","tags":[],"description":"","content":"description Script for claiming a particular master.\ndetails Claims an EtherCAT master.\nauthor Niko Kivel\n paramters MASTER_ID (optional) master ID as shown by ethercat master.\n Example calls:\n call w/o MASTER_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd call w/ MASTER_ID, which claims the 4th master. ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd, \u0026#34;MASTER_ID=3\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/","title":"addSlave.cmd","tags":[],"description":"","content":"description Script for adding a slave to the EtherCAT bus configuration.\ndetails Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. For some/most slaves also a default\nauthor Niko Kivel\n paramters HW_DESC Hardware descriptor, i.e. EL1008\nSLAVE_ID (optional) bus position\nSUBST_FILE (optional) substitution file\nP_SCRIPT (optional) naming convention prefix script\nNELM (optional) Used for oversampling cards. Defaults to 1\nDEFAULT_SUBS (optional) option to disble default PVs for mapped PDOs\nDEFAULT_SLAVE_PVS (optional, caution!) basic slave PVs, i.e. ${ECMC_P}-Operational will be suppressed\nCALLED_FROM_CFG_SLAVE (optional) Set if called by configureSlave.cmd, default 0\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7037\u0026#34; call w/ SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018, SLAVE_ID=1\u0026#34; call w/ SLAVE_ID and P_SCRIPT ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018, SLAVE_ID=1, P_SCRIPT=mXsXXX\u0026#34; call w/ default PDO PVs disabled ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL3204, DEFAULT_SUBS=false, DEFAULT_SLAVE_PVS=true\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/","title":"addSlaveKL.cmd","tags":[],"description":"","content":"description Script for adding a KL slave to the EtherCAT bus configuration of KL type.\ndetails Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. For some/most slaves also a default\nauthor Anders Sandstrom\n paramters HW_DESC Hardware descriptor, i.e. KL2032\nSLAVE_ID EtherCAT bus position of the BK1250 (or similar terminal)\nSLAVE_ID_KL KL-Bus index in two digit hex starting at zero for the first slave after BK1250 (or similar terminal)\nSUBST_FILE (optional) substitution file\n Example calls:\n${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018, SLAVE_ID=1, SLAVE_ID_KL=0A\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/","title":"addVirtualAxis.cmd","tags":[],"description":"","content":"description Script for adding axis EPICS PVs.\ndetails Adds an virtual axis with PVs.\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/","title":"applyAxisSynchronization.cmd","tags":[],"description":"","content":"description Script for applying axis synchronization\ndetails Adds synchronization parameters to an axis provided by CONFIG.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/linear_1.sax\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if needed vars for later use).\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/linear_1.sax\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/","title":"applyConfig.cmd","tags":[],"description":"","content":"description Script for applying bus configuration.\ndetails Applies the EtherCAT configuration and caluclates data offsets in the process image.\nauthor Niko Kivel\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cfg "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/","title":"applySlaveConfig.cmd","tags":[],"description":"","content":"description Script for applying a specific slave configuration after the slave had been added manually.\ndetails Apply configurations to a slave.\nauthor Niko Kivel\n Example call:\ncall applySlaveConfig with CONFIG\n${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; call applySlaveConfig with LOCAL_CONFIG\n${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;LOCAL_CONFIG=./myFancyServoConfig.cfg\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/","title":"applySlaveDCconfig.cmd","tags":[],"description":"","content":"description Script for applying dc config to slave\ndetails Apply dc configurations to a slave.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/","title":"applySubstitutions.cmd","tags":[],"description":"","content":"description Script for applying substitution file\ndetails Applies substitution from ${SUBST_FILE} with ${P_SCRIPT}\nauthor Niko Kivel\n paramters SUBST_FILE (optional) substitution file\nECMC_P PV prefix\nP_SCRIPT (optional) naming convention prefix script\nNELM (optional) Used for oversampling cards. Defaults to 1\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}applySubstitutions.cmd\u0026#34; \u0026#34;SUBST_FILE=${SUBST_FILE=ecmc${ECMC_EC_HWTYPE}.substitutions},ECMC_P=${ECMC_P}\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/","title":"applyTemplate.cmd","tags":[],"description":"","content":"description Script for applying a template\ndetails Applies template from ${TEMPLATE_FILE} with ${P_SCRIPT}, PARAMS can be passed\nauthor Niko Kivel\n paramters TEMPLATE_FILE template file\nECMC_P PV prefix\nPARAMS (optional) additional parameters\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}applyTemplate.cmd\u0026#34; \u0026#34;TEMPLATE_FILE=ecmcEcSlave.template,ECMC_P=${ECMC_P}\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/","title":"chkOverSampFactOrDie.cmd","tags":[],"description":"","content":"description Validates requested oversampling factor\ndetails Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/","title":"chkOverSampTimeOrDie.cmd","tags":[],"description":"","content":"description Validates the resulting sampling time for oversampling slaves.\ndetails Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/","title":"chkValidCurrentSetOrDie.cmd","tags":[],"description":"","content":"description Validates current settings\ndetails Checks if requested run current and standby current is less than max current and larger than 0.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/","title":"chkValidVoltageSetOrDie.cmd","tags":[],"description":"","content":"description Validates requested voltage\ndetails Ensure requested nominal voltage is less than max voltage and larger than 0\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/","title":"configureAxis.cmd","tags":[],"description":"","content":"description Script for adding an axis with configuration.\ndetails Adds an axis to the configuration and applies parameters provided by CONFIG.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/linear_1.pax\nDEV (optional) device name, i.e. MOTOR1\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if vars needed for later use).\nCFG_MACROS (optional) Substitution macros for config file\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, \u0026#34;CONFIG=./cfg/linear_1.pax\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/","title":"configureSlave.cmd","tags":[],"description":"","content":"description Script for adding a slave with dedicated slave configuration to the EtherCAT bus configuration.\ndetails Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. Applies a specific slave configuration.\nauthor Niko Kivel\n paramters HW_DESC Hardware descriptor, i.e. EL7037\nCONFIG configuration file, i.e. -Motor-Nanotec-ST4118L1804-B\n The CONFIG together with the HW_DESC form the full filename which by definition is ecmc${HW_DESC}${CONFIG}.cmd, i.e.: ecmcEL7037-Motor-Nanotec-ST4118L1804-B.cmd\nparamters SLAVE_ID (optional) bus position\nCFG_MACROS (optional) Substitution macros for config file\nNELM (optional) Used for oversampling cards. Defaults to 1\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}configureSlave.cmd, \u0026#34;HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; call w/ SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}configureSlave.cmd, \u0026#34;HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B, SLAVE_ID=8\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/","title":"configureVirtualAxis.cmd","tags":[],"description":"","content":"description Script for adding a virtual axis with configuration.\ndetails Adds a virtual axis to the configuration and applies parameters provided by CONFIG.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/linear_11.vax\nDEV (optional) device name, i.e. GAP\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if needed vars for later use).\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, \u0026#34;CONFIG=./cfg/linear_11.vax\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/","title":"ecmc_axis-records.cmd","tags":[],"description":"","content":"description Script for adding axis related EPICS PVs.\ndetails Adds motorRecord to the IOC.\nauthor Anders Sandstroem\n This script is typically called by \\b addAxis.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/","title":"ecmc_axis.cmd","tags":[],"description":"","content":"description Script for configuring a physical axis.\ndetails Configures a physical axis in ECMC, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b addAxis.cmd, often via \\b ecmc_axis-records.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/","title":"ecmc_axis_diag.cmd","tags":[],"description":"","content":"description Script for adding axis diagnostic EPICS PVs.\ndetails Adds diagnostic PVs to the IOC.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/","title":"ecmc_axis_mr.cmd","tags":[],"description":"","content":"description Script for loading motor record related databases\ndetails Script for loading motor record related databases and creating motor record axis object\nauthor Anders Sandstroem\n This script is typically called by \\b ecmc_axis.cmd, often via \\b ecmc_axis-records.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/","title":"ecmc_axis_sync.cmd","tags":[],"description":"","content":"description Script for configuring axis synchronization\ndetails Configures ECMC for axis synchronization, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b applyAxisSynchronization.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/","title":"ecmc_enc-records.cmd","tags":[],"description":"","content":"description Script for adding encoder related EPICS PVs.\ndetails Script for adding an encoder to a previously created axis.\nauthor Anders Sandstroem\n This script is typically called by \\b addAxis.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/","title":"ecmc_enc.cmd","tags":[],"description":"","content":"description Script for adding an extra encoder\ndetails Configures a encoder object in ECMC, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b addEncoder.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/","title":"ecmc_virt_axis-records.cmd","tags":[],"description":"","content":"description Script for adding axis related EPICS PVs.\ndetails Adds motorRecord to the IOC.\nauthor Anders Sandstroem\n This script is typically called by \\b addVirtualAxis.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/","title":"ecmc_virt_axis.cmd","tags":[],"description":"","content":"description Script for configuring a virtual axis.\ndetails Configures a virtual axis in ECMC, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b addVirtualAxis.cmd, often via \\b ecmc_virt_axis-records.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/","title":"ecmccfg","tags":[],"description":"","content":"ecmccfg A configuration framework for ECMC Motion Control Module for EPICS.\nLicense This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\nLatest release \nDownload \n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/","title":"ecmcClassicNaming.cmd","tags":[],"description":"","content":"description Script for defining ${ECMC_PREFIX}\ndetails Gathers relevant information about MasterID, SlaveID, \u0026hellip; to create naming convention compliant PREFIX\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/","title":"ecmcESSnaming.cmd","tags":[],"description":"","content":"description Script for defining ${ECMC_P}\ndetails Gathers relevant information about MasterID, SlaveID, \u0026hellip; to create naming convention compliant PREFIX\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/","title":"ecmcmXsXXX.cmd","tags":[],"description":"","content":"description Script for defining ${ECMC_P}\ndetails Gathers relevant information about MasterID, SlaveID, \u0026hellip; to create naming convention compliant PREFIX\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/","title":"finalize.cmd","tags":[],"description":"","content":"description Script for finalizing. Executed just before iocInit (atInit)\ndetails Script for finalizing. Executed just before iocInit (atInit).\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/","title":"general","tags":[],"description":"","content":" chkOverSampFactOrDie.cmd chkOverSampTimeOrDie.cmd chkValidCurrentSetOrDie.cmd chkValidVoltageSetOrDie.cmd general.cmd generalDiagnostics.cmd init.cmd initAll.cmd initAxis.cmd issueWarning.cmd verifyOrDie.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/","title":"general.cmd","tags":[],"description":"","content":"description Add general PVs\ndetails Script for adding general and master diagnostics EPICS PVs\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/","title":"generalDiagnostics.cmd","tags":[],"description":"","content":"description Script for general diagnostics\ndetails Script for setting default diagnostics\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/","title":"init.cmd","tags":[],"description":"","content":"description Initialization script\ndetails Script for setting up the basic EPICS environment.\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/","title":"initAll.cmd","tags":[],"description":"","content":"description Init main script\ndetails Script for setting up the basic EPICS environment.\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/","title":"initAxis.cmd","tags":[],"description":"","content":"description init axis environment\ndetails Script for setting up the basic AXIS environment.\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/","title":"issueWarning.cmd","tags":[],"description":"","content":"description Issue a warning\ndetails Generic verification script for expressions\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/","title":"jinja2","tags":[],"description":"","content":" loadYamlAxis.cmd loadYamlEnc.cmd loadYamlPlc.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/","title":"loadAxisPLCFile.cmd","tags":[],"description":"","content":"description Script for adding a PLC from file.\ndetails Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable.\nauthor Niko Kivel\n paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc\nAX_ID (optional) Ax number, default 0\nPLC_MACROS (optional) Substitution macros for PLC code\nTMP_PATH (optional) directory to dump the temporary plc file after macro substitution\nPRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).\nSUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadAxisPLCFile.cmd, \u0026#34;AX_ID=1, FILE=./plc/homeSlit.plc\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/","title":"loadPLCFile.cmd","tags":[],"description":"","content":"description Script for adding a PLC from file.\ndetails Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable.\nauthor Niko Kivel, Anders Sandström\n paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc\nPLC_ID (optional) PLC number, default 0, or to next free PLC, the actual PLC Id is stored in ECMC_PLC_ID and can be used after this command\nSAMPLE_RATE_MS (optional) excecution rate, default 1000/EC_RATE\nPLC_MACROS (optional) Substitution macros for PLC code. The macros \u0026ldquo;SELF_ID\u0026rdquo;,\u0026ldquo;SELF\u0026rdquo;,M_ID, and M are reserved:\nTMP_PATH (optional) directory to dump the temporary plc file after macro substitution\nPRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).\nSUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded\nINC (optional) List of directories for include files to pass to MSI (if several paths thendivide with \u0026lsquo;:').\nDESC (optional) Description of PLC\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/","title":"loadPLCLib.cmd","tags":[],"description":"","content":"description Script for loading a PLC from lib from file.\ndetails Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable.\nauthor Anders Sandström\n paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc\nPLC_ID (optional) PLC number, default last loaded PLC\nPLC_MACROS (optional) Substitution macros for PLC code. The macros \u0026ldquo;SELF_ID\u0026rdquo;,\u0026ldquo;SELF\u0026rdquo;,M_ID, and M are reserved:\nINC (optional) List of directories for include files to pass to MSI (if several paths thendivide with \u0026lsquo;:').\nTMP_PATH (optional) directory to dump the temporary plc file after macro substitution\nPRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCLib.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/","title":"loadPlugin.cmd","tags":[],"description":"","content":"description Script for loading a ecmc plugin from file.\ndetails Loads a ecmc-plugin from file.\nauthor Anders Sandström\n paramters FILE Filename of plugin shared lib (./ecmcPlugin_Advanced.so)\nPLUGIN_ID Id of plugin to load\nCONFIG (optional) Configuration string sent to plugin at construct\nREPORT (optional) Printout information of loaded plugin if set to \u0026ldquo;1\u0026rdquo;\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPlugin.cmd, \u0026#34;PLUGIN_ID=0,FILE=./ecmcPlugin_Advanced.so,CONFIG=\u0026#39;PLUGIN CONFIGS GO HERE \u0026#39; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/","title":"loadSubstAxes.cmd","tags":[],"description":"","content":"description Script for adding multiple axes based on subst and template file\ndetails Configure multiple axes by using subst file\nauthor Anders Sandström\n ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstAxes.cmd, \u0026#34;FILE=./ax.subs\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/","title":"loadSubstConfig.cmd","tags":[],"description":"","content":"description Script for loading complete ecmc cfg based on subst files and templates\ndetails Loads complete ecmc cfg based on subst files and templates\nauthor Anders Sandström\n ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, \u0026#34;FILE=./cfg.subs\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/","title":"loadSubstHw.cmd","tags":[],"description":"","content":"description Script for adding multiple hw based on subst and template file\ndetails Loads hw cfg based on subst files and templates\nauthor Anders Sandström\n ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstHw.cmd, \u0026#34;FILE=./hw.subs\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/","title":"loadYamlAxis.cmd","tags":[],"description":"","content":"description Script for loading Axis from yaml file via jinja2\ndetails adds an Axis, based on a yaml config file\nauthor Niko Kivel, Anders Sandström\n paramters FILE the yaml-file containing the PLC definition\nDEV the device name (optional, defaults to ${IOC}\n Example calls:\n call ${SCRIPTEXEC} \u0026#34;./loadYamlAxis.cmd\u0026#34; \u0026#34;FILE=./axis1.yaml\u0026#34; ${SCRIPTEXEC} \u0026#34;./loadYamlAxis.cmd\u0026#34; \u0026#34;FILE=./axis1.yaml, DEV=foobar\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/","title":"loadYamlEnc.cmd","tags":[],"description":"","content":"description Script for adding Encoder from yaml file via jinja2\ndetails adds an encoder to an axis, based on a yaml config file\nauthor Anders Sandström\n paramters FILE the yaml-file containing the PLC definition\nDEV the device name (optional, defaults to ${IOC}\n Example calls:\n call ${SCRIPTEXEC} \u0026#34;./loadYamlEnc.cmd\u0026#34; \u0026#34;FILE=./enc.yaml\u0026#34; ${SCRIPTEXEC} \u0026#34;./loadYamlEnc.cmd\u0026#34; \u0026#34;FILE=./enc.yaml, DEV=foobar\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/","title":"loadYamlPlc.cmd","tags":[],"description":"","content":"description Script for loading PLC from yaml file via jinja2\ndetails adds a PLC, line by line, from a yaml-file, parsed by jinja2\nauthor Niko Kivel, Anders Sandström\n paramters FILE the yaml-file containing the PLC definition\n Example calls:\n call ${SCRIPTEXEC} \u0026#34;./loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1.yaml\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/","title":"motion","tags":[],"description":"","content":" ecmc_axis-records.cmd ecmc_axis.cmd ecmc_axis_diag.cmd ecmc_axis_mr.cmd ecmc_axis_sync.cmd ecmc_enc-records.cmd ecmc_enc.cmd ecmc_virt_axis-records.cmd ecmc_virt_axis.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/","title":"naming","tags":[],"description":"","content":" ecmcClassicNaming.cmd ecmcESSnaming.cmd ecmcmXsXXX.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/","title":"restoreRecordUpdateRate.cmd","tags":[],"description":"","content":"description Restores record update rate to what was defined in startup.cmd\ndetails Restores record update rate to what was defined in startup.cmd\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/","title":"scripts","tags":[],"description":"","content":" addAxis.cmd addDataStorage.cmd addDomain.cmd addEcDataItem.cmd addEcSdoRT.cmd addEncoder.cmd addMaster.cmd addSlave.cmd addSlaveKL.cmd addVirtualAxis.cmd applyAxisSynchronization.cmd applyConfig.cmd applySlaveConfig.cmd applySlaveDCconfig.cmd applySubstitutions.cmd applyTemplate.cmd configureAxis.cmd configureSlave.cmd configureVirtualAxis.cmd finalize.cmd jinja2 loadAxisPLCFile.cmd loadPLCFile.cmd loadPLCLib.cmd loadPlugin.cmd loadSubstAxes.cmd loadSubstConfig.cmd loadSubstHw.cmd restoreRecordUpdateRate.cmd setAppMode.cmd setDiagnostics.cmd setRecordUpdateRate.cmd slaveVerify.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/","title":"setAppMode.cmd","tags":[],"description":"","content":"description Script for switching to operational mode.\ndetails Validates configuration, starts realtime thread and checks EtherCAT slaves are in OP.\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/","title":"setDiagnostics.cmd","tags":[],"description":"","content":"description Script for enabling default diagnostics.\ndetails Set some default values to diagostics\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/","title":"setRecordUpdateRate.cmd","tags":[],"description":"","content":"description Script for changing record update rate\ndetails Update record processing rate, all records created after this command will be updated in the specified rate.\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/","title":"slaveVerify.cmd","tags":[],"description":"","content":"description ** script for slave verification and optional reset**\ndetails will verify the slave identity and reset by writing to 0x1011, optionally read firmwre version from 0x100a\nauthor Niko Kivel\n Macros\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/","title":"source","tags":[],"description":"","content":" general motion naming scripts "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/","title":"verifyOrDie.cmd","tags":[],"description":"","content":"description Generic verification script\ndetails Generic verification script for expressions\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/introduction/","title":"introduction","tags":[],"description":"","content":"Principle EtherCAT requires the field bus components (slaves) to be configured on the master. The master must know about the data exchanges with the slaves, this is referred to as process image.\nDuring IOC-startup, the requested configuration is validated against the actually present hardware on the bus. Mismatches will result in an error, the IOC will not start.\nBlindly restarting the IOC, with only partially working EtherCAT hardware, will results in an inoperable IOC! Refer to the troubleshooting guide for details.\n IOC structure The startup script has several steps:\n require ecmccfg configure the slaves on the EtherCAT bus additional configuration adding a physical motor axis adding a virtual motor axis adding synchronization loading a PLC from file apply the configuration go active require ecmccfg require ecmccfg \u0026lt;VERSION\u0026gt; slave configuration Each slave on the field bus must be configured for use with ECMC. For this purpose scripts can be called for:\n adding slaves with default configuration adding and configure while adding applying a configuration to the previously added slaves examples The addSlave is used for simple slaves, a default configuration is automatically applied. In addition default PVs will created for the basic slave features, i.e. status. Most slaves also have PVs created matching the purpose, i.e. inputs will have bi records, outputs will have bo records for each channel. This behaviour can be modified by arguments.\n add a coupler and slaves\n# slave 0 {EK1100} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EK1100\u0026#34; # SLAVE_ID is automatically incremented # slave 1 {EL1018} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018\u0026#34; # skip slaves 2..6 # slave 7 {EL2008}, with optional SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL2008, SLAVE_ID=7\u0026#34; # slave 9 {EL2008}, with optional SLAVE_ID and P_SCRIPT ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL2008, SLAVE_ID=7, P_SCRIPT=mXsXXX\u0026#34; # slave 10 {EL3204}, without any of the default PVs ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL3204, DEFAULT_SUBS=false, DEFAULT_SLAVE_PVS=true\u0026#34; add more slaves and apply configuration to the slaves\n# slave 8 {EL7037}, configure slave using applyComponent.cmd from ecmccomp module with optional SLAVE_ID. ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7037, SLAVE_ID=8\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Motor-Generic-2Phase-Stepper, MACROS=\u0026#39;I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230\u0026#39;\u0026#34; # slave 9 {EL7037}, addSlave, with immediate call off applySlaveConfig # slave with global configuration ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7037\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; # slave with local configuration, in this case provided by the module `ECMC_AGIR` epicsEnvSet(\u0026#34;CFG_ROOT\u0026#34;, \u0026#34;${ECMC_AGIR_DIR}/\u0026#34;) ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EP7211-0034_ALL\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;LOCAL_CONFIG=${CFG_ROOT}AM8211_AGIR.cfg\u0026#34; apply the configuration The configured process image is applied to the master\n${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd additional configuration Optionally, manual modifications can be made to the default configuration.\nIn order to manually set binaryOutput01 to 1 at startup, the following can be added to the startup script.\necmcConfigOrDie \u0026#34;Cfg.WriteEcEntryIDString(${ECMC_EC_SLAVE_NUM_DIG_OUT},binaryOutput01,1)\u0026#34; ecmcConfigOrDie \u0026#34;Cfg.WriteEcEntryEcPath(ec0.s${ECMC_EC_SLAVE_NUM_DIG_OUT}.binaryOutput12,1)\u0026#34; adding a physical motor axis Axis configuration will is explained in details here. The preferred way to confuser axes is with the yaml based configuration. It unifies the way, (1) physical axes, (2) virtual axes and (3) synchronization is handled. It is theoretically possible to use a mix of yaml and classic configuration, but this is untested.\n yaml config ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, \u0026#34;FILE=./cfg/ax1.yaml, DEV=${DEV}, DRV_SLAVE=4, ENC_SLAVE=3, ENC_CHANNEL=01\u0026#34; classic config epicsEnvSet(\u0026#34;DEV\u0026#34;, \u0026#34;STEST-MYDEVICE\u0026#34;) ${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, \u0026#34;CONFIG=./cfg/axis_1\u0026#34; adding a virtual motor axis ${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, \u0026#34;CONFIG=./cfg/axis_11_virt\u0026#34; adding synchronization ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_1_sync\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_11_sync\u0026#34; loading a PLC from file The PLC functionality is explained in detail here. ECMC PLCs can be loaded from classical PLC files, from pure yaml files or from a yaml/PLC hybrid.\n classic PLC-file ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; pure yaml based PLC ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd \u0026#34;FILE=./plc1.yaml\u0026#34; yaml definition, with classic PLC-file, Note: file key in yaml config will overwrite anything in the code key! ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd \u0026#34;FILE=./plc1File.yaml\u0026#34; go active ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/","title":"general","tags":[],"description":"","content":" Topics startup.cmd data storage buffer iocsh utilities ecmc command reference "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/","title":"motion","tags":[],"description":"","content":" Topics yaml configuration scaling direction of motion homing PLC best practice axis ECMC has two types of axes, (1) physical axes, aka joints, and (2) virtual axes, aka end effector. Both types are classes in ECMC, the physical axis is a super-set of the virtual axes, as the latter lacks the hardware.\nyaml config Since v7, axes can be configured with yaml-files. This is a huge improvement over the classic configuration based on EPICS environment variables. For backward compatibility the classical configuration is still supported.\nlinting and schema check From v8+ yaml files are linted for syntactic errors, observe the iocsh for warnings and errors. Additionally the schema of the yaml file is checked by Cerberus. This check will point out errors in the structure of the configuration as well as certain type errors.\nplc yaml config Syncronization configurations\nscaling Configuration of scaling\ndirection Defining the direction of motion\nhoming Configuration of homing\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/","title":"startup.cmd","tags":[],"description":"","content":"startup.cmd startup.cmd takes the following arguments:\n Arguments [optional] ECMC_VER = 9.5.4 EthercatMC_VER = 3.0.2 (obsolete) INIT = initAll MASTER_ID = 0 \u0026lt;-- put negatuve number to disable master, aka non ec-mode SCRIPTEXEC = iocshLoad NAMING = mXsXXX (default), ClassicNaming, ESSnaming EC_RATE = 1000 MODE = FULL / DAQ FULL: Init ecmc with support for both motion and DAQ (DEFAULT) DAQ: Init ecmc with support for only daq (not motion) NO_MR: Init ecmc with support for motion (without motor record) and DAQ PVA = YES / NO TMP_DIR = directory for temporary files ENG_MODE = 1/0. If ENG_MODE is set then PVs used for commissioning will be avaialble EC_TOOL_PATH = Path to ethercat tool defaults to ethercat tool in ECmasterECMC_DIR, otherwise \u0026quot;/opt/etherlab/bin/ethercat\u0026quot; MAX_PARAM_COUNT = Maximum asyn param count, defaults to 1500 [set by module] ECMC_CONFIG_ROOT = root directory of ${MODULE} ECMC_CONFIG_DB = database directory of ${MODULE} EthercatMC_DB = database directory of EthercatMC ECMC_EC_MASTER_ID = EtherCAT master id in use (for use in later scripts) ECMC_EC_SAMPLE_RATE = EtherCAT bus sampling rate [Hz] (1000 default) ECMC_EC_SAMPLE_RATE_MS = EtherCAT bus sampling rate [ms] (1 default) ECMC_MODE = ecmc mode. FULL/DAQ, Defaults to FULL ECMC_PVA = use pva, default NO ECMC_SUPPORT_MOTION = Variable to be used to block use of motion (\u0026quot;\u0026quot;/empty=support motion or \u0026quot;#-\u0026quot;=disable motion) ECMC_TMP_DIR = directory for temporary files, defaults to \u0026quot;/tmp/${IOC}/EcMaster_${ECMC_EC_MASTER_ID}}/\u0026quot; ECMC_EC_TOOL_PATH = path to ethercat tool ECMC_SAMPLE_RATE_MS = current record update rate in milli seconds ECMC_SAMPLE_RATE_MS_ORIGINAL = ECMC_SAMPLE_RATE_MS (used for restore to default if ECMC_SAMPLE_RATE_MS is changed) Normally these arguments are set when the module is required:\nrequire ecmccfg \u0026quot;ENG_MODE=1,MASTER_ID=2\u0026quot; set mode A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible here.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/general/","title":"general","tags":[],"description":"","content":" culprit From experience, very few issues are related to the EtherCAT hardware itself. Mostly the cabling or the actual motor/encoder hardware is to blame.\nEven more likely is human error, such as:\n wrong scaling of the axis writing to the wrong hardware (forgot to select the right slave in the axis config) \u0026hellip; check the status Before anything is restarted or power cycled, check the status of the system.\nA simple way to get an overview of the entire ecmc system is to start the ecmcMain.ui panel. This panel contains, or links to, almost the entire ecmc IOC:\n thread status EtherCAT master status EtherCAT slaves status (overview of all configured slaves) motion axes (all axes in the system are reachable) PLC:s \u0026hellip; caqtdm -macro \u0026#34;IOC=\u0026lt;iocname\u0026gt;\u0026#34; ecmcMain.ui Remember, red is not necessarily a bad sign! It can also indicate that certain channels are not connected. Whether those channels should be connected is beyond the scope of this guide.\nNext step is to diagnose from a dedicated shell, or from within the iocsh.\nIf all slaves are in \u0026lsquo;OP\u0026rsquo; state, at least data is exchanged between the hardware and the master.\nrestarting the IOC Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!!\n Check the hardware BEFORE restarting the IOC!\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/","title":"PLC","tags":[],"description":"","content":" Topics syntax function libs best practice PLCs In ECMC, PLCs are a very powerful tool to handle EtherCAT data in real-time.\nSince ecmccfg v7, the PLCs can be instantiated in 3 different ways:\n pure text files, classic ecmc PLC pure yaml files or text files, with yaml header. pure text files The simplest and most generic way to load plc file is by the loadPLCFile.cmd command:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026quot;FILE=\u0026lt;filename\u0026gt;, INC=\u0026lt;include_dirs\u0026gt;, SAMPLE_RATE_MS=\u0026lt;rate_ms\u0026gt;, PLC_MACROS='\u0026lt;custom_macros\u0026gt;'\u0026quot; pure yaml Backwards compatibility for classic, text based PLCs is assured for yaml based.\n yaml is - like python - indentation sensitive!\n Indent with 2 spaces.\n All keys are mandatory.\n id: PLC id, unique uint enable: PLC enabled at start rateMilliseconds: execution rate in ms. To execute every cycle, independant of cycle rate, use -1. code: dictionary of code lines. Line terminator is still a pipe |, this is subject to change!\n For more complex PLCs, it is highly advisable to use text based PLC definitions with a yaml header.\n plc: id: 1 enable: no rateMilliseconds: 10 code: - \u0026#39;ec0.s2.binaryOutput07:=global.test|\u0026#39; - \u0026#39;${PLC_ID}.enable:=plc0.enable|\u0026#39; - \u0026#39;ec0.s2.binaryOutput05:=not(ec0.s2.binaryOutput05)|\u0026#39; - \u0026#39;plc1.error:=12345|\u0026#39; yaml header Instead of the code dictionary, the file key can be used to load the PLC from a text file. The syntax of the text PLCs is kept from earlier versions.\nAll keys are mandatory.\n id: PLC id, unique uint enable: PLC enabled at start rateMilliseconds: execution rate in ms. To execute every cycle, independant of cycle rate, use -1. file: PLC text file to load. If the file key is set, all definitions in the code dictionary are overwritten.\n yaml header\n plc: id: 1 enable: yes rateMilliseconds: 10 file: plc1.plc PLC file\n # this is a comment println(\u0026#39;plc1 from file\u0026#39;); println(\u0026#39;plc1 from file # hash with inline comment\u0026#39;); # inline test static.i:=static.i+1; # counter println(\u0026#39;i = # + - * / \u0026#39;, static.i); # println iocsh call\n ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1File.yaml, ECMC_TMPDIR=/tmp/\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/","title":"ethercat command line interface","tags":[],"description":"","content":" ethercat CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. The most common commands will be explained here.\nethercat master This will show the state of all masters on the respective host.\nThe command will show the state of all masters. To limit the command to a single master, make use of the -m parameter.\n The -m parameter is available to all ethercat commands, and is even require by some in case of multiple masters. Check the help by issuing ethercat -h for details.\n Example:\nethercat master Master0 Phase: Operation Active: yes Slaves: 38 Ethernet devices: Main: b4:7a:f1:30:7e:d5 (attached) Link: UP Tx frames: 133210322 Tx bytes: 11957093893 Rx frames: 133210320 Rx bytes: 11957093737 Tx errors: 0 Tx frame rate [1/s]: 500 500 500 Tx rate [KByte/s]: 43.4 43.4 43.3 Rx frame rate [1/s]: 500 500 500 Rx rate [KByte/s]: 43.4 43.4 43.3 Common: Tx frames: 737445202 Tx bytes: 114898987125 Rx frames: 737445184 Rx bytes: 114898984314 Lost frames: 18 Tx frame rate [1/s]: 500 500 500 Tx rate [KByte/s]: 43.4 43.4 43.3 Rx frame rate [1/s]: 500 500 500 Rx rate [KByte/s]: 43.4 43.4 43.3 Loss rate [1/s]: 0 0 0 Frame loss [%]: 0.0 0.0 0.0 Distributed clocks: Reference clock: Slave 0 DC reference time: 708164169043902491 Application time: 708427716430011969 2022-06-13 09:28:36.430011969 In case the numbers mostly zero, check the link state.\nEthernet devices: Main: b4:7a:f1:30:7e:d5 (attached) Link: UP \u0026lt;--- HERE If the link is DOWN, try bringing the network device up manually. This, can be done with ip link set \u0026lt;nameOfNetworkDevice\u0026gt; up\nIf the device name is unkown, check with ip link show and search for the MAC the EtherCAT master is bound to.\nethercat slaves As the command suggest, this will provide a list of the EtherCAT slaves.\nExample:\nethercat slaves 0 0:0 PREOP + EK1100 EtherCAT Coupler (2A E-Bus) 1 0:1 PREOP + EL9227-5500 ?berstromschutz 24V DC, 2K., max. 10A (Summe), eins 2 0:2 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 3 0:3 PREOP + EL5042 2Ch. BiSS-C Encoder 4 0:4 PREOP + EL5042 2Ch. BiSS-C Encoder 5 0:5 PREOP + EL9410 E-Bus Netzteilklemme (Diagnose) 6 0:6 PREOP + EL9576 Bremschopper Klemme 7 0:7 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 8 0:8 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 9 0:9 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 10 0:10 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 11 0:11 PREOP + EK1100 EtherCAT-Koppler (2A E-Bus) 12 0:12 PREOP + EL9227-5500 ?berstromschutz 24V DC, 2K., max. 10A (Summe), eins 13 0:13 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 14 0:14 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 15 0:15 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 16 0:16 PREOP + EL5042 2Ch. BiSS-C Encoder 17 0:17 PREOP + EL5042 2Ch. BiSS-C Encoder 18 0:18 PREOP + EL5042 2Ch. BiSS-C Encoder 19 0:19 PREOP + EL3314 4K. Ana. Eingang Thermoelement (TC) 20 0:20 PREOP + EL9410 E-Bus Netzteilklemme (Diagnose) 21 0:21 PREOP + EL9576 Bremschopper Klemme 22 0:22 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 23 0:23 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 24 0:24 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 25 0:25 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 26 0:26 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 27 0:27 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 28 0:28 PREOP + EKM1101 EtherCAT Coupler (2A E-Bus, ID switch, Diagnostics, is 29 0:29 PREOP + ELM3004-0000 4K. Ana. Eingang +/-30V, 24 bit, hochgenau 30 0:30 PREOP + ELM3146-0000 6Ch. Ana. Input +/-10V, +/-20mA, 24 bit, high prec 31 0:31 PREOP + ELM3602-0002 2Ch. IEPE Sensor, 24 bit, high precision 32 0:32 OP + EP7047-1032 1K. Schrittmotor-Endstufe (50V, 5A) 33 0:33 OP + EP5001-0002 1K. SSI Encoder 34 0:34 PREOP + EP7041-0002 1K. Schrittmotor-Endstufe (50V, 5A) 35 0:35 PREOP + EP7211-0034 1Ch. MDP742 Servo motor output stage with OCT (50V, 36 0:36 PREOP + EP7211-0034 1K. MDP742 Servo-Motor-Endstufe mit OCT (50V, 4,5A 37 0:37 PREOP + EP7211-0034 1K. MDP742 Servo-Motor-Endstufe mit OCT (50V, 4,5A ethercat sdos Download and display the service data objects.\nUse with caution as this command can take a long time to fetch all data. It is advised to limit the download to the specific slave in question, with the -p \u0026lt;slaveID\u0026gt; parameter.\n ethercat pdos Similar to the sdos counterpart, this command will fetch the currently applied process data objects. To avoid excessive output, it is advised to limit the command to a single slave.\nethercat upload With this command the value of a register can be fetched.\nIf the type is not explicitly given, first issue ethercat -p \u0026lt;slaveID\u0026gt; sdos. This will allow implicit type handling.\n Example: Fetch content of register 0x8020, sub-register 0x05 from slave 32.\nethercat upload -m0 -p32 0x8020 0x05 0x03e8 1000 ethercat download With this command the value of a register can be set on the slave.\nIf the type is not explicitly given, first issue ethercat -p \u0026lt;slaveID\u0026gt; sdos. This will allow implicit type handling.\n Example: Set value of register 0x8010, sub-register 0x07 from slave 7 to 314.\nethercat download -m0 -p7 0x8010 0x07 314 ethercat states With this command a specific state of a slave can be forced, or at least an attempt to enter the specific state is made.\nThis is helpful when a slave is stuck, e.g. with an error. Rather than cycle the power of the entire controller, the slave can be set to \u0026lsquo;REBOOT\u0026rsquo;. This might be enough to recover.\nAlternatively, cycling to \u0026lsquo;INIT\u0026rsquo; and back to \u0026lsquo;OP\u0026rsquo; might also be attempted.\nA power cycling of the of the EtherCAT components is the last resort!\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/","title":"ecmc server","tags":[],"description":"","content":" Topics latency issues latency issues High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to:\n The generic device driver is used High load on system \u0026hellip; generic device driver is used Check which driver is in use by running (on the ecmc server):\nlsmod | grep ec_ If the ec_master is using the ec_generic driver then a switch to igb driver is recommended.\nThe file /ioc/hosts/\u0026lt;hostname\u0026gt;/cfg/ETHERCATDRVR is listing the available drivers.\nThe recommended contents of the ETHERCATDRVR file is:\nDEVICE_MODULES=\u0026quot;igb generic\u0026quot; In this case, the system will first try to use igb driver, if not possible it will fallback to the generic driver. After editing the file, the host needs to be rebooted in order for the changes to take effect.\nhigh load on system ** Reduce sample rate** Reducing the ethercat cycle time is often very effichient when it comes to reduce latency. Do not run the ecmc systems faster than needed. The default ecmc sample rate is 1Khz, which in many cases is not needed.\nThe sample rate is defined when require ecmccfg (example set to 500Hz, instead of 1kHz):\nrequire ecmccfg \u0026quot;EC_RATE=500\u0026quot; There are some restrictions on the sample rate. Normally, a rate in the range 100Hz-1Khz is a good choice. For other rates, please check the documentation of slaves in use.\n ** Affinity** Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. At PSI, core 0 is always isolated, do not move any threads to core 0.\n In order to pin the ecmc thread to a single core, add the following line to the startup script (after setAppMode.cmd):\n#- go active (create ecmc_rt) ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd #- Set affinity of ecmc_rt (core 5) epicsThreadSetAffinity ecmc_rt 5 If more than one ecmc ioc is running on the server, then make sure the ecmc_rt threads run on differnt cores.\nAlso other threads might take a lot of resources, for instace the epics thread \u0026ldquo;cbLow\u0026rdquo;:\nafterInit \u0026quot;epicsThreadSetAffinity cbLow 6\u0026quot; cbLow is created at iocInit, therefore the \u0026ldquo;epicsThreadSetAffinity\u0026rdquo; must be executed with the \u0026ldquo;afterInit\u0026rdquo; command.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/","title":"motion","tags":[],"description":"","content":" Topics both_limits error position lag error, (following error), tuning latency issues drive refuse to enable both_limits error The \u0026ldquo;BOTH_LIMITS\u0026rdquo; error can be related to that limits switches are not powered with 24V. As standard at PSI, limts are feed from 24V outputs, normally an EL2819 terminal. Basically the ouptputs needs then to be set to 1 in order to power the switches. Check the schematics in order to find out which output that powers the switches for a certain axis and then use one the following approaches to set it to 1:\nDefine the output in axis yaml file:\naxis: id: 1 # Axis id ... feedSwitchesOutput: ec0.s5.binaryOutput02 # Ethercat entry for feed switches ... By using the commad Cfg.WriteEcEntryEcPath(ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.binaryOutput\u0026lt;id\u0026gt;,\u0026lt;value\u0026gt;):\necmcConfigOrDie \u0026quot;Cfg.WriteEcEntryEcPath(ec0.s5\u0026gt;.binaryOutput02,1)\u0026quot; position lag error A position lag error (following error) can be genereated in the following situations:\n The motor torque is too low, making it hard for the motor to keep up with the setpoint. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. The velocity setpoint is too high resulting in motor stall (common for stepper motors). The velocity setpoint is higher than what the drive can achive (saturated velocity setpoint). 1. motor torque to low First ensure that the mechanics are i good condition and not blocked (over the entire working range). If possible, measure needed torque with a torque meter. Check motor data, can the motor deliver the required torque at the required speed. If not, then a motor with higher torque is needed. Check the current setting of the motor. If possible increase the current setting to get a higher torque. Before increase current to the motor, make sure that both motor and drive can handle the higher current. Extra care needs to be taken for vaccum applications.\n 2. scaling factors are wrong Check the scaling documentation here. One way to test if the scaling is correct is to set all controller parameters (except Kff) to 0 and then initiate a move. Basically the actual position of the axis should follow the setpoint closely with teh same slope. If the slope differs, then the scaling factors are wrong.\n3. the velocity setpoint is too high resulting in stall If a stepper motor stalls because of too high velocity there\u0026rsquo;s a few thing that can be done in order to improve the ability to reach higehr velocities:\n Add a damper: This is nromally very effichient but not always possible. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive), see hardware/tuning If possible, test to increase or reduce current (make sure you do not burn the motor if increasing). Before increase current to the motor, make sure that both motor and drive can handle the higher current. Extra care needs to be taken for vaccum applications.\n 4. velocity higher than allowed by driver For EL704x stepper drives are default setup to maximum veleocity range of +-2000fullsteps/s. The 16bit velocity setpoint that are sent to the drive correspons to this range. Bascially trying to write a higehr value than that will saturate the velocity setpoint resulting in that the required speed is not achived, resulting in position lag error. The speed range for the EL704x can however be changed by setting SDO 8012:05:\n0 for 1000 full steps/second 1 for 2000 full steps/second (default) 2 for 4000 full steps/second 3 for 8000 full steps/second 4 for 16000 full steps/second 5 for 32000 full steps/second After changing this value you also need to change the drive scaling in the axis yaml file.\ndrive refuse to enable First check the dedicated hardware drive panel for diagnostics. If the drive is in warning or error state the diagnose the problem with the tool described in hardware.\nPossible reasons:\n For systems with safety, tripp off STO or power to the drive removed by contactor. Check status of safety system. Over current protection of 48V tripped. No 48V connected. ecmc PLC disabaling axis, check PLC sources. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). Axis object configured with external interlock (yaml-\u0026gt;input.interlock). "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/","title":"EL5042","tags":[],"description":"","content":" Topics No reading Diagnostics Offset LSB Bit [Bit] (0x80p8:17) SSI No reading Could be caused by:\n Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). Bad electrical connection Wrong power supply Defect encoder or EL5042 Long cabling lengths Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading \u0026ldquo;Diagnostics\u0026rdquo;.\nBad electrical connection The serial communication is hanled by two RS422 channels, one for the clock and one for data. These channels can be measured with a scope:\n The clock should output periodic \u0026ldquo;bursts\u0026rdquo; with clock pulses with a short break in between. The bursts should appear in the same rate as the ethercat frame rate (EC_RATE, default 1kHz). And the frequency of the clock pulses should correspond with the setting in your startup script (normally 250kHz..10Mhz depending on configuration) The data channel should return bits in sync with the clock pulses. Lack of clock or data pulses could be caused by (in order of probability):\n short circuit or error in cabling defect/burt encoder No/wrong power supply defect EL5042 (if lack of clock pulses) Wrong power supply Make sure the encoder is powered with the correct voltage. Most encoders require 5V, but there are also some that require 9V, 12V or 24V.\nNever apply a higher voltage than the specified operating voltage for the encoder.\n The EL5042 can supply 5V or 9V. The default setting is 5V and in order to change the setting to 9V a special sequence need to be executed (see EL5042 manual).\nAfter ensuring that the encoder is correctly supplied, the verify the power consumption of the encoder and compare with the specified consumption. If the power consumption does not match, the encoder might be broken or a faulty cabling.\nLong cable lengths Long cable lengths can affect both power supply levels and the serial data channels.\nPower supply:\nLonger cables will normally also result in a higher voltage drops. Especaillay for 5V encoders this can be an issue. Make sure that the voltage are within the specified range by measuring the voltage level close to the encoder.\nIf the voltage is to low (mainly for 5V encoders):\n Can cabling length be reduced Can cable impedance be reduced (higher area) Add a separate (5V) power supply with possabilities to adjust the voltage level to a slightly higher voltage. Make sure the voltage is not too high at the encoder end. Serial communication: The serial communication is also affected by the cable legth. For long cable lengths a reduction of the clock rate can be needed. The clock rate can be reduced by setting the CLK_FRQ_KHZ macro in the call to applyComponent.cmd (set clock freq. to 500kHz):\n${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,MACROS=\u0026#39;CLK_FRQ_KHZ=500\u0026#39;\u0026#34; For EL5042 the following rates are availble:\n 10 MHz 5 MHz 3.33 MHz 2.5 MHz default for some encoders 2 MHz 1 MHz Max for SSI and default for some encoders 500 kHz 250 kHz NOTE: The closest freq. equal or higher than CLK_FRQ_KHZ will be selected.\nDiagnostics The diagnostic data can be read from register Index A0p8 FB BiSS-C Diag data (for Ch.1, p = 0; Ch.2, p = 1):\nThe ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics:\nbash read_el5042_diag.sh \u0026lt;master_id\u0026gt; \u0026lt;slave_id\u0026gt; \u0026lt;channel_id\u0026gt; NOTE: The channel id starts at 0. First encoder channel is 0.\nExample: master 1, slave 14, channel 0\n# first login to ecmc server $ bash read_el5042_diag.sh 1 14 0 ######################################################### Reading EL5042 Ch 0 status at master id 1 and slave id 14: Power supply present: 0x01 1 Error: 0x00 0 SDC Error: 0x01 1 WD Error: 0x01 1 Data valid: 0x00 0 Data raw value: 0x0000000000000000 0 ######################################################### Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics.\nOffset LSB Bit [Bit] (0x80p8:17) When using the LSB offset, the same amount of ones (\u0026ldquo;1\u0026rdquo;) will be shifted in as MSB. Therefore the LSB offset should normally not be used.\n When using the LSB offset setting, the same amout of bits needs to be subtracted from the ST_BITS or MT_BITS\nExample: 26bit RLS, no LSB offset\n${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,OFF_BITS=0\u0026quot; Example: 26bit RLS with 3 bits offset (ST_BITS=23, OFF_BITS=0)\n#If the offset is needed then the sum of the bit's still need to match the bitcount of the encoder. Example: Offset 3 LSB bits, set ST_BITS=23 (26-3) ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-Generic-BISS-C,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=23,CLK_FRQ_KHZ=1000,OFF_BITS=3\u0026quot; SSI The entire SSI frame needs to covered in MT_BITS and ST_BITS (also status bits and startup bits), also see \u0026ldquo;Offset LSB Bit\u0026rdquo; above. Enabling status bits by SDO (0x80p8:02) will not work, seems only valid for BISS-C (kind of hints this in manual). If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning).\n Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28)\n${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=28,CLK_FRQ_KHZ=1000,CODING=0\u0026quot; Some SSI encoders, i.e. Posital kit SSI, also send startup bits. These also needs to be accounted for in the ST_BITS and MT_BITS.\nExample: Posital kit SSI encoder, KCD-S1X3B-1617-IE4F-GRQ\n# Specs: # Single turn bits 17 # Multiturn bits: 16 # Status bits: 2 # Startup bits 8 (zeros) # This then results in: # MT_BITS=16 + 8 = 24 (multi turn bits + startup bits) # ST_BITS=17 + 2 = 19 (single trun bits + status bits) ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=24,ST_BITS=19\u0026quot; The status bits can then be masked away by:\n Using the LSB offset (set to 2 and reduce ST_BITS to 26), then the status bits are shifted away already in EL5042 hardware. Then you cannot access the status bits (to use from PLC or for interlock) Setting a mask in axis yaml file (encoder.mask: 0xFFFFFFC), in this case the encoder.absBits should not be used because it\u0026rsquo;s automatically calculated by the mask command. Then you can reach the bits in the raw encoder value. "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/","title":"hardware","tags":[],"description":"","content":" Topics ecmc server EL5042 EL70x1 EL9xxx "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/","title":"knowledge base","tags":[],"description":"","content":" Topics general ethercat command line interface motion hardware tuning manual motion troubleshooting Due to the complexity an EtherCAT bus topology can assume, troubleshooting can be challenging. This guide should provide the basic means to diagnose simple errors and is by no means complete!\ngeneral problems For general issues, a very short troubleshooting guide is provided here.\ncommand line interface A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible here.\nmotion For motion related issues, a very short troubleshooting guide is provided here.\ndrive tuning Tune drive control loops\nhardware For hardware related issues, a very short troubleshooting guide is provided here.\nmanual motion Trigger manual motion (without motion ecmc-axis).\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/","title":"modes","tags":[],"description":"","content":"ecmc modes ecmc can be started in different modes by setting the MODE parameter to startup.cmd (or require ecmccfg):\n FULL DAQ NO_MR A separate mode for commissioning is also available, called ENG_MODE.\nmode==FULL (default) In FULL mode all ecmc functionalities are supported, like motion, daq and plcs.\nExample of starting ecmc in FULL mode:\n$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, \u0026quot;IOC=$(IOC),ECMC_VER=develop,MODE=FULL\u0026quot; # or since FULL mode is default the MODE parameter can be ignored $(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, \u0026quot;IOC=$(IOC),ECMC_VER=develop\u0026quot; mode==DAQ In DAQ mode, motion functionalities are disabled and the following commands are blocked:\n configureAxis.cmd configureVirtualAxis.cmd addAxis.cmd addVirtualAxis.cmd This mode is intended to be used for pure DAQ use cases.\nExample of starting ecmc in DAQ mode:\n$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, \u0026quot;IOC=$(IOC),ECMC_VER=develop,MODE=DAQ\u0026quot; NOTE: The default record update rate is set to 10ms in initAlll.cmd. For DAQ applications it could be needed to change this parameter to update records faster by changing the ECMC_SAMPLE_RATE_MS variable:\nepicsEnvSet(\u0026quot;ECMC_SAMPLE_RATE_MS\u0026quot;,1) mode==NO_MR In this mode all features are supported, but motor record will not be created for motion axes.\nENG_MODE Setting the parameter ENG_MODE=1 will result in loading of extra PVs usefull for commissioning, i.e. controller parameters for motion axes.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/stepper_biss_c/","title":"stepper and biss-c","tags":[],"description":"","content":"setup EL7041 stepper drive slave EL5042 BISS-C encoder slave Lab test stage (1mm/rev) Lab 4 axis motion control box RLS BISS-C linear encoder (absolute) Open loop encoder (incremental) scalings Config for scaling in mm, mm/s, mm/s2\nencoder scalings Two encoders are configured:\n Closed loop: BISS-C. This is used as the default encoder for control Open loop: EL7041 Step counter Both these encoders (and drive) should be scaled to the same unit (mm).\nRLS BISS-C (encoder 1) RLS BISS-C:\n encoder.numerator: Travels 1 mm/rev (linear encoder) encoder.denominator: Resolution: 4096 counts per = 1mm encoder.absBits: 26 bits encoder.type: Absolute (type 1) ecnoder.absOffset: Offset to 0 position of linear stage (-1408.794 in this example) encoder: desc: BISS-C numerator: 1 # Scaling numerator example 1 mm/rev denominator: 4096 # Scaling denominator example 4096 ticks per 360 degree type: 1 # Type: 0=Incremental, 1=Absolute bits: 26 # Total bit count of encoder raw data absBits: 26 # Absolute bit count (for absolute encoders) always least significant part of 'bits' absOffset: -1408.794 # Encoder offset in eng units (for absolute encoders) position: ec0.s$(ENC_SID).positionActual${ENC_CH=01} # Ethercat entry for actual position input (encoder) status: ec0.s$(ENC_SID).encoderStatus${ENC_CH=01} # mandatory only if 'warning' or 'error' are used ready: 2 # Bit in encoder status word for encoder ready warning: 0 # Warning (optional) error: # max 3 (optional) - 1 # Error 0 Hardware configuration EL5042\nDo not use the LSB offset functionality of the EL5042 (0x80p8:17). The same amount of ones (\u0026ldquo;1\u0026rdquo;) will be shifted in as MSB which then normally leads to a higher position value, which is confusing. For more information see the troubleshootuing/hardware section.\n open loop (encoder 2) The EL7041 drive has a build in micro step counter (64 microsteps/fullstep):\n encoder.numerator: Travels 1 mm/rev encoder.denominator: Resolution: 200*64=12800 microsteps/rev = 12800 microsteps/mm encoder.bits: The counter is 16bit (default) encoder.type: Incremental (type 0) encoder: desc: 'Open loop' unit: mm numerator: 1 # Scaling numerator denominator: 12800 # Scaling denominator type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data absBits: 0 # Absolute bit count (for absolute encoders) absOffset: 0 # Encoder offset in eng units (for absolute encoders) position: ec0.s$(DRV_SID).positionActual01 # Ethercat entry for actual position input (encoder) homing: refToEncIDAtStartup: 1 # Ref encoder at startup (to BISS value) drive scalings The EL7041 is default setup to operate in a velocity range of +-2000 full steps/s which then corresponds to the 16bit drive.setpoint parameter (ec0.s$(DRV_SID).velocitySetpoint01):\n drive.numerator: Max velo = 2000 fullsteps/s == 10mm/s drive.denominator: velocity setpoint is 16bit == +-15bit = 32768 drive.type: Stepper drive, set to 0 drive: numerator: 10 # Fastest speed in eng. units (2000 Fullsteps/s==10mm/s) denominator: 32768 # I/O range for ECMC_EC_ALIAS_DRV_VELO_SET (normally +-16bit) type: 0 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives) setpoint: ec0.s$(DRV_SID).velocitySetpoint01 # Velocity setpoint if CSV. Position setpoint if CSP control: ec0.s$(DRV_SID).driveControl01 # Control word ethercat entry enable: 0 # Enable bit index in control word (not used if DS402) reset: 1 # Reset bit in control word (if no drive reset bit then leave empty) reduceTorque: 2 # Reduce torque bit in drive control word reduceTorqueEnable: True # Enable reduce torque functionality status: ec0.s$(DRV_SID).driveStatus01 # Status word ethercat entry enabled: 1 # Enabled bit index in status word (not used if DS402) warning: 2 # Warning bit in status word (if no drive warning bit then leave empty) error: # max 3 error bits in status word - 3 # Error 0 (if no drive error bit then leave empty) - 7 # Error 1 (if no drive error bit then leave empty) - 14 # Error 2 (if no drive error bit then leave empty) switches In standard setup switches are feed from 24V output, for the lab 4ax motion crate this is not the case. However, the configuration for feeding switches (axis.feedSwitchesOutput) have been added anyway:\naxis: id: 1 # Axis id feedSwitchesOutput: ec0.s5.binaryOutput01 # Ethercat entry for feed switches At PSI, the limit switches are connected directlly to the 2 inputs of the EL70xx stepper drives and are accessible in the status word, bit 11 and 12:\ninput: limit: forward: ec0.s$(DRV_SID).driveStatus01.12 # Ethercat entry for low limit switch input backward: ec0.s$(DRV_SID).driveStatus01.11 # Ethercat entry for high limit switch input home: 'ec0.s$(DRV_SID).ONE.0' # Ethercat entry for home switch interlock: 'ec0.s$(DRV_SID).ONE.0' # Ethercat entry for interlock switch input Always verify where the switches are connected in the electrical drawings.\n All switches in the \u0026ldquo;input\u0026rdquo; section needs to be linked. If not used, then the simulation registers, \u0026ldquo;ONE\u0026rdquo; and \u0026ldquo;ZERO\u0026rdquo;, can be used:\n 32 bit register of ones (rw): ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.ONE. 32 bit register of zeros (rw): ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.ZERO. Example, Use bit 1 in the ONE register of slave 1:\nec0.s1.ONE.1 If no ethercat slave is defined, slave number \u0026ldquo;-1\u0026rdquo; can be used: ec\u0026lt;master_id\u0026gt;.s-1.ONE.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/syntax/","title":"syntax","tags":[],"description":"","content":"In ECMC, PLCs are based on the exprtk expression evaluation library. For detailed syntax help please visit the exprtk website\ncommon errors, misconceptions and info operators :=: assignment = or ==: equal comparison functions PLC do not immediately write to the bus! The PLC will excecute synchronous to the cycle, or at an integer fraction of it. The prcessed data will be send to the bus with the next cycle. PLCs do not delay the bus!\nstatement terminator Statements are terminated by a semicolon ;\nvariables All variables are initiated to 0\ncomments The hash charactoer # is reserved for comments. Everything after this char will be removed before compile. println('########'); will be seen by the compiler as println(' !\n macros So far macro substitution is not implemented for yaml!\n If macro substitution is needed, please use the traditional approach using loadPLCFile.cmd, with the PLC_MACROS variable.\n examples PLC can access:\n variables process data axis PLCs data storage Function examples are given at the end.\nCustom function libs in exprtk syntax can be added and loaded to the PLC objects.\n Custom plc functions can be written in c in plugins.\n general # # 1. Assignment: # ec0.s1.VALUE:=100; # # 2. if-else (note the equl sign): # if(ec0.s1.VALUE=100) { # # code # } # else { # # code # }; # # 3. for loop: # for (static.i := 0; static.i \u0026lt; static.elements; static.i += 1) { # # code # }; # # 4. printouts (minimize printouts or use only for debug): # print(\u0026#34;The value of ec0.s1.VALUE is: \u0026#34;,ec0.s1.VALUE); # Without line feed # println(\u0026#34;The value of ec0.s1.VALUE is: \u0026#34;,ec0.s1.VALUE); # With line feed # # Also see the \u0026#34;ec_print_bin()\u0026#34; and \u0026#34;ec_print_hex()\u0026#34; below. variables generic # 1. static.\u0026lt;varname\u0026gt; Static variable. Initiated to 0. (rw) # Access only in the PLC where defined. # Will keep value between execution # loops. # 2. global.\u0026lt;varname\u0026gt; Global variable. Initiated to 0. (rw) # Access from all PLCs. # Will keep value between execution # loops. # 3. var \u0026lt;varname\u0026gt; Local variable (exprtk syntax) (rw) # Will NOT keep value between # execution loops. EtherCAT # 1. ec\u0026lt;ecid\u0026gt;.s\u0026lt;sid\u0026gt;.\u0026lt;alias\u0026gt; ethetcat data (rw) # ecid: ethercat master index # sid: ethercat slave bus position # alias: entry name as defined in # \u0026#34;Cfg.EcAddEntryComplete() # 2. ec\u0026lt;ecid\u0026gt;.masterstatus Status of master (1=OK) motion # 1. ax\u0026lt;id\u0026gt;.id axis id (ro) # 2. ax\u0026lt;id\u0026gt;.reset reset axis error (rw) # 3. ax\u0026lt;id\u0026gt;.counter execution counter (ro) # 4. ax\u0026lt;id\u0026gt;.error error (ro) # 5. ax\u0026lt;id\u0026gt;.allowplccmd Allow writes to axis from PLC (rw) # 6. ax\u0026lt;id\u0026gt;.enc.actpos actual position (rw) # 7. ax\u0026lt;id\u0026gt;.enc.extactpos actual position from plc sync. # expression (ro) # 8. ax\u0026lt;id\u0026gt;.enc.actvel actual velocity (ro) # 9. ax\u0026lt;id\u0026gt;.enc.rawpos actual raw position (ro) # 10. ax\u0026lt;id\u0026gt;.enc.source internal source or expressions (rw) # source = 0: internal encoder # source \u0026gt; 0: actual pos from expr # 11. ax\u0026lt;id\u0026gt;.enc.homed encoder homed (rw) # 12. ax\u0026lt;id\u0026gt;.enc.homepos homing position (rw) # 13. ax\u0026lt;id\u0026gt;.traj.setpos curent trajectory setpoint (rw) # 14. ax\u0026lt;id\u0026gt;.traj.targetpos target position (rw) # 15. ax\u0026lt;id\u0026gt;.traj.extsetpos current trajecrory setpoint from # plc sync. expression (rw) # 16. ax\u0026lt;id\u0026gt;.traj.targetvel target velocity setpoint (rw) # 17. ax\u0026lt;id\u0026gt;.traj.targetacc target acceleration setpoint (rw) # 18. ax\u0026lt;id\u0026gt;.traj.targetdec target deceleration setpoint (rw) # 19. ax\u0026lt;id\u0026gt;.traj.setvel current velocity setpoint (ro) # 20. ax\u0026lt;id\u0026gt;.traj.setvelffraw feed forward raw velocity (ro) # 21. ax\u0026lt;id\u0026gt;.traj.command command (rw) # command=1: move velocity # command=2: move rel. pos # command=3: move abs. pos # command=10: homing # 22. ax\u0026lt;id\u0026gt;.traj.cmddata cmddat. Homing procedure # only valid if ax\u0026lt;id\u0026gt;.traj.command=10 # cmddata=1 : ref low limit # cmddata=2 : ref high limit # cmddata=3 : ref home sensor # (via low limit) # cmddata=4 : ref home sensor # (via high limit) # cmddata=5 : ref center of home sensor # (via low limit) # cmddata=6 : ref center of home sensor # (via high limit) # cmddata=15 : direct homing # cmddata=21 : ref partly abs. encoder # (via low limit). # ref at abs bits. # over/under-flow.. # cmddata=22 : ref partly abs. encoder # (via high limit). # ref at abs bits. # over/under-flow.. # 23. ax\u0026lt;id\u0026gt;.traj.source internal source or expressions (rw) # source = 0: internal traj # source \u0026gt; 0: setpoints from expr # 24. ax\u0026lt;id\u0026gt;.traj.execute execute motion command (rw) # 25. ax\u0026lt;id\u0026gt;.traj.busy axis busy (ro) # 26. ax\u0026lt;id\u0026gt;.traj.dir axis setpoint direction (ro) # ax\u0026lt;id\u0026gt;.traj.dir\u0026gt;0: forward # ax\u0026lt;id\u0026gt;.traj.dir\u0026lt;0: backward # ax\u0026lt;id\u0026gt;.traj.dir=0: standstill # 27. ax\u0026lt;id\u0026gt;.cntrl.error actual controller error (ro) # 28. ax\u0026lt;id\u0026gt;.cntrl.poserror actual position error (ro) # 29. ax\u0026lt;id\u0026gt;.cntrl.output actual controller output (ro) # 30. ax\u0026lt;id\u0026gt;.drv.setvelraw actual raw velocity setpoint (ro) # 31. ax\u0026lt;id\u0026gt;.drv.enable enable drive command (rw) # 32. ax\u0026lt;id\u0026gt;.drv.enabled drive enabled (ro) # 33. ax\u0026lt;id\u0026gt;.seq.state sequence state (homing) (ro) # 34. ax\u0026lt;id\u0026gt;.mon.ilock motion interlock (both dir) (rw) # ax\u0026lt;id\u0026gt;.mon.ilock=1: motion allowed # ax\u0026lt;id\u0026gt;.mon.ilock=0: motion not allowed # 35. ax\u0026lt;id\u0026gt;.mon.ilockbwd motion interlock bwd dir (rw) # ax\u0026lt;id\u0026gt;.mon.ilockbwd=1: motion allowed # ax\u0026lt;id\u0026gt;.mon.ilockbwd=0: motion not allowed # 36. ax\u0026lt;id\u0026gt;.mon.ilockfwd motion interlock fwd dir (rw) # ax\u0026lt;id\u0026gt;.mon.ilockfwd=1: motion allowed # ax\u0026lt;id\u0026gt;.mon.ilockfwd=0: motion not allowed # 37. ax\u0026lt;id\u0026gt;.mon.attarget axis at taget (ro) # 38. ax\u0026lt;id\u0026gt;.mon.lowlim low limit switch (ro) # 39. ax\u0026lt;id\u0026gt;.mon.highlim high limit switch (ro) # 40. ax\u0026lt;id\u0026gt;.mon.homesensor home sensor (ro) # 41. ax\u0026lt;id\u0026gt;.mon.lowsoftlim low soft limit (rw) # 42. ax\u0026lt;id\u0026gt;.mon.highsoftlim high soft limit (rw) # 43. ax\u0026lt;id\u0026gt;.mon.lowsoftlimenable low soft limit enable (rw) # 44. ax\u0026lt;id\u0026gt;.mon.highsoftlimenable high soft limit enable (rw) # 45. ax\u0026lt;id\u0026gt;.blockcom Enables/disables \u0026#34;set\u0026#34; commands (rw) # via command parser (ascii commands) # Statuses can still be read. # Exceptions (\u0026#34;set\u0026#34;-commands) that # will work: # - \u0026#34;StopMotion(axid)\u0026#34; # - \u0026#34;Cfg.SetAxisBlockCom(axid,block)\u0026#34; # 46. ax\u0026lt;id\u0026gt;.ctrl.kp Set PID-controller kp (rw) # 47. ax\u0026lt;id\u0026gt;.ctrl.ki Set PID-controller ki (rw) # 48. ax\u0026lt;id\u0026gt;.ctrl.kd Set PID-controller kd (rw) # 49. ax\u0026lt;id\u0026gt;.ctrl.kff Set PID-controller kff (rw) PLC # 1. plc\u0026lt;id\u0026gt;.enable plc enable (rw) # (end exe with \u0026#34;plc\u0026lt;id\u0026gt;.enable:=0#\u0026#34; # Could be usefull for startup # sequences) # 2. plc\u0026lt;id\u0026gt;.error plc error (rw) # Will be forwarded to user as # controller error. # 3. plc\u0026lt;id\u0026gt;.scantime plc sample time in seconds (ro) # 4. plc\u0026lt;id\u0026gt;.firstscan true during first plc scan only (ro) # usefull for initiations of variables # 5. ax\u0026lt;id\u0026gt;.plc.enable Same as plc\u0026lt;id\u0026gt;.enable but for # axis \u0026lt;id\u0026gt; sync plc. # 6. ax\u0026lt;id\u0026gt;.plc.error Same as plc\u0026lt;id\u0026gt;.error but for # axis \u0026lt;id\u0026gt; sync plc. # 7. ax\u0026lt;id\u0026gt;.plc.scantime Same as plc\u0026lt;id\u0026gt;.scantime but for # axis\u0026lt;id\u0026gt; sync plc. # 8. ax\u0026lt;id\u0026gt;.plc.firstscan Same as plc\u0026lt;id\u0026gt;.firstscan but for # axis \u0026lt;id\u0026gt; sync plc. data storage # 1. ds\u0026lt;id\u0026gt;.size Set/get size of data storage (rw) # Set will clear the data storage # 2. ds\u0026lt;id\u0026gt;.append Add new data at end (rw) # Current position index will be # increased # 3. ds\u0026lt;id\u0026gt;.data Set/get data ar current position (rw) # 4. ds\u0026lt;id\u0026gt;.index Set/get current position index (rw) # 5. ds\u0026lt;id\u0026gt;.error Data storage class error (ro) # 6. ds\u0026lt;id\u0026gt;.clear Data buffer clear (set to zero) (ro) # 7. ds\u0026lt;id\u0026gt;.full True if data storage is full (ro) functions EtherCAT # # 1. retvalue = ec_set_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Sets bit at bitindex position of value. Returns the new value. # # 2. retvalue = ec_wrt_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;wrtValue\u0026gt;, : Value of bit to write # \u0026lt;bitindex\u0026gt; : Bit index # ); # Write wrtValue to a bit at bitindex position of value. Returns the new value. # # 3. retvalue = ec_wrt_bits( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;wrtValue\u0026gt;, : Value of bit to write # \u0026lt;startBit\u0026gt; : Start bit index (lsb is bit 0) # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. # # 4. retvalue = ec_clr_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Clears bit at bitindex position of value. Returns the new value. # # 5. retvalue = ec_flp_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Flips bit at bitindex position of value. Returns the new value. # # 6. retvalue = ec_chk_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Checks bit at bitindex position of value. Returns the value of bit. # # 7. retvalue = ec_chk_bits( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;startBit\u0026gt; : Start bit index (lsb is bit 0) # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Checks range of bits (startBit..stopBit) of value. Returns the value of bits. # # 8. retvalue = ec_print_hex( # \u0026lt;value\u0026gt;, : Value to print # \u0026lt;startBit\u0026gt; : Start bit index # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Prints \u0026lt;startBit\u0026gt; to \u0026lt;stopBit\u0026gt; of \u0026lt;value\u0026gt; in hex format # Returns error code or 0 if success. # # 9. retvalue = ec_print_bin( # \u0026lt;value\u0026gt;, : Value to print # \u0026lt;startBit\u0026gt; : Start bit index # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Prints \u0026lt;startBit\u0026gt; to \u0026lt;stopBit\u0026gt; of \u0026lt;value\u0026gt; in bin format # Returns error code or 0 if success. # # 10. retvalue = ec_mm_cp( # \u0026lt;srcId\u0026gt;, : Source memmap index # \u0026lt;sdestId\u0026gt; : Dest memmap index # ); # Copies data from source memmap to dest memmap. The memmap ids are defined by the # order they are created (starting at 0). The smallest memmap size will define the # amout of data copied. Returns 0 for success or an error code. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # # 11. retvalue = ec_get_mm_type( # \u0026lt;srcId\u0026gt;, : Source memmap index # ); # Returns data type of memmap: # 0 = Not defined (Use \u0026#34;Cfg.EcAddMemMapDT()\u0026#34; instead of \u0026#34;Cfg.EcAddMemMap()\u0026#34;) # 1 = (Not valid for memmap) # 2 = (Not valid for memmap) # 3 = (Not valid for memmap) # 4 = (Not valid for memmap) # 5 = U8 # 6 = S8 # 7 = U16 # 8 = S16 # 9 = U32 # 10 = S32 # 11 = U64 # 12 = S64 # 13 = F32 # 14 = F64 # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # # 12. retvalue = ec_get_mm_data( # \u0026lt;srcId\u0026gt;, : Source memmap index # \u0026lt;index\u0026gt; : Index of data element # ); # Reads data element at index from memmap with srcId and returns value. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 13. retvalue = ec_set_mm_data( # \u0026lt;srcId\u0026gt;, : Source memmap index # \u0026lt;index\u0026gt; : Index of data element # \u0026lt;data\u0026gt; : Data to write # ); # Writes data element at index from memmap with srcId. Returns 0 for success or an error code. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 14. retvalue = ec_get_mm_size( # \u0026lt;srcId\u0026gt;, : Source memmap index # ); # Returns number of elements (of type \u0026#34;ec_get_mm_type()\u0026#34;)in memmap with srcId. # If return value is less than zero it should be considered to be an error code. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 14. retvalue = ec_mm_ds_append( # \u0026lt;mmId\u0026gt;, : Source memmap index # \u0026lt;dsId\u0026gt;); : Destination data storage index # Returns Error code or zero if success # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 15. retvalue = ec_mm_append_to_ds_scale_offset( # \u0026lt;mmId\u0026gt;, : Source memmap index # \u0026lt;dsId\u0026gt; : Destination data storage index # \u0026lt;scale\u0026gt; : Scale # \u0026lt;offset\u0026gt;); : Offset # # Returns Error code or zero if success # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 16. retvalue = ec_mm_push_asyn( # \u0026lt;mmId\u0026gt;) : Source memmap index. # push memap data to epics (can be used if T_SMP_MS=-1 for the param) # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 17. retvalue = ec_get_time(); # Returns current time in nano seconds (from 1 Jan 2000, same as EtherCAT DC:s). # If return value is less than zero it should be considered to be an error code. # # 18. retvalue = ec_get_time_l32(); # Returns lower 32 bits of current time in nano seconds (from 1 Jan 2000, same as EtherCAT DC:s). # If return value is less than zero it should be considered to be an error code. # # 19. retvalue = ec_get_time_u32(); # Returns upper 32 bits of current time in nano seconds (from 1 Jan 2000, same as EtherCAT DC:s). # If return value is less than zero it should be considered to be an error code. # # 20. retvalue=ec_get_err(): # Returns error code from last lib call. # # 21. retvalue=ec_err_rst(): # Resets error code for ec_lib. Master to Master communication (within same host) Support for communication between different ecmc ioc:s running on the same host. A shared memory buffer of 120 doubles can be accessed for read and write operations by alll ecmc ioc running on the same master.\n# 1. retvalue = m2m_write( # \u0026lt;index\u0026gt;, : Mem buffer index (index must be 0..119) # \u0026lt;value\u0026gt;): : value to write # returns 0 if success or error code. # Write a value to an index of a common memory buffer accessible by all masters running on same host # # 2. retvalue = m2m_read(\u0026lt;index\u0026gt;); : Mem buffer index (index must be 0..119) # # returns the value stored at index in the shared mem buffer. # # 3. retvalue = m2m_stat(); # # returns 1 if connection to shared memory is OK, else 0 or a negative value with an errro code. # # 4. m2m_err_rst(); # # reset any m2m error codes. # # 5. retvalue = m2m_err_rst(); # # returns current m2m error code. # # 6. retvalue = m2m_ioc_ec_ok(\u0026lt;master_index\u0026gt;); # # returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). # # 7. retvalue = m2m_ioc_run(\u0026lt;master_index\u0026gt;); # # checks of a certian master is running (negative master id is ioc:s without ec master). Motion # 1. retvalue = mc_move_abs( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;pos\u0026gt;, : Target position # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ): # Absolute motion of axis. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 2. retvalue = mc_move_rel( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;pos\u0026gt;, : Target position # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ); # Relative motion of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 3. retvalue = mc_move_ext_pos( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ); # Move to current external plc position. Functions intended use is to # move to the start position for syncronized axes. This command is exactly # the same as issueing \u0026#34;mc_move_pos()\u0026#34; with the target postion ax\u0026lt;id\u0026gt;.traj.extsetpos. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # # 4. retvalue = mc_move_vel( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ); # Constant velocity motion of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 5. retvalue = mc_home( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;seqId\u0026gt;, : Motion sequence # \u0026lt;velTwoardsCam\u0026gt;, : Target Velocity twords cam # \u0026lt;velOffCam\u0026gt; : Target velocity off cam # ); # Perform a homing sequence of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 6. retvalue = mc_home_pos( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;seqId\u0026gt;, : Motion sequence # \u0026lt;velTwoardsCam\u0026gt;, : Target Velocity twords cam # \u0026lt;velOffCam\u0026gt; : Target velocity off cam # \u0026lt;homePos\u0026gt; : Homing position # ); # Perform a homing sequence of axis \u0026lt;axIndex\u0026gt; # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 7. retvalue = mc_halt( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # ); # Stop motion of axis \u0026lt;axIndex\u0026gt;. # Command is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 8. retvalue = mc_power( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;enable\u0026gt;, : Enable power # ); # Enable power of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 9. retvalue = mc_get_busy( # \u0026lt;axIndex\u0026gt;, : Axis index# # ); # Check if axis is busy. # returns busy state of axis (1 if busy and 0 if not busy). # # 10. retvalue = mc_get_homed( # \u0026lt;axIndex\u0026gt;, : Axis index# # ); # Check if axis is homed. # returns state of homed flag of axis (1 if homed and 0 if not homed). # # 11. retvalue = mc_get_err(); # Returns error code for last lib call. # # 12. retvalue = mc_reset(\u0026lt;axIndex\u0026gt;); # Resets error of motion axis. # # 13. retvalue = mc_get_axis_err(\u0026lt;axIndex\u0026gt;); # Returns motion axis error code. # # 14. retvalue = mc_set_enable_motion_funcs( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;enablePos\u0026gt;, : Enable positioning # \u0026lt;enableVelo\u0026gt;, : Enable const velo # \u0026lt;enableHome\u0026gt;, : Enable const homing # ); # # Enables/disables motion functionalities. Returns error code. # # 15. retvalue = mc_get_act_pos( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;encIndex\u0026gt; : Encoder index # ); # # Returns encoder position for any of the configured encoders of an axis. # # 16. retvalue = mc_set_prim_enc( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;encIndex\u0026gt; : Encoder index # ); # # Sets primary and homing encoder index of the axis (the encoder used for control). # The primary encoder can only be changed when the axis is not busy. # # Returns motion axis error code. # # 17. retvalue = mc_get_prim_enc( # \u0026lt;axIndex\u0026gt;, : Axis index # ); # # Returns primary encoder index of the axis (the encoder used for control). # # 18. mc_set_axis_error( # \u0026lt;axis_id\u0026gt;, : Axis index # \u0026lt;error_code\u0026gt; : Error code to set # ); # # Sets an arbitrary error code to an axis object. # # 19. mc_set_slaved_axis_in_error( # \u0026lt;axis_id\u0026gt;, : Axis index # ); # # Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). Motion Group # 1. mc_grp_get_enable( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group have the enable bit set, else false. # Note: The axes do not need to be enabled if this function returns true, see mc_grp_get_enabled(). # # 2. mc_grp_get_any_enable( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if atleast one axis in the group has the enable bit set, else false. # # 3. mc_grp_get_enabled( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group are in enabled state, else false. # # 4. mc_grp_get_any_enabled( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if atleast one axis in the group is in enabled state, else false. # # 5. mc_grp_get_busy( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group are in busy state, else false. # # 6. mc_grp_get_any_busy( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if atleast one axis in the group is in busy state, else false. # # 7. mc_grp_get_any_error_id( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns error id if atleast one axis in the group is in error state, else zero. # # 8. mc_grp_set_enable( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;enable\u0026gt; : Enable state # ); # # Sets enable for all axes in group. # Returns 0 or error id. # # 9. mc_grp_set_traj_src( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;source\u0026gt; : Trajectory source (0 = internal, 1 = external/PLC ) # ); # # Sets trajectory source for all axes in group. # Returns 0 or error id. # # 10. mc_grp_set_enc_src( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;source\u0026gt; : Encoder source (0 = internal, 1 = external/PLC ) # ); # # Sets encoder source for all axes in group. # Returns 0 or error id. # # 11. mc_grp_reset_error( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Resets error of all axes in group. # # 12. mc_grp_set_error( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;error_id\u0026gt; : Error Id # ); # # Set error id of all axes in group. # # 13. mc_grp_set_slaved_axis_in_error( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) # # 14. mc_grp_halt( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Halt all axes in group (only works if traj source = internal/0) # # 15. mc_grp_axis_in_grp( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;axis_id\u0026gt;, : Axis index # ); # # Returns true if axis is in group, else false. # # 16. mc_grp_size( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns the number of axes in group. # # # 17. mc_grp_get_traj_src_ext( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group have trajectory source set to external. # # 18. mc_grp_get_any_traj_src_ext( # \u0026lt;grp_id\u0026gt;, : Group index # ); # Returns true if atleast one axis in the group have trajectory source set to external. # # 19. mc_grp_set_allow_src_change_when_enabled( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;allow\u0026gt;, : Allow change of source # ); # Allow source change for trajectory and encoder when axis is enabled. # # 20. mc_grp_sync_act_set( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;sync\u0026gt;, : Sync yes or no # ); # 1. Sync ecmc current setpoint with actual value (if not enabled and internal mode) # 2. Sync MR at next poll (maximum once). # Data Storage # 1. retvalue = ds_append_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;data\u0026gt;, : Data # ); # Append data to data storage. # returns 0 if success or error code. # # 2. retvalue = ds_clear_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Clear data to data storage. # returns 0 if success or error code. # # 3. retvalue = ds_get_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;bufferIndex\u0026gt;, : Buffer index # ); # Returns data from buffer. # # 4. retvalue = ds_set_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;bufferIndex\u0026gt;, : Buffer index # ); # Sets data in data storage buffer. # returns 0 if success or error code. # # 5. retvalue = ds_get_buff_id( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns current buffer index. # # 6. retvalue = ds_set_buff_id( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;bufferIndex\u0026gt;, : Buffer index # ); # Sets current buffer index in data storage buffer. # returns 0 if success or error code. # # 7. retvalue = ds_is_full( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns true if buffer is full. # # 8. retvalue = ds_get_size( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns buffer size of data storage. # # 9. retvalue = ds_get_err() # Returns error code for last lib call. # # 10. retvalue = ds_push_asyn( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Triggers push of all asyn parameters in ds to EPICS (including data). # # 11. retvalue = ds_get_avg( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns average of the values in the data storage. # # 12. retvalue = ds_get_min( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns minimum of the values in the data storage. # # 13. retvalue = ds_get_max( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns maximum of the values in the data storage. # # 14. retvalue=ds_append_to_ds( # \u0026lt;dsFromId\u0026gt;, : Source data storage index # \u0026lt;dsFromDataId\u0026gt;, : Source data element index # \u0026lt;elements\u0026gt;, : Number of elements to copy # \u0026lt;dsToId\u0026gt; : Destination data storage index # ); # Appends data at the current position of the destination data storage (dsToId). The data source is defined by (dsFromId) and the selected tion (dsFromDataId) and element count (elements). # # 15. retvalue=ds_err_rst(): # Resets error code for ds_lib. # "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisyaml/","title":"yaml configuration","tags":[],"description":"","content":"Since ecmccfg v7, the axis configuration is based on yaml files. Backwards compatibility for classic EPICS environment variable based configuration is assured for legacy systems.\n yaml is - like python - indentation sensitive!\n Indent with 2 spaces.\n introduction python 3.x is required\n The config is processed by a python script with a jinja2 backend. The processor will complain if mandatory keys are missing. Likewise, missing optional keys are populated with default values.\nThe script invokes a python script which subsequently uses a jinja2 processor to render the respective templates. The script will create a python virtual environment and install the required libraries automatically.\n The configuration is separated into the following mandatory sections:\n axis epics drive (only mandatory for physical axis) encoder controller trajectory input in addition the following optional sections are available.\n output homing softlimits monitoring Each sections provides an example, the optional keys are commented.\n axis mandatory\n id: unique numeric identifier of the axis optional\n type: type of the axis mode: operating mode of the drive parameters: additional parameters axis: id: 1 # type: joint # axis types: # 1 (equiv: physical, joint, j, motor, real) # 2 (equiv: virtual, end_effector, endeffector, ee, e) # mode: CSV # supported modes: CSV and CSP # parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0; epics Epics configuration.\nThe Epics motorRecord can now be disabled.\n mandatory\n name: name of the PV optional\n precision: PREC field; default 3 unit: EGU field; optional default mm motorRecord enable: set to false to disable motorRecord description: DESC field; default '' fieldInit: string with additional field initial values; default '' epics: name: M1 # precision: 3 # unit: deg # motorRecord: # enable: false # fieldInit: \u0026#39;RRES=1.0,RTRY=2,RMOD=1,UEIP=0,RDBD=0.1,URIP=1,RDBL=$(IOC):$(ECMC_MOTOR_NAME)-PosActSim\u0026#39; # fieldInit: \u0026#39;NTM=1\u0026#39; # description: AM8111 CSV drive mandatory for physical axis\n numerator: scaling numerator denominator: scaling denominator type: type of drive: 0=stepper, 1=DS402, aka servo or complex stepper control: control word entry status: status word entry setpoint: setpoint entry, position or velocity, depending on mode optional\n reduceTorque: control word bit to set for reduced torque mode brake openDelay: number of cycles to wait after enable to disengage the brake closeAhead: number of cycles to wait after the brake was engaged reset: control word bit to set in order to reset the drive warning: status word bit for drive warning error: list of status bits for drive errors drive: numerator: 2880000 # Fastest speed in engineering units denominator: 2147483648 # I/O range for ECMC_EC_ALIAS_DRV_VELO_SET type: 1 # Stepper: 0, DS402: 1 (DS402 = servos and advanced stepper drives) control: ec0.s$(DRV_SLAVE).driveControl01 status: ec0.s$(DRV_SLAVE).driveStatus01 setpoint: ec0.s$(DRV_SLAVE).velocitySetpoint01 # reduceTorque: 2 # Reduce torque bit in drive control word # brake: # openDelay: 0 # Brake timing parameter in EtherCAT cycles # closeAhead: 0 # Brake timing parameter in EtherCAT cycles # reset: 1 # Reset bit in control word # warning: 2 # Warning bit of status word # error: # max 3 # - 3 # Error 0 bit of status word # - 7 # Error 1 bit of status word # - 14 # Error 2 bit of status word encoder mandatory\n numerator: scaling numerator, equivalent distance to the maximum drive frequency (default: 2000 Hz i.e. 2000 full steps), also effectively absolute maximum velocity denominator: scaling denominator type: type of encoder: 0=incremental, 1=absolute bits: raw data bit count absBits: Absolute bit count (for absolute encoders) always least significant part of \u0026lsquo;bits\u0026rsquo; absOffset: Encoder offset in engineering units (for absolute encoders) position: position entry optional\n source: position source, 0=from EC entry ; 1=from PLC control: control word entry; mandatory when reset is set. status: status word entry; mandatory when error or warning are set reset: control word bit to set in order to reset the encoder warning: status word bit for encoder warning error: list of status bits for encoder errors velocityFilterSize: size of the velocity filter (cycles) positionFilterSize: size of the position filter (cycles) positionFilterEnable: position filter enable latch: position: '' control: '' status: '' encoder: numerator: 360 denominator: 1048576 type: 1 # Type: 0=Incremental, 1=Absolute bits: 32 # Total bit count of encoder raw data absBits: 25 # Absolute bit count (for absolute encoders) always least significant part of \u0026#39;bits\u0026#39; absOffset: 0 # Encoder offset in eng units (for absolute encoders) position: ec0.s$(DRV_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder) # source: 0 # control: ec0.s$(ENC_SLAVE).encoderControl01 # mandatory only if \u0026#39;reset\u0026#39; is used # status: ec0.s$(DRV_SLAVE).encoderStatus01 # mandatory only if \u0026#39;warning\u0026#39; or \u0026#39;error\u0026#39; are used # reset: 1 # Reset (optional) # warning: 2 # Warning (optional) # error: # max 3 (optional) # - 5 # Error 0 # - 9 # Error 1 # - 11 # Error 2 # velocityFilterSize: 100 # positionFilterSize: 1 # positionFilterEnable: false # latch: # position: \u0026#39;\u0026#39; # control: \u0026#39;\u0026#39; # status: \u0026#39;\u0026#39; optional\n velocityFilterSize: Add filtering if the encoder is too coarse to reliably determine velocity each PLC cycle controller PID controller parameters\nmandatory\n Kp: proportional optional\n Ki: integral; default 0 Kd: differential; default 0 Kff: feed forward; default 1 controller: Kp: 90 # Ki: 0.1 # Kd: 0 # Kff: 1 trajectory settings for the trajectory planning.\nAll accelerations are now defined in EGU s^{-2}\n mandatory\n axis velocity: velocity setpoint the axis will be initialized to (in EGU/sec) acceleration: acceleration setpoint for initialization (in EGU/sec2) optional\n source: source of position setpoint, 0=trajectory generator of axis ; 1=from PLC type: type of velocity profile: 0=trapezoidal ; 1=scurve axis deceleration: deccelerartion setpoint for initialization (in EGU/sec2) emergencyDeceleration: deceleration setpoint for emergencies. Defaults to acceleration setpoint if not specified. jerk: jerk for scurved profiles (in EGU/sec3) jog velocity: velocity setpoint the axis will be initialized to for jogging acceleration: acceleration setpoint for initialization, for jogging modulo range: modulo range type: modulo type trajectory: # source: 0 # type: 0 axis: velocity: 180 acceleration: 180 # deceleration: 360 # jerk: 1.0 # emergencyDeceleration: 0.05 # jog: # velocity: 90 # acceleration: 0.1 # modulo: # range: 0 # type: 0 input Links to the binary input sensors for limit switches, home sensor and external interlock. All four inputs must be provided. If an input is not used, set it to the ONE.0 entry of a slave. See the example for details.\nmandatory\n limit forward: limit switch sensor input in the forward direction. backward: limit switch sensor input in the backward direction. home: binary input for the home sensor extinterlock: binary input for external interlock. input: limit: forward: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for low limit switch input backward: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for high limit switch input home: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for home switch input interlock: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for interlock switch input output Two outputs can be utilizes with ECMC.\nThe brake output was moved to the drive key, as it is directly coupled to the drive state.\n optional\n health: sum parameter for axis health # output: # health: \u0026#39;\u0026#39; # Ethercat entry for health output homing This section is should be obsolete at PSI, as for all new installation using EtherCAT, absoulte encoders are mandatory. In case a legacy system or temporary installation requires a incremental encoder, or even open loop operation, several procedures for referencing are available.\noptional\n type: referencing procedure position: position of the reference mark in engineering units postMoveEnable: post homing move postMovePosition: post homing move target switchPolarity: home switch polarity, for NO switches latchCount: latch counter velocity: velocities to: to the cam from: off the cam acceleration: acceleration time in s deceleration: deceleration time in s # homing: # type: 3 # position: 0 # postMoveEnable: false # postMovePosition: 0 # switchPolarity: 0 ## 0: NC, 1: NO # latchCount: 0 # velocity: # to: 2.72 # # from: 3.14 # # acceleration: 2 # # deceleration: 5 softlimits Soft limits to propagate to the motorRecord.\noptional\n enable: global enable of soft limits. forwardEnable: forward on/off. forward: soft limit in the forward direction. backwardEnable: backward on/off. backward: soft limit in the backward direction. # softlimits: # enable: true # forwardEnable: true # optional switch for forward direction # forward: 300.0 # backwardEnable: true # optional switch for backward direction # backward: 25.0 monitoring Three entities can be monitored, (1) lag, aka following error, (2) target, aka in position, (3) velocity.\nIt is highly advisable to always use the lag and target monitoring fo closed-loop axis. Failure to do so, will most likely results in unexpected behaviour.\n The monitoring key, must be included in the config, despite all features being optional. It\u0026rsquo;s a means to let the integrator think twice to skip it all together.\n optional\n lag enable: enable lag monitoring tolerance: tolerance in engineering units time: time for the condition to be true in ms target enable: enable target monitoring tolerance: tolerance in engineering units time: time for the condition to be true in ms velocity enable: enable velocity monitoring max: upper limit for velocity time trajectory: time for the condition to be in violation in ms drive: time for the condition to be in violation in ms monitoring: # lag: # enable: false # tolerance: 5 # time: 100 # target: # enable: true # tolerance: 0.125 # time: 100 # velocity: # enable: false # max: 100 # time: # trajectory: 100 # drive: 200 All yaml settings axis: id: 1 # Axis id type: joint # this is for future selection of axis type mode: CSV # supported mode, CSV and CSP, defaults CSV parameters: 'axisPar' # additional parameters # Additional params to motor record driver # \u0026quot;powerAutoOnOff=\u0026lt;value\u0026gt;;\u0026quot; //2: What you want, 1:do not use, 0 to disable # \u0026quot;powerOffDelay=\u0026lt;value\u0026gt;:\u0026quot; # \u0026quot;powerOnDelay=\u0026lt;value\u0026gt;;\u0026quot; healthOutput: ec0... # Ethercat entry for health output feedSwitchesOutput: ec0... # Ethercat entry for fed switches feedSwitchesValue: 1 # Value to write to axis.feedSwitchesOutput. Defaults to 1 group: testGroup # Add axis to group (group will be created if not exists), # group id will be stored in GRP\u0026lt;axis.group\u0026gt;_ID for later use. autoMode: # Switch drive modes automaticaly for normal motion and homing (smaract for instance) modeSet: ec0.. # Ethercat entry drive mode write (set CSV,CSP,homing) modeAct: ec0.. # Ethercat entry drive mode reading (set CSV,CSP,homing) modeCmdMotion: 9 # Drive mode value for normal motion (written to axis.drvMode.modeSet when normal motion) modeCmdHome: 10 # Drive mode value for when homing (written to axis.drvMode.modeSet when homing) features: blockCom: false # Block communication to axis allowSrcChangeWhenEnabled: false # Allow traj/enc sorce change when axis is enabled allowedFunctions: homing: true # Allow homing constantVelocity: true # Allow constant velocity positioning: true # Allow positioning epics: name: M1 # Axis anme precision: 3 # Decimal count description: very important motor axis # Axis description unit: mm # Unit motorRecord: enable: true description: This is MR fieldInit: 'RRES=1.0,RTRY=2,RMOD=1,UEIP=0,RDBD=0.1,URIP=1,RDBL=$(IOC):$(ECMC_MOTOR_NAME)-PosActSim' # Extra config for Motor record drive: numerator: 360 # Fastest speed in engineering units denominator: 4096 # I/O range for ECMC_EC_ALIAS_DRV_VELO_SET type: 0 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives) control: ec0.s$(DRV_SLAVE).driveControl01 # Control word ethercat entry enable: 0 # Enable bit index in control word (not used if DS402) enabled: 1 # Enabled bit index in status word (not used if DS402) status: ec0.s$(DRV_SLAVE).driveStatus01 # Status word ethercat entry setpoint: ec0.s$(DRV_SLAVE).velocitySetpoint01 # Velocity setpoint if CSV. Position setpoint if CSP reduceTorque: 2 # Reduce torque bit in drive control word reduceTorqueEnable: True # Enable reduce torque functionality brake: enable: false output: ec0... # Ethercat link to brake output openDelay: 0 # Brake timing parameter in cycles (default 1kHz) closeAhead: 0 # Brake timing parameter in cycles (default 1kHz) reset: 1 # Reset (if no drive reset bit then leave empty) warning: 2 # Warning (if no drive warning bit then leave empty) error: # max 3 - 3 # Error 0 (if no drive error bit then leave empty) - 7 # Error 1 (if no drive error bit then leave empty) - 14 # Error 2 (if no drive error bit then leave empty) encoder: numerator: 360 # Scaling numerator example 360 deg/rev denominator: 4096 # Scaling denominator example 4096 ticks per 360 degree type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data absBits: 0 # Absolute bit count (for absolute encoders) always least significant part of 'bits' absOffset: 0 # Encoder offset in eng units (for absolute encoders) mask: '0xFFF00' # Mask applied to raw encoder value position: ec0.s$(ENC_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder) control: ec0.s$(ENC_SLAVE).encoderControl01 # mandatory only if 'reset' is used status: ec0.s$(DRV_SLAVE).encoderStatus01 # mandatory only if 'warning' or 'error' are used ready: 10 # Bit in encoder status word for encoder ready source: 0 # 0 = Encoder value from etehrcat hardware, 1 = Encoder value from PLC reset: 1 # Reset (optional) warning: 2 # Warning (optional) error: # max 3 (optional) - 5 # Error 0 - 9 # Error 1 - 11 # Error 2 filter: velocity: size: 100 # Filter size for velocity enable: true # enable velocity filter position: size: 100 # Filter size for encoder value enable: true # enable encoder value filter latch: position: '' # Link to latched value. Used for some homing seqs control: 0 # Bit in encoder control word to arm latch. Used for some homing seqs status: 0 # Bit in encoder status word for latch triggered status. Used for some homing seqs primary: 1 # Use this encoder as primary (for control) homing: type: 3 # Homing sequence type position: -30 # Position to reference encoder to velocity: to: 10 # Velocity to cam/sensor (used for some homing seqs) from: 5 # Velocity from cam/sensor (used for some homing seqs) acceleration: 20 # Acceleration during homing deceleration: 100 # Deceleration during homing refToEncIDAtStartup: 1 # At startup then set the start value of this encoder to actpos of this encoder id refAtHome: 1 # If homing is executed then set position of this encoder tolToPrim: 0 # If set then this is the max allowed tolerance between prim encoder and this encoder postMoveEnable: yes # Enable move after successfull homing postMovePosition: 10 # Position to move to after successfull homing trigg: ec0.. # Ethercat entry for triggering drive internal homing seq (seq id 26) ready: ec0.. # Ethercat entry for readinf drive internal homing seq ready (seq id 26) latchCount: 1 # latch number to ref on (1=ref on first latch) controller: Kp: 15 # Kp proportinal gain Ki: 0.02 # Ki integral gain Kd: 0 # Kd derivative gain Kff: 1 # Feed forward gain deadband: tol: 0.01 # Stop control if within this distance from target for the below time time: 100 limits: minOutput: -100 # Minimum controller output maxOutput: 100 # Maximum controller output minIntegral: -100 # Minimum integral output maxIntegral: 100 # Maximum integral output inner: Kp: 0.1 # Kp for when close to target Ki: 0.1 # Ki for when close to target Kd: 0.1 # Kd for when close to target tol: 0.1 # Distance from target for when inner PID params will be used, defaults to atTarget tol trajectory: type: 1 # Default 0 = trapetz, 1 = S-curve (ruckig) source: 0 # 0 = take trajectory setpoint from axis traj object, 1 = trajectory setpoint from plc axis: velocity: 10 # Default velo for axis acceleration: 0.1 # Default acc for axis deceleration: 0.1 # Default dec for axis emergencyDeceleration: 0.05 # Deceleration when axis in error state jerk: 10 # Default jerk for axis jog: velocity: 5 # Default velo fro JOG (motor record) modulo: range: 360 # Modulo range 0..360 type: 0 # Modulo type input: limit: forward: ec0.s$(ENC_SLAVE).ONE.0 # Ethercat entry for low limit switch input forwardPolarity: 0 # Polarity of forward limit switch backward: ec0.s1.BI_2.0 # Ethercat entry for high limit switch input backwardPolarity: 0 # Polarity of forward limit switch home: 'ec0.s$(MCS2_SLAVE_NUM).ONE.0' # Ethercat entry for home switch homePolarity: 0 # Polarity of home switch interlock: 'ec0.s$(ENC_SLAVE).ONE.0' # Ethercat entry for interlock switch input interlockPolarity: 0 # Polarity of interlock switch analog: interlock: 'ec0.s$(ENC_SLAVE).ONE' # Ethercat entry for analog interlock interlockPolarity: 1 # 0: High value is bad, 1 = Low value is bad rawLimit: 2000 # Analog raw limit enable: true # Enable analog interlock default true if analog.interlock is set softlimits: enable: false # Enable soft limits forward: 100 # Soft limit position fwd forwardEnable: false # Soft limit position fwd enable backward: -100 # Soft limit position bwd backwardEnable: false # Soft limit position bwd enable monitoring: lag: enable: false # Enable position lag monitoring (following error) tolerance: 0.5 # Allowed tolerance time: 10 # Allowed time outside tolerance target: enable: true # Enable at target monitoring (needs to be enabled if using motor record) tolerance: 0.5 # Allowed tolerance time: 10 # Filter time inside tolerance to be at target velocity: enable: false # Enable velocity monitoring max: 100 # Allowed max velocity time: trajectory: 100 # Time allowed outside max velo before system init halt drive: 200 # Time allowed outside max velo before system disables drive velocityDifference: enable: true # Enable velocity diff monitoring (velo set vs velo act) max: 100 # Allowed max difference time: trajectory: 100 # Time allowed outside max diff velo before system init halt drive: 200 # Time allowed outside max diff velo before system disables drive plc: enable: true # Enable axis plc externalCommands: true # Allow axis to inputs from PLC file: myplcfile.plc # File with plc code code: # Sync code (appended after code in plc.file) - if(ax2.traj.source){ax2.drv.enable:=(ax10.drv.enable or ax11.drv.enable)}; # Enable axis if one of master axes is enabled - ax2.traj.setpos:=ax10.traj.setpos-ax11.traj.setpos/2; # calculate set pos for physical axis velocity_filter: # Filter used to smother velocity feedforward encoder: # Filter plc enc velo enable: false # Filter enable size: 100 # Filter size trajectory: # Filter plc traj velo enable: false # Filter enable size: 100 # Filter size # filter: # Use \u0026quot;velocity_filter\u0026quot; instead since this naming is missleading and should be phased out # velocity: # Filter plc enc velo # enable: false # size: 100 # trajectory: # Filter plc traj velo # enable: false # size: 100 "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/","title":"data storage buffer","tags":[],"description":"","content":"data storage examples This dir contains two examples: here.\n Continiously add value to data storage. Push to epics by hw trigger. Continiously add value to data storage. Push to epics by epics pv trigger. Data buffered data can be accessed by the \u0026ldquo;IOC_TEST:ds0-Data-Act\u0026rdquo; waveform pv (NELM 10000) Custom scale and offset can be applied to the stored values by MACROS (to the plc) in the startup file.\n1 push to epics by hw trigger In this example the data stored in dataStorage 0 is pushed to epics at a falling edge of the axis 1 high limit.\nExample 1 is started with the following stratup file: \u0026ldquo;add_data_to_buffer_trigg_push_hw.script\u0026rdquo;\niocsh.bash add_data_to_buffer_trigg_push_hw.script Trigger writes to epics by toggle of axis 1 high limit switch.\nPLC-code:\n################################################################################## # PLC to add encoder data to dataStorage and push data on falling edge of higlimit # # MACROS: # DS_ID = ID of ds to use as a filter id # PLC_ID = ID of this PLC # ENC_S_ID = Slave id of encoder terminal # DBG = Set to empty string to get printouts, set to \u0026quot;#\u0026quot; to avoid printouts # SCALE = Encoder scale value, defaults to 1 # OFFSET = Encoder offset value, defaults to 0 # # Append data to storage ds_append_data(${DS_ID},ec0.s${ENC_S_ID}.positionActual01*${SCALE=1}+${OFFSET=0}); # Trigger push of data on falling edge of limit switch if(static.highlimOld and not(ax1.mon.highlim)) { ${DBG=#}println('Pushing data to EPICS....'); ds_push_asyn(${DS_ID}); }; static.highlimOld:=ax1.mon.highlim; 2 push to epics by epics pv trigger In this example the data stored in dataStorage 0 is pushed to epics at a rising edge of the \u0026ldquo;IOC_TEST:Set-PushDataTrigger-RB\u0026rdquo; pv.\nExample 2 is started with the following stratup file: \u0026ldquo;add_data_to_buffer_trigg_push_hw.script\u0026rdquo;\niocsh.bash add_data_to_buffer_trigg_push_epics.script Trigger writes to epics by:\nraspberrypi-16970 \u0026gt; dbpf IOC_TEST:Set-PushDataTrigger-RB 1 DBF_STRING: \u0026quot;One\u0026quot; raspberrypi-16970 \u0026gt; Pushing data to EPICS.... dbpf IOC_TEST:Set-PushDataTrigger-RB 0 DBF_STRING: \u0026quot;Zero\u0026quot; raspberrypi-16970 \u0026gt; dbpf IOC_TEST:Set-PushDataTrigger-RB 1 DBF_STRING: \u0026quot;One\u0026quot; raspberrypi-16970 \u0026gt; Pushing data to EPICS.... PLC-code:\n################################################################################## # PLC to add encoder data to dataStorage and push data on trigger from epics PV # # MACROS: # DS_ID = ID of ds to use as a filter id # PLC_ID = ID of this PLC # ENC_S_ID = Slave id of analog input terminal # DBG = Set to empty string to get printouts, set to \u0026quot;#\u0026quot; to avoid printouts # SCALE = Encoder scale value, defaults to 1 # OFFSET = Encoder offset value, defaults to 0 # # Append data to storage ds_append_data(${DS_ID},ec0.s${ENC_S_ID}.positionActual01*${SCALE=1}+${OFFSET=0}); # Trigger push of data on rising edge of trigger if(static.trigg and not(static.triggOld)) { ${DBG=#}println('Pushing data to EPICS....'); ds_push_asyn(${DS_ID}); }; static.triggOld:=static.trigg; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/","title":"tuning","tags":[],"description":"","content":" EL70x1 Tuning For EL70x1 stepper drives the following parameters can be tuned:\n 8011:07 Ka factor 8011:08 Kd factor 8011:01 Kp factor 8011:02 Ki factor 8011:07 Ka and 8011:08 Kd factor: 8011:07 Ka factor / 8011:08 Kd factor are “current boosts” during acceleration/deceleration. Default they are set to 100% which is way too high for most applications. Start by setting these parameters to 0.\n8011:01 Kp and 8011:02 Ki factor: This is the current loop settings and this is also what affect the performance. The higher you set these registers, the stiffer the control loop. For most applications it is important to keep a ration of 40:1. Default is 400 / 10, if you want a stiffer loop, then change to f ex 800 / 20 and onwards. Increase until the motor misbehaves and go back to a safe setting.\nBacklash Tuning systems with backlash can be difficult. Sometimes a small D-part helps to reduce spikes in the centralized ecmc position loop controller output.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/","title":"function libs","tags":[],"description":"","content":"function libs Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command takes these parameters:\n FILE PLC: definition file, i.e. ./plc/homeSlit.plc PLC_ID: (optional) PLC number, default last loaded PLC PLC_MACROS: (optional) Substitution macros for PLC code. The macros \u0026ldquo;SELF_ID\u0026rdquo;,\u0026ldquo;SELF\u0026rdquo;,M_ID, and M are reserved: \u0026ldquo;SELF_ID\u0026rdquo; = PLC Id of this plc \u0026ldquo;SELF\u0026rdquo; = \u0026ldquo;plc${SELF_ID}\u0026rdquo; \u0026ldquo;M_ID\u0026rdquo; = EtherCAT master ID \u0026ldquo;M\u0026rdquo; = \u0026ldquo;ec${M_ID}\u0026rdquo; INC: (optional) List of directories for include files to pass to MSI (if several paths then divide with \u0026lsquo;:'). TMP_PATH: (optional) directory to dump the temporary plc file after macro substitution PRINT_PLC_FILE: (optional) 1/0, printout msi parsed plc file (default enable(1)). Example:\n${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, \u0026#34;FILE=./plc/test.plc_lib, PLC_MACROS=\u0026#39;OFFSET=3\u0026#39;\u0026#34; The functions must be defined accordning to this template (max 5 parameters):\nfunction \u0026lt;name\u0026gt;(\u0026lt;param1\u0026gt;,...,\u0026lt;param5\u0026gt;) { \u0026lt;code body\u0026gt;; } also without param is allowed:\nfunction \u0026lt;name\u0026gt;() { \u0026lt;code body\u0026gt;; } Several functions can be defined in the same file. For syntax of the \u0026ldquo;code body\u0026rdquo;, check plc syntax and the exprtk website. The parameters aswell as the return value must be scalars, however, local vectors can be defined and used in calculations (initiations of vector can be done with MACROS, constants or parameters). \u0026ldquo;#\u0026rdquo; as a first char in a line is considered a comment (the line will be removed before compile). The lib file will be parsed through MSI allowing macro expansion, \u0026ldquo;include\u0026rdquo; and \u0026ldquo;subsitute\u0026rdquo; commands. For more info check best practice and msi documentation/help. can be used in functions The parameters Other functions (also recursive) The normal ecmc function libs: motion: mc_* ethercat: ec_* data storages: ds_*, master 2 master: m2m_* the exprtk functions libs: println print open close write read\u0026quot;, getline eof vectors in the calculations (but NOT as parameter or return value). can NOT be used in functions \u0026ldquo;ecmc variables\u0026rdquo; can NOT be used/accessed in functions:\n EtherCAT I/0 direct access ec.s.* Data storage variables: ds.* Motion variables: ax.* Static variables: static.* Global variables: global.* Vectors as parameter or return value (only first value will be passed). example function lib file # Nothing fancy function add(a,b,c,d,e) { println('This is add: ', a+b+c+d+e) return[a+b+c+d+e+${OFFSET=0}]; }; function prod(a,b,c,d,e) { println('This is prod, add2 : ', add(a,b,c,d,e)); println('This is prod, prod: ', a*b*c*d*e); return [a * b * c * d * e + ${OFFSET=0}]; }; # function with vector calcs (inside) function testLocalArray(a) { var test[5]:={a,a,a,a,a}; println('This is testLocalArray: ',test); return [dot(test,test)]; }; # function without arg function one() { println('This is one: ',1); return [1+${OFFSET=0}]; } # function with ecmc function inside function testm2m() { m2m_write(0,m2m_read(0)+${OFFSET=0}); println('This is testmt2: elem 0: ',m2m_read(0)); } debugging Unfortunately debugging of function libs is not as easy as normal PLC:s since exprtk returns less infomation at compile failure.\nIn order to troubleshoot, load the code as a normal PLC instead. This way you will get more diagnostics. Also remember, ecmc varaibles cannot be accessed in plc libs.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/","title":"iocsh utilities","tags":[],"description":"","content":"ECMC Iocsh Utilities Iocsh function \u0026ldquo;ecmcEpicsEnvSetCalc()\u0026rdquo; \u0026ldquo;ecmcEpicsEnvSetCalc()\u0026rdquo; is used to evaluate expressions and set result to EPCIS environment variables. Usefull for calculate:\n slave offsets sdo/pdo adresses (also in hex) scalings in motion record fields \u0026hellip; ecmcEpicsEnvSetCalc -h Use \u0026quot;ecmcEpicsEnvSetCalc(\u0026lt;envVarName\u0026gt;, \u0026lt;expression\u0026gt;, \u0026lt;format\u0026gt;)\u0026quot; to evaluate the expression and assign the variable. \u0026lt;envVarName\u0026gt; : EPICS environment variable name. \u0026lt;expression\u0026gt; : Calculation expression (see exprTK for available functionality). Examples: Simple expression:\u0026quot;5.5+${TEST_SCALE}*sin(${TEST_ANGLE}/10)\u0026quot;. Use of \u0026quot;RESULT\u0026quot; variable: \u0026quot;if(${TEST_VAL}\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;. Strings are used within '\u0026lt;str\u0026gt;': \u0026quot;'test'='test'\u0026quot;. Note: expression result must be numeric and not string (in this case expression result is 1 =\u0026gt; \u0026lt;envVarName\u0026gt; will be set to \u0026quot;1\u0026quot;). \u0026lt;format\u0026gt; : Optional format string. Example \u0026quot;%lf\u0026quot;, \u0026quot;%8.3lf\u0026quot;, \u0026quot;%x\u0026quot;, \u0026quot;%04d\u0026quot; or \u0026quot;%d\u0026quot;, defaults to \u0026quot;%d\u0026quot;. Can contain text like \u0026quot;0x%x\u0026quot; or \u0026quot;Hex value is 0x60%x\u0026quot;. Must contain one numeric value where result of expression will be written. Restrictions: - Some flags and/or width/precision combinations might not be supported. - Hex numbers in the expression is not allowed (but hex as output by formating is OK). - Non floatingpoint values will be rounded to nearest int. Examples: #### Calculate addresses in HEX with specified width # ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;$(test1)+1+2+3+4+5*10.1\u0026quot;, \u0026quot;%03x\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;061+1+2+3+4+5*10.1\u0026quot;, \u0026quot;%03x\u0026quot;) epicsEnvShow(\u0026quot;test2\u0026quot;) test2=07a #### Hex + text in format string # ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;$(test1)+1+2+3+4+5*10.1\u0026quot;, \u0026quot;This is the number: 0x%06x\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;061+1+2+3+4+5*10.1\u0026quot;, \u0026quot;This is the number: 0x%06x\u0026quot;) epicsEnvShow(\u0026quot;test2\u0026quot;) test2=This is the number: 0x00007a #### Calculate scalings (floating point) epicsEnvSet(\u0026quot;IORange\u0026quot;,32768) # ecmcEpicsEnvSetCalc(\u0026quot;scaling\u0026quot;, \u0026quot;$(test1)/$(IORange)*10\u0026quot;, \u0026quot;%lf\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;scaling\u0026quot;, \u0026quot;061/32768*10\u0026quot;, \u0026quot;%lf\u0026quot;) epicsEnvShow(\u0026quot;scaling\u0026quot;) scaling=0.018616 #### Offset slave numbers (format defaults to \u0026quot;%d\u0026quot;) epicsEnvSet(\u0026quot;ECMC_SLAVE_NUM\u0026quot;,10) epicsEnvSet(\u0026quot;ECMC_SLAVE_NUM_OFFSET\u0026quot;,25) # ecmcEpicsEnvSetCalc(\u0026quot;ECMC_SLAVE_NUM\u0026quot;, \u0026quot;$(ECMC_SLAVE_NUM)+$(ECMC_SLAVE_NUM_OFFSET)\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;ECMC_SLAVE_NUM\u0026quot;, \u0026quot;10+25\u0026quot;) epicsEnvShow(\u0026quot;ECMC_SLAVE_NUM\u0026quot;) ECMC_SLAVE_NUM=35 #### if-statement syntax (use \u0026quot;RESULT\u0026quot; variable) epicsEnvSet(\u0026quot;VALUE\u0026quot;,10) # ecmcEpicsEnvSetCalc(\u0026quot;IF_TEST\u0026quot;, \u0026quot;if(${VALUE}\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;IF_TEST\u0026quot;, \u0026quot;if(10\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;) epicsEnvShow(\u0026quot;IF_TEST\u0026quot;) IF_TEST=100 #### Comparing strings 1 (use '\u0026lt;string\u0026gt;'): epicsEnvSet(\u0026quot;filename\u0026quot;,\u0026quot;ecmcEL3002.cmd\u0026quot;) # ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;'$(filename)'='test.script'\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;'ecmcEL3002.cmd'='test.script'\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=0 #### Comparing strings 2 (if-else): # ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;if('$(filename)'='test.script') {RESULT:=1;}else{RESULT:=0;};\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;if('ecmcEL3002.cmd'='test.script') {RESULT:=1;}else{RESULT:=0;};\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=0 Iocsh function \u0026ldquo;ecmcEpicsEnvSetCalcTernary()\u0026rdquo; \u0026ldquo;ecmcEpicsEnvSetCalcTernary()\u0026rdquo; is used o evaluate expressions and set EPCIS environment variables to different strings. depending on if the expression evaluates to \u0026ldquo;true\u0026rdquo; or \u0026ldquo;false\u0026rdquo;. Can be usefull for:\n Choose different files to load like plc-files, axis configurations, db-files or.. making conditional ecmc settings \u0026hellip; ecmcEpicsEnvSetCalcTernary -h Test iocsh function \u0026quot;ecmcEpicsEnvSetCalcTernary()\u0026quot; t Use \u0026quot;ecmcEpicsEnvSetCalcTernary(\u0026lt;envVarName\u0026gt;, \u0026lt;expression\u0026gt;, \u0026lt;trueString\u0026gt;, \u0026lt;falseString\u0026gt;)\u0026quot; to evaluate the expression and assign the variable. \u0026lt;envVarName\u0026gt; : EPICS environment variable name. \u0026lt;expression\u0026gt; : Calculation expression (see exprTK for available functionality). Examples: Simple expression:\u0026quot;5.5+${TEST_SCALE}*sin(${TEST_ANGLE}/10)\u0026quot;. Use of \u0026quot;RESULT\u0026quot; variable: \u0026quot;if(${TEST_VAL}\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;. Strings are used within '\u0026lt;str\u0026gt;': \u0026quot;'test'='test'\u0026quot;. Note: expression result must be numeric and not string (in this case expression result is 1 =\u0026gt; \u0026lt;envVarName\u0026gt; will be set to \u0026lt;trueString\u0026gt;). \u0026lt;trueString\u0026gt; : String to set \u0026lt;envVarName\u0026gt; if expression (or \u0026quot;RESULT\u0026quot;) evaluates to true. \u0026lt;falseString\u0026gt; : String to set \u0026lt;envVarName\u0026gt; if expression (or \u0026quot;RESULT\u0026quot;) evaluates to false. Examples: ### Simple true false epicsEnvSet(\u0026quot;VALUE\u0026quot;,10) # ecmcEpicsEnvSetCalcTernary(\u0026quot;test_var\u0026quot;, \u0026quot;${VALUE}+2+5/10\u0026quot;,\u0026quot;True\u0026quot;,\u0026quot;False\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;test_var\u0026quot;, \u0026quot;10+2+5/10\u0026quot;,\u0026quot;True\u0026quot;,\u0026quot;False\u0026quot;) epicsEnvShow(\u0026quot;test_var\u0026quot;) test_var=True ### Can be used for choosing different files # ecmcEpicsEnvSetCalcTernary(\u0026quot;filename\u0026quot;, \u0026quot;${VALUE}\u0026gt;20\u0026quot;,\u0026quot;./plc_fast.cfg\u0026quot;,\u0026quot;./plc_slow.cfg\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;filename\u0026quot;, \u0026quot;10\u0026gt;20\u0026quot;,\u0026quot;./plc_fast.cfg\u0026quot;,\u0026quot;./plc_slow.cfg\u0026quot;) epicsEnvShow(\u0026quot;filename\u0026quot;) filename=./plc_slow.cfg ### Comparing strings 1 (simple): # ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;'$(filename)'='./plc_slow.cfg'\u0026quot;,\u0026quot;equal\u0026quot;,\u0026quot;not_equal\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;'./plc_slow.cfg'='./plc_slow.cfg'\u0026quot;,\u0026quot;equal\u0026quot;,\u0026quot;not_equal\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=equal ### Comparing strings 2 (with if-else): # ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;if('$(filename)'='test') {RESULT:=1;}else{RESULT:=0;};\u0026quot;,\u0026quot;use_this_file.cfg\u0026quot;,\u0026quot;no_use_this_file.cfg\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;if('./plc_slow.cfg'='test') {RESULT:=1;}else{RESULT:=0;};\u0026quot;,\u0026quot;use_this_file.cfg\u0026quot;,\u0026quot;no_use_this_file.cfg\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=no_use_this_file.cfg Use return value of ecmcConfig(OrDie): The return value from ecmcConfig(OrDie) is stored in the EPICS environment variable \u0026ldquo;ECMC_CONFIG_RETURN_VAL\u0026rdquo;. This value can be used to make som dynamic configuration. All ASCII configuration commands for ecmcConfig(OrDie) can be used in the same way.\nExample: Read firmware version of an EL7037 stepper drive Note: SDO reads need to be before \u0026ldquo;SetAppMode(1)\u0026rdquo;\necmcConfig \u0026quot;EcReadSdo(${ECMC_SLAVE_NUM},0x100a,0x0,2)\u0026quot; epicsEnvShow(ECMC_CONFIG_RETURN_VAL) ECMC_CONFIG_RETURN_VAL=14640 The variable \u0026ldquo;ECMC_CONFIG_RETURN_VAL\u0026rdquo; then can be used to set record fields, name or alias for instance..\nExample: Read \u0026ldquo;ID\u0026rdquo; PDO from EK1101 (shown in detail in aliasRecordFromPdoData.script) Note: PDO reads need to be after \u0026ldquo;SetAppMode(1)\u0026rdquo; since cyclic value\necmcConfig \u0026quot;ReadEcEntryIDString(${ECMC_SLAVE_NUM},\u0026quot;ID\u0026quot;)\u0026quot; 2020/02/28 08:58:03.771 1024 ## This is the value of the EK1101 ID switch epicsEnvShow(ECMC_CONFIG_RETURN_VAL) ECMC_CONFIG_RETURN_VAL=1024 The variable \u0026ldquo;ECMC_CONFIG_RETURN_VAL\u0026rdquo; then can be used to set record fields, name or alias for instance..\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/manual/","title":"manual motion","tags":[],"description":"","content":" force manual motion This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are not obeyed! YOU HAVE BEEN WARNED!\n In case the hardware is fine, the cables are checked, human error is mostly excluded, or the system used to work but doesn\u0026rsquo;t work any longer, directly writing to the drive is possible.\nFor this however, the IOC needs to be reconfigured to not link the hardware to an axis!\n Edit the startup script and comment out the axis, just leave the slave configuration. restart the IOC check the PVs for the drive in question (slave 7 in this case) dbgrep \u0026quot;*s007*\u0026quot; There should be two PVs ending with, -Drv01-Cmd and -Drv01-Spd Set -Drv01-Cmd to 1 and check the amplifier did enable, if you don\u0026rsquo;t know how to check for an enabled amplifier, you should not use this command! After the amplifier is engaged, write a small number to -Drv01-Spd. Dependinf on the scaling, the number might be in the range of 1..1000. Observe the encoder, or in case of open-loop, the device itself. "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/","title":"EL70x1","tags":[],"description":"","content":" Topics Diagnostics Tuning Diagnostics If the drive is in error or warning state, further information about the reason for the warning/error can be read from the drive terminal by using the ethercat command. See command line interface for more info.\nIn order to use the ethercat command, you must first login to the server where the ecmc IOC is running.\n The diagnostic data can be read from register Index A010 STM Diag data Ch.1 with the folowing syntax:\nethercat upload -m \u0026lt;master_index\u0026gt; -p \u0026lt;slave_index\u0026gt; --type uint8 0xA010 \u0026lt;subindex\u0026gt; Example for master 0, slave position 3:\n# Saturated ethercat upload -m 0 -p 3 --type uint8 0xA010 0x1 # Over temperature ethercat upload -m 0 -p 3 --type uint8 0xA010 0x2 # Torque overload ethercat upload -m 0 -p 3 --type uint8 0xA010 0x3 # Under voltage ethercat upload -m 0 -p 3 --type uint8 0xA010 0x4 # Over voltage ethercat upload -m 0 -p 3 --type uint8 0xA010 0x5 # Short circuit A ethercat upload -m 0 -p 3 --type uint8 0xA010 0x6 # Short circuit B ethercat upload -m 0 -p 3 --type uint8 0xA010 0x7 # No control power ethercat upload -m 0 -p 3 --type uint8 0xA010 0x8 # Misc error ethercat upload -m 0 -p 3 --type uint8 0xA010 0x9 The ecmccfg/utils/read_el70xx_diag.sh tool can also be used for reading the diagnostics:\nbash read_el70xx_diag.sh \u0026lt;master_id\u0026gt; \u0026lt;slave_id\u0026gt; Example: master 0, slave 3, drive under voltage warning\nbash read_el7041_diag.sh 0 3 ######################################################### Reading EL70xx status at master id 0 and slave id 3: Saturated: 0x00 0 Over temperature: 0x00 0 Torque overload: 0x00 0 Under voltage: 0x01 1 Over voltage: 0x00 0 Short circuit A: 0x00 0 Short circuit B: 0x00 0 No control power: 0x00 0 Misc error: 0x00 0 ######################################################### Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics.\nunder voltage Use a multimeter to verify that the voltage level corresponds to voltage levels described in the electrical drawings. If the voltage is correct, then the under voltage alarm could be related to worng setting of nominal drive voltage setting (48V but the drive is powered with 24V).\nThe nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp).\nExample: Set nominal voltage to 24V\n${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026quot;HW_DESC=EL7041-0052\u0026quot; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=24000, R_COIL_MOHM=1230'\u0026quot; For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically).\n over voltage Use a multimeter to verify that the voltage level corresponds to voltage levels described in the electrical drawings. If the voltage is correct, then the over voltage alarm could be related to worng setting of nominal drive voltage setting (24V but the drive is powered with 48V).\nThe nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp).\nExample: Set nominal voltage to 48V\n${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026quot;HW_DESC=EL7041-0052\u0026quot; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'\u0026quot; For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically).\n Tuning There are normally several control loops in an ecmc system:\n Position loop (centralized in ecmc if CSV) Velocity loop (in drive) Current loop (in drive) However, for the EL70x1 drives there\u0026rsquo;s no dedicated velocity loop (however some current boost settings that can be applied in acc/dec, see below)\nPosition loop The position loop control parameters can be accessed and tuned by PVs. Normally, a pure P controller is enough (ki and kp set to 0) but sometimes the I and D part can be needed.\nCurrent loop For most usecases, the default current controller parameters are already well tuned. Sometimes when operating at higher speeds the current loop needs to be tuned.\nFor EL70x1 stepper drives the following parameters can be tuned:\n 8011:07 Ka factor 8011:08 Kd factor 8011:01 Kp factor 8011:02 Ki factor ** 8011:07 Ka and 8011:08 Kd factor: **\n8011:07 Ka factor / 8011:08 Kd factor are “current boosts” during acceleration/deceleration. Default they are set to 100% which is way too high for most applications. Start by setting these parameters to 0.\n** 8011:01 Kp and 8011:02 Ki factor: ** This is the current loop settings and this is also what affect the performance. The higher you set these registers, the stiffer the control loop. For most applications it is important to keep a ration of 40:1. Default is 400 / 10, if you want a stiffer loop, then change to f ex 800 / 20 and onwards. Increase until the motor misbehaves and go back to a safe setting.\nAlso see troubleshooting/tuning section.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/best_practice/","title":"best practice","tags":[],"description":"","content":"best practice Here you can find some best practice configurations for common usecases.\n Macros MSI include, substitute Printouts The complete examples with starup files can be found here\nmacros Use of macros makes the code more generic. When loading a PLC file with \u0026ldquo;loadPLCFile.cmd\u0026rdquo;, custom macros can be defined in \u0026ldquo;PLC_MACROS\u0026rdquo;:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS=\u0026#39;BO_S_ID=${ECMC_EC_SLAVE_NUM}\u0026#39;\u0026#34; NOTE: ECMC_EC_SLAVE_NUM expands to the ID of the last added slave.\nIn addition to the custom macros, a few macros, that are often needed, are predefined:\n SELF_ID : Id of current PLC SELF : plc\u0026lt;SELF_ID\u0026gt; M_ID : EtherCAT master ID M : ec\u0026lt;M_ID\u0026gt; SELF_ID and SELF example A common usecase is that some initiation is needed, could be triggering of a custom homing sequence:\nif(${SELF}.firstscan) { var plc:=${SELF_ID}; ${DBG=#}println(\u0026#39;PLC \u0026#39;,plc,\u0026#39; is starting up\u0026#39;); }; After macro expansion the code would look like this (for PLC id=0,DBG=''):\nif(plc0.firstscan) { var plc:=0; println(\u0026#39;PLC \u0026#39;,plc,\u0026#39; is starting up\u0026#39;); }; M_ID and M example All EtherCAT related information/data is accessible through the pattern \u0026ldquo;ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.\u0026rdquo;. To allow the same code to be loaded on different masters it\u0026rsquo;s a good idea to use the predefined macros,\u0026ldquo;M\u0026rdquo; and \u0026ldquo;M_ID\u0026rdquo;.\nToggle an output:\n${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}); ${DBG=#}println(\u0026#39;State: \u0026#39;, ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); After macro expansion with the following macros the code would look like this:\n BO_S_ID = 10 BO_CH = Not defined (defaults to \u0026ldquo;01\u0026rdquo;) DBG = Not defined (defaults to \u0026ldquo;#\u0026quot;) ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); #println(\u0026#39;State: \u0026#39;, ec0.s10.binaryOutput01); include and substitute Since all PLC files and PLC libs are parsed through MSI the \u0026ldquo;include\u0026rdquo; and \u0026ldquo;substitute\u0026rdquo; commands can be used.\nWhen using the include command, the file location dir of the file must be added in the INC parameter when loading the PLC:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS=\u0026#39;BO_S_ID=${ECMC_EC_SLAVE_NUM}\u0026#39;\u0026#34; The \u0026ldquo;INC\u0026rdquo; parameter can contain several directories separated with a \u0026ldquo;:\u0026rdquo;, making it possible to include PLC files from several locations/modules.\nexample: Toggle a few outputs As a demo usecase let\u0026rsquo;s consider that a few outputs needs to be toggled. NOTE: There are simpler ways to write this specifc code but it\u0026rsquo;s used to demo how code can be divided.\nLets first define some code that toggles a bit (toggle_output.plc_inc):\n# Example of simple include file that toggles an binary output ${M}.s${BO_S_ID}.binaryOutput${BO_CH}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH}); ${DBG=#}println(\u0026#39;State: \u0026#39;, ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); This code snippet then can be included in a main plc-file by using the \u0026ldquo;include\u0026rdquo; keyword. Each include can then be included with different macros by using the \u0026ldquo;substitute\u0026rdquo; keyword:\nsubstitute \u0026#34;BO_CH=01\u0026#34; include \u0026#34;toggle_output.plc_inc\u0026#34; substitute \u0026#34;BO_CH=02, DBG=\u0026#34; include \u0026#34;toggle_output.plc_inc\u0026#34; The above code would expand to:\nec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); #println(\u0026#39;State:\u0026#39;, ec0.s10.binaryOutput01); ec0.s10.binaryOutput02:=not(ec0.s10.binaryOutput02); println(\u0026#39;State: \u0026#39;, ec0.s10.binaryOutput02); The resulting code will toggle two different outputs, the state of the last output will be printed.\nNOTE: Macros cannot be used in the filename when including a file. Instead the dir should be defined in the INC param when loading the PLC, see above.\nprintouts Adding a DBG macro can be usefull to be able to turn on/off printouts. Typically during commsioning it can be usefull to have many printouts but later when system goes into production, it could be a good idea to turn (some) printouts off.\nExample of a printout that can be turned on/off (default off)\n${DBG=#}println(\u0026#39;Value: \u0026#39;, ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); Will result in the below if setting the DBG='' (and some other macros, see above):\nprintln(\u0026#39;Value: \u0026#39;, ec0.s10.binaryOutput01); "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/ecmc_command_ref/","title":"ecmc command reference","tags":[],"description":"","content":"ecmc command reference ethercat motion general misc plc "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el9xxx/","title":"EL9xxx","tags":[],"description":"","content":" Topics over current protection passive terminals over current protection In the standard setup at PSI over current protection modules are used to feed 24V to both the EtherCAT communication bus (E-bus) and the power bus of the EtherCAT slaves. If the over current protection is not enabled then the EtherCAT slaves will not receive power.\nFirst time, (and only first time), a system is in use, the overcurrent modules needs to be enabled in order to allow current to flow. Enabling is done by push buttons in the LED area of the module. The long horizontal LEDs are in fact buttons that can be used to activate or tripp the over current protection.\nBefore pressing the buttons, check the electrical drawings. Make sure it\u0026rsquo;s safe to power on the system.\n el9221-5000 The EL9221-5000 has one channel and therefore only the top button is needed to be pressed.\nel9227-5500 The EL9227-5500 is a 2 channel module and normally both channels needs to be enabled by pressing both the top and bottom long LED. if only one are pressed it could result in that the power to the communication is fine but the power to the i/o bus is lacking. This can result in starnge issues. Both EL9227-5500 and EL9221-5000 have dedicated panels whre status of the over current protection can be seen.\npassive terminals Some terminals are passive. Passive terminals are not EtherCAT slaves and do not communicate over EtherCAT (not equipped with EtherCAT slave controller). Passive terminals are normally used to simplify electrical connections (avoiding external terminals). For instance for distributing potential, 24V and 0V, an EL9184 can be used (8Ch 24V and 8Ch 0V).\nThe passive terminals will not show up as an EtherCAT slave when issueing the \u0026ldquo;ethercat slaves\u0026rdquo; command. However, they are normally visible in the electrical drawings. This could result in that the slave id in the electrical drawing is NOT corresponding to the EtherCAT slave index used when configuring ecmc. In worst case this could lead to that the wrong hardware/drive is configured.\nWhen configuring ecmc, make sure the EtherCAT slave index is correct, do not blindly trust the electrical drawings since and passive terminal could introduce an shift in the slave indices.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/scaling/","title":"scaling","tags":[],"description":"","content":"By popular demand, the topic scaling will be discusses in closer detail.\necmc has to scaling factors for each joint, firstly the drive scaling, secondly the encoder scaling.\nChanges to the scaling have direct effects on the Kp of the PID-loop. If the drive scaling is changes, make sure to adjust the PID parameters accordingly.\n drive scaling Drive scaling deals with the relation of the drive output (typically a 16- or 32-bit register) to axis velocity. Scaling is similar, but slighlty different for stepper drives and servo drives\nstepper motor drives The scaling for the Ex70xx slaves will be explained based on two very common examples.\nsimple linear axis Assumptions:\n 200 fullsteps/rev motor lead screw pitch: 5 mm/rev Register 0x8012:05 is set to 1 \u0026ndash;\u0026gt; 2000 fullsteps max step rate (default for ECMC, check for other slaves!) velocitySetpoint is in 16-bits. drive: numerator: 50 # Fastest speed in engineering units (2000 full steps / s --\u0026gt; 10 rev/s * 5 mm/rev --\u0026gt; 50 mm/s) denominator: 32768 # I/O range 2^15, because 16-bit register, half is forward, the other half is backward explanation The denominator is 32768 because the velocitySetpoint is a 16-register for the Beckhoff stepper drives. Thus, half of the full range is reserved for positive (forward) motion, the remaining half for negative (backward) motion. This means that at full output the motor would receive 2000 fullsteps per second. It is irrelevant whether the motor can actually spin this fast as this a purely theoretical value! Since we have established that the motor spins at 10 rev/s at full output, the conversion to engineering units is trivial and yields 50 mm/s, based on the lead screw pitch.\nrotational axis Assumptions:\n 400 fullsteps/rev motor drive train ratio: 36 deg/rev Register 0x8012:05 is set to 1 \u0026ndash;\u0026gt; 2000 fullsteps max step rate (default for ECMC, check for other slaves!) velocitySetpoint is in 16-bits. drive: numerator: 180 # Fastest speed in engineering units (2000 full steps / s --\u0026gt; 5 rev/s * 36 deg/rev --\u0026gt; 180 deg/s) denominator: 32768 # I/O range 2^15, because 16-bit register, half is forward, the other half is backward explanation At full output, the motor receives 2000 fullsteps/s, which results in 5 rev/s due to the higher fullstep count of the motor. The drive train ratio is specified as 10 motor revolutions per 360 degree on the output or 36 deg/rev. Therefore, the resulting velocity of the motor in EGUs is 180 deg/s. Please note that this is not the actual maximum velocity, but rather a theoretical scaling factor for the PID-loop.\nservo motor drives This section is based on the Beckhoff servo motor drives (Ex72xx), AX-drives or drives from other vendors might differ. The Ex72xx servo motor drives from Beckhoff use a 32-bit register for the velocity setpoint. Therefore, the denominator takes on a value of 2^31 = 2147483648.\nAs for the numerator, the situation is a bit more complicated. The AM81xx synchronous motors come with different pole counts, most have 3 pole pairs, but some have 4. Naturally, this results in a different scaling for either type. At full output a 3 pole pair motor would spin at 8000 revolutions per second! Respectively, the 4 pole pair motor will assume 6000 rev/s. Since no servo motor will ever reach such speeds and the value is only used for the PID-loop scaling, no difference is noticeable in real life applications. Except when a motor is replaced by a different model with deviating pole pair count.\nThe following example shows a 3 pole pair motor scaled for operation in degrees. Therefore, the numerator equals 8000 rev/s * 360 deg/rev = 2880000 deg/s.\ndrive: numerator: 2880000 # Fastest speed in engineering units (8000 rev/s * 360 deg/rev) denominator: 2147483648 # I/O range 2^31, because 32-bit register, half is forward, the other half is backward encoder scaling This scaling ratio describes the relation of encoder counts and engineering units of the axis.\nUnlike the drive scaling, the encoder scaling is much simpler. It represents merely the realtion between the observed counts on the encoder and the displacement of the load.\nclosed-loop Scaling absolute encoders is simple. This example shows a 32-bit encoder with 4096 ticks/mm, for an axis operated in mm.\nencoder: numerator: 1 denominator: 4096 type: 1 # Type: 0=Incremental, 1=Absolute bits: 32 # Total bit count of encoder raw data explanation none, this should be simple enough!\nopen-loop Obviously, for open-loop operation there is no encoder. In this case the internal step counter of the stepper motor drive is used as \u0026ldquo;encoder\u0026rdquo;. In the example below such a case is presented, with an explanation.\nencoder: numerator: 0.125 # 0.125 mm/rev lead screw denominator: 12800 # 200 fullsteps/rev with 64 microsteps/fullstep type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data explanation The internal step counter operates in microsteps. For most drives this value assumes 64, if uncertain consult the respective manual of the drive. In case of a 200 fullsteps/rev motor, the denominator therefore will be set to 200*64=12800. As for the numerator, this is simply the displacement observed for one full motor revolution. As the step counter is incremental, the type: 0 has to be set. The step counter is of type uint16, thus the bits: 16 setting, which is important to handle the over-/underflow.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/servo/","title":"servo motor (Ex72xx)","tags":[],"description":"","content":"setup EP7211-0034 servo drive slave Lab test stage (1mm/rev) Motor : AM8111-0F20 scalings Config for scaling in mm, mm/s, mm/s2\nmotor AM8111-XFX0 Data about the motor can be found here: https://infosys.beckhoff.com/english.php?content=../content/1033/am8100/index.html\u0026amp;id=\nImportant for scaling factors in axis.yaml is the motor pole count. For the AM8111-XFX0 motor the pole count is 6.\nencoder scaling Only the encoder integrated encoder is configured in this example. The specification of the encoder for a AM8111-0F20 motor:\nOne Cable Technology for power and feedback: feedback transmission via motor cable, no feedback cable necessary, electronic nameplate, multi-turn, absolute position within 4096 revolutions, 18 bit resolution. However, when connecting to an Ex72xx drive the single turn count will be 20bits and 12bits multiturn, resulting in a total of 32bits absolute bits.\n encoder.numerator: Travels 1 mm/rev encoder.denominator: Resolution: 1048576 counts (20bits) per = 1mm encoder.absBits: 32 bits (20bits+12bits) encoder.type: Absolute (type 1) ecnoder.absOffset: Offset to 0 position of linear stage (-1000 in this example) # The encoder on most motors are 20bit single turn and 12 bit multiturn (4096 turns) encoder: type: 1 position: ec0.s$(DRV_ID).positionActual01 numerator: 1 denominator: 1048576 bits: 32 absBits: 32 absOffset: -1000 drive scalings Max scale for motors depend on the pole count:\n 6 pole: Max scale is 8000revs/s (in this case 8000mm/s) 8 pole: Max scale is 6000revs/s This then converts to the following cfgs:\n drive.numerator: Max velo = 8000 revs/s == 8000mm/s drive.denominator: velocity setpoint is 32bit == +-31bit = 2147483648 drive.type: Servo drive, set to 1 drive: numerator: 8000 # mm/s, Max speed is 8000 rev/sec for drive (6 pole motor) denominator: 2147483648 type: 1 # Stepper: 0, DS402: 1 (servos) control: ec0.s$(DRV_ID).driveControl01 status: ec0.s$(DRV_ID).driveStatus01 setpoint: ec0.s$(DRV_ID).velocitySetpoint01 reset: 7 switches In standard setup switches are feed from 24V output, for the lab 4ax motion crate this is not the case. However, the configuration for feeding switches (axis.feedSwitchesOutput) have been added anyway:\naxis: id: ${AX_ID=1} feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/direction/","title":"direction of motion","tags":[],"description":"","content":"The direction of motion can be affected by multiple means. Namely, on the slave level, in the axis scaling or in the motorRecord.\nThe best option is to change the direction of motion on the slave level. The alternatives lead to unintuitive scaling factors or mismatch between ECMC and EPICS.\n EtherCAT slave ecmccfg allows SDOs to set individual SDOs in the startup-script of the IOC or in dedicated config files for slaves. As most slaves have a SDOs to invert the direction of motion or counting, it\u0026rsquo;s only natural to make use of this feature. The benefit of changing the direction on the slave is obvious. All axes move in there natural direction, as given by the machine coordinate system. Limit switches - consequently - are always where they belong, even non-experts can diagnose the device or system. Examples for encoder and drive are given below.\nConsult the respective slave manual for the correct SDO.\n encoder direction In many cases inverstion of the encoder value is possible in the ethercat slave. By using INV_DIR macro to applyComponent.cmd, the direction can be changed.\nFor EL5042, example below, the invertion leads to a very high number since the data size is 64bit. Therefore, it\u0026rsquo;s advisable to switch sign in the axis configuration instead.\n # slave 7 {ecmcEL5042} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL5042\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1, MACROS=\u0026#39;INV_DIR=1\u0026#39;\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=2, MACROS=\u0026#39;INV_DIR=1\u0026#39;\u0026#34; drive direction # slave 18 {ecmcEL7041} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7041\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Motor-Generic-2Phase-Stepper, MACROS=\u0026#39;I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230,INV_DIR=1\u0026#39;\u0026#34; ecmc scaling A negative numerator can be used to change the direction of motion. Refer to the scaling section for details.\nThis will result in negative values for MRES of the motorRecord.\n EPICS motorRecord The epics key of the axis config allows for motorRecord fields to be initialized. By initalizing the DIR field to Neg, the motorRecord will start inverted.\nepics: name: reveredAxis precision: 1 unit: deg motorRecord: enable: yes description: \u0026#34;inverted\u0026#34; fieldInit: \u0026#34;DIR=Neg\u0026#34; This will affect the motorRecord only, thus ECMC internally is still moving in the wrong direction. You have been warned!\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/homing/","title":"homing","tags":[],"description":"","content":"homing The follwoing sequences are available:\nECMC_SEQ_HOME_NOT_VALID = 0, ECMC_SEQ_HOME_LOW_LIM = 1, ECMC_SEQ_HOME_HIGH_LIM = 2, ECMC_SEQ_HOME_LOW_LIM_HOME = 3, ECMC_SEQ_HOME_HIGH_LIM_HOME = 4, ECMC_SEQ_HOME_LOW_LIM_HOME_HOME = 5, ECMC_SEQ_HOME_HIGH_LIM_HOME_HOME = 6, ECMC_SEQ_HOME_BWD_HOME = 7, ECMC_SEQ_HOME_FWD_HOME = 8, ECMC_SEQ_HOME_BWD_HOME_HOME = 9, ECMC_SEQ_HOME_FWD_HOME_HOME = 10, ECMC_SEQ_HOME_LOW_LIM_INDEX = 11, ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, ECMC_SEQ_HOME_SET_POS = 15, ECMC_SEQ_HOME_LOW_LIM_SINGLE_TURN_ABS = 21, ECMC_SEQ_HOME_HIGH_LIM_SINGLE_TURN_ABS = 22, ECMC_SEQ_HOME_SET_POS_2 = 25, ECMC_SEQ_HOME_TRIGG_EXTERN = 26, ECMC_SEQ_HOME_NOT_VALID = 0 Not a valid homing sequence, can be used if encoder is absolute.\nECMC_SEQ_HOME_LOW_LIM = 1, Axis moves backward until low limit switch and stops Axis moves forward untill edge detected in limit switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_HIGH_LIM = 2, Axis moves forward until high limit switch and stops Axis moves backward untill edge detected in limit switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_LOW_LIM_HOME = 3, Axis moves backward until low limit switch and stops Axis moves forward untill edge detected in home switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_HIGH_LIM_HOME = 4, Axis moves forward until high limit switch and stops Axis moves backward untill edge detected in home switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_LOW_LIM_HOME_HOME = 5, Axis moves backward until low limit switch and stops Axis moves forward untill edge detected in home switch signal. Position is latched. Axis continues untill second edge of home sensor. Motion is stopped. Axis moves backward untill edge of home sensor. Position is latched. Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_HIGH_LIM_HOME_HOME = 6, Axis moves forward until low limit switch and stops Axis moves backward untill edge detected in home switch signal. Position is latched. Axis continues untill second edge of home sensor. Motion is stopped. Axis moves forward untill edge of home sensor. Position is latched. Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_BWD_HOME = 7, Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 1. ECMC_SEQ_HOME_FWD_HOME = 8, Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 1. ECMC_SEQ_HOME_BWD_HOME_HOME = 9, Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_FWD_HOME_HOME = 10, Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_LOW_LIM_INDEX = 11, Axis moves backward until low limit switch and stops Axis moves forward untill the predefined index signals (ECMC_HOME_LATCH_COUNT_OFFSET)from the encoder is encountered. Position is latched at the desired index position. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. Some additional parameters need to be defined for this homing sequence should work (Example for el5101 ):\nepicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCHPOS\u0026quot;, \u0026quot;ec0.s3.encoderLatchPostion01\u0026quot;) # Ethercat entry for latch position (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_CONTROL\u0026quot;, \u0026quot;ec0.s3.encoderControl01.0\u0026quot;) # Ethercat entry for latch control (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_STATUS\u0026quot;, \u0026quot;ec0.s3.encoderStatus01.0\u0026quot;) # Ethercat entry for latch status (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of latch/over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, Axis moves forward until high limit switch and stops Axis moves backward untill the predefined index signals (ECMC_HOME_LATCH_COUNT_OFFSET) from the encoder is encountered. Position is latched at the desired index position. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. Some additional parameters need to be defined for this homing sequence should work (Example for el5101 ):\nepicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCHPOS\u0026quot;, \u0026quot;ec0.s3.encoderLatchPostion01\u0026quot;) # Ethercat entry for latch position (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_CONTROL\u0026quot;, \u0026quot;ec0.s3.encoderControl01.0\u0026quot;) # Ethercat entry for latch control (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_STATUS\u0026quot;, \u0026quot;ec0.s3.encoderStatus01.0\u0026quot;) # Ethercat entry for latch status (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of latch/over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_SET_POS = 15, (setPosition) Sequence 15 is resereved for save/restore functionality.\nUse ECMC_SEQ_HOME_SET_POS_2 instead (same but not blocked by motor record).\nHowever the sequence 15 can be triggered like the following:\n# Turn off amplifier caput IOC_TEST:Axis1.CNEN 0 # Homing using seq 15 (cannot be triggered from HOMR/HOMF since blocked in motor record) caput IOC_TEST:Axis1.FOFF 1 caput IOC_TEST:Axis1.SET 1 caput IOC_TEST:Axis1.VAL \u0026lt;new position value\u0026gt; caput IOC_TEST:Axis1.FOFF 0 caput IOC_TEST:Axis1.SET 0 ECMC_SEQ_HOME_LOW_LIM_SINGLE_TURN_ABS = 21, Indented use for resolvers (single turn absolute). Similar to seq 11 and 12.\n Axis moves backward until low limit switch and stops Axis moves forward untill limit switch change state Axis stops Homing is performed. The multi turn bits will be homed to the value of ECMC_HOME_POS also consiering a offset of turns defined in ECMC_HOME_LATCH_COUNT_OFFSET. Some additional parameters are important for this homing sequence should work (example):\nepicsEnvSet(\u0026quot;ECMC_ENC_BITS\u0026quot; \u0026quot;25\u0026quot;) # Total bit count of encoder raw data epicsEnvSet(\u0026quot;ECMC_ENC_ABS_BITS\u0026quot;, \u0026quot;12\u0026quot;) # Absolute bit count (for absolute encoders) always least significant part of ECMC_ENC_BITS epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_HIGH_LIM_SINGLE_TURN_ABS = 22, Axis moves forward until high limit switch and stops Axis moves backward untill limit switch change state Axis stops Homing is performed. The multi turn bits will be homed to the value of ECMC_HOME_POS also consiering a offset of turns defined in ECMC_HOME_LATCH_COUNT_OFFSET. Note: Only the multi turn bits are updated!\nSome additional parameters are important for this homing sequence should work (example):\nepicsEnvSet(\u0026quot;ECMC_ENC_BITS\u0026quot; \u0026quot;25\u0026quot;) # Total bit count of encoder raw data epicsEnvSet(\u0026quot;ECMC_ENC_ABS_BITS\u0026quot;, \u0026quot;12\u0026quot;) # Absolute bit count (for absolute encoders) always least significant part of ECMC_ENC_BITS epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_SET_POS_2 = 25, (setPosition) Sequence 25 is the same as 15 but not blocked by motor record. The sequence will just set a new position of the encoder without any movement.\nECMC_SEQ_HOME_TRIGG_EXTERN = 26 Trigger external homing sequence in drive.\n Optional: set drive mode to homing (and wait for mode readback) Set trigg of homing (bit) Wait for homing ready (bit). Reference the ecmc encoder object on rising edge of the homing reday bit Optional: Change drive mode back to motion (and wait for mode readback) Optional: Init post move if configured Currently used for smaract: smaracat example In this exmaple also the drive modes is automatically handled by ecmc.\nsetting polarity of home sensor For some of the sequenceses it could be usefull to change the polarity of the home sensor. That can be done with the follwoing command:\n\u0026quot;Cfg.SetAxisMonHomeSwitchPolarity(int axisIndex, int polarity)\u0026quot;; # polarity==0 is NC (default) # polarity==1 is NO "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisplc/","title":"PLC","tags":[],"description":"","content":"Introduction Each axis can have a native PLC. This PLC can be e.g. used for interlocking or synchronisation. The axis PLC is part of the yaml config. The code can be provided inline or in a separate file.\ninline plc: enable: yes externalCommands: yes code: - ax3.enc.actpos:=(ax1.enc.actpos+ax2.enc.actpos)/2 filter: velocity: enable: yes size: 100 trajectory: enable: yes size: 100 file plc: enable: yes externalCommands: yes file: cfg/heave.plc filter: velocity: enable: yes size: 100 trajectory: enable: yes size: 100 This is the respective plc file\nax${AXIS_NO}.enc.actpos:=(ax{{ var.ty1 }}.enc.actpos+ax{{ var.ty2 }}.enc.actpos)/2; Note the mixed use to MACROs ${AXIS_NO} and local variables {{ var.ty1 }} to boost flexibility.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/","title":"best practice","tags":[],"description":"","content":"best Practice Here you can find some best practice configurations for common usecases. The complete examples with starup files can be found here\nstepper and BISS-C An example configuration of a EL7041-0052 and a EL5042. The complete example with starup file can be found here\nservo An example configuration of a Ex72xx servo drive with AM8xxx motor. The complete example with starup file can be found here\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/empty/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/startup/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/categories/","title":"Categories","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/tags/","title":"Tags","tags":[],"description":"","content":""}] \ No newline at end of file +[{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/build/","title":"build at PSI","tags":[],"description":"","content":" These instructions only work at PSI!\n Build at PSI, using driver.makefile by default this module is only build for RHEL7 and Epics \u0026gt;=R7.0.5\nbuild on login cluster make [LIBVERSION] [clean] [uninstall] install check a particular version check the module loads for version dev, Epics R7+ and ECMC version dev, note MASTER_ID=-1 which runs ECMC in master-less mode. Make proper adjustments to match your needs in terms of versions.\niocsh -7 -r \u0026#34;ecmccfg,dev \u0026#39;ECMC_VER=dev,MASTER_ID=-1\u0026#39;\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/","title":"manual","tags":[],"description":"","content":"ecmccfg A configuration framework for ECMC Motion Control Module for EPICS.\nPurpose The configuration framework contains the necessary files to configure an EPICS IOC for EtherCAT based motion control and DAQ.\n Topics build at PSI introduction general motion PLC knowledge base provided common user commands addAxis.cmd addDataStorage.cmd addMaster.cmd addSlave.cmd addSlaveKL.cmd addVirtualAxis.cmd applyAxisSynchronization.cmd applyConfig.cmd applySlaveConfig.cmd configureAxis.cmd configureSlave.cmd configureVirtualAxis.cmd loadPLCFile.cmd loadPlugin.cmd setAppMode.cmd setDiagnostics.cmd Example IOC require the configuration module with optional version require ecmccfg \u0026lt;VERSION\u0026gt; add a coupler and slave # slave 0 {ecmcEK1100} ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EK1100\u0026#34; # SLAVE_ID is automatically incremented # slave 1 {ecmcEL1018} ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EL1018\u0026#34; # skip slaves 2..6 # slave 7 {ecmcEL2008}, with optional SLAVE_ID ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=E2008, SLAVE_ID=7\u0026#34; #-- ATTENTION, this only work for certain slaves, as the EPICS templates have to be migrated before # slave 9 {ecmcEL2008}, with optional SLAVE_ID and P_SCRIPT ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=E2008, SLAVE_ID=7, P_SCRIPT=mXsXXX\u0026#34; add more slaves and apply configuration to the slaves # slave 8 {ecmcEL7037}, configure slave with optional SLAVE_ID ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureSlave.cmd, \u0026#34;HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B, SLAVE_ID=8\u0026#34; # slave 9 {ecmcEL7037}, addSlave, with immediate call off applySlaveConfig # slave with global configuration ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EL7037\u0026#34; ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applySlaveConfig, \u0026#34;CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; # slave with local configuration, in this case provided by the module `ECMC_AGIR` epicsEnvSet(\u0026#34;CFG_ROOT\u0026#34;, \u0026#34;${ECMC_AGIR_DIR}/\u0026#34;) ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, \u0026#34;HW_DESC=EP7211-0034_ALL\u0026#34; ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applySlaveConfig.cmd, \u0026#34;LOCAL_CONFIG=${CFG_ROOT}AM8211_AGIR.cfg\u0026#34; apply the configuration ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applyConfig.cmd additional configuration manually set binaryOutput01 to 1\necmcConfigOrDie \u0026#34;Cfg.WriteEcEntryIDString(${ECMC_EC_SLAVE_NUM_DIG_OUT},binaryOutput01,1)\u0026#34; adding a physical motor axis classic config epicsEnvSet(\u0026#34;DEV\u0026#34;, \u0026#34;STEST-MYDEVICE\u0026#34;) ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureAxis.cmd, \u0026#34;CONFIG=./cfg/axis_1\u0026#34; yaml config ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addAxisYaml.cmd, \u0026#34;FILE=./AM8111_CSV_minimum.yaml, ECMC_TMPDIR=/tmp/\u0026#34; adding a virtual motor axis ${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, \u0026#34;CONFIG=./cfg/axis_11_virt\u0026#34; adding synchronization ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_1_sync\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_11_sync\u0026#34; loading a PLC from file classic PLC-file ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; pure yaml based PLC ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1.yaml, ECMC_TMPDIR=/tmp/\u0026#34; yaml definition, with classic PLC-file, Note: file key in yaml config will overwrite anything in the code key! ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1File.yaml, ECMC_TMPDIR=/tmp/\u0026#34; go active ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/","title":"addAxis.cmd","tags":[],"description":"","content":"description Script for adding axis EPICS PVs.\ndetails Adds an motion axis.\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/","title":"addDataStorage.cmd","tags":[],"description":"","content":"description Script for adding dataStorage.\ndetails Adds dataStorage buffer.\nauthor Anders Sandstroem\n paramters DS_SIZE Size of data buffer.\nDS_ID (optional), default 0, buffer ID\nDS_TYPE (optional), default 0, 0: Normal Buffer, 1: Ring Buffer, 2: FIFO Buffer\nSAMPLE_RATE_MS (optional), default 1\nDS_DEBUG (optional), default 0, 0: No debug printouts, 1: Debug printouts\n Example calls:\n call for 1000 elements at 10 Hz ${SCRIPTEXEC} ${ecmccfg_DIR}addDataStorage.cmd \u0026#34;DS_ID=1, DS_SIZE=1000, SAMPLE_RATE_MS=100\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/","title":"addDomain.cmd","tags":[],"description":"","content":"description Script for adding an EtherCAT domain.\ndetails Adds an EtherCAt domain.\nauthor Anders Sandström\n paramters EXE_RATE (optional) Execution rate [cycles] defaults 0 (same EC_RATE)\nEXE_OFFSET (optional) Execution offset cycles [cycles] defaults 0\nALLOW_OFFLINE (optional) Allow domain to be offline defaults 0\n All EtherCAT entries generated after this command will be assigned\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/","title":"addEcDataItem.cmd","tags":[],"description":"","content":"description Script for adding a ethercat data item.\ndetails The ethercat data item allows for accessing alreday configured ethercat domain data in a flexible\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/","title":"addEcSdoRT.cmd","tags":[],"description":"","content":"description Script for adding asyn SDO object (access to SDO:s in realtime)\ndetails Add SDO for async access during realtime operation\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/","title":"addEncoder.cmd","tags":[],"description":"","content":"description Script for adding an extra encoder to an axis.\ndetails Adds an encoder to the last configured axis.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/axis_1_enc_2.enc\nDEV (optional) device name, i.e. MOTOR1\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if vars needed for later use).\nCFG_MACROS (optional) Substitution macros for config file\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}addEncoder.cmd, \u0026#34;CONFIG=./cfg/linear_1_enc_3.enc\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/","title":"addMaster.cmd","tags":[],"description":"","content":"description Script for claiming a particular master.\ndetails Claims an EtherCAT master.\nauthor Niko Kivel\n paramters MASTER_ID (optional) master ID as shown by ethercat master.\n Example calls:\n call w/o MASTER_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd call w/ MASTER_ID, which claims the 4th master. ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd, \u0026#34;MASTER_ID=3\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/","title":"addSlave.cmd","tags":[],"description":"","content":"description Script for adding a slave to the EtherCAT bus configuration.\ndetails Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. For some/most slaves also a default\nauthor Niko Kivel\n paramters HW_DESC Hardware descriptor, i.e. EL1008\nSLAVE_ID (optional) bus position\nSUBST_FILE (optional) substitution file\nP_SCRIPT (optional) naming convention prefix script\nNELM (optional) Used for oversampling cards. Defaults to 1\nDEFAULT_SUBS (optional) option to disble default PVs for mapped PDOs\nDEFAULT_SLAVE_PVS (optional, caution!) basic slave PVs, i.e. ${ECMC_P}-Operational will be suppressed\nCALLED_FROM_CFG_SLAVE (optional) Set if called by configureSlave.cmd, default 0\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7037\u0026#34; call w/ SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018, SLAVE_ID=1\u0026#34; call w/ SLAVE_ID and P_SCRIPT ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018, SLAVE_ID=1, P_SCRIPT=mXsXXX\u0026#34; call w/ default PDO PVs disabled ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL3204, DEFAULT_SUBS=false, DEFAULT_SLAVE_PVS=true\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/","title":"addSlaveKL.cmd","tags":[],"description":"","content":"description Script for adding a KL slave to the EtherCAT bus configuration of KL type.\ndetails Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. For some/most slaves also a default\nauthor Anders Sandstrom\n paramters HW_DESC Hardware descriptor, i.e. KL2032\nSLAVE_ID EtherCAT bus position of the BK1250 (or similar terminal)\nSLAVE_ID_KL KL-Bus index in two digit hex starting at zero for the first slave after BK1250 (or similar terminal)\nSUBST_FILE (optional) substitution file\n Example calls:\n${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018, SLAVE_ID=1, SLAVE_ID_KL=0A\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/","title":"addVirtualAxis.cmd","tags":[],"description":"","content":"description Script for adding axis EPICS PVs.\ndetails Adds an virtual axis with PVs.\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/","title":"applyAxisSynchronization.cmd","tags":[],"description":"","content":"description Script for applying axis synchronization\ndetails Adds synchronization parameters to an axis provided by CONFIG.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/linear_1.sax\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if needed vars for later use).\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/linear_1.sax\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/","title":"applyConfig.cmd","tags":[],"description":"","content":"description Script for applying bus configuration.\ndetails Applies the EtherCAT configuration and caluclates data offsets in the process image.\nauthor Niko Kivel\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cfg "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/","title":"applySlaveConfig.cmd","tags":[],"description":"","content":"description Script for applying a specific slave configuration after the slave had been added manually.\ndetails Apply configurations to a slave.\nauthor Niko Kivel\n Example call:\ncall applySlaveConfig with CONFIG\n${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; call applySlaveConfig with LOCAL_CONFIG\n${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;LOCAL_CONFIG=./myFancyServoConfig.cfg\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/","title":"applySlaveDCconfig.cmd","tags":[],"description":"","content":"description Script for applying dc config to slave\ndetails Apply dc configurations to a slave.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/","title":"applySubstitutions.cmd","tags":[],"description":"","content":"description Script for applying substitution file\ndetails Applies substitution from ${SUBST_FILE} with ${P_SCRIPT}\nauthor Niko Kivel\n paramters SUBST_FILE (optional) substitution file\nECMC_P PV prefix\nP_SCRIPT (optional) naming convention prefix script\nNELM (optional) Used for oversampling cards. Defaults to 1\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}applySubstitutions.cmd\u0026#34; \u0026#34;SUBST_FILE=${SUBST_FILE=ecmc${ECMC_EC_HWTYPE}.substitutions},ECMC_P=${ECMC_P}\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/","title":"applyTemplate.cmd","tags":[],"description":"","content":"description Script for applying a template\ndetails Applies template from ${TEMPLATE_FILE} with ${P_SCRIPT}, PARAMS can be passed\nauthor Niko Kivel\n paramters TEMPLATE_FILE template file\nECMC_P PV prefix\nPARAMS (optional) additional parameters\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}applyTemplate.cmd\u0026#34; \u0026#34;TEMPLATE_FILE=ecmcEcSlave.template,ECMC_P=${ECMC_P}\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/","title":"chkOverSampFactOrDie.cmd","tags":[],"description":"","content":"description Validates requested oversampling factor\ndetails Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/","title":"chkOverSampTimeOrDie.cmd","tags":[],"description":"","content":"description Validates the resulting sampling time for oversampling slaves.\ndetails Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/","title":"chkValidCurrentSetOrDie.cmd","tags":[],"description":"","content":"description Validates current settings\ndetails Checks if requested run current and standby current is less than max current and larger than 0.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/","title":"chkValidVoltageSetOrDie.cmd","tags":[],"description":"","content":"description Validates requested voltage\ndetails Ensure requested nominal voltage is less than max voltage and larger than 0\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/","title":"configureAxis.cmd","tags":[],"description":"","content":"description Script for adding an axis with configuration.\ndetails Adds an axis to the configuration and applies parameters provided by CONFIG.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/linear_1.pax\nDEV (optional) device name, i.e. MOTOR1\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if vars needed for later use).\nCFG_MACROS (optional) Substitution macros for config file\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, \u0026#34;CONFIG=./cfg/linear_1.pax\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/","title":"configureSlave.cmd","tags":[],"description":"","content":"description Script for adding a slave with dedicated slave configuration to the EtherCAT bus configuration.\ndetails Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. Applies a specific slave configuration.\nauthor Niko Kivel\n paramters HW_DESC Hardware descriptor, i.e. EL7037\nCONFIG configuration file, i.e. -Motor-Nanotec-ST4118L1804-B\n The CONFIG together with the HW_DESC form the full filename which by definition is ecmc${HW_DESC}${CONFIG}.cmd, i.e.: ecmcEL7037-Motor-Nanotec-ST4118L1804-B.cmd\nparamters SLAVE_ID (optional) bus position\nCFG_MACROS (optional) Substitution macros for config file\nNELM (optional) Used for oversampling cards. Defaults to 1\n Example calls:\n call w/o SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}configureSlave.cmd, \u0026#34;HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; call w/ SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}configureSlave.cmd, \u0026#34;HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B, SLAVE_ID=8\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/","title":"configureVirtualAxis.cmd","tags":[],"description":"","content":"description Script for adding a virtual axis with configuration.\ndetails Adds a virtual axis to the configuration and applies parameters provided by CONFIG.\nauthor Niko Kivel\n paramters CONFIG configuration file, i.e. ./cfg/linear_11.vax\nDEV (optional) device name, i.e. GAP\nCLEAR_VARS_CMD (optional) Set to \u0026ldquo;empty\u0026rdquo; for not clear env vars (if needed vars for later use).\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, \u0026#34;CONFIG=./cfg/linear_11.vax\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/","title":"ecmc_axis-records.cmd","tags":[],"description":"","content":"description Script for adding axis related EPICS PVs.\ndetails Adds motorRecord to the IOC.\nauthor Anders Sandstroem\n This script is typically called by \\b addAxis.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/","title":"ecmc_axis.cmd","tags":[],"description":"","content":"description Script for configuring a physical axis.\ndetails Configures a physical axis in ECMC, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b addAxis.cmd, often via \\b ecmc_axis-records.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/","title":"ecmc_axis_diag.cmd","tags":[],"description":"","content":"description Script for adding axis diagnostic EPICS PVs.\ndetails Adds diagnostic PVs to the IOC.\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/","title":"ecmc_axis_mr.cmd","tags":[],"description":"","content":"description Script for loading motor record related databases\ndetails Script for loading motor record related databases and creating motor record axis object\nauthor Anders Sandstroem\n This script is typically called by \\b ecmc_axis.cmd, often via \\b ecmc_axis-records.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/","title":"ecmc_axis_sync.cmd","tags":[],"description":"","content":"description Script for configuring axis synchronization\ndetails Configures ECMC for axis synchronization, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b applyAxisSynchronization.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/","title":"ecmc_enc-records.cmd","tags":[],"description":"","content":"description Script for adding encoder related EPICS PVs.\ndetails Script for adding an encoder to a previously created axis.\nauthor Anders Sandstroem\n This script is typically called by \\b addAxis.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/","title":"ecmc_enc.cmd","tags":[],"description":"","content":"description Script for adding an extra encoder\ndetails Configures a encoder object in ECMC, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b addEncoder.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/","title":"ecmc_virt_axis-records.cmd","tags":[],"description":"","content":"description Script for adding axis related EPICS PVs.\ndetails Adds motorRecord to the IOC.\nauthor Anders Sandstroem\n This script is typically called by \\b addVirtualAxis.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/","title":"ecmc_virt_axis.cmd","tags":[],"description":"","content":"description Script for configuring a virtual axis.\ndetails Configures a virtual axis in ECMC, based on previously set environment variables.\nauthor Anders Sandstroem\n This script is typically called by \\b addVirtualAxis.cmd, often via \\b ecmc_virt_axis-records.cmd\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/","title":"ecmccfg","tags":[],"description":"","content":"ecmccfg A configuration framework for ECMC Motion Control Module for EPICS.\nLicense This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\nLatest release \nDownload \n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/","title":"ecmcClassicNaming.cmd","tags":[],"description":"","content":"description Script for defining ${ECMC_PREFIX}\ndetails Gathers relevant information about MasterID, SlaveID, \u0026hellip; to create naming convention compliant PREFIX\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/","title":"ecmcESSnaming.cmd","tags":[],"description":"","content":"description Script for defining ${ECMC_P}\ndetails Gathers relevant information about MasterID, SlaveID, \u0026hellip; to create naming convention compliant PREFIX\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/","title":"ecmcmXsXXX.cmd","tags":[],"description":"","content":"description Script for defining ${ECMC_P}\ndetails Gathers relevant information about MasterID, SlaveID, \u0026hellip; to create naming convention compliant PREFIX\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/","title":"finalize.cmd","tags":[],"description":"","content":"description Script for finalizing. Executed just before iocInit (atInit)\ndetails Script for finalizing. Executed just before iocInit (atInit).\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/","title":"general","tags":[],"description":"","content":" chkOverSampFactOrDie.cmd chkOverSampTimeOrDie.cmd chkValidCurrentSetOrDie.cmd chkValidVoltageSetOrDie.cmd general.cmd generalDiagnostics.cmd init.cmd initAll.cmd initAxis.cmd issueWarning.cmd verifyOrDie.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/","title":"general.cmd","tags":[],"description":"","content":"description Add general PVs\ndetails Script for adding general and master diagnostics EPICS PVs\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/","title":"generalDiagnostics.cmd","tags":[],"description":"","content":"description Script for general diagnostics\ndetails Script for setting default diagnostics\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/","title":"init.cmd","tags":[],"description":"","content":"description Initialization script\ndetails Script for setting up the basic EPICS environment.\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/","title":"initAll.cmd","tags":[],"description":"","content":"description Init main script\ndetails Script for setting up the basic EPICS environment.\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/","title":"initAxis.cmd","tags":[],"description":"","content":"description init axis environment\ndetails Script for setting up the basic AXIS environment.\nauthor Niko Kivel, Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/","title":"issueWarning.cmd","tags":[],"description":"","content":"description Issue a warning\ndetails Generic verification script for expressions\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/","title":"jinja2","tags":[],"description":"","content":" loadYamlAxis.cmd loadYamlEnc.cmd loadYamlPlc.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/","title":"loadAxisPLCFile.cmd","tags":[],"description":"","content":"description Script for adding a PLC from file.\ndetails Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable.\nauthor Niko Kivel\n paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc\nAX_ID (optional) Ax number, default 0\nPLC_MACROS (optional) Substitution macros for PLC code\nTMP_PATH (optional) directory to dump the temporary plc file after macro substitution\nPRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).\nSUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadAxisPLCFile.cmd, \u0026#34;AX_ID=1, FILE=./plc/homeSlit.plc\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/","title":"loadPLCFile.cmd","tags":[],"description":"","content":"description Script for adding a PLC from file.\ndetails Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable.\nauthor Niko Kivel, Anders Sandström\n paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc\nPLC_ID (optional) PLC number, default 0, or to next free PLC, the actual PLC Id is stored in ECMC_PLC_ID and can be used after this command\nSAMPLE_RATE_MS (optional) excecution rate, default 1000/EC_RATE\nPLC_MACROS (optional) Substitution macros for PLC code. The macros \u0026ldquo;SELF_ID\u0026rdquo;,\u0026ldquo;SELF\u0026rdquo;,M_ID, and M are reserved:\nTMP_PATH (optional) directory to dump the temporary plc file after macro substitution\nPRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).\nSUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded\nINC (optional) List of directories for include files to pass to MSI (if several paths thendivide with \u0026lsquo;:').\nDESC (optional) Description of PLC\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/","title":"loadPLCLib.cmd","tags":[],"description":"","content":"description Script for loading a PLC from lib from file.\ndetails Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable.\nauthor Anders Sandström\n paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc\nPLC_ID (optional) PLC number, default last loaded PLC\nPLC_MACROS (optional) Substitution macros for PLC code. The macros \u0026ldquo;SELF_ID\u0026rdquo;,\u0026ldquo;SELF\u0026rdquo;,M_ID, and M are reserved:\nINC (optional) List of directories for include files to pass to MSI (if several paths thendivide with \u0026lsquo;:').\nTMP_PATH (optional) directory to dump the temporary plc file after macro substitution\nPRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCLib.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/","title":"loadPlugin.cmd","tags":[],"description":"","content":"description Script for loading a ecmc plugin from file.\ndetails Loads a ecmc-plugin from file.\nauthor Anders Sandström\n paramters FILE Filename of plugin shared lib (./ecmcPlugin_Advanced.so)\nPLUGIN_ID Id of plugin to load\nCONFIG (optional) Configuration string sent to plugin at construct\nREPORT (optional) Printout information of loaded plugin if set to \u0026ldquo;1\u0026rdquo;\n Example call:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPlugin.cmd, \u0026#34;PLUGIN_ID=0,FILE=./ecmcPlugin_Advanced.so,CONFIG=\u0026#39;PLUGIN CONFIGS GO HERE \u0026#39; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/","title":"loadSubstAxes.cmd","tags":[],"description":"","content":"description Script for adding multiple axes based on subst and template file\ndetails Configure multiple axes by using subst file\nauthor Anders Sandström\n ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstAxes.cmd, \u0026#34;FILE=./ax.subs\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/","title":"loadSubstConfig.cmd","tags":[],"description":"","content":"description Script for loading complete ecmc cfg based on subst files and templates\ndetails Loads complete ecmc cfg based on subst files and templates\nauthor Anders Sandström\n ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, \u0026#34;FILE=./cfg.subs\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/","title":"loadSubstHw.cmd","tags":[],"description":"","content":"description Script for adding multiple hw based on subst and template file\ndetails Loads hw cfg based on subst files and templates\nauthor Anders Sandström\n ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstHw.cmd, \u0026#34;FILE=./hw.subs\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/","title":"loadYamlAxis.cmd","tags":[],"description":"","content":"description Script for loading Axis from yaml file via jinja2\ndetails adds an Axis, based on a yaml config file\nauthor Niko Kivel, Anders Sandström\n paramters FILE the yaml-file containing the PLC definition\nDEV the device name (optional, defaults to ${IOC}\n Example calls:\n call ${SCRIPTEXEC} \u0026#34;./loadYamlAxis.cmd\u0026#34; \u0026#34;FILE=./axis1.yaml\u0026#34; ${SCRIPTEXEC} \u0026#34;./loadYamlAxis.cmd\u0026#34; \u0026#34;FILE=./axis1.yaml, DEV=foobar\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/","title":"loadYamlEnc.cmd","tags":[],"description":"","content":"description Script for adding Encoder from yaml file via jinja2\ndetails adds an encoder to an axis, based on a yaml config file\nauthor Anders Sandström\n paramters FILE the yaml-file containing the PLC definition\nDEV the device name (optional, defaults to ${IOC}\n Example calls:\n call ${SCRIPTEXEC} \u0026#34;./loadYamlEnc.cmd\u0026#34; \u0026#34;FILE=./enc.yaml\u0026#34; ${SCRIPTEXEC} \u0026#34;./loadYamlEnc.cmd\u0026#34; \u0026#34;FILE=./enc.yaml, DEV=foobar\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/","title":"loadYamlPlc.cmd","tags":[],"description":"","content":"description Script for loading PLC from yaml file via jinja2\ndetails adds a PLC, line by line, from a yaml-file, parsed by jinja2\nauthor Niko Kivel, Anders Sandström\n paramters FILE the yaml-file containing the PLC definition\n Example calls:\n call ${SCRIPTEXEC} \u0026#34;./loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1.yaml\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/","title":"motion","tags":[],"description":"","content":" ecmc_axis-records.cmd ecmc_axis.cmd ecmc_axis_diag.cmd ecmc_axis_mr.cmd ecmc_axis_sync.cmd ecmc_enc-records.cmd ecmc_enc.cmd ecmc_virt_axis-records.cmd ecmc_virt_axis.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/naming/","title":"naming","tags":[],"description":"","content":" ecmcClassicNaming.cmd ecmcESSnaming.cmd ecmcmXsXXX.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/","title":"restoreRecordUpdateRate.cmd","tags":[],"description":"","content":"description Restores record update rate to what was defined in startup.cmd\ndetails Restores record update rate to what was defined in startup.cmd\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/","title":"scripts","tags":[],"description":"","content":" addAxis.cmd addDataStorage.cmd addDomain.cmd addEcDataItem.cmd addEcSdoRT.cmd addEncoder.cmd addMaster.cmd addSlave.cmd addSlaveKL.cmd addVirtualAxis.cmd applyAxisSynchronization.cmd applyConfig.cmd applySlaveConfig.cmd applySlaveDCconfig.cmd applySubstitutions.cmd applyTemplate.cmd configureAxis.cmd configureSlave.cmd configureVirtualAxis.cmd finalize.cmd jinja2 loadAxisPLCFile.cmd loadPLCFile.cmd loadPLCLib.cmd loadPlugin.cmd loadSubstAxes.cmd loadSubstConfig.cmd loadSubstHw.cmd restoreRecordUpdateRate.cmd setAppMode.cmd setDiagnostics.cmd setRecordUpdateRate.cmd slaveVerify.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/","title":"setAppMode.cmd","tags":[],"description":"","content":"description Script for switching to operational mode.\ndetails Validates configuration, starts realtime thread and checks EtherCAT slaves are in OP.\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/","title":"setDiagnostics.cmd","tags":[],"description":"","content":"description Script for enabling default diagnostics.\ndetails Set some default values to diagostics\nauthor Niko Kivel\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/","title":"setRecordUpdateRate.cmd","tags":[],"description":"","content":"description Script for changing record update rate\ndetails Update record processing rate, all records created after this command will be updated in the specified rate.\nauthor Anders Sandström\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/","title":"slaveVerify.cmd","tags":[],"description":"","content":"description ** script for slave verification and optional reset**\ndetails will verify the slave identity and reset by writing to 0x1011, optionally read firmwre version from 0x100a\nauthor Niko Kivel\n Macros\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/","title":"source","tags":[],"description":"","content":" general motion naming scripts "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/","title":"verifyOrDie.cmd","tags":[],"description":"","content":"description Generic verification script\ndetails Generic verification script for expressions\nauthor Anders Sandstroem\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/introduction/","title":"introduction","tags":[],"description":"","content":"Principle EtherCAT requires the field bus components (slaves) to be configured on the master. The master must know about the data exchanges with the slaves, this is referred to as process image.\nDuring IOC-startup, the requested configuration is validated against the actually present hardware on the bus. Mismatches will result in an error, the IOC will not start.\nBlindly restarting the IOC, with only partially working EtherCAT hardware, will results in an inoperable IOC! Refer to the troubleshooting guide for details.\n IOC structure The startup script has several steps:\n require ecmccfg configure the slaves on the EtherCAT bus additional configuration adding a physical motor axis adding a virtual motor axis adding synchronization loading a PLC from file apply the configuration go active require ecmccfg require ecmccfg \u0026lt;VERSION\u0026gt; slave configuration Each slave on the field bus must be configured for use with ECMC. For this purpose scripts can be called for:\n adding slaves with default configuration adding and configure while adding applying a configuration to the previously added slaves examples The addSlave is used for simple slaves, a default configuration is automatically applied. In addition default PVs will created for the basic slave features, i.e. status. Most slaves also have PVs created matching the purpose, i.e. inputs will have bi records, outputs will have bo records for each channel. This behaviour can be modified by arguments.\n add a coupler and slaves\n# slave 0 {EK1100} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EK1100\u0026#34; # SLAVE_ID is automatically incremented # slave 1 {EL1018} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL1018\u0026#34; # skip slaves 2..6 # slave 7 {EL2008}, with optional SLAVE_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL2008, SLAVE_ID=7\u0026#34; # slave 9 {EL2008}, with optional SLAVE_ID and P_SCRIPT ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL2008, SLAVE_ID=7, P_SCRIPT=mXsXXX\u0026#34; # slave 10 {EL3204}, without any of the default PVs ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL3204, DEFAULT_SUBS=false, DEFAULT_SLAVE_PVS=true\u0026#34; add more slaves and apply configuration to the slaves\n# slave 8 {EL7037}, configure slave using applyComponent.cmd from ecmccomp module with optional SLAVE_ID. ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7037, SLAVE_ID=8\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Motor-Generic-2Phase-Stepper, MACROS=\u0026#39;I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230\u0026#39;\u0026#34; # slave 9 {EL7037}, addSlave, with immediate call off applySlaveConfig # slave with global configuration ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7037\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;CONFIG=-Motor-Nanotec-ST4118L1804-B\u0026#34; # slave with local configuration, in this case provided by the module `ECMC_AGIR` epicsEnvSet(\u0026#34;CFG_ROOT\u0026#34;, \u0026#34;${ECMC_AGIR_DIR}/\u0026#34;) ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EP7211-0034_ALL\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, \u0026#34;LOCAL_CONFIG=${CFG_ROOT}AM8211_AGIR.cfg\u0026#34; apply the configuration The configured process image is applied to the master\n${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd additional configuration Optionally, manual modifications can be made to the default configuration.\nIn order to manually set binaryOutput01 to 1 at startup, the following can be added to the startup script.\necmcConfigOrDie \u0026#34;Cfg.WriteEcEntryIDString(${ECMC_EC_SLAVE_NUM_DIG_OUT},binaryOutput01,1)\u0026#34; ecmcConfigOrDie \u0026#34;Cfg.WriteEcEntryEcPath(ec0.s${ECMC_EC_SLAVE_NUM_DIG_OUT}.binaryOutput12,1)\u0026#34; adding a physical motor axis Axis configuration will is explained in details here. The preferred way to confuser axes is with the yaml based configuration. It unifies the way, (1) physical axes, (2) virtual axes and (3) synchronization is handled. It is theoretically possible to use a mix of yaml and classic configuration, but this is untested.\n yaml config ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, \u0026#34;FILE=./cfg/ax1.yaml, DEV=${DEV}, DRV_SLAVE=4, ENC_SLAVE=3, ENC_CHANNEL=01\u0026#34; classic config epicsEnvSet(\u0026#34;DEV\u0026#34;, \u0026#34;STEST-MYDEVICE\u0026#34;) ${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, \u0026#34;CONFIG=./cfg/axis_1\u0026#34; adding a virtual motor axis ${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, \u0026#34;CONFIG=./cfg/axis_11_virt\u0026#34; adding synchronization ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_1_sync\u0026#34; ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, \u0026#34;CONFIG=./cfg/axis_11_sync\u0026#34; loading a PLC from file The PLC functionality is explained in detail here. ECMC PLCs can be loaded from classical PLC files, from pure yaml files or from a yaml/PLC hybrid.\n classic PLC-file ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100\u0026#34; pure yaml based PLC ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd \u0026#34;FILE=./plc1.yaml\u0026#34; yaml definition, with classic PLC-file, Note: file key in yaml config will overwrite anything in the code key! ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd \u0026#34;FILE=./plc1File.yaml\u0026#34; go active ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/","title":"general","tags":[],"description":"","content":" Topics startup.cmd best practice data storage buffer iocsh utilities ecmc command reference "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/","title":"motion","tags":[],"description":"","content":" Topics yaml configuration scaling direction of motion homing PLC best practice axis ECMC has two types of axes, (1) physical axes, aka joints, and (2) virtual axes, aka end effector. Both types are classes in ECMC, the physical axis is a super-set of the virtual axes, as the latter lacks the hardware.\nyaml config Since v7, axes can be configured with yaml-files. This is a huge improvement over the classic configuration based on EPICS environment variables. For backward compatibility the classical configuration is still supported.\nlinting and schema check From v8+ yaml files are linted for syntactic errors, observe the iocsh for warnings and errors. Additionally the schema of the yaml file is checked by Cerberus. This check will point out errors in the structure of the configuration as well as certain type errors.\nplc yaml config Syncronization configurations\nscaling Configuration of scaling\ndirection Defining the direction of motion\nhoming Configuration of homing\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/","title":"startup.cmd","tags":[],"description":"","content":"startup.cmd startup.cmd takes the following arguments:\n Arguments [optional] ECMC_VER = 9.5.4 EthercatMC_VER = 3.0.2 (obsolete) INIT = initAll MASTER_ID = 0 \u0026lt;-- put negatuve number to disable master, aka non ec-mode SCRIPTEXEC = iocshLoad NAMING = mXsXXX (default), ClassicNaming, ESSnaming EC_RATE = 1000 MODE = FULL / DAQ FULL: Init ecmc with support for both motion and DAQ (DEFAULT) DAQ: Init ecmc with support for only daq (not motion) NO_MR: Init ecmc with support for motion (without motor record) and DAQ PVA = YES / NO TMP_DIR = directory for temporary files ENG_MODE = 1/0. If ENG_MODE is set then PVs used for commissioning will be avaialble EC_TOOL_PATH = Path to ethercat tool defaults to ethercat tool in ECmasterECMC_DIR, otherwise \u0026quot;/opt/etherlab/bin/ethercat\u0026quot; MAX_PARAM_COUNT = Maximum asyn param count, defaults to 1500 [set by module] ECMC_CONFIG_ROOT = root directory of ${MODULE} ECMC_CONFIG_DB = database directory of ${MODULE} EthercatMC_DB = database directory of EthercatMC ECMC_EC_MASTER_ID = EtherCAT master id in use (for use in later scripts) ECMC_EC_SAMPLE_RATE = EtherCAT bus sampling rate [Hz] (1000 default) ECMC_EC_SAMPLE_RATE_MS = EtherCAT bus sampling rate [ms] (1 default) ECMC_MODE = ecmc mode. FULL/DAQ, Defaults to FULL ECMC_PVA = use pva, default NO ECMC_SUPPORT_MOTION = Variable to be used to block use of motion (\u0026quot;\u0026quot;/empty=support motion or \u0026quot;#-\u0026quot;=disable motion) ECMC_TMP_DIR = directory for temporary files, defaults to \u0026quot;/tmp/${IOC}/EcMaster_${ECMC_EC_MASTER_ID}}/\u0026quot; ECMC_EC_TOOL_PATH = path to ethercat tool ECMC_SAMPLE_RATE_MS = current record update rate in milli seconds ECMC_SAMPLE_RATE_MS_ORIGINAL = ECMC_SAMPLE_RATE_MS (used for restore to default if ECMC_SAMPLE_RATE_MS is changed) Normally these arguments are set when the module is required:\nrequire ecmccfg \u0026quot;ENG_MODE=1,MASTER_ID=2\u0026quot; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/","title":"PLC","tags":[],"description":"","content":" Topics syntax function libs best practice PLCs In ECMC, PLCs are a very powerful tool to handle EtherCAT data in real-time.\nSince ecmccfg v7, the PLCs can be instantiated in 3 different ways:\n pure text files, classic ecmc PLC pure yaml files or text files, with yaml header. pure text files The simplest and most generic way to load plc file is by the loadPLCFile.cmd command:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026quot;FILE=\u0026lt;filename\u0026gt;, INC=\u0026lt;include_dirs\u0026gt;, SAMPLE_RATE_MS=\u0026lt;rate_ms\u0026gt;, PLC_MACROS='\u0026lt;custom_macros\u0026gt;'\u0026quot; pure yaml Backwards compatibility for classic, text based PLCs is assured for yaml based.\n yaml is - like python - indentation sensitive!\n Indent with 2 spaces.\n All keys are mandatory.\n id: PLC id, unique uint enable: PLC enabled at start rateMilliseconds: execution rate in ms. To execute every cycle, independant of cycle rate, use -1. code: dictionary of code lines. Line terminator is still a pipe |, this is subject to change!\n For more complex PLCs, it is highly advisable to use text based PLC definitions with a yaml header.\n plc: id: 1 enable: no rateMilliseconds: 10 code: - \u0026#39;ec0.s2.binaryOutput07:=global.test|\u0026#39; - \u0026#39;${PLC_ID}.enable:=plc0.enable|\u0026#39; - \u0026#39;ec0.s2.binaryOutput05:=not(ec0.s2.binaryOutput05)|\u0026#39; - \u0026#39;plc1.error:=12345|\u0026#39; yaml header Instead of the code dictionary, the file key can be used to load the PLC from a text file. The syntax of the text PLCs is kept from earlier versions.\nAll keys are mandatory.\n id: PLC id, unique uint enable: PLC enabled at start rateMilliseconds: execution rate in ms. To execute every cycle, independant of cycle rate, use -1. file: PLC text file to load. If the file key is set, all definitions in the code dictionary are overwritten.\n yaml header\n plc: id: 1 enable: yes rateMilliseconds: 10 file: plc1.plc PLC file\n # this is a comment println(\u0026#39;plc1 from file\u0026#39;); println(\u0026#39;plc1 from file # hash with inline comment\u0026#39;); # inline test static.i:=static.i+1; # counter println(\u0026#39;i = # + - * / \u0026#39;, static.i); # println iocsh call\n ${SCRIPTEXEC} \u0026#34;${ECMC_CONFIG_ROOT}loadYamlPlc.cmd\u0026#34; \u0026#34;FILE=./plc1File.yaml, ECMC_TMPDIR=/tmp/\u0026#34; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/","title":"ethercat command line interface","tags":[],"description":"","content":" ethercat CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. The most common commands will be explained here.\nethercat master This will show the state of all masters on the respective host.\nThe command will show the state of all masters. To limit the command to a single master, make use of the -m parameter.\n The -m parameter is available to all ethercat commands, and is even require by some in case of multiple masters. Check the help by issuing ethercat -h for details.\n Example:\nethercat master Master0 Phase: Operation Active: yes Slaves: 38 Ethernet devices: Main: b4:7a:f1:30:7e:d5 (attached) Link: UP Tx frames: 133210322 Tx bytes: 11957093893 Rx frames: 133210320 Rx bytes: 11957093737 Tx errors: 0 Tx frame rate [1/s]: 500 500 500 Tx rate [KByte/s]: 43.4 43.4 43.3 Rx frame rate [1/s]: 500 500 500 Rx rate [KByte/s]: 43.4 43.4 43.3 Common: Tx frames: 737445202 Tx bytes: 114898987125 Rx frames: 737445184 Rx bytes: 114898984314 Lost frames: 18 Tx frame rate [1/s]: 500 500 500 Tx rate [KByte/s]: 43.4 43.4 43.3 Rx frame rate [1/s]: 500 500 500 Rx rate [KByte/s]: 43.4 43.4 43.3 Loss rate [1/s]: 0 0 0 Frame loss [%]: 0.0 0.0 0.0 Distributed clocks: Reference clock: Slave 0 DC reference time: 708164169043902491 Application time: 708427716430011969 2022-06-13 09:28:36.430011969 In case the numbers mostly zero, check the link state.\nEthernet devices: Main: b4:7a:f1:30:7e:d5 (attached) Link: UP \u0026lt;--- HERE If the link is DOWN, try bringing the network device up manually. This, can be done with ip link set \u0026lt;nameOfNetworkDevice\u0026gt; up\nIf the device name is unkown, check with ip link show and search for the MAC the EtherCAT master is bound to.\nethercat slaves As the command suggest, this will provide a list of the EtherCAT slaves.\nExample:\nethercat slaves 0 0:0 PREOP + EK1100 EtherCAT Coupler (2A E-Bus) 1 0:1 PREOP + EL9227-5500 ?berstromschutz 24V DC, 2K., max. 10A (Summe), eins 2 0:2 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 3 0:3 PREOP + EL5042 2Ch. BiSS-C Encoder 4 0:4 PREOP + EL5042 2Ch. BiSS-C Encoder 5 0:5 PREOP + EL9410 E-Bus Netzteilklemme (Diagnose) 6 0:6 PREOP + EL9576 Bremschopper Klemme 7 0:7 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 8 0:8 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 9 0:9 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 10 0:10 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 11 0:11 PREOP + EK1100 EtherCAT-Koppler (2A E-Bus) 12 0:12 PREOP + EL9227-5500 ?berstromschutz 24V DC, 2K., max. 10A (Summe), eins 13 0:13 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 14 0:14 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 15 0:15 PREOP + EL1034 4K. Dig. Eingang 24V, potenzialfrei, 10?s 16 0:16 PREOP + EL5042 2Ch. BiSS-C Encoder 17 0:17 PREOP + EL5042 2Ch. BiSS-C Encoder 18 0:18 PREOP + EL5042 2Ch. BiSS-C Encoder 19 0:19 PREOP + EL3314 4K. Ana. Eingang Thermoelement (TC) 20 0:20 PREOP + EL9410 E-Bus Netzteilklemme (Diagnose) 21 0:21 PREOP + EL9576 Bremschopper Klemme 22 0:22 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 23 0:23 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 24 0:24 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 25 0:25 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 26 0:26 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 27 0:27 PREOP + EL7041 1Ch. Stepper motor output stage (50V, 5A) 28 0:28 PREOP + EKM1101 EtherCAT Coupler (2A E-Bus, ID switch, Diagnostics, is 29 0:29 PREOP + ELM3004-0000 4K. Ana. Eingang +/-30V, 24 bit, hochgenau 30 0:30 PREOP + ELM3146-0000 6Ch. Ana. Input +/-10V, +/-20mA, 24 bit, high prec 31 0:31 PREOP + ELM3602-0002 2Ch. IEPE Sensor, 24 bit, high precision 32 0:32 OP + EP7047-1032 1K. Schrittmotor-Endstufe (50V, 5A) 33 0:33 OP + EP5001-0002 1K. SSI Encoder 34 0:34 PREOP + EP7041-0002 1K. Schrittmotor-Endstufe (50V, 5A) 35 0:35 PREOP + EP7211-0034 1Ch. MDP742 Servo motor output stage with OCT (50V, 36 0:36 PREOP + EP7211-0034 1K. MDP742 Servo-Motor-Endstufe mit OCT (50V, 4,5A 37 0:37 PREOP + EP7211-0034 1K. MDP742 Servo-Motor-Endstufe mit OCT (50V, 4,5A ethercat sdos Download and display the service data objects.\nUse with caution as this command can take a long time to fetch all data. It is advised to limit the download to the specific slave in question, with the -p \u0026lt;slaveID\u0026gt; parameter.\n ethercat pdos Similar to the sdos counterpart, this command will fetch the currently applied process data objects. To avoid excessive output, it is advised to limit the command to a single slave.\nethercat upload With this command the value of a register can be fetched.\nIf the type is not explicitly given, first issue ethercat -p \u0026lt;slaveID\u0026gt; sdos. This will allow implicit type handling.\n Example: Fetch content of register 0x8020, sub-register 0x05 from slave 32.\nethercat upload -m0 -p32 0x8020 0x05 0x03e8 1000 ethercat download With this command the value of a register can be set on the slave.\nIf the type is not explicitly given, first issue ethercat -p \u0026lt;slaveID\u0026gt; sdos. This will allow implicit type handling.\n Example: Set value of register 0x8010, sub-register 0x07 from slave 7 to 314.\nethercat download -m0 -p7 0x8010 0x07 314 ethercat states With this command a specific state of a slave can be forced, or at least an attempt to enter the specific state is made.\nThis is helpful when a slave is stuck, e.g. with an error. Rather than cycle the power of the entire controller, the slave can be set to \u0026lsquo;REBOOT\u0026rsquo;. This might be enough to recover.\nAlternatively, cycling to \u0026lsquo;INIT\u0026rsquo; and back to \u0026lsquo;OP\u0026rsquo; might also be attempted.\nA power cycling of the of the EtherCAT components is the last resort!\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/best_practice/","title":"best practice","tags":[],"description":"","content":"EtherCAT rate (EC_RATE) The default EtherCAT frame rate in ecmc is set to 1kHz. For most applications this is however not needed and can therefore be reduced. A reduced EtherCAT rate reduces the load on the controller. In general, a good value for the frame rate is in the range 100Hz to 1kHz. For motion systems, a frame rate of 100Hz..500Hz is normally enough. Rates ouside the 100Hz..1kHz range is normally not a good idea, and some slaves might not support it. However, in special cases both lower and higher rates might be possible and required.\nExample: Set rate to 500Hz\nrequire ecmccfg \u0026quot;EC_RATE=500\u0026quot; ... For more information see the chapter startup.cmd.\nAs a comparison, TwinCAT default EtherCAT rates are:\n 100Hz for PLC 500Hz for motion See ecmc_server for more information.\necmc server setup If possible, make sure you use the native igb ethercat driver. For more information see:\n https://git.psi.ch/motion/ecmc_server_cfg ecmc_server for more information. "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/","title":"motion","tags":[],"description":"","content":" Topics both_limits error position lag error, (following error), tuning latency issues drive refuse to enable both_limits error The \u0026ldquo;BOTH_LIMITS\u0026rdquo; error can be related to that limits switches are not powered with 24V. As standard at PSI, limts are feed from 24V outputs, normally an EL2819 terminal. Basically the ouptputs needs then to be set to 1 in order to power the switches. Check the schematics in order to find out which output that powers the switches for a certain axis and then use one the following approaches to set it to 1:\nDefine the output in axis yaml file:\naxis: id: 1 # Axis id ... feedSwitchesOutput: ec0.s5.binaryOutput02 # Ethercat entry for feed switches ... By using the commad Cfg.WriteEcEntryEcPath(ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.binaryOutput\u0026lt;id\u0026gt;,\u0026lt;value\u0026gt;):\necmcConfigOrDie \u0026quot;Cfg.WriteEcEntryEcPath(ec0.s5\u0026gt;.binaryOutput02,1)\u0026quot; position lag error A position lag error (following error) can be genereated in the following situations:\n The motor torque is too low, making it hard for the motor to keep up with the setpoint. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. The velocity setpoint is too high resulting in motor stall (common for stepper motors). The velocity setpoint is higher than what the drive can achive (saturated velocity setpoint). 1. motor torque to low First ensure that the mechanics are i good condition and not blocked (over the entire working range). If possible, measure needed torque with a torque meter. Check motor data, can the motor deliver the required torque at the required speed. If not, then a motor with higher torque is needed. Check the current setting of the motor. If possible increase the current setting to get a higher torque. Before increase current to the motor, make sure that both motor and drive can handle the higher current. Extra care needs to be taken for vaccum applications.\n 2. scaling factors are wrong Check the scaling documentation here. One way to test if the scaling is correct is to set all controller parameters (except Kff) to 0 and then initiate a move. Basically the actual position of the axis should follow the setpoint closely with teh same slope. If the slope differs, then the scaling factors are wrong.\n3. the velocity setpoint is too high resulting in stall If a stepper motor stalls because of too high velocity there\u0026rsquo;s a few thing that can be done in order to improve the ability to reach higehr velocities:\n Add a damper: This is nromally very effichient but not always possible. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive), see hardware/tuning If possible, test to increase or reduce current (make sure you do not burn the motor if increasing). Before increase current to the motor, make sure that both motor and drive can handle the higher current. Extra care needs to be taken for vaccum applications.\n 4. velocity higher than allowed by driver For EL704x stepper drives are default setup to maximum veleocity range of +-2000fullsteps/s. The 16bit velocity setpoint that are sent to the drive correspons to this range. Bascially trying to write a higehr value than that will saturate the velocity setpoint resulting in that the required speed is not achived, resulting in position lag error. The speed range for the EL704x can however be changed by setting SDO 8012:05:\n0 for 1000 full steps/second 1 for 2000 full steps/second (default) 2 for 4000 full steps/second 3 for 8000 full steps/second 4 for 16000 full steps/second 5 for 32000 full steps/second After changing this value you also need to change the drive scaling in the axis yaml file.\ndrive refuse to enable First check the dedicated hardware drive panel for diagnostics. If the drive is in warning or error state the diagnose the problem with the tool described in hardware.\nPossible reasons:\n For systems with safety, tripp off STO or power to the drive removed by contactor. Check status of safety system. Over current protection of 48V tripped. No 48V connected. ecmc PLC disabaling axis, check PLC sources. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). Axis object configured with external interlock (yaml-\u0026gt;input.interlock). "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/","title":"hardware","tags":[],"description":"","content":" Topics general ecmc server EL5042 EL70x1 EL9xxx "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/","title":"knowledge base","tags":[],"description":"","content":" Topics ethercat command line interface motion hardware tuning manual motion troubleshooting Due to the complexity an EtherCAT bus topology can assume, troubleshooting can be challenging. This guide should provide the basic means to diagnose simple errors and is by no means complete!\ngeneral problems For general issues, a very short troubleshooting guide is provided here.\ncommand line interface A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible here.\nmotion For motion related issues, a very short troubleshooting guide is provided here.\ndrive tuning Tune drive control loops\nhardware For hardware related issues, a very short troubleshooting guide is provided here.\nmanual motion Trigger manual motion (without motion ecmc-axis).\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/","title":"modes","tags":[],"description":"","content":"ecmc modes ecmc can be started in different modes by setting the MODE parameter to startup.cmd (or require ecmccfg):\n FULL DAQ NO_MR A separate mode for commissioning is also available, called ENG_MODE.\nmode==FULL (default) In FULL mode all ecmc functionalities are supported, like motion, daq and plcs.\nExample of starting ecmc in FULL mode:\n$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, \u0026quot;IOC=$(IOC),ECMC_VER=develop,MODE=FULL\u0026quot; # or since FULL mode is default the MODE parameter can be ignored $(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, \u0026quot;IOC=$(IOC),ECMC_VER=develop\u0026quot; mode==DAQ In DAQ mode, motion functionalities are disabled and the following commands are blocked:\n configureAxis.cmd configureVirtualAxis.cmd addAxis.cmd addVirtualAxis.cmd This mode is intended to be used for pure DAQ use cases.\nExample of starting ecmc in DAQ mode:\n$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, \u0026quot;IOC=$(IOC),ECMC_VER=develop,MODE=DAQ\u0026quot; NOTE: The default record update rate is set to 10ms in initAlll.cmd. For DAQ applications it could be needed to change this parameter to update records faster by changing the ECMC_SAMPLE_RATE_MS variable:\nepicsEnvSet(\u0026quot;ECMC_SAMPLE_RATE_MS\u0026quot;,1) mode==NO_MR In this mode all features are supported, but motor record will not be created for motion axes.\nENG_MODE Setting the parameter ENG_MODE=1 will result in loading of extra PVs usefull for commissioning, i.e. controller parameters for motion axes.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/stepper_biss_c/","title":"stepper and biss-c","tags":[],"description":"","content":"setup EL7041 stepper drive slave EL5042 BISS-C encoder slave Lab test stage (1mm/rev) Lab 4 axis motion control box RLS BISS-C linear encoder (absolute) Open loop encoder (incremental) scalings Config for scaling in mm, mm/s, mm/s2\nencoder scalings Two encoders are configured:\n Closed loop: BISS-C. This is used as the default encoder for control Open loop: EL7041 Step counter Both these encoders (and drive) should be scaled to the same unit (mm).\nRLS BISS-C (encoder 1) RLS BISS-C:\n encoder.numerator: Travels 1 mm/rev (linear encoder) encoder.denominator: Resolution: 4096 counts per = 1mm encoder.absBits: 26 bits encoder.type: Absolute (type 1) ecnoder.absOffset: Offset to 0 position of linear stage (-1408.794 in this example) encoder: desc: BISS-C numerator: 1 # Scaling numerator example 1 mm/rev denominator: 4096 # Scaling denominator example 4096 ticks per 360 degree type: 1 # Type: 0=Incremental, 1=Absolute bits: 26 # Total bit count of encoder raw data absBits: 26 # Absolute bit count (for absolute encoders) always least significant part of 'bits' absOffset: -1408.794 # Encoder offset in eng units (for absolute encoders) position: ec0.s$(ENC_SID).positionActual${ENC_CH=01} # Ethercat entry for actual position input (encoder) status: ec0.s$(ENC_SID).encoderStatus${ENC_CH=01} # mandatory only if 'warning' or 'error' are used ready: 2 # Bit in encoder status word for encoder ready warning: 0 # Warning (optional) error: # max 3 (optional) - 1 # Error 0 Hardware configuration EL5042\nDo not use the LSB offset functionality of the EL5042 (0x80p8:17). The same amount of ones (\u0026ldquo;1\u0026rdquo;) will be shifted in as MSB which then normally leads to a higher position value, which is confusing. For more information see the troubleshootuing/hardware section.\n open loop (encoder 2) The EL7041 drive has a build in micro step counter (64 microsteps/fullstep):\n encoder.numerator: Travels 1 mm/rev encoder.denominator: Resolution: 200*64=12800 microsteps/rev = 12800 microsteps/mm encoder.bits: The counter is 16bit (default) encoder.type: Incremental (type 0) encoder: desc: 'Open loop' unit: mm numerator: 1 # Scaling numerator denominator: 12800 # Scaling denominator type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data absBits: 0 # Absolute bit count (for absolute encoders) absOffset: 0 # Encoder offset in eng units (for absolute encoders) position: ec0.s$(DRV_SID).positionActual01 # Ethercat entry for actual position input (encoder) homing: refToEncIDAtStartup: 1 # Ref encoder at startup (to BISS value) drive scalings The EL7041 is default setup to operate in a velocity range of +-2000 full steps/s which then corresponds to the 16bit drive.setpoint parameter (ec0.s$(DRV_SID).velocitySetpoint01):\n drive.numerator: Max velo = 2000 fullsteps/s == 10mm/s drive.denominator: velocity setpoint is 16bit == +-15bit = 32768 drive.type: Stepper drive, set to 0 drive: numerator: 10 # Fastest speed in eng. units (2000 Fullsteps/s==10mm/s) denominator: 32768 # I/O range for ECMC_EC_ALIAS_DRV_VELO_SET (normally +-16bit) type: 0 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives) setpoint: ec0.s$(DRV_SID).velocitySetpoint01 # Velocity setpoint if CSV. Position setpoint if CSP control: ec0.s$(DRV_SID).driveControl01 # Control word ethercat entry enable: 0 # Enable bit index in control word (not used if DS402) reset: 1 # Reset bit in control word (if no drive reset bit then leave empty) reduceTorque: 2 # Reduce torque bit in drive control word reduceTorqueEnable: True # Enable reduce torque functionality status: ec0.s$(DRV_SID).driveStatus01 # Status word ethercat entry enabled: 1 # Enabled bit index in status word (not used if DS402) warning: 2 # Warning bit in status word (if no drive warning bit then leave empty) error: # max 3 error bits in status word - 3 # Error 0 (if no drive error bit then leave empty) - 7 # Error 1 (if no drive error bit then leave empty) - 14 # Error 2 (if no drive error bit then leave empty) switches In standard setup switches are feed from 24V output, for the lab 4ax motion crate this is not the case. However, the configuration for feeding switches (axis.feedSwitchesOutput) have been added anyway:\naxis: id: 1 # Axis id feedSwitchesOutput: ec0.s5.binaryOutput01 # Ethercat entry for feed switches At PSI, the limit switches are connected directlly to the 2 inputs of the EL70xx stepper drives and are accessible in the status word, bit 11 and 12:\ninput: limit: forward: ec0.s$(DRV_SID).driveStatus01.12 # Ethercat entry for low limit switch input backward: ec0.s$(DRV_SID).driveStatus01.11 # Ethercat entry for high limit switch input home: 'ec0.s$(DRV_SID).ONE.0' # Ethercat entry for home switch interlock: 'ec0.s$(DRV_SID).ONE.0' # Ethercat entry for interlock switch input Always verify where the switches are connected in the electrical drawings.\n All switches in the \u0026ldquo;input\u0026rdquo; section needs to be linked. If not used, then the simulation registers, \u0026ldquo;ONE\u0026rdquo; and \u0026ldquo;ZERO\u0026rdquo;, can be used:\n 32 bit register of ones (rw): ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.ONE. 32 bit register of zeros (rw): ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.ZERO. Example, Use bit 1 in the ONE register of slave 1:\nec0.s1.ONE.1 If no ethercat slave is defined, slave number \u0026ldquo;-1\u0026rdquo; can be used: ec\u0026lt;master_id\u0026gt;.s-1.ONE.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/syntax/","title":"syntax","tags":[],"description":"","content":"In ECMC, PLCs are based on the exprtk expression evaluation library. For detailed syntax help please visit the exprtk website\ncommon errors, misconceptions and info operators :=: assignment = or ==: equal comparison functions PLC do not immediately write to the bus! The PLC will excecute synchronous to the cycle, or at an integer fraction of it. The prcessed data will be send to the bus with the next cycle. PLCs do not delay the bus!\nstatement terminator Statements are terminated by a semicolon ;\nvariables All variables are initiated to 0\ncomments The hash charactoer # is reserved for comments. Everything after this char will be removed before compile. println('########'); will be seen by the compiler as println(' !\n macros So far macro substitution is not implemented for yaml!\n If macro substitution is needed, please use the traditional approach using loadPLCFile.cmd, with the PLC_MACROS variable.\n examples PLC can access:\n variables process data axis PLCs data storage Function examples are given at the end.\nCustom function libs in exprtk syntax can be added and loaded to the PLC objects.\n Custom plc functions can be written in c in plugins.\n general # # 1. Assignment: # ec0.s1.VALUE:=100; # # 2. if-else (note the equl sign): # if(ec0.s1.VALUE=100) { # # code # } # else { # # code # }; # # 3. for loop: # for (static.i := 0; static.i \u0026lt; static.elements; static.i += 1) { # # code # }; # # 4. printouts (minimize printouts or use only for debug): # print(\u0026#34;The value of ec0.s1.VALUE is: \u0026#34;,ec0.s1.VALUE); # Without line feed # println(\u0026#34;The value of ec0.s1.VALUE is: \u0026#34;,ec0.s1.VALUE); # With line feed # # Also see the \u0026#34;ec_print_bin()\u0026#34; and \u0026#34;ec_print_hex()\u0026#34; below. variables generic # 1. static.\u0026lt;varname\u0026gt; Static variable. Initiated to 0. (rw) # Access only in the PLC where defined. # Will keep value between execution # loops. # 2. global.\u0026lt;varname\u0026gt; Global variable. Initiated to 0. (rw) # Access from all PLCs. # Will keep value between execution # loops. # 3. var \u0026lt;varname\u0026gt; Local variable (exprtk syntax) (rw) # Will NOT keep value between # execution loops. EtherCAT # 1. ec\u0026lt;ecid\u0026gt;.s\u0026lt;sid\u0026gt;.\u0026lt;alias\u0026gt; ethetcat data (rw) # ecid: ethercat master index # sid: ethercat slave bus position # alias: entry name as defined in # \u0026#34;Cfg.EcAddEntryComplete() # 2. ec\u0026lt;ecid\u0026gt;.masterstatus Status of master (1=OK) motion # 1. ax\u0026lt;id\u0026gt;.id axis id (ro) # 2. ax\u0026lt;id\u0026gt;.reset reset axis error (rw) # 3. ax\u0026lt;id\u0026gt;.counter execution counter (ro) # 4. ax\u0026lt;id\u0026gt;.error error (ro) # 5. ax\u0026lt;id\u0026gt;.allowplccmd Allow writes to axis from PLC (rw) # 6. ax\u0026lt;id\u0026gt;.enc.actpos actual position (rw) # 7. ax\u0026lt;id\u0026gt;.enc.extactpos actual position from plc sync. # expression (ro) # 8. ax\u0026lt;id\u0026gt;.enc.actvel actual velocity (ro) # 9. ax\u0026lt;id\u0026gt;.enc.rawpos actual raw position (ro) # 10. ax\u0026lt;id\u0026gt;.enc.source internal source or expressions (rw) # source = 0: internal encoder # source \u0026gt; 0: actual pos from expr # 11. ax\u0026lt;id\u0026gt;.enc.homed encoder homed (rw) # 12. ax\u0026lt;id\u0026gt;.enc.homepos homing position (rw) # 13. ax\u0026lt;id\u0026gt;.traj.setpos curent trajectory setpoint (rw) # 14. ax\u0026lt;id\u0026gt;.traj.targetpos target position (rw) # 15. ax\u0026lt;id\u0026gt;.traj.extsetpos current trajecrory setpoint from # plc sync. expression (rw) # 16. ax\u0026lt;id\u0026gt;.traj.targetvel target velocity setpoint (rw) # 17. ax\u0026lt;id\u0026gt;.traj.targetacc target acceleration setpoint (rw) # 18. ax\u0026lt;id\u0026gt;.traj.targetdec target deceleration setpoint (rw) # 19. ax\u0026lt;id\u0026gt;.traj.setvel current velocity setpoint (ro) # 20. ax\u0026lt;id\u0026gt;.traj.setvelffraw feed forward raw velocity (ro) # 21. ax\u0026lt;id\u0026gt;.traj.command command (rw) # command=1: move velocity # command=2: move rel. pos # command=3: move abs. pos # command=10: homing # 22. ax\u0026lt;id\u0026gt;.traj.cmddata cmddat. Homing procedure # only valid if ax\u0026lt;id\u0026gt;.traj.command=10 # cmddata=1 : ref low limit # cmddata=2 : ref high limit # cmddata=3 : ref home sensor # (via low limit) # cmddata=4 : ref home sensor # (via high limit) # cmddata=5 : ref center of home sensor # (via low limit) # cmddata=6 : ref center of home sensor # (via high limit) # cmddata=15 : direct homing # cmddata=21 : ref partly abs. encoder # (via low limit). # ref at abs bits. # over/under-flow.. # cmddata=22 : ref partly abs. encoder # (via high limit). # ref at abs bits. # over/under-flow.. # 23. ax\u0026lt;id\u0026gt;.traj.source internal source or expressions (rw) # source = 0: internal traj # source \u0026gt; 0: setpoints from expr # 24. ax\u0026lt;id\u0026gt;.traj.execute execute motion command (rw) # 25. ax\u0026lt;id\u0026gt;.traj.busy axis busy (ro) # 26. ax\u0026lt;id\u0026gt;.traj.dir axis setpoint direction (ro) # ax\u0026lt;id\u0026gt;.traj.dir\u0026gt;0: forward # ax\u0026lt;id\u0026gt;.traj.dir\u0026lt;0: backward # ax\u0026lt;id\u0026gt;.traj.dir=0: standstill # 27. ax\u0026lt;id\u0026gt;.cntrl.error actual controller error (ro) # 28. ax\u0026lt;id\u0026gt;.cntrl.poserror actual position error (ro) # 29. ax\u0026lt;id\u0026gt;.cntrl.output actual controller output (ro) # 30. ax\u0026lt;id\u0026gt;.drv.setvelraw actual raw velocity setpoint (ro) # 31. ax\u0026lt;id\u0026gt;.drv.enable enable drive command (rw) # 32. ax\u0026lt;id\u0026gt;.drv.enabled drive enabled (ro) # 33. ax\u0026lt;id\u0026gt;.seq.state sequence state (homing) (ro) # 34. ax\u0026lt;id\u0026gt;.mon.ilock motion interlock (both dir) (rw) # ax\u0026lt;id\u0026gt;.mon.ilock=1: motion allowed # ax\u0026lt;id\u0026gt;.mon.ilock=0: motion not allowed # 35. ax\u0026lt;id\u0026gt;.mon.ilockbwd motion interlock bwd dir (rw) # ax\u0026lt;id\u0026gt;.mon.ilockbwd=1: motion allowed # ax\u0026lt;id\u0026gt;.mon.ilockbwd=0: motion not allowed # 36. ax\u0026lt;id\u0026gt;.mon.ilockfwd motion interlock fwd dir (rw) # ax\u0026lt;id\u0026gt;.mon.ilockfwd=1: motion allowed # ax\u0026lt;id\u0026gt;.mon.ilockfwd=0: motion not allowed # 37. ax\u0026lt;id\u0026gt;.mon.attarget axis at taget (ro) # 38. ax\u0026lt;id\u0026gt;.mon.lowlim low limit switch (ro) # 39. ax\u0026lt;id\u0026gt;.mon.highlim high limit switch (ro) # 40. ax\u0026lt;id\u0026gt;.mon.homesensor home sensor (ro) # 41. ax\u0026lt;id\u0026gt;.mon.lowsoftlim low soft limit (rw) # 42. ax\u0026lt;id\u0026gt;.mon.highsoftlim high soft limit (rw) # 43. ax\u0026lt;id\u0026gt;.mon.lowsoftlimenable low soft limit enable (rw) # 44. ax\u0026lt;id\u0026gt;.mon.highsoftlimenable high soft limit enable (rw) # 45. ax\u0026lt;id\u0026gt;.blockcom Enables/disables \u0026#34;set\u0026#34; commands (rw) # via command parser (ascii commands) # Statuses can still be read. # Exceptions (\u0026#34;set\u0026#34;-commands) that # will work: # - \u0026#34;StopMotion(axid)\u0026#34; # - \u0026#34;Cfg.SetAxisBlockCom(axid,block)\u0026#34; # 46. ax\u0026lt;id\u0026gt;.ctrl.kp Set PID-controller kp (rw) # 47. ax\u0026lt;id\u0026gt;.ctrl.ki Set PID-controller ki (rw) # 48. ax\u0026lt;id\u0026gt;.ctrl.kd Set PID-controller kd (rw) # 49. ax\u0026lt;id\u0026gt;.ctrl.kff Set PID-controller kff (rw) PLC # 1. plc\u0026lt;id\u0026gt;.enable plc enable (rw) # (end exe with \u0026#34;plc\u0026lt;id\u0026gt;.enable:=0#\u0026#34; # Could be usefull for startup # sequences) # 2. plc\u0026lt;id\u0026gt;.error plc error (rw) # Will be forwarded to user as # controller error. # 3. plc\u0026lt;id\u0026gt;.scantime plc sample time in seconds (ro) # 4. plc\u0026lt;id\u0026gt;.firstscan true during first plc scan only (ro) # usefull for initiations of variables # 5. ax\u0026lt;id\u0026gt;.plc.enable Same as plc\u0026lt;id\u0026gt;.enable but for # axis \u0026lt;id\u0026gt; sync plc. # 6. ax\u0026lt;id\u0026gt;.plc.error Same as plc\u0026lt;id\u0026gt;.error but for # axis \u0026lt;id\u0026gt; sync plc. # 7. ax\u0026lt;id\u0026gt;.plc.scantime Same as plc\u0026lt;id\u0026gt;.scantime but for # axis\u0026lt;id\u0026gt; sync plc. # 8. ax\u0026lt;id\u0026gt;.plc.firstscan Same as plc\u0026lt;id\u0026gt;.firstscan but for # axis \u0026lt;id\u0026gt; sync plc. data storage # 1. ds\u0026lt;id\u0026gt;.size Set/get size of data storage (rw) # Set will clear the data storage # 2. ds\u0026lt;id\u0026gt;.append Add new data at end (rw) # Current position index will be # increased # 3. ds\u0026lt;id\u0026gt;.data Set/get data ar current position (rw) # 4. ds\u0026lt;id\u0026gt;.index Set/get current position index (rw) # 5. ds\u0026lt;id\u0026gt;.error Data storage class error (ro) # 6. ds\u0026lt;id\u0026gt;.clear Data buffer clear (set to zero) (ro) # 7. ds\u0026lt;id\u0026gt;.full True if data storage is full (ro) functions EtherCAT # # 1. retvalue = ec_set_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Sets bit at bitindex position of value. Returns the new value. # # 2. retvalue = ec_wrt_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;wrtValue\u0026gt;, : Value of bit to write # \u0026lt;bitindex\u0026gt; : Bit index # ); # Write wrtValue to a bit at bitindex position of value. Returns the new value. # # 3. retvalue = ec_wrt_bits( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;wrtValue\u0026gt;, : Value of bit to write # \u0026lt;startBit\u0026gt; : Start bit index (lsb is bit 0) # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. # # 4. retvalue = ec_clr_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Clears bit at bitindex position of value. Returns the new value. # # 5. retvalue = ec_flp_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Flips bit at bitindex position of value. Returns the new value. # # 6. retvalue = ec_chk_bit( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;bitindex\u0026gt; : Bit index # ); # Checks bit at bitindex position of value. Returns the value of bit. # # 7. retvalue = ec_chk_bits( # \u0026lt;value\u0026gt;, : Value to change # \u0026lt;startBit\u0026gt; : Start bit index (lsb is bit 0) # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Checks range of bits (startBit..stopBit) of value. Returns the value of bits. # # 8. retvalue = ec_print_hex( # \u0026lt;value\u0026gt;, : Value to print # \u0026lt;startBit\u0026gt; : Start bit index # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Prints \u0026lt;startBit\u0026gt; to \u0026lt;stopBit\u0026gt; of \u0026lt;value\u0026gt; in hex format # Returns error code or 0 if success. # # 9. retvalue = ec_print_bin( # \u0026lt;value\u0026gt;, : Value to print # \u0026lt;startBit\u0026gt; : Start bit index # \u0026lt;stopBit\u0026gt; : Stop bit index # ); # Prints \u0026lt;startBit\u0026gt; to \u0026lt;stopBit\u0026gt; of \u0026lt;value\u0026gt; in bin format # Returns error code or 0 if success. # # 10. retvalue = ec_mm_cp( # \u0026lt;srcId\u0026gt;, : Source memmap index # \u0026lt;sdestId\u0026gt; : Dest memmap index # ); # Copies data from source memmap to dest memmap. The memmap ids are defined by the # order they are created (starting at 0). The smallest memmap size will define the # amout of data copied. Returns 0 for success or an error code. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # # 11. retvalue = ec_get_mm_type( # \u0026lt;srcId\u0026gt;, : Source memmap index # ); # Returns data type of memmap: # 0 = Not defined (Use \u0026#34;Cfg.EcAddMemMapDT()\u0026#34; instead of \u0026#34;Cfg.EcAddMemMap()\u0026#34;) # 1 = (Not valid for memmap) # 2 = (Not valid for memmap) # 3 = (Not valid for memmap) # 4 = (Not valid for memmap) # 5 = U8 # 6 = S8 # 7 = U16 # 8 = S16 # 9 = U32 # 10 = S32 # 11 = U64 # 12 = S64 # 13 = F32 # 14 = F64 # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # # 12. retvalue = ec_get_mm_data( # \u0026lt;srcId\u0026gt;, : Source memmap index # \u0026lt;index\u0026gt; : Index of data element # ); # Reads data element at index from memmap with srcId and returns value. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 13. retvalue = ec_set_mm_data( # \u0026lt;srcId\u0026gt;, : Source memmap index # \u0026lt;index\u0026gt; : Index of data element # \u0026lt;data\u0026gt; : Data to write # ); # Writes data element at index from memmap with srcId. Returns 0 for success or an error code. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 14. retvalue = ec_get_mm_size( # \u0026lt;srcId\u0026gt;, : Source memmap index # ); # Returns number of elements (of type \u0026#34;ec_get_mm_type()\u0026#34;)in memmap with srcId. # If return value is less than zero it should be considered to be an error code. # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 14. retvalue = ec_mm_ds_append( # \u0026lt;mmId\u0026gt;, : Source memmap index # \u0026lt;dsId\u0026gt;); : Destination data storage index # Returns Error code or zero if success # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 15. retvalue = ec_mm_append_to_ds_scale_offset( # \u0026lt;mmId\u0026gt;, : Source memmap index # \u0026lt;dsId\u0026gt; : Destination data storage index # \u0026lt;scale\u0026gt; : Scale # \u0026lt;offset\u0026gt;); : Offset # # Returns Error code or zero if success # # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 16. retvalue = ec_mm_push_asyn( # \u0026lt;mmId\u0026gt;) : Source memmap index. # push memap data to epics (can be used if T_SMP_MS=-1 for the param) # Note: The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): # ecmcConfig \u0026#34;EcGetMemMapId(ec0.s11.mm.analogInputArray01)\u0026#34; # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # # 17. retvalue = ec_get_time(); # Returns current time in nano seconds (from 1 Jan 2000, same as EtherCAT DC:s). # If return value is less than zero it should be considered to be an error code. # # 18. retvalue = ec_get_time_l32(); # Returns lower 32 bits of current time in nano seconds (from 1 Jan 2000, same as EtherCAT DC:s). # If return value is less than zero it should be considered to be an error code. # # 19. retvalue = ec_get_time_u32(); # Returns upper 32 bits of current time in nano seconds (from 1 Jan 2000, same as EtherCAT DC:s). # If return value is less than zero it should be considered to be an error code. # # 20. retvalue=ec_get_err(): # Returns error code from last lib call. # # 21. retvalue=ec_err_rst(): # Resets error code for ec_lib. Master to Master communication (within same host) Support for communication between different ecmc ioc:s running on the same host. A shared memory buffer of 120 doubles can be accessed for read and write operations by alll ecmc ioc running on the same master.\n# 1. retvalue = m2m_write( # \u0026lt;index\u0026gt;, : Mem buffer index (index must be 0..119) # \u0026lt;value\u0026gt;): : value to write # returns 0 if success or error code. # Write a value to an index of a common memory buffer accessible by all masters running on same host # # 2. retvalue = m2m_read(\u0026lt;index\u0026gt;); : Mem buffer index (index must be 0..119) # # returns the value stored at index in the shared mem buffer. # # 3. retvalue = m2m_stat(); # # returns 1 if connection to shared memory is OK, else 0 or a negative value with an errro code. # # 4. m2m_err_rst(); # # reset any m2m error codes. # # 5. retvalue = m2m_err_rst(); # # returns current m2m error code. # # 6. retvalue = m2m_ioc_ec_ok(\u0026lt;master_index\u0026gt;); # # returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). # # 7. retvalue = m2m_ioc_run(\u0026lt;master_index\u0026gt;); # # checks of a certian master is running (negative master id is ioc:s without ec master). Motion # 1. retvalue = mc_move_abs( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;pos\u0026gt;, : Target position # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ): # Absolute motion of axis. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 2. retvalue = mc_move_rel( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;pos\u0026gt;, : Target position # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ); # Relative motion of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 3. retvalue = mc_move_ext_pos( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ); # Move to current external plc position. Functions intended use is to # move to the start position for syncronized axes. This command is exactly # the same as issueing \u0026#34;mc_move_pos()\u0026#34; with the target postion ax\u0026lt;id\u0026gt;.traj.extsetpos. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # # 4. retvalue = mc_move_vel( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;vel\u0026gt;, : Target velocity # \u0026lt;acc\u0026gt;, : Acceleration # \u0026lt;dec\u0026gt; : Deceleration # ); # Constant velocity motion of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 5. retvalue = mc_home( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;seqId\u0026gt;, : Motion sequence # \u0026lt;velTwoardsCam\u0026gt;, : Target Velocity twords cam # \u0026lt;velOffCam\u0026gt; : Target velocity off cam # ); # Perform a homing sequence of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 6. retvalue = mc_home_pos( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # \u0026lt;seqId\u0026gt;, : Motion sequence # \u0026lt;velTwoardsCam\u0026gt;, : Target Velocity twords cam # \u0026lt;velOffCam\u0026gt; : Target velocity off cam # \u0026lt;homePos\u0026gt; : Homing position # ); # Perform a homing sequence of axis \u0026lt;axIndex\u0026gt; # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 7. retvalue = mc_halt( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;execute\u0026gt;, : Trigger # ); # Stop motion of axis \u0026lt;axIndex\u0026gt;. # Command is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 8. retvalue = mc_power( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;enable\u0026gt;, : Enable power # ); # Enable power of axis \u0026lt;axIndex\u0026gt;. # Motion is triggerd with a positive edge on \u0026lt;execute\u0026gt; input. # returns 0 if success or error code. # # 9. retvalue = mc_get_busy( # \u0026lt;axIndex\u0026gt;, : Axis index# # ); # Check if axis is busy. # returns busy state of axis (1 if busy and 0 if not busy). # # 10. retvalue = mc_get_homed( # \u0026lt;axIndex\u0026gt;, : Axis index# # ); # Check if axis is homed. # returns state of homed flag of axis (1 if homed and 0 if not homed). # # 11. retvalue = mc_get_err(); # Returns error code for last lib call. # # 12. retvalue = mc_reset(\u0026lt;axIndex\u0026gt;); # Resets error of motion axis. # # 13. retvalue = mc_get_axis_err(\u0026lt;axIndex\u0026gt;); # Returns motion axis error code. # # 14. retvalue = mc_set_enable_motion_funcs( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;enablePos\u0026gt;, : Enable positioning # \u0026lt;enableVelo\u0026gt;, : Enable const velo # \u0026lt;enableHome\u0026gt;, : Enable const homing # ); # # Enables/disables motion functionalities. Returns error code. # # 15. retvalue = mc_get_act_pos( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;encIndex\u0026gt; : Encoder index # ); # # Returns encoder position for any of the configured encoders of an axis. # # 16. retvalue = mc_set_prim_enc( # \u0026lt;axIndex\u0026gt;, : Axis index # \u0026lt;encIndex\u0026gt; : Encoder index # ); # # Sets primary and homing encoder index of the axis (the encoder used for control). # The primary encoder can only be changed when the axis is not busy. # # Returns motion axis error code. # # 17. retvalue = mc_get_prim_enc( # \u0026lt;axIndex\u0026gt;, : Axis index # ); # # Returns primary encoder index of the axis (the encoder used for control). # # 18. mc_set_axis_error( # \u0026lt;axis_id\u0026gt;, : Axis index # \u0026lt;error_code\u0026gt; : Error code to set # ); # # Sets an arbitrary error code to an axis object. # # 19. mc_set_slaved_axis_in_error( # \u0026lt;axis_id\u0026gt;, : Axis index # ); # # Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). Motion Group # 1. mc_grp_get_enable( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group have the enable bit set, else false. # Note: The axes do not need to be enabled if this function returns true, see mc_grp_get_enabled(). # # 2. mc_grp_get_any_enable( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if atleast one axis in the group has the enable bit set, else false. # # 3. mc_grp_get_enabled( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group are in enabled state, else false. # # 4. mc_grp_get_any_enabled( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if atleast one axis in the group is in enabled state, else false. # # 5. mc_grp_get_busy( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group are in busy state, else false. # # 6. mc_grp_get_any_busy( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if atleast one axis in the group is in busy state, else false. # # 7. mc_grp_get_any_error_id( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns error id if atleast one axis in the group is in error state, else zero. # # 8. mc_grp_set_enable( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;enable\u0026gt; : Enable state # ); # # Sets enable for all axes in group. # Returns 0 or error id. # # 9. mc_grp_set_traj_src( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;source\u0026gt; : Trajectory source (0 = internal, 1 = external/PLC ) # ); # # Sets trajectory source for all axes in group. # Returns 0 or error id. # # 10. mc_grp_set_enc_src( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;source\u0026gt; : Encoder source (0 = internal, 1 = external/PLC ) # ); # # Sets encoder source for all axes in group. # Returns 0 or error id. # # 11. mc_grp_reset_error( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Resets error of all axes in group. # # 12. mc_grp_set_error( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;error_id\u0026gt; : Error Id # ); # # Set error id of all axes in group. # # 13. mc_grp_set_slaved_axis_in_error( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) # # 14. mc_grp_halt( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Halt all axes in group (only works if traj source = internal/0) # # 15. mc_grp_axis_in_grp( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;axis_id\u0026gt;, : Axis index # ); # # Returns true if axis is in group, else false. # # 16. mc_grp_size( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns the number of axes in group. # # # 17. mc_grp_get_traj_src_ext( # \u0026lt;grp_id\u0026gt;, : Group index # ); # # Returns true if all axes in the group have trajectory source set to external. # # 18. mc_grp_get_any_traj_src_ext( # \u0026lt;grp_id\u0026gt;, : Group index # ); # Returns true if atleast one axis in the group have trajectory source set to external. # # 19. mc_grp_set_allow_src_change_when_enabled( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;allow\u0026gt;, : Allow change of source # ); # Allow source change for trajectory and encoder when axis is enabled. # # 20. mc_grp_sync_act_set( # \u0026lt;grp_id\u0026gt;, : Group index # \u0026lt;sync\u0026gt;, : Sync yes or no # ); # 1. Sync ecmc current setpoint with actual value (if not enabled and internal mode) # 2. Sync MR at next poll (maximum once). # Data Storage # 1. retvalue = ds_append_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;data\u0026gt;, : Data # ); # Append data to data storage. # returns 0 if success or error code. # # 2. retvalue = ds_clear_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Clear data to data storage. # returns 0 if success or error code. # # 3. retvalue = ds_get_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;bufferIndex\u0026gt;, : Buffer index # ); # Returns data from buffer. # # 4. retvalue = ds_set_data( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;bufferIndex\u0026gt;, : Buffer index # ); # Sets data in data storage buffer. # returns 0 if success or error code. # # 5. retvalue = ds_get_buff_id( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns current buffer index. # # 6. retvalue = ds_set_buff_id( # \u0026lt;dsIndex\u0026gt;, : Data storage index # \u0026lt;bufferIndex\u0026gt;, : Buffer index # ); # Sets current buffer index in data storage buffer. # returns 0 if success or error code. # # 7. retvalue = ds_is_full( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns true if buffer is full. # # 8. retvalue = ds_get_size( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns buffer size of data storage. # # 9. retvalue = ds_get_err() # Returns error code for last lib call. # # 10. retvalue = ds_push_asyn( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Triggers push of all asyn parameters in ds to EPICS (including data). # # 11. retvalue = ds_get_avg( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns average of the values in the data storage. # # 12. retvalue = ds_get_min( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns minimum of the values in the data storage. # # 13. retvalue = ds_get_max( # \u0026lt;dsIndex\u0026gt;, : Data storage index # ); # Returns maximum of the values in the data storage. # # 14. retvalue=ds_append_to_ds( # \u0026lt;dsFromId\u0026gt;, : Source data storage index # \u0026lt;dsFromDataId\u0026gt;, : Source data element index # \u0026lt;elements\u0026gt;, : Number of elements to copy # \u0026lt;dsToId\u0026gt; : Destination data storage index # ); # Appends data at the current position of the destination data storage (dsToId). The data source is defined by (dsFromId) and the selected tion (dsFromDataId) and element count (elements). # # 15. retvalue=ds_err_rst(): # Resets error code for ds_lib. # "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisyaml/","title":"yaml configuration","tags":[],"description":"","content":"Since ecmccfg v7, the axis configuration is based on yaml files. Backwards compatibility for classic EPICS environment variable based configuration is assured for legacy systems.\n yaml is - like python - indentation sensitive!\n Indent with 2 spaces.\n introduction python 3.x is required\n The config is processed by a python script with a jinja2 backend. The processor will complain if mandatory keys are missing. Likewise, missing optional keys are populated with default values.\nThe script invokes a python script which subsequently uses a jinja2 processor to render the respective templates. The script will create a python virtual environment and install the required libraries automatically.\n The configuration is separated into the following mandatory sections:\n axis epics drive (only mandatory for physical axis) encoder controller trajectory input in addition the following optional sections are available.\n output homing softlimits monitoring Each sections provides an example, the optional keys are commented.\n axis mandatory\n id: unique numeric identifier of the axis optional\n type: type of the axis mode: operating mode of the drive parameters: additional parameters axis: id: 1 # type: joint # axis types: # 1 (equiv: physical, joint, j, motor, real) # 2 (equiv: virtual, end_effector, endeffector, ee, e) # mode: CSV # supported modes: CSV and CSP # parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0; epics Epics configuration.\nThe Epics motorRecord can now be disabled.\n mandatory\n name: name of the PV optional\n precision: PREC field; default 3 unit: EGU field; optional default mm motorRecord enable: set to false to disable motorRecord description: DESC field; default '' fieldInit: string with additional field initial values; default '' epics: name: M1 # precision: 3 # unit: deg # motorRecord: # enable: false # fieldInit: \u0026#39;RRES=1.0,RTRY=2,RMOD=1,UEIP=0,RDBD=0.1,URIP=1,RDBL=$(IOC):$(ECMC_MOTOR_NAME)-PosActSim\u0026#39; # fieldInit: \u0026#39;NTM=1\u0026#39; # description: AM8111 CSV drive mandatory for physical axis\n numerator: scaling numerator denominator: scaling denominator type: type of drive: 0=stepper, 1=DS402, aka servo or complex stepper control: control word entry status: status word entry setpoint: setpoint entry, position or velocity, depending on mode optional\n reduceTorque: control word bit to set for reduced torque mode brake openDelay: number of cycles to wait after enable to disengage the brake closeAhead: number of cycles to wait after the brake was engaged reset: control word bit to set in order to reset the drive warning: status word bit for drive warning error: list of status bits for drive errors drive: numerator: 2880000 # Fastest speed in engineering units denominator: 2147483648 # I/O range for ECMC_EC_ALIAS_DRV_VELO_SET type: 1 # Stepper: 0, DS402: 1 (DS402 = servos and advanced stepper drives) control: ec0.s$(DRV_SLAVE).driveControl01 status: ec0.s$(DRV_SLAVE).driveStatus01 setpoint: ec0.s$(DRV_SLAVE).velocitySetpoint01 # reduceTorque: 2 # Reduce torque bit in drive control word # brake: # openDelay: 0 # Brake timing parameter in EtherCAT cycles # closeAhead: 0 # Brake timing parameter in EtherCAT cycles # reset: 1 # Reset bit in control word # warning: 2 # Warning bit of status word # error: # max 3 # - 3 # Error 0 bit of status word # - 7 # Error 1 bit of status word # - 14 # Error 2 bit of status word encoder mandatory\n numerator: scaling numerator, equivalent distance to the maximum drive frequency (default: 2000 Hz i.e. 2000 full steps), also effectively absolute maximum velocity denominator: scaling denominator type: type of encoder: 0=incremental, 1=absolute bits: raw data bit count absBits: Absolute bit count (for absolute encoders) always least significant part of \u0026lsquo;bits\u0026rsquo; absOffset: Encoder offset in engineering units (for absolute encoders) position: position entry optional\n source: position source, 0=from EC entry ; 1=from PLC control: control word entry; mandatory when reset is set. status: status word entry; mandatory when error or warning are set reset: control word bit to set in order to reset the encoder warning: status word bit for encoder warning error: list of status bits for encoder errors velocityFilterSize: size of the velocity filter (cycles) positionFilterSize: size of the position filter (cycles) positionFilterEnable: position filter enable latch: position: '' control: '' status: '' encoder: numerator: 360 denominator: 1048576 type: 1 # Type: 0=Incremental, 1=Absolute bits: 32 # Total bit count of encoder raw data absBits: 25 # Absolute bit count (for absolute encoders) always least significant part of \u0026#39;bits\u0026#39; absOffset: 0 # Encoder offset in eng units (for absolute encoders) position: ec0.s$(DRV_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder) # source: 0 # control: ec0.s$(ENC_SLAVE).encoderControl01 # mandatory only if \u0026#39;reset\u0026#39; is used # status: ec0.s$(DRV_SLAVE).encoderStatus01 # mandatory only if \u0026#39;warning\u0026#39; or \u0026#39;error\u0026#39; are used # reset: 1 # Reset (optional) # warning: 2 # Warning (optional) # error: # max 3 (optional) # - 5 # Error 0 # - 9 # Error 1 # - 11 # Error 2 # velocityFilterSize: 100 # positionFilterSize: 1 # positionFilterEnable: false # latch: # position: \u0026#39;\u0026#39; # control: \u0026#39;\u0026#39; # status: \u0026#39;\u0026#39; optional\n velocityFilterSize: Add filtering if the encoder is too coarse to reliably determine velocity each PLC cycle controller PID controller parameters\nmandatory\n Kp: proportional optional\n Ki: integral; default 0 Kd: differential; default 0 Kff: feed forward; default 1 controller: Kp: 90 # Ki: 0.1 # Kd: 0 # Kff: 1 trajectory settings for the trajectory planning.\nAll accelerations are now defined in EGU s^{-2}\n mandatory\n axis velocity: velocity setpoint the axis will be initialized to (in EGU/sec) acceleration: acceleration setpoint for initialization (in EGU/sec2) optional\n source: source of position setpoint, 0=trajectory generator of axis ; 1=from PLC type: type of velocity profile: 0=trapezoidal ; 1=scurve axis deceleration: deccelerartion setpoint for initialization (in EGU/sec2) emergencyDeceleration: deceleration setpoint for emergencies. Defaults to acceleration setpoint if not specified. jerk: jerk for scurved profiles (in EGU/sec3) jog velocity: velocity setpoint the axis will be initialized to for jogging acceleration: acceleration setpoint for initialization, for jogging modulo range: modulo range type: modulo type trajectory: # source: 0 # type: 0 axis: velocity: 180 acceleration: 180 # deceleration: 360 # jerk: 1.0 # emergencyDeceleration: 0.05 # jog: # velocity: 90 # acceleration: 0.1 # modulo: # range: 0 # type: 0 input Links to the binary input sensors for limit switches, home sensor and external interlock. All four inputs must be provided. If an input is not used, set it to the ONE.0 entry of a slave. See the example for details.\nmandatory\n limit forward: limit switch sensor input in the forward direction. backward: limit switch sensor input in the backward direction. home: binary input for the home sensor extinterlock: binary input for external interlock. input: limit: forward: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for low limit switch input backward: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for high limit switch input home: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for home switch input interlock: ec0.s$(DRV_SLAVE).ONE.0 # Ethercat entry for interlock switch input output Two outputs can be utilizes with ECMC.\nThe brake output was moved to the drive key, as it is directly coupled to the drive state.\n optional\n health: sum parameter for axis health # output: # health: \u0026#39;\u0026#39; # Ethercat entry for health output homing This section is should be obsolete at PSI, as for all new installation using EtherCAT, absoulte encoders are mandatory. In case a legacy system or temporary installation requires a incremental encoder, or even open loop operation, several procedures for referencing are available.\noptional\n type: referencing procedure position: position of the reference mark in engineering units postMoveEnable: post homing move postMovePosition: post homing move target switchPolarity: home switch polarity, for NO switches latchCount: latch counter velocity: velocities to: to the cam from: off the cam acceleration: acceleration time in s deceleration: deceleration time in s # homing: # type: 3 # position: 0 # postMoveEnable: false # postMovePosition: 0 # switchPolarity: 0 ## 0: NC, 1: NO # latchCount: 0 # velocity: # to: 2.72 # # from: 3.14 # # acceleration: 2 # # deceleration: 5 softlimits Soft limits to propagate to the motorRecord.\noptional\n enable: global enable of soft limits. forwardEnable: forward on/off. forward: soft limit in the forward direction. backwardEnable: backward on/off. backward: soft limit in the backward direction. # softlimits: # enable: true # forwardEnable: true # optional switch for forward direction # forward: 300.0 # backwardEnable: true # optional switch for backward direction # backward: 25.0 monitoring Three entities can be monitored, (1) lag, aka following error, (2) target, aka in position, (3) velocity.\nIt is highly advisable to always use the lag and target monitoring fo closed-loop axis. Failure to do so, will most likely results in unexpected behaviour.\n The monitoring key, must be included in the config, despite all features being optional. It\u0026rsquo;s a means to let the integrator think twice to skip it all together.\n optional\n lag enable: enable lag monitoring tolerance: tolerance in engineering units time: time for the condition to be true in ms target enable: enable target monitoring tolerance: tolerance in engineering units time: time for the condition to be true in ms velocity enable: enable velocity monitoring max: upper limit for velocity time trajectory: time for the condition to be in violation in ms drive: time for the condition to be in violation in ms monitoring: # lag: # enable: false # tolerance: 5 # time: 100 # target: # enable: true # tolerance: 0.125 # time: 100 # velocity: # enable: false # max: 100 # time: # trajectory: 100 # drive: 200 All yaml settings axis: id: 1 # Axis id type: joint # this is for future selection of axis type mode: CSV # supported mode, CSV and CSP, defaults CSV parameters: 'axisPar' # additional parameters # Additional params to motor record driver # \u0026quot;powerAutoOnOff=\u0026lt;value\u0026gt;;\u0026quot; //2: What you want, 1:do not use, 0 to disable # \u0026quot;powerOffDelay=\u0026lt;value\u0026gt;:\u0026quot; # \u0026quot;powerOnDelay=\u0026lt;value\u0026gt;;\u0026quot; healthOutput: ec0... # Ethercat entry for health output feedSwitchesOutput: ec0... # Ethercat entry for fed switches feedSwitchesValue: 1 # Value to write to axis.feedSwitchesOutput. Defaults to 1 group: testGroup # Add axis to group (group will be created if not exists), # group id will be stored in GRP\u0026lt;axis.group\u0026gt;_ID for later use. autoMode: # Switch drive modes automaticaly for normal motion and homing (smaract for instance) modeSet: ec0.. # Ethercat entry drive mode write (set CSV,CSP,homing) modeAct: ec0.. # Ethercat entry drive mode reading (set CSV,CSP,homing) modeCmdMotion: 9 # Drive mode value for normal motion (written to axis.drvMode.modeSet when normal motion) modeCmdHome: 10 # Drive mode value for when homing (written to axis.drvMode.modeSet when homing) features: blockCom: false # Block communication to axis allowSrcChangeWhenEnabled: false # Allow traj/enc sorce change when axis is enabled allowedFunctions: homing: true # Allow homing constantVelocity: true # Allow constant velocity positioning: true # Allow positioning epics: name: M1 # Axis anme precision: 3 # Decimal count description: very important motor axis # Axis description unit: mm # Unit motorRecord: enable: true description: This is MR fieldInit: 'RRES=1.0,RTRY=2,RMOD=1,UEIP=0,RDBD=0.1,URIP=1,RDBL=$(IOC):$(ECMC_MOTOR_NAME)-PosActSim' # Extra config for Motor record drive: numerator: 360 # Fastest speed in engineering units denominator: 4096 # I/O range for ECMC_EC_ALIAS_DRV_VELO_SET type: 0 # Stepper: 0. DS402: 1 (DS402 = servos and advanced stepper drives) control: ec0.s$(DRV_SLAVE).driveControl01 # Control word ethercat entry enable: 0 # Enable bit index in control word (not used if DS402) enabled: 1 # Enabled bit index in status word (not used if DS402) status: ec0.s$(DRV_SLAVE).driveStatus01 # Status word ethercat entry setpoint: ec0.s$(DRV_SLAVE).velocitySetpoint01 # Velocity setpoint if CSV. Position setpoint if CSP reduceTorque: 2 # Reduce torque bit in drive control word reduceTorqueEnable: True # Enable reduce torque functionality brake: enable: false output: ec0... # Ethercat link to brake output openDelay: 0 # Brake timing parameter in cycles (default 1kHz) closeAhead: 0 # Brake timing parameter in cycles (default 1kHz) reset: 1 # Reset (if no drive reset bit then leave empty) warning: 2 # Warning (if no drive warning bit then leave empty) error: # max 3 - 3 # Error 0 (if no drive error bit then leave empty) - 7 # Error 1 (if no drive error bit then leave empty) - 14 # Error 2 (if no drive error bit then leave empty) encoder: numerator: 360 # Scaling numerator example 360 deg/rev denominator: 4096 # Scaling denominator example 4096 ticks per 360 degree type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data absBits: 0 # Absolute bit count (for absolute encoders) always least significant part of 'bits' absOffset: 0 # Encoder offset in eng units (for absolute encoders) mask: '0xFFF00' # Mask applied to raw encoder value position: ec0.s$(ENC_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder) control: ec0.s$(ENC_SLAVE).encoderControl01 # mandatory only if 'reset' is used status: ec0.s$(DRV_SLAVE).encoderStatus01 # mandatory only if 'warning' or 'error' are used ready: 10 # Bit in encoder status word for encoder ready source: 0 # 0 = Encoder value from etehrcat hardware, 1 = Encoder value from PLC reset: 1 # Reset (optional) warning: 2 # Warning (optional) error: # max 3 (optional) - 5 # Error 0 - 9 # Error 1 - 11 # Error 2 filter: velocity: size: 100 # Filter size for velocity enable: true # enable velocity filter position: size: 100 # Filter size for encoder value enable: true # enable encoder value filter latch: position: '' # Link to latched value. Used for some homing seqs control: 0 # Bit in encoder control word to arm latch. Used for some homing seqs status: 0 # Bit in encoder status word for latch triggered status. Used for some homing seqs primary: 1 # Use this encoder as primary (for control) homing: type: 3 # Homing sequence type position: -30 # Position to reference encoder to velocity: to: 10 # Velocity to cam/sensor (used for some homing seqs) from: 5 # Velocity from cam/sensor (used for some homing seqs) acceleration: 20 # Acceleration during homing deceleration: 100 # Deceleration during homing refToEncIDAtStartup: 1 # At startup then set the start value of this encoder to actpos of this encoder id refAtHome: 1 # If homing is executed then set position of this encoder tolToPrim: 0 # If set then this is the max allowed tolerance between prim encoder and this encoder postMoveEnable: yes # Enable move after successfull homing postMovePosition: 10 # Position to move to after successfull homing trigg: ec0.. # Ethercat entry for triggering drive internal homing seq (seq id 26) ready: ec0.. # Ethercat entry for readinf drive internal homing seq ready (seq id 26) latchCount: 1 # latch number to ref on (1=ref on first latch) controller: Kp: 15 # Kp proportinal gain Ki: 0.02 # Ki integral gain Kd: 0 # Kd derivative gain Kff: 1 # Feed forward gain deadband: tol: 0.01 # Stop control if within this distance from target for the below time time: 100 limits: minOutput: -100 # Minimum controller output maxOutput: 100 # Maximum controller output minIntegral: -100 # Minimum integral output maxIntegral: 100 # Maximum integral output inner: Kp: 0.1 # Kp for when close to target Ki: 0.1 # Ki for when close to target Kd: 0.1 # Kd for when close to target tol: 0.1 # Distance from target for when inner PID params will be used, defaults to atTarget tol trajectory: type: 1 # Default 0 = trapetz, 1 = S-curve (ruckig) source: 0 # 0 = take trajectory setpoint from axis traj object, 1 = trajectory setpoint from plc axis: velocity: 10 # Default velo for axis acceleration: 0.1 # Default acc for axis deceleration: 0.1 # Default dec for axis emergencyDeceleration: 0.05 # Deceleration when axis in error state jerk: 10 # Default jerk for axis jog: velocity: 5 # Default velo fro JOG (motor record) modulo: range: 360 # Modulo range 0..360 type: 0 # Modulo type input: limit: forward: ec0.s$(ENC_SLAVE).ONE.0 # Ethercat entry for low limit switch input forwardPolarity: 0 # Polarity of forward limit switch backward: ec0.s1.BI_2.0 # Ethercat entry for high limit switch input backwardPolarity: 0 # Polarity of forward limit switch home: 'ec0.s$(MCS2_SLAVE_NUM).ONE.0' # Ethercat entry for home switch homePolarity: 0 # Polarity of home switch interlock: 'ec0.s$(ENC_SLAVE).ONE.0' # Ethercat entry for interlock switch input interlockPolarity: 0 # Polarity of interlock switch analog: interlock: 'ec0.s$(ENC_SLAVE).ONE' # Ethercat entry for analog interlock interlockPolarity: 1 # 0: High value is bad, 1 = Low value is bad rawLimit: 2000 # Analog raw limit enable: true # Enable analog interlock default true if analog.interlock is set softlimits: enable: false # Enable soft limits forward: 100 # Soft limit position fwd forwardEnable: false # Soft limit position fwd enable backward: -100 # Soft limit position bwd backwardEnable: false # Soft limit position bwd enable monitoring: lag: enable: false # Enable position lag monitoring (following error) tolerance: 0.5 # Allowed tolerance time: 10 # Allowed time outside tolerance target: enable: true # Enable at target monitoring (needs to be enabled if using motor record) tolerance: 0.5 # Allowed tolerance time: 10 # Filter time inside tolerance to be at target velocity: enable: false # Enable velocity monitoring max: 100 # Allowed max velocity time: trajectory: 100 # Time allowed outside max velo before system init halt drive: 200 # Time allowed outside max velo before system disables drive velocityDifference: enable: true # Enable velocity diff monitoring (velo set vs velo act) max: 100 # Allowed max difference time: trajectory: 100 # Time allowed outside max diff velo before system init halt drive: 200 # Time allowed outside max diff velo before system disables drive plc: enable: true # Enable axis plc externalCommands: true # Allow axis to inputs from PLC file: myplcfile.plc # File with plc code code: # Sync code (appended after code in plc.file) - if(ax2.traj.source){ax2.drv.enable:=(ax10.drv.enable or ax11.drv.enable)}; # Enable axis if one of master axes is enabled - ax2.traj.setpos:=ax10.traj.setpos-ax11.traj.setpos/2; # calculate set pos for physical axis velocity_filter: # Filter used to smother velocity feedforward encoder: # Filter plc enc velo enable: false # Filter enable size: 100 # Filter size trajectory: # Filter plc traj velo enable: false # Filter enable size: 100 # Filter size # filter: # Use \u0026quot;velocity_filter\u0026quot; instead since this naming is missleading and should be phased out # velocity: # Filter plc enc velo # enable: false # size: 100 # trajectory: # Filter plc traj velo # enable: false # size: 100 "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/","title":"data storage buffer","tags":[],"description":"","content":"data storage examples This dir contains two examples: here.\n Continiously add value to data storage. Push to epics by hw trigger. Continiously add value to data storage. Push to epics by epics pv trigger. Data buffered data can be accessed by the \u0026ldquo;IOC_TEST:ds0-Data-Act\u0026rdquo; waveform pv (NELM 10000) Custom scale and offset can be applied to the stored values by MACROS (to the plc) in the startup file.\n1 push to epics by hw trigger In this example the data stored in dataStorage 0 is pushed to epics at a falling edge of the axis 1 high limit.\nExample 1 is started with the following stratup file: \u0026ldquo;add_data_to_buffer_trigg_push_hw.script\u0026rdquo;\niocsh.bash add_data_to_buffer_trigg_push_hw.script Trigger writes to epics by toggle of axis 1 high limit switch.\nPLC-code:\n################################################################################## # PLC to add encoder data to dataStorage and push data on falling edge of higlimit # # MACROS: # DS_ID = ID of ds to use as a filter id # PLC_ID = ID of this PLC # ENC_S_ID = Slave id of encoder terminal # DBG = Set to empty string to get printouts, set to \u0026quot;#\u0026quot; to avoid printouts # SCALE = Encoder scale value, defaults to 1 # OFFSET = Encoder offset value, defaults to 0 # # Append data to storage ds_append_data(${DS_ID},ec0.s${ENC_S_ID}.positionActual01*${SCALE=1}+${OFFSET=0}); # Trigger push of data on falling edge of limit switch if(static.highlimOld and not(ax1.mon.highlim)) { ${DBG=#}println('Pushing data to EPICS....'); ds_push_asyn(${DS_ID}); }; static.highlimOld:=ax1.mon.highlim; 2 push to epics by epics pv trigger In this example the data stored in dataStorage 0 is pushed to epics at a rising edge of the \u0026ldquo;IOC_TEST:Set-PushDataTrigger-RB\u0026rdquo; pv.\nExample 2 is started with the following stratup file: \u0026ldquo;add_data_to_buffer_trigg_push_hw.script\u0026rdquo;\niocsh.bash add_data_to_buffer_trigg_push_epics.script Trigger writes to epics by:\nraspberrypi-16970 \u0026gt; dbpf IOC_TEST:Set-PushDataTrigger-RB 1 DBF_STRING: \u0026quot;One\u0026quot; raspberrypi-16970 \u0026gt; Pushing data to EPICS.... dbpf IOC_TEST:Set-PushDataTrigger-RB 0 DBF_STRING: \u0026quot;Zero\u0026quot; raspberrypi-16970 \u0026gt; dbpf IOC_TEST:Set-PushDataTrigger-RB 1 DBF_STRING: \u0026quot;One\u0026quot; raspberrypi-16970 \u0026gt; Pushing data to EPICS.... PLC-code:\n################################################################################## # PLC to add encoder data to dataStorage and push data on trigger from epics PV # # MACROS: # DS_ID = ID of ds to use as a filter id # PLC_ID = ID of this PLC # ENC_S_ID = Slave id of analog input terminal # DBG = Set to empty string to get printouts, set to \u0026quot;#\u0026quot; to avoid printouts # SCALE = Encoder scale value, defaults to 1 # OFFSET = Encoder offset value, defaults to 0 # # Append data to storage ds_append_data(${DS_ID},ec0.s${ENC_S_ID}.positionActual01*${SCALE=1}+${OFFSET=0}); # Trigger push of data on rising edge of trigger if(static.trigg and not(static.triggOld)) { ${DBG=#}println('Pushing data to EPICS....'); ds_push_asyn(${DS_ID}); }; static.triggOld:=static.trigg; "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/general/","title":"general","tags":[],"description":"","content":" culprit From experience, very few issues are related to the EtherCAT hardware itself. Mostly the cabling or the actual motor/encoder hardware is to blame.\nEven more likely is human error, such as:\n wrong scaling of the axis writing to the wrong hardware (forgot to select the right slave in the axis config) \u0026hellip; check the status Before anything is restarted or power cycled, check the status of the system.\nA simple way to get an overview of the entire ecmc system is to start the ecmcMain.ui panel. This panel contains, or links to, almost the entire ecmc IOC:\n thread status EtherCAT master status EtherCAT slaves status (overview of all configured slaves) motion axes (all axes in the system are reachable) PLC:s \u0026hellip; caqtdm -macro \u0026#34;IOC=\u0026lt;iocname\u0026gt;\u0026#34; ecmcMain.ui Remember, red is not necessarily a bad sign! It can also indicate that certain channels are not connected. Whether those channels should be connected is beyond the scope of this guide.\nNext step is to diagnose from a dedicated shell, or from within the iocsh.\nIf all slaves are in \u0026lsquo;OP\u0026rsquo; state, at least data is exchanged between the hardware and the master.\nrestarting the IOC Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!!\n Check the hardware BEFORE restarting the IOC!\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/","title":"tuning","tags":[],"description":"","content":" EL70x1 Tuning For EL70x1 stepper drives the following parameters can be tuned:\n 8011:07 Ka factor 8011:08 Kd factor 8011:01 Kp factor 8011:02 Ki factor 8011:07 Ka and 8011:08 Kd factor: 8011:07 Ka factor / 8011:08 Kd factor are “current boosts” during acceleration/deceleration. Default they are set to 100% which is way too high for most applications. Start by setting these parameters to 0.\n8011:01 Kp and 8011:02 Ki factor: This is the current loop settings and this is also what affect the performance. The higher you set these registers, the stiffer the control loop. For most applications it is important to keep a ration of 40:1. Default is 400 / 10, if you want a stiffer loop, then change to f ex 800 / 20 and onwards. Increase until the motor misbehaves and go back to a safe setting.\nBacklash Tuning systems with backlash can be difficult. Sometimes a small D-part helps to reduce spikes in the centralized ecmc position loop controller output.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/","title":"ecmc server","tags":[],"description":"","content":" Topics latency issues EtherCAT rate (EC_RATE) latency issues High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to:\n The generic device driver is used High load on system \u0026hellip; generic device driver is used Check which driver is in use by running (on the ecmc server):\nlsmod | grep ec_ If the ec_master is using the ec_generic driver then a switch to igb driver is recommended.\nThe file /ioc/hosts/\u0026lt;hostname\u0026gt;/cfg/ETHERCATDRVR is listing the available drivers.\nThe recommended contents of the ETHERCATDRVR file is:\nDEVICE_MODULES=\u0026quot;igb generic\u0026quot; In this case, the system will first try to use igb driver, if not possible it will fallback to the generic driver. After editing the file, the host needs to be rebooted in order for the changes to take effect.\nhigh load on system ** Reduce sample rate** Reducing the ethercat cycle time is often very effichient when it comes to reduce latency. Do not run the ecmc systems faster than needed. The default ecmc sample rate is 1Khz, which in many cases is not needed.\nThe sample rate is defined when require ecmccfg (example set to 500Hz, instead of 1kHz):\nrequire ecmccfg \u0026quot;EC_RATE=500\u0026quot; There are some restrictions on the sample rate. Normally, a rate in the range 100Hz-1Khz is a good choice. For other rates, please check the documentation of slaves in use. See heading \u0026ldquo;EtherCAT rate\u0026rdquo; below for more information.\n ** Affinity** Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. At PSI, core 0 is always isolated, do not move any threads to core 0.\n In order to pin the ecmc thread to a single core, add the following line to the startup script (after setAppMode.cmd):\n#- go active (create ecmc_rt) ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd #- Set affinity of ecmc_rt (core 5) epicsThreadSetAffinity ecmc_rt 5 If more than one ecmc ioc is running on the server, then make sure the ecmc_rt threads run on differnt cores.\nAlso other threads might take a lot of resources, for instace the epics thread \u0026ldquo;cbLow\u0026rdquo;:\nafterInit \u0026quot;epicsThreadSetAffinity cbLow 6\u0026quot; cbLow is created at iocInit, therefore the \u0026ldquo;epicsThreadSetAffinity\u0026rdquo; must be executed with the \u0026ldquo;afterInit\u0026rdquo; command.\n EtherCAT rate (EC_RATE) The default EtherCAT frame rate in ecmc is set to 1kHz. For most applications this is however not needed and can therefore be reduced. A reduced EtherCAT rate reduces the load on the controller. In general, a good value for the frame rate is in the range 100Hz to 1kHz. For motion systems, a frame rate of 100Hz..500Hz is normally enough. Rates ouside the 100Hz..1kHz range is normally not a good idea, and some slaves might not support it. However, in special cases both lower and higher rates might be possible and required.\nExample: Set rate to 500Hz\nrequire ecmccfg \u0026quot;EC_RATE=500\u0026quot; ... For more information see the chapter descriping startup.cmd.\nAs a comparison, TwinCAT default EtherCAT rates are:\n 100Hz for PLC 500Hz for motion Lower rates Issues that could occour in rates below 100Hz:\n triggering of slave watchdogs issues with dc clock syncs (DC capabale slaves normally performes best with at a rate of atleast 500Hz) some slaves might not support it Higher rates Issues that could occour in rates over 1000Kz:\n missed frames issues with dc clock syncs some slaves might not support it. NOTE: Some slave might support a high rate but could have built in signal filters of several ms which then makes sampling at higher freqs unneccesarry/not needed.\nIn order to successfully run an ecmc ethercat system at higher rates some tuning might be needed:\n minimize slave count (and ensure that the slaves support it) minimize amount of processing (PLC, motion) use a performant host/controller use native ethercat driver (igb, not generic) only transfer the needed PVs to epics. affinity: Use a dedicated core for the ecmc_rt thread and move other high prio threads to other cores. see \u0026ldquo;high load on system \u0026quot; above. consider use of more than one domain "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/","title":"function libs","tags":[],"description":"","content":"function libs Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command takes these parameters:\n FILE PLC: definition file, i.e. ./plc/homeSlit.plc PLC_ID: (optional) PLC number, default last loaded PLC PLC_MACROS: (optional) Substitution macros for PLC code. The macros \u0026ldquo;SELF_ID\u0026rdquo;,\u0026ldquo;SELF\u0026rdquo;,M_ID, and M are reserved: \u0026ldquo;SELF_ID\u0026rdquo; = PLC Id of this plc \u0026ldquo;SELF\u0026rdquo; = \u0026ldquo;plc${SELF_ID}\u0026rdquo; \u0026ldquo;M_ID\u0026rdquo; = EtherCAT master ID \u0026ldquo;M\u0026rdquo; = \u0026ldquo;ec${M_ID}\u0026rdquo; INC: (optional) List of directories for include files to pass to MSI (if several paths then divide with \u0026lsquo;:'). TMP_PATH: (optional) directory to dump the temporary plc file after macro substitution PRINT_PLC_FILE: (optional) 1/0, printout msi parsed plc file (default enable(1)). Example:\n${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, \u0026#34;FILE=./plc/test.plc_lib, PLC_MACROS=\u0026#39;OFFSET=3\u0026#39;\u0026#34; The functions must be defined accordning to this template (max 5 parameters):\nfunction \u0026lt;name\u0026gt;(\u0026lt;param1\u0026gt;,...,\u0026lt;param5\u0026gt;) { \u0026lt;code body\u0026gt;; } also without param is allowed:\nfunction \u0026lt;name\u0026gt;() { \u0026lt;code body\u0026gt;; } Several functions can be defined in the same file. For syntax of the \u0026ldquo;code body\u0026rdquo;, check plc syntax and the exprtk website. The parameters aswell as the return value must be scalars, however, local vectors can be defined and used in calculations (initiations of vector can be done with MACROS, constants or parameters). \u0026ldquo;#\u0026rdquo; as a first char in a line is considered a comment (the line will be removed before compile). The lib file will be parsed through MSI allowing macro expansion, \u0026ldquo;include\u0026rdquo; and \u0026ldquo;subsitute\u0026rdquo; commands. For more info check best practice and msi documentation/help. can be used in functions The parameters Other functions (also recursive) The normal ecmc function libs: motion: mc_* ethercat: ec_* data storages: ds_*, master 2 master: m2m_* the exprtk functions libs: println print open close write read\u0026quot;, getline eof vectors in the calculations (but NOT as parameter or return value). can NOT be used in functions \u0026ldquo;ecmc variables\u0026rdquo; can NOT be used/accessed in functions:\n EtherCAT I/0 direct access ec.s.* Data storage variables: ds.* Motion variables: ax.* Static variables: static.* Global variables: global.* Vectors as parameter or return value (only first value will be passed). example function lib file # Nothing fancy function add(a,b,c,d,e) { println('This is add: ', a+b+c+d+e) return[a+b+c+d+e+${OFFSET=0}]; }; function prod(a,b,c,d,e) { println('This is prod, add2 : ', add(a,b,c,d,e)); println('This is prod, prod: ', a*b*c*d*e); return [a * b * c * d * e + ${OFFSET=0}]; }; # function with vector calcs (inside) function testLocalArray(a) { var test[5]:={a,a,a,a,a}; println('This is testLocalArray: ',test); return [dot(test,test)]; }; # function without arg function one() { println('This is one: ',1); return [1+${OFFSET=0}]; } # function with ecmc function inside function testm2m() { m2m_write(0,m2m_read(0)+${OFFSET=0}); println('This is testmt2: elem 0: ',m2m_read(0)); } debugging Unfortunately debugging of function libs is not as easy as normal PLC:s since exprtk returns less infomation at compile failure.\nIn order to troubleshoot, load the code as a normal PLC instead. This way you will get more diagnostics. Also remember, ecmc varaibles cannot be accessed in plc libs.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/","title":"iocsh utilities","tags":[],"description":"","content":"ECMC Iocsh Utilities Iocsh function \u0026ldquo;ecmcEpicsEnvSetCalc()\u0026rdquo; \u0026ldquo;ecmcEpicsEnvSetCalc()\u0026rdquo; is used to evaluate expressions and set result to EPCIS environment variables. Usefull for calculate:\n slave offsets sdo/pdo adresses (also in hex) scalings in motion record fields \u0026hellip; ecmcEpicsEnvSetCalc -h Use \u0026quot;ecmcEpicsEnvSetCalc(\u0026lt;envVarName\u0026gt;, \u0026lt;expression\u0026gt;, \u0026lt;format\u0026gt;)\u0026quot; to evaluate the expression and assign the variable. \u0026lt;envVarName\u0026gt; : EPICS environment variable name. \u0026lt;expression\u0026gt; : Calculation expression (see exprTK for available functionality). Examples: Simple expression:\u0026quot;5.5+${TEST_SCALE}*sin(${TEST_ANGLE}/10)\u0026quot;. Use of \u0026quot;RESULT\u0026quot; variable: \u0026quot;if(${TEST_VAL}\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;. Strings are used within '\u0026lt;str\u0026gt;': \u0026quot;'test'='test'\u0026quot;. Note: expression result must be numeric and not string (in this case expression result is 1 =\u0026gt; \u0026lt;envVarName\u0026gt; will be set to \u0026quot;1\u0026quot;). \u0026lt;format\u0026gt; : Optional format string. Example \u0026quot;%lf\u0026quot;, \u0026quot;%8.3lf\u0026quot;, \u0026quot;%x\u0026quot;, \u0026quot;%04d\u0026quot; or \u0026quot;%d\u0026quot;, defaults to \u0026quot;%d\u0026quot;. Can contain text like \u0026quot;0x%x\u0026quot; or \u0026quot;Hex value is 0x60%x\u0026quot;. Must contain one numeric value where result of expression will be written. Restrictions: - Some flags and/or width/precision combinations might not be supported. - Hex numbers in the expression is not allowed (but hex as output by formating is OK). - Non floatingpoint values will be rounded to nearest int. Examples: #### Calculate addresses in HEX with specified width # ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;$(test1)+1+2+3+4+5*10.1\u0026quot;, \u0026quot;%03x\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;061+1+2+3+4+5*10.1\u0026quot;, \u0026quot;%03x\u0026quot;) epicsEnvShow(\u0026quot;test2\u0026quot;) test2=07a #### Hex + text in format string # ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;$(test1)+1+2+3+4+5*10.1\u0026quot;, \u0026quot;This is the number: 0x%06x\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;test2\u0026quot;, \u0026quot;061+1+2+3+4+5*10.1\u0026quot;, \u0026quot;This is the number: 0x%06x\u0026quot;) epicsEnvShow(\u0026quot;test2\u0026quot;) test2=This is the number: 0x00007a #### Calculate scalings (floating point) epicsEnvSet(\u0026quot;IORange\u0026quot;,32768) # ecmcEpicsEnvSetCalc(\u0026quot;scaling\u0026quot;, \u0026quot;$(test1)/$(IORange)*10\u0026quot;, \u0026quot;%lf\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;scaling\u0026quot;, \u0026quot;061/32768*10\u0026quot;, \u0026quot;%lf\u0026quot;) epicsEnvShow(\u0026quot;scaling\u0026quot;) scaling=0.018616 #### Offset slave numbers (format defaults to \u0026quot;%d\u0026quot;) epicsEnvSet(\u0026quot;ECMC_SLAVE_NUM\u0026quot;,10) epicsEnvSet(\u0026quot;ECMC_SLAVE_NUM_OFFSET\u0026quot;,25) # ecmcEpicsEnvSetCalc(\u0026quot;ECMC_SLAVE_NUM\u0026quot;, \u0026quot;$(ECMC_SLAVE_NUM)+$(ECMC_SLAVE_NUM_OFFSET)\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;ECMC_SLAVE_NUM\u0026quot;, \u0026quot;10+25\u0026quot;) epicsEnvShow(\u0026quot;ECMC_SLAVE_NUM\u0026quot;) ECMC_SLAVE_NUM=35 #### if-statement syntax (use \u0026quot;RESULT\u0026quot; variable) epicsEnvSet(\u0026quot;VALUE\u0026quot;,10) # ecmcEpicsEnvSetCalc(\u0026quot;IF_TEST\u0026quot;, \u0026quot;if(${VALUE}\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;IF_TEST\u0026quot;, \u0026quot;if(10\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;) epicsEnvShow(\u0026quot;IF_TEST\u0026quot;) IF_TEST=100 #### Comparing strings 1 (use '\u0026lt;string\u0026gt;'): epicsEnvSet(\u0026quot;filename\u0026quot;,\u0026quot;ecmcEL3002.cmd\u0026quot;) # ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;'$(filename)'='test.script'\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;'ecmcEL3002.cmd'='test.script'\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=0 #### Comparing strings 2 (if-else): # ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;if('$(filename)'='test.script') {RESULT:=1;}else{RESULT:=0;};\u0026quot;) ecmcEpicsEnvSetCalc(\u0026quot;result\u0026quot;, \u0026quot;if('ecmcEL3002.cmd'='test.script') {RESULT:=1;}else{RESULT:=0;};\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=0 Iocsh function \u0026ldquo;ecmcEpicsEnvSetCalcTernary()\u0026rdquo; \u0026ldquo;ecmcEpicsEnvSetCalcTernary()\u0026rdquo; is used o evaluate expressions and set EPCIS environment variables to different strings. depending on if the expression evaluates to \u0026ldquo;true\u0026rdquo; or \u0026ldquo;false\u0026rdquo;. Can be usefull for:\n Choose different files to load like plc-files, axis configurations, db-files or.. making conditional ecmc settings \u0026hellip; ecmcEpicsEnvSetCalcTernary -h Test iocsh function \u0026quot;ecmcEpicsEnvSetCalcTernary()\u0026quot; t Use \u0026quot;ecmcEpicsEnvSetCalcTernary(\u0026lt;envVarName\u0026gt;, \u0026lt;expression\u0026gt;, \u0026lt;trueString\u0026gt;, \u0026lt;falseString\u0026gt;)\u0026quot; to evaluate the expression and assign the variable. \u0026lt;envVarName\u0026gt; : EPICS environment variable name. \u0026lt;expression\u0026gt; : Calculation expression (see exprTK for available functionality). Examples: Simple expression:\u0026quot;5.5+${TEST_SCALE}*sin(${TEST_ANGLE}/10)\u0026quot;. Use of \u0026quot;RESULT\u0026quot; variable: \u0026quot;if(${TEST_VAL}\u0026gt;5){RESULT:=100;}else{RESULT:=200;};\u0026quot;. Strings are used within '\u0026lt;str\u0026gt;': \u0026quot;'test'='test'\u0026quot;. Note: expression result must be numeric and not string (in this case expression result is 1 =\u0026gt; \u0026lt;envVarName\u0026gt; will be set to \u0026lt;trueString\u0026gt;). \u0026lt;trueString\u0026gt; : String to set \u0026lt;envVarName\u0026gt; if expression (or \u0026quot;RESULT\u0026quot;) evaluates to true. \u0026lt;falseString\u0026gt; : String to set \u0026lt;envVarName\u0026gt; if expression (or \u0026quot;RESULT\u0026quot;) evaluates to false. Examples: ### Simple true false epicsEnvSet(\u0026quot;VALUE\u0026quot;,10) # ecmcEpicsEnvSetCalcTernary(\u0026quot;test_var\u0026quot;, \u0026quot;${VALUE}+2+5/10\u0026quot;,\u0026quot;True\u0026quot;,\u0026quot;False\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;test_var\u0026quot;, \u0026quot;10+2+5/10\u0026quot;,\u0026quot;True\u0026quot;,\u0026quot;False\u0026quot;) epicsEnvShow(\u0026quot;test_var\u0026quot;) test_var=True ### Can be used for choosing different files # ecmcEpicsEnvSetCalcTernary(\u0026quot;filename\u0026quot;, \u0026quot;${VALUE}\u0026gt;20\u0026quot;,\u0026quot;./plc_fast.cfg\u0026quot;,\u0026quot;./plc_slow.cfg\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;filename\u0026quot;, \u0026quot;10\u0026gt;20\u0026quot;,\u0026quot;./plc_fast.cfg\u0026quot;,\u0026quot;./plc_slow.cfg\u0026quot;) epicsEnvShow(\u0026quot;filename\u0026quot;) filename=./plc_slow.cfg ### Comparing strings 1 (simple): # ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;'$(filename)'='./plc_slow.cfg'\u0026quot;,\u0026quot;equal\u0026quot;,\u0026quot;not_equal\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;'./plc_slow.cfg'='./plc_slow.cfg'\u0026quot;,\u0026quot;equal\u0026quot;,\u0026quot;not_equal\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=equal ### Comparing strings 2 (with if-else): # ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;if('$(filename)'='test') {RESULT:=1;}else{RESULT:=0;};\u0026quot;,\u0026quot;use_this_file.cfg\u0026quot;,\u0026quot;no_use_this_file.cfg\u0026quot;) ecmcEpicsEnvSetCalcTernary(\u0026quot;result\u0026quot;, \u0026quot;if('./plc_slow.cfg'='test') {RESULT:=1;}else{RESULT:=0;};\u0026quot;,\u0026quot;use_this_file.cfg\u0026quot;,\u0026quot;no_use_this_file.cfg\u0026quot;) epicsEnvShow(\u0026quot;result\u0026quot;) result=no_use_this_file.cfg Use return value of ecmcConfig(OrDie): The return value from ecmcConfig(OrDie) is stored in the EPICS environment variable \u0026ldquo;ECMC_CONFIG_RETURN_VAL\u0026rdquo;. This value can be used to make som dynamic configuration. All ASCII configuration commands for ecmcConfig(OrDie) can be used in the same way.\nExample: Read firmware version of an EL7037 stepper drive Note: SDO reads need to be before \u0026ldquo;SetAppMode(1)\u0026rdquo;\necmcConfig \u0026quot;EcReadSdo(${ECMC_SLAVE_NUM},0x100a,0x0,2)\u0026quot; epicsEnvShow(ECMC_CONFIG_RETURN_VAL) ECMC_CONFIG_RETURN_VAL=14640 The variable \u0026ldquo;ECMC_CONFIG_RETURN_VAL\u0026rdquo; then can be used to set record fields, name or alias for instance..\nExample: Read \u0026ldquo;ID\u0026rdquo; PDO from EK1101 (shown in detail in aliasRecordFromPdoData.script) Note: PDO reads need to be after \u0026ldquo;SetAppMode(1)\u0026rdquo; since cyclic value\necmcConfig \u0026quot;ReadEcEntryIDString(${ECMC_SLAVE_NUM},\u0026quot;ID\u0026quot;)\u0026quot; 2020/02/28 08:58:03.771 1024 ## This is the value of the EK1101 ID switch epicsEnvShow(ECMC_CONFIG_RETURN_VAL) ECMC_CONFIG_RETURN_VAL=1024 The variable \u0026ldquo;ECMC_CONFIG_RETURN_VAL\u0026rdquo; then can be used to set record fields, name or alias for instance..\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/manual/","title":"manual motion","tags":[],"description":"","content":" force manual motion This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are not obeyed! YOU HAVE BEEN WARNED!\n In case the hardware is fine, the cables are checked, human error is mostly excluded, or the system used to work but doesn\u0026rsquo;t work any longer, directly writing to the drive is possible.\nFor this however, the IOC needs to be reconfigured to not link the hardware to an axis!\n Edit the startup script and comment out the axis, just leave the slave configuration. restart the IOC check the PVs for the drive in question (slave 7 in this case) dbgrep \u0026quot;*s007*\u0026quot; There should be two PVs ending with, -Drv01-Cmd and -Drv01-Spd Set -Drv01-Cmd to 1 and check the amplifier did enable, if you don\u0026rsquo;t know how to check for an enabled amplifier, you should not use this command! After the amplifier is engaged, write a small number to -Drv01-Spd. Dependinf on the scaling, the number might be in the range of 1..1000. Observe the encoder, or in case of open-loop, the device itself. "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/","title":"EL5042","tags":[],"description":"","content":" Topics No reading Diagnostics Offset LSB Bit [Bit] (0x80p8:17) SSI No reading Could be caused by:\n Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). Bad electrical connection Wrong power supply Defect encoder or EL5042 Long cabling lengths Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading \u0026ldquo;Diagnostics\u0026rdquo;.\nBad electrical connection The serial communication is hanled by two RS422 channels, one for the clock and one for data. These channels can be measured with a scope:\n The clock should output periodic \u0026ldquo;bursts\u0026rdquo; with clock pulses with a short break in between. The bursts should appear in the same rate as the ethercat frame rate (EC_RATE, default 1kHz). And the frequency of the clock pulses should correspond with the setting in your startup script (normally 250kHz..10Mhz depending on configuration) The data channel should return bits in sync with the clock pulses. Lack of clock or data pulses could be caused by (in order of probability):\n short circuit or error in cabling defect/burt encoder No/wrong power supply defect EL5042 (if lack of clock pulses) Wrong power supply Make sure the encoder is powered with the correct voltage. Most encoders require 5V, but there are also some that require 9V, 12V or 24V.\nNever apply a higher voltage than the specified operating voltage for the encoder.\n The EL5042 can supply 5V or 9V. The default setting is 5V and in order to change the setting to 9V a special sequence need to be executed (see EL5042 manual).\nAfter ensuring that the encoder is correctly supplied, the verify the power consumption of the encoder and compare with the specified consumption. If the power consumption does not match, the encoder might be broken or a faulty cabling.\nLong cable lengths Long cable lengths can affect both power supply levels and the serial data channels.\nPower supply:\nLonger cables will normally also result in a higher voltage drops. Especaillay for 5V encoders this can be an issue. Make sure that the voltage are within the specified range by measuring the voltage level close to the encoder.\nIf the voltage is to low (mainly for 5V encoders):\n Can cabling length be reduced Can cable impedance be reduced (higher area) Add a separate (5V) power supply with possabilities to adjust the voltage level to a slightly higher voltage. Make sure the voltage is not too high at the encoder end. Serial communication: The serial communication is also affected by the cable legth. For long cable lengths a reduction of the clock rate can be needed. The clock rate can be reduced by setting the CLK_FRQ_KHZ macro in the call to applyComponent.cmd (set clock freq. to 500kHz):\n${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,MACROS=\u0026#39;CLK_FRQ_KHZ=500\u0026#39;\u0026#34; For EL5042 the following rates are availble:\n 10 MHz 5 MHz 3.33 MHz 2.5 MHz default for some encoders 2 MHz 1 MHz Max for SSI and default for some encoders 500 kHz 250 kHz NOTE: The closest freq. equal or higher than CLK_FRQ_KHZ will be selected.\nDiagnostics The diagnostic data can be read from register Index A0p8 FB BiSS-C Diag data (for Ch.1, p = 0; Ch.2, p = 1):\nThe ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics:\nbash read_el5042_diag.sh \u0026lt;master_id\u0026gt; \u0026lt;slave_id\u0026gt; \u0026lt;channel_id\u0026gt; NOTE: The channel id starts at 0. First encoder channel is 0.\nExample: master 1, slave 14, channel 0\n# first login to ecmc server $ bash read_el5042_diag.sh 1 14 0 ######################################################### Reading EL5042 Ch 0 status at master id 1 and slave id 14: Power supply present: 0x01 1 Error: 0x00 0 SDC Error: 0x01 1 WD Error: 0x01 1 Data valid: 0x00 0 Data raw value: 0x0000000000000000 0 ######################################################### Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics.\nOffset LSB Bit [Bit] (0x80p8:17) When using the LSB offset, the same amount of ones (\u0026ldquo;1\u0026rdquo;) will be shifted in as MSB. Therefore the LSB offset should normally not be used.\n When using the LSB offset setting, the same amout of bits needs to be subtracted from the ST_BITS or MT_BITS\nExample: 26bit RLS, no LSB offset\n${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,OFF_BITS=0\u0026quot; Example: 26bit RLS with 3 bits offset (ST_BITS=23, OFF_BITS=0)\n#If the offset is needed then the sum of the bit's still need to match the bitcount of the encoder. Example: Offset 3 LSB bits, set ST_BITS=23 (26-3) ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-Generic-BISS-C,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=23,CLK_FRQ_KHZ=1000,OFF_BITS=3\u0026quot; SSI The entire SSI frame needs to covered in MT_BITS and ST_BITS (also status bits and startup bits), also see \u0026ldquo;Offset LSB Bit\u0026rdquo; above. Enabling status bits by SDO (0x80p8:02) will not work, seems only valid for BISS-C (kind of hints this in manual). If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning).\n Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28)\n${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=28,CLK_FRQ_KHZ=1000,CODING=0\u0026quot; Some SSI encoders, i.e. Posital kit SSI, also send startup bits. These also needs to be accounted for in the ST_BITS and MT_BITS.\nExample: Posital kit SSI encoder, KCD-S1X3B-1617-IE4F-GRQ\n# Specs: # Single turn bits 17 # Multiturn bits: 16 # Status bits: 2 # Startup bits 8 (zeros) # This then results in: # MT_BITS=16 + 8 = 24 (multi turn bits + startup bits) # ST_BITS=17 + 2 = 19 (single trun bits + status bits) ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=24,ST_BITS=19\u0026quot; The status bits can then be masked away by:\n Using the LSB offset (set to 2 and reduce ST_BITS to 26), then the status bits are shifted away already in EL5042 hardware. Then you cannot access the status bits (to use from PLC or for interlock) Setting a mask in axis yaml file (encoder.mask: 0xFFFFFFC), in this case the encoder.absBits should not be used because it\u0026rsquo;s automatically calculated by the mask command. Then you can reach the bits in the raw encoder value. "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/","title":"EL70x1","tags":[],"description":"","content":" Topics Diagnostics Tuning Diagnostics If the drive is in error or warning state, further information about the reason for the warning/error can be read from the drive terminal by using the ethercat command. See command line interface for more info.\nIn order to use the ethercat command, you must first login to the server where the ecmc IOC is running.\n The diagnostic data can be read from register Index A010 STM Diag data Ch.1 with the folowing syntax:\nethercat upload -m \u0026lt;master_index\u0026gt; -p \u0026lt;slave_index\u0026gt; --type uint8 0xA010 \u0026lt;subindex\u0026gt; Example for master 0, slave position 3:\n# Saturated ethercat upload -m 0 -p 3 --type uint8 0xA010 0x1 # Over temperature ethercat upload -m 0 -p 3 --type uint8 0xA010 0x2 # Torque overload ethercat upload -m 0 -p 3 --type uint8 0xA010 0x3 # Under voltage ethercat upload -m 0 -p 3 --type uint8 0xA010 0x4 # Over voltage ethercat upload -m 0 -p 3 --type uint8 0xA010 0x5 # Short circuit A ethercat upload -m 0 -p 3 --type uint8 0xA010 0x6 # Short circuit B ethercat upload -m 0 -p 3 --type uint8 0xA010 0x7 # No control power ethercat upload -m 0 -p 3 --type uint8 0xA010 0x8 # Misc error ethercat upload -m 0 -p 3 --type uint8 0xA010 0x9 The ecmccfg/utils/read_el70xx_diag.sh tool can also be used for reading the diagnostics:\nbash read_el70xx_diag.sh \u0026lt;master_id\u0026gt; \u0026lt;slave_id\u0026gt; Example: master 0, slave 3, drive under voltage warning\nbash read_el7041_diag.sh 0 3 ######################################################### Reading EL70xx status at master id 0 and slave id 3: Saturated: 0x00 0 Over temperature: 0x00 0 Torque overload: 0x00 0 Under voltage: 0x01 1 Over voltage: 0x00 0 Short circuit A: 0x00 0 Short circuit B: 0x00 0 No control power: 0x00 0 Misc error: 0x00 0 ######################################################### Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics.\nunder voltage Use a multimeter to verify that the voltage level corresponds to voltage levels described in the electrical drawings. If the voltage is correct, then the under voltage alarm could be related to worng setting of nominal drive voltage setting (48V but the drive is powered with 24V).\nThe nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp).\nExample: Set nominal voltage to 24V\n${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026quot;HW_DESC=EL7041-0052\u0026quot; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=24000, R_COIL_MOHM=1230'\u0026quot; For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically).\n over voltage Use a multimeter to verify that the voltage level corresponds to voltage levels described in the electrical drawings. If the voltage is correct, then the over voltage alarm could be related to worng setting of nominal drive voltage setting (24V but the drive is powered with 48V).\nThe nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp).\nExample: Set nominal voltage to 48V\n${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026quot;HW_DESC=EL7041-0052\u0026quot; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026quot;COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'\u0026quot; For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically).\n Tuning There are normally several control loops in an ecmc system:\n Position loop (centralized in ecmc if CSV) Velocity loop (in drive) Current loop (in drive) However, for the EL70x1 drives there\u0026rsquo;s no dedicated velocity loop (however some current boost settings that can be applied in acc/dec, see below)\nPosition loop The position loop control parameters can be accessed and tuned by PVs. Normally, a pure P controller is enough (ki and kp set to 0) but sometimes the I and D part can be needed.\nCurrent loop For most usecases, the default current controller parameters are already well tuned. Sometimes when operating at higher speeds the current loop needs to be tuned.\nFor EL70x1 stepper drives the following parameters can be tuned:\n 8011:07 Ka factor 8011:08 Kd factor 8011:01 Kp factor 8011:02 Ki factor ** 8011:07 Ka and 8011:08 Kd factor: **\n8011:07 Ka factor / 8011:08 Kd factor are “current boosts” during acceleration/deceleration. Default they are set to 100% which is way too high for most applications. Start by setting these parameters to 0.\n** 8011:01 Kp and 8011:02 Ki factor: ** This is the current loop settings and this is also what affect the performance. The higher you set these registers, the stiffer the control loop. For most applications it is important to keep a ration of 40:1. Default is 400 / 10, if you want a stiffer loop, then change to f ex 800 / 20 and onwards. Increase until the motor misbehaves and go back to a safe setting.\nAlso see troubleshooting/tuning section.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/best_practice/","title":"best practice","tags":[],"description":"","content":"best practice Here you can find some best practice configurations for common usecases.\n Macros MSI include, substitute Printouts The complete examples with starup files can be found here\nmacros Use of macros makes the code more generic. When loading a PLC file with \u0026ldquo;loadPLCFile.cmd\u0026rdquo;, custom macros can be defined in \u0026ldquo;PLC_MACROS\u0026rdquo;:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS=\u0026#39;BO_S_ID=${ECMC_EC_SLAVE_NUM}\u0026#39;\u0026#34; NOTE: ECMC_EC_SLAVE_NUM expands to the ID of the last added slave.\nIn addition to the custom macros, a few macros, that are often needed, are predefined:\n SELF_ID : Id of current PLC SELF : plc\u0026lt;SELF_ID\u0026gt; M_ID : EtherCAT master ID M : ec\u0026lt;M_ID\u0026gt; SELF_ID and SELF example A common usecase is that some initiation is needed, could be triggering of a custom homing sequence:\nif(${SELF}.firstscan) { var plc:=${SELF_ID}; ${DBG=#}println(\u0026#39;PLC \u0026#39;,plc,\u0026#39; is starting up\u0026#39;); }; After macro expansion the code would look like this (for PLC id=0,DBG=''):\nif(plc0.firstscan) { var plc:=0; println(\u0026#39;PLC \u0026#39;,plc,\u0026#39; is starting up\u0026#39;); }; M_ID and M example All EtherCAT related information/data is accessible through the pattern \u0026ldquo;ec\u0026lt;master_id\u0026gt;.s\u0026lt;slave_id\u0026gt;.\u0026rdquo;. To allow the same code to be loaded on different masters it\u0026rsquo;s a good idea to use the predefined macros,\u0026ldquo;M\u0026rdquo; and \u0026ldquo;M_ID\u0026rdquo;.\nToggle an output:\n${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}); ${DBG=#}println(\u0026#39;State: \u0026#39;, ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); After macro expansion with the following macros the code would look like this:\n BO_S_ID = 10 BO_CH = Not defined (defaults to \u0026ldquo;01\u0026rdquo;) DBG = Not defined (defaults to \u0026ldquo;#\u0026quot;) ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); #println(\u0026#39;State: \u0026#39;, ec0.s10.binaryOutput01); include and substitute Since all PLC files and PLC libs are parsed through MSI the \u0026ldquo;include\u0026rdquo; and \u0026ldquo;substitute\u0026rdquo; commands can be used.\nWhen using the include command, the file location dir of the file must be added in the INC parameter when loading the PLC:\n${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, \u0026#34;FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS=\u0026#39;BO_S_ID=${ECMC_EC_SLAVE_NUM}\u0026#39;\u0026#34; The \u0026ldquo;INC\u0026rdquo; parameter can contain several directories separated with a \u0026ldquo;:\u0026rdquo;, making it possible to include PLC files from several locations/modules.\nexample: Toggle a few outputs As a demo usecase let\u0026rsquo;s consider that a few outputs needs to be toggled. NOTE: There are simpler ways to write this specifc code but it\u0026rsquo;s used to demo how code can be divided.\nLets first define some code that toggles a bit (toggle_output.plc_inc):\n# Example of simple include file that toggles an binary output ${M}.s${BO_S_ID}.binaryOutput${BO_CH}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH}); ${DBG=#}println(\u0026#39;State: \u0026#39;, ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); This code snippet then can be included in a main plc-file by using the \u0026ldquo;include\u0026rdquo; keyword. Each include can then be included with different macros by using the \u0026ldquo;substitute\u0026rdquo; keyword:\nsubstitute \u0026#34;BO_CH=01\u0026#34; include \u0026#34;toggle_output.plc_inc\u0026#34; substitute \u0026#34;BO_CH=02, DBG=\u0026#34; include \u0026#34;toggle_output.plc_inc\u0026#34; The above code would expand to:\nec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); #println(\u0026#39;State:\u0026#39;, ec0.s10.binaryOutput01); ec0.s10.binaryOutput02:=not(ec0.s10.binaryOutput02); println(\u0026#39;State: \u0026#39;, ec0.s10.binaryOutput02); The resulting code will toggle two different outputs, the state of the last output will be printed.\nNOTE: Macros cannot be used in the filename when including a file. Instead the dir should be defined in the INC param when loading the PLC, see above.\nprintouts Adding a DBG macro can be usefull to be able to turn on/off printouts. Typically during commsioning it can be usefull to have many printouts but later when system goes into production, it could be a good idea to turn (some) printouts off.\nExample of a printout that can be turned on/off (default off)\n${DBG=#}println(\u0026#39;Value: \u0026#39;, ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); Will result in the below if setting the DBG='' (and some other macros, see above):\nprintln(\u0026#39;Value: \u0026#39;, ec0.s10.binaryOutput01); "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/ecmc_command_ref/","title":"ecmc command reference","tags":[],"description":"","content":"ecmc command reference ethercat motion general misc plc "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el9xxx/","title":"EL9xxx","tags":[],"description":"","content":" Topics over current protection passive terminals over current protection In the standard setup at PSI over current protection modules are used to feed 24V to both the EtherCAT communication bus (E-bus) and the power bus of the EtherCAT slaves. If the over current protection is not enabled then the EtherCAT slaves will not receive power.\nFirst time, (and only first time), a system is in use, the overcurrent modules needs to be enabled in order to allow current to flow. Enabling is done by push buttons in the LED area of the module. The long horizontal LEDs are in fact buttons that can be used to activate or tripp the over current protection.\nBefore pressing any button, check the electrical drawings and make sure it\u0026rsquo;s safe to power on the system.\n el9221-5000 The EL9221-5000 has one channel and therefore only the top button is needed to be pressed.\nel9227-5500 The EL9227-5500 is a 2 channel module and normally both channels needs to be enabled by pressing both the top and bottom long LED. if only one are pressed it could result in that the power to the communication is fine but the power to the i/o bus is lacking. This can result in starnge issues. Both EL9227-5500 and EL9221-5000 have dedicated panels whre status of the over current protection can be seen.\npassive terminals Some terminals are passive. Passive terminals are not EtherCAT slaves and do not communicate over EtherCAT (not equipped with EtherCAT slave controller). Passive terminals are normally used to simplify electrical connections (avoiding external terminals). For instance for distributing potential, 24V and 0V, an EL9184 can be used (8Ch 24V and 8Ch 0V).\nThe passive terminals will not show up as an EtherCAT slave when issueing the \u0026ldquo;ethercat slaves\u0026rdquo; command. However, they are normally visible in the electrical drawings. This could result in that the slave id in the electrical drawing is NOT corresponding to the EtherCAT slave index used when configuring ecmc. In worst case this could lead to that the wrong hardware/drive is configured.\nWhen configuring ecmc, make sure the EtherCAT slave index is correct, do not blindly trust the electrical drawings since a passive terminal could introduce an shift in the slave indices.\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/scaling/","title":"scaling","tags":[],"description":"","content":"By popular demand, the topic scaling will be discusses in closer detail.\necmc has to scaling factors for each joint, firstly the drive scaling, secondly the encoder scaling.\nChanges to the scaling have direct effects on the Kp of the PID-loop. If the drive scaling is changes, make sure to adjust the PID parameters accordingly.\n drive scaling Drive scaling deals with the relation of the drive output (typically a 16- or 32-bit register) to axis velocity. Scaling is similar, but slighlty different for stepper drives and servo drives\nstepper motor drives The scaling for the Ex70xx slaves will be explained based on two very common examples.\nsimple linear axis Assumptions:\n 200 fullsteps/rev motor lead screw pitch: 5 mm/rev Register 0x8012:05 is set to 1 \u0026ndash;\u0026gt; 2000 fullsteps max step rate (default for ECMC, check for other slaves!) velocitySetpoint is in 16-bits. drive: numerator: 50 # Fastest speed in engineering units (2000 full steps / s --\u0026gt; 10 rev/s * 5 mm/rev --\u0026gt; 50 mm/s) denominator: 32768 # I/O range 2^15, because 16-bit register, half is forward, the other half is backward explanation The denominator is 32768 because the velocitySetpoint is a 16-register for the Beckhoff stepper drives. Thus, half of the full range is reserved for positive (forward) motion, the remaining half for negative (backward) motion. This means that at full output the motor would receive 2000 fullsteps per second. It is irrelevant whether the motor can actually spin this fast as this a purely theoretical value! Since we have established that the motor spins at 10 rev/s at full output, the conversion to engineering units is trivial and yields 50 mm/s, based on the lead screw pitch.\nrotational axis Assumptions:\n 400 fullsteps/rev motor drive train ratio: 36 deg/rev Register 0x8012:05 is set to 1 \u0026ndash;\u0026gt; 2000 fullsteps max step rate (default for ECMC, check for other slaves!) velocitySetpoint is in 16-bits. drive: numerator: 180 # Fastest speed in engineering units (2000 full steps / s --\u0026gt; 5 rev/s * 36 deg/rev --\u0026gt; 180 deg/s) denominator: 32768 # I/O range 2^15, because 16-bit register, half is forward, the other half is backward explanation At full output, the motor receives 2000 fullsteps/s, which results in 5 rev/s due to the higher fullstep count of the motor. The drive train ratio is specified as 10 motor revolutions per 360 degree on the output or 36 deg/rev. Therefore, the resulting velocity of the motor in EGUs is 180 deg/s. Please note that this is not the actual maximum velocity, but rather a theoretical scaling factor for the PID-loop.\nservo motor drives This section is based on the Beckhoff servo motor drives (Ex72xx), AX-drives or drives from other vendors might differ. The Ex72xx servo motor drives from Beckhoff use a 32-bit register for the velocity setpoint. Therefore, the denominator takes on a value of 2^31 = 2147483648.\nAs for the numerator, the situation is a bit more complicated. The AM81xx synchronous motors come with different pole counts, most have 3 pole pairs, but some have 4. Naturally, this results in a different scaling for either type. At full output a 3 pole pair motor would spin at 8000 revolutions per second! Respectively, the 4 pole pair motor will assume 6000 rev/s. Since no servo motor will ever reach such speeds and the value is only used for the PID-loop scaling, no difference is noticeable in real life applications. Except when a motor is replaced by a different model with deviating pole pair count.\nThe following example shows a 3 pole pair motor scaled for operation in degrees. Therefore, the numerator equals 8000 rev/s * 360 deg/rev = 2880000 deg/s.\ndrive: numerator: 2880000 # Fastest speed in engineering units (8000 rev/s * 360 deg/rev) denominator: 2147483648 # I/O range 2^31, because 32-bit register, half is forward, the other half is backward encoder scaling This scaling ratio describes the relation of encoder counts and engineering units of the axis.\nUnlike the drive scaling, the encoder scaling is much simpler. It represents merely the realtion between the observed counts on the encoder and the displacement of the load.\nclosed-loop Scaling absolute encoders is simple. This example shows a 32-bit encoder with 4096 ticks/mm, for an axis operated in mm.\nencoder: numerator: 1 denominator: 4096 type: 1 # Type: 0=Incremental, 1=Absolute bits: 32 # Total bit count of encoder raw data explanation none, this should be simple enough!\nopen-loop Obviously, for open-loop operation there is no encoder. In this case the internal step counter of the stepper motor drive is used as \u0026ldquo;encoder\u0026rdquo;. In the example below such a case is presented, with an explanation.\nencoder: numerator: 0.125 # 0.125 mm/rev lead screw denominator: 12800 # 200 fullsteps/rev with 64 microsteps/fullstep type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data explanation The internal step counter operates in microsteps. For most drives this value assumes 64, if uncertain consult the respective manual of the drive. In case of a 200 fullsteps/rev motor, the denominator therefore will be set to 200*64=12800. As for the numerator, this is simply the displacement observed for one full motor revolution. As the step counter is incremental, the type: 0 has to be set. The step counter is of type uint16, thus the bits: 16 setting, which is important to handle the over-/underflow.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/servo/","title":"servo motor (Ex72xx)","tags":[],"description":"","content":"setup EP7211-0034 servo drive slave Lab test stage (1mm/rev) Motor : AM8111-0F20 scalings Config for scaling in mm, mm/s, mm/s2\nmotor AM8111-XFX0 Data about the motor can be found here: https://infosys.beckhoff.com/english.php?content=../content/1033/am8100/index.html\u0026amp;id=\nImportant for scaling factors in axis.yaml is the motor pole count. For the AM8111-XFX0 motor the pole count is 6.\nencoder scaling Only the encoder integrated encoder is configured in this example. The specification of the encoder for a AM8111-0F20 motor:\nOne Cable Technology for power and feedback: feedback transmission via motor cable, no feedback cable necessary, electronic nameplate, multi-turn, absolute position within 4096 revolutions, 18 bit resolution. However, when connecting to an Ex72xx drive the single turn count will be 20bits and 12bits multiturn, resulting in a total of 32bits absolute bits.\n encoder.numerator: Travels 1 mm/rev encoder.denominator: Resolution: 1048576 counts (20bits) per = 1mm encoder.absBits: 32 bits (20bits+12bits) encoder.type: Absolute (type 1) ecnoder.absOffset: Offset to 0 position of linear stage (-1000 in this example) # The encoder on most motors are 20bit single turn and 12 bit multiturn (4096 turns) encoder: type: 1 position: ec0.s$(DRV_ID).positionActual01 numerator: 1 denominator: 1048576 bits: 32 absBits: 32 absOffset: -1000 drive scalings Max scale for motors depend on the pole count:\n 6 pole: Max scale is 8000revs/s (in this case 8000mm/s) 8 pole: Max scale is 6000revs/s This then converts to the following cfgs:\n drive.numerator: Max velo = 8000 revs/s == 8000mm/s drive.denominator: velocity setpoint is 32bit == +-31bit = 2147483648 drive.type: Servo drive, set to 1 drive: numerator: 8000 # mm/s, Max speed is 8000 rev/sec for drive (6 pole motor) denominator: 2147483648 type: 1 # Stepper: 0, DS402: 1 (servos) control: ec0.s$(DRV_ID).driveControl01 status: ec0.s$(DRV_ID).driveStatus01 setpoint: ec0.s$(DRV_ID).velocitySetpoint01 reset: 7 switches In standard setup switches are feed from 24V output, for the lab 4ax motion crate this is not the case. However, the configuration for feeding switches (axis.feedSwitchesOutput) have been added anyway:\naxis: id: ${AX_ID=1} feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/direction/","title":"direction of motion","tags":[],"description":"","content":"The direction of motion can be affected by multiple means. Namely, on the slave level, in the axis scaling or in the motorRecord.\nThe best option is to change the direction of motion on the slave level. The alternatives lead to unintuitive scaling factors or mismatch between ECMC and EPICS.\n EtherCAT slave ecmccfg allows SDOs to set individual SDOs in the startup-script of the IOC or in dedicated config files for slaves. As most slaves have a SDOs to invert the direction of motion or counting, it\u0026rsquo;s only natural to make use of this feature. The benefit of changing the direction on the slave is obvious. All axes move in there natural direction, as given by the machine coordinate system. Limit switches - consequently - are always where they belong, even non-experts can diagnose the device or system. Examples for encoder and drive are given below.\nConsult the respective slave manual for the correct SDO.\n encoder direction In many cases inverstion of the encoder value is possible in the ethercat slave. By using INV_DIR macro to applyComponent.cmd, the direction can be changed.\nFor EL5042, example below, the invertion leads to a very high number since the data size is 64bit. Therefore, it\u0026rsquo;s advisable to switch sign in the axis configuration instead.\n # slave 7 {ecmcEL5042} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL5042\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1, MACROS=\u0026#39;INV_DIR=1\u0026#39;\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=2, MACROS=\u0026#39;INV_DIR=1\u0026#39;\u0026#34; drive direction # slave 18 {ecmcEL7041} ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, \u0026#34;HW_DESC=EL7041\u0026#34; ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd \u0026#34;COMP=Motor-Generic-2Phase-Stepper, MACROS=\u0026#39;I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230,INV_DIR=1\u0026#39;\u0026#34; ecmc scaling A negative numerator can be used to change the direction of motion. Refer to the scaling section for details.\nThis will result in negative values for MRES of the motorRecord.\n EPICS motorRecord The epics key of the axis config allows for motorRecord fields to be initialized. By initalizing the DIR field to Neg, the motorRecord will start inverted.\nepics: name: reveredAxis precision: 1 unit: deg motorRecord: enable: yes description: \u0026#34;inverted\u0026#34; fieldInit: \u0026#34;DIR=Neg\u0026#34; This will affect the motorRecord only, thus ECMC internally is still moving in the wrong direction. You have been warned!\n "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/homing/","title":"homing","tags":[],"description":"","content":"homing The follwoing sequences are available:\nECMC_SEQ_HOME_NOT_VALID = 0, ECMC_SEQ_HOME_LOW_LIM = 1, ECMC_SEQ_HOME_HIGH_LIM = 2, ECMC_SEQ_HOME_LOW_LIM_HOME = 3, ECMC_SEQ_HOME_HIGH_LIM_HOME = 4, ECMC_SEQ_HOME_LOW_LIM_HOME_HOME = 5, ECMC_SEQ_HOME_HIGH_LIM_HOME_HOME = 6, ECMC_SEQ_HOME_BWD_HOME = 7, ECMC_SEQ_HOME_FWD_HOME = 8, ECMC_SEQ_HOME_BWD_HOME_HOME = 9, ECMC_SEQ_HOME_FWD_HOME_HOME = 10, ECMC_SEQ_HOME_LOW_LIM_INDEX = 11, ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, ECMC_SEQ_HOME_SET_POS = 15, ECMC_SEQ_HOME_LOW_LIM_SINGLE_TURN_ABS = 21, ECMC_SEQ_HOME_HIGH_LIM_SINGLE_TURN_ABS = 22, ECMC_SEQ_HOME_SET_POS_2 = 25, ECMC_SEQ_HOME_TRIGG_EXTERN = 26, ECMC_SEQ_HOME_NOT_VALID = 0 Not a valid homing sequence, can be used if encoder is absolute.\nECMC_SEQ_HOME_LOW_LIM = 1, Axis moves backward until low limit switch and stops Axis moves forward untill edge detected in limit switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_HIGH_LIM = 2, Axis moves forward until high limit switch and stops Axis moves backward untill edge detected in limit switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_LOW_LIM_HOME = 3, Axis moves backward until low limit switch and stops Axis moves forward untill edge detected in home switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_HIGH_LIM_HOME = 4, Axis moves forward until high limit switch and stops Axis moves backward untill edge detected in home switch signal. Position is latched. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ECMC_SEQ_HOME_LOW_LIM_HOME_HOME = 5, Axis moves backward until low limit switch and stops Axis moves forward untill edge detected in home switch signal. Position is latched. Axis continues untill second edge of home sensor. Motion is stopped. Axis moves backward untill edge of home sensor. Position is latched. Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_HIGH_LIM_HOME_HOME = 6, Axis moves forward until low limit switch and stops Axis moves backward untill edge detected in home switch signal. Position is latched. Axis continues untill second edge of home sensor. Motion is stopped. Axis moves forward untill edge of home sensor. Position is latched. Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_BWD_HOME = 7, Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 1. ECMC_SEQ_HOME_FWD_HOME = 8, Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 1. ECMC_SEQ_HOME_BWD_HOME_HOME = 9, Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_FWD_HOME_HOME = 10, Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) Homing is performed. ECMC_HOME_POS will be the new position at the center point of the two latched positions in step 2 and 4. ECMC_SEQ_HOME_LOW_LIM_INDEX = 11, Axis moves backward until low limit switch and stops Axis moves forward untill the predefined index signals (ECMC_HOME_LATCH_COUNT_OFFSET)from the encoder is encountered. Position is latched at the desired index position. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. Some additional parameters need to be defined for this homing sequence should work (Example for el5101 ):\nepicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCHPOS\u0026quot;, \u0026quot;ec0.s3.encoderLatchPostion01\u0026quot;) # Ethercat entry for latch position (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_CONTROL\u0026quot;, \u0026quot;ec0.s3.encoderControl01.0\u0026quot;) # Ethercat entry for latch control (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_STATUS\u0026quot;, \u0026quot;ec0.s3.encoderStatus01.0\u0026quot;) # Ethercat entry for latch status (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of latch/over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, Axis moves forward until high limit switch and stops Axis moves backward untill the predefined index signals (ECMC_HOME_LATCH_COUNT_OFFSET) from the encoder is encountered. Position is latched at the desired index position. Axis stops Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. Some additional parameters need to be defined for this homing sequence should work (Example for el5101 ):\nepicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCHPOS\u0026quot;, \u0026quot;ec0.s3.encoderLatchPostion01\u0026quot;) # Ethercat entry for latch position (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_CONTROL\u0026quot;, \u0026quot;ec0.s3.encoderControl01.0\u0026quot;) # Ethercat entry for latch control (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_EC_ENC_LATCH_STATUS\u0026quot;, \u0026quot;ec0.s3.encoderStatus01.0\u0026quot;) # Ethercat entry for latch status (only valid for home seq 11,12) epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of latch/over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_SET_POS = 15, (setPosition) Sequence 15 is resereved for save/restore functionality.\nUse ECMC_SEQ_HOME_SET_POS_2 instead (same but not blocked by motor record).\nHowever the sequence 15 can be triggered like the following:\n# Turn off amplifier caput IOC_TEST:Axis1.CNEN 0 # Homing using seq 15 (cannot be triggered from HOMR/HOMF since blocked in motor record) caput IOC_TEST:Axis1.FOFF 1 caput IOC_TEST:Axis1.SET 1 caput IOC_TEST:Axis1.VAL \u0026lt;new position value\u0026gt; caput IOC_TEST:Axis1.FOFF 0 caput IOC_TEST:Axis1.SET 0 ECMC_SEQ_HOME_LOW_LIM_SINGLE_TURN_ABS = 21, Indented use for resolvers (single turn absolute). Similar to seq 11 and 12.\n Axis moves backward until low limit switch and stops Axis moves forward untill limit switch change state Axis stops Homing is performed. The multi turn bits will be homed to the value of ECMC_HOME_POS also consiering a offset of turns defined in ECMC_HOME_LATCH_COUNT_OFFSET. Some additional parameters are important for this homing sequence should work (example):\nepicsEnvSet(\u0026quot;ECMC_ENC_BITS\u0026quot; \u0026quot;25\u0026quot;) # Total bit count of encoder raw data epicsEnvSet(\u0026quot;ECMC_ENC_ABS_BITS\u0026quot;, \u0026quot;12\u0026quot;) # Absolute bit count (for absolute encoders) always least significant part of ECMC_ENC_BITS epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_HIGH_LIM_SINGLE_TURN_ABS = 22, Axis moves forward until high limit switch and stops Axis moves backward untill limit switch change state Axis stops Homing is performed. The multi turn bits will be homed to the value of ECMC_HOME_POS also consiering a offset of turns defined in ECMC_HOME_LATCH_COUNT_OFFSET. Note: Only the multi turn bits are updated!\nSome additional parameters are important for this homing sequence should work (example):\nepicsEnvSet(\u0026quot;ECMC_ENC_BITS\u0026quot; \u0026quot;25\u0026quot;) # Total bit count of encoder raw data epicsEnvSet(\u0026quot;ECMC_ENC_ABS_BITS\u0026quot;, \u0026quot;12\u0026quot;) # Absolute bit count (for absolute encoders) always least significant part of ECMC_ENC_BITS epicsEnvSet(\u0026quot;ECMC_HOME_LATCH_COUNT_OFFSET\u0026quot;,\u0026quot;2\u0026quot;) # Number of over/under-flow for home (home seq 11,12,21,22) ECMC_SEQ_HOME_SET_POS_2 = 25, (setPosition) Sequence 25 is the same as 15 but not blocked by motor record. The sequence will just set a new position of the encoder without any movement.\nECMC_SEQ_HOME_TRIGG_EXTERN = 26 Trigger external homing sequence in drive.\n Optional: set drive mode to homing (and wait for mode readback) Set trigg of homing (bit) Wait for homing ready (bit). Reference the ecmc encoder object on rising edge of the homing reday bit Optional: Change drive mode back to motion (and wait for mode readback) Optional: Init post move if configured Currently used for smaract: smaracat example In this exmaple also the drive modes is automatically handled by ecmc.\nsetting polarity of home sensor For some of the sequenceses it could be usefull to change the polarity of the home sensor. That can be done with the follwoing command:\n\u0026quot;Cfg.SetAxisMonHomeSwitchPolarity(int axisIndex, int polarity)\u0026quot;; # polarity==0 is NC (default) # polarity==1 is NO "},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisplc/","title":"PLC","tags":[],"description":"","content":"Introduction Each axis can have a native PLC. This PLC can be e.g. used for interlocking or synchronisation. The axis PLC is part of the yaml config. The code can be provided inline or in a separate file.\ninline plc: enable: yes externalCommands: yes code: - ax3.enc.actpos:=(ax1.enc.actpos+ax2.enc.actpos)/2 filter: velocity: enable: yes size: 100 trajectory: enable: yes size: 100 file plc: enable: yes externalCommands: yes file: cfg/heave.plc filter: velocity: enable: yes size: 100 trajectory: enable: yes size: 100 This is the respective plc file\nax${AXIS_NO}.enc.actpos:=(ax{{ var.ty1 }}.enc.actpos+ax{{ var.ty2 }}.enc.actpos)/2; Note the mixed use to MACROs ${AXIS_NO} and local variables {{ var.ty1 }} to boost flexibility.\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/","title":"best practice","tags":[],"description":"","content":"best Practice Here you can find some best practice configurations for common usecases. The complete examples with starup files can be found here\nstepper and BISS-C An example configuration of a EL7041-0052 and a EL5042. The complete example with starup file can be found here\nservo An example configuration of a Ex72xx servo drive with AM8xxx motor. The complete example with starup file can be found here\n"},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis_unset/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/empty/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/source/startup/","title":"","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/categories/","title":"Categories","tags":[],"description":"","content":""},{"uri":"https://paulscherrerinstitute.github.io/ecmccfg/tags/","title":"Tags","tags":[],"description":"","content":""}] \ No newline at end of file diff --git a/index.xml b/index.xml index d8b402847..cf6fdc196 100644 --- a/index.xml +++ b/index.xml @@ -1,8 +1,8 @@ -ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/Recent content on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 10:31:28 +0000build at PSIhttps://paulscherrerinstitute.github.io/ecmccfg/manual/build/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/build/These instructions only work at PSI! +ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/Recent content on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 11:53:19 +0000build at PSIhttps://paulscherrerinstitute.github.io/ecmccfg/manual/build/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/build/These instructions only work at PSI! Build at PSI, using driver.makefile by default this module is only build for RHEL7 and Epics >=R7.0.5 -build on login cluster make [LIBVERSION] [clean] [uninstall] install check a particular version check the module loads for version dev, Epics R7+ and ECMC version dev, note MASTER_ID=-1 which runs ECMC in master-less mode. Make proper adjustments to match your needs in terms of versions.addAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/description Script for adding axis EPICS PVs. +build on login cluster make [LIBVERSION] [clean] [uninstall] install check a particular version check the module loads for version dev, Epics R7+ and ECMC version dev, note MASTER_ID=-1 which runs ECMC in master-less mode. Make proper adjustments to match your needs in terms of versions.addAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/description Script for adding axis EPICS PVs. details Adds an motion axis. -author Niko KiveladdDataStorage.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/description Script for adding dataStorage. +author Niko KiveladdDataStorage.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/description Script for adding dataStorage. details Adds dataStorage buffer. author Anders Sandstroem paramters DS_SIZE Size of data buffer. @@ -11,17 +11,17 @@ DS_TYPE (optional), default 0, 0: Normal Buffer, 1: Ring Buffer, 2: FIFO Buffer SAMPLE_RATE_MS (optional), default 1 DS_DEBUG (optional), default 0, 0: No debug printouts, 1: Debug printouts Example calls: -call for 1000 elements at 10 Hz ${SCRIPTEXEC} ${ecmccfg_DIR}addDataStorage.cmd "DS_ID=1, DS_SIZE=1000, SAMPLE_RATE_MS=100"addDomain.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/description Script for adding an EtherCAT domain. +call for 1000 elements at 10 Hz ${SCRIPTEXEC} ${ecmccfg_DIR}addDataStorage.cmd "DS_ID=1, DS_SIZE=1000, SAMPLE_RATE_MS=100"addDomain.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/description Script for adding an EtherCAT domain. details Adds an EtherCAt domain. author Anders Sandström paramters EXE_RATE (optional) Execution rate [cycles] defaults 0 (same EC_RATE) EXE_OFFSET (optional) Execution offset cycles [cycles] defaults 0 ALLOW_OFFLINE (optional) Allow domain to be offline defaults 0 -All EtherCAT entries generated after this command will be assignedaddEcDataItem.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/description Script for adding a ethercat data item. +All EtherCAT entries generated after this command will be assignedaddEcDataItem.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/description Script for adding a ethercat data item. details The ethercat data item allows for accessing alreday configured ethercat domain data in a flexible -author Anders SandströmaddEcSdoRT.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/description Script for adding asyn SDO object (access to SDO:s in realtime) +author Anders SandströmaddEcSdoRT.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/description Script for adding asyn SDO object (access to SDO:s in realtime) details Add SDO for async access during realtime operation -author Anders SandströmaddEncoder.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/description Script for adding an extra encoder to an axis. +author Anders SandströmaddEncoder.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/description Script for adding an extra encoder to an axis. details Adds an encoder to the last configured axis. author Niko Kivel paramters CONFIG configuration file, i.e. ./cfg/axis_1_enc_2.enc @@ -29,12 +29,12 @@ DEV (optional) device name, i.e. MOTOR1 CLEAR_VARS_CMD (optional) Set to “empty” for not clear env vars (if vars needed for later use). CFG_MACROS (optional) Substitution macros for config file Example call: -${SCRIPTEXEC} ${ecmccfg_DIR}addEncoder.cmd, "CONFIG=./cfg/linear_1_enc_3.enc"addMaster.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/description Script for claiming a particular master. +${SCRIPTEXEC} ${ecmccfg_DIR}addEncoder.cmd, "CONFIG=./cfg/linear_1_enc_3.enc"addMaster.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/description Script for claiming a particular master. details Claims an EtherCAT master. author Niko Kivel paramters MASTER_ID (optional) master ID as shown by ethercat master. Example calls: -call w/o MASTER_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd call w/ MASTER_ID, which claims the 4th master. ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd, "MASTER_ID=3"addSlave.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/description Script for adding a slave to the EtherCAT bus configuration. +call w/o MASTER_ID ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd call w/ MASTER_ID, which claims the 4th master. ${SCRIPTEXEC} ${ecmccfg_DIR}addMaster.cmd, "MASTER_ID=3"addSlave.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/description Script for adding a slave to the EtherCAT bus configuration. details Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. For some/most slaves also a default author Niko Kivel paramters HW_DESC Hardware descriptor, i.e. EL1008 @@ -42,32 +42,32 @@ SLAVE_ID (optional) bus position SUBST_FILE (optional) substitution file P_SCRIPT (optional) naming convention prefix script NELM (optional) Used for oversampling cards. Defaults to 1 -DEFAULT_SUBS (optional) option to disble default PVs for mapped PDOsaddSlaveKL.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/description Script for adding a KL slave to the EtherCAT bus configuration of KL type. +DEFAULT_SUBS (optional) option to disble default PVs for mapped PDOsaddSlaveKL.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/description Script for adding a KL slave to the EtherCAT bus configuration of KL type. details Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. For some/most slaves also a default author Anders Sandstrom paramters HW_DESC Hardware descriptor, i.e. KL2032 SLAVE_ID EtherCAT bus position of the BK1250 (or similar terminal) -SLAVE_ID_KL KL-Bus index in two digit hex starting at zero for the first slave after BK1250 (or similar terminal)addVirtualAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/description Script for adding axis EPICS PVs. +SLAVE_ID_KL KL-Bus index in two digit hex starting at zero for the first slave after BK1250 (or similar terminal)addVirtualAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/description Script for adding axis EPICS PVs. details Adds an virtual axis with PVs. -author Niko KivelapplyAxisSynchronization.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/description Script for applying axis synchronization +author Niko KivelapplyAxisSynchronization.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/description Script for applying axis synchronization details Adds synchronization parameters to an axis provided by CONFIG. author Niko Kivel paramters CONFIG configuration file, i.e. ./cfg/linear_1.sax CLEAR_VARS_CMD (optional) Set to “empty” for not clear env vars (if needed vars for later use). Example call: -${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, "CONFIG=./cfg/linear_1.sax"applyConfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/description Script for applying bus configuration. +${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, "CONFIG=./cfg/linear_1.sax"applyConfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/description Script for applying bus configuration. details Applies the EtherCAT configuration and caluclates data offsets in the process image. author Niko Kivel Example call: -${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cfgapplySlaveConfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/description Script for applying a specific slave configuration after the slave had been added manually. +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cfgapplySlaveConfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/description Script for applying a specific slave configuration after the slave had been added manually. details Apply configurations to a slave. author Niko Kivel Example call: call applySlaveConfig with CONFIG ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, "CONFIG=-Motor-Nanotec-ST4118L1804-B" call applySlaveConfig with LOCAL_CONFIG -${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, "LOCAL_CONFIG=./myFancyServoConfig.cfg"applySlaveDCconfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/description Script for applying dc config to slave +${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, "LOCAL_CONFIG=./myFancyServoConfig.cfg"applySlaveDCconfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/description Script for applying dc config to slave details Apply dc configurations to a slave. -author Anders SandstroemapplySubstitutions.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/description Script for applying substitution file +author Anders SandstroemapplySubstitutions.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/description Script for applying substitution file details Applies substitution from ${SUBST_FILE} with ${P_SCRIPT} author Niko Kivel paramters SUBST_FILE (optional) substitution file @@ -75,22 +75,22 @@ ECMC_P PV prefix P_SCRIPT (optional) naming convention prefix script NELM (optional) Used for oversampling cards. Defaults to 1 Example calls: -call w/o SLAVE_ID ${SCRIPTEXEC} "${ECMC_CONFIG_ROOT}applySubstitutions.cmd" "SUBST_FILE=${SUBST_FILE=ecmc${ECMC_EC_HWTYPE}.substitutions},ECMC_P=${ECMC_P}"applyTemplate.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/description Script for applying a template +call w/o SLAVE_ID ${SCRIPTEXEC} "${ECMC_CONFIG_ROOT}applySubstitutions.cmd" "SUBST_FILE=${SUBST_FILE=ecmc${ECMC_EC_HWTYPE}.substitutions},ECMC_P=${ECMC_P}"applyTemplate.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/description Script for applying a template details Applies template from ${TEMPLATE_FILE} with ${P_SCRIPT}, PARAMS can be passed author Niko Kivel paramters TEMPLATE_FILE template file ECMC_P PV prefix PARAMS (optional) additional parameters Example calls: -call w/o SLAVE_ID ${SCRIPTEXEC} "${ECMC_CONFIG_ROOT}applyTemplate.cmd" "TEMPLATE_FILE=ecmcEcSlave.template,ECMC_P=${ECMC_P}"chkOverSampFactOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/description Validates requested oversampling factor +call w/o SLAVE_ID ${SCRIPTEXEC} "${ECMC_CONFIG_ROOT}applyTemplate.cmd" "TEMPLATE_FILE=ecmcEcSlave.template,ECMC_P=${ECMC_P}"chkOverSampFactOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/description Validates requested oversampling factor details Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC -author Anders SandstroemchkOverSampTimeOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/description Validates the resulting sampling time for oversampling slaves. +author Anders SandstroemchkOverSampTimeOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/description Validates the resulting sampling time for oversampling slaves. details Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time. -author Anders SandstroemchkValidCurrentSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/description Validates current settings +author Anders SandstroemchkValidCurrentSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/description Validates current settings details Checks if requested run current and standby current is less than max current and larger than 0. -author Anders SandstroemchkValidVoltageSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/description Validates requested voltage +author Anders SandstroemchkValidVoltageSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/description Validates requested voltage details Ensure requested nominal voltage is less than max voltage and larger than 0 -author Anders SandstroemconfigureAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/description Script for adding an axis with configuration. +author Anders SandstroemconfigureAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/description Script for adding an axis with configuration. details Adds an axis to the configuration and applies parameters provided by CONFIG. author Niko Kivel paramters CONFIG configuration file, i.e. ./cfg/linear_1.pax @@ -98,84 +98,84 @@ DEV (optional) device name, i.e. MOTOR1 CLEAR_VARS_CMD (optional) Set to “empty” for not clear env vars (if vars needed for later use). CFG_MACROS (optional) Substitution macros for config file Example call: -${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, "CONFIG=./cfg/linear_1.pax"configureSlave.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/description Script for adding a slave with dedicated slave configuration to the EtherCAT bus configuration. +${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, "CONFIG=./cfg/linear_1.pax"configureSlave.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/description Script for adding a slave with dedicated slave configuration to the EtherCAT bus configuration. details Adds the respective hardware to the bus configuration, adds specific and default PV to the EPICS database. Applies a specific slave configuration. author Niko Kivel paramters HW_DESC Hardware descriptor, i.e. EL7037 CONFIG configuration file, i.e. -Motor-Nanotec-ST4118L1804-B -The CONFIG together with the HW_DESC form the full filename which by definition is ecmc${HW_DESC}${CONFIG}.cmd, i.e.: ecmcEL7037-Motor-Nanotec-ST4118L1804-B.configureVirtualAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/description Script for adding a virtual axis with configuration. +The CONFIG together with the HW_DESC form the full filename which by definition is ecmc${HW_DESC}${CONFIG}.cmd, i.e.: ecmcEL7037-Motor-Nanotec-ST4118L1804-B.configureVirtualAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/description Script for adding a virtual axis with configuration. details Adds a virtual axis to the configuration and applies parameters provided by CONFIG. author Niko Kivel paramters CONFIG configuration file, i.e. ./cfg/linear_11.vax DEV (optional) device name, i.e. GAP CLEAR_VARS_CMD (optional) Set to “empty” for not clear env vars (if needed vars for later use). Example call: -${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, "CONFIG=./cfg/linear_11.vax"ecmc_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/description Script for adding axis related EPICS PVs. +${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, "CONFIG=./cfg/linear_11.vax"ecmc_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/description Script for adding axis related EPICS PVs. details Adds motorRecord to the IOC. author Anders Sandstroem -This script is typically called by \b addAxis.cmdecmc_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/description Script for configuring a physical axis. +This script is typically called by \b addAxis.cmdecmc_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/description Script for configuring a physical axis. details Configures a physical axis in ECMC, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b addAxis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_diag.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/description Script for adding axis diagnostic EPICS PVs. +This script is typically called by \b addAxis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_diag.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/description Script for adding axis diagnostic EPICS PVs. details Adds diagnostic PVs to the IOC. -author Anders Sandstroemecmc_axis_mr.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/description Script for loading motor record related databases +author Anders Sandstroemecmc_axis_mr.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/description Script for loading motor record related databases details Script for loading motor record related databases and creating motor record axis object author Anders Sandstroem -This script is typically called by \b ecmc_axis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_sync.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/description Script for configuring axis synchronization +This script is typically called by \b ecmc_axis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_sync.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/description Script for configuring axis synchronization details Configures ECMC for axis synchronization, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b applyAxisSynchronization.cmdecmc_enc-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/description Script for adding encoder related EPICS PVs. +This script is typically called by \b applyAxisSynchronization.cmdecmc_enc-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/description Script for adding encoder related EPICS PVs. details Script for adding an encoder to a previously created axis. author Anders Sandstroem -This script is typically called by \b addAxis.cmdecmc_enc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/description Script for adding an extra encoder +This script is typically called by \b addAxis.cmdecmc_enc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/description Script for adding an extra encoder details Configures a encoder object in ECMC, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b addEncoder.cmdecmc_virt_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/description Script for adding axis related EPICS PVs. +This script is typically called by \b addEncoder.cmdecmc_virt_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/description Script for adding axis related EPICS PVs. details Adds motorRecord to the IOC. author Anders Sandstroem -This script is typically called by \b addVirtualAxis.cmdecmc_virt_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/description Script for configuring a virtual axis. +This script is typically called by \b addVirtualAxis.cmdecmc_virt_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/description Script for configuring a virtual axis. details Configures a virtual axis in ECMC, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b addVirtualAxis.cmd, often via \b ecmc_virt_axis-records.cmdecmcClassicNaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/description Script for defining ${ECMC_PREFIX} +This script is typically called by \b addVirtualAxis.cmd, often via \b ecmc_virt_axis-records.cmdecmcClassicNaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/description Script for defining ${ECMC_PREFIX} details Gathers relevant information about MasterID, SlaveID, … to create naming convention compliant PREFIX -author Niko KivelecmcESSnaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/description Script for defining ${ECMC_P} +author Niko KivelecmcESSnaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/description Script for defining ${ECMC_P} details Gathers relevant information about MasterID, SlaveID, … to create naming convention compliant PREFIX -author Niko KivelecmcmXsXXX.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/description Script for defining ${ECMC_P} +author Niko KivelecmcmXsXXX.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/description Script for defining ${ECMC_P} details Gathers relevant information about MasterID, SlaveID, … to create naming convention compliant PREFIX -author Niko Kivelfinalize.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/description Script for finalizing. Executed just before iocInit (atInit) +author Niko Kivelfinalize.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/description Script for finalizing. Executed just before iocInit (atInit) details Script for finalizing. Executed just before iocInit (atInit). -author Anders Sandströmgeneral.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/general/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/description Add general PVs +author Anders Sandströmgeneral.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/general/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/description Add general PVs details Script for adding general and master diagnostics EPICS PVs -author Niko Kivel, Anders SandstroemgeneralDiagnostics.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/description Script for general diagnostics +author Niko Kivel, Anders SandstroemgeneralDiagnostics.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/description Script for general diagnostics details Script for setting default diagnostics -author Niko Kivel, Anders Sandstroeminit.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/init/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/description Initialization script +author Niko Kivel, Anders Sandstroeminit.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/init/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/description Initialization script details Script for setting up the basic EPICS environment. -author Niko Kivel, Anders SandstroeminitAll.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/description Init main script +author Niko Kivel, Anders SandstroeminitAll.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/description Init main script details Script for setting up the basic EPICS environment. -author Niko Kivel, Anders SandstroeminitAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/description init axis environment +author Niko Kivel, Anders SandstroeminitAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/description init axis environment details Script for setting up the basic AXIS environment. -author Niko Kivel, Anders SandstroemissueWarning.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/description Issue a warning +author Niko Kivel, Anders SandstroemissueWarning.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/description Issue a warning details Generic verification script for expressions -author Anders SandstroemloadAxisPLCFile.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/description Script for adding a PLC from file. +author Anders SandstroemloadAxisPLCFile.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/description Script for adding a PLC from file. details Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable. author Niko Kivel paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc AX_ID (optional) Ax number, default 0 PLC_MACROS (optional) Substitution macros for PLC code TMP_PATH (optional) directory to dump the temporary plc file after macro substitution -PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).loadPLCFile.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/description Script for adding a PLC from file. +PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)).loadPLCFile.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/description Script for adding a PLC from file. details Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable. author Niko Kivel, Anders Sandström paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc PLC_ID (optional) PLC number, default 0, or to next free PLC, the actual PLC Id is stored in ECMC_PLC_ID and can be used after this command SAMPLE_RATE_MS (optional) excecution rate, default 1000/EC_RATE -PLC_MACROS (optional) Substitution macros for PLC code.loadPLCLib.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/description Script for loading a PLC from lib from file. +PLC_MACROS (optional) Substitution macros for PLC code.loadPLCLib.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/description Script for loading a PLC from lib from file. details Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable. author Anders Sandström paramters FILE PLC definition file, i.e. ./plc/homeSlit.plc PLC_ID (optional) PLC number, default last loaded PLC PLC_MACROS (optional) Substitution macros for PLC code. The macros “SELF_ID”,“SELF”,M_ID, and M are reserved: -INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ‘:').loadPlugin.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/description Script for loading a ecmc plugin from file. +INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ‘:').loadPlugin.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/description Script for loading a ecmc plugin from file. details Loads a ecmc-plugin from file. author Anders Sandström paramters FILE Filename of plugin shared lib (./ecmcPlugin_Advanced.so) @@ -183,55 +183,51 @@ PLUGIN_ID Id of plugin to load CONFIG (optional) Configuration string sent to plugin at construct REPORT (optional) Printout information of loaded plugin if set to “1” Example call: -${SCRIPTEXEC} ${ecmccfg_DIR}loadPlugin.cmd, "PLUGIN_ID=0,FILE=./ecmcPlugin_Advanced.so,CONFIG='PLUGIN CONFIGS GO HERE 'loadSubstAxes.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/description Script for adding multiple axes based on subst and template file +${SCRIPTEXEC} ${ecmccfg_DIR}loadPlugin.cmd, "PLUGIN_ID=0,FILE=./ecmcPlugin_Advanced.so,CONFIG='PLUGIN CONFIGS GO HERE 'loadSubstAxes.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/description Script for adding multiple axes based on subst and template file details Configure multiple axes by using subst file author Anders Sandström -${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstAxes.cmd, "FILE=./ax.subs"loadSubstConfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/description Script for loading complete ecmc cfg based on subst files and templates +${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstAxes.cmd, "FILE=./ax.subs"loadSubstConfig.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/description Script for loading complete ecmc cfg based on subst files and templates details Loads complete ecmc cfg based on subst files and templates author Anders Sandström -${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=./cfg.subs"loadSubstHw.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/description Script for adding multiple hw based on subst and template file +${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=./cfg.subs"loadSubstHw.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/description Script for adding multiple hw based on subst and template file details Loads hw cfg based on subst files and templates author Anders Sandström -${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstHw.cmd, "FILE=./hw.subs"loadYamlAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/description Script for loading Axis from yaml file via jinja2 +${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstHw.cmd, "FILE=./hw.subs"loadYamlAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/description Script for loading Axis from yaml file via jinja2 details adds an Axis, based on a yaml config file author Niko Kivel, Anders Sandström paramters FILE the yaml-file containing the PLC definition DEV the device name (optional, defaults to ${IOC} Example calls: -call ${SCRIPTEXEC} "./loadYamlAxis.cmd" "FILE=./axis1.yaml" ${SCRIPTEXEC} "./loadYamlAxis.cmd" "FILE=./axis1.yaml, DEV=foobar"loadYamlEnc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/description Script for adding Encoder from yaml file via jinja2 +call ${SCRIPTEXEC} "./loadYamlAxis.cmd" "FILE=./axis1.yaml" ${SCRIPTEXEC} "./loadYamlAxis.cmd" "FILE=./axis1.yaml, DEV=foobar"loadYamlEnc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/description Script for adding Encoder from yaml file via jinja2 details adds an encoder to an axis, based on a yaml config file author Anders Sandström paramters FILE the yaml-file containing the PLC definition DEV the device name (optional, defaults to ${IOC} Example calls: -call ${SCRIPTEXEC} "./loadYamlEnc.cmd" "FILE=./enc.yaml" ${SCRIPTEXEC} "./loadYamlEnc.cmd" "FILE=./enc.yaml, DEV=foobar"loadYamlPlc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/description Script for loading PLC from yaml file via jinja2 +call ${SCRIPTEXEC} "./loadYamlEnc.cmd" "FILE=./enc.yaml" ${SCRIPTEXEC} "./loadYamlEnc.cmd" "FILE=./enc.yaml, DEV=foobar"loadYamlPlc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/description Script for loading PLC from yaml file via jinja2 details adds a PLC, line by line, from a yaml-file, parsed by jinja2 author Niko Kivel, Anders Sandström paramters FILE the yaml-file containing the PLC definition Example calls: -call ${SCRIPTEXEC} "./loadYamlPlc.cmd" "FILE=./plc1.yaml"restoreRecordUpdateRate.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/description Restores record update rate to what was defined in startup.cmd +call ${SCRIPTEXEC} "./loadYamlPlc.cmd" "FILE=./plc1.yaml"restoreRecordUpdateRate.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/description Restores record update rate to what was defined in startup.cmd details Restores record update rate to what was defined in startup.cmd -author Anders SandströmsetAppMode.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/description Script for switching to operational mode. +author Anders SandströmsetAppMode.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/description Script for switching to operational mode. details Validates configuration, starts realtime thread and checks EtherCAT slaves are in OP. -author Niko KivelsetDiagnostics.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/description Script for enabling default diagnostics. +author Niko KivelsetDiagnostics.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/description Script for enabling default diagnostics. details Set some default values to diagostics -author Niko KivelsetRecordUpdateRate.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/description Script for changing record update rate +author Niko KivelsetRecordUpdateRate.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/description Script for changing record update rate details Update record processing rate, all records created after this command will be updated in the specified rate. -author Anders SandströmslaveVerify.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/description ** script for slave verification and optional reset** +author Anders SandströmslaveVerify.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/description ** script for slave verification and optional reset** details will verify the slave identity and reset by writing to 0x1011, optionally read firmwre version from 0x100a author Niko Kivel -MacrosverifyOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/description Generic verification script +MacrosverifyOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/description Generic verification script details Generic verification script for expressions author Anders Sandstroemintroductionhttps://paulscherrerinstitute.github.io/ecmccfg/manual/introduction/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/introduction/Principle EtherCAT requires the field bus components (slaves) to be configured on the master. The master must know about the data exchanges with the slaves, this is referred to as process image. During IOC-startup, the requested configuration is validated against the actually present hardware on the bus. Mismatches will result in an error, the IOC will not start. -Blindly restarting the IOC, with only partially working EtherCAT hardware, will results in an inoperable IOC!generalhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/general/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/general/culprit From experience, very few issues are related to the EtherCAT hardware itself. Mostly the cabling or the actual motor/encoder hardware is to blame. -Even more likely is human error, such as: -wrong scaling of the axis writing to the wrong hardware (forgot to select the right slave in the axis config) … check the status Before anything is restarted or power cycled, check the status of the system.ethercat command line interfacehttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/ethercat CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. The most common commands will be explained here. +Blindly restarting the IOC, with only partially working EtherCAT hardware, will results in an inoperable IOC!ethercat command line interfacehttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/ethercat CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. The most common commands will be explained here. ethercat master This will show the state of all masters on the respective host. The command will show the state of all masters. To limit the command to a single master, make use of the -m parameter. -The -m parameter is available to all ethercat commands, and is even require by some in case of multiple masters.ecmc serverhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Topics latency issues latency issues High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to: -The generic device driver is used High load on system … generic device driver is used Check which driver is in use by running (on the ecmc server):motionhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/Topics both_limits error position lag error, (following error), tuning latency issues drive refuse to enable both_limits error The “BOTH_LIMITS” error can be related to that limits switches are not powered with 24V. As standard at PSI, limts are feed from 24V outputs, normally an EL2819 terminal. Basically the ouptputs needs then to be set to 1 in order to power the switches. Check the schematics in order to find out which output that powers the switches for a certain axis and then use one the following approaches to set it to 1:EL5042https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/Topics No reading Diagnostics Offset LSB Bit [Bit] (0x80p8:17) SSI No reading Could be caused by: -Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). Bad electrical connection Wrong power supply Defect encoder or EL5042 Long cabling lengths Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading “Diagnostics”.modeshttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/ecmc modes ecmc can be started in different modes by setting the MODE parameter to startup.cmd (or require ecmccfg): +The -m parameter is available to all ethercat commands, and is even require by some in case of multiple masters.best practicehttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/best_practice/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/best_practice/EtherCAT rate (EC_RATE) The default EtherCAT frame rate in ecmc is set to 1kHz. For most applications this is however not needed and can therefore be reduced. A reduced EtherCAT rate reduces the load on the controller. In general, a good value for the frame rate is in the range 100Hz to 1kHz. For motion systems, a frame rate of 100Hz..500Hz is normally enough. Rates ouside the 100Hz..1kHz range is normally not a good idea, and some slaves might not support it.motionhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/Topics both_limits error position lag error, (following error), tuning latency issues drive refuse to enable both_limits error The “BOTH_LIMITS” error can be related to that limits switches are not powered with 24V. As standard at PSI, limts are feed from 24V outputs, normally an EL2819 terminal. Basically the ouptputs needs then to be set to 1 in order to power the switches. Check the schematics in order to find out which output that powers the switches for a certain axis and then use one the following approaches to set it to 1:modeshttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/ecmc modes ecmc can be started in different modes by setting the MODE parameter to startup.cmd (or require ecmccfg): FULL DAQ NO_MR A separate mode for commissioning is also available, called ENG_MODE. mode==FULL (default) In FULL mode all ecmc functionalities are supported, like motion, daq and plcs. Example of starting ecmc in FULL mode: @@ -244,13 +240,17 @@ Indent with 2 spaces. introduction python 3.x is required The config is processed by a python script with a jinja2 backend. The processor will complain if mandatory keys are missing. Likewise, missing optional keys are populated with default values.data storage bufferhttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/data storage examples This dir contains two examples: here. Continiously add value to data storage. Push to epics by hw trigger. Continiously add value to data storage. Push to epics by epics pv trigger. Data buffered data can be accessed by the “IOC_TEST:ds0-Data-Act” waveform pv (NELM 10000) Custom scale and offset can be applied to the stored values by MACROS (to the plc) in the startup file. -1 push to epics by hw trigger In this example the data stored in dataStorage 0 is pushed to epics at a falling edge of the axis 1 high limit.tuninghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/EL70x1 Tuning For EL70x1 stepper drives the following parameters can be tuned: +1 push to epics by hw trigger In this example the data stored in dataStorage 0 is pushed to epics at a falling edge of the axis 1 high limit.generalhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/general/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/general/culprit From experience, very few issues are related to the EtherCAT hardware itself. Mostly the cabling or the actual motor/encoder hardware is to blame. +Even more likely is human error, such as: +wrong scaling of the axis writing to the wrong hardware (forgot to select the right slave in the axis config) … check the status Before anything is restarted or power cycled, check the status of the system.tuninghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/EL70x1 Tuning For EL70x1 stepper drives the following parameters can be tuned: 8011:07 Ka factor 8011:08 Kd factor 8011:01 Kp factor 8011:02 Ki factor 8011:07 Ka and 8011:08 Kd factor: 8011:07 Ka factor / 8011:08 Kd factor are “current boosts” during acceleration/deceleration. Default they are set to 100% which is way too high for most applications. Start by setting these parameters to 0. -8011:01 Kp and 8011:02 Ki factor: This is the current loop settings and this is also what affect the performance.function libshttps://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/function libs Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command takes these parameters: +8011:01 Kp and 8011:02 Ki factor: This is the current loop settings and this is also what affect the performance.ecmc serverhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Topics latency issues EtherCAT rate (EC_RATE) latency issues High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to: +The generic device driver is used High load on system … generic device driver is used Check which driver is in use by running (on the ecmc server):function libshttps://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/function libs Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command takes these parameters: FILE PLC: definition file, i.e. ./plc/homeSlit.plc PLC_ID: (optional) PLC number, default last loaded PLC PLC_MACROS: (optional) Substitution macros for PLC code. The macros “SELF_ID”,“SELF”,M_ID, and M are reserved: “SELF_ID” = PLC Id of this plc “SELF” = “plc${SELF_ID}” “M_ID” = EtherCAT master ID “M” = “ec${M_ID}” INC: (optional) List of directories for include files to pass to MSI (if several paths then divide with ‘:').iocsh utilitieshttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/ECMC Iocsh Utilities Iocsh function “ecmcEpicsEnvSetCalc()” “ecmcEpicsEnvSetCalc()” is used to evaluate expressions and set result to EPCIS environment variables. Usefull for calculate: slave offsets sdo/pdo adresses (also in hex) scalings in motion record fields … ecmcEpicsEnvSetCalc -h Use "ecmcEpicsEnvSetCalc(<envVarName>, <expression>, <format>)" to evaluate the expression and assign the variable. <envVarName> : EPICS environment variable name. <expression> : Calculation expression (see exprTK for available functionality). Examples: Simple expression:"5.5+${TEST_SCALE}*sin(${TEST_ANGLE}/10)". Use of "RESULT" variable: "if(${TEST_VAL}>5){RESULT:=100;}else{RESULT:=200;};".manual motionhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/manual/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/manual/force manual motion This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are not obeyed! YOU HAVE BEEN WARNED! In case the hardware is fine, the cables are checked, human error is mostly excluded, or the system used to work but doesn’t work any longer, directly writing to the drive is possible. -For this however, the IOC needs to be reconfigured to not link the hardware to an axis!EL70x1https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/Topics Diagnostics Tuning Diagnostics If the drive is in error or warning state, further information about the reason for the warning/error can be read from the drive terminal by using the ethercat command. See command line interface for more info. +For this however, the IOC needs to be reconfigured to not link the hardware to an axis!EL5042https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/Topics No reading Diagnostics Offset LSB Bit [Bit] (0x80p8:17) SSI No reading Could be caused by: +Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). Bad electrical connection Wrong power supply Defect encoder or EL5042 Long cabling lengths Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading “Diagnostics”.EL70x1https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/Topics Diagnostics Tuning Diagnostics If the drive is in error or warning state, further information about the reason for the warning/error can be read from the drive terminal by using the ethercat command. See command line interface for more info. In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. The diagnostic data can be read from register Index A010 STM Diag data Ch.best practicehttps://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/best_practice/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/best_practice/best practice Here you can find some best practice configurations for common usecases. Macros MSI include, substitute Printouts The complete examples with starup files can be found here diff --git a/manual/build/index.html b/manual/build/index.html index 5f9172a4a..f5e3f75c0 100644 --- a/manual/build/index.html +++ b/manual/build/index.html @@ -1,7 +1,7 @@ -build at PSI :: ecmccfg

    check a particular version

    check the module loads for version dev, Epics R7+ and ECMC version dev, note MASTER_ID=-1 which runs ECMC in master-less mode. Make proper adjustments to match your needs in terms of versions.

    iocsh -7 -r "ecmccfg,dev 'ECMC_VER=dev,MASTER_ID=-1'"
     
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/general_cfg/best_practice/index.html b/manual/general_cfg/best_practice/index.html new file mode 100644 index 000000000..78492db8c --- /dev/null +++ b/manual/general_cfg/best_practice/index.html @@ -0,0 +1,12 @@ +best practice :: ecmccfg

    best practice

    EtherCAT rate (EC_RATE)

    The default EtherCAT frame rate in ecmc is set to 1kHz. For most applications this is however not needed and can therefore be reduced. A reduced EtherCAT rate reduces the load on the controller. In general, a good value for the frame rate is in the range 100Hz to 1kHz. For motion systems, a frame rate of 100Hz..500Hz is normally enough. Rates ouside the 100Hz..1kHz range is normally not a good idea, and some slaves might not support it. However, in special cases both lower and higher rates might be possible and required.

    Example: Set rate to 500Hz

    require ecmccfg "EC_RATE=500"
    +...
    +

    For more information see the chapter startup.cmd.

    As a comparison, TwinCAT default EtherCAT rates are:

    • 100Hz for PLC
    • 500Hz for motion

    See ecmc_server for more information.

    ecmc server setup

    • If possible, make sure you use the native igb ethercat driver.

    For more information see:

    \ No newline at end of file diff --git a/manual/general_cfg/data_storage/index.html b/manual/general_cfg/data_storage/index.html index cd583cc69..f028573e8 100644 --- a/manual/general_cfg/data_storage/index.html +++ b/manual/general_cfg/data_storage/index.html @@ -1,8 +1,8 @@ -data storage buffer :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/general_cfg/ecmc_command_ref/index.html b/manual/general_cfg/ecmc_command_ref/index.html index 6a0a00349..6f7e23c6c 100644 --- a/manual/general_cfg/ecmc_command_ref/index.html +++ b/manual/general_cfg/ecmc_command_ref/index.html @@ -1,10 +1,10 @@ -ecmc command reference :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/general_cfg/index.html b/manual/general_cfg/index.html index cf25ce520..8b394ec6b 100644 --- a/manual/general_cfg/index.html +++ b/manual/general_cfg/index.html @@ -1,11 +1,11 @@ -general :: ecmccfg
    \ No newline at end of file +ecmccfg > manual > general
    \ No newline at end of file diff --git a/manual/general_cfg/index.xml b/manual/general_cfg/index.xml index a14bfd2fa..dd4fc938a 100644 --- a/manual/general_cfg/index.xml +++ b/manual/general_cfg/index.xml @@ -1,4 +1,4 @@ -general on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/Recent content in general on ecmccfgHugo -- gohugo.ioen-usdata storage bufferhttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/data storage examples This dir contains two examples: here. +general on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/Recent content in general on ecmccfgHugo -- gohugo.ioen-usbest practicehttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/best_practice/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/best_practice/EtherCAT rate (EC_RATE) The default EtherCAT frame rate in ecmc is set to 1kHz. For most applications this is however not needed and can therefore be reduced. A reduced EtherCAT rate reduces the load on the controller. In general, a good value for the frame rate is in the range 100Hz to 1kHz. For motion systems, a frame rate of 100Hz..500Hz is normally enough. Rates ouside the 100Hz..1kHz range is normally not a good idea, and some slaves might not support it.data storage bufferhttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/data storage examples This dir contains two examples: here. Continiously add value to data storage. Push to epics by hw trigger. Continiously add value to data storage. Push to epics by epics pv trigger. Data buffered data can be accessed by the “IOC_TEST:ds0-Data-Act” waveform pv (NELM 10000) Custom scale and offset can be applied to the stored values by MACROS (to the plc) in the startup file. 1 push to epics by hw trigger In this example the data stored in dataStorage 0 is pushed to epics at a falling edge of the axis 1 high limit.iocsh utilitieshttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/ECMC Iocsh Utilities Iocsh function “ecmcEpicsEnvSetCalc()” “ecmcEpicsEnvSetCalc()” is used to evaluate expressions and set result to EPCIS environment variables. Usefull for calculate: slave offsets sdo/pdo adresses (also in hex) scalings in motion record fields … ecmcEpicsEnvSetCalc -h Use "ecmcEpicsEnvSetCalc(<envVarName>, <expression>, <format>)" to evaluate the expression and assign the variable. <envVarName> : EPICS environment variable name. <expression> : Calculation expression (see exprTK for available functionality). Examples: Simple expression:"5.5+${TEST_SCALE}*sin(${TEST_ANGLE}/10)". Use of "RESULT" variable: "if(${TEST_VAL}>5){RESULT:=100;}else{RESULT:=200;};".ecmc command referencehttps://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/ecmc_command_ref/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/ecmc_command_ref/ecmc command reference ethercat motion general misc plc \ No newline at end of file diff --git a/manual/general_cfg/iocsh_utils/index.html b/manual/general_cfg/iocsh_utils/index.html index 9b54fa971..751465c3c 100644 --- a/manual/general_cfg/iocsh_utils/index.html +++ b/manual/general_cfg/iocsh_utils/index.html @@ -1,8 +1,8 @@ -iocsh utilities :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/general_cfg/startup/index.html b/manual/general_cfg/startup/index.html index e497f8259..85d0810db 100644 --- a/manual/general_cfg/startup/index.html +++ b/manual/general_cfg/startup/index.html @@ -1,14 +1,14 @@ -startup.cmd :: ecmccfg

    startup.cmd

    startup.cmd

    startup.cmd takes the following arguments:

     Arguments
    +ecmccfg > manual > general > startup.cmd

    startup.cmd

    startup.cmd

    startup.cmd takes the following arguments:

     Arguments
      [optional]
      ECMC_VER          = 9.5.4
      EthercatMC_VER    = 3.0.2 (obsolete)
    @@ -43,6 +43,5 @@
      ECMC_SAMPLE_RATE_MS    = current record update rate in milli seconds
      ECMC_SAMPLE_RATE_MS_ORIGINAL = ECMC_SAMPLE_RATE_MS (used for restore to default if ECMC_SAMPLE_RATE_MS is changed)
     

    Normally these arguments are set when the module is required:

    require ecmccfg "ENG_MODE=1,MASTER_ID=2"
    -

    set mode

    A very powerful tool is provided through the command line. -See a summary, incl. some examples of what possible here.

    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/general_cfg/startup/modes/index.html b/manual/general_cfg/startup/modes/index.html index fb4672d58..feb016708 100644 --- a/manual/general_cfg/startup/modes/index.html +++ b/manual/general_cfg/startup/modes/index.html @@ -1,9 +1,9 @@ -modes :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/index.html b/manual/index.html index e7ca2a1d9..87be9a8c7 100644 --- a/manual/index.html +++ b/manual/index.html @@ -1,8 +1,8 @@ -manual :: ecmccfg

    ecmccfg

    A configuration framework for ECMC Motion Control Module for EPICS.

    Purpose

    The configuration framework contains the necessary files to configure an EPICS IOC for EtherCAT based motion control and DAQ.


    Topics


    provided common user commands

    • addAxis.cmd
    • addDataStorage.cmd
    • addMaster.cmd
    • addSlave.cmd
    • addSlaveKL.cmd
    • addVirtualAxis.cmd
    • applyAxisSynchronization.cmd
    • applyConfig.cmd
    • applySlaveConfig.cmd
    • configureAxis.cmd
    • configureSlave.cmd
    • configureVirtualAxis.cmd
    • loadPLCFile.cmd
    • loadPlugin.cmd
    • setAppMode.cmd
    • setDiagnostics.cmd

    Example IOC

    1. require the configuration module with optional version
    require ecmccfg <VERSION>
    @@ -40,4 +40,4 @@
     
    • yaml definition, with classic PLC-file, Note: file key in yaml config will overwrite anything in the code key!
    ${SCRIPTEXEC} "${ECMC_CONFIG_ROOT}loadYamlPlc.cmd" "FILE=./plc1File.yaml, ECMC_TMPDIR=/tmp/"
     
    1. go active
    ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd
     
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/introduction/index.html b/manual/introduction/index.html index 41a44d9ad..89b17333b 100644 --- a/manual/introduction/index.html +++ b/manual/introduction/index.html @@ -1,7 +1,7 @@ -introduction :: ecmccfg
    • yaml definition, with classic PLC-file, Note: file key in yaml config will overwrite anything in the code key!
    ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd "FILE=./plc1File.yaml"
     

    go active

    ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd
     
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/knowledgebase/ethercatcli/index.html b/manual/knowledgebase/ethercatcli/index.html index b700f1f88..7570ccbff 100644 --- a/manual/knowledgebase/ethercatcli/index.html +++ b/manual/knowledgebase/ethercatcli/index.html @@ -1,8 +1,8 @@ -ethercat command line interface :: ecmccfg
    0x03e8 1000
     

    ethercat download

    With this command the value of a register can be set on the slave.

    If the type is not explicitly given, first issue ethercat -p <slaveID> sdos. This will allow implicit type handling.

    Example: Set value of register 0x8010, sub-register 0x07 from slave 7 to 314.

    ethercat download  -m0 -p7 0x8010 0x07 314
    -

    ethercat states

    With this command a specific state of a slave can be forced, or at least an attempt to enter the specific state is made.

    This is helpful when a slave is stuck, e.g. with an error. Rather than cycle the power of the entire controller, the slave can be set to ‘REBOOT’. This might be enough to recover.

    Alternatively, cycling to ‘INIT’ and back to ‘OP’ might also be attempted.

    A power cycling of the of the EtherCAT components is the last resort!

    \ No newline at end of file +

    ethercat states

    With this command a specific state of a slave can be forced, or at least an attempt to enter the specific state is made.

    This is helpful when a slave is stuck, e.g. with an error. Rather than cycle the power of the entire controller, the slave can be set to ‘REBOOT’. This might be enough to recover.

    Alternatively, cycling to ‘INIT’ and back to ‘OP’ might also be attempted.

    A power cycling of the of the EtherCAT components is the last resort!

    \ No newline at end of file diff --git a/manual/knowledgebase/general/index.html b/manual/knowledgebase/general/index.html deleted file mode 100644 index e515fad5a..000000000 --- a/manual/knowledgebase/general/index.html +++ /dev/null @@ -1,14 +0,0 @@ -general :: ecmccfg

    general


    culprit

    From experience, very few issues are related to the EtherCAT hardware itself. -Mostly the cabling or the actual motor/encoder hardware is to blame.

    Even more likely is human error, such as:

    • wrong scaling of the axis
    • writing to the wrong hardware (forgot to select the right slave in the axis config)

    check the status

    Before anything is restarted or power cycled, check the status of the system.

    A simple way to get an overview of the entire ecmc system is to start the ecmcMain.ui panel. This panel contains, or links to, almost the entire ecmc IOC:

    • thread status
    • EtherCAT master status
    • EtherCAT slaves status (overview of all configured slaves)
    • motion axes (all axes in the system are reachable)
    • PLC:s
    caqtdm -macro "IOC=<iocname>" ecmcMain.ui
    -

    Remember, red is not necessarily a bad sign! -It can also indicate that certain channels are not connected. -Whether those channels should be connected is beyond the scope of this guide.

    Next step is to diagnose from a dedicated shell, or from within the iocsh.

    If all slaves are in ‘OP’ state, at least data is exchanged between the hardware and the master.

    restarting the IOC

    Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!!

    Check the hardware BEFORE restarting the IOC!

    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/el5042/index.html b/manual/knowledgebase/hardware/el5042/index.html index 130b103eb..e5e835817 100644 --- a/manual/knowledgebase/hardware/el5042/index.html +++ b/manual/knowledgebase/hardware/el5042/index.html @@ -1,13 +1,13 @@ -EL5042 :: ecmccfg

    EL5042



    Topics

    1. No reading
    2. Diagnostics
    3. Offset LSB Bit [Bit] (0x80p8:17)
    4. SSI

    No reading

    Could be caused by:

    • Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice).
    • Bad electrical connection
    • Wrong power supply
    • Defect encoder or EL5042
    • Long cabling lengths

    Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading “Diagnostics”.

    Bad electrical connection

    The serial communication is hanled by two RS422 channels, one for the clock and one for data. These channels can be measured with a scope:

    • The clock should output periodic “bursts” with clock pulses with a short break in between. The bursts should appear in the same rate as the ethercat frame rate (EC_RATE, default 1kHz). And the frequency of the clock pulses should correspond with the setting in your startup script (normally 250kHz..10Mhz depending on configuration)
    • The data channel should return bits in sync with the clock pulses.

    Lack of clock or data pulses could be caused by (in order of probability):

    1. short circuit or error in cabling
    2. defect/burt encoder
    3. No/wrong power supply
    4. defect EL5042 (if lack of clock pulses)

    Wrong power supply

    Make sure the encoder is powered with the correct voltage. Most encoders require 5V, but there are also some that require 9V, 12V or 24V.

    Never apply a higher voltage than the specified operating voltage for the encoder.

    The EL5042 can supply 5V or 9V. The default setting is 5V and in order to change the setting to 9V a special sequence need to be executed (see EL5042 manual).

    After ensuring that the encoder is correctly supplied, the verify the power consumption of the encoder and compare with the specified consumption. If the power consumption does not match, the encoder might be broken or a faulty cabling.

    Long cable lengths

    Long cable lengths can affect both power supply levels and the serial data channels.

    Power supply:

    Longer cables will normally also result in a higher voltage drops. Especaillay for 5V encoders this can be an issue. Make sure that the voltage are within the specified range by measuring the voltage level close to the encoder.

    If the voltage is to low (mainly for 5V encoders):

    1. Can cabling length be reduced
    2. Can cable impedance be reduced (higher area)
    3. Add a separate (5V) power supply with possabilities to adjust the voltage level to a slightly higher voltage. Make sure the voltage is not too high at the encoder end.

    Serial communication: +ecmccfg > manual > knowledge base > hardware > EL5042

    EL5042



    Topics

    1. No reading
    2. Diagnostics
    3. Offset LSB Bit [Bit] (0x80p8:17)
    4. SSI

    No reading

    Could be caused by:

    • Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice).
    • Bad electrical connection
    • Wrong power supply
    • Defect encoder or EL5042
    • Long cabling lengths

    Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading “Diagnostics”.

    Bad electrical connection

    The serial communication is hanled by two RS422 channels, one for the clock and one for data. These channels can be measured with a scope:

    • The clock should output periodic “bursts” with clock pulses with a short break in between. The bursts should appear in the same rate as the ethercat frame rate (EC_RATE, default 1kHz). And the frequency of the clock pulses should correspond with the setting in your startup script (normally 250kHz..10Mhz depending on configuration)
    • The data channel should return bits in sync with the clock pulses.

    Lack of clock or data pulses could be caused by (in order of probability):

    1. short circuit or error in cabling
    2. defect/burt encoder
    3. No/wrong power supply
    4. defect EL5042 (if lack of clock pulses)

    Wrong power supply

    Make sure the encoder is powered with the correct voltage. Most encoders require 5V, but there are also some that require 9V, 12V or 24V.

    Never apply a higher voltage than the specified operating voltage for the encoder.

    The EL5042 can supply 5V or 9V. The default setting is 5V and in order to change the setting to 9V a special sequence need to be executed (see EL5042 manual).

    After ensuring that the encoder is correctly supplied, the verify the power consumption of the encoder and compare with the specified consumption. If the power consumption does not match, the encoder might be broken or a faulty cabling.

    Long cable lengths

    Long cable lengths can affect both power supply levels and the serial data channels.

    Power supply:

    Longer cables will normally also result in a higher voltage drops. Especaillay for 5V encoders this can be an issue. Make sure that the voltage are within the specified range by measuring the voltage level close to the encoder.

    If the voltage is to low (mainly for 5V encoders):

    1. Can cabling length be reduced
    2. Can cable impedance be reduced (higher area)
    3. Add a separate (5V) power supply with possabilities to adjust the voltage level to a slightly higher voltage. Make sure the voltage is not too high at the encoder end.

    Serial communication: The serial communication is also affected by the cable legth. For long cable lengths a reduction of the clock rate can be needed. The clock rate can be reduced by setting the CLK_FRQ_KHZ macro in the call to applyComponent.cmd (set clock freq. to 500kHz):

    ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,MACROS='CLK_FRQ_KHZ=500'"
     

    For EL5042 the following rates are availble:

    • 10 MHz
    • 5 MHz
    • 3.33 MHz
    • 2.5 MHz default for some encoders
    • 2 MHz
    • 1 MHz Max for SSI and default for some encoders
    • 500 kHz
    • 250 kHz

    NOTE: The closest freq. equal or higher than CLK_FRQ_KHZ will be selected.

    Diagnostics

    The diagnostic data can be read from register Index A0p8 FB BiSS-C Diag data (for Ch.1, p = 0; Ch.2, p = 1):

    The ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics:

    bash read_el5042_diag.sh <master_id> <slave_id> <channel_id>
     

    NOTE: The channel id starts at 0. First encoder channel is 0.

    Example: master 1, slave 14, channel 0

    # first login to ecmc server
    @@ -30,10 +30,10 @@
     0x0000000000000000 0
     
     #########################################################
    -

    Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics.

    Offset LSB Bit [Bit] (0x80p8:17)

    When using the LSB offset, the same amount of ones (“1”) will be shifted in as MSB. Therefore the LSB offset should normally not be used.

    When using the LSB offset setting, the same amout of bits needs to be subtracted from the ST_BITS or MT_BITS

    Example: 26bit RLS, no LSB offset

    ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,OFF_BITS=0"
    +

    Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics.

    Offset LSB Bit [Bit] (0x80p8:17)

    When using the LSB offset, the same amount of ones (“1”) will be shifted in as MSB. Therefore the LSB offset should normally not be used.

    When using the LSB offset setting, the same amout of bits needs to be subtracted from the ST_BITS or MT_BITS

    Example: 26bit RLS, no LSB offset

    ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,OFF_BITS=0"
     

    Example: 26bit RLS with 3 bits offset (ST_BITS=23, OFF_BITS=0)

    #If the offset is needed then the sum of the bit's still need to match the bitcount of the encoder. Example: Offset 3 LSB bits, set ST_BITS=23 (26-3)
     ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-BISS-C,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=23,CLK_FRQ_KHZ=1000,OFF_BITS=3"
    -

    SSI

    • The entire SSI frame needs to covered in MT_BITS and ST_BITS (also status bits and startup bits), also see “Offset LSB Bit” above.
    • Enabling status bits by SDO (0x80p8:02) will not work, seems only valid for BISS-C (kind of hints this in manual).

    If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning).

    Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28)

    ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=28,CLK_FRQ_KHZ=1000,CODING=0"
    +

    SSI

    • The entire SSI frame needs to covered in MT_BITS and ST_BITS (also status bits and startup bits), also see “Offset LSB Bit” above.
    • Enabling status bits by SDO (0x80p8:02) will not work, seems only valid for BISS-C (kind of hints this in manual).

    If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning).

    Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28)

    ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=28,CLK_FRQ_KHZ=1000,CODING=0"
     

    Some SSI encoders, i.e. Posital kit SSI, also send startup bits. These also needs to be accounted for in the ST_BITS and MT_BITS.

    Example: Posital kit SSI encoder, KCD-S1X3B-1617-IE4F-GRQ

    # Specs:
     #    Single turn bits 17
     #    Multiturn bits: 16
    @@ -44,4 +44,4 @@
     #     ST_BITS=17 + 2 = 19  (single trun bits + status bits) 
     ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=24,ST_BITS=19"
     

    The status bits can then be masked away by:

    1. Using the LSB offset (set to 2 and reduce ST_BITS to 26), then the status bits are shifted away already in EL5042 hardware. Then you cannot access the status bits (to use from PLC or for interlock)
    2. Setting a mask in axis yaml file (encoder.mask: 0xFFFFFFC), in this case the encoder.absBits should not be used because it’s automatically calculated by the mask command. Then you can reach the bits in the raw encoder value.
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/el70x1/index.html b/manual/knowledgebase/hardware/el70x1/index.html index 5bbdf2243..bc4a3926b 100644 --- a/manual/knowledgebase/hardware/el70x1/index.html +++ b/manual/knowledgebase/hardware/el70x1/index.html @@ -1,9 +1,9 @@ -EL70x1 :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/el9xxx/index.html b/manual/knowledgebase/hardware/el9xxx/index.html index 8fafc5d53..ffef7b32f 100644 --- a/manual/knowledgebase/hardware/el9xxx/index.html +++ b/manual/knowledgebase/hardware/el9xxx/index.html @@ -1,11 +1,11 @@ -EL9xxx :: ecmccfg

    EL9xxx



    Topics

    1. over current protection
    2. passive terminals

    over current protection

    In the standard setup at PSI over current protection modules are used to feed 24V to both the EtherCAT communication bus (E-bus) and the power bus of the EtherCAT slaves. If the over current protection is not enabled then the EtherCAT slaves will not receive power.

    First time, (and only first time), a system is in use, the overcurrent modules needs to be enabled in order to allow current to flow. Enabling is done by push buttons in the LED area of the module. The long horizontal LEDs are in fact buttons that can be used to activate or tripp the over current protection.

    Before pressing the buttons, check the electrical drawings. Make sure it’s safe to power on the system.

    el9221-5000

    The EL9221-5000 has one channel and therefore only the top button is needed to be pressed.

    el9227-5500

    The EL9227-5500 is a 2 channel module and normally both channels needs to be enabled by pressing both the top and bottom long LED. if only one are pressed it could result in that the power to the communication is fine but the power to the i/o bus is lacking. This can result in starnge issues. Both EL9227-5500 and EL9221-5000 have dedicated panels whre status of the over current protection can be seen.

    passive terminals

    Some terminals are passive. Passive terminals are not EtherCAT slaves and do not communicate over EtherCAT (not equipped with EtherCAT slave controller). Passive terminals are normally used to simplify electrical connections (avoiding external terminals). For instance for distributing potential, 24V and 0V, an EL9184 can be used (8Ch 24V and 8Ch 0V).

    The passive terminals will not show up as an EtherCAT slave when issueing the “ethercat slaves” command. However, they are normally visible in the electrical drawings. This could result in that the slave id in the electrical drawing is NOT corresponding to the EtherCAT slave index used when configuring ecmc. In worst case this could lead to that the wrong hardware/drive is configured.

    When configuring ecmc, make sure the EtherCAT slave index is correct, do not blindly trust the electrical drawings since and passive terminal could introduce an shift in the slave indices.

    \ No newline at end of file +ecmccfg > manual > knowledge base > hardware > EL9xxx

    EL9xxx



    Topics

    1. over current protection
    2. passive terminals

    over current protection

    In the standard setup at PSI over current protection modules are used to feed 24V to both the EtherCAT communication bus (E-bus) and the power bus of the EtherCAT slaves. If the over current protection is not enabled then the EtherCAT slaves will not receive power.

    First time, (and only first time), a system is in use, the overcurrent modules needs to be enabled in order to allow current to flow. Enabling is done by push buttons in the LED area of the module. The long horizontal LEDs are in fact buttons that can be used to activate or tripp the over current protection.

    Before pressing any button, check the electrical drawings and make sure it’s safe to power on the system.

    el9221-5000

    The EL9221-5000 has one channel and therefore only the top button is needed to be pressed.

    el9227-5500

    The EL9227-5500 is a 2 channel module and normally both channels needs to be enabled by pressing both the top and bottom long LED. if only one are pressed it could result in that the power to the communication is fine but the power to the i/o bus is lacking. This can result in starnge issues. Both EL9227-5500 and EL9221-5000 have dedicated panels whre status of the over current protection can be seen.

    passive terminals

    Some terminals are passive. Passive terminals are not EtherCAT slaves and do not communicate over EtherCAT (not equipped with EtherCAT slave controller). Passive terminals are normally used to simplify electrical connections (avoiding external terminals). For instance for distributing potential, 24V and 0V, an EL9184 can be used (8Ch 24V and 8Ch 0V).

    The passive terminals will not show up as an EtherCAT slave when issueing the “ethercat slaves” command. However, they are normally visible in the electrical drawings. This could result in that the slave id in the electrical drawing is NOT corresponding to the EtherCAT slave index used when configuring ecmc. In worst case this could lead to that the wrong hardware/drive is configured.

    When configuring ecmc, make sure the EtherCAT slave index is correct, do not blindly trust the electrical drawings since a passive terminal could introduce an shift in the slave indices.

    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/general/index.html b/manual/knowledgebase/hardware/general/index.html new file mode 100644 index 000000000..d160a63a0 --- /dev/null +++ b/manual/knowledgebase/hardware/general/index.html @@ -0,0 +1,15 @@ +general :: ecmccfg

    general


    culprit

    From experience, very few issues are related to the EtherCAT hardware itself. +Mostly the cabling or the actual motor/encoder hardware is to blame.

    Even more likely is human error, such as:

    • wrong scaling of the axis
    • writing to the wrong hardware (forgot to select the right slave in the axis config)

    check the status

    Before anything is restarted or power cycled, check the status of the system.

    A simple way to get an overview of the entire ecmc system is to start the ecmcMain.ui panel. This panel contains, or links to, almost the entire ecmc IOC:

    • thread status
    • EtherCAT master status
    • EtherCAT slaves status (overview of all configured slaves)
    • motion axes (all axes in the system are reachable)
    • PLC:s
    caqtdm -macro "IOC=<iocname>" ecmcMain.ui
    +

    Remember, red is not necessarily a bad sign! +It can also indicate that certain channels are not connected. +Whether those channels should be connected is beyond the scope of this guide.

    Next step is to diagnose from a dedicated shell, or from within the iocsh.

    If all slaves are in ‘OP’ state, at least data is exchanged between the hardware and the master.

    restarting the IOC

    Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!!

    Check the hardware BEFORE restarting the IOC!

    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/host/index.html b/manual/knowledgebase/hardware/host/index.html index 10a7fec52..e2c29b478 100644 --- a/manual/knowledgebase/hardware/host/index.html +++ b/manual/knowledgebase/hardware/host/index.html @@ -1,24 +1,27 @@ -ecmc server :: ecmccfg

    ecmc server



    Topics

    1. latency issues

    latency issues

    High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to:

    1. The generic device driver is used
    2. High load on system

    generic device driver is used

    Check which driver is in use by running (on the ecmc server):

    lsmod | grep ec_
    +ecmccfg > manual > knowledge base > hardware > ecmc server

    ecmc server



    Topics

    1. latency issues
    2. EtherCAT rate (EC_RATE)

    latency issues

    High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to:

    1. The generic device driver is used
    2. High load on system

    generic device driver is used

    Check which driver is in use by running (on the ecmc server):

    lsmod | grep ec_
     

    If the ec_master is using the ec_generic driver then a switch to igb driver is recommended.

    The file /ioc/hosts/<hostname>/cfg/ETHERCATDRVR is listing the available drivers.

    The recommended contents of the ETHERCATDRVR file is:

    DEVICE_MODULES="igb generic"
     

    In this case, the system will first try to use igb driver, if not possible it will fallback to the generic driver. After editing the file, the host needs to be rebooted in order for the changes to take effect.

    high load on system

    ** Reduce sample rate** Reducing the ethercat cycle time is often very effichient when it comes to reduce latency. Do not run the ecmc systems faster than needed. The default ecmc sample rate is 1Khz, which in many cases is not needed.

    The sample rate is defined when require ecmccfg (example set to 500Hz, instead of 1kHz):

    require ecmccfg "EC_RATE=500"
    -

    There are some restrictions on the sample rate. Normally, a rate in the range 100Hz-1Khz is a good choice. For other rates, please check the documentation of slaves in use.

    ** Affinity** +

    There are some restrictions on the sample rate. Normally, a rate in the range 100Hz-1Khz is a good choice. For other rates, please check the documentation of slaves in use. See heading “EtherCAT rate” below for more information.

    ** Affinity** Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has.

    At PSI, core 0 is always isolated, do not move any threads to core 0.

    In order to pin the ecmc thread to a single core, add the following line to the startup script (after setAppMode.cmd):

    #- go active (create ecmc_rt)
     ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd
     
     #- Set affinity of ecmc_rt (core 5)
     epicsThreadSetAffinity ecmc_rt 5
     

    If more than one ecmc ioc is running on the server, then make sure the ecmc_rt threads run on differnt cores.

    Also other threads might take a lot of resources, for instace the epics thread “cbLow”:

    afterInit "epicsThreadSetAffinity cbLow 6"
    -

    cbLow is created at iocInit, therefore the “epicsThreadSetAffinity” must be executed with the “afterInit” command.

    \ No newline at end of file +

    cbLow is created at iocInit, therefore the “epicsThreadSetAffinity” must be executed with the “afterInit” command.

    EtherCAT rate (EC_RATE)

    The default EtherCAT frame rate in ecmc is set to 1kHz. For most applications this is however not needed and can therefore be reduced. A reduced EtherCAT rate reduces the load on the controller. In general, a good value for the frame rate is in the range 100Hz to 1kHz. For motion systems, a frame rate of 100Hz..500Hz is normally enough. Rates ouside the 100Hz..1kHz range is normally not a good idea, and some slaves might not support it. However, in special cases both lower and higher rates might be possible and required.

    Example: Set rate to 500Hz

    require ecmccfg "EC_RATE=500"
    +...
    +

    For more information see the chapter descriping startup.cmd.

    As a comparison, TwinCAT default EtherCAT rates are:

    • 100Hz for PLC
    • 500Hz for motion

    Lower rates

    Issues that could occour in rates below 100Hz:

    • triggering of slave watchdogs
    • issues with dc clock syncs (DC capabale slaves normally performes best with at a rate of atleast 500Hz)
    • some slaves might not support it

    Higher rates

    Issues that could occour in rates over 1000Kz:

    • missed frames
    • issues with dc clock syncs
    • some slaves might not support it.

    NOTE: Some slave might support a high rate but could have built in signal filters of several ms which then makes sampling at higher freqs unneccesarry/not needed.

    In order to successfully run an ecmc ethercat system at higher rates some tuning might be needed:

    • minimize slave count (and ensure that the slaves support it)
    • minimize amount of processing (PLC, motion)
    • use a performant host/controller
    • use native ethercat driver (igb, not generic)
    • only transfer the needed PVs to epics.
    • affinity: Use a dedicated core for the ecmc_rt thread and move other high prio threads to other cores. see “high load on system +" above.
    • consider use of more than one domain
    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/index.html b/manual/knowledgebase/hardware/index.html index fa9846c43..cba7c4761 100644 --- a/manual/knowledgebase/hardware/index.html +++ b/manual/knowledgebase/hardware/index.html @@ -1,12 +1,12 @@ -hardware :: ecmccfg
    \ No newline at end of file +ecmccfg > manual > knowledge base > hardware
    \ No newline at end of file diff --git a/manual/knowledgebase/hardware/index.xml b/manual/knowledgebase/hardware/index.xml index e759824bc..35eb6ef59 100644 --- a/manual/knowledgebase/hardware/index.xml +++ b/manual/knowledgebase/hardware/index.xml @@ -1,4 +1,6 @@ -hardware on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/Recent content in hardware on ecmccfgHugo -- gohugo.ioen-usecmc serverhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Topics latency issues latency issues High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to: +hardware on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/Recent content in hardware on ecmccfgHugo -- gohugo.ioen-usgeneralhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/general/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/general/culprit From experience, very few issues are related to the EtherCAT hardware itself. Mostly the cabling or the actual motor/encoder hardware is to blame. +Even more likely is human error, such as: +wrong scaling of the axis writing to the wrong hardware (forgot to select the right slave in the axis config) &hellip; check the status Before anything is restarted or power cycled, check the status of the system.ecmc serverhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/Topics latency issues EtherCAT rate (EC_RATE) latency issues High latency, more than 10% of the ethercat cycle time, can in worse case result, in lost ethercat frames, which of course is not an ideal situation. High latency of the ecmc_rt thread can be related to: The generic device driver is used High load on system &hellip; generic device driver is used Check which driver is in use by running (on the ecmc server):EL5042https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/Topics No reading Diagnostics Offset LSB Bit [Bit] (0x80p8:17) SSI No reading Could be caused by: Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). Bad electrical connection Wrong power supply Defect encoder or EL5042 Long cabling lengths Always start troubleshooting by checking the error, warning and ready bits and reading the EL5042 manual. Next step is to read the diagnostic SDO bits of the EL5042, see below under heading &ldquo;Diagnostics&rdquo;.EL70x1https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/Topics Diagnostics Tuning Diagnostics If the drive is in error or warning state, further information about the reason for the warning/error can be read from the drive terminal by using the ethercat command. See command line interface for more info. In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. diff --git a/manual/knowledgebase/index.html b/manual/knowledgebase/index.html index e74b5f5e9..5d5ff4bdf 100644 --- a/manual/knowledgebase/index.html +++ b/manual/knowledgebase/index.html @@ -1,13 +1,13 @@ -knowledge base :: ecmccfg

    knowledge base


    Topics

    troubleshooting

    Due to the complexity an EtherCAT bus topology can assume, troubleshooting can be challenging. This guide should provide the basic means to diagnose simple errors and is by no means complete!

    general problems

    For general issues, a very short troubleshooting guide is provided here.

    command line interface

    A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible here.

    motion

    For motion related issues, a very short troubleshooting guide is provided here.

    drive tuning

    Tune drive control loops

    hardware

    For hardware related issues, a very short troubleshooting guide is provided here.

    manual motion

    Trigger manual motion (without motion ecmc-axis).

    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/knowledgebase/index.xml b/manual/knowledgebase/index.xml index 8de9e2eac..9fb81a5c3 100644 --- a/manual/knowledgebase/index.xml +++ b/manual/knowledgebase/index.xml @@ -1,6 +1,4 @@ -knowledge base on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/Recent content in knowledge base on ecmccfgHugo -- gohugo.ioen-usgeneralhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/general/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/general/culprit From experience, very few issues are related to the EtherCAT hardware itself. Mostly the cabling or the actual motor/encoder hardware is to blame. -Even more likely is human error, such as: -wrong scaling of the axis writing to the wrong hardware (forgot to select the right slave in the axis config) &hellip; check the status Before anything is restarted or power cycled, check the status of the system.ethercat command line interfacehttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/ethercat CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. The most common commands will be explained here. +knowledge base on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/Recent content in knowledge base on ecmccfgHugo -- gohugo.ioen-usethercat command line interfacehttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/ethercat CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. The most common commands will be explained here. ethercat master This will show the state of all masters on the respective host. The command will show the state of all masters. To limit the command to a single master, make use of the -m parameter. The -m parameter is available to all ethercat commands, and is even require by some in case of multiple masters.motionhttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/Topics both_limits error position lag error, (following error), tuning latency issues drive refuse to enable both_limits error The &ldquo;BOTH_LIMITS&rdquo; error can be related to that limits switches are not powered with 24V. As standard at PSI, limts are feed from 24V outputs, normally an EL2819 terminal. Basically the ouptputs needs then to be set to 1 in order to power the switches. Check the schematics in order to find out which output that powers the switches for a certain axis and then use one the following approaches to set it to 1:tuninghttps://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/Mon, 01 Jan 0001 00:00:00 +0000https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/EL70x1 Tuning For EL70x1 stepper drives the following parameters can be tuned: diff --git a/manual/knowledgebase/manual/index.html b/manual/knowledgebase/manual/index.html index c72c58737..2ba0b8256 100644 --- a/manual/knowledgebase/manual/index.html +++ b/manual/knowledgebase/manual/index.html @@ -1,10 +1,10 @@ -manual motion :: ecmccfg

    manual motion


    force manual motion

    This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are not obeyed! YOU HAVE BEEN WARNED!

    In case the hardware is fine, the cables are checked, human error is mostly excluded, or the system used to work but doesn’t work any longer, directly writing to the drive is possible.

    For this however, the IOC needs to be reconfigured to not link the hardware to an axis!

    1. Edit the startup script and comment out the axis, just leave the slave configuration.
    2. restart the IOC
    3. check the PVs for the drive in question (slave 7 in this case)
    4. dbgrep "*s007*"
    5. There should be two PVs ending with, -Drv01-Cmd and -Drv01-Spd
    6. Set -Drv01-Cmd to 1 and check the amplifier did enable, if you don’t know how to check for an enabled amplifier, you should not use this command!
    7. After the amplifier is engaged, write a small number to -Drv01-Spd. Dependinf on the scaling, the number might be in the range of 1..1000.
    8. Observe the encoder, or in case of open-loop, the device itself.
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/knowledgebase/motion/index.html b/manual/knowledgebase/motion/index.html index f22127984..63796a545 100644 --- a/manual/knowledgebase/motion/index.html +++ b/manual/knowledgebase/motion/index.html @@ -1,8 +1,8 @@ -motion :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/knowledgebase/tuning/index.html b/manual/knowledgebase/tuning/index.html index 0019415f6..942243b70 100644 --- a/manual/knowledgebase/tuning/index.html +++ b/manual/knowledgebase/tuning/index.html @@ -1,8 +1,8 @@ -tuning :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/axisplc/index.html b/manual/motion_cfg/axisplc/index.html index 904da3bc0..ab39de93b 100644 --- a/manual/motion_cfg/axisplc/index.html +++ b/manual/motion_cfg/axisplc/index.html @@ -1,8 +1,8 @@ -PLC :: ecmccfg

    This is the respective plc file

    ax${AXIS_NO}.enc.actpos:=(ax{{ var.ty1 }}.enc.actpos+ax{{ var.ty2 }}.enc.actpos)/2;
     

    Note the mixed use to MACROs ${AXIS_NO} and local variables {{ var.ty1 }} to boost flexibility.

    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/axisyaml/index.html b/manual/motion_cfg/axisyaml/index.html index 505d974fc..c277e8286 100644 --- a/manual/motion_cfg/axisyaml/index.html +++ b/manual/motion_cfg/axisyaml/index.html @@ -1,8 +1,8 @@ -yaml configuration :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/best_practice/index.html b/manual/motion_cfg/best_practice/index.html index 47563ae24..81a43ad41 100644 --- a/manual/motion_cfg/best_practice/index.html +++ b/manual/motion_cfg/best_practice/index.html @@ -1,10 +1,10 @@ -best practice :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/best_practice/servo/index.html b/manual/motion_cfg/best_practice/servo/index.html index 12812008a..e191f5d38 100644 --- a/manual/motion_cfg/best_practice/servo/index.html +++ b/manual/motion_cfg/best_practice/servo/index.html @@ -1,9 +1,9 @@ -servo motor (Ex72xx) :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/best_practice/stepper_biss_c/index.html b/manual/motion_cfg/best_practice/stepper_biss_c/index.html index 85b27981d..71db1043a 100644 --- a/manual/motion_cfg/best_practice/stepper_biss_c/index.html +++ b/manual/motion_cfg/best_practice/stepper_biss_c/index.html @@ -1,9 +1,9 @@ -stepper and biss-c :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/direction/index.html b/manual/motion_cfg/direction/index.html index 75bf98dc2..e3455a048 100644 --- a/manual/motion_cfg/direction/index.html +++ b/manual/motion_cfg/direction/index.html @@ -1,8 +1,8 @@ -direction of motion :: ecmccfg

    This will affect the motorRecord only, thus ECMC internally is still moving in the wrong direction. You have been warned!

    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/homing/index.html b/manual/motion_cfg/homing/index.html index 97b5a59c4..3af34f8f7 100644 --- a/manual/motion_cfg/homing/index.html +++ b/manual/motion_cfg/homing/index.html @@ -1,8 +1,8 @@ -homing :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/index.html b/manual/motion_cfg/index.html index 5a669a995..7d1d02d0d 100644 --- a/manual/motion_cfg/index.html +++ b/manual/motion_cfg/index.html @@ -1,9 +1,9 @@ -motion :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/motion_cfg/scaling/index.html b/manual/motion_cfg/scaling/index.html index 5316933b3..51a163634 100644 --- a/manual/motion_cfg/scaling/index.html +++ b/manual/motion_cfg/scaling/index.html @@ -1,8 +1,8 @@ -scaling :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/plc_cfg/best_practice/index.html b/manual/plc_cfg/best_practice/index.html index bf2247d97..016eec44f 100644 --- a/manual/plc_cfg/best_practice/index.html +++ b/manual/plc_cfg/best_practice/index.html @@ -1,8 +1,8 @@ -best practice :: ecmccfg

    The resulting code will toggle two different outputs, the state of the last output will be printed.

    NOTE: Macros cannot be used in the filename when including a file. Instead the dir should be defined in the INC param when loading the PLC, see above.

    printouts

    Adding a DBG macro can be usefull to be able to turn on/off printouts. Typically during commsioning it can be usefull to have many printouts but later when system goes into production, it could be a good idea to turn (some) printouts off.

    Example of a printout that can be turned on/off (default off)

    ${DBG=#}println('Value: ', ${M}.s${BO_S_ID}.binaryOutput${BO_CH});
     

    Will result in the below if setting the DBG='' (and some other macros, see above):

    println('Value: ', ec0.s10.binaryOutput01);
     
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/plc_cfg/function_libs/index.html b/manual/plc_cfg/function_libs/index.html index 7a3a5c114..7234493e8 100644 --- a/manual/plc_cfg/function_libs/index.html +++ b/manual/plc_cfg/function_libs/index.html @@ -1,8 +1,8 @@ -function libs :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/plc_cfg/index.html b/manual/plc_cfg/index.html index f854dae16..9dfe3b8d7 100644 --- a/manual/plc_cfg/index.html +++ b/manual/plc_cfg/index.html @@ -1,9 +1,9 @@ -PLC :: ecmccfg

    iocsh call

    ${SCRIPTEXEC} "${ECMC_CONFIG_ROOT}loadYamlPlc.cmd" "FILE=./plc1File.yaml, ECMC_TMPDIR=/tmp/"
     
    \ No newline at end of file +
    \ No newline at end of file diff --git a/manual/plc_cfg/syntax/index.html b/manual/plc_cfg/syntax/index.html index ed2216a7f..63a65b989 100644 --- a/manual/plc_cfg/syntax/index.html +++ b/manual/plc_cfg/syntax/index.html @@ -1,8 +1,8 @@ -syntax :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 1bc7a6ffd..3b32c10bf 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://paulscherrerinstitute.github.io/ecmccfg/manual/build/https://paulscherrerinstitute.github.io/ecmccfg/manual/https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/2024-09-27T10:31:28+00:00https://paulscherrerinstitute.github.io/ecmccfg/manual/introduction/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/general/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/stepper_biss_c/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/syntax/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisyaml/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/manual/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/best_practice/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/ecmc_command_ref/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el9xxx/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/scaling/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/servo/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/direction/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/homing/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisplc/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/empty/https://paulscherrerinstitute.github.io/ecmccfg/source/startup/https://paulscherrerinstitute.github.io/ecmccfg/categories/https://paulscherrerinstitute.github.io/ecmccfg/tags/ \ No newline at end of file +https://paulscherrerinstitute.github.io/ecmccfg/manual/build/https://paulscherrerinstitute.github.io/ecmccfg/manual/https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addaxis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddatastorage/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/adddomain/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecdataitem/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addecsdort/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addencoder/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addmaster/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslave/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addslavekl/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/addvirtualaxis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyaxissynchronization/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyconfig/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslaveconfig/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applyslavedcconfig/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applysubstitutions/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/applytemplate/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureaxis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configureslave/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/configurevirtualaxis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/finalize/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadaxisplcfile/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplcfile/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplclib/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadplugin/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstaxes/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubstconfig/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/loadsubsthw/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlaxis/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlenc/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/jinja2/loadyamlplc/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/motion/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/naming/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/restorerecordupdaterate/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setappmode/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setdiagnostics/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/setrecordupdaterate/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/slaveverify/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/2024-09-27T11:53:19+00:00https://paulscherrerinstitute.github.io/ecmccfg/manual/introduction/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/ethercatcli/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/best_practice/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/motion/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/startup/modes/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/stepper_biss_c/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/syntax/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisyaml/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/data_storage/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/general/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/tuning/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/host/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/function_libs/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/iocsh_utils/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/manual/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el5042/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el70x1/https://paulscherrerinstitute.github.io/ecmccfg/manual/plc_cfg/best_practice/https://paulscherrerinstitute.github.io/ecmccfg/manual/general_cfg/ecmc_command_ref/https://paulscherrerinstitute.github.io/ecmccfg/manual/knowledgebase/hardware/el9xxx/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/scaling/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/servo/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/direction/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/homing/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/axisplc/https://paulscherrerinstitute.github.io/ecmccfg/manual/motion_cfg/best_practice/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis_unset/https://paulscherrerinstitute.github.io/ecmccfg/source/scripts/empty/https://paulscherrerinstitute.github.io/ecmccfg/source/startup/https://paulscherrerinstitute.github.io/ecmccfg/categories/https://paulscherrerinstitute.github.io/ecmccfg/tags/ \ No newline at end of file diff --git a/source/general/chkoversampfactordie/index.html b/source/general/chkoversampfactordie/index.html index 4b781df02..26296bfeb 100644 --- a/source/general/chkoversampfactordie/index.html +++ b/source/general/chkoversampfactordie/index.html @@ -1,10 +1,10 @@ -chkOverSampFactOrDie.cmd :: ecmccfg

    chkOverSampFactOrDie.cmd

    description

    Validates requested oversampling factor

    details

    Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/chkoversamptimeordie/index.html b/source/general/chkoversamptimeordie/index.html index c8551819a..6602719ea 100644 --- a/source/general/chkoversamptimeordie/index.html +++ b/source/general/chkoversamptimeordie/index.html @@ -1,10 +1,10 @@ -chkOverSampTimeOrDie.cmd :: ecmccfg

    chkOverSampTimeOrDie.cmd

    description

    Validates the resulting sampling time for oversampling slaves.

    details

    Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time.

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/chkvalidcurrentsetordie/index.html b/source/general/chkvalidcurrentsetordie/index.html index 20fd44ba5..ed8ea6d90 100644 --- a/source/general/chkvalidcurrentsetordie/index.html +++ b/source/general/chkvalidcurrentsetordie/index.html @@ -1,10 +1,10 @@ -chkValidCurrentSetOrDie.cmd :: ecmccfg

    chkValidCurrentSetOrDie.cmd

    description

    Validates current settings

    details

    Checks if requested run current and standby current is less than max current and larger than 0.

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/chkvalidvoltagesetordie/index.html b/source/general/chkvalidvoltagesetordie/index.html index 8b3908296..0a587ada9 100644 --- a/source/general/chkvalidvoltagesetordie/index.html +++ b/source/general/chkvalidvoltagesetordie/index.html @@ -1,10 +1,10 @@ -chkValidVoltageSetOrDie.cmd :: ecmccfg

    chkValidVoltageSetOrDie.cmd

    description

    Validates requested voltage

    details

    Ensure requested nominal voltage is less than max voltage and larger than 0

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/general/index.html b/source/general/general/index.html index f3c71bf50..82ae16acc 100644 --- a/source/general/general/index.html +++ b/source/general/general/index.html @@ -1,10 +1,10 @@ -general.cmd :: ecmccfg

    general.cmd

    description

    Add general PVs

    details

    Script for adding general and master diagnostics EPICS PVs

    author

    Niko Kivel, Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/generaldiagnostics/index.html b/source/general/generaldiagnostics/index.html index c1fa6293c..edd9d0bcd 100644 --- a/source/general/generaldiagnostics/index.html +++ b/source/general/generaldiagnostics/index.html @@ -1,10 +1,10 @@ -generalDiagnostics.cmd :: ecmccfg

    generalDiagnostics.cmd

    description

    Script for general diagnostics

    details

    Script for setting default diagnostics

    author

    Niko Kivel, Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/index.html b/source/general/index.html index 54e58b4cc..ea2c90286 100644 --- a/source/general/index.html +++ b/source/general/index.html @@ -1,10 +1,10 @@ -general :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/index.xml b/source/general/index.xml index 517e0b6a8..e1439a49f 100644 --- a/source/general/index.xml +++ b/source/general/index.xml @@ -1,23 +1,23 @@ -general on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/general/Recent content in general on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 10:31:28 +0000chkOverSampFactOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/description Validates requested oversampling factor +general on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/general/Recent content in general on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 11:53:19 +0000chkOverSampFactOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversampfactordie/description Validates requested oversampling factor details Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC -author Anders SandstroemchkOverSampTimeOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/description Validates the resulting sampling time for oversampling slaves. +author Anders SandstroemchkOverSampTimeOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkoversamptimeordie/description Validates the resulting sampling time for oversampling slaves. details Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time. -author Anders SandstroemchkValidCurrentSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/description Validates current settings +author Anders SandstroemchkValidCurrentSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidcurrentsetordie/description Validates current settings details Checks if requested run current and standby current is less than max current and larger than 0. -author Anders SandstroemchkValidVoltageSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/description Validates requested voltage +author Anders SandstroemchkValidVoltageSetOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/chkvalidvoltagesetordie/description Validates requested voltage details Ensure requested nominal voltage is less than max voltage and larger than 0 -author Anders Sandstroemgeneral.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/general/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/description Add general PVs +author Anders Sandstroemgeneral.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/general/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/general/description Add general PVs details Script for adding general and master diagnostics EPICS PVs -author Niko Kivel, Anders SandstroemgeneralDiagnostics.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/description Script for general diagnostics +author Niko Kivel, Anders SandstroemgeneralDiagnostics.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/generaldiagnostics/description Script for general diagnostics details Script for setting default diagnostics -author Niko Kivel, Anders Sandstroeminit.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/init/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/description Initialization script +author Niko Kivel, Anders Sandstroeminit.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/init/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/init/description Initialization script details Script for setting up the basic EPICS environment. -author Niko Kivel, Anders SandstroeminitAll.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/description Init main script +author Niko Kivel, Anders SandstroeminitAll.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initall/description Init main script details Script for setting up the basic EPICS environment. -author Niko Kivel, Anders SandstroeminitAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/description init axis environment +author Niko Kivel, Anders SandstroeminitAxis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/initaxis/description init axis environment details Script for setting up the basic AXIS environment. -author Niko Kivel, Anders SandstroemissueWarning.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/description Issue a warning +author Niko Kivel, Anders SandstroemissueWarning.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/issuewarning/description Issue a warning details Generic verification script for expressions -author Anders SandstroemverifyOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/description Generic verification script +author Anders SandstroemverifyOrDie.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/general/verifyordie/description Generic verification script details Generic verification script for expressions author Anders Sandstroem \ No newline at end of file diff --git a/source/general/init/index.html b/source/general/init/index.html index 176e5d871..104c7b4ff 100644 --- a/source/general/init/index.html +++ b/source/general/init/index.html @@ -1,10 +1,10 @@ -init.cmd :: ecmccfg

    init.cmd

    description

    Initialization script

    details

    Script for setting up the basic EPICS environment.

    author

    Niko Kivel, Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/initall/index.html b/source/general/initall/index.html index bda15cd7a..93e8b6b3d 100644 --- a/source/general/initall/index.html +++ b/source/general/initall/index.html @@ -1,10 +1,10 @@ -initAll.cmd :: ecmccfg

    initAll.cmd

    description

    Init main script

    details

    Script for setting up the basic EPICS environment.

    author

    Niko Kivel, Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/initaxis/index.html b/source/general/initaxis/index.html index 8e22d50a7..c7eee0396 100644 --- a/source/general/initaxis/index.html +++ b/source/general/initaxis/index.html @@ -1,10 +1,10 @@ -initAxis.cmd :: ecmccfg

    initAxis.cmd

    description

    init axis environment

    details

    Script for setting up the basic AXIS environment.

    author

    Niko Kivel, Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/issuewarning/index.html b/source/general/issuewarning/index.html index 96dfd05c0..ba3185f2e 100644 --- a/source/general/issuewarning/index.html +++ b/source/general/issuewarning/index.html @@ -1,10 +1,10 @@ -issueWarning.cmd :: ecmccfg

    issueWarning.cmd

    description

    Issue a warning

    details

    Generic verification script for expressions

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/general/verifyordie/index.html b/source/general/verifyordie/index.html index dbcff8775..a83937b9d 100644 --- a/source/general/verifyordie/index.html +++ b/source/general/verifyordie/index.html @@ -1,10 +1,10 @@ -verifyOrDie.cmd :: ecmccfg

    verifyOrDie.cmd

    description

    Generic verification script

    details

    Generic verification script for expressions

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/index.html b/source/index.html index 61dcbc5c9..c65d61fd2 100644 --- a/source/index.html +++ b/source/index.html @@ -1,9 +1,9 @@ -source :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/index.xml b/source/index.xml index d9f1ff0bd..b6e4ec769 100644 --- a/source/index.xml +++ b/source/index.xml @@ -1 +1 @@ -source on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/Recent content in source on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 10:31:28 +0000<link>https://paulscherrerinstitute.github.io/ecmccfg/source/startup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paulscherrerinstitute.github.io/ecmccfg/source/startup/</guid><description/></item></channel></rss> \ No newline at end of file +<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>source on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/Recent content in source on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 11:53:19 +0000<link>https://paulscherrerinstitute.github.io/ecmccfg/source/startup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paulscherrerinstitute.github.io/ecmccfg/source/startup/</guid><description/></item></channel></rss> \ No newline at end of file diff --git a/source/motion/ecmc_axis-records/index.html b/source/motion/ecmc_axis-records/index.html index e7a1e0b0d..6a695cebb 100644 --- a/source/motion/ecmc_axis-records/index.html +++ b/source/motion/ecmc_axis-records/index.html @@ -1,10 +1,10 @@ -<!doctype html><html lang=en class="js csstransforms3d"><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=generator content="Hugo 0.85.0"><meta name=description content><link rel=icon href=../../../images/favicon.png type=image/png><title>ecmc_axis-records.cmd :: ecmccfg

    ecmc_axis-records.cmd

    description

    Script for adding axis related EPICS PVs.

    details

    Adds motorRecord to the IOC.

    author

    Anders Sandstroem


    This script is typically called by \b addAxis.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_axis/index.html b/source/motion/ecmc_axis/index.html index cc8a95400..3d1273412 100644 --- a/source/motion/ecmc_axis/index.html +++ b/source/motion/ecmc_axis/index.html @@ -1,10 +1,10 @@ -ecmc_axis.cmd :: ecmccfg

    ecmc_axis.cmd

    description

    Script for configuring a physical axis.

    details

    Configures a physical axis in ECMC, based on previously set environment variables.

    author

    Anders Sandstroem


    This script is typically called by \b addAxis.cmd, often via \b ecmc_axis-records.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_axis_diag/index.html b/source/motion/ecmc_axis_diag/index.html index 7ac46a236..f4dad8ba7 100644 --- a/source/motion/ecmc_axis_diag/index.html +++ b/source/motion/ecmc_axis_diag/index.html @@ -1,10 +1,10 @@ -ecmc_axis_diag.cmd :: ecmccfg

    ecmc_axis_diag.cmd

    description

    Script for adding axis diagnostic EPICS PVs.

    details

    Adds diagnostic PVs to the IOC.

    author

    Anders Sandstroem


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_axis_mr/index.html b/source/motion/ecmc_axis_mr/index.html index 76d7d618b..5d37127fb 100644 --- a/source/motion/ecmc_axis_mr/index.html +++ b/source/motion/ecmc_axis_mr/index.html @@ -1,10 +1,10 @@ -ecmc_axis_mr.cmd :: ecmccfg

    ecmc_axis_mr.cmd

    description

    Script for loading motor record related databases

    details

    Script for loading motor record related databases and creating motor record axis object

    author

    Anders Sandstroem


    This script is typically called by \b ecmc_axis.cmd, often via \b ecmc_axis-records.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_axis_sync/index.html b/source/motion/ecmc_axis_sync/index.html index ed8f888b5..68549914f 100644 --- a/source/motion/ecmc_axis_sync/index.html +++ b/source/motion/ecmc_axis_sync/index.html @@ -1,10 +1,10 @@ -ecmc_axis_sync.cmd :: ecmccfg

    ecmc_axis_sync.cmd

    description

    Script for configuring axis synchronization

    details

    Configures ECMC for axis synchronization, based on previously set environment variables.

    author

    Anders Sandstroem


    This script is typically called by \b applyAxisSynchronization.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_axis_sync_unset/index.html b/source/motion/ecmc_axis_sync_unset/index.html index 1d9016abe..1d748691f 100644 --- a/source/motion/ecmc_axis_sync_unset/index.html +++ b/source/motion/ecmc_axis_sync_unset/index.html @@ -1,10 +1,10 @@ -:: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_axis_unset/index.html b/source/motion/ecmc_axis_unset/index.html index bd09fc168..ff4de7094 100644 --- a/source/motion/ecmc_axis_unset/index.html +++ b/source/motion/ecmc_axis_unset/index.html @@ -1,10 +1,10 @@ -:: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_enc-records/index.html b/source/motion/ecmc_enc-records/index.html index 055d0ce2a..f68651f8e 100644 --- a/source/motion/ecmc_enc-records/index.html +++ b/source/motion/ecmc_enc-records/index.html @@ -1,10 +1,10 @@ -ecmc_enc-records.cmd :: ecmccfg

    ecmc_enc-records.cmd

    description

    Script for adding encoder related EPICS PVs.

    details

    Script for adding an encoder to a previously created axis.

    author

    Anders Sandstroem


    This script is typically called by \b addAxis.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_enc/index.html b/source/motion/ecmc_enc/index.html index a1e81ebc2..22042b114 100644 --- a/source/motion/ecmc_enc/index.html +++ b/source/motion/ecmc_enc/index.html @@ -1,10 +1,10 @@ -ecmc_enc.cmd :: ecmccfg

    ecmc_enc.cmd

    description

    Script for adding an extra encoder

    details

    Configures a encoder object in ECMC, based on previously set environment variables.

    author

    Anders Sandstroem


    This script is typically called by \b addEncoder.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_enc_unset/index.html b/source/motion/ecmc_enc_unset/index.html index 63a187e37..82b391848 100644 --- a/source/motion/ecmc_enc_unset/index.html +++ b/source/motion/ecmc_enc_unset/index.html @@ -1,10 +1,10 @@ -:: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_virt_axis-records/index.html b/source/motion/ecmc_virt_axis-records/index.html index 857b38002..44df8a493 100644 --- a/source/motion/ecmc_virt_axis-records/index.html +++ b/source/motion/ecmc_virt_axis-records/index.html @@ -1,10 +1,10 @@ -ecmc_virt_axis-records.cmd :: ecmccfg

    ecmc_virt_axis-records.cmd

    description

    Script for adding axis related EPICS PVs.

    details

    Adds motorRecord to the IOC.

    author

    Anders Sandstroem


    This script is typically called by \b addVirtualAxis.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_virt_axis/index.html b/source/motion/ecmc_virt_axis/index.html index 2cec7a4e4..f4bcb4d0c 100644 --- a/source/motion/ecmc_virt_axis/index.html +++ b/source/motion/ecmc_virt_axis/index.html @@ -1,10 +1,10 @@ -ecmc_virt_axis.cmd :: ecmccfg

    ecmc_virt_axis.cmd

    description

    Script for configuring a virtual axis.

    details

    Configures a virtual axis in ECMC, based on previously set environment variables.

    author

    Anders Sandstroem


    This script is typically called by \b addVirtualAxis.cmd, often via \b ecmc_virt_axis-records.cmd

    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/ecmc_virt_axis_unset/index.html b/source/motion/ecmc_virt_axis_unset/index.html index 4d0401edf..6b684f732 100644 --- a/source/motion/ecmc_virt_axis_unset/index.html +++ b/source/motion/ecmc_virt_axis_unset/index.html @@ -1,10 +1,10 @@ -:: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/index.html b/source/motion/index.html index 0d8c4e150..06ead0f60 100644 --- a/source/motion/index.html +++ b/source/motion/index.html @@ -1,10 +1,10 @@ -motion :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/motion/index.xml b/source/motion/index.xml index 8f9edc022..2ec4f905c 100644 --- a/source/motion/index.xml +++ b/source/motion/index.xml @@ -1,27 +1,27 @@ -motion on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/Recent content in motion on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 10:31:28 +0000ecmc_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/description Script for adding axis related EPICS PVs. +motion on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/Recent content in motion on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 11:53:19 +0000ecmc_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis-records/description Script for adding axis related EPICS PVs. details Adds motorRecord to the IOC. author Anders Sandstroem -This script is typically called by \b addAxis.cmdecmc_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/description Script for configuring a physical axis. +This script is typically called by \b addAxis.cmdecmc_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis/description Script for configuring a physical axis. details Configures a physical axis in ECMC, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b addAxis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_diag.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/description Script for adding axis diagnostic EPICS PVs. +This script is typically called by \b addAxis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_diag.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_diag/description Script for adding axis diagnostic EPICS PVs. details Adds diagnostic PVs to the IOC. -author Anders Sandstroemecmc_axis_mr.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/description Script for loading motor record related databases +author Anders Sandstroemecmc_axis_mr.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_mr/description Script for loading motor record related databases details Script for loading motor record related databases and creating motor record axis object author Anders Sandstroem -This script is typically called by \b ecmc_axis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_sync.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/description Script for configuring axis synchronization +This script is typically called by \b ecmc_axis.cmd, often via \b ecmc_axis-records.cmdecmc_axis_sync.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync/description Script for configuring axis synchronization details Configures ECMC for axis synchronization, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b applyAxisSynchronization.cmdecmc_enc-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/description Script for adding encoder related EPICS PVs. +This script is typically called by \b applyAxisSynchronization.cmdecmc_enc-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc-records/description Script for adding encoder related EPICS PVs. details Script for adding an encoder to a previously created axis. author Anders Sandstroem -This script is typically called by \b addAxis.cmdecmc_enc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/description Script for adding an extra encoder +This script is typically called by \b addAxis.cmdecmc_enc.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc/description Script for adding an extra encoder details Configures a encoder object in ECMC, based on previously set environment variables. author Anders Sandstroem -This script is typically called by \b addEncoder.cmdecmc_virt_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/description Script for adding axis related EPICS PVs. +This script is typically called by \b addEncoder.cmdecmc_virt_axis-records.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis-records/description Script for adding axis related EPICS PVs. details Adds motorRecord to the IOC. author Anders Sandstroem -This script is typically called by \b addVirtualAxis.cmdecmc_virt_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/description Script for configuring a virtual axis. +This script is typically called by \b addVirtualAxis.cmdecmc_virt_axis.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis/description Script for configuring a virtual axis. details Configures a virtual axis in ECMC, based on previously set environment variables. author Anders Sandstroem This script is typically called by \b addVirtualAxis.cmd, often via \b ecmc_virt_axis-records.cmd<link>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync_unset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_sync_unset/</guid><description/></item><item><title/><link>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_unset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_axis_unset/</guid><description/></item><item><title/><link>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc_unset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_enc_unset/</guid><description/></item><item><title/><link>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis_unset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paulscherrerinstitute.github.io/ecmccfg/source/motion/ecmc_virt_axis_unset/</guid><description/></item></channel></rss> \ No newline at end of file diff --git a/source/naming/ecmcclassicnaming/index.html b/source/naming/ecmcclassicnaming/index.html index b4da9497d..ceeaf5112 100644 --- a/source/naming/ecmcclassicnaming/index.html +++ b/source/naming/ecmcclassicnaming/index.html @@ -1,10 +1,10 @@ -<!doctype html><html lang=en class="js csstransforms3d"><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=generator content="Hugo 0.85.0"><meta name=description content><link rel=icon href=../../../images/favicon.png type=image/png><title>ecmcClassicNaming.cmd :: ecmccfg

    ecmcClassicNaming.cmd

    description

    Script for defining ${ECMC_PREFIX}

    details

    Gathers relevant information about MasterID, SlaveID, … to create naming convention compliant PREFIX

    author

    Niko Kivel


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/naming/ecmcessnaming/index.html b/source/naming/ecmcessnaming/index.html index df1dcdc87..cf5c6da0a 100644 --- a/source/naming/ecmcessnaming/index.html +++ b/source/naming/ecmcessnaming/index.html @@ -1,10 +1,10 @@ -ecmcESSnaming.cmd :: ecmccfg

    ecmcESSnaming.cmd

    description

    Script for defining ${ECMC_P}

    details

    Gathers relevant information about MasterID, SlaveID, … to create naming convention compliant PREFIX

    author

    Niko Kivel


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/naming/ecmcmxsxxx/index.html b/source/naming/ecmcmxsxxx/index.html index bab865858..d59dd123f 100644 --- a/source/naming/ecmcmxsxxx/index.html +++ b/source/naming/ecmcmxsxxx/index.html @@ -1,10 +1,10 @@ -ecmcmXsXXX.cmd :: ecmccfg

    ecmcmXsXXX.cmd

    description

    Script for defining ${ECMC_P}

    details

    Gathers relevant information about MasterID, SlaveID, … to create naming convention compliant PREFIX

    author

    Niko Kivel


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/naming/index.html b/source/naming/index.html index 71305cb0c..2ba7fc179 100644 --- a/source/naming/index.html +++ b/source/naming/index.html @@ -1,10 +1,10 @@ -naming :: ecmccfg
    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/naming/index.xml b/source/naming/index.xml index eb3c155cc..6f3b9394f 100644 --- a/source/naming/index.xml +++ b/source/naming/index.xml @@ -1,7 +1,7 @@ -naming on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/Recent content in naming on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 10:31:28 +0000ecmcClassicNaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/description Script for defining ${ECMC_PREFIX} +naming on ecmccfghttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/Recent content in naming on ecmccfgHugo -- gohugo.ioen-usFri, 27 Sep 2024 11:53:19 +0000ecmcClassicNaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcclassicnaming/description Script for defining ${ECMC_PREFIX} details Gathers relevant information about MasterID, SlaveID, &hellip; to create naming convention compliant PREFIX -author Niko KivelecmcESSnaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/description Script for defining ${ECMC_P} +author Niko KivelecmcESSnaming.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcessnaming/description Script for defining ${ECMC_P} details Gathers relevant information about MasterID, SlaveID, &hellip; to create naming convention compliant PREFIX -author Niko KivelecmcmXsXXX.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/Fri, 27 Sep 2024 10:31:28 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/description Script for defining ${ECMC_P} +author Niko KivelecmcmXsXXX.cmdhttps://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/Fri, 27 Sep 2024 11:53:19 +0000https://paulscherrerinstitute.github.io/ecmccfg/source/naming/ecmcmxsxxx/description Script for defining ${ECMC_P} details Gathers relevant information about MasterID, SlaveID, &hellip; to create naming convention compliant PREFIX author Niko Kivel \ No newline at end of file diff --git a/source/scripts/addaxis/index.html b/source/scripts/addaxis/index.html index cec813332..f9beeaf98 100644 --- a/source/scripts/addaxis/index.html +++ b/source/scripts/addaxis/index.html @@ -1,10 +1,10 @@ -addAxis.cmd :: ecmccfg

    addAxis.cmd

    description

    Script for adding axis EPICS PVs.

    details

    Adds an motion axis.

    author

    Niko Kivel


    \ No newline at end of file +
    \ No newline at end of file diff --git a/source/scripts/adddatastorage/index.html b/source/scripts/adddatastorage/index.html index 8fa5a99b0..1cb844059 100644 --- a/source/scripts/adddatastorage/index.html +++ b/source/scripts/adddatastorage/index.html @@ -1,6 +1,6 @@ -addDataStorage.cmd :: ecmccfg