From 6c785fac27617f75c41d98812e6d7ec67b959242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 29 Aug 2024 09:22:08 +0200 Subject: [PATCH 001/128] Add INC param to loadPLCFile.cmd INC param can be used to define a ':' separated list of dirs to search for inlcude files --- scripts/loadPLCFile.cmd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/loadPLCFile.cmd b/scripts/loadPLCFile.cmd index f01fde4ae..e1c5f202f 100644 --- a/scripts/loadPLCFile.cmd +++ b/scripts/loadPLCFile.cmd @@ -14,6 +14,7 @@ #-d \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution #-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). #-d \param SUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded +#-d \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). #-d \note Example call: #-d \code #-d ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100" @@ -34,7 +35,7 @@ epicsEnvSet("ECMC_TMP_FILE", "${TMP_PATH=/tmp}/PLC${ECMC_PLC_ID}.plc" #- Convert file with optional macros (msi) ecmcFileExist("${FILE}",1) -system "msi -V -M '${PLC_MACROS=EMPTY}' -o ${ECMC_TMP_FILE} ${FILE}" +system "msi -I ${INC=.} -V -M '${PLC_MACROS=EMPTY}' -o ${ECMC_TMP_FILE} ${FILE}" #- Printout parsed file? ecmcEpicsEnvSetCalcTernary(ECMC_EXE_CMD, ${PRINT_PLC_FILE=1}=1,"", "#-" ) From 326bae011a2939e382c0de83ff6f9401a266a71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 30 Aug 2024 09:49:59 +0200 Subject: [PATCH 002/128] Add yaml param for feeding limit switches. --- examples/test/yaml/motion/axis_all_template.yaml | 2 ++ examples/test/yaml/motion/axis_all_template_minimum.yaml | 2 ++ scripts/jinja2/ecmcYamlSchema.py | 3 +++ scripts/jinja2/templates/axis.jinja2 | 5 +++++ 4 files changed, 12 insertions(+) diff --git a/examples/test/yaml/motion/axis_all_template.yaml b/examples/test/yaml/motion/axis_all_template.yaml index b14373607..961506e4a 100644 --- a/examples/test/yaml/motion/axis_all_template.yaml +++ b/examples/test/yaml/motion/axis_all_template.yaml @@ -7,6 +7,8 @@ axis: # "powerOffDelay=:" # "powerOnDelay=;" 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 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) diff --git a/examples/test/yaml/motion/axis_all_template_minimum.yaml b/examples/test/yaml/motion/axis_all_template_minimum.yaml index 285ec7e1d..f7aa787d8 100644 --- a/examples/test/yaml/motion/axis_all_template_minimum.yaml +++ b/examples/test/yaml/motion/axis_all_template_minimum.yaml @@ -7,6 +7,8 @@ axis: # "powerOffDelay=:" # "powerOnDelay=;" #healthOutput: ec0... # Ethercat entry for health output + #feedSwitchesOutput: ec0... # Ethercat entry for feed switches + #feedSwitchesValue: 1 # Value to write to axis.feedSwitchesOutput. Defaults to 1 # 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) diff --git a/scripts/jinja2/ecmcYamlSchema.py b/scripts/jinja2/ecmcYamlSchema.py index 4bd2e3315..1e73dfe40 100644 --- a/scripts/jinja2/ecmcYamlSchema.py +++ b/scripts/jinja2/ecmcYamlSchema.py @@ -179,6 +179,9 @@ def get_schema(self, keys): 'coerce': lambda v: supportedAxisTypes[str(v).lower().replace(" ", "")]}, 'mode': {'type': 'string', 'default': 'CSV', 'allowed': ['CSV', 'CSP'], 'coerce': lambda v: v.upper()}, 'parameters': {'type': 'string'}, + 'healthOutput': {'type': 'string'}, + 'feedSwitchesOutput': {'type': 'string'}, + 'feedSwitchesValue': {'type': 'integer'}, 'autoMode': {'type': 'dict', 'schema': { 'modeSet': {'type': 'string'}, 'modeAct': {'type': 'string'}, diff --git a/scripts/jinja2/templates/axis.jinja2 b/scripts/jinja2/templates/axis.jinja2 index 2059b84d4..07599b140 100644 --- a/scripts/jinja2/templates/axis.jinja2 +++ b/scripts/jinja2/templates/axis.jinja2 @@ -45,3 +45,8 @@ ecmcConfigOrDie "Cfg.LinkEcEntryToObject("{{ axis.healthOutput|default('') }}"," ecmcConfigOrDie "Cfg.SetAxisAllowSourceChangeWhenEnabled({{ axis.id }},{{ axis.features.allowSrcChangeWhenEnabled|default(0)|int }})" {% endif -%} {% endif -%} + +#- Feed 24 volt to switches if needed +{%- if axis.feedSwitchesOutput is defined %} + ecmcConfigOrDie "Cfg.WriteEcEntryEcPath({{ axis.feedSwitchesOutput}},{{ axis.feedSwitchesValue|default(1) }})" +{%- endif %} From 82703d9a88c4bd13db9353c190fd800c94078d1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 30 Aug 2024 10:40:42 +0200 Subject: [PATCH 003/128] Update yaml example. --- examples/test/yaml/motion/axis_all_template_minimum.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/test/yaml/motion/axis_all_template_minimum.yaml b/examples/test/yaml/motion/axis_all_template_minimum.yaml index f7aa787d8..0e1b213bd 100644 --- a/examples/test/yaml/motion/axis_all_template_minimum.yaml +++ b/examples/test/yaml/motion/axis_all_template_minimum.yaml @@ -1,6 +1,6 @@ axis: id: 1 # Axis id - type: joint # this is for future selection of axis type + #type: joint # defaults to joint (physical axis), if not joint then virtual axis # mode: CSV # supported mode, CSV and CSP, defaults CSV # parameters: 'axisPar' # additional parameters # Additional params to motor record driver # "powerAutoOnOff=;" //2: What you want, 1:do not use, 0 to disable From 50fe21fec5dfa43af8f23ea2e377bd0cfc6c473d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 3 Sep 2024 17:01:31 +0200 Subject: [PATCH 004/128] Add fucntion lib example.. WIP --- examples/test/plcs/funcs/cfg/axis.yaml | 185 ++++++++++++++++++++++ examples/test/plcs/funcs/plc/plc_cfg.yaml | 9 ++ examples/test/plcs/funcs/plc/test.plc | 13 ++ examples/test/plcs/funcs/plc/test.plc_lib | 60 +++++++ examples/test/plcs/funcs/startup.script | 52 ++++++ 5 files changed, 319 insertions(+) create mode 100644 examples/test/plcs/funcs/cfg/axis.yaml create mode 100644 examples/test/plcs/funcs/plc/plc_cfg.yaml create mode 100644 examples/test/plcs/funcs/plc/test.plc create mode 100644 examples/test/plcs/funcs/plc/test.plc_lib create mode 100644 examples/test/plcs/funcs/startup.script diff --git a/examples/test/plcs/funcs/cfg/axis.yaml b/examples/test/plcs/funcs/cfg/axis.yaml new file mode 100644 index 000000000..c3b9966c3 --- /dev/null +++ b/examples/test/plcs/funcs/cfg/axis.yaml @@ -0,0 +1,185 @@ +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 params to motor record driver + #healthOutput: ec0... # Ethercat entry for health output + # 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 + # allowedFunctions: + # homing: true # Allow homing + # constantVelocity: true # Allow constant velocity + # positioning: true # Allow positioning + +epics: + name: Axis1 # 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: 3600 # Fastest speed in engineering units + denominator: 32768 # 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: true # Enable brake +# 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: 12800 # 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$(DRV_SLAVE).positionActual01 # Ethercat entry for actual position input (encoder) + control: ec0.s$(DRV_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) + +controller: + Kp: 10 # Kp proportinal gain + Ki: 0.2 # 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) + axis: + velocity: 500 # Default velo for axis + acceleration: 2000 # Default acc for axis + deceleration: 2000 # 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$(DRV_SLAVE).driveStatus01.12 # Ethercat entry for low limit switch input + # forwardPolarity: 0 # Polarity of forward limit switch + backward: ec0.s$(DRV_SLAVE).driveStatus01.11 # Ethercat entry for high limit switch input + # backwardPolarity: 0 # Polarity of forward limit switch + home: 'ec0.s$(DRV_SLAVE).ONE.0' # Ethercat entry for home switch + # homePolarity: 0 # Polarity of home switch + interlock: 'ec0.s$(DRV_SLAVE).ONE.0' # Ethercat entry for interlock switch input + # interlockPolarity: 0 # Polarity of interlock switch + +# 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) +# acc: 20 # Acceleration during homing +# dec: 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 +# timeout: 100 # Sequence timeout + +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: true # Enable position lag monitoring (following error) + tolerance: 3 # Allowed tolerance + time: 10 # Allowed time outside tolerance 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 + 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 + # 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 diff --git a/examples/test/plcs/funcs/plc/plc_cfg.yaml b/examples/test/plcs/funcs/plc/plc_cfg.yaml new file mode 100644 index 000000000..7914e1425 --- /dev/null +++ b/examples/test/plcs/funcs/plc/plc_cfg.yaml @@ -0,0 +1,9 @@ +macros: LIMIT=1000,TYPE=1 # Macros to pass to this file (also plc.file) +plc: + id: 1 + enable: yes + rateMilliseconds: 1 + file: ${PLC_PATH}test.plc + code: + - "if(static.counter % ${LIMIT} == 0){println('PLC: Appended');static.counter:=0;};" # calculate set pos for physical axis + - "if(not(static.plc_code_loaded)) {static.counter:=static.counter+1;};" diff --git a/examples/test/plcs/funcs/plc/test.plc b/examples/test/plcs/funcs/plc/test.plc new file mode 100644 index 000000000..ea6e20507 --- /dev/null +++ b/examples/test/plcs/funcs/plc/test.plc @@ -0,0 +1,13 @@ + +static.counter:=static.counter+1; +static.plc_code_loaded:=1; +if(static.counter % ${LIMIT=10} == 0) { + if(${TYPE=1}=0) { + println('AX PLC: File'); + } else { + println('PLC : File'); + }; + prod(1,2,3,4,5); + + println('Array: ',retArray(2)); +}; diff --git a/examples/test/plcs/funcs/plc/test.plc_lib b/examples/test/plcs/funcs/plc/test.plc_lib new file mode 100644 index 000000000..cb9150598 --- /dev/null +++ b/examples/test/plcs/funcs/plc/test.plc_lib @@ -0,0 +1,60 @@ +# ####################### +# ecmc Function lib example +# The functions must be defined accordning to: +# function (,...) { +# ; +# } +# +# a function without params is also valid: +# function () { ;} +# +# "#" as a first char in a line is considered a comment. +# +# Can be used in a function: +# 1. The parameters +# 2. Other functions +# 3. The normal ecmc function libs: +# * motion: mc_* +# * ethercat: ec_* +# * data storages: ds_*, +# * master 2 master: m2m_* +# 4. the exprtk functions libs: +# * println +# * print +# * open +# * close +# * write +# * read", +# * getline +# * eof +# 5. vectors in teh calculations (but NOT as parameter or return value). +# +# Can NOT be used in a function: +# 1. EtherCAT I/0 direct access ec.s.* +# 2. Data storage variables: ds.* +# 3. Motion variables: ax.* +# 4. Static variables: static.* +# 5. Global variables: global.* +# 6. Vectors as parameter or return value (only first value will be used). +# +# +function add(a,b,c,d,e) { + println('add: ', a+b+c+d+e); + return[a+b+c+d+e]; +}; + +function prod(a,b,c,d,e) { + println('add2: ', add(a,b,c,d,e)); + println('prod: ', a*b*c*d*e); + return [a*b*c*d*e]; +}; + +#function return1() { +# return [1]; +#} + +function retArray(a) { + var test[5]:={a,a,a,a,a}; + println('test: ',test); + return [dot(test,test)]; +}; diff --git a/examples/test/plcs/funcs/startup.script b/examples/test/plcs/funcs/startup.script new file mode 100644 index 000000000..7ed80c190 --- /dev/null +++ b/examples/test/plcs/funcs/startup.script @@ -0,0 +1,52 @@ +############################################################################## +## Example config for el7031 + +require ecmccfg sandst_a,"ECMC_VER=sandst_a,ENG_MODE=1" + +epicsEnvSet(IOC,c6025a) +# Load components lib +require ecmccomp + +############################################################################## +## Configure hardware + +epicsEnvSet("DRV_SLAVE", "13") +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(DRV_SLAVE), HW_DESC=EL7041-0052" + +#- Apply motor config with some custom macros +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper,MACROS='I_MAX_MA=1000,I_STDBY_MA=500,U_NOM_MV=48000,R_COIL_MOHM=1230'" + +epicsEnvSet("ENC_SLAVE", "14") +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(ENC_SLAVE), HW_DESC=EL5042" + +#- Apply encoder config with some custom macros +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1" + +#Apply hardware configuration +ecmcConfigOrDie "Cfg.EcApplyConfig(1)" + +############################################################################## +## AXIS 1 +epicsEnvSet("DEV", "$(IOC)") +epicsEnvSet("PLC_PATH", "/ioc/c6025a/ecmccfg/examples/test/ecmccomp/plc/") +${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml" + +############################################################################## +#- PLC +${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCFile.cmd, "FILE=./plc/test.plc, PLC_ID=1, SAMPLE_RATE_MS=10" + +ecmcConfigOrDie "Cfg.LoadPLCLibFile(1,./plc/test.plc_lib)" + +############################################################################## +############# Configure diagnostics: + +ecmcConfigOrDie "Cfg.EcSetDiagnostics(1)" +ecmcConfigOrDie "Cfg.EcEnablePrintouts(0)" +ecmcConfigOrDie "Cfg.EcSetDomainFailedCyclesLimit(100)" +ecmcConfigOrDie "Cfg.SetDiagAxisIndex(1)" +ecmcConfigOrDie "Cfg.SetDiagAxisFreq(2)" +ecmcConfigOrDie "Cfg.SetDiagAxisEnable(0)" + +# go active +$(SCRIPTEXEC) ($(ecmccfg_DIR)setAppMode.cmd) + From 4450745e411ffa63ea4b3d78bbae6484d45676d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 4 Sep 2024 10:54:55 +0200 Subject: [PATCH 005/128] Add script to load function lib --- scripts/loadPLCLib.cmd | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 scripts/loadPLCLib.cmd diff --git a/scripts/loadPLCLib.cmd b/scripts/loadPLCLib.cmd new file mode 100644 index 000000000..28849a618 --- /dev/null +++ b/scripts/loadPLCLib.cmd @@ -0,0 +1,49 @@ +#============================================================================== +# loadPLCLib.cmd +#- Arguments: FILE, [PLC_ID], [SAMPLE_RATE_MS], [PLC_MACROS] + +#-d /** +#-d \brief Script for loading a PLC from lib from file. +#-d \details Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable. +#-d \author Anders Sandström +#-d \file +#-d \param FILE PLC definition file, i.e. ./plc/homeSlit.plc +#-d \param PLC_ID (optional) PLC number, default last loaded PLC +#-d \param PLC_MACROS (optional) Substitution macros for PLC code +#-d \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). +#-d \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution +#-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). +#-d \note Example call: +#-d \code +#-d ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCLib.cmd, "PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100" +#-d \endcode +#-d */ + +#- Default to last loaded PLC +epicsEnvSet("ECMC_PLC_ID", "${PLC_ID=${ECMC_PLC_ID}}") + +#- PLC rate, if not explicitly declared, deduce rate from bus frequence (ECMC_EC_SAMPLE_RATE) +ecmcEpicsEnvSetCalc(ECMC_PLC_RATE_, "1000/${ECMC_EC_SAMPLE_RATE}", "%f") +epicsEnvSet("ECMC_PLC_SAMPLE_RATE_MS", "${SAMPLE_RATE_MS=0}") +ecmcEpicsEnvSetCalcTernary(ECMC_PLC_SAMPLE_RATE_MS, "${ECMC_PLC_SAMPLE_RATE_MS}>0", "${ECMC_PLC_SAMPLE_RATE_MS}","${ECMC_PLC_RATE_}") +epicsEnvUnset(ECMC_PLC_RATE_) # clean up, temp variable + +epicsEnvSet("ECMC_TMP_FILE", "${TMP_PATH=/tmp}/PLC${ECMC_PLC_ID}.plc") + +#- Convert file with optional macros (msi) +ecmcFileExist("${FILE}",1) +system "msi -I ${INC=.} -V -M '${PLC_MACROS=EMPTY}' -o ${ECMC_TMP_FILE} ${FILE}" + +#- Printout parsed file? +ecmcEpicsEnvSetCalcTernary(ECMC_EXE_CMD, ${PRINT_PLC_FILE=1}=1,"", "#-" ) +${ECMC_EXE_CMD=""}########### Parsed PLC-lib file: +${ECMC_EXE_CMD=""}system "cat ${ECMC_TMP_FILE}" +${ECMC_EXE_CMD=""}############ PLC-lib file end +${ECMC_EXE_CMD=""}# +epicsEnvUnset(ECMC_EXE_CMD) + +ecmcFileExist("${ECMC_TMP_FILE}",1) +ecmcConfigOrDie "Cfg.LoadPLCLibFile(${ECMC_PLC_ID},${ECMC_TMP_FILE})" + +#- Remove parsed file after load +system "rm -f ${ECMC_TMP_FILE}" From cf96ad94b74855babd399609668a166c26c49147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 4 Sep 2024 10:59:52 +0200 Subject: [PATCH 006/128] Update plc function lib test --- examples/test/plcs/funcs/plc/plc_cfg.yaml | 9 ---- examples/test/plcs/funcs/plc/test.plc | 15 +++--- examples/test/plcs/funcs/plc/test.plc_lib | 57 ++++++++++++++++------- examples/test/plcs/funcs/startup.script | 28 +++-------- 4 files changed, 53 insertions(+), 56 deletions(-) delete mode 100644 examples/test/plcs/funcs/plc/plc_cfg.yaml diff --git a/examples/test/plcs/funcs/plc/plc_cfg.yaml b/examples/test/plcs/funcs/plc/plc_cfg.yaml deleted file mode 100644 index 7914e1425..000000000 --- a/examples/test/plcs/funcs/plc/plc_cfg.yaml +++ /dev/null @@ -1,9 +0,0 @@ -macros: LIMIT=1000,TYPE=1 # Macros to pass to this file (also plc.file) -plc: - id: 1 - enable: yes - rateMilliseconds: 1 - file: ${PLC_PATH}test.plc - code: - - "if(static.counter % ${LIMIT} == 0){println('PLC: Appended');static.counter:=0;};" # calculate set pos for physical axis - - "if(not(static.plc_code_loaded)) {static.counter:=static.counter+1;};" diff --git a/examples/test/plcs/funcs/plc/test.plc b/examples/test/plcs/funcs/plc/test.plc index ea6e20507..6b28ecb95 100644 --- a/examples/test/plcs/funcs/plc/test.plc +++ b/examples/test/plcs/funcs/plc/test.plc @@ -1,13 +1,10 @@ - +# Test PLC code for plc-libs static.counter:=static.counter+1; static.plc_code_loaded:=1; -if(static.counter % ${LIMIT=10} == 0) { - if(${TYPE=1}=0) { - println('AX PLC: File'); - } else { - println('PLC : File'); - }; +if(static.counter % ${LIMIT=10} == 0) { + # Call a few lib functions prod(1,2,3,4,5); - - println('Array: ',retArray(2)); + println('This is main, testLocalArray: ',testLocalArray(2)); + println('This is main, One: ',one); + testm2m(); }; diff --git a/examples/test/plcs/funcs/plc/test.plc_lib b/examples/test/plcs/funcs/plc/test.plc_lib index cb9150598..0b1c0bbc5 100644 --- a/examples/test/plcs/funcs/plc/test.plc_lib +++ b/examples/test/plcs/funcs/plc/test.plc_lib @@ -5,14 +5,23 @@ # ; # } # -# a function without params is also valid: -# function () { ;} +# also without param is allowed: +# function () { +# ; +# } +# +# For syntax of the "code body", check the exprtk website. +# +# Several functions can be defined in teh same file. +# +# 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 or constants). # # "#" as a first char in a line is considered a comment. # # Can be used in a function: # 1. The parameters -# 2. Other functions +# 2. Other functions (also recursive) # 3. The normal ecmc function libs: # * motion: mc_* # * ethercat: ec_* @@ -27,34 +36,48 @@ # * read", # * getline # * eof -# 5. vectors in teh calculations (but NOT as parameter or return value). +# 5. vectors in the calculations (but NOT as parameter or return value). # -# Can NOT be used in a function: +# "ecmc variables" can NOT be used/accessed in a functions: # 1. EtherCAT I/0 direct access ec.s.* # 2. Data storage variables: ds.* # 3. Motion variables: ax.* # 4. Static variables: static.* # 5. Global variables: global.* -# 6. Vectors as parameter or return value (only first value will be used). +# 6. Vectors as parameter or return value (only first value will be passed). # +# MSI: +# The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. +# For more info check the msi documentation/help. # + +# Normal function function add(a,b,c,d,e) { - println('add: ', a+b+c+d+e); - return[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('add2: ', add(a,b,c,d,e)); - println('prod: ', a*b*c*d*e); - return [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 return1() { -# return [1]; -#} - -function retArray(a) { +# function with vector calcs (inside) +function testLocalArray(a) { var test[5]:={a,a,a,a,a}; - println('test: ',test); + println('This is testLocalArray: ',test); return [dot(test,test)]; }; + +# function without arg +function one() { + println('This is one: ',1); + return [1+${OFFSET=0}]; +} + +# test ecmc_function +function testm2m() { + m2m_write(0,m2m_read(0)+${OFFSET=0}); + println('This is testmt2: elem 0: ',m2m_read(0)); +} diff --git a/examples/test/plcs/funcs/startup.script b/examples/test/plcs/funcs/startup.script index 7ed80c190..ce33bae76 100644 --- a/examples/test/plcs/funcs/startup.script +++ b/examples/test/plcs/funcs/startup.script @@ -1,14 +1,13 @@ ############################################################################## ## Example config for el7031 -require ecmccfg sandst_a,"ECMC_VER=sandst_a,ENG_MODE=1" +require ecmccfg v9.5.5_RC1,"ECMC_VER=v9.5.5_RC1,ENG_MODE=1" epicsEnvSet(IOC,c6025a) -# Load components lib require ecmccomp ############################################################################## -## Configure hardware +#- Hardware epicsEnvSet("DRV_SLAVE", "13") ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(DRV_SLAVE), HW_DESC=EL7041-0052" @@ -18,35 +17,22 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepp epicsEnvSet("ENC_SLAVE", "14") ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(ENC_SLAVE), HW_DESC=EL5042" - -#- Apply encoder config with some custom macros ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1" #Apply hardware configuration ecmcConfigOrDie "Cfg.EcApplyConfig(1)" ############################################################################## -## AXIS 1 +#- AXIS 1 epicsEnvSet("DEV", "$(IOC)") -epicsEnvSet("PLC_PATH", "/ioc/c6025a/ecmccfg/examples/test/ecmccomp/plc/") ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml" ############################################################################## -#- PLC -${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCFile.cmd, "FILE=./plc/test.plc, PLC_ID=1, SAMPLE_RATE_MS=10" - -ecmcConfigOrDie "Cfg.LoadPLCLibFile(1,./plc/test.plc_lib)" +#- PLC: Load plc and library to that PLC +${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCFile.cmd, "FILE=./plc/test.plc, PLC_ID=1, SAMPLE_RATE_MS=10" +${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" ############################################################################## -############# Configure diagnostics: - -ecmcConfigOrDie "Cfg.EcSetDiagnostics(1)" -ecmcConfigOrDie "Cfg.EcEnablePrintouts(0)" -ecmcConfigOrDie "Cfg.EcSetDomainFailedCyclesLimit(100)" -ecmcConfigOrDie "Cfg.SetDiagAxisIndex(1)" -ecmcConfigOrDie "Cfg.SetDiagAxisFreq(2)" -ecmcConfigOrDie "Cfg.SetDiagAxisEnable(0)" - -# go active +#- go active $(SCRIPTEXEC) ($(ecmccfg_DIR)setAppMode.cmd) From 41bfce304a0885712b2d940cfb5fd2d0e3fe9f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 4 Sep 2024 15:19:51 +0200 Subject: [PATCH 007/128] EL7221-9014: Remove not configured data PVs --- db/Beckhoff_7XXX/ecmcEL7221-9014.substitutions | 3 --- 1 file changed, 3 deletions(-) diff --git a/db/Beckhoff_7XXX/ecmcEL7221-9014.substitutions b/db/Beckhoff_7XXX/ecmcEL7221-9014.substitutions index 59322ae1f..0f0abdee4 100644 --- a/db/Beckhoff_7XXX/ecmcEL7221-9014.substitutions +++ b/db/Beckhoff_7XXX/ecmcEL7221-9014.substitutions @@ -14,9 +14,6 @@ file "ecmc_analogInput-chX.template" { pattern {CH_ID, sourceName, KEY, suffix, DESC, EGU, ESLO, PREC, LOPR, HOPR, LOLO, LOW, HIGH, HIHI, HYST, LLSV, LSV, HSV, HHSV} {01, "velocityActual", "Drv", "-VelAct", "Actual Vel", "a.u.", 9.5367e-7, 0, 0, 0, 0, 0, 0, 0, 0, "NO_ALARM", "NO_ALARM", "NO_ALARM", "NO_ALARM" } - {01, "torqueActual", "Drv", "-TrqAct", "Actual Trq", "%", 0.1, 1, -100, 100, 0, -80, 80, 0, 0, "NO_ALARM", "NO_ALARM", "MINOR", "NO_ALARM" } - {01, "infoData", "Drv", "-VolAct", "InfoData1", "V", 0.001, 1, 0, 60, 8, 20, 49, 50, 0.25, "MAJOR", "MINOR", "MINOR", "MAJOR" } - {02, "infoData", "Drv", "-TmpAct", "InfoData2", "degC", 0.1, 1, 0, 50, 0, 0, 40, 50, 0.5, "NO_ALARM", "NO_ALARM", "MINOR", "MAJOR" } } file "ecmcEL72XX_TP.template" From 484a604c7c38ed4ecf96964a1aa07d257e96bcef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 4 Sep 2024 16:45:11 +0200 Subject: [PATCH 008/128] Fix panel --- qt/ecmcEx72x1_ALL_INPUTS.ui | 206 +++++++++++++++--------------------- 1 file changed, 88 insertions(+), 118 deletions(-) diff --git a/qt/ecmcEx72x1_ALL_INPUTS.ui b/qt/ecmcEx72x1_ALL_INPUTS.ui index bd410119d..3ba8a48f0 100644 --- a/qt/ecmcEx72x1_ALL_INPUTS.ui +++ b/qt/ecmcEx72x1_ALL_INPUTS.ui @@ -103,7 +103,7 @@ Drive - + 1 @@ -116,49 +116,6 @@ 1 - - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-TrqAct - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::Channel - - - true - - - - - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-VelAct - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::User - - - @@ -173,68 +130,44 @@ - - + + - Torque + Error - - - - - 0 - 0 - - - - - 4 - 12 - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - true - - - false - - - 10 + + + + Warning + + + + - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-WrnAlrm - - - caLed::Static + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-TrqAct - - - 255 - 170 - 0 + + + 160 + 160 + 164 - - - 0 - 85 - 0 - + + caLineEdit::Static - - 0 + + caLineEdit::Channel - - 1 + + true - + @@ -288,20 +221,6 @@ - - - - Error - - - - - - - Warning - - - @@ -325,17 +244,10 @@ - - - - Temp - - - - - + + - $(IOC):m$(MasterID)s$(SlaveID)-Drv02-TmpAct + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-VelAct @@ -348,11 +260,69 @@ caLineEdit::Static - caLineEdit::Channel + caLineEdit::User - + + + + + + Torque + + + + + + + + 0 + 0 + + + + + 4 + 12 + + + + <html><head/><body><p>E-Bus Power Status</p></body></html> + + true + + false + + + 10 + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-WrnAlrm + + + caLed::Static + + + + 255 + 170 + 0 + + + + + 0 + 85 + 0 + + + + 0 + + + 1 + From 7db2bfb520d7f72af911d507222519b557592cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 5 Sep 2024 10:44:20 +0200 Subject: [PATCH 009/128] EL72xx: Fix missing macros in panels --- qt/ecmcEx72x1.ui | 2 +- qt/ecmcEx72x1_expert.ui | 76 ++--------------------------------------- 2 files changed, 3 insertions(+), 75 deletions(-) diff --git a/qt/ecmcEx72x1.ui b/qt/ecmcEx72x1.ui index e0108a078..a167fe9a3 100644 --- a/qt/ecmcEx72x1.ui +++ b/qt/ecmcEx72x1.ui @@ -566,7 +566,7 @@ ecmcEx72x1_expert.ui - MasterID=$(MasterID), SlaveID=$(SlaveID),ID=$(DRV),IOC=$(IOC); + MasterID=$(MasterID), SlaveID=$(SlaveID),ID=01,IOC=$(IOC); diff --git a/qt/ecmcEx72x1_expert.ui b/qt/ecmcEx72x1_expert.ui index c5905ad70..603804154 100644 --- a/qt/ecmcEx72x1_expert.ui +++ b/qt/ecmcEx72x1_expert.ui @@ -629,78 +629,6 @@ CiA402 - - - - 230 - 40 - 52 - 16 - - - - - Monospace - 10 - PreferDefault - - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Cmd-RB - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::Channel - - - true - - - - - - 140 - 40 - 51 - 16 - - - - - Monospace - 10 - PreferDefault - - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::Channel - - - true - - @@ -1517,7 +1445,7 @@ - $(IOC):m$(MasterID)s$(SlaveID)-Drv$(ID)-Cmd-RB + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Cmd-RB @@ -1553,7 +1481,7 @@ - $(IOC):m$(MasterID)s$(SlaveID)-Drv$(ID)-Stat + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat From b4dd662e27625838da392c3969dbb9c5ae8a4b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 5 Sep 2024 12:42:34 +0200 Subject: [PATCH 010/128] Allow to set group in axis cfg --- examples/test/yaml/motion/axis_all_template.yaml | 1 + .../test/yaml/motion/axis_all_template_minimum.yaml | 1 + scripts/jinja2/ecmcYamlSchema.py | 1 + scripts/jinja2/templates/axis.jinja2 | 13 ++++++++++++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/examples/test/yaml/motion/axis_all_template.yaml b/examples/test/yaml/motion/axis_all_template.yaml index 961506e4a..3aaf4b95d 100644 --- a/examples/test/yaml/motion/axis_all_template.yaml +++ b/examples/test/yaml/motion/axis_all_template.yaml @@ -9,6 +9,7 @@ axis: 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) 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) diff --git a/examples/test/yaml/motion/axis_all_template_minimum.yaml b/examples/test/yaml/motion/axis_all_template_minimum.yaml index 0e1b213bd..5d619521f 100644 --- a/examples/test/yaml/motion/axis_all_template_minimum.yaml +++ b/examples/test/yaml/motion/axis_all_template_minimum.yaml @@ -9,6 +9,7 @@ axis: #healthOutput: ec0... # Ethercat entry for health output #feedSwitchesOutput: ec0... # Ethercat entry for feed 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) # 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) diff --git a/scripts/jinja2/ecmcYamlSchema.py b/scripts/jinja2/ecmcYamlSchema.py index 1e73dfe40..60ae7c84e 100644 --- a/scripts/jinja2/ecmcYamlSchema.py +++ b/scripts/jinja2/ecmcYamlSchema.py @@ -182,6 +182,7 @@ def get_schema(self, keys): 'healthOutput': {'type': 'string'}, 'feedSwitchesOutput': {'type': 'string'}, 'feedSwitchesValue': {'type': 'integer'}, + 'group': {'type': 'string'}, 'autoMode': {'type': 'dict', 'schema': { 'modeSet': {'type': 'string'}, 'modeAct': {'type': 'string'}, diff --git a/scripts/jinja2/templates/axis.jinja2 b/scripts/jinja2/templates/axis.jinja2 index 07599b140..526a4b963 100644 --- a/scripts/jinja2/templates/axis.jinja2 +++ b/scripts/jinja2/templates/axis.jinja2 @@ -48,5 +48,16 @@ ecmcConfigOrDie "Cfg.LinkEcEntryToObject("{{ axis.healthOutput|default('') }}"," #- Feed 24 volt to switches if needed {%- if axis.feedSwitchesOutput is defined %} - ecmcConfigOrDie "Cfg.WriteEcEntryEcPath({{ axis.feedSwitchesOutput}},{{ axis.feedSwitchesValue|default(1) }})" + ecmcConfigOrDie "Cfg.WriteEcEntryEcPath({{ axis.feedSwitchesOutput }},{{ axis.feedSwitchesValue|default(1) }})" +{%- endif %} + +{%- if axis.group is defined %} + #- Add axis to group, create new group if does not exist + ecmcConfigOrDie "Cfg.AddAxisToGroupByName({{ axis.id }},{{ axis.group }},1)" + ecmcConfig "GetAxisGroupIndexByName({{ axis.group }})" + # Set group id to GRP_{{ axis.group }}_ID env to allow for later use in PLC-Code + epicsEnvSet(GRP_{{ axis.group }}_ID,${ECMC_CONFIG_RETURN_VAL=0}) + ecmcIf("${GRP_{{ axis.group }}_ID=-1}<0") + ${IF_TRUE}ecmcExit : Error: Invalid axis group ID + ecmcEndIf() {%- endif %} From b617db88098a12487d45400ac99daabb4416b13c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 5 Sep 2024 13:15:22 +0200 Subject: [PATCH 011/128] Add yaml params and readme --- examples/test/plcs/funcs/readme.md | 83 +++++++++++++++++++ .../test/yaml/motion/axis_all_template.yaml | 3 +- .../motion/axis_all_template_minimum.yaml | 3 +- 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 examples/test/plcs/funcs/readme.md diff --git a/examples/test/plcs/funcs/readme.md b/examples/test/plcs/funcs/readme.md new file mode 100644 index 000000000..d387673ee --- /dev/null +++ b/examples/test/plcs/funcs/readme.md @@ -0,0 +1,83 @@ +## Add PLC function libs: +Add possability to load function library to a plc object: +``` +${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" +``` +The functions must be defined accordning to template: +``` +function (,...) { + ; +} + +also without param is allowed: +function () { + ; +} + +``` +* For syntax of the "code body", check the exprtk website. +* Several functions can be defined in the same file. +* 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). +* "#" as a first char in a line is considered a comment (the line will be removed before compile). +* MSI: The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check the msi documentation/help. + +### Can be used in a function: +1. The parameters +2. Other functions (also recursive) +3. The normal ecmc function libs: + * motion: mc_* + * ethercat: ec_* + * data storages: ds_*, + * master 2 master: m2m_* +4. the exprtk functions libs: + * println + * print + * open + * close + * write + * read", + * getline + * eof + 5. vectors in the calculations (but NOT as parameter or return value). + +### "ecmc variables" can _NOT_ be used/accessed in a functions: +1. EtherCAT I/0 direct access ec.s.* +2. Data storage variables: ds.* +3. Motion variables: ax.* +4. Static variables: static.* +5. Global variables: global.* +6. Vectors as parameter or return value (only first value will be passed). + +### A function lib example +``` +# 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)); +} +``` diff --git a/examples/test/yaml/motion/axis_all_template.yaml b/examples/test/yaml/motion/axis_all_template.yaml index 3aaf4b95d..e384ad992 100644 --- a/examples/test/yaml/motion/axis_all_template.yaml +++ b/examples/test/yaml/motion/axis_all_template.yaml @@ -9,7 +9,8 @@ axis: 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: testGroup # Add axis to group (group will be created if not exists), + # group id will be stored in GRP_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) diff --git a/examples/test/yaml/motion/axis_all_template_minimum.yaml b/examples/test/yaml/motion/axis_all_template_minimum.yaml index 5d619521f..0a878f914 100644 --- a/examples/test/yaml/motion/axis_all_template_minimum.yaml +++ b/examples/test/yaml/motion/axis_all_template_minimum.yaml @@ -9,7 +9,8 @@ axis: #healthOutput: ec0... # Ethercat entry for health output #feedSwitchesOutput: ec0... # Ethercat entry for feed 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: testGroup # Add axis to group (group will be created if not exists), + # group id will be stored in GRP_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) From c18f71f438eeef9c4ab14de4735751bd2d8b4524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 5 Sep 2024 13:16:59 +0200 Subject: [PATCH 012/128] Update readme --- examples/test/plcs/funcs/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/test/plcs/funcs/readme.md b/examples/test/plcs/funcs/readme.md index d387673ee..d3f8ad505 100644 --- a/examples/test/plcs/funcs/readme.md +++ b/examples/test/plcs/funcs/readme.md @@ -1,5 +1,5 @@ -## Add PLC function libs: -Add possability to load function library to a plc object: +## PLC function libs: +Function libs can be loaded into ecmc-PLCs ``` ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" ``` From e400421030aeebcfb59db92a4abd657a6d9f5551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Fri, 6 Sep 2024 09:25:22 +0200 Subject: [PATCH 013/128] Add SELF and SELF_ID macros to PLCs --- scripts/loadPLCFile.cmd | 16 +++++++++++----- scripts/loadPLCLib.cmd | 8 +++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/scripts/loadPLCFile.cmd b/scripts/loadPLCFile.cmd index e1c5f202f..b6e0dfd2a 100644 --- a/scripts/loadPLCFile.cmd +++ b/scripts/loadPLCFile.cmd @@ -5,12 +5,14 @@ #-d /** #-d \brief Script for adding a PLC from file. #-d \details Adds a PLC defined in FILE. Also adds PLC specific EPICS PVs, i.e. for enable/disable. -#-d \author Niko Kivel +#-d \author Niko Kivel, Anders Sandström #-d \file #-d \param FILE PLC definition file, i.e. ./plc/homeSlit.plc -#-d \param PLC_ID (optional) PLC number, default 0 +#-d \param 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 #-d \param SAMPLE_RATE_MS (optional) excecution rate, default 1000/EC_RATE -#-d \param PLC_MACROS (optional) Substitution macros for PLC code +#-d \param PLC_MACROS (optional) Substitution macros for PLC code. The macros "SELF_ID" and "SELF" are reserved: +#-d * "SELF_ID" = PLC Id of this plc +#-d * "SELF" = "plc${SELF_ID}" #-d \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution #-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). #-d \param SUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded @@ -30,9 +32,11 @@ ecmcEpicsEnvSetCalc(ECMC_PLC_RATE_, "1000/${ECMC_EC_SAMPLE_RATE}", "%f") epicsEnvSet("ECMC_PLC_SAMPLE_RATE_MS", "${SAMPLE_RATE_MS=0}") ecmcEpicsEnvSetCalcTernary(ECMC_PLC_SAMPLE_RATE_MS, "${ECMC_PLC_SAMPLE_RATE_MS}>0", "${ECMC_PLC_SAMPLE_RATE_MS}","${ECMC_PLC_RATE_}") epicsEnvUnset(ECMC_PLC_RATE_) # clean up, temp variable - epicsEnvSet("ECMC_TMP_FILE", "${TMP_PATH=/tmp}/PLC${ECMC_PLC_ID}.plc") +#- Add SELF and SELF_ID +epicsEnvSet("PLC_MACROS", "SELF_ID=${ECMC_PLC_ID}, SELF='plc${ECMC_PLC_ID}', ${PLC_MACROS=}) + #- Convert file with optional macros (msi) ecmcFileExist("${FILE}",1) system "msi -I ${INC=.} -V -M '${PLC_MACROS=EMPTY}' -o ${ECMC_TMP_FILE} ${FILE}" @@ -45,6 +49,7 @@ ${ECMC_EXE_CMD=""}############ PLC file end ${ECMC_EXE_CMD=""}# epicsEnvUnset(ECMC_EXE_CMD) +#- Now load the file to ecmc ecmcFileExist("${ECMC_TMP_FILE}",1) ecmcConfigOrDie "Cfg.CreatePLC(${ECMC_PLC_ID},${ECMC_PLC_SAMPLE_RATE_MS})" ecmcConfigOrDie "Cfg.LoadPLCFile(${ECMC_PLC_ID},${ECMC_TMP_FILE})" @@ -75,4 +80,5 @@ epicsEnvSet(ECMC_PREV_PLC_OBJ_ID,${ECMC_PLC_ID}) ecmcEpicsEnvSetCalc(ECMC_PLC_COUNT, "$(ECMC_PLC_COUNT=0)+1") - +#- increment PLC_ID +ecmcEpicsEnvSetCalc("PLC_ID", "${ECMC_PLC_ID}+1","%d") diff --git a/scripts/loadPLCLib.cmd b/scripts/loadPLCLib.cmd index 28849a618..e6a8c3cd4 100644 --- a/scripts/loadPLCLib.cmd +++ b/scripts/loadPLCLib.cmd @@ -9,7 +9,9 @@ #-d \file #-d \param FILE PLC definition file, i.e. ./plc/homeSlit.plc #-d \param PLC_ID (optional) PLC number, default last loaded PLC -#-d \param PLC_MACROS (optional) Substitution macros for PLC code +#-d \param PLC_MACROS (optional) Substitution macros for PLC code. The macros "SELF_ID" and "SELF" are reserved: +#-d * "SELF_ID" = PLC Id of this plc +#-d * "SELF" = "plc${SELF_ID}" #-d \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). #-d \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution #-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). @@ -30,6 +32,9 @@ epicsEnvUnset(ECMC_PLC_RATE_) # clean up, temp variable epicsEnvSet("ECMC_TMP_FILE", "${TMP_PATH=/tmp}/PLC${ECMC_PLC_ID}.plc") +#- Add SELF and SELF_ID +epicsEnvSet("PLC_MACROS", "SELF_ID=${ECMC_PLC_ID}, SELF='plc${ECMC_PLC_ID}', ${PLC_MACROS=}) + #- Convert file with optional macros (msi) ecmcFileExist("${FILE}",1) system "msi -I ${INC=.} -V -M '${PLC_MACROS=EMPTY}' -o ${ECMC_TMP_FILE} ${FILE}" @@ -42,6 +47,7 @@ ${ECMC_EXE_CMD=""}############ PLC-lib file end ${ECMC_EXE_CMD=""}# epicsEnvUnset(ECMC_EXE_CMD) +#- Now load the file to ecmc ecmcFileExist("${ECMC_TMP_FILE}",1) ecmcConfigOrDie "Cfg.LoadPLCLibFile(${ECMC_PLC_ID},${ECMC_TMP_FILE})" From 03b2a2dbba89e1e7054db1ae27aca682a8d29686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 6 Sep 2024 11:35:39 +0200 Subject: [PATCH 014/128] Add default PLC macros, M and M_ID --- scripts/loadPLCFile.cmd | 8 +++++--- scripts/loadPLCLib.cmd | 9 +++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/scripts/loadPLCFile.cmd b/scripts/loadPLCFile.cmd index b6e0dfd2a..ea1937f9f 100644 --- a/scripts/loadPLCFile.cmd +++ b/scripts/loadPLCFile.cmd @@ -10,9 +10,11 @@ #-d \param FILE PLC definition file, i.e. ./plc/homeSlit.plc #-d \param 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 #-d \param SAMPLE_RATE_MS (optional) excecution rate, default 1000/EC_RATE -#-d \param PLC_MACROS (optional) Substitution macros for PLC code. The macros "SELF_ID" and "SELF" are reserved: +#-d \param PLC_MACROS (optional) Substitution macros for PLC code. The macros "SELF_ID","SELF",M_ID, and M are reserved: #-d * "SELF_ID" = PLC Id of this plc #-d * "SELF" = "plc${SELF_ID}" +#-d * "M_ID" = EtherCAT master ID +#-d * "M" = "ec${M_ID}" #-d \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution #-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). #-d \param SUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded @@ -34,8 +36,8 @@ ecmcEpicsEnvSetCalcTernary(ECMC_PLC_SAMPLE_RATE_MS, "${ECMC_PLC_SAMPLE_RATE_MS}> epicsEnvUnset(ECMC_PLC_RATE_) # clean up, temp variable epicsEnvSet("ECMC_TMP_FILE", "${TMP_PATH=/tmp}/PLC${ECMC_PLC_ID}.plc") -#- Add SELF and SELF_ID -epicsEnvSet("PLC_MACROS", "SELF_ID=${ECMC_PLC_ID}, SELF='plc${ECMC_PLC_ID}', ${PLC_MACROS=}) +#- Add SELF and SELF_ID, M_ID and M +epicsEnvSet("PLC_MACROS", "SELF_ID=${ECMC_PLC_ID}, SELF='plc${ECMC_PLC_ID}', M_ID=${ECMC_EC_MASTER_ID=0}, M='ec${ECMC_EC_MASTER_ID=0}', ${PLC_MACROS=}") #- Convert file with optional macros (msi) ecmcFileExist("${FILE}",1) diff --git a/scripts/loadPLCLib.cmd b/scripts/loadPLCLib.cmd index e6a8c3cd4..8b9360b3a 100644 --- a/scripts/loadPLCLib.cmd +++ b/scripts/loadPLCLib.cmd @@ -9,9 +9,11 @@ #-d \file #-d \param FILE PLC definition file, i.e. ./plc/homeSlit.plc #-d \param PLC_ID (optional) PLC number, default last loaded PLC -#-d \param PLC_MACROS (optional) Substitution macros for PLC code. The macros "SELF_ID" and "SELF" are reserved: +#-d \param PLC_MACROS (optional) Substitution macros for PLC code. The macros "SELF_ID","SELF",M_ID, and M are reserved: #-d * "SELF_ID" = PLC Id of this plc #-d * "SELF" = "plc${SELF_ID}" +#-d * "M_ID" = EtherCAT master ID +#-d * "M" = "ec${M_ID}" #-d \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). #-d \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution #-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). @@ -31,9 +33,8 @@ ecmcEpicsEnvSetCalcTernary(ECMC_PLC_SAMPLE_RATE_MS, "${ECMC_PLC_SAMPLE_RATE_MS}> epicsEnvUnset(ECMC_PLC_RATE_) # clean up, temp variable epicsEnvSet("ECMC_TMP_FILE", "${TMP_PATH=/tmp}/PLC${ECMC_PLC_ID}.plc") - -#- Add SELF and SELF_ID -epicsEnvSet("PLC_MACROS", "SELF_ID=${ECMC_PLC_ID}, SELF='plc${ECMC_PLC_ID}', ${PLC_MACROS=}) +#- Add SELF and SELF_ID, M_ID and M +epicsEnvSet("PLC_MACROS", "SELF_ID=${ECMC_PLC_ID}, SELF='plc${ECMC_PLC_ID}', M_ID=${ECMC_EC_MASTER_ID=0}, M='ec${ECMC_EC_MASTER_ID=0}', ${PLC_MACROS=}") #- Convert file with optional macros (msi) ecmcFileExist("${FILE}",1) From d7151dabbc3959e9f4b0fdd753873f327e5ba452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 9 Sep 2024 13:36:02 +0200 Subject: [PATCH 015/128] Add custom status word to EL3751 --- db/Beckhoff_3XXX/ecmcEL3751.substitutions | 2 +- .../ecmcEL3751_Scalar.substitutions | 2 +- .../ecmcEL3751_status-chX.template | 48 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 db/Beckhoff_3XXX/ecmcEL3751_status-chX.template diff --git a/db/Beckhoff_3XXX/ecmcEL3751.substitutions b/db/Beckhoff_3XXX/ecmcEL3751.substitutions index 8d3e7fcf3..34e50f65c 100644 --- a/db/Beckhoff_3XXX/ecmcEL3751.substitutions +++ b/db/Beckhoff_3XXX/ecmcEL3751.substitutions @@ -4,7 +4,7 @@ file "ecmc_analogInputArray-chX.template" {01, "asynInt32ArrayIn", "LONG" } } -file "ecmcELM360X-stat-chX.template" +file "ecmcEL3751_status-chX.template" { pattern {CH_ID} {01 } diff --git a/db/Beckhoff_3XXX/ecmcEL3751_Scalar.substitutions b/db/Beckhoff_3XXX/ecmcEL3751_Scalar.substitutions index 0ab33766c..a98d784e1 100644 --- a/db/Beckhoff_3XXX/ecmcEL3751_Scalar.substitutions +++ b/db/Beckhoff_3XXX/ecmcEL3751_Scalar.substitutions @@ -4,7 +4,7 @@ file "ecmc_analogInput-chX.template" {01, 1, 0, "Raw", 3 } } -file "ecmc_status_analog-chX.template" +file "ecmcEL3751_status-chX.template" { pattern {CH_ID, KEY } {01, "AI"} diff --git a/db/Beckhoff_3XXX/ecmcEL3751_status-chX.template b/db/Beckhoff_3XXX/ecmcEL3751_status-chX.template new file mode 100644 index 000000000..ac378dec3 --- /dev/null +++ b/db/Beckhoff_3XXX/ecmcEL3751_status-chX.template @@ -0,0 +1,48 @@ +#- Statusword for EL3751 +#- MACROS +#- mandatory +#- ECMC_P +#- KEY +#- CH_ID + +record(mbbiDirect,"${ECMC_P}${KEY=AI}${CH_ID}-Stat"){ + field(DESC, "$(HWTYPE): AI$(CH_ID): Status Word") + field(PINI, "$(PINI=1)") + field(DTYP, "asynUInt32Digital") + field(INP, "@asynMask($(PORT),$(ADDR=0),0xFFFF,$(TIMEOUT=1))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynUInt32Digital/ec$(MASTER_ID).s$(SLAVE_POS).status${CH_ID}?") + field(SCAN, "I/O Intr") + field(FLNK, "${ECMC_P}${KEY=AI}${CH_ID}-UndrLimAlrm.PROC") + field(TSE, "$(TSE=-2)") +} + +record(bi,"${ECMC_P}${KEY=AI}${CH_ID}-UndrLimAlrm"){ + field(DESC, "$(HWTYPE): AI$(CH_ID): Under Range Alarm") + field(INP, "${ECMC_P}${KEY=AI}${CH_ID}-Stat.B9") + field(ZNAM, "No Alarm") + field(ONAM, "Under Range") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + field(FLNK, "${ECMC_P}${KEY=AI}${CH_ID}-OvrLimAlrm") + field(TSE, "$(TSE=-2)") +} + +record(bi,"${ECMC_P}${KEY=AI}${CH_ID}-OvrLimAlrm"){ + field(DESC, "$(HWTYPE): AI$(CH_ID): Over Range Alarm") + field(INP, "${ECMC_P}${KEY=AI}${CH_ID}-Stat.BA") + field(ZNAM, "No Alarm") + field(ONAM, "Over Range") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + field(FLNK, "${ECMC_P}${KEY=AI}${CH_ID}-ErrAlrm") + field(TSE, "$(TSE=-2)") +} + +record(bi,"${ECMC_P}${KEY=AI}${CH_ID}-ErrAlrm"){ + field(DESC, "$(HWTYPE): AI$(CH_ID): Error Alarm") + field(INP, "${ECMC_P}${KEY=AI}${CH_ID}-Stat.B8") + field(ZNAM, "No Alarm") + field(ONAM, "Error") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + field(TSE, "$(TSE=-2)") +} From 0ad505955b15b49e1abe5341b28c3488f95f16a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 9 Sep 2024 13:42:01 +0200 Subject: [PATCH 016/128] Add generic panel for Ex3xx1 --- .../Beckhoff_3XXX/EL/ecmcEL3751_Scalar.cmd | 2 + qt/ecmcEx3xx1.ui | 384 ++++++++++++++++++ 2 files changed, 386 insertions(+) create mode 100644 qt/ecmcEx3xx1.ui diff --git a/hardware/Beckhoff_3XXX/EL/ecmcEL3751_Scalar.cmd b/hardware/Beckhoff_3XXX/EL/ecmcEL3751_Scalar.cmd index cd58634a1..73eb0fb1f 100644 --- a/hardware/Beckhoff_3XXX/EL/ecmcEL3751_Scalar.cmd +++ b/hardware/Beckhoff_3XXX/EL/ecmcEL3751_Scalar.cmd @@ -33,3 +33,5 @@ ecmcConfigOrDie "Cfg.EcAddEntryDT(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${EC #- Cleanup epicsEnvUnset(ECMC_CH) +#- Default panel +epicsEnvSet("ECMC_HW_PANEL" "Ex3xx1") diff --git a/qt/ecmcEx3xx1.ui b/qt/ecmcEx3xx1.ui new file mode 100644 index 000000000..5aa8f4377 --- /dev/null +++ b/qt/ecmcEx3xx1.ui @@ -0,0 +1,384 @@ + + + Form + + + + 0 + 0 + 125 + 500 + + + + Form + + + + + 0 + 0 + 128 + 500 + + + + <html><head/><body><p>OPERATIONAL status of the slave</p></body></html> + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + + + ecmcE_slave_frame.ui + + + + + + 2 + 40 + 121 + 206 + + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),CH=1 + + + caFrame::Outline + + + + + 0 + 0 + 121 + 101 + + + + false + + + channel 1 + + + true + + + + + 2 + 15 + 120 + 80 + + + + CH=1,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + $(IOC):m$(MasterID)s$(SlaveID)-AI0$(CH) + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::Channel + + + + + + + $(IOC):m$(MasterID)s$(SlaveID)-AI0$(CH).EGU + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::User + + + + + + + + + 2 + + + + + + + + over range + + + Qt::PlainText + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + + <html><head/><body><p>E-Bus Power Status</p></body></html> + + + true + + + false + + + 16 + + + 16 + + + $(IOC):m$(MasterID)s$(SlaveID)-AI0$(CH)-UndrLimAlrm + + + caLed::Static + + + + 170 + 0 + 0 + + + + + 0 + 85 + 0 + + + + 0 + + + 1 + + + + + + + + + + true + + + false + + + 16 + + + 16 + + + $(IOC):m$(MasterID)s$(SlaveID)-AI0$(CH)-ErrAlrm + + + caLed::Static + + + + 170 + 0 + 0 + + + + + 0 + 85 + 0 + + + + 0 + + + 1 + + + + + + + + + + error + + + Qt::PlainText + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + + + + + under range + + + Qt::PlainText + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + + + + + + + + true + + + false + + + 16 + + + 16 + + + $(IOC):m$(MasterID)s$(SlaveID)-AI0$(CH)-OvrLimAlrm + + + caLed::Static + + + + 170 + 0 + 0 + + + + + 0 + 85 + 0 + + + + 0 + + + 1 + + + + + + + + + + + + + 2 + 212 + 121 + 206 + + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) + + + caFrame::Outline + + + + + + caFrame + QFrame +
caFrame
+ 1 +
+ + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+
+ + +
From e733da2342b4371a357fa5eec96f7d0e1d238f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 08:25:21 +0200 Subject: [PATCH 017/128] Expose motor record SPAM field --- db/core/ecmcMotorRecord.template | 1 + 1 file changed, 1 insertion(+) diff --git a/db/core/ecmcMotorRecord.template b/db/core/ecmcMotorRecord.template index b6aab3843..3600f1c2e 100644 --- a/db/core/ecmcMotorRecord.template +++ b/db/core/ecmcMotorRecord.template @@ -35,6 +35,7 @@ record(motor,"$(PREFIX)$(MOTOR_NAME)") field(SREV, "$(SREV=1)") field(UREV, "$(UREV=1.0)") field(VMAX, "$(VMAX=0)") + field(SPAM, "$(SPAM=15)") } # The message text From b34f10f36c9af90f59da2ed9373d93e6e5b5722a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 08:57:31 +0200 Subject: [PATCH 018/128] Add details to header of all scripts --- scripts/addAxis.cmd | 1 + scripts/addDomain.cmd | 2 +- scripts/addEcDataItem.cmd | 7 ++----- scripts/addEcSdoRT.cmd | 1 + scripts/addEncoder.cmd | 4 ++-- scripts/addMaster.cmd | 1 + scripts/addSlaveKL.cmd | 2 +- scripts/addVirtualAxis.cmd | 1 + scripts/applyConfig.cmd | 1 + scripts/applySlaveConfig.cmd | 1 + scripts/applySlaveDCconfig.cmd | 1 + scripts/finalize.cmd | 1 + scripts/jinja2/loadYamlEnc.cmd | 2 +- scripts/loadPlugin.cmd | 1 + scripts/loadSubstAxes.cmd | 2 +- scripts/loadSubstConfig.cmd | 1 + scripts/loadSubstHw.cmd | 1 + scripts/restoreRecordUpdateRate.cmd | 1 + scripts/setAppMode.cmd | 1 + scripts/setDiagnostics.cmd | 1 + scripts/setRecordUpdateRate.cmd | 1 + 21 files changed, 23 insertions(+), 11 deletions(-) diff --git a/scripts/addAxis.cmd b/scripts/addAxis.cmd index 625a9491e..f10e1f056 100644 --- a/scripts/addAxis.cmd +++ b/scripts/addAxis.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for adding axis EPICS PVs. +#-d \details Adds an motion axis. #-d \author Niko Kivel #-d \file #-d */ diff --git a/scripts/addDomain.cmd b/scripts/addDomain.cmd index 544ec417a..1dc72135c 100644 --- a/scripts/addDomain.cmd +++ b/scripts/addDomain.cmd @@ -2,7 +2,7 @@ # addDomain.cmd #-d /** #-d \brief Script for adding an EtherCAT domain. -#-d +#-d \details Adds an EtherCAt domain. #-d \author Anders Sandström #-d \file #-d \param EXE_RATE (optional) Execution rate [cycles] defaults 0 (same EC_RATE) diff --git a/scripts/addEcDataItem.cmd b/scripts/addEcDataItem.cmd index b67230e44..93764d750 100644 --- a/scripts/addEcDataItem.cmd +++ b/scripts/addEcDataItem.cmd @@ -2,11 +2,8 @@ # addEcDataItem.cmd #-d /** #-d \brief Script for adding a ethercat data item. -#-d - -#-d The ethercat data item allows for accessing alreday configured ethercat domain data in a flexible -#-d way by defining a start entry, byte and bit offset and data type. -#-d +#-d \details The ethercat data item allows for accessing alreday configured ethercat domain data in a flexible +#-d way by defining a start entry, byte and bit offset and data type. Basically it's a pointer directlly into the process image. #-d \author Anders Sandström #-d \file #-d \param STRT_ENTRY_S_ID : (optional) start entry bus position, defaults to "ECMC_EC_SLAVE_NUM" diff --git a/scripts/addEcSdoRT.cmd b/scripts/addEcSdoRT.cmd index e517071e4..d5633191f 100644 --- a/scripts/addEcSdoRT.cmd +++ b/scripts/addEcSdoRT.cmd @@ -2,6 +2,7 @@ # addEcSdoRT.cmd #-d /** #-d \brief Script for adding asyn SDO object (access to SDO:s in realtime) +#-d \details Add SDO for async access during realtime operation #-d \author Anders Sandström #-d \file #-d \param SLAVE_ID (optional) bus position diff --git a/scripts/addEncoder.cmd b/scripts/addEncoder.cmd index 5a5916f6b..7297be980 100644 --- a/scripts/addEncoder.cmd +++ b/scripts/addEncoder.cmd @@ -3,8 +3,8 @@ #- Arguments: CONFIG, [DEV], [CLEAR_VARS_CMD] #-d /** -#-d \brief Script for adding an axis with configuration. -#-d \details Adds an axis to the configuration and applies parameters provided by CONFIG. +#-d \brief Script for adding an extra encoder to an axis. +#-d \details Adds an encoder to the last configured axis. #-d \author Niko Kivel #-d \file #-d \param CONFIG configuration file, i.e. ./cfg/axis_1_enc_2.enc diff --git a/scripts/addMaster.cmd b/scripts/addMaster.cmd index ea6f59e9d..782c32843 100644 --- a/scripts/addMaster.cmd +++ b/scripts/addMaster.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for claiming a particular master. +#-d \details Claims an EtherCAT master. #-d \author Niko Kivel #-d \file #-d \param MASTER_ID (optional) master ID as shown by `ethercat master`. diff --git a/scripts/addSlaveKL.cmd b/scripts/addSlaveKL.cmd index ca37b3f6f..731dc0903 100644 --- a/scripts/addSlaveKL.cmd +++ b/scripts/addSlaveKL.cmd @@ -3,7 +3,7 @@ #- Arguments: HW_DESC, SLAVE_ID, SLAVE_ID_KL #-d /** -#-d \brief Script for adding a slave to the EtherCAT bus configuration of KL type. +#-d \brief Script for adding a KL slave to the EtherCAT bus configuration of KL type. #-d \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 #-d \author Anders Sandstrom #-d \file diff --git a/scripts/addVirtualAxis.cmd b/scripts/addVirtualAxis.cmd index 4b26621df..3e4d258ce 100644 --- a/scripts/addVirtualAxis.cmd +++ b/scripts/addVirtualAxis.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for adding axis EPICS PVs. +#-d \details Adds an virtual axis with PVs #-d \author Niko Kivel #-d \file #-d */ diff --git a/scripts/applyConfig.cmd b/scripts/applyConfig.cmd index 1e36985bf..ee55d15f7 100644 --- a/scripts/applyConfig.cmd +++ b/scripts/applyConfig.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for applying bus configuration. +#-d \details Applies the EtherCAT configuration and caluclates data offsets in the process image. #-d \author Niko Kivel #-d \file #-d \note Example call: diff --git a/scripts/applySlaveConfig.cmd b/scripts/applySlaveConfig.cmd index a81640ef1..ffdcfbd1a 100644 --- a/scripts/applySlaveConfig.cmd +++ b/scripts/applySlaveConfig.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for applying a specific slave configuration after the slave had been added manually. +#-d \details Apply configurations to a slave. #-d \author Niko Kivel #-d \file #-d \note Example call: diff --git a/scripts/applySlaveDCconfig.cmd b/scripts/applySlaveDCconfig.cmd index 3349cc65a..8e30efae5 100644 --- a/scripts/applySlaveDCconfig.cmd +++ b/scripts/applySlaveDCconfig.cmd @@ -1,5 +1,6 @@ #-d /** #-d \brief Script for applying dc config to slave +#-d \details Apply dc configurations to a slave. #-d \author Anders Sandstroem #-d \file #-d \param SLAVE_ID Slave Id diff --git a/scripts/finalize.cmd b/scripts/finalize.cmd index c573e6f57..0e0c489a2 100644 --- a/scripts/finalize.cmd +++ b/scripts/finalize.cmd @@ -3,6 +3,7 @@ #- Arguments: n/a #-d /** #-d \brief Script for finalizing. Executed just before iocInit (atInit) +#-d \details Script for finalizing. Executed just before iocInit (atInit). #-d \author Anders Sandström #-d \file #-d */ diff --git a/scripts/jinja2/loadYamlEnc.cmd b/scripts/jinja2/loadYamlEnc.cmd index 6d8ed429f..3e219bd23 100644 --- a/scripts/jinja2/loadYamlEnc.cmd +++ b/scripts/jinja2/loadYamlEnc.cmd @@ -3,7 +3,7 @@ #-d /** #-d \brief Script for adding Encoder from yaml file via `jinja2` -#-d \details adds an Axis, based on a yaml config file +#-d \details adds an encoder to an axis, based on a yaml config file #-d \author Anders Sandström #-d \file #-d \param FILE the yaml-file containing the PLC definition diff --git a/scripts/loadPlugin.cmd b/scripts/loadPlugin.cmd index f6eeb5a08..8241db2d1 100644 --- a/scripts/loadPlugin.cmd +++ b/scripts/loadPlugin.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for loading a ecmc plugin from file. +#-d \details Loads a ecmc-plugin from file. #-d \author Anders Sandström #-d \file #-d \param FILE Filename of plugin shared lib (./ecmcPlugin_Advanced.so) diff --git a/scripts/loadSubstAxes.cmd b/scripts/loadSubstAxes.cmd index a860ff4c3..f92c1e160 100644 --- a/scripts/loadSubstAxes.cmd +++ b/scripts/loadSubstAxes.cmd @@ -1,9 +1,9 @@ #============================================================================== # loadSubstAxes.cmd #- Arguments: FILE - #-d /** #-d \brief Script for adding multiple axes based on subst and template file +#-d \details Configure multiple axes by using subst file #-d \author Anders Sandström #-d \file #-d \param FILE Subsitution file , i.e. ./plc/ax.subs diff --git a/scripts/loadSubstConfig.cmd b/scripts/loadSubstConfig.cmd index 1831b0556..f8c72774d 100644 --- a/scripts/loadSubstConfig.cmd +++ b/scripts/loadSubstConfig.cmd @@ -2,6 +2,7 @@ # loadSubstConfig.cmd #-d /** #-d \brief Script for loading complete ecmc cfg based on subst files and templates +#-d \details Loads complete ecmc cfg based on subst files and templates #-d \author Anders Sandström #-d \file #-d \param FILE Subsitution file , i.e. ./cfg.subs diff --git a/scripts/loadSubstHw.cmd b/scripts/loadSubstHw.cmd index 0fb9a71cb..9b57d00eb 100644 --- a/scripts/loadSubstHw.cmd +++ b/scripts/loadSubstHw.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for adding multiple hw based on subst and template file +#-d \details Loads hw cfg based on subst files and templates #-d \author Anders Sandström #-d \file #-d \param FILE Subsitution file , i.e. ./hw.subs diff --git a/scripts/restoreRecordUpdateRate.cmd b/scripts/restoreRecordUpdateRate.cmd index 2b0298edc..9870e5c68 100644 --- a/scripts/restoreRecordUpdateRate.cmd +++ b/scripts/restoreRecordUpdateRate.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Restores record update rate to what was defined in startup.cmd +#-d \details Restores record update rate to what was defined in startup.cmd #-d \author Anders Sandström #-d \file #-d */ diff --git a/scripts/setAppMode.cmd b/scripts/setAppMode.cmd index 383342393..898050188 100644 --- a/scripts/setAppMode.cmd +++ b/scripts/setAppMode.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for switching to operational mode. +#-d \details Restores record update rate to what was defined in startup.cmd #-d \author Niko Kivel #-d \file #-d */ diff --git a/scripts/setDiagnostics.cmd b/scripts/setDiagnostics.cmd index 2ebf56541..2dfbca5b9 100644 --- a/scripts/setDiagnostics.cmd +++ b/scripts/setDiagnostics.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for enabling default diagnostics. +#-d \details Set some default values to diagostics #-d \author Niko Kivel #-d \file #-d */ diff --git a/scripts/setRecordUpdateRate.cmd b/scripts/setRecordUpdateRate.cmd index 82833dd4c..f39a7eade 100644 --- a/scripts/setRecordUpdateRate.cmd +++ b/scripts/setRecordUpdateRate.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for changing record update rate +#-d \details Update record processing rate, all records created after this command will be updated in the specified rate. #-d \author Anders Sandström #-d \file #-d \param RATE_MS (optional) update rate in milli-seconds of any record loaded after this call, defaults to ethercat bus rate. From 373fe22618ce5951c38546959fc3794cc07d0e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 09:11:54 +0200 Subject: [PATCH 019/128] Add more details to command headers --- general/chkOverSampFactOrDie.cmd | 6 +++--- general/chkOverSampTimeOrDie.cmd | 5 +++-- general/chkValidCurrentSetOrDie.cmd | 5 ++--- general/chkValidVoltageSetOrDie.cmd | 6 +++--- general/general.cmd | 4 ++-- general/generalDiagnostics.cmd | 3 ++- general/init.cmd | 3 ++- general/initAll.cmd | 3 ++- general/initAxis.cmd | 3 ++- general/issueWarning.cmd | 4 ++-- general/verifyOrDie.cmd | 4 ++-- motion/ecmc_axis_mr.cmd | 3 ++- motion/ecmc_axis_sync_unset.cmd | 3 ++- motion/ecmc_axis_unset.cmd | 3 ++- motion/ecmc_enc-records.cmd | 1 + motion/ecmc_enc_unset.cmd | 3 ++- motion/ecmc_virt_axis_unset.cmd | 3 ++- 17 files changed, 36 insertions(+), 26 deletions(-) diff --git a/general/chkOverSampFactOrDie.cmd b/general/chkOverSampFactOrDie.cmd index 35632bd11..b4a4bf021 100644 --- a/general/chkOverSampFactOrDie.cmd +++ b/general/chkOverSampFactOrDie.cmd @@ -1,9 +1,9 @@ #============================================================================== # chkOverSampFactOrDie.cmd #-d /** -#-d \brief Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC -#-d need ti use ecmcExit since iocsh command "exit" just stops reading current file -#-d +#-d \brief Validates requested oversampling factor +#-d need to use ecmcExit +#-d \details Checks if requested oversampling factor is valid otherwise exits EPICS/ECMC #-d \author Anders Sandstroem #-d #-d Arguments: diff --git a/general/chkOverSampTimeOrDie.cmd b/general/chkOverSampTimeOrDie.cmd index 3592a8241..e99261487 100644 --- a/general/chkOverSampTimeOrDie.cmd +++ b/general/chkOverSampTimeOrDie.cmd @@ -1,9 +1,10 @@ #============================================================================== # chkOverSampleTimeOrDie.cmd #-d /** -#-d \brief Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time. +#-d \brief Validates the resulting sampling time for oversampling slaves. +#-d if not the exit IOC. +#-d \details Checks if the resulting sampling time for oversampling slaves is higher or equal to the minimum time. #-d if not the exit IOC. -#-d #-d Some oversampling slaves might support higher oversampling rates if the ethercat cycletime is lowered. #-d For instance a ELM3604 can support a NELM of 1000 if the ec sampling rate is 200Hz but only support NELM=20 if ec rate is 1kHz. #-d diff --git a/general/chkValidCurrentSetOrDie.cmd b/general/chkValidCurrentSetOrDie.cmd index 6c8f7ef41..bab6d9398 100644 --- a/general/chkValidCurrentSetOrDie.cmd +++ b/general/chkValidCurrentSetOrDie.cmd @@ -1,9 +1,8 @@ #============================================================================== # chkValidCurrentSetOrDie.cmd #-d /** -#-d \brief Checks if requested run current and standby current is less than max current and larger than 0 -#-d need to use ecmcExit since iocsh command "exit" just stops reading current file. -#-d +#-d \brief Validates current settings +#-d \details Checks if requested run current and standby current is less than max current and larger than 0. #-d \author Anders Sandstroem #-d #-d Arguments: diff --git a/general/chkValidVoltageSetOrDie.cmd b/general/chkValidVoltageSetOrDie.cmd index 96bd55b1c..e9211d324 100644 --- a/general/chkValidVoltageSetOrDie.cmd +++ b/general/chkValidVoltageSetOrDie.cmd @@ -1,9 +1,9 @@ #============================================================================== # chkValidVoltageSetOrDie.cmd #-d /** -#-d \brief Ensure requested nominal voltage is less than max voltage and larger than 0 -#-d need to use ecmcExit since iocsh command "exit" just stops reading current file. -#-d +#-d \brief Validates requested voltage +#-d \details Ensure requested nominal voltage is less than max voltage and larger than 0 +#-d \author Anders Sandstroem #-d Arguments: #-d V_MAX_MV : Max voltage in mV #-d V_NOM_MV : Nominal voltage in mV diff --git a/general/general.cmd b/general/general.cmd index f2c207464..ebffe7254 100644 --- a/general/general.cmd +++ b/general/general.cmd @@ -1,9 +1,9 @@ #============================================================================== # general.cmd #- Arguments: n/a - #-d /** -#-d \brief Script for adding general and master diagnostics EPICS PVs +#-d \brief Add general PVs +#-d \details Script for adding general and master diagnostics EPICS PVs #-d \author Niko Kivel, Anders Sandstroem #-d \file #-d */ diff --git a/general/generalDiagnostics.cmd b/general/generalDiagnostics.cmd index f6ed85be8..1c084b5e6 100644 --- a/general/generalDiagnostics.cmd +++ b/general/generalDiagnostics.cmd @@ -3,7 +3,8 @@ #- Arguments: n/a #-d /** -#-d \brief Script for enabling general diagnostics +#-d \brief Script for general diagnostics +#-d \details Script for setting default diagnostics #-d \author Niko Kivel, Anders Sandstroem #-d \file #-d */ diff --git a/general/init.cmd b/general/init.cmd index 170908ab0..b93d3e4ea 100644 --- a/general/init.cmd +++ b/general/init.cmd @@ -3,7 +3,8 @@ #- Arguments: n/a #-d /** -#-d \brief Script for setting up the basic EPICS environment. +#-d \brief Initialization script +#-d \details Script for setting up the basic EPICS environment. #-d \author Niko Kivel, Anders Sandstroem #-d \file #-d */ diff --git a/general/initAll.cmd b/general/initAll.cmd index b357bb339..fad901d22 100644 --- a/general/initAll.cmd +++ b/general/initAll.cmd @@ -3,7 +3,8 @@ #- Arguments: n/a #-d /** -#-d \brief Script for basic ECMC setup. +#-d \brief Init main script +#-d \details Script for setting up the basic EPICS environment. #-d \author Niko Kivel, Anders Sandstroem #-d \file #-d */ diff --git a/general/initAxis.cmd b/general/initAxis.cmd index a23d83c94..72c98f381 100644 --- a/general/initAxis.cmd +++ b/general/initAxis.cmd @@ -3,7 +3,8 @@ #- Arguments: n/a #-d /** -#-d \brief Script for setting up the basic AXIS environment. +#-d \brief init axis environment +#-d \details Script for setting up the basic AXIS environment. #-d \author Niko Kivel, Anders Sandstroem #-d \file #-d */ diff --git a/general/issueWarning.cmd b/general/issueWarning.cmd index c93a8bef4..c5277d198 100644 --- a/general/issueWarning.cmd +++ b/general/issueWarning.cmd @@ -1,9 +1,9 @@ #============================================================================== # issueWarning.cmd #-d /** -#-d \brief Generic verification script for expressions +#-d \brief Issue a warning +#-d \details Generic verification script for expressions #-d if the evaluated expression is true then issue WARNING TEXT -#-d #-d \author Anders Sandstroem #-d #-d Arguments: diff --git a/general/verifyOrDie.cmd b/general/verifyOrDie.cmd index 7d14caa4f..e0e0bb068 100644 --- a/general/verifyOrDie.cmd +++ b/general/verifyOrDie.cmd @@ -1,9 +1,9 @@ #============================================================================== # verifyOrDie.cmd #-d /** -#-d \brief Generic verification script for expressions +#-d \brief Generic verification script +#-d \details Generic verification script for expressions #-d if the evaluated expression is true the execution will continue otherwise exit -#-d #-d \author Anders Sandstroem #-d #-d Arguments: diff --git a/motion/ecmc_axis_mr.cmd b/motion/ecmc_axis_mr.cmd index 1d1622249..39bc192d9 100644 --- a/motion/ecmc_axis_mr.cmd +++ b/motion/ecmc_axis_mr.cmd @@ -3,7 +3,8 @@ #- Arguments: n/a #-d /** -#-d \brief Script for loading motor record related databases and creating motor record axis object +#-d \brief Script for loading motor record related databases +#-d \details Script for loading motor record related databases and creating motor record axis object #-d \author Anders Sandstroem #-d \file #-d \note This script is typically called by \b ecmc_axis.cmd, often via \b ecmc_axis-records.cmd diff --git a/motion/ecmc_axis_sync_unset.cmd b/motion/ecmc_axis_sync_unset.cmd index 25abbe5e3..cecdd3376 100644 --- a/motion/ecmc_axis_sync_unset.cmd +++ b/motion/ecmc_axis_sync_unset.cmd @@ -2,7 +2,8 @@ # ecmc_axis_sync_unset.cmd #- Arguments: n/a #-d /** -#-d \brief Unsets all varaiables set by ecmc_axis_sync.cmd configuration snippet +#-d \brief Clears all sync related varaiables +#-d \details Unsets all varaiables set by ecmc_axis_sync.cmd configuration snippet #-d \author Anders Sandstroem #-d */ diff --git a/motion/ecmc_axis_unset.cmd b/motion/ecmc_axis_unset.cmd index 6e464fb89..2ec0d006e 100644 --- a/motion/ecmc_axis_unset.cmd +++ b/motion/ecmc_axis_unset.cmd @@ -2,7 +2,8 @@ # ecmc_axis_unset.cmd #- Arguments: n/a #-d /** -#-d \brief Unsets all varaiables set by ecmc_axis.cmd configuration snippet +#-d \brief Clears all motion related variables +#-d \details Unsets all varaiables set by ecmc_axis.cmd configuration snippet #-d \author Anders Sandstroem #-d */ diff --git a/motion/ecmc_enc-records.cmd b/motion/ecmc_enc-records.cmd index 402f51777..26967d391 100644 --- a/motion/ecmc_enc-records.cmd +++ b/motion/ecmc_enc-records.cmd @@ -4,6 +4,7 @@ #-d /** #-d \brief Script for adding encoder related EPICS PVs. +#-d \details Script for adding an encoder to a previously created axis. #-d \author Anders Sandstroem #-d \file #-d \note This script is typically called by \b addAxis.cmd diff --git a/motion/ecmc_enc_unset.cmd b/motion/ecmc_enc_unset.cmd index 97f3b2062..45f3a83ed 100644 --- a/motion/ecmc_enc_unset.cmd +++ b/motion/ecmc_enc_unset.cmd @@ -2,7 +2,8 @@ # ecmc_enc_unset.cmd #- Arguments: n/a #-d /** -#-d \brief Unsets all varaiables set by ecmc_enc.cmd configuration snippet +#-d \brief Clears all encoder related variables +#-d \details Unsets all varaiables set by ecmc_enc.cmd configuration snippet #-d \author Anders Sandstroem #-d */ diff --git a/motion/ecmc_virt_axis_unset.cmd b/motion/ecmc_virt_axis_unset.cmd index 8d0b39c33..7e2ab7d8e 100644 --- a/motion/ecmc_virt_axis_unset.cmd +++ b/motion/ecmc_virt_axis_unset.cmd @@ -2,7 +2,8 @@ # ecmc_virt_axis_unset.cmd #- Arguments: n/a #-d /** -#-d \brief Unsets all varaiables set by ecmc_virt_axis.cmd configuration snippet +#-d \brief Clears all varaibles releated to an virtual axis +#-d \details Unsets all varaiables set by ecmc_virt_axis.cmd configuration snippet #-d \author Anders Sandstroem #-d */ From ba6eec1c437effc9fb0279dec1380bea6c4f13a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 11:33:07 +0200 Subject: [PATCH 020/128] Add some docs --- hugo/content/manual/axis/_index.md | 3 +- hugo/content/manual/axis/axisYaml.md | 227 ++++++++++++++++++ .../manual/axis/best_practice/_index.md | 10 + .../manual/axis/best_practice/servo.md | 74 ++++++ .../axis/best_practice/stepper_biss_c.md | 106 ++++++++ hugo/content/manual/troubleshooting/_index.md | 3 + .../manual/troubleshooting/hardware.md | 13 + hugo/content/manual/troubleshooting/motion.md | 19 +- 8 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 hugo/content/manual/axis/best_practice/_index.md create mode 100644 hugo/content/manual/axis/best_practice/servo.md create mode 100644 hugo/content/manual/axis/best_practice/stepper_biss_c.md create mode 100644 hugo/content/manual/troubleshooting/hardware.md diff --git a/hugo/content/manual/axis/_index.md b/hugo/content/manual/axis/_index.md index d6a217ccb..59915e130 100644 --- a/hugo/content/manual/axis/_index.md +++ b/hugo/content/manual/axis/_index.md @@ -17,4 +17,5 @@ For backward compatibility the classical configuration is still supported. #### linting 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. \ No newline at end of file +This check will point out errors in the structure of the configuration as well as certain type errors. + diff --git a/hugo/content/manual/axis/axisYaml.md b/hugo/content/manual/axis/axisYaml.md index c91fa8a21..3021849d8 100644 --- a/hugo/content/manual/axis/axisYaml.md +++ b/hugo/content/manual/axis/axisYaml.md @@ -403,3 +403,230 @@ monitoring: # 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 + # "powerAutoOnOff=;" //2: What you want, 1:do not use, 0 to disable + # "powerOffDelay=:" + # "powerOnDelay=;" + 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_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 +# 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) +# acc: 20 # Acceleration during homing +# dec: 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 +# timeout: 100 # Sequence timeout + +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 "velocity_filter" 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 + +``` + diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md new file mode 100644 index 000000000..3b0c9f6f7 --- /dev/null +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -0,0 +1,10 @@ ++++ +title = "Best practice" +weight = 10 +chapter = false ++++ + +## Best Practice + +Here you can find some best practice configurations for common usecases + diff --git a/hugo/content/manual/axis/best_practice/servo.md b/hugo/content/manual/axis/best_practice/servo.md new file mode 100644 index 000000000..040cf0757 --- /dev/null +++ b/hugo/content/manual/axis/best_practice/servo.md @@ -0,0 +1,74 @@ ++++ +title = "Servo motor, Ex72xx" +weight = 20 +chapter = false ++++ + +# Configuration for Ex72xx-xxxx Example +* Lab test stage (1mm/rev) +* Motor : AM8111-0F20 + +## Scalings +Config for scaling in mm, mm/s, mm/s2 + +## Motor AM8111-XFX0 +Data about the motor can be found here: +https://infosys.beckhoff.com/english.php?content=../content/1033/am8100/index.html&id= + +Important for scaling factors in axis.yaml is the motor pole count. For the AM8111-XFX0 motor the pole count is 6. + +## Encoder scaling +Only the encoder integrated encoder is configured in this example. The specification of the encoder for a AM8111-0F20 motor: + +``` +One 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. + +* 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: +* 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: +* 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: +``` +axis: + id: ${AX_ID=1} + feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches +``` diff --git a/hugo/content/manual/axis/best_practice/stepper_biss_c.md b/hugo/content/manual/axis/best_practice/stepper_biss_c.md new file mode 100644 index 000000000..41ea7778a --- /dev/null +++ b/hugo/content/manual/axis/best_practice/stepper_biss_c.md @@ -0,0 +1,106 @@ ++++ +title = "Stepper and BISS-C" +weight = 20 +chapter = false ++++ + +# Configuration for EL7041-0052 and EL5042 example +* 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 + +### Encoder scalings +Two encoders are configured: +1. Closed loop: BISS-C. This is used as the default encoder for control +2. Open loop: EL7041 Step counter + +Both these encoders (and drive) should be scaled to the same unit (mm). + +#### RLS BISS-C (encoder 1) + +RLS BISS-C: +* 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 +``` + +#### Open loop (encoder 2) +The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): +* 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): +* 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: +``` +axis: + id: 1 # Axis id + feedSwitchesOutput: ec0.s5.binaryOutput01 # Ethercat entry for feed switches + +``` diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index f76de65d1..1060916f8 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -15,3 +15,6 @@ See a summary, incl. some examples of what possible [here](ethercatcli). ### [troubles with motors](motion) For motion related issues, a very short troubleshooting guide is provided [here](motion). + +### [troubles with hardware](hardware) +For hardware related issues, a very short troubleshooting guide is provided [here](hardware). diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md new file mode 100644 index 000000000..66c37ef11 --- /dev/null +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -0,0 +1,13 @@ ++++ +title = "Hardware" +weight = 11 +chapter = false ++++ + +### Hardware + +### Over current protection EL9227-5500, EL9221-5000 +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 etehrcat 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. The EL9221-5000 has one channel and can therefore only the top button is needed to be pressed. 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. + diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index 9ff696d18..d0108d121 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -47,4 +47,21 @@ For this however, the IOC needs to be reconfigured to _not_ link the hardware to 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 +8. Observe the encoder, or in case of open-loop, the device itself. + +### 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: + +Define the output in axis yaml file: +``` +axis: + id: 1 # Axis id + ... + feedSwitchesOutput: ec0.s5.binaryOutput02 # Ethercat entry for feed switches + ... +``` + +By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binaryOutput\,\): +``` +ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" +``` From 2b76c6d23dd77e45bc4dbcb5e04f6a4a5d0de4a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 11:47:41 +0200 Subject: [PATCH 021/128] Add some best practice examples --- examples/PSI/best_practice/README.md | 18 +++ .../PSI/best_practice/motion/servo/README.md | 68 +++++++++++ .../best_practice/motion/servo/cfg/axis.yaml | 84 ++++++++++++++ .../best_practice/motion/servo/startup.cmd | 23 ++++ .../motion/stepper_bissc/README.md | 100 ++++++++++++++++ .../motion/stepper_bissc/cfg/axis.yaml | 89 +++++++++++++++ .../stepper_bissc/cfg/enc_open_loop.yaml | 12 ++ .../motion/stepper_bissc/startup.cmd | 65 +++++++++++ examples/PSI/best_practice/plcs/README.md | 107 ++++++++++++++++++ examples/PSI/best_practice/plcs/cfg/main.plc | 12 ++ .../plcs/cfg/toggle_output.plc_inc | 3 + examples/PSI/best_practice/plcs/startup.cmd | 23 ++++ 12 files changed, 604 insertions(+) create mode 100644 examples/PSI/best_practice/README.md create mode 100644 examples/PSI/best_practice/motion/servo/README.md create mode 100644 examples/PSI/best_practice/motion/servo/cfg/axis.yaml create mode 100644 examples/PSI/best_practice/motion/servo/startup.cmd create mode 100644 examples/PSI/best_practice/motion/stepper_bissc/README.md create mode 100644 examples/PSI/best_practice/motion/stepper_bissc/cfg/axis.yaml create mode 100644 examples/PSI/best_practice/motion/stepper_bissc/cfg/enc_open_loop.yaml create mode 100644 examples/PSI/best_practice/motion/stepper_bissc/startup.cmd create mode 100644 examples/PSI/best_practice/plcs/README.md create mode 100755 examples/PSI/best_practice/plcs/cfg/main.plc create mode 100755 examples/PSI/best_practice/plcs/cfg/toggle_output.plc_inc create mode 100644 examples/PSI/best_practice/plcs/startup.cmd diff --git a/examples/PSI/best_practice/README.md b/examples/PSI/best_practice/README.md new file mode 100644 index 000000000..96176ed20 --- /dev/null +++ b/examples/PSI/best_practice/README.md @@ -0,0 +1,18 @@ +# Best practise for ecmc + +## Motion + +### stepper and BISS_C +* Stepper motor +* RLS BISS encoder +* Open loop encoder + +### Servo +* EL72xx servo equipped with a AM8111 motor with absolute encoder (OCT-version) + +## PLC +* Macros +* include, substitute + + + diff --git a/examples/PSI/best_practice/motion/servo/README.md b/examples/PSI/best_practice/motion/servo/README.md new file mode 100644 index 000000000..32049ccc2 --- /dev/null +++ b/examples/PSI/best_practice/motion/servo/README.md @@ -0,0 +1,68 @@ +# Configuration for Ex72xx-xxxx +* Lab test stage (1mm/rev) +* Motor : AM8111-0F20 + +## Scalings +Config for scaling in mm, mm/s, mm/s2 + +## Motor AM8111-XFX0 +Data about the motor can be found here: +https://infosys.beckhoff.com/english.php?content=../content/1033/am8100/index.html&id= + +Important for scaling factors in axis.yaml is the motor pole count. For the AM8111-XFX0 motor the pole count is 6. + +## Encoder scaling +Only the encoder integrated encoder is configured in this example. The specification of the encoder for a AM8111-0F20 motor: + +``` +One 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. + +* 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: +* 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: +* 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: +``` +axis: + id: ${AX_ID=1} + feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches +``` diff --git a/examples/PSI/best_practice/motion/servo/cfg/axis.yaml b/examples/PSI/best_practice/motion/servo/cfg/axis.yaml new file mode 100644 index 000000000..887feb04e --- /dev/null +++ b/examples/PSI/best_practice/motion/servo/cfg/axis.yaml @@ -0,0 +1,84 @@ +# Macros: +# AX_ID : This axis id +# AX_NAME : This axis name +# DRV_ID : Slave id of drive +# BO_ID : Slave Id of binary output for feeding switches +# OFFSET : Offset + +axis: + id: ${AX_ID=1} + #feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches + +epics: + name: ${AX_NAME=Axis1} + precision: 3 + unit: mm + motorRecord: + enable: true + description: "" + fieldInit: "RTRY=0,FOFF=Frozen" + +# Max scale is for motors with: +# * 6 pole: Max scale is 8000revs/s (in this case 8000mm/s) +# * 8 pole: Max scale is 6000revs/s +drive: + numerator: 8000 # mm/s, Max speed is 8000 rev/sec for drive with 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 + +# 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 # 20bits + bits: 32 + absBits: 32 + absOffset: $(OFFSET=0) + +controller: + Kp: 10.0 + Ki: 0.01 + Kd: 0.0 + +trajectory: + source: 0 + type: 1 + axis: + velocity: 10 + acceleration: 10 + decceleration: 10 + +input: + limit: + forward: ec0.s$(DRV_ID).ONE.1 + backward: ec0.s$(DRV_ID).ONE.0 + home: ec0.s$(DRV_ID).ONE.0 + interlock: ec0.s$(DRV_ID).ONE.0 + +softlimits: + enable: no + backwardEnable: yes + forwardEnable: yes + forward: 10 + backward: -10 + +monitoring: + lag: + enable: yes + tolerance: 0.1 + time: 100 + target: + enable: yes + tolerance: 0.01 + time: 100 + velocity: + enable: yes + max: 20 + time: + trajectory: 100 + drive: 200 diff --git a/examples/PSI/best_practice/motion/servo/startup.cmd b/examples/PSI/best_practice/motion/servo/startup.cmd new file mode 100644 index 000000000..1947a9452 --- /dev/null +++ b/examples/PSI/best_practice/motion/servo/startup.cmd @@ -0,0 +1,23 @@ +############################################################################## +## Example config for ep7211-0034 + +require ecmccfg v9.5.5_RC1, "ECMC_VER=v9.5.5_RC1,ENG_MODE=1" +require ecmccomp + +#- ############################################################################ +#- Configure hardware +#- ethercat slaves +#- Master0 +#- ... +#- 16 0:16 PREOP + EP7211-0034 1K. MDP742 Servo-Motor-Endstufe mit OCT (50V, 4,5A +#- ... + +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EP7211-0034_ALL_FB" +#- Limit torque to 50% of motor rated torque. Rated current = 2710mA, set to half I_MAX_MA=1355 +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Beckhoff-AM8111-XFX0, MACROS='I_MAX_MA=1355'" +$(SCRIPTEXEC) $(ecmccfg_DIR)loadYamlAxis.cmd "FILE=./cfg/axis.yaml, DRV_ID=$(ECMC_EC_SLAVE_NUM), AX_NAME='Axis1', AX_ID=1" + +#- ############################################################################ +#- Go active +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd diff --git a/examples/PSI/best_practice/motion/stepper_bissc/README.md b/examples/PSI/best_practice/motion/stepper_bissc/README.md new file mode 100644 index 000000000..44ce4d6d2 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc/README.md @@ -0,0 +1,100 @@ +# Configuration for EL7041-0052 and EL5042 +* 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 + +### Encoder scalings +Two encoders are configured: +1. Closed loop: BISS-C. This is used as the default encoder for control +2. Open loop: EL7041 Step counter + +Both these encoders (and drive) should be scaled to the same unit (mm). + +#### RLS BISS-C (encoder 1) + +RLS BISS-C: +* 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 +``` + +#### Open loop (encoder 2) +The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): +* 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): +* 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: +``` +axis: + id: 1 # Axis id + feedSwitchesOutput: ec0.s5.binaryOutput01 # Ethercat entry for feed switches + +``` diff --git a/examples/PSI/best_practice/motion/stepper_bissc/cfg/axis.yaml b/examples/PSI/best_practice/motion/stepper_bissc/cfg/axis.yaml new file mode 100644 index 000000000..b85b249c2 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc/cfg/axis.yaml @@ -0,0 +1,89 @@ +axis: + id: ${AXIS_ID=1} # Axis id + feedSwitchesOutput: ec0.s${BO_SID}.binaryOutput${BO_CH=01} # Ethercat entry for feed switches + +epics: + name: ${AX_NAME=M1} # Axis anme + precision: 3 # Decimal count + description: Test cfg # Axis description + unit: mm # Unit + motorRecord: + fieldInit: 'RTRY=0,FOFF=Frozen' # Extra config for Motor record + +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) + +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: 32 # 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 + +controller: + Kp: 10 # Kp proportinal gain + Ki: 0 # Ki integral gain + Kd: 0 # Kd derivative gain + +trajectory: + axis: + velocity: 2 # Default velo for axis + acceleration: 2 # Default acc for axis + deceleration: 2 # Default dec for axis + emergencyDeceleration: 5 # Deceleration when axis in error state + jerk: 10 # Default jerk for axis + jog: + velocity: 1 # Default velo fro JOG (motor record) + +input: + 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 + +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: true # Enable position lag monitoring (following error) + tolerance: 0.1 # Allowed tolerance + time: 10 # Allowed time outside tolerance target: + velocity: + enable: false # Enable velocity monitoring + max: 8 # 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 + target: + enable: true # Enable at target monitoring (needs to be enabled if using motor record) + tolerance: 0.01 # Allowed tolerance + time: 10 # Filter time inside tolerance to be at target diff --git a/examples/PSI/best_practice/motion/stepper_bissc/cfg/enc_open_loop.yaml b/examples/PSI/best_practice/motion/stepper_bissc/cfg/enc_open_loop.yaml new file mode 100644 index 000000000..3abf8df5f --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc/cfg/enc_open_loop.yaml @@ -0,0 +1,12 @@ +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) diff --git a/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd new file mode 100644 index 000000000..75da18f24 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd @@ -0,0 +1,65 @@ +############################################################################## +## Example config for EL7041 and EL5042 + +require ecmccfg v9.5.5_RC1 "ECMC_VER=v9.5.5_RC1,ENG_MODE=1" +require ecmccomp + +#- ############################################################################ +#- Master0 +#- 0 0:0 PREOP + EK1100 EtherCAT-Koppler (2A E-Bus) +#- 1 0:1 PREOP + EL9227-5500 �berstromschutz 24V DC, 2K., max. 10A (Summe), eins +#- 2 0:2 PREOP + EL5042 2Ch. BiSS-C Encoder +#- 3 0:3 PREOP + EL5042 2Ch. BiSS-C Encoder +#- 4 0:4 PREOP + EL3204 4K. Ana. Eingang PT100 (RTD) +#- 5 0:5 PREOP + EL2008 8K. Dig. Ausgang 24V, 0.5A +#- 6 0:6 PREOP + EL1008 8K. Dig. Eingang 24V, 3ms +#- 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) + + +# 0:0 - EK1100 EtherCAT coupler +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EK1100" + +# 0:1 - EL9227-5500 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL9227-5500" + +# 0:2 - EL5042 2Ch BiSS-C Encoder, RLS-LA11 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL5042" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=2" +epicsEnvSet(ENC_SID,${ECMC_EC_SLAVE_NUM}) + +# 0:3 - EL5042 2Ch BiSS-C Encoder +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL5042" + +# 0:4 - EL3204 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL3204" + +# 0:5 - EL2008 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL2008" +epicsEnvSet(BO_SID,${ECMC_EC_SLAVE_NUM}) + +# 0:6 - EL1008 8K. Dig. Eingang 24V, 3ms +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL1008" + +# 0:7 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml, DEV=${IOC}, AX_NAME=M1, AXIS_ID=1, DRV_SID=${ECMC_EC_SLAVE_NUM}, ENC_SID=${ENC_SID}, ENC_CH=01, BO_SID=${BO_SID}, BO_CH=01" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlEnc.cmd, "FILE=./cfg/enc_open_loop.yaml, DEV=${IOC}, DRV_SID=${ECMC_EC_SLAVE_NUM}" + +# 0:8 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" + +# 0:9 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" + +# 0:10 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" + +#- ################################################################# +#- Go active +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd diff --git a/examples/PSI/best_practice/plcs/README.md b/examples/PSI/best_practice/plcs/README.md new file mode 100644 index 000000000..c94f32f96 --- /dev/null +++ b/examples/PSI/best_practice/plcs/README.md @@ -0,0 +1,107 @@ +# PLC best practice +* Macros +* MSI include, substitute +* Printouts + +## Macros +Use of macros makes the code more generic. When loading a PLC file with "loadPLCFile.cmd", custom macros can be defined in "PLC\_MACROS": +``` +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +``` +NOTE: ECMC\_EC\_SLAVE\_NUM expands to the ID of the last added slave. + +In addition to the custom macros, a few macros, that are often needed, are predefined: +1. SELF\_ID : Id of current PLC +2. SELF : plc +3. M\_ID : EtherCAT master ID +4. M : ec + +### SELF_ID and SELF example +A common usecase is that some initiation is needed, could be triggering of a custom homing sequence: + +``` +if(${SELF}.firstscan) { + var plc:=${SELF_ID}; + ${DBG=#}println('PLC ',plc,' is starting up'); +}; + +``` +After macro expansion the code would look like this (for PLC id=0,DBG=''): +``` +if(plc0.firstscan) { + var plc:=0; + println('PLC ',plc,' is starting up'); +}; + +``` +### M_ID and M example +All EtherCAT related information/data is accessible through the pattern "ec.s.". +To allow the same code to be loaded on different masters it's a good idea to use the predefined macros,"M" and "M_ID". + +Toggle an output: +``` +${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}); +${DBG=#}println('State: ', ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); +``` +After macro expansion with the following macros the code would look like this: +* BO\_S\_ID = 10 +* BO\_CH = Not defined (defaults to "01") +* DBG = Not defined (defaults to "#") +``` +ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); +#println('State: ', ec0.s10.binaryOutput01); +``` + +## Include and substitute +Since all PLC files and PLC libs are parsed through MSI the "include" and "substitute" commands can be used. + +When using the include command, the file location dir of the file must be added in the INC parameter when loading the PLC: +``` +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +``` +The "INC" parameter can contain several directories separated with a ":", making it possible to include PLC files from several locations/modules. + +### Example: Toggle a few outputs +As a demo usecase let's consider that a few outputs needs to be toggled. +NOTE: There are simpler ways to write this specifc code but it's used to demo how code can be divided. + +Lets first define some code that toggles a bit (toggle\_output.plc\_inc): +``` +# 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('State: ', ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); + +``` +This code snippet then can be included in a main plc-file by using the "include" keyword. +Each include can then be included with different macros by using the "substitute" keyword: +``` +substitute "BO_CH=01" +include "toggle_output.plc_inc" + +substitute "BO_CH=02, DBG=" +include "toggle_output.plc_inc" +``` +The above code would expand to: +``` +ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); +#println('State:', ec0.s10.binaryOutput01); + +ec0.s10.binaryOutput02:=not(ec0.s10.binaryOutput02); +println('State: ', ec0.s10.binaryOutput02); +``` +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); +``` + diff --git a/examples/PSI/best_practice/plcs/cfg/main.plc b/examples/PSI/best_practice/plcs/cfg/main.plc new file mode 100755 index 000000000..09f51b60d --- /dev/null +++ b/examples/PSI/best_practice/plcs/cfg/main.plc @@ -0,0 +1,12 @@ +if(${SELF}.firstscan) { + # do some inits + var plc:=${SELF_ID}; + ${DBG=#}println('PLC ',plc,' is starting up'); +}; + +substitute "BO_CH=01" +include "toggle_output.plc_inc" + +substitute "BO_CH=02, DBG=" +include "toggle_output.plc_inc" + diff --git a/examples/PSI/best_practice/plcs/cfg/toggle_output.plc_inc b/examples/PSI/best_practice/plcs/cfg/toggle_output.plc_inc new file mode 100755 index 000000000..ab5c46760 --- /dev/null +++ b/examples/PSI/best_practice/plcs/cfg/toggle_output.plc_inc @@ -0,0 +1,3 @@ +${M}.s${BO_S_ID}.binaryOutput${BO_CH}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH}); +${DBG=#}println('State: ', ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); + diff --git a/examples/PSI/best_practice/plcs/startup.cmd b/examples/PSI/best_practice/plcs/startup.cmd new file mode 100644 index 000000000..2f56a5815 --- /dev/null +++ b/examples/PSI/best_practice/plcs/startup.cmd @@ -0,0 +1,23 @@ +############################################################################## +## Simple example config for plcs + +require ecmccfg v9.5.5_RC1, "ECMC_VER=v9.5.5_RC1,ENG_MODE=1" + +#- ############################################################################ +#- Configure hardware +#- ethercat slaves +#- Master0 +#- ... +#- 10 0:10 PREOP + EL2819 16K. Dig. Ausgang 24V, 0,5A, Diagnose +#- ... +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=10, HW_DESC=EL2819" + +#- ############################################################################ +#- Load PLC (note the include dir (INC) and the use of ECMC_EC_SLAVE_NUM) +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" + +#- ############################################################################ +#- Go active +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd + From f0e3e51804f77a2b3449310ffe43cf2afca53db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 11:51:26 +0200 Subject: [PATCH 022/128] Update docs --- hugo/content/manual/axis/best_practice/_index.md | 9 ++++++++- hugo/content/manual/axis/best_practice/servo.md | 3 +-- hugo/content/manual/axis/best_practice/stepper_biss_c.md | 3 +-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md index 3b0c9f6f7..784371d14 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -5,6 +5,13 @@ chapter = false +++ ## Best Practice +Here you can find some best practice configurations for common usecases. +The complete examples with starup files can be found [here](https://paulscherrerinstitute.github.io/ecmccfg/examples/PSI/best_practice) -Here you can find some best practice configurations for common usecases +### [Stepper and BISS-C](stepper_biss_c) +An example configuration of a EL7041-0052 and a EL5042. +The complete example with starup file can be found [here](https://paulscherrerinstitute.github.io/ecmccfg/examples/PSI/best_practice//motion/stepper_bissc) +### [Servo](servo) +An example configuration of a Ex72xx servo drive with AM8xxx motor. +The complete example with starup file can be found [here](https://paulscherrerinstitute.github.io/ecmccfg/examples/PSI/best_practice//motion/servo) diff --git a/hugo/content/manual/axis/best_practice/servo.md b/hugo/content/manual/axis/best_practice/servo.md index 040cf0757..f1efc7b30 100644 --- a/hugo/content/manual/axis/best_practice/servo.md +++ b/hugo/content/manual/axis/best_practice/servo.md @@ -1,10 +1,9 @@ +++ -title = "Servo motor, Ex72xx" +title = "Servo motor (Ex72xx)" weight = 20 chapter = false +++ -# Configuration for Ex72xx-xxxx Example * Lab test stage (1mm/rev) * Motor : AM8111-0F20 diff --git a/hugo/content/manual/axis/best_practice/stepper_biss_c.md b/hugo/content/manual/axis/best_practice/stepper_biss_c.md index 41ea7778a..32e44511c 100644 --- a/hugo/content/manual/axis/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/axis/best_practice/stepper_biss_c.md @@ -1,10 +1,9 @@ +++ -title = "Stepper and BISS-C" +title = "Stepper and BISS-C (EL7041, EL5042)" weight = 20 chapter = false +++ -# Configuration for EL7041-0052 and EL5042 example * Lab test stage (1mm/rev) * Lab 4 axis motion control box * RLS BISS-C linear encoder (absolute) From 9b61a6062d8f553211fe9ee95c5c9a6893ac18d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 11:54:35 +0200 Subject: [PATCH 023/128] Fix links --- hugo/content/manual/axis/best_practice/_index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md index 784371d14..65f5f7b10 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -6,12 +6,12 @@ chapter = false ## Best Practice Here you can find some best practice configurations for common usecases. -The complete examples with starup files can be found [here](https://paulscherrerinstitute.github.io/ecmccfg/examples/PSI/best_practice) +The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) ### [Stepper and BISS-C](stepper_biss_c) An example configuration of a EL7041-0052 and a EL5042. -The complete example with starup file can be found [here](https://paulscherrerinstitute.github.io/ecmccfg/examples/PSI/best_practice//motion/stepper_bissc) +The complete example with starup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/stepper_bissc) ### [Servo](servo) An example configuration of a Ex72xx servo drive with AM8xxx motor. -The complete example with starup file can be found [here](https://paulscherrerinstitute.github.io/ecmccfg/examples/PSI/best_practice//motion/servo) +The complete example with starup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/servo) From 98e628869e6a81566dc33aa4002a5cd5ac7f5c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 12:08:32 +0200 Subject: [PATCH 024/128] Update PLC docs --- examples/test/plcs/ReadMe.md | 2 +- .../manual/PLC/best_practice/_index.md | 115 ++ hugo/content/manual/PLC/plcSyntax.md | 1133 ++++++++++------- .../manual/axis/best_practice/_index.md | 2 +- scripts/addVirtualAxis.cmd | 2 +- 5 files changed, 798 insertions(+), 456 deletions(-) create mode 100644 hugo/content/manual/PLC/best_practice/_index.md diff --git a/examples/test/plcs/ReadMe.md b/examples/test/plcs/ReadMe.md index aa21af958..4d061bd52 100644 --- a/examples/test/plcs/ReadMe.md +++ b/examples/test/plcs/ReadMe.md @@ -99,7 +99,7 @@ Below the ECMC specific accessible variables and functions are listed: 13. ax.traj.setpos curent trajectory setpoint (rw) 14. ax.traj.targetpos target position (rw) 15. ax.traj.extsetpos current trajecrory setpoint from - plc sync. expression (ro) + plc sync. expression (rw) 16. ax.traj.targetvel target velocity setpoint (rw) 17. ax.traj.targetacc target acceleration setpoint (rw) 18. ax.traj.targetdec target deceleration setpoint (rw) diff --git a/hugo/content/manual/PLC/best_practice/_index.md b/hugo/content/manual/PLC/best_practice/_index.md new file mode 100644 index 000000000..03ab8ed86 --- /dev/null +++ b/hugo/content/manual/PLC/best_practice/_index.md @@ -0,0 +1,115 @@ ++++ +title = "PLC Best practice" +weight = 10 +chapter = false ++++ + +## 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](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) + +### Macros +Use of macros makes the code more generic. When loading a PLC file with "loadPLCFile.cmd", custom macros can be defined in "PLC\_MACROS": +``` +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +``` +NOTE: ECMC\_EC\_SLAVE\_NUM expands to the ID of the last added slave. + +In addition to the custom macros, a few macros, that are often needed, are predefined: +1. SELF\_ID : Id of current PLC +2. SELF : plc +3. M\_ID : EtherCAT master ID +4. M : ec + +#### SELF_ID and SELF example +A common usecase is that some initiation is needed, could be triggering of a custom homing sequence: + +``` +if(${SELF}.firstscan) { + var plc:=${SELF_ID}; + ${DBG=#}println('PLC ',plc,' is starting up'); +}; + +``` +After macro expansion the code would look like this (for PLC id=0,DBG=''): +``` +if(plc0.firstscan) { + var plc:=0; + println('PLC ',plc,' is starting up'); +}; + +``` +#### M_ID and M example +All EtherCAT related information/data is accessible through the pattern "ec.s.". +To allow the same code to be loaded on different masters it's a good idea to use the predefined macros,"M" and "M_ID". + +Toggle an output: +``` +${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}:=not(${M}.s${BO_S_ID}.binaryOutput${BO_CH=01}); +${DBG=#}println('State: ', ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); +``` +After macro expansion with the following macros the code would look like this: +* BO\_S\_ID = 10 +* BO\_CH = Not defined (defaults to "01") +* DBG = Not defined (defaults to "#") +``` +ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); +#println('State: ', ec0.s10.binaryOutput01); +``` + +### Include and substitute +Since all PLC files and PLC libs are parsed through MSI the "include" and "substitute" commands can be used. + +When using the include command, the file location dir of the file must be added in the INC parameter when loading the PLC: +``` +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +``` +The "INC" parameter can contain several directories separated with a ":", making it possible to include PLC files from several locations/modules. + +#### Example: Toggle a few outputs +As a demo usecase let's consider that a few outputs needs to be toggled. +NOTE: There are simpler ways to write this specifc code but it's used to demo how code can be divided. + +Lets first define some code that toggles a bit (toggle\_output.plc\_inc): +``` +# 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('State: ', ${M}.s${BO_S_ID}.binaryOutput${BO_CH}); + +``` +This code snippet then can be included in a main plc-file by using the "include" keyword. +Each include can then be included with different macros by using the "substitute" keyword: +``` +substitute "BO_CH=01" +include "toggle_output.plc_inc" + +substitute "BO_CH=02, DBG=" +include "toggle_output.plc_inc" +``` +The above code would expand to: +``` +ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); +#println('State:', ec0.s10.binaryOutput01); + +ec0.s10.binaryOutput02:=not(ec0.s10.binaryOutput02); +println('State: ', ec0.s10.binaryOutput02); +``` +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); +``` diff --git a/hugo/content/manual/PLC/plcSyntax.md b/hugo/content/manual/PLC/plcSyntax.md index e9e4e52ce..1b7623c1c 100644 --- a/hugo/content/manual/PLC/plcSyntax.md +++ b/hugo/content/manual/PLC/plcSyntax.md @@ -108,97 +108,100 @@ Below the ECMC specific accessible variables and functions are listed: ### axis ```shell -# Motion variables: -# 1. ax.id axis id (ro) -# 2. ax.reset reset axis error (rw) -# 3. ax.counter execution counter (ro) -# 4. ax.error error (ro) -# 5. ax.allowplccmd Allow writes to axis from PLC (rw) -# 6. ax.enc.actpos actual position (ro) -# 7. ax.enc.extactpos actual position from plc sync. -# expression (ro) -# 8. ax.enc.actvel actual velocity (ro) -# 9. ax.enc.rawpos actual raw position (ro) -# 10. ax.enc.source internal source or expressions (rw) -# source = 0: internal encoder -# source > 0: actual pos from expr -# 11. ax.enc.homed encoder homed (rw) -# 12. ax.enc.homepos homing position (rw) -# 13. ax.traj.setpos curent trajectory setpoint (rw) -# 14. ax.traj.extsetpos current trajecrory setpoint from -# plc sync. expression (ro) -# 15. ax.traj.targetpos target position (rw) -# 16. ax.traj.targetvel target velocity setpoint (rw) -# 17. ax.traj.targetacc target acceleration setpoint (rw) -# 18. ax.traj.targetdec target deceleration setpoint (rw) -# 19. ax.traj.setvel current velocity setpoint (ro) -# 20. ax.traj.setvelffraw feed forward raw velocity (ro) -# 21. ax.traj.command command (rw) -# command=1: move velocity -# command=2: move rel. pos -# command=3: move abs. pos -# command=10: homing -# 22. ax.traj.cmddata cmddat. Homing procedure -# only valid if ax.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.traj.source internal source or expressions (rw) -# source = 0: internal traj -# source > 0: setpoints from expr -# 24. ax.traj.execute execute motion command (rw) -# 25. ax.traj.busy axis busy (ro) -# 26. ax.traj.dir axis setpoint direction (ro) -# ax.traj.dir>0: forward -# ax.traj.dir<0: backward -# ax.traj.dir=0: standstill -# 27. ax.cntrl.error actual controller error (ro) -# 28. ax.cntrl.poserror actual position error (ro) -# 29. ax.cntrl.output actual controller output (ro) -# 30. ax.drv.setvelraw actual raw velocity setpoint (ro) -# 31. ax.drv.enable enable drive command (rw) -# 32. ax.drv.enabled drive enabled (ro) -# 33. ax.seq.state sequence state (homing) (ro) -# 34. ax.mon.ilock motion interlock (both dir) (rw) -# ax.mon.ilock=1: motion allowed -# ax.mon.ilock=0: motion not allowed -# 35. ax.mon.ilockbwd motion interlock bwd dir (rw) -# ax.mon.ilockbwd=1: motion allowed -# ax.mon.ilockbwd=0: motion not allowed -# 36. ax.mon.ilockfwd motion interlock fwd dir (rw) -# ax.mon.ilockfwd=1: motion allowed -# ax.mon.ilockfwd=0: motion not allowed -# 37. ax.mon.attarget axis at taget (ro) -# 38. ax.mon.lowlim low limit switch (ro) -# 39. ax.mon.highlim high limit switch (ro) -# 40. ax.mon.homesensor home sensor (ro) -# 41. ax.mon.lowsoftlim low soft limit (rw) -# 42. ax.mon.highsoftlim high soft limit (rw) -# 43. ax.mon.lowsoftlimenable low soft limit enable (rw) -# 44. ax.mon.highsoftlimenable high soft limit enable (rw) -# 45. ax.blockcom Enables/disables "set" commands (rw) -# via command parser (ascii commands) -# Statuses can still be read. -# Exceptions ("set"-commands) that -# will work: -# - "StopMotion(axid)" -# - "Cfg.SetAxisBlockCom(axid,block)" +1. ax.id axis id (ro) +2. ax.reset reset axis error (rw) +3. ax.counter execution counter (ro) +4. ax.error error (ro) +5. ax.allowplccmd Allow writes to axis from PLC (rw) +6. ax.enc.actpos actual position (rw) +7. ax.enc.extactpos actual position from plc sync. + expression (ro) +8. ax.enc.actvel actual velocity (ro) +9. ax.enc.rawpos actual raw position (ro) +10. ax.enc.source internal source or expressions (rw) + source = 0: internal encoder + source > 0: actual pos from expr +11. ax.enc.homed encoder homed (rw) +12. ax.enc.homepos homing position (rw) +13. ax.traj.setpos curent trajectory setpoint (rw) +14. ax.traj.targetpos target position (rw) +15. ax.traj.extsetpos current trajecrory setpoint from + plc sync. expression (rw) +16. ax.traj.targetvel target velocity setpoint (rw) +17. ax.traj.targetacc target acceleration setpoint (rw) +18. ax.traj.targetdec target deceleration setpoint (rw) +19. ax.traj.setvel current velocity setpoint (ro) +20. ax.traj.setvelffraw feed forward raw velocity (ro) +21. ax.traj.command command (rw) + command=1: move velocity + command=2: move rel. pos + command=3: move abs. pos + command=10: homing +22. ax.traj.cmddata cmddat. Homing procedure + only valid if ax.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.traj.source internal source or expressions (rw) + source = 0: internal traj + source > 0: setpoints from expr +24. ax.traj.execute execute motion command (rw) +25. ax.traj.busy axis busy (ro) +26. ax.traj.dir axis setpoint direction (ro) + ax.traj.dir>0: forward + ax.traj.dir<0: backward + ax.traj.dir=0: standstill +27. ax.cntrl.error actual controller error (ro) +28. ax.cntrl.poserror actual position error (ro) +29. ax.cntrl.output actual controller output (ro) +30. ax.drv.setvelraw actual raw velocity setpoint (ro) +31. ax.drv.enable enable drive command (rw) +32. ax.drv.enabled drive enabled (ro) +33. ax.seq.state sequence state (homing) (ro) +34. ax.mon.ilock motion interlock (both dir) (rw) + ax.mon.ilock=1: motion allowed + ax.mon.ilock=0: motion not allowed +35. ax.mon.ilockbwd motion interlock bwd dir (rw) + ax.mon.ilockbwd=1: motion allowed + ax.mon.ilockbwd=0: motion not allowed +36. ax.mon.ilockfwd motion interlock fwd dir (rw) + ax.mon.ilockfwd=1: motion allowed + ax.mon.ilockfwd=0: motion not allowed +37. ax.mon.attarget axis at taget (ro) +38. ax.mon.lowlim low limit switch (ro) +39. ax.mon.highlim high limit switch (ro) +40. ax.mon.homesensor home sensor (ro) +41. ax.mon.lowsoftlim low soft limit (rw) +42. ax.mon.highsoftlim high soft limit (rw) +43. ax.mon.lowsoftlimenable low soft limit enable (rw) +44. ax.mon.highsoftlimenable high soft limit enable (rw) +45. ax.blockcom Enables/disables "set" commands (rw) + via command parser (ascii commands) + Statuses can still be read. + Exceptions ("set"-commands) that + will work: + - "StopMotion(axid)" + - "Cfg.SetAxisBlockCom(axid,block)" +46. ax.ctrl.kp Set PID-controller kp (rw) +47. ax.ctrl.ki Set PID-controller ki (rw) +48. ax.ctrl.kd Set PID-controller kd (rw) +49. ax.ctrl.kff Set PID-controller kff (rw) - "Cfg.SetAxisBlockCom(axid,block)" ``` ### PLC @@ -240,367 +243,591 @@ Below the ECMC specific accessible variables and functions are listed: ``` ### functions +#### Function Lib: EtherCAT ```shell -# Function Lib: EtherCAT -# 1. retvalue = ec_set_bit( -# , : Value to change -# : Bit index -# ); -# Sets bit at bitindex position of value. Returns the new value. -# -# 2. retvalue = ec_wrt_bit( -# , : Value to change -# , : Value of bit to write -# : Bit index -# ); -# Write wrtValue to a bit at bitindex position of value. Returns the new value. -# -# 3. retvalue = ec_wrt_bits( -# , : Value to change -# , : Value of bit to write -# : Start bit index (lsb is bit 0) -# : Stop bit index -# ); -# Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. -# -# 4. retvalue = ec_clr_bit( -# , : Value to change -# : Bit index -# ); -# Clears bit at bitindex position of value. Returns the new value. -# -# 5. retvalue = ec_flp_bit( -# , : Value to change -# : Bit index -# ); -# Flips bit at bitindex position of value. Returns the new value. -# -# 6. retvalue = ec_chk_bit( -# , : Value to change -# : Bit index -# ); -# Checks bit at bitindex position of value. Returns the value of bit. -# -# 7. retvalue = ec_chk_bits( -# , : Value to change -# : Start bit index (lsb is bit 0) -# : Stop bit index -# ); -# Checks range of bits (startBit..stopBit) of value. Returns the value of bits. -# -# 8. retvalue = ec_print_hex( -# , : Value to print -# : Start bit index -# : Stop bit index -# ); -# Prints to of in hex format -# Returns error code or 0 if success.# -# -# 9. retvalue = ec_print_bin( -# , : Value to print -# : Start bit index -# : Stop bit index -# ); -# Prints to of in bin format -# Returns error code or 0 if success. -# -# 10. retvalue = ec_mm_cp( -# , : Source memmap index -# : 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. -# -# 11. retvalue = ec_get_mm_type( -# , : Source memmap index -# ); -# -# Returns data type of memmap: -# 0 = Not defined (Use "Cfg.EcAddMemMapDT()" instead of "Cfg.EcAddMemMap()") -# 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 -# -# 12. retvalue = ec_get_mm_data( -# , : Source memmap index -# : Index of data element -# ); -# -# Reads data element at index from memmap with srcId and returns value. -# -# 13. retvalue = ec_set_mm_data( -# , : Source memmap index -# : Index of data element -# : Data to write -# ); -# -# Writes data element at index from memmap with srcId. Returns 0 for success or an error code. -# -# 14. retvalue = ec_get_mm_size( -# , : Source memmap index -# ); -# -# Returns number of elements (of type "ec_get_mm_type()")in memmap with srcId. -# If return value is less than zero it should be considered to be an error code. -# -# 14. retvalue = ec_mm_ds_append( -# , : Source memmap index -# ); : Destination data storage index -# -# Returns Error code or zero if success -# -# 15. retvalue = ec_mm_append_to_ds_scale_offset( -# , : Source memmap index -# : Destination data storage index -# : Scale -# ); : Offset -# -# 16. retvalue = ec_mm_push_asyn( -# ) : Source memmap index. -# -# push memap to epics (can be used if T_SMP_MS=-1 for the param) -# The mmId can be retrived by the bellow ecmc command (and feed into plc via macro): -# ecmcConfig "EcGetMemMapId(ec0.s11.mm.CH1_ARRAY_IN)" -# 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. -# -# Function Lib: Motion -# 1. retvalue = mc_move_abs( -# , : Axis index -# , : Trigger -# , : Target position -# , : Target velocity -# , : Acceleration -# : Deceleration -# ): -# Absolute motion of axis. -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 2. retvalue = mc_move_rel( -# , : Axis index -# , : Trigger -# , : Target position -# , : Target velocity -# , : Acceleration -# : Deceleration -# ); -# -# Relative motion of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 3. retvalue = mc_move_ext_pos( -# , : Axis index -# , : Trigger -# , : Target velocity -# , : Acceleration -# : 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 "mc_move_pos()" with the target postion ax.traj.extsetpos. -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 4. retvalue = mc_move_vel( -# , : Axis index -# , : Trigger -# , : Target velocity -# , : Acceleration -# : Deceleration -# ); -# Constant velocity motion of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 5. retvalue = mc_home( -# , : Axis index -# , : Trigger -# , : Motion sequence -# , : Target Velocity twords cam -# : Target velocity off cam -# ); -# Perform a homing sequence of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 6. retvalue = mc_home_pos( -# , : Axis index -# , : Trigger -# , : Motion sequence -# , : Target Velocity twords cam -# : Target velocity off cam -# : Homing position -# ); -# Perform a homing sequence of axis -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 7. retvalue = mc_halt( -# , : Axis index -# , : Trigger -# ); -# Stop motion of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# Note/Warning: This function will not stop a syncronized motion. -# -# 8. retvalue = mc_power( -# , : Axis index -# , : Enable power -# ); -# Enable power of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 9. retvalue = mc_get_busy( -# , : 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( -# , : 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(); -# Resets error of motion axis. -# -# 13. retvalue = mc_get_axis_err(); -# Returns motion axis error code. -# -# 14. retvalue = mc_set_enable_motion_funcs( -# , : Axis index -# , : Enable positioning -# , : Enable const velo -# , : Enable const homing -# ); -# Enables/disables motion functionalities. Returns error code. -# -# Function Lib: Data Storage -# 1. retvalue = ds_append_data( -# , : Data storage index -# , : Data -# ); -# Append data to data storage. -# returns 0 if success or error code. -# -# 2. retvalue = ds_clear_data( -# , : Data storage index -# ); -# Clear data to data storage. -# returns 0 if success or error code. -# -# 3. retvalue = ds_get_data( -# , : Data storage index -# , : Buffer index -# ); -# Returns data from buffer. -# -# 4. retvalue = ds_set_data( -# , : Data storage index -# , : Buffer index -# ); -# Sets data in data storage buffer. -# returns 0 if success or error code. -# -# 5. retvalue = ds_get_buff_id( -# , : Data storage index -# ); -# Returns current buffer index. -# -# 6. retvalue = ds_set_buff_id( -# , : Data storage index -# , : Buffer index -# ); -# Sets current buffer index in data storage buffer. -# returns 0 if success or error code. -# -# 7. retvalue = ds_is_full( -# , : Data storage index -# ); -# Returns true if buffer is full. -# -# 8. retvalue = ds_get_size( -# , : 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( -# , : Data storage index -# ); -# Triggers push of all asyn parameters in ds to EPICS (including data). -# -# 11. retvalue = ds_get_avg( -# , : Data storage index\n -# ); -# Returns average of the values in the data storage.\n -# -# 12. retvalue = ds_get_min( -# , : Data storage index\n -# ); -# Returns minimum of the values in the data storage.\n -# -# 13. retvalue = ds_get_max( -# , : Data storage index\n -# ); -# Returns maximum of the values in the data storage.\n -# -# 14. retvalue=ds_append_to_ds( -# , : Source data storage index\n -# , : Source data element index\n -# , : Number of elements to copy \n -# : Destination data storage index\n -# ); -# Appends data at the current position of the destination data storage (dsToId). The data source is defined by (dsFromId) and the selected position (dsFromDataId) and element count (elements) . -# -# 15. retvalue=ds_err_rst(): -# Resets error code for ds_lib. -# + +1. retvalue = ec_set_bit( + , : Value to change + : Bit index + ); + Sets bit at bitindex position of value. Returns the new value. + +2. retvalue = ec_wrt_bit( + , : Value to change + , : Value of bit to write + : Bit index + ); + Write wrtValue to a bit at bitindex position of value. Returns the new value. + +3. retvalue = ec_wrt_bits( + , : Value to change + , : Value of bit to write + : Start bit index (lsb is bit 0) + : Stop bit index + ); + Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. + +4. retvalue = ec_clr_bit( + , : Value to change + : Bit index + ); + Clears bit at bitindex position of value. Returns the new value. + +5. retvalue = ec_flp_bit( + , : Value to change + : Bit index + ); + Flips bit at bitindex position of value. Returns the new value. + +6. retvalue = ec_chk_bit( + , : Value to change + : Bit index + ); + Checks bit at bitindex position of value. Returns the value of bit. + +7. retvalue = ec_chk_bits( + , : Value to change + : Start bit index (lsb is bit 0) + : Stop bit index + ); + Checks range of bits (startBit..stopBit) of value. Returns the value of bits. + +8. retvalue = ec_print_hex( + , : Value to print + : Start bit index + : Stop bit index + ); + Prints to of in hex format + Returns error code or 0 if success. + +9. retvalue = ec_print_bin( + , : Value to print + : Start bit index + : Stop bit index + ); + Prints to of in bin format + Returns error code or 0 if success. + +10. retvalue = ec_mm_cp( + , : Source memmap index + : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + +11. retvalue = ec_get_mm_type( + , : Source memmap index + ); + Returns data type of memmap: + 0 = Not defined (Use "Cfg.EcAddMemMapDT()" instead of "Cfg.EcAddMemMap()") + 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + +12. retvalue = ec_get_mm_data( + , : Source memmap index + : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + +13. retvalue = ec_set_mm_data( + , : Source memmap index + : Index of data element + : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + +14. retvalue = ec_get_mm_size( + , : Source memmap index + ); + Returns number of elements (of type "ec_get_mm_type()")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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + +14. retvalue = ec_mm_ds_append( + , : Source memmap index + ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + +15. retvalue = ec_mm_append_to_ds_scale_offset( + , : Source memmap index + : Destination data storage index + : Scale + ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + +16. retvalue = ec_mm_push_asyn( + ) : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + 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. +``` + +#### Function 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. + +``` +1. retvalue = m2m_write( + , : Mem buffer index (index must be 0..119) + ): : 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(); : 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(); + + returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). + +7. retvalue = m2m_ioc_run(); + + checks of a certian master is running (negative master id is ioc:s without ec master). +``` + +#### Function Lib: Motion +``` +1. retvalue = mc_move_abs( + , : Axis index + , : Trigger + , : Target position + , : Target velocity + , : Acceleration + : Deceleration + ): + Absolute motion of axis. + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + +2. retvalue = mc_move_rel( + , : Axis index + , : Trigger + , : Target position + , : Target velocity + , : Acceleration + : Deceleration + ); + Relative motion of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + +3. retvalue = mc_move_ext_pos( + , : Axis index + , : Trigger + , : Target velocity + , : Acceleration + : 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 "mc_move_pos()" with the target postion ax.traj.extsetpos. + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + +4. retvalue = mc_move_vel( + , : Axis index + , : Trigger + , : Target velocity + , : Acceleration + : Deceleration + ); + Constant velocity motion of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + +5. retvalue = mc_home( + , : Axis index + , : Trigger + , : Motion sequence + , : Target Velocity twords cam + : Target velocity off cam + ); + Perform a homing sequence of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + +6. retvalue = mc_home_pos( + , : Axis index + , : Trigger + , : Motion sequence + , : Target Velocity twords cam + : Target velocity off cam + : Homing position + ); +Perform a homing sequence of axis +Motion is triggerd with a positive edge on input. +returns 0 if success or error code. + +7. retvalue = mc_halt( + , : Axis index + , : Trigger + ); + Stop motion of axis . + Command is triggerd with a positive edge on input. + returns 0 if success or error code. + +8. retvalue = mc_power( + , : Axis index + , : Enable power + ); + Enable power of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + +9. retvalue = mc_get_busy( + , : 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( + , : 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(); + Resets error of motion axis. + +13. retvalue = mc_get_axis_err(); + Returns motion axis error code. + +14. retvalue = mc_set_enable_motion_funcs( + , : Axis index + , : Enable positioning + , : Enable const velo + , : Enable const homing + ); + + Enables/disables motion functionalities. Returns error code. + +15. retvalue = mc_get_act_pos( + , : Axis index + : Encoder index + ); + + Returns encoder position for any of the configured encoders of an axis. + +16. retvalue = mc_set_prim_enc( + , : Axis index + : 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( + , : Axis index + ); + + Returns primary encoder index of the axis (the encoder used for control). + +18. mc_set_axis_error( + , : Axis index + : Error code to set + ); + + Sets an arbitrary error code to an axis object. + +19. mc_set_slaved_axis_in_error( + , : Axis index + ); + + Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). +``` + +#### Function Lib: Motion Group + +``` +1. mc_grp_get_enable( + , : 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( + , : Group index + ); + + Returns true if atleast one axis in the group has the enable bit set, else false. + +3. mc_grp_get_enabled( + , : Group index + ); + + Returns true if all axes in the group are in enabled state, else false. + +4. mc_grp_get_any_enabled( + , : Group index + ); + + Returns true if atleast one axis in the group is in enabled state, else false. + +5. mc_grp_get_busy( + , : Group index + ); + + Returns true if all axes in the group are in busy state, else false. + +6. mc_grp_get_any_busy( + , : Group index + ); + + Returns true if atleast one axis in the group is in busy state, else false. + +7. mc_grp_get_any_error_id( + , : Group index + ); + + Returns error id if atleast one axis in the group is in error state, else zero. + +8. mc_grp_set_enable( + , : Group index + : Enable state + ); + + Sets enable for all axes in group. + Returns 0 or error id. + +9. mc_grp_set_traj_src( + , : Group index + : 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( + , : Group index + : 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( + , : Group index + ); + + Resets error of all axes in group. + +12. mc_grp_set_error( + , : Group index + : Error Id + ); + + Set error id of all axes in group. + +13. mc_grp_set_slaved_axis_in_error( + , : Group index + ); + + Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) + +14. mc_grp_halt( + , : Group index + ); + + Halt all axes in group (only works if traj source = internal/0) + +15. mc_grp_axis_in_grp( + , : Group index + , : Axis index + ); + + Returns true if axis is in group, else false. + +16. mc_grp_size( + , : Group index + ); + + Returns the number of axes in group. + + +17. mc_grp_get_traj_src_ext( + , : Group index + ); + + Returns true if all axes in the group have trajectory source set to external. + +18. mc_grp_get_any_traj_src_ext( + , : 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( + , : Group index + , : Allow change of source + ); + Allow source change for trajectory and encoder when axis is enabled. + +``` + +#### Function Lib: Data Storage +``` +1. retvalue = ds_append_data( + , : Data storage index + , : Data + ); + Append data to data storage. + returns 0 if success or error code. + +2. retvalue = ds_clear_data( + , : Data storage index + ); + Clear data to data storage. + returns 0 if success or error code. + +3. retvalue = ds_get_data( + , : Data storage index + , : Buffer index + ); + Returns data from buffer. + +4. retvalue = ds_set_data( + , : Data storage index + , : Buffer index + ); + Sets data in data storage buffer. + returns 0 if success or error code. + +5. retvalue = ds_get_buff_id( + , : Data storage index + ); + Returns current buffer index. + +6. retvalue = ds_set_buff_id( + , : Data storage index + , : Buffer index + ); + Sets current buffer index in data storage buffer. + returns 0 if success or error code. + +7. retvalue = ds_is_full( + , : Data storage index + ); + Returns true if buffer is full. + +8. retvalue = ds_get_size( + , : 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( + , : Data storage index + ); + Triggers push of all asyn parameters in ds to EPICS (including data). + +11. retvalue = ds_get_avg( + , : Data storage index + ); + Returns average of the values in the data storage. + +12. retvalue = ds_get_min( + , : Data storage index + ); + Returns minimum of the values in the data storage. + +13. retvalue = ds_get_max( + , : Data storage index + ); + Returns maximum of the values in the data storage. + +14. retvalue=ds_append_to_ds( + , : Source data storage index + , : Source data element index + , : Number of elements to copy + : 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. + ``` diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md index 65f5f7b10..e4c6ba0e3 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -1,5 +1,5 @@ +++ -title = "Best practice" +title = "Axis Best Practice" weight = 10 chapter = false +++ diff --git a/scripts/addVirtualAxis.cmd b/scripts/addVirtualAxis.cmd index 3e4d258ce..5efc5394a 100644 --- a/scripts/addVirtualAxis.cmd +++ b/scripts/addVirtualAxis.cmd @@ -4,7 +4,7 @@ #-d /** #-d \brief Script for adding axis EPICS PVs. -#-d \details Adds an virtual axis with PVs +#-d \details Adds an virtual axis with PVs. #-d \author Niko Kivel #-d \file #-d */ From 3f05e62b59b0a0bfae2aeadcb431f8e258d19183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 12:14:34 +0200 Subject: [PATCH 025/128] Move PLC best practise --- .../manual/PLC/{best_practice/_index.md => best_practice.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename hugo/content/manual/PLC/{best_practice/_index.md => best_practice.md} (100%) diff --git a/hugo/content/manual/PLC/best_practice/_index.md b/hugo/content/manual/PLC/best_practice.md similarity index 100% rename from hugo/content/manual/PLC/best_practice/_index.md rename to hugo/content/manual/PLC/best_practice.md From 9688a65e94a29c528e684010e19168128bbf2394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 13:48:00 +0200 Subject: [PATCH 026/128] Update manual --- hugo/content/manual/PLC/plcSyntax.md | 10 +- hugo/content/manual/axis/homing.md | 184 ++++++++++++++++++ .../manual/configuration/data_storage.md | 94 +++++++++ .../manual/configuration/iocsh_utils.md | 161 +++++++++++++++ .../manual/configuration/startup/_index.md | 54 +++++ .../manual/configuration/startup/modes.md | 48 +++++ hugo/content/manual/troubleshooting/_index.md | 5 +- .../content/manual/troubleshooting/general.md | 30 +++ hugo/content/manual/troubleshooting/motion.md | 86 ++++---- 9 files changed, 629 insertions(+), 43 deletions(-) create mode 100644 hugo/content/manual/axis/homing.md create mode 100644 hugo/content/manual/configuration/data_storage.md create mode 100644 hugo/content/manual/configuration/iocsh_utils.md create mode 100644 hugo/content/manual/configuration/startup/_index.md create mode 100644 hugo/content/manual/configuration/startup/modes.md create mode 100644 hugo/content/manual/troubleshooting/general.md diff --git a/hugo/content/manual/PLC/plcSyntax.md b/hugo/content/manual/PLC/plcSyntax.md index 1b7623c1c..ac0f6ee92 100644 --- a/hugo/content/manual/PLC/plcSyntax.md +++ b/hugo/content/manual/PLC/plcSyntax.md @@ -244,7 +244,7 @@ Below the ECMC specific accessible variables and functions are listed: ### functions #### Function Lib: EtherCAT -```shell +```C 1. retvalue = ec_set_bit( , : Value to change @@ -429,7 +429,7 @@ Below the ECMC specific accessible variables and functions are listed: 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. -``` +```C 1. retvalue = m2m_write( , : Mem buffer index (index must be 0..119) ): : value to write @@ -462,7 +462,7 @@ A shared memory buffer of 120 doubles can be accessed for read and write operati ``` #### Function Lib: Motion -``` +```C 1. retvalue = mc_move_abs( , : Axis index , : Trigger @@ -620,7 +620,7 @@ returns 0 if success or error code. #### Function Lib: Motion Group -``` +```C 1. mc_grp_get_enable( , : Group index ); @@ -747,7 +747,7 @@ returns 0 if success or error code. ``` #### Function Lib: Data Storage -``` +```C 1. retvalue = ds_append_data( , : Data storage index , : Data diff --git a/hugo/content/manual/axis/homing.md b/hugo/content/manual/axis/homing.md new file mode 100644 index 000000000..4ebff0ca1 --- /dev/null +++ b/hugo/content/manual/axis/homing.md @@ -0,0 +1,184 @@ + +## Homing + +The follwoing sequences are available: +``` +ECMC_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. + +### ECMC_SEQ_HOME_LOW_LIM = 1, +1. Axis moves backward until low limit switch and stops +2. Axis moves forward untill edge detected in limit switch signal. Position is latched. +3. Axis stops +4. Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. + +### ECMC_SEQ_HOME_HIGH_LIM = 2, +1. Axis moves forward until high limit switch and stops +2. Axis moves backward untill edge detected in limit switch signal. Position is latched. +3. Axis stops +4. 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, +1. Axis moves backward until low limit switch and stops +2. Axis moves forward untill edge detected in home switch signal. Position is latched. +3. Axis stops +4. 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, +1. Axis moves forward until high limit switch and stops +2. Axis moves backward untill edge detected in home switch signal. Position is latched. +3. Axis stops +4. 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, +1. Axis moves backward until low limit switch and stops +2. Axis moves forward untill edge detected in home switch signal. Position is latched. +3. Axis continues untill second edge of home sensor. Motion is stopped. +4. Axis moves backward untill edge of home sensor. Position is latched. +5. 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, +1. Axis moves forward until low limit switch and stops +2. Axis moves backward untill edge detected in home switch signal. Position is latched. +3. Axis continues untill second edge of home sensor. Motion is stopped. +4. Axis moves forward untill edge of home sensor. Position is latched. +5. 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, +1. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +2. Axis stops +3. Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 1. + +### ECMC_SEQ_HOME_FWD_HOME = 8, +1. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +2. Axis stops +3. 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, +1. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +2. Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. +3. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +4. 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, +1. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +2. Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. +3. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +4. 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, +1. Axis moves backward until low limit switch and stops +2. 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. +3. Axis stops +4. 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 ): +``` +epicsEnvSet("ECMC_EC_ENC_LATCHPOS", "ec0.s3.encoderLatchPostion01") # Ethercat entry for latch position (only valid for home seq 11,12) +epicsEnvSet("ECMC_EC_ENC_LATCH_CONTROL", "ec0.s3.encoderControl01.0") # Ethercat entry for latch control (only valid for home seq 11,12) +epicsEnvSet("ECMC_EC_ENC_LATCH_STATUS", "ec0.s3.encoderStatus01.0") # Ethercat entry for latch status (only valid for home seq 11,12) +epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # Number of latch/over/under-flow for home (home seq 11,12,21,22) +``` + +### ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, +1. Axis moves forward until high limit switch and stops +2. 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. +3. Axis stops +4. 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 ): +``` +epicsEnvSet("ECMC_EC_ENC_LATCHPOS", "ec0.s3.encoderLatchPostion01") # Ethercat entry for latch position (only valid for home seq 11,12) +epicsEnvSet("ECMC_EC_ENC_LATCH_CONTROL", "ec0.s3.encoderControl01.0") # Ethercat entry for latch control (only valid for home seq 11,12) +epicsEnvSet("ECMC_EC_ENC_LATCH_STATUS", "ec0.s3.encoderStatus01.0") # Ethercat entry for latch status (only valid for home seq 11,12) +epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # 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. +Use ECMC_SEQ_HOME_SET_POS_2 instead (same but not blocked by motor record). + +However the sequence 15 can be triggered like the following: +``` +# 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 +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. +1. Axis moves backward until low limit switch and stops +2. Axis moves forward untill limit switch change state +3. Axis stops +4. 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): +``` +epicsEnvSet("ECMC_ENC_BITS" "25") # Total bit count of encoder raw data +epicsEnvSet("ECMC_ENC_ABS_BITS", "12") # Absolute bit count (for absolute encoders) always least significant part of ECMC_ENC_BITS +epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # Number of over/under-flow for home (home seq 11,12,21,22) +``` + +### ECMC_SEQ_HOME_HIGH_LIM_SINGLE_TURN_ABS = 22, +1. Axis moves forward until high limit switch and stops +2. Axis moves backward untill limit switch change state +3. Axis stops +4. 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! + +Some additional parameters are important for this homing sequence should work (example): +``` +epicsEnvSet("ECMC_ENC_BITS" "25") # Total bit count of encoder raw data +epicsEnvSet("ECMC_ENC_ABS_BITS", "12") # Absolute bit count (for absolute encoders) always least significant part of ECMC_ENC_BITS +epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # 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. + +### ECMC_SEQ_HOME_TRIGG_EXTERN = 26 +Trigger external homing sequence in drive. +1. Optional: set drive mode to homing (and wait for mode readback) +3. Set trigg of homing (bit) +4. Wait for homing ready (bit). Reference the ecmc encoder object on rising edge of the homing reday bit +5. Optional: Change drive mode back to motion (and wait for mode readback) +6. Optional: Init post move if configured + +Currently used for smaract: +[smaracat example](../smaract/smaract.script) +In this exmaple also the drive modes is automatically handled by ecmc. + +## Setting 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: +``` +"Cfg.SetAxisMonHomeSwitchPolarity(int axisIndex, int polarity)"; +# polarity==0 is NC (default) +# polarity==1 is NO +``` diff --git a/hugo/content/manual/configuration/data_storage.md b/hugo/content/manual/configuration/data_storage.md new file mode 100644 index 000000000..0df651b62 --- /dev/null +++ b/hugo/content/manual/configuration/data_storage.md @@ -0,0 +1,94 @@ +## Data storage examples +This dir contains two examples: [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/test/dataStorage). + +1. Continiously add value to data storage. Push to epics by hw trigger. +2. 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. + +Example 1 is started with the following stratup file: "add_data_to_buffer_trigg_push_hw.script" + +``` +iocsh.bash add_data_to_buffer_trigg_push_hw.script +``` +Trigger writes to epics by toggle of axis 1 high limit switch. + +PLC-code: +``` +################################################################################## +# 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 "#" 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 "IOC_TEST:Set-PushDataTrigger-RB" pv. + +Example 2 is started with the following stratup file: "add_data_to_buffer_trigg_push_hw.script" +``` +iocsh.bash add_data_to_buffer_trigg_push_epics.script +``` + +Trigger writes to epics by: +``` +raspberrypi-16970 > dbpf IOC_TEST:Set-PushDataTrigger-RB 1 +DBF_STRING: "One" +raspberrypi-16970 > Pushing data to EPICS.... +dbpf IOC_TEST:Set-PushDataTrigger-RB 0 +DBF_STRING: "Zero" +raspberrypi-16970 > dbpf IOC_TEST:Set-PushDataTrigger-RB 1 +DBF_STRING: "One" +raspberrypi-16970 > Pushing data to EPICS.... +``` + +PLC-code: +``` +################################################################################## +# 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 "#" 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; + +``` diff --git a/hugo/content/manual/configuration/iocsh_utils.md b/hugo/content/manual/configuration/iocsh_utils.md new file mode 100644 index 000000000..ab097eacd --- /dev/null +++ b/hugo/content/manual/configuration/iocsh_utils.md @@ -0,0 +1,161 @@ +## 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(, , )" to evaluate the expression and assign the variable. + : EPICS environment variable name. + : 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;};". + Strings are used within '': "'test'='test'". Note: expression result must be numeric and + not string (in this case expression result is 1 => will be set to "1"). + : Optional format string. Example "%lf", "%8.3lf", "%x", "%04d" or "%d", defaults to "%d". + Can contain text like "0x%x" or "Hex value is 0x60%x". + 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("test2", "$(test1)+1+2+3+4+5*10.1", "%03x") +ecmcEpicsEnvSetCalc("test2", "061+1+2+3+4+5*10.1", "%03x") +epicsEnvShow("test2") +test2=07a + +#### Hex + text in format string +# ecmcEpicsEnvSetCalc("test2", "$(test1)+1+2+3+4+5*10.1", "This is the number: 0x%06x") +ecmcEpicsEnvSetCalc("test2", "061+1+2+3+4+5*10.1", "This is the number: 0x%06x") +epicsEnvShow("test2") +test2=This is the number: 0x00007a + +#### Calculate scalings (floating point) +epicsEnvSet("IORange",32768) +# ecmcEpicsEnvSetCalc("scaling", "$(test1)/$(IORange)*10", "%lf") +ecmcEpicsEnvSetCalc("scaling", "061/32768*10", "%lf") +epicsEnvShow("scaling") +scaling=0.018616 + +#### Offset slave numbers (format defaults to "%d") +epicsEnvSet("ECMC_SLAVE_NUM",10) +epicsEnvSet("ECMC_SLAVE_NUM_OFFSET",25) +# ecmcEpicsEnvSetCalc("ECMC_SLAVE_NUM", "$(ECMC_SLAVE_NUM)+$(ECMC_SLAVE_NUM_OFFSET)") +ecmcEpicsEnvSetCalc("ECMC_SLAVE_NUM", "10+25") +epicsEnvShow("ECMC_SLAVE_NUM") +ECMC_SLAVE_NUM=35 + +#### if-statement syntax (use "RESULT" variable) +epicsEnvSet("VALUE",10) +# ecmcEpicsEnvSetCalc("IF_TEST", "if(${VALUE}>5){RESULT:=100;}else{RESULT:=200;};") +ecmcEpicsEnvSetCalc("IF_TEST", "if(10>5){RESULT:=100;}else{RESULT:=200;};") +epicsEnvShow("IF_TEST") +IF_TEST=100 + +#### Comparing strings 1 (use ''): +epicsEnvSet("filename","ecmcEL3002.cmd") +# ecmcEpicsEnvSetCalc("result", "'$(filename)'='test.script'") +ecmcEpicsEnvSetCalc("result", "'ecmcEL3002.cmd'='test.script'") +epicsEnvShow("result") +result=0 + +#### Comparing strings 2 (if-else): +# ecmcEpicsEnvSetCalc("result", "if('$(filename)'='test.script') {RESULT:=1;}else{RESULT:=0;};") +ecmcEpicsEnvSetCalc("result", "if('ecmcEL3002.cmd'='test.script') {RESULT:=1;}else{RESULT:=0;};") +epicsEnvShow("result") +result=0 + + +``` +### Iocsh function "ecmcEpicsEnvSetCalcTernary()" + "ecmcEpicsEnvSetCalcTernary()" is used o evaluate expressions and set EPCIS environment variables to different strings. + depending on if the expression evaluates to "true" or "false". Can be usefull for: + * Choose different files to load like plc-files, axis configurations, db-files or.. + * making conditional ecmc settings + * ... + +``` +ecmcEpicsEnvSetCalcTernary -h + + Test iocsh function "ecmcEpicsEnvSetCalcTernary()" t + + Use "ecmcEpicsEnvSetCalcTernary(, , , )" to evaluate the expression and assign the variable. + : EPICS environment variable name. + : 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;};". + Strings are used within '': "'test'='test'". Note: expression result must be numeric and + not string (in this case expression result is 1 => will be set to ). + : String to set if expression (or "RESULT") evaluates to true. + : String to set if expression (or "RESULT") evaluates to false. + +``` +#### Examples: +``` +### Simple true false +epicsEnvSet("VALUE",10) +# ecmcEpicsEnvSetCalcTernary("test_var", "${VALUE}+2+5/10","True","False") +ecmcEpicsEnvSetCalcTernary("test_var", "10+2+5/10","True","False") +epicsEnvShow("test_var") +test_var=True + +### Can be used for choosing different files +# ecmcEpicsEnvSetCalcTernary("filename", "${VALUE}>20","./plc_fast.cfg","./plc_slow.cfg") +ecmcEpicsEnvSetCalcTernary("filename", "10>20","./plc_fast.cfg","./plc_slow.cfg") +epicsEnvShow("filename") +filename=./plc_slow.cfg + +### Comparing strings 1 (simple): +# ecmcEpicsEnvSetCalcTernary("result", "'$(filename)'='./plc_slow.cfg'","equal","not_equal") +ecmcEpicsEnvSetCalcTernary("result", "'./plc_slow.cfg'='./plc_slow.cfg'","equal","not_equal") +epicsEnvShow("result") +result=equal + +### Comparing strings 2 (with if-else): +# ecmcEpicsEnvSetCalcTernary("result", "if('$(filename)'='test') {RESULT:=1;}else{RESULT:=0;};","use_this_file.cfg","no_use_this_file.cfg") +ecmcEpicsEnvSetCalcTernary("result", "if('./plc_slow.cfg'='test') {RESULT:=1;}else{RESULT:=0;};","use_this_file.cfg","no_use_this_file.cfg") +epicsEnvShow("result") +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 +"ECMC_CONFIG_RETURN_VAL". This value can be used to make som dynamic configuration. +All ASCII configuration commands for ecmcConfig(OrDie) can be used in the same way. + +#### Example: Read firmware version of an EL7037 stepper drive +Note: SDO reads need to be before "SetAppMode(1)" +``` +ecmcConfig "EcReadSdo(${ECMC_SLAVE_NUM},0x100a,0x0,2)" +epicsEnvShow(ECMC_CONFIG_RETURN_VAL) +ECMC_CONFIG_RETURN_VAL=14640 + +``` +The variable "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. + +### Example: Read "ID" PDO from EK1101 (shown in detail in aliasRecordFromPdoData.script) +Note: PDO reads need to be after "SetAppMode(1)" since cyclic value +``` +ecmcConfig "ReadEcEntryIDString(${ECMC_SLAVE_NUM},"ID")" +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 "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. diff --git a/hugo/content/manual/configuration/startup/_index.md b/hugo/content/manual/configuration/startup/_index.md new file mode 100644 index 000000000..62d3a4b1a --- /dev/null +++ b/hugo/content/manual/configuration/startup/_index.md @@ -0,0 +1,54 @@ ++++ +title = "startup.cmd" +weight = 11 +chapter = false ++++ + +## startup.cmd +startup.cmd takes the following arguments: +``` + Arguments + [optional] + ECMC_VER = 9.5.4 + EthercatMC_VER = 3.0.2 (obsolete) + INIT = initAll + MASTER_ID = 0 <-- 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 "/opt/etherlab/bin/ethercat" + 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 (""/empty=support motion or "#-"=disable motion) + ECMC_TMP_DIR = directory for temporary files, defaults to "/tmp/${IOC}/EcMaster_${ECMC_EC_MASTER_ID}}/" + 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: +``` +require ecmccfg "ENG_MODE=1,MASTER_ID=2" +``` + +### [set mode](modes) +A very powerful tool is provided through the command line. +See a summary, incl. some examples of what possible [here](ethercatcli). + diff --git a/hugo/content/manual/configuration/startup/modes.md b/hugo/content/manual/configuration/startup/modes.md new file mode 100644 index 000000000..0527086d2 --- /dev/null +++ b/hugo/content/manual/configuration/startup/modes.md @@ -0,0 +1,48 @@ +## ecmc modes +ecmc can be started in different modes by setting the MODE parameter to startup.cmd (or require ecmccfg): +1. FULL +2. DAQ +3. 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: +``` +$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, "IOC=$(IOC),ECMC_VER=develop,MODE=FULL" + +# or since FULL mode is default the MODE parameter can be ignored + +$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, "IOC=$(IOC),ECMC_VER=develop" +``` + +### mode==DAQ +In DAQ mode, motion functionalities are disabled and the following commands are blocked: +1. configureAxis.cmd +2. configureVirtualAxis.cmd +3. addAxis.cmd +4. addVirtualAxis.cmd + +This mode is intended to be used for pure DAQ use cases. + +Example of starting ecmc in DAQ mode: +``` +$(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, "IOC=$(IOC),ECMC_VER=develop,MODE=DAQ" +``` + +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: +``` +epicsEnvSet("ECMC_SAMPLE_RATE_MS",1) +``` + +### mode==NO_MR + +In this mode all features are supported, but motor record will not be created for motion axes. + + +### ENG_MODE + +Setting the parameter ENG_MODE=1 will result in loading of extra PVs usefull for commissioning, i.e. controller parameters for motion axes. diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index 1060916f8..0bf62a013 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -13,7 +13,10 @@ This guide should provide the basic means to diagnose simple errors and is by no A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible [here](ethercatcli). -### [troubles with motors](motion) +### [general problems]general) +For motion related issues, a very short troubleshooting guide is provided [here](motion). + +### [troubles with motion](motion) For motion related issues, a very short troubleshooting guide is provided [here](motion). ### [troubles with hardware](hardware) diff --git a/hugo/content/manual/troubleshooting/general.md b/hugo/content/manual/troubleshooting/general.md new file mode 100644 index 000000000..12d454521 --- /dev/null +++ b/hugo/content/manual/troubleshooting/general.md @@ -0,0 +1,30 @@ + +### 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 slaves. +Either 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. + +Depending on the integrator and overview panel might exist. +Consult this panel for further details. +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. + +#### restarting the IOC +{{% notice warning %}} +Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!! +{{% /notice %}} + +Check the hardware BEFORE restarting the IOC! + diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index d0108d121..8794ef0cc 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -4,34 +4,63 @@ weight = 12 chapter = false +++ -### 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. +## 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: -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) -* ... +Define the output in axis yaml file: +``` +axis: + id: 1 # Axis id + ... + feedSwitchesOutput: ec0.s5.binaryOutput02 # Ethercat entry for feed switches + ... +``` -#### check the status -Before anything is restarted or power cycled, check the status of the slaves. -Either from a dedicated shell, or from within the `iocsh`. +By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binaryOutput\,\): +``` +ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" +``` -If all slaves are in 'OP' state, at least data is exchanged between the hardware and the master. +## Position Lag Error: +A position lag error is normally genereated in the following situations: +1. The motor torque is too low, making it hard for the motor to keep up with the setpoint. +2. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. +3. The velocity setpoint is too high resulting in motor stall (common for stepper motors). +4. The velocity setpoint is higher than what the drive can achive (saturated velocity setpoint). -Depending on the integrator and overview panel might exist. -Consult this panel for further details. -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. +### 1. Motor torque to low -#### restarting the IOC +If possible, increase current to the motor. {{% notice warning %}} -Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!! +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. {{% /notice %}} -Check the hardware BEFORE restarting the IOC! +### 2. Scaling factors are wrong +Check the scaling documentation [here](https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/scaling/). +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. + +### 3. The velocity setpoint is too high resulting in stall +If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higehr velocities: +1. Add a damper: This is nromally very effichient but not always possible. +2. Tune controller parameters (both position loop in ecmc adn the controller loops in teh drive) +3. If possible, test to increase or reduce current setpoint (make sure you do not burn the motor). + + + + + + + + + + + + + + + + #### force manual motion {{% notice warning %}} @@ -47,21 +76,4 @@ For this however, the IOC needs to be reconfigured to _not_ link the hardware to 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. - -### 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: - -Define the output in axis yaml file: -``` -axis: - id: 1 # Axis id - ... - feedSwitchesOutput: ec0.s5.binaryOutput02 # Ethercat entry for feed switches - ... -``` - -By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binaryOutput\,\): -``` -ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" -``` +8. Observe the encoder, or in case of open-loop, the device itself. \ No newline at end of file From 7d29f7871c02d82fa29032be6c7006302687269f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 13:52:02 +0200 Subject: [PATCH 027/128] Update manual --- hugo/content/manual/troubleshooting/_index.md | 2 +- hugo/content/manual/troubleshooting/motion.md | 17 +---------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index 0bf62a013..3065330f5 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -13,7 +13,7 @@ This guide should provide the basic means to diagnose simple errors and is by no A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible [here](ethercatcli). -### [general problems]general) +### [general problems](general) For motion related issues, a very short troubleshooting guide is provided [here](motion). ### [troubles with motion](motion) diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index 8794ef0cc..d58634be3 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -47,22 +47,7 @@ If a stepper motor stalls because of too high velocity there's a few thing that 3. If possible, test to increase or reduce current setpoint (make sure you do not burn the motor). - - - - - - - - - - - - - - - -#### force manual motion +## force manual motion {{% notice warning %}} This procedure is for experst only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! {{% /notice %}} From 7fe43ae9086d3eed1af58e60f0bc3bf2a68f3c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 16:02:13 +0200 Subject: [PATCH 028/128] Update docs --- hugo/content/manual/PLC/best_practice.md | 22 +++++++++---------- hugo/content/manual/axis/_index.md | 14 +++++++++++- hugo/content/manual/axis/homing.md | 5 +++++ .../manual/configuration/data_storage.md | 6 +++++ .../manual/configuration/iocsh_utils.md | 6 +++++ .../manual/configuration/startup/modes.md | 6 +++++ 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/hugo/content/manual/PLC/best_practice.md b/hugo/content/manual/PLC/best_practice.md index 03ab8ed86..52d2c0a8e 100644 --- a/hugo/content/manual/PLC/best_practice.md +++ b/hugo/content/manual/PLC/best_practice.md @@ -14,7 +14,7 @@ The complete examples with starup files can be found [here](https://github.com/p ### Macros Use of macros makes the code more generic. When loading a PLC file with "loadPLCFile.cmd", custom macros can be defined in "PLC\_MACROS": -``` +```shell ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" ``` NOTE: ECMC\_EC\_SLAVE\_NUM expands to the ID of the last added slave. @@ -28,7 +28,7 @@ In addition to the custom macros, a few macros, that are often needed, are prede #### SELF_ID and SELF example A common usecase is that some initiation is needed, could be triggering of a custom homing sequence: -``` +```C if(${SELF}.firstscan) { var plc:=${SELF_ID}; ${DBG=#}println('PLC ',plc,' is starting up'); @@ -36,7 +36,7 @@ if(${SELF}.firstscan) { ``` After macro expansion the code would look like this (for PLC id=0,DBG=''): -``` +```C if(plc0.firstscan) { var plc:=0; println('PLC ',plc,' is starting up'); @@ -48,7 +48,7 @@ All EtherCAT related information/data is accessible through the pattern "ec Date: Tue, 10 Sep 2024 16:11:19 +0200 Subject: [PATCH 029/128] Change weights in doc --- hugo/content/manual/axis/axisPLC.md | 2 +- .../manual/axis/best_practice/_index.md | 2 +- .../axis/best_practice/stepper_biss_c.md | 2 +- hugo/content/manual/configuration/_index.md | 54 +++++++++++++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 hugo/content/manual/configuration/_index.md diff --git a/hugo/content/manual/axis/axisPLC.md b/hugo/content/manual/axis/axisPLC.md index 042c22ed0..dcefbf8a4 100644 --- a/hugo/content/manual/axis/axisPLC.md +++ b/hugo/content/manual/axis/axisPLC.md @@ -1,6 +1,6 @@ +++ title = "axis PLC" -weight = 16 +weight = 26 chapter = false +++ diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md index e4c6ba0e3..04e4c7c5e 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -1,6 +1,6 @@ +++ title = "Axis Best Practice" -weight = 10 +weight = 30 chapter = false +++ diff --git a/hugo/content/manual/axis/best_practice/stepper_biss_c.md b/hugo/content/manual/axis/best_practice/stepper_biss_c.md index 32e44511c..29c5b9714 100644 --- a/hugo/content/manual/axis/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/axis/best_practice/stepper_biss_c.md @@ -1,6 +1,6 @@ +++ title = "Stepper and BISS-C (EL7041, EL5042)" -weight = 20 +weight = 15 chapter = false +++ diff --git a/hugo/content/manual/configuration/_index.md b/hugo/content/manual/configuration/_index.md new file mode 100644 index 000000000..bd80d5512 --- /dev/null +++ b/hugo/content/manual/configuration/_index.md @@ -0,0 +1,54 @@ ++++ +title = "Configuration.cmd" +weight = 7 +chapter = false ++++ + +## startup.cmd +startup.cmd takes the following arguments: +``` + Arguments + [optional] + ECMC_VER = 9.5.4 + EthercatMC_VER = 3.0.2 (obsolete) + INIT = initAll + MASTER_ID = 0 <-- 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 "/opt/etherlab/bin/ethercat" + 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 (""/empty=support motion or "#-"=disable motion) + ECMC_TMP_DIR = directory for temporary files, defaults to "/tmp/${IOC}/EcMaster_${ECMC_EC_MASTER_ID}}/" + 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: +``` +require ecmccfg "ENG_MODE=1,MASTER_ID=2" +``` + +### [set mode](modes) +A very powerful tool is provided through the command line. +See a summary, incl. some examples of what possible [here](ethercatcli). + From 2cd174a3233f345ba3bcee287b00069a8ef611ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 16:18:38 +0200 Subject: [PATCH 030/128] Udpate configuration docs --- hugo/content/manual/configuration/_index.md | 58 ++++----------------- 1 file changed, 10 insertions(+), 48 deletions(-) diff --git a/hugo/content/manual/configuration/_index.md b/hugo/content/manual/configuration/_index.md index bd80d5512..74d8915fc 100644 --- a/hugo/content/manual/configuration/_index.md +++ b/hugo/content/manual/configuration/_index.md @@ -1,54 +1,16 @@ +++ -title = "Configuration.cmd" +title = "Configuration" weight = 7 chapter = false +++ -## startup.cmd -startup.cmd takes the following arguments: -``` - Arguments - [optional] - ECMC_VER = 9.5.4 - EthercatMC_VER = 3.0.2 (obsolete) - INIT = initAll - MASTER_ID = 0 <-- 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 "/opt/etherlab/bin/ethercat" - 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 (""/empty=support motion or "#-"=disable motion) - ECMC_TMP_DIR = directory for temporary files, defaults to "/tmp/${IOC}/EcMaster_${ECMC_EC_MASTER_ID}}/" - 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: -``` -require ecmccfg "ENG_MODE=1,MASTER_ID=2" -``` - -### [set mode](modes) -A very powerful tool is provided through the command line. -See a summary, incl. some examples of what possible [here](ethercatcli). +## [startup.cmd](startup) +## [Data Storage](data_storage) +## [iocsh Utils](iocsh_utils) +## [ecmc Command Reference](https://epics-modules.github.io/ecmc/files.html) +* [ethercat](https://epics-modules.github.io/ecmc/ecmcEthercat_8h.html) +* [motion](https://epics-modules.github.io/ecmc/ecmcMotion_8h.html) +* [general](https://epics-modules.github.io/ecmc/ecmcGeneral_8h.html) +* [misc](https://epics-modules.github.io/ecmc/ecmcMisc_8h.html) +* [plc](https://epics-modules.github.io/ecmc/ecmcPLC_8h.html) From 1042b209567a5ff682fefa41d6ed8dcebbb2de7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 16:35:46 +0200 Subject: [PATCH 031/128] Keep lower case chars for menu --- hugo/content/manual/PLC/best_practice.md | 2 +- hugo/content/manual/axis/best_practice/_index.md | 2 +- hugo/content/manual/axis/best_practice/servo.md | 2 +- hugo/content/manual/axis/best_practice/stepper_biss_c.md | 2 +- hugo/content/manual/axis/homing.md | 2 +- hugo/content/manual/configuration/data_storage.md | 2 +- hugo/content/manual/configuration/iocsh_utils.md | 2 +- hugo/content/manual/troubleshooting/hardware.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hugo/content/manual/PLC/best_practice.md b/hugo/content/manual/PLC/best_practice.md index 52d2c0a8e..f53877b11 100644 --- a/hugo/content/manual/PLC/best_practice.md +++ b/hugo/content/manual/PLC/best_practice.md @@ -1,5 +1,5 @@ +++ -title = "PLC Best practice" +title = "PLC best practice" weight = 10 chapter = false +++ diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md index 04e4c7c5e..6c4f13899 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -1,5 +1,5 @@ +++ -title = "Axis Best Practice" +title = "axis best practice" weight = 30 chapter = false +++ diff --git a/hugo/content/manual/axis/best_practice/servo.md b/hugo/content/manual/axis/best_practice/servo.md index f1efc7b30..af1af06c6 100644 --- a/hugo/content/manual/axis/best_practice/servo.md +++ b/hugo/content/manual/axis/best_practice/servo.md @@ -1,5 +1,5 @@ +++ -title = "Servo motor (Ex72xx)" +title = "servo motor (Ex72xx)" weight = 20 chapter = false +++ diff --git a/hugo/content/manual/axis/best_practice/stepper_biss_c.md b/hugo/content/manual/axis/best_practice/stepper_biss_c.md index 29c5b9714..667843d54 100644 --- a/hugo/content/manual/axis/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/axis/best_practice/stepper_biss_c.md @@ -1,5 +1,5 @@ +++ -title = "Stepper and BISS-C (EL7041, EL5042)" +title = "stepper and biss-c (EL7041, EL5042)" weight = 15 chapter = false +++ diff --git a/hugo/content/manual/axis/homing.md b/hugo/content/manual/axis/homing.md index 2dce5fd91..3cb4df8c0 100644 --- a/hugo/content/manual/axis/homing.md +++ b/hugo/content/manual/axis/homing.md @@ -1,5 +1,5 @@ +++ -title = "Homing" +title = "axis homing" weight = 25 chapter = false +++ diff --git a/hugo/content/manual/configuration/data_storage.md b/hugo/content/manual/configuration/data_storage.md index b6e18af6b..43ce02790 100644 --- a/hugo/content/manual/configuration/data_storage.md +++ b/hugo/content/manual/configuration/data_storage.md @@ -1,5 +1,5 @@ +++ -title = "Data Storage Buffer" +title = "data storage buffer" weight = 16 chapter = false +++ diff --git a/hugo/content/manual/configuration/iocsh_utils.md b/hugo/content/manual/configuration/iocsh_utils.md index 6edd23e88..1f0e5c65a 100644 --- a/hugo/content/manual/configuration/iocsh_utils.md +++ b/hugo/content/manual/configuration/iocsh_utils.md @@ -1,5 +1,5 @@ +++ -title = "iocsh Utilities" +title = "iocsh utilities" weight = 20 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 66c37ef11..f5556196d 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -1,5 +1,5 @@ +++ -title = "Hardware" +title = "hardware" weight = 11 chapter = false +++ From 45beb5d28ed88dbf85f928906591b6df9e73ee6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 16:54:03 +0200 Subject: [PATCH 032/128] Add more motion troubleshooting --- hugo/content/manual/troubleshooting/motion.md | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index d58634be3..49783ba22 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -22,7 +22,7 @@ By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binar ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" ``` -## Position Lag Error: +## Position Lag Error (following error): A position lag error is normally genereated in the following situations: 1. The motor torque is too low, making it hard for the motor to keep up with the setpoint. 2. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. @@ -43,9 +43,42 @@ One way to test if the scaling is correct is to set all controller parameters (e ### 3. The velocity setpoint is too high resulting in stall If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higehr velocities: 1. Add a damper: This is nromally very effichient but not always possible. -2. Tune controller parameters (both position loop in ecmc adn the controller loops in teh drive) -3. If possible, test to increase or reduce current setpoint (make sure you do not burn the motor). +2. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive) +3. If possible, test to increase or reduce current (make sure you do not burn the motor if increasing). +{{% notice warning %}} +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. +{{% /notice %}} + +#### 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. 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. + +### 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: +``` +0 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. ## force manual motion {{% notice warning %}} From fd43735c9713a51493f95ef965ff8d0cff75170d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 10 Sep 2024 17:02:37 +0200 Subject: [PATCH 033/128] Add note on motion direction with EL5042 --- hugo/content/manual/axis/direction.md | 2 ++ hugo/content/manual/configuration/_index.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hugo/content/manual/axis/direction.md b/hugo/content/manual/axis/direction.md index 801d27fc4..2ff87c784 100644 --- a/hugo/content/manual/axis/direction.md +++ b/hugo/content/manual/axis/direction.md @@ -25,6 +25,8 @@ Consult the respective slave manual for the correct SDO. {{% /notice %}} ### encoder direction + +In many cases invertion of teh encoder value is possible in the ethercat slave. For EL5042, example below, the invertion leads to a very high number since the data size is 64bit. Therefore, it's advisable to switch sign in the axis configuration instead. ```shell # slave 7 {ecmcEL5042} ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureSlave.cmd, "HW_DESC=EL5042, CONFIG=-Encoder-ch12-Renishaw_RL26BUT001B30V" diff --git a/hugo/content/manual/configuration/_index.md b/hugo/content/manual/configuration/_index.md index 74d8915fc..e099d0fa4 100644 --- a/hugo/content/manual/configuration/_index.md +++ b/hugo/content/manual/configuration/_index.md @@ -1,5 +1,5 @@ +++ -title = "Configuration" +title = "configuration" weight = 7 chapter = false +++ From ed58882a3b3e040f22116c379efaab4066f16bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 09:00:03 +0200 Subject: [PATCH 034/128] EL70x1, EL70x7: Separate template for EL70x1 excluding the stall alarm. Update panels --- db/Beckhoff_7XXX/ecmcEL7031-chX.template | 183 +++ db/Beckhoff_7XXX/ecmcEL7031.substitutions | 2 +- db/Beckhoff_7XXX/ecmcEL7037-chX.template | 20 + .../ecmcEL7041-0052.substitutions | 2 +- .../ecmcEL7041-1000.substitutions | 2 +- db/Beckhoff_7XXX/ecmcEL7041.substitutions | 2 +- qt/ecmcEL70x1.ui | 1152 +++++++++++------ qt/ecmcEx70x7.ui | 502 +++---- 8 files changed, 1209 insertions(+), 656 deletions(-) create mode 100644 db/Beckhoff_7XXX/ecmcEL7031-chX.template diff --git a/db/Beckhoff_7XXX/ecmcEL7031-chX.template b/db/Beckhoff_7XXX/ecmcEL7031-chX.template new file mode 100644 index 000000000..c9a704dc1 --- /dev/null +++ b/db/Beckhoff_7XXX/ecmcEL7031-chX.template @@ -0,0 +1,183 @@ +record(ai,"${ECMC_P}Drv${CH_ID}-Cmd-RB"){ + field(DESC, "$(HWTYPE): Drive Control Word RB") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynInt32/ec$(MASTER_ID).s$(SLAVE_POS).driveControl${CH_ID}?") + field(PREC, "0") + field(SCAN, "I/O Intr") + field(TSE, "$(TSE=-2)") +} + +record(bo,"${ECMC_P}Drv${CH_ID}-EnaCmd"){ + field(DESC, "Enable drive cmd") + field(OUT, "${ECMC_P}Drv${CH_ID}-Cmd.B0") + field(ZNAM, "Disable") + field(ONAM, "Enable") + field(SCAN, "Passive") + field(FLNK, "${ECMC_P}Drv${CH_ID}-Cmd.PROC") + field(TSE, "0") +} + +record(bo,"${ECMC_P}Drv${CH_ID}-RstCmd"){ + field(DESC, "Reset drive cmd") + field(OUT, "${ECMC_P}Drv${CH_ID}-Cmd.B1") + field(ZNAM, "Idle") + field(ONAM, "Reset") + field(SCAN, "Passive") + field(HIGH, "0.01") + field(FLNK, "${ECMC_P}Drv${CH_ID}-Cmd.PROC") + field(TSE, "0") +} + +record(bo,"${ECMC_P}Drv${CH_ID}-TrqRedCmd"){ + field(DESC, "Reduce torque cmd") + field(OUT, "${ECMC_P}Drv${CH_ID}-Cmd.B2") + field(ZNAM, "Normal") + field(ONAM, "Reduce") + field(SCAN, "Passive") + field(FLNK, "${ECMC_P}Drv${CH_ID}-Cmd.PROC") + field(TSE, "0") +} + +record(mbboDirect,"${ECMC_P}Drv${CH_ID}-Cmd"){ + field(DESC, "$(HWTYPE): Drive Control Word") + field(PINI, "$(PINI=1)") + field(DTYP, "asynUInt32Digital") + field(OUT, "@asynMask($(PORT),$(ADDR=0),$(MASK=0xFFFFFFFF),$(TIMEOUT=1))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynUInt32Digital/ec$(MASTER_ID).s$(SLAVE_POS).driveControl${CH_ID}=") + field(TSE, "0") +} + +record(ai,"${ECMC_P}Drv${CH_ID}-Spd-RB"){ + field(DESC, "$(HWTYPE): Drive Speed Setpoint RB") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynInt32/ec$(MASTER_ID).s$(SLAVE_POS).velocitySetpoint${CH_ID}?") + field(SCAN, "I/O Intr") + field(LINR, "$(LINR=SLOPE)") + field(ESLO, "$(ESLO=1)") + field(EOFF, "$(EOFF=0)") + field(EGU, "$(EGU=V)") + field(PREC, "$(PREC=7)") + field(LOW, "$(LOW=0)") + field(LOLO, "$(LOLO=0)") + field(HIGH, "$(HIGH=0)") + field(HIHI, "$(HIHI=0)") + field(HYST, "$(HYST=0)") + field(LLSV, "$(LLSV=NO_ALARM)") + field(LSV, "$(LSV=NO_ALARM)") + field(HSV, "$(HSV=NO_ALARM)") + field(HHSV, "$(HHSV=NO_ALARM)") + field(TSE, "$(TSE=-2)") +} + +record(ao,"${ECMC_P}Drv${CH_ID}-Spd"){ + field(DESC, "$(HWTYPE): Drive Speed Setpoint") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynInt32/ec$(MASTER_ID).s$(SLAVE_POS).velocitySetpoint${CH_ID}=") + field(LINR, "$(LINR=SLOPE)") + field(ESLO, "$(ESLO=1)") + field(EOFF, "$(EOFF=0)") + field(EGU, "$(EGU=V)") + field(PREC, "$(PREC=7)") + field(LOW, "$(LOW=0)") + field(LOLO, "$(LOLO=0)") + field(HIGH, "$(HIGH=0)") + field(HIHI, "$(HIHI=0)") + field(HYST, "$(HYST=0)") + field(LLSV, "$(LLSV=NO_ALARM)") + field(LSV, "$(LSV=NO_ALARM)") + field(HSV, "$(HSV=NO_ALARM)") + field(HHSV, "$(HHSV=NO_ALARM)") +} + +record(mbbiDirect,"${ECMC_P}Drv${CH_ID}-Stat"){ + field(DESC, "$(HWTYPE): Drive Status Word") + field(PINI, "$(PINI=1)") + field(DTYP, "asynUInt32Digital") + field(INP, "@asynMask($(PORT),$(ADDR=0),$(MASK=0xFFFFFFFF),$(TIMEOUT=1))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynUInt32Digital/ec$(MASTER_ID).s$(SLAVE_POS).driveStatus${CH_ID}?") + field(SCAN, "I/O Intr") + field(FLNK, "${ECMC_P}Drv${CH_ID}-RdyToEna.PROC") + field(TSE, "$(TSE=-2)") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-RdyToEna"){ + field(DESC, "$(HWTYPE): Drv Rdy to Ena") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.B0") + field(ZNAM, "Warning") + field(ONAM, "Ready") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(FLNK, "${ECMC_P}Drv${CH_ID}-Rdy") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-Rdy"){ + field(DESC, "$(HWTYPE): Drive Ready") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.B1") + field(ZNAM, "Warning") + field(ONAM, "Ready") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(FLNK, "${ECMC_P}Drv${CH_ID}-WrnAlrm") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-WrnAlrm"){ + field(DESC, "$(HWTYPE): Drive Warning") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.B2") + field(ZNAM, "No Alarm") + field(ONAM, "Warning") + field(ZSV, "NO_ALARM") + field(OSV, "MINOR") + field(FLNK, "${ECMC_P}Drv${CH_ID}-ErrAlrm") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-ErrAlrm"){ + field(DESC, "$(HWTYPE): Drive Error") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.B3") + field(ZNAM, "No Alarm") + field(ONAM, "Error") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + field(FLNK, "${ECMC_P}Drv${CH_ID}-TrqRed") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-TrqRed"){ + field(DESC, "$(HWTYPE): Torque reduced") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.B6") + field(ZNAM, "Normal") + field(ONAM, "Reduced") + field(ZSV, "NO_ALARM") + field(OSV, "NO_ALARM") + field(FLNK, "${ECMC_P}Drv${CH_ID}-SyncErrAlrm") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-SyncErrAlrm"){ + field(DESC, "$(HWTYPE): Drive Sync Error") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.BD") + field(ZNAM, "No Alarm") + field(ONAM, "Error") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + field(FLNK, "${ECMC_P}Drv${CH_ID}-BI01") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-BI01"){ + field(DESC, "$(HWTYPE): BI01") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.BB") + field(ZNAM, "Zero") + field(ONAM, "One") + field(ZSV, "NO_ALARM") + field(OSV, "NO_ALARM") + field(FLNK, "${ECMC_P}Drv${CH_ID}-BI02") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-BI02"){ + field(DESC, "$(HWTYPE): BI02") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.BC") + field(ZNAM, "Zero") + field(ONAM, "One") + field(ZSV, "NO_ALARM") + field(OSV, "NO_ALARM") +} + +# Encoder interface of EL70X7 are defined in ecmcEL5101-chX.template diff --git a/db/Beckhoff_7XXX/ecmcEL7031.substitutions b/db/Beckhoff_7XXX/ecmcEL7031.substitutions index f908a189e..53db9df13 100644 --- a/db/Beckhoff_7XXX/ecmcEL7031.substitutions +++ b/db/Beckhoff_7XXX/ecmcEL7031.substitutions @@ -1,4 +1,4 @@ -file "ecmcEL7037-chX.template" +file "ecmcEL7031-chX.template" { pattern {CH_ID} {01 } diff --git a/db/Beckhoff_7XXX/ecmcEL7037-chX.template b/db/Beckhoff_7XXX/ecmcEL7037-chX.template index eddcd8095..0e478e96d 100644 --- a/db/Beckhoff_7XXX/ecmcEL7037-chX.template +++ b/db/Beckhoff_7XXX/ecmcEL7037-chX.template @@ -168,6 +168,26 @@ record(bi,"${ECMC_P}Drv${CH_ID}-SyncErrAlrm"){ field(ONAM, "Error") field(ZSV, "NO_ALARM") field(OSV, "MAJOR") + field(FLNK, "${ECMC_P}Drv${CH_ID}-BI01") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-BI01"){ + field(DESC, "$(HWTYPE): BI01") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.BB") + field(ZNAM, "Zero") + field(ONAM, "One") + field(ZSV, "NO_ALARM") + field(OSV, "NO_ALARM") + field(FLNK, "${ECMC_P}Drv${CH_ID}-BI02") +} + +record(bi,"${ECMC_P}Drv${CH_ID}-BI02"){ + field(DESC, "$(HWTYPE): BI02") + field(INP, "${ECMC_P}Drv${CH_ID}-Stat.BC") + field(ZNAM, "Zero") + field(ONAM, "One") + field(ZSV, "NO_ALARM") + field(OSV, "NO_ALARM") } # Encoder interface of EL70X7 are defined in ecmcEL5101-chX.template diff --git a/db/Beckhoff_7XXX/ecmcEL7041-0052.substitutions b/db/Beckhoff_7XXX/ecmcEL7041-0052.substitutions index f908a189e..53db9df13 100644 --- a/db/Beckhoff_7XXX/ecmcEL7041-0052.substitutions +++ b/db/Beckhoff_7XXX/ecmcEL7041-0052.substitutions @@ -1,4 +1,4 @@ -file "ecmcEL7037-chX.template" +file "ecmcEL7031-chX.template" { pattern {CH_ID} {01 } diff --git a/db/Beckhoff_7XXX/ecmcEL7041-1000.substitutions b/db/Beckhoff_7XXX/ecmcEL7041-1000.substitutions index f908a189e..53db9df13 100644 --- a/db/Beckhoff_7XXX/ecmcEL7041-1000.substitutions +++ b/db/Beckhoff_7XXX/ecmcEL7041-1000.substitutions @@ -1,4 +1,4 @@ -file "ecmcEL7037-chX.template" +file "ecmcEL7031-chX.template" { pattern {CH_ID} {01 } diff --git a/db/Beckhoff_7XXX/ecmcEL7041.substitutions b/db/Beckhoff_7XXX/ecmcEL7041.substitutions index f908a189e..53db9df13 100644 --- a/db/Beckhoff_7XXX/ecmcEL7041.substitutions +++ b/db/Beckhoff_7XXX/ecmcEL7041.substitutions @@ -1,4 +1,4 @@ -file "ecmcEL7037-chX.template" +file "ecmcEL7031-chX.template" { pattern {CH_ID} {01 } diff --git a/qt/ecmcEL70x1.ui b/qt/ecmcEL70x1.ui index 66be1aae1..264b6168a 100644 --- a/qt/ecmcEL70x1.ui +++ b/qt/ecmcEL70x1.ui @@ -6,518 +6,820 @@ 0 0 - 125 + 120 500
Form - - - true - + - 0 - 0 - 128 - 500 + 2 + 265 + 90 + 22 - - IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) + + <html><head/><body><p>E-Bus Power Status</p></body></html> - - ecmcE_slave_frame.ui + + drive error: - + - 10 - 80 + 100 + 265 22 22 - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + - - caByte::Right + + true - - 1 + + false - - 1 + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-ErrAlrm - caByte::Static + caLed::Static - + + + 170 + 0 + 0 + + + 0 85 0 + + 0 + + + 1 + - + - 10 - 60 - 44 + 100 + 288 + 22 22 - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + - - caByte::Right + + true - - 4 + + false - - 5 + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-SyncErrAlrm - caByte::Static + caLed::Static + + + + 170 + 0 + 0 + - + 0 85 0 + + 0 + + + 1 + - + - 10 - 100 - 44 + 2 + 288 + 90 22 - <html><head/><body><p>digital inputs 1 and 2</p></body></html> + <html><head/><body><p>E-Bus Power Status</p></body></html> - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + sync error: - - caByte::Right + + + + + 100 + 311 + 22 + 22 + - - 11 + + - - 12 + + true + + + false + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-WrnAlrm - caByte::Static + caLed::Static + + + + 255 + 170 + 0 + - + 0 85 0 + + 0 + + + 1 + - + - 10 - 40 - 44 + 2 + 311 + 90 22 - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat - - - caByte::Right - - - 8 - - - 9 - - - caByte::Static + + <html><head/><body><p>E-Bus Power Status</p></body></html> - - - 0 - 85 - 0 - + + drive warning: - + 0 - 140 - 120 - 181 + 0 + 125 + 500 - - - - - - - output - - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Spd-RB - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::User - - - - - - - positon - - - - - - - <html><head/><body><p>internal step counter</p><p>WARNING: uint16, beware the overflow</p></body></html> - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - $(IOC):m$(MasterID)s$(SlaveID)-Enc01-PosAct - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::User - - - - - - - - - - - - 18 - 18 - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - true - - - false - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-StlAlrm - - - caLed::Static - - - - 170 - 0 - 0 - - - - - 0 - 85 - 0 - - - - 0 - - - 1 - - - - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - warning - - - - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - sync error - - - - - - - - 18 - 18 - - - - <html><head/><body><p>reduced torque, aka holding current</p></body></html> - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat - - - caByte::Right - - - 6 - - - 6 - - - caByte::Static - - - - 0 - 85 - 0 - - - - - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - stall alarm - - - - - - - - 18 - 18 - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - true - - - false - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-WrnAlrm - - - caLed::Static - - - - 255 - 170 - 0 - - - - - 0 - 85 - 0 - - - - 0 - - - 1 - - - - - - - - 18 - 18 - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - true - - - false - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-SyncErrAlrm - - - caLed::Static - - - - 170 - 0 - 0 - - - - - 0 - 85 - 0 - - - - 0 - - - 1 - - - - - - - - 18 - 18 - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - true - - - false - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-ErrAlrm - - - caLed::Static - - - - 170 - 0 - 0 - - - - - 0 - 85 - 0 - - - - 0 - - - 1 - - - - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - red torque - - - - - - - <html><head/><body><p>E-Bus Power Status</p></body></html> - - - drive error - - - - - - + + QFrame::StyledPanel + + + QFrame::Plain + + + 1 + + + 0 + + + + + 5 + 40 + 110 + 221 + + + + 0 + + + + Gen + + + + + 30 + 70 + 44 + 22 + + + + <html><head/><body><p>digital inputs 1 and 2</p></body></html> + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 11 + + + 12 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 30 + 30 + 44 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 4 + + + 5 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 30 + 10 + 44 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 8 + + + 9 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 30 + 50 + 22 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 1 + + + 1 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 5 + 90 + 36 + 26 + + + + BI01 + + + + + + 40 + 145 + 63 + 16 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Spd-RB + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::User + + + + + + -20 + 120 + 60 + 22 + + + + pos: + + + + + + 40 + 125 + 60 + 20 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Enc01-PosAct + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::User + + + + + + -20 + 140 + 60 + 22 + + + + out: + + + + + + 55 + 90 + 36 + 26 + + + + BI02 + + + + + + Stat + + + + + 10 + 10 + 20 + 120 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + 15 + + + + + + Ctrl + + + + + 50 + 130 + 51 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-RstCmd + + + Reset + + + 1 + + + + + + 40 + 10 + 61 + 22 + + + + Enable + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-EnaCmd + + + + + + 40 + 30 + 61 + 22 + + + + Red trq + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-TrqRedCmd + + + + + + 10 + 8 + 20 + 141 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Cmd + + + 15 + + + + + + + + 2 + 334 + 90 + 22 + + + + <html><head/><body><p>E-Bus Power Status</p></body></html> + + + ready to ena: + + + + + + 100 + 334 + 22 + 22 + + + + + + + true + + + false + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-RdyToEna + + + caLed::Static + + + + 252 + 175 + 62 + + + + + 0 + 85 + 0 + + + + 1 + + + 0 + + + + + + 100 + 357 + 22 + 22 + + + + + + + true + + + false + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Rdy + + + caLed::Static + + + + 252 + 175 + 62 + + + + + 0 + 85 + 0 + + + + 1 + + + 0 + + + + + + 2 + 357 + 90 + 22 + + + + <html><head/><body><p>E-Bus Power Status</p></body></html> + + + ready: + + + + + + 2 + 380 + 90 + 22 + + + + <html><head/><body><p>E-Bus Power Status</p></body></html> + + + trq reduced: + + + + + + 100 + 380 + 22 + 22 + + + + + + + true + + + false + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-TrqRed + + + caLed::Static + + + + 160 + 160 + 160 + + + + + 0 + 0 + 255 + + + + 1 + + + 0 + + + + + + 30 + 420 + 71 + 20 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-RstCmd + + + Reset + + + 1 + + + + + true + + + + -5 + 0 + 128 + 500 + + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) + + + ecmcE_slave_frame.ui + + + cainclude + tabWidget + calabel_10 + caled_4 + caled_8 + calabel_11 + calabel_13 + caled_9 + camessagebutton_2 + frame + calabel_3 + caled_3 + caled_6 + calabel_7 + caled_7 + calabel_8 - caFrame - QFrame -
caFrame
- 1 + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caByteController + QWidget +
caByteController
caLabel diff --git a/qt/ecmcEx70x7.ui b/qt/ecmcEx70x7.ui index a12599b39..888e33acd 100644 --- a/qt/ecmcEx70x7.ui +++ b/qt/ecmcEx70x7.ui @@ -6,158 +6,13 @@ 0 0 - 125 + 120 500 Form - - - - 2 - 475 - 90 - 22 - - - - operational: - - - - - - 100 - 450 - 22 - 22 - - - - true - - - false - - - $(IOC):m$(MasterID)s$(SlaveID)-Online - - - - 170 - 0 - 0 - - - - - 0 - 85 - 0 - - - - - - - 2 - 450 - 90 - 22 - - - - online: - - - - - - 100 - 475 - 22 - 22 - - - - true - - - false - - - $(IOC):m$(MasterID)s$(SlaveID)-Operational - - - - 170 - 0 - 0 - - - - - 0 - 85 - 0 - - - - - - - 2 - 2 - 121 - 30 - - - - Master[$(MasterID)] -SlaveID[$(SlaveID)] - - - - - - 0 - 40 - 60 - 22 - - - - positon - - - - - - 65 - 40 - 60 - 20 - - - - $(IOC):m$(MasterID)s$(SlaveID)-Enc01-PosAct - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::User - - @@ -427,9 +282,9 @@ SlaveID[$(SlaveID)] 5 - 70 + 40 110 - 191 + 221 @@ -437,79 +292,246 @@ SlaveID[$(SlaveID)] - DI + Gen - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat - - - 11 - - - 11 - - - - - - - input 1 - - - - - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat - - - 12 - - - 12 - - - - - - - input 2 - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - + + + + 30 + 70 + 44 + 22 + + + + <html><head/><body><p>digital inputs 1 and 2</p></body></html> + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 11 + + + 12 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 30 + 30 + 44 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 4 + + + 5 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 30 + 10 + 44 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 8 + + + 9 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 30 + 50 + 22 + 22 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Stat + + + caByte::Right + + + 1 + + + 1 + + + caByte::Static + + + + 0 + 85 + 0 + + + + + + + 5 + 90 + 36 + 26 + + + + BI01 + + + + + + 40 + 145 + 63 + 16 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Spd-RB + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::User + + + + + + -20 + 120 + 60 + 22 + + + + pos: + + + + + + 40 + 125 + 60 + 20 + + + + $(IOC):m$(MasterID)s$(SlaveID)-Enc01-PosAct + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::User + + + + + + -20 + 140 + 60 + 22 + + + + out: + + + + + + 55 + 90 + 36 + 26 + + + + BI02 + + @@ -807,15 +829,36 @@ SlaveID[$(SlaveID)] 1 + + + true + + + + -5 + 0 + 128 + 500 + + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) + + + ecmcE_slave_frame.ui + + + cainclude + tabWidget + calabel_10 + caled_4 + caled_8 + calabel_11 + calabel_13 + caled_9 + camessagebutton_2
frame - calabel_2 - caled - calabel - caled_2 - calabel_12 - calabel_5 - calineedit calabel_3 caled_3 caled_6 @@ -846,6 +889,11 @@ SlaveID[$(SlaveID)] QLabel
caLabel
+ + caInclude + QWidget +
caInclude
+
caLed QWidget From 621f9c127b74802eecac52a6217824657582bcd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 09:12:53 +0200 Subject: [PATCH 035/128] ecmcEL70x1.ui: Fix some formatting --- qt/ecmcEL70x1.ui | 61 +++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/qt/ecmcEL70x1.ui b/qt/ecmcEL70x1.ui index 264b6168a..410c1d606 100644 --- a/qt/ecmcEL70x1.ui +++ b/qt/ecmcEL70x1.ui @@ -377,35 +377,6 @@ BI01
- - - - 40 - 145 - 63 - 16 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Spd-RB - - - - 160 - 160 - 164 - - - - caLineEdit::Static - - - caLineEdit::User - - @@ -428,6 +399,9 @@ 20 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + $(IOC):m$(MasterID)s$(SlaveID)-Enc01-PosAct @@ -471,6 +445,35 @@ BI02 + + + + 40 + 145 + 60 + 20 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + $(IOC):m$(MasterID)s$(SlaveID)-Drv01-Spd-RB + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::User + +
From daa42f4f9e5caf3e95b020ee87d75eb9e5b5c27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 10:55:27 +0200 Subject: [PATCH 036/128] Update header of setAppMode.cmd --- scripts/setAppMode.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/setAppMode.cmd b/scripts/setAppMode.cmd index 898050188..a78f5c440 100644 --- a/scripts/setAppMode.cmd +++ b/scripts/setAppMode.cmd @@ -4,7 +4,7 @@ #-d /** #-d \brief Script for switching to operational mode. -#-d \details Restores record update rate to what was defined in startup.cmd +#-d \details Validates configuration, starts realtime thread and checks EtherCAT slaves are in OP. #-d \author Niko Kivel #-d \file #-d */ From 9659b7fba122efebac0e45071aa45b9d89b9ffcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 11:25:56 +0200 Subject: [PATCH 037/128] Add start_ecmc_overview.py from ecmcMain.ui --- db/core/ecmcGeneral.db | 6 ++++ qt/ecmcMain.ui | 68 +++++++++++++++++++++++++++++++++++----- qt/ecmcOpenEcOverview.sh | 5 +++ 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 qt/ecmcOpenEcOverview.sh diff --git a/db/core/ecmcGeneral.db b/db/core/ecmcGeneral.db index abecc8051..f43133f35 100644 --- a/db/core/ecmcGeneral.db +++ b/db/core/ecmcGeneral.db @@ -178,3 +178,9 @@ record(waveform,"$(P)MCU-Updated"){ field(TSE, "$(TSE=-2)") field(FLNK, "${ECMC_PROC_HOOK=''}") } + +# This db is only used to set the VAL field +record(ao,"${P}MCU-Cfg-UI-EC-Rows") { + field(DESC, "UI: Panel rows") + field(VAL, "1") +} diff --git a/qt/ecmcMain.ui b/qt/ecmcMain.ui index 1c316ca82..f1bb293a0 100644 --- a/qt/ecmcMain.ui +++ b/qt/ecmcMain.ui @@ -70,7 +70,7 @@ 30 20 251 - 196 + 211 @@ -418,7 +418,7 @@ 30 - 215 + 235 251 106 @@ -646,7 +646,7 @@ 300 - 215 + 235 251 106 @@ -817,7 +817,7 @@ 30 - 330 + 350 251 101 @@ -944,7 +944,7 @@ 300 - 330 + 350 251 101 @@ -1117,7 +1117,7 @@ 300 20 251 - 196 + 211 @@ -1657,6 +1657,60 @@ $(IOC):MCU-Cfg-UI-EC-SlvId + + + + 15 + 185 + 100 + 16 + + + + + 16777215 + 16 + + + + Overview rows: + + + + + + 170 + 185 + 55 + 18 + + + + >> + + + Open first axis + + + bash /ioc/modules/qt/ecmcOpenEcOverview.sh + + + $(IOC) + + + + + + 125 + 185 + 36 + 16 + + + + $(IOC):MCU-Cfg-UI-EC-Rows + +
@@ -1706,7 +1760,7 @@ 30 - 440 + 460 251 91 diff --git a/qt/ecmcOpenEcOverview.sh b/qt/ecmcOpenEcOverview.sh new file mode 100644 index 000000000..5afe4fd4c --- /dev/null +++ b/qt/ecmcOpenEcOverview.sh @@ -0,0 +1,5 @@ +#!/bin/sh +PREFIX=$1 +M_ID=$( caget -noname -nostat -nounit -int $PREFIX:MCU-Cfg-EC-Mst | tr -d '"') +ROWS=$( caget -noname -nostat -nounit -int $PREFIX:MCU-Cfg-UI-EC-Rows | tr -d '"') +start_ecmc_overview.py --master $M_ID --rows $ROWS $PREFIX From cc934040394ddd203d6caf8136757884e7e26d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 12:48:04 +0200 Subject: [PATCH 038/128] Add trouble shooting EL7041 --- .../troubleshooting/el7041_diag_regs.png | Bin 0 -> 136400 bytes .../manual/troubleshooting/hardware.md | 61 +++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 hugo/content/manual/troubleshooting/el7041_diag_regs.png diff --git a/hugo/content/manual/troubleshooting/el7041_diag_regs.png b/hugo/content/manual/troubleshooting/el7041_diag_regs.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2c52e6e2cef6eedfe65023f9cf04be2e68b73a GIT binary patch literal 136400 zcmce;Wl&sM)Hd2o970G45Qt&9FL^LN0)Lak#_qM1|ItXa{5zb?A2HoD{cmuSI}wEb6I zE$%@TY2V!zw@&`Vx=GD*IBh1`Nr|l6)?)L%fBx?uA8bLYe1^}jfBg67n2X;)@c+If zB5(NLyPorQ|M~yxg;9KJYU=#*|G6c1f{EUKnW>M;O4coPKc0Q~@F6x_dq5Sjv}n0S z2YpK1pN3%8VLOi#*9vb*|LRYVet~kWFZ)HDw%!(h{X30X_YQ&%)~!J`ABPvOHmQ`u z_2jSf@-|j{mGVpI`giCO>Gk*sm%wq9b-I|;c&9L`)}UY8dnpu(n;ldA4hJS2?(4C!TVXum?XU+UA|@uD zd6+7ii`le+iMw6lKHc~Q7W0txwB6RiCq`%ftPLVY#>fo{#jyqhH}ix173q#x9@q1Y z>5~YN(aNIb@4<;&(NWW?eY=%^PFcL&Ai}N!%WT%lHH?%Qv(=P1%yk23JWBJ%7_kzg`|PgsD{@eTnXS z^X{Dv%)31ZgN1CuJ&DyO&ikkD%8E_m@UXN#J%+b8Zvuytx24zl%A&{6TWp6@&Y}f* z7mu~hLc9PPa&k->8Y{&Dbv~FkpMNm)LE3$$r|H4(6Spqq(PC3y~Mi&*`;1?6TP zhQ&p0_lH|(cen82V&jn3S~jiIVw$)J2`@kY^Ykw9&+P2%a%-sn?y~N8j||Y*XRlD9 z=n@hV5cQB6ViSSah=>MVgIo~tWcELMxR$JnHeZP&N5$+}m{k>-W4S6JnrHu?LP(p%=r<9v^2u_Qag!Nly1$Q}w4%`{2= z%OA&L*5-i3Ql!ov*q6#>zcVWH;c8&ce5q8ec4)d^}0Op`1n{nP>ed7 z!S-D1`lgXYsYpEtX2$6EZr^aM*{rm@@OjIihMQN7ZS3+XD$;D#QE#Ig5$^U@pxV=cLvXOZ`k%m(?svG z-AB2)-@bhL5`|2+LrYIccA)3OcaJ+H@+&MlTkHX~Dy5y-P0tM zPem5~L_qJ)vdg|ip-_CzF(+D}SsCPhb1FO2np8p~a(3HthObe7p_owINd<+TMRK}b zCVDbh9460PM9zN&Ci5kleAi^X|=UvMbG)< z6qS8;_USOK5OgAABc~w`-Cf~r&la*+qSK_Nrh5PR^8pukYGCn(N8$9kpD)*Sn+=jR}Jo)^Bb(S9a ze0+U%bu2q`$BbeboOt70!umGu*_@yIX{f(JL};Jyj~p`^EHk}Og+6@w@@0F%=<^nh zI{z1$^xsfaUS3{oF4qJMhRuJpjkUk0rsAjMaBdDIBXM~&KCNcuwVkDYWIX1CLRahd zwz1vmwGMNEmO$bxlR{NTXXj}B(ARI@z73C#t{-slWJx5qmm3X<_^ZD&5RKN|IPJK< zF@iA;#sANGo-aUSzx{$QHM&wn8%!Q3N%i_?dBsNK#-2;3#c5}hh|Od7HAx6gnpd-C zw|?Fl*<`_-u(0rJB2kpBa}jh&TpsbjO$q;i0K*MYfhkIY^m*|_b~s3NVD$Ea)B8Vv z{-99Hhpn8LWN$8~5UAXO3=9@JkJu9PUEr}dg*KRwa?2fyVh3vt~m97U! zp&r6H73%dxq{>>Mu%*_=E((S$!>r!sXaD>YzOdEa70SvwJyIzqq#nAz^|zFdF-Hsi z>kQ8BKr@RUs2O9z5bg zC6DYX4S1Fl5PRr>+kcI_E8>dSI!CkY?Er z#SzZ89?gn51{(>fq@i!FOj~IL(}r}S+lltNH;EXx?!-w;_PTbcUwkA z#^K@N&&0&O+c~i648p&e#o6)ZHPgx%kB^VfpFh_&lY66v)sb@iz2$2ZmDWHipHR*6 z=3u^(W^XA2hJmT+x0P=%PEI@u6UE|@v1wQj|U z759yc!*o5_Qjn04sg@+oz{0}H_hFJ6KaB{dIVm(E&dR$}RaMPti0aX&)Tjyojfadv zMo_SJ?F=8EX$fm`zW?oaCr{5FOCFcgw*mpGGHK3q(5p;YhjU~NhBwIyqNsxZJx*A_ zk!7rmoY+lIaY#sr?PN(x%IA$cIyyS{o2)>EZwMmslT<3T?l$3GwYEEufPdB#To9lu z08GVi&Jx+!*wkc{CP{qN{)|394@WBf84vOZ=l!>{^Pd1q83?#TW#yP`OeNhH@av&S zFp(S0Z|c9`QAL^i8{MvQr&2I*IIfmg+F`{Py1M4#(UJ$yVjkjvGdIGDLF~X}l-5@6 z3p$}4=x{Ha1z>+h`BG2X}-#DSZp-niLW*nl8|WY$B<+7x@0XklnfpcS~cS^*&uw-Q6RG4 zKzR3VrI*DF-Q#h8$VX(%c&y4Ud{6bu&5$@d>Ay@Q44)@6lJJjkNpQ01WJia>jHuml zSYX+l@;@AE9oO%z@bL2FZCYk(*@u#vwGVE+YVEF?%4E-vvMe~=uRkFoB4VXmle-&|*B^{usR zsd=yEo_Uu*I05fwh>I)9?T-N^hIl8vu=l9mUbw8y1!qf zAYu9a`}gv-zg*tU@1t2mBQw4}GzmHeh7EyxpO5~B$##nia|o z5eo|7pV1o5^Izhz1{EKfS#l*&w zXBS&c$e#Rt?C4V}cr?O+JiEQhy2H~rcEA43Vzo$bGirZ%xR_UPPUv_XmUgUGrteRv z;RK0eH0gde(V!F}|Z_KD)XLA3hw@BLK?y`UQ1a=~Xt{#HjJ~!vL zJ9rWK5pO)_FjDu5HCMj(+$7=?ohkMrchfl*EnyEgmz#Zi8|MQRe^03twf|?<@ zLP1MvyO2$@{V##Q=nojE9j(_pAp`^jYuVdT;XKW0mDHa)VF#FI8Wc=P87VcEC>- z+!(QCib9tM=A0U?+=lj5#z>W_f_gn~&bIXSqAplDl(x+Jl^Pm7$Q1IP+Zjq_Ys@MB z?d*+VHNh+`Ed`L(N0SToRZJ`}R}SS@wNi0|a;>RF`1#KtKWyye`Y*>*JQMZLrb~Fa zHoorov~Aav5?~BBvuth}0-`AzMcLYmDi&GDx&!6W(qx9!qq(`MjZaL_(bA?!>_t(= z@K8)xJM2yB9`N+pfCf1{{GN%4>FwLMCDr9RgZn#gvDiuZZiFS%X)X?8ToTeIp6#t~T)MEvdVuQOMb$S){JPvx0a=ZAzx(IrQfz!Q%)5Km4L zx;vC-`Uf`VEyPN_=k7lJdJmYLg=Sbvo(-5R$eN0PfgR%XEP^86^+-=EIy3TOGz zL&|V4CIGZB+gkM*gQ7e=gWak8pWqbM+S{gPXU89w^pMH^4e)TQJ`<`QTn8{QS3bbs z|BXVvqRzrB)P6sV0UiB+s4G0Oi|K>zb9{sb&j(-7A#}~n#i70LdZP+@Le`4YVWsPioPxOr9JNf8V5JnLZEB_c!Hf^ooiKQrQezK*D+*R8>2qN~!*P>wUF< z6b8PU>-qH?3Z#FV48$?_?(V<⪻e_p40!oVon%={|n0h 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℘%ekr2Toj4L*M)tT9Kh!xrubTYbnygH^LZLg+A zxHAKc9x*u!{Zk`n4S-R|h;P@&BNCRf_qY=d+-Bqu+r0Ud?`PD{CQ~^SK!+Oj#>S_! zJeqr?QRAji_7T-ujBH~m7KcH)AU>W56di_t$NvV9Y`lV07k=VR0#@f+B_%An7QnCV zs@BGrt}p_-8B}0F{=}$rB92oYDs`~3N_GzUnIIWiC~$l8OIzg5kqHShj*dUFHb0Vq zv!4SRibSP+

`iPNZ-;6$~XMr9oahc6NF3w5$*JB)vn!dsFm}cm88ZC-#HZUku>T*MvRVD;+I({eSaE*$6nsQ$D~p~ zgakbHX+435pP%2VJB^7+ICeyfn|lf@nI{w!UxkCWp)b#{oS6v;3!{6@2@R@GElP}^ zpEYB{8)_O_zstV9K6fr*kk&@fnfmhQo>|3+{nWuNkc*(@S!FjB`tacn1b0l;KLEG*o1uhac-sx&(GRXRHVgl6cOynda; zM!~K$?EZVmR1!QHzCl45`8tn%FCx;C9)pkz8jVpTeJdVUnus#mM+B$Kx%wZOp0OBW zVqtMRuHKRQSbLH_w}R2ymv99>`7l@rS?ZY_5F+q|l~o~JqPeN5C8PRYs>Rg!WHm#* zDkJ?SjjNkO$IcO56Ac3d9Uw-Ytyr8giwM?xno!2-oX1P`G6k%4Pv?)5QR&}&!R z(IXc|iex;vR%JJ*c*5x0*D_D4jguam;sa5er7)E)jy z$zKJ!eS8C#jCTcKn}8*_FxyV>2&x;bIbmsgn5}8wzjqrh#tciKd}nc0B@9zjIF#1q zAqjEyxIb0HuC;(!9Rl$CGF% z<@hW=1R;rrUUj)!k@LZg<3(*2&{_6)eizm^GGPAhuAOF}|F)>n`%huB$)7&9r1M(m zk4%1N_1}iH=y$aO0_}`oMsA&)lrD=rmpWlPhz<#P8f$lr8@E$lR>tKjc2Neijj_BF zO+ip^+%)VC#V&GB#>P~mV+iGwg|33c4Hy^(d%CIYPq#9(>Z;lPm@0n{=!&2VgDRkC z%N9{?jh1{Lj}i74zh!3`o7PNB1l1tdh%s0SPh=xW=hyHEw##b zvB34O^~VPj%`h%~_)vt$4@*M;Cc~IjE=Fx5ZS98JuICp)8^deEC&nj{xP*l3h)FI- zDHj@df;#78qpo2=)m8onVCs@lU8{kRg+ia+U&4I?y^D+b(gA^z!gjuh2UhMinaR+*ujxP6lILGnHh4o+UpTjtAt z)lGE1#>?{ufRur%x00)l2i|hJU7ZjLi!6IV^%7MF@ z<^ug`rKbU+VoF^n9p%>gcs}?hWGWyL>eG89nDSD*G4RTw!)W)tvn#$)~2l55+ zL`+(>PiSa-zkIo+s2DE)`t=ibcATWv?#{kGN`C&Ebln(yPMB?;H@yK1rdk}m%jh=w z_y)I2xAIxR91JJ=1_s65mYi_USDL+BKJtvgCnz!^RVkc;N)`4^kBZA-`$htfs?X%f z2|e`A5uoZW*7Ftw7a5He7X?F{Xy?(vgGRk&jd?80*Gfvlpjry|a$@Fq-wadD=}M9d zo9Rfnp^W^46ROrprD&PAC_gljp>k|~D<9V!$iPd_LlkNLx zkeS(Rtok$5&S?=*X0wyG2(h(X@HJ4Z&oJS}b#Th_xm3dkQ)Z%qJ9RmXO6Cdu zCV^fXw-s>hDJdycA5Uq8y#gs=Zw(>$x-rmP&uh0atkd{?4)K5ja1MsY;P!wjB0l_{ zq@k&nCfDQb1nNn6Xn)>tv5sgO(=BgZ1_n--6BkiC%~Ua6CICfc2oWoL9vq zi?5zxWN2nq4NSN!0Oq05(H%lb>1CEiekIno69ruQ<|(>k*5>-8A2{5AD65N8|JE}) z2|*Ppsr%5jrC2kV&`TbDMtxwFz(OonD4Ld$77DFke3cdeXodg~!o#RqY|Va9hs!+H zD$|1>9OO%5`&Z0_e6S}V=~|1&p`zyjhiDgjdFoK=Quy4PmBaIyVOFf4l zfNVKy?J5LNRN(%~LY?tl#)6?Nl|l@qDmq*{genq-5Qh*)E6O1nqJxAV7Mnxx1k?#lF)qDf*x1JtpTiY_`=f$g3kORJjBb>2i9#QnP^-t(5J50Fx2nq=X2O_TEFR}I$a9{0q8SVV=Yl1BG=LBU%)8a6VDzD5!yK_ zg+cu(r--)FxJ^t`6J08|prfPfx$$d3sF)F4@u87PDf)7@MC}mXRJ=YM2<0%A<1!F3 zc=4i_X=!O!VULF{buh6B(p|z56N9R&)dY^6{+?)I|8)h#^{xPB)3iszD+vkaF_Rk= zQ!XV|L%5Jj=7*<+bno82w2gzo?{zzfSdX_kJw?w6 z5)TaLx!s@QDr-XIQMwDKDY&R

AxDMgg$s?08JHRmX8dX=$>?{Ui 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 literal 0 HcmV?d00001 diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index f5556196d..893e22c85 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -7,7 +7,64 @@ chapter = false ### Hardware ### Over current protection EL9227-5500, EL9221-5000 -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 etehrcat slaves. If the over current protection is not enabled then the ethercat slaves will not receive power. +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. + +{{% notice warning %}} +Before pressing the buttons make sure it's safe to power on the system. +{{% /notice %}} + +#### EL9221-5000 +The EL9221-5000 has one channel and can 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. + +### EL7041 +If 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. + +{{% notice info %}} +In order to use the etehrcat command, you must first login to the server where the ecmc IOC is running. +{{% /notice %}} + + +The diagnostic data can be read from register 0xA010: +![0xA010](el7041_diag_regs.png) + +The registers can be read with the folowing syntax: +```bash +ethercat upload -m -p --type uint8 0xA010 +``` +Example for master 0, slave position 3: +```bash +# 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 +``` + -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. The EL9221-5000 has one channel and can therefore only the top button is needed to be pressed. 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. From 4c28ecc6edef24e95e08394ca984a5f6693c0060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 12:53:48 +0200 Subject: [PATCH 039/128] Remove pic and add link to beckhoff doc --- .../troubleshooting/el7041_diag_regs.png | Bin 136400 -> 0 bytes .../content/manual/troubleshooting/hardware.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 hugo/content/manual/troubleshooting/el7041_diag_regs.png diff --git a/hugo/content/manual/troubleshooting/el7041_diag_regs.png b/hugo/content/manual/troubleshooting/el7041_diag_regs.png deleted file mode 100644 index 3a2c52e6e2cef6eedfe65023f9cf04be2e68b73a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136400 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⪻e_p40!oVon%={|n0h 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℘%ekr2Toj4L*M)tT9Kh!xrubTYbnygH^LZLg+A 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

AxDMgg$s?08JHRmX8dX=$>?{Ui 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
caLabel
+ + + caInclude + QWidget +
caInclude
+
+ + caLed + QWidget +
caLed
+
+ + + + diff --git a/qt/ecmcEx3255.ui b/qt/ecmcEx3255.ui index f90c5d81b..cf1e2cf7a 100644 --- a/qt/ecmcEx3255.ui +++ b/qt/ecmcEx3255.ui @@ -26,7 +26,7 @@ <html><head/><body><p>OPERATIONAL status of the slave</p></body></html> - IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) ecmcE_slave_frame.ui @@ -58,7 +58,7 @@ - CH=1,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=1,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -309,7 +309,7 @@ - CH=2,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=2,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -560,7 +560,7 @@ - CH=3,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=3,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -811,7 +811,7 @@ - CH=4,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=4,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -1062,7 +1062,7 @@ - CH=5,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=5,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -1326,7 +1326,7 @@ - CH=1,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=1,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -1606,7 +1606,7 @@ - CH=2,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=2,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -1878,7 +1878,7 @@ - CH=3,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=3,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -2150,7 +2150,7 @@ - CH=4,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=4,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) @@ -2422,7 +2422,7 @@ - CH=5,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID),HWType=$(HWType) + CH=5,IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) diff --git a/qt/ecmciPOSXXX_VOLT.ui b/qt/ecmciPOSXXX_VOLT.ui index 6535d867a..09e31b5ad 100644 --- a/qt/ecmciPOSXXX_VOLT.ui +++ b/qt/ecmciPOSXXX_VOLT.ui @@ -13,27 +13,11 @@ Form - - - - 0 - 0 - 125 - 500 - - - - IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) - - - A_RF_LLRF_ELETTRATUNING_include_E_slave_frame.ui - - 10 - 430 + 420 101 21 @@ -48,7 +32,7 @@ ecmciPOSXXX_VOLT_expert.ui - MasterID=$(MasterID), SlaveID=$(SlaveID),ID=$(DRV),IOC=$(IOC); + MasterID=$(MasterID), SlaveID=$(SlaveID),ID=01,IOC=$(IOC); @@ -545,6 +529,25 @@ + + + + 0 + 0 + 128 + 500 + + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) + + + ecmcE_slave_frame.ui + + + cainclude + CiA402_2 + tabWidget From 734d3f630637dcd69f887fec2053900bc4e863a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 23 Sep 2024 15:35:20 +0200 Subject: [PATCH 073/128] Fix current scaling for ipos4808 --- db/Technosoft/ecmciPOS4808.substitutions | 2 +- db/Technosoft/ecmciPOS4808BX_VOLT.substitutions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/Technosoft/ecmciPOS4808.substitutions b/db/Technosoft/ecmciPOS4808.substitutions index 4892c6736..7b006e0d6 100644 --- a/db/Technosoft/ecmciPOS4808.substitutions +++ b/db/Technosoft/ecmciPOS4808.substitutions @@ -54,7 +54,7 @@ file "ecmc_binaryInputArray-chX.template" file "ecmc_analogInput-chX.template" { pattern {CH_ID, KEY, suffix, sourceName, LINR, ESLO, EGU } - {01, "Drv", "-Curr", "currentActual", "SLOPE", 0.0012210, "A" } + {01, "Drv", "-Curr", "currentActual", "SLOPE", 0.0006105, "A" } } # voltageActual, ESLO= 102.3/65520 (see manual) diff --git a/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions b/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions index 367879736..78bed7e01 100644 --- a/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions +++ b/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions @@ -55,7 +55,7 @@ file "ecmc_binaryInputArray-chX.template" file "ecmc_analogInput-chX.template" { pattern {CH_ID, KEY, suffix, sourceName, LINR, ESLO, EGU, PREC } - {01, "Drv", "-CurAct", "currentActual", "SLOPE", 0.0012210, "A", 3 } + {01, "Drv", "-CurAct", "currentActual", "SLOPE", 0.0006105, "A", 3 } } # voltageActual, ESLO= 102.3/65520 (see manual) From 8ecd1016860ad2fb9e5703ead11b6bda7e7df589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 24 Sep 2024 11:36:21 +0200 Subject: [PATCH 074/128] Add technosoft VOLT configs --- .../config/cfgVOLT_CoE/TMLCode.sw | 41 + .../ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin | Bin 0 -> 2616 bytes .../ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw | 1308 ++++ .../4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd | 2762 +++++++ .../4808_BRUSHDC_VOLT_48V_20A_plusTML.sw | 1348 ++++ .../Untitled Application/1_Motion Status.cp | 13 + .../Untitled Application/2_Drive IO.cp | 36 + .../Untitled Application/3_CANopen Status.cp | 72 + .../Untitled Application/4_CoE Objects.cp | 171 + .../Untitled Application/5_Drive Status.cp | 170 + .../Untitled Application/application.cfg | 6 + .../autotuning_parameters_bakup.cfg | 851 +++ .../Untitled Application/cam.cfg | 0 .../Untitled Application/functions.cfg | 0 .../Untitled Application/gainscheduling.gs | Bin 0 -> 5889 bytes .../Untitled Application/homingmodes.cfg | 6732 +++++++++++++++++ .../Untitled Application/interrupts.cfg | 153 + .../Untitled Application/logger.lgs | Bin 0 -> 818 bytes .../Untitled Application/main.cfg | 0 .../Untitled Application/parameters.cfg | 851 +++ .../Untitled Application/scope.osc | Bin 0 -> 3012 bytes .../Untitled Application/setup.cfg | 120 + .../Untitled Application/variables.cfg | 19 + .../4808_DCBRUSH_VOLT_48V_20A/logger.lgs | Bin 0 -> 209 bytes .../4808_DCBRUSH_VOLT_48V_20A/workspace.cfg | 8 + .../ipos4808/ecmciPOS4808-Init.cmd | 58 + .../ipos8020/DC48V_TRQ_MODE_40A.s.zip | Bin 0 -> 35976 bytes .../ipos8020/DC48V_TRQ_MODE_40A.sw | 1306 ++++ .../ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd | 2770 +++++++ .../ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw | 1347 ++++ .../cfgVOLT_CoE/ipos8020/FOESW_DC48V_TRQ.bin | Bin 0 -> 2612 bytes .../ipos8020/ecmciPOS8020-Init.cmd | 58 + .../cfgVOLT_CoE/old/DC48ConfigsPlusTML.cmd | 2770 +++++++ .../cfgVOLT_CoE/old/DC48ConfigsPlusTML.sw | 1347 ++++ .../config/cfgVOLT_CoE/old/DC48V.s.zip | Bin 0 -> 36032 bytes .../config/cfgVOLT_CoE/old/DC48V.sw | 1306 ++++ .../config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd | 2670 +++++++ .../cfgVOLT_CoE/old/DC48V_TRQ_MODE.s.zip | Bin 0 -> 36000 bytes .../config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw | 1306 ++++ .../old/DC48V_TRQ_MODE_plus_TMLCode.cmd | 2770 +++++++ .../old/DC48V_TRQ_MODE_plus_TMLCode.sw | 1347 ++++ .../config/cfgVOLT_CoE/readme.md | 92 + 42 files changed, 33808 insertions(+) create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/TMLCode.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/1_Motion Status.cp create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/2_Drive IO.cp create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/3_CANopen Status.cp create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/4_CoE Objects.cp create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/5_Drive Status.cp create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/application.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/autotuning_parameters_bakup.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/ecmciPOS4808-Init.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.s.zip create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/FOESW_DC48V_TRQ.bin create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/ecmciPOS8020-Init.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48ConfigsPlusTML.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48ConfigsPlusTML.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.s.zip create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.s.zip create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.cmd create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.sw create mode 100644 hardware/Technosoft_slaves/config/cfgVOLT_CoE/readme.md diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/TMLCode.sw b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/TMLCode.sw new file mode 100644 index 000000000..227db53bf --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/TMLCode.sw @@ -0,0 +1,41 @@ +4000 +649C +23C9 +4014 +23BF +4013 +2398 +400B +74C0 +9C0 +400B +404 +5A57 +FFFF +8000 +20 +7484 +2FB +400F +102 +1 +401E +0 +0 +0 +0 +0 +0 +0 +0 +0 +5909 +FF3F +0 +5909 +B0C0 +8000 +108 +404 +0 + diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin new file mode 100644 index 0000000000000000000000000000000000000000..ffa04ca0d68e4145938838fc8b896124b365d255 GIT binary patch literal 2616 zcmaKsdsI}{6~_177npMgP=XZj5i=2^#${3p5l9Wp41*YzT6{#)mL@(BiLpx5m`JsA zuu4;F5@n@b0=hD_R#QtmE^BfP7RIJ(sHIuuE?R*NZ{hq5 zX5Vgp&&)zCL77y~lztoaJ}8QHKf;-9v%1agRyGd~8#FRZIuqkbyCdf&dTv2CpwFQ$ zoA#cziO$#q=wpm$p>uX6owuLj3-;68ZO`S4_B_61&*#hb0={Bb@l|^fe_~hjHTxOv zu^02F_7Xl}@8`U5XW7Pf@}QBBr_`a7t7X+@*) z$kX9}%oDiRN~70Jq88MC1NB%24)>3T+|XCU(cm(SS0Y4L zp&!5pp%=qLX$8hnn6nV;tb=a~o79YPHB<|IA9H_*aU--G+8*Yy+IsHZ3Yx~pT|{NP z?XZWsup&{KTG{p;a|d@lY*Gl{K_#_-1|73TjUJTQX%%?x&v?&L%5opaibQ|2e)f~* zo&T`*z@L!H2f})M4@55sH=5+ZUxm3Al~<&)8D9)hgZS6_dvFeqee8tidV3aRU^ zXmo7q4cG6onQpq2BGv2CA)-vVe=p7er!TxCyek|MzSdA08HT4M8Xlgw|6HL*I6^9& zcpz4&g4dX)q?pyI|qTNT7zjry?T?{N6L-&x-Gs`(G0Nwl(&Z?rn{IQE!Pq zAby{4zwnr_Q@BI8Q@BUi(i+?0F7a;&+gr(alMc1U_WzFXuu#jcUK7@YJ=2J`iYHzE zt6!Hb)kF-1e81GWxifuFYD$@g>umow!SdpAko?m@Pw`CgGr*94mTqe7ES|01?`J(W zCsy|w+MskeU-4Y&m=~-1D`Opn3$;ko zzz{G!uvSk=uAa2U-cpo@-4({}R6GF*dA}}vRR5*3v#>yzkB$MTYVSa>$Daar1crj? z0gY@DW>5Bi1HENMWx}aAgT|sM!a8&`$^M&#rf$nm$d7{`ogc3=?7!wGfYS>yaKHXv zrZ{(PPo?tZIM#y!TzH*F?We0tKfO`koAD!&5ll>F!1oS@iL4Otd_?P4U-S2!s--mD~p^u{Gbw z$Ubwj8&38)+)ZS+oUGT$Zo~B<`@+fYIN6tQcacS%jOr-%!(I$H#``hr{&&`KPG)H) zH|G8vS`Tf2;_Ds?47+?LZ>%>BeIxas=>gqJqx5MSt;e$m9rr^cpe!f_Jt5ycpvRvo zevtSCup{6Se&vBka0Hc8Hsw%0<0(0x0000) <3(0x0003) +INT MotorSensorType @0xC0D1 =1(0x0001) >0(0x0000) <8(0x0008) +INT LoadSensorConnector @0xC0D2 =0(0x0000) >0(0x0000) <3(0x0003) +INT LoadSensorType @0xC0D3 =0(0x0000) >0(0x0000) <8(0x0008) +FLOAT DSP_freq [Hz] @0x8000 =9e+007 >9.9999999e-009 +UINT PWMPER @0x0252 =2250(0x08CA) +INT CLPER @0x0250 =2(0x0002) >1(0x0001) +INT SLPER @0x0251 =20(0x0014) >1(0x0001) +INT PHASEADV @0x0257 =8192(0x2000) +UINT SCIBR_table @0x098D =0(0x0000) +UINT CBR_table @0x0928 =0(0x0000) +UINT PositionControlType @0x806E =0(0x0000) <1(0x0001) +FLOAT AnalogueInputsRange [V] @0x8002 =5 >3 <2e+001 +FLOAT ADCRange [V] @0x80A5 =3.3 >0 <2e+001 +UINT ADCResolution [V] @0x8058 =4.096e+003 +FLOAT VMOT_min [V] @0x804E =1.1e+001 >1 <2e+003 +FLOAT VMOT_max [V] @0x804F =5.2e+001 >1 <2e+003 +FLOAT VLOG_min [V] @0x8050 =8 >1 <2e+003 +FLOAT VLOG_max [V] @0x8051 =4e+001 >1 <2e+003 +FLOAT InPS [A] @0x8053 =8 >1e-003 <2.5e+001 +FLOAT ImaxPS [A] @0x8052 =2e+001 >1e-003 <1e+003 +FLOAT Auto_Default_CheckCrtValue [A] @0xC0FF =3.91e-001 +FLOAT VdcMaxMeasurable [V] @0x8054 =1.023e+002 >1 <2e+003 +FLOAT DriveTempSensorGain [V/C] @0x8056 =9.9999998e-003 +FLOAT DriveTempOutputAt0oC [V] @0x8057 =5e-001 +INT CurrentMeasurementType @0x8001 =1(0x0001) >0(0x0000) <1(0x0001) +INT SSI_No_Bits_Revolution [bits] @0xC0E1 =1.3e+001 >1 <5.6e+001 +INT SSI_No_Bits_Turns [bits] @0xC0E2 =1.2e+001 >0 <5.6e+001 +INT SSI_No_Bits_Revolution_LD [bits] @0xC0E8 =1.3e+001 >1 <5.6e+001 +INT SSI_No_Bits_Turns_LD [bits] @0xC0E9 =1.2e+001 >0 <5.6e+001 +UINT DBT @0x0253 =2827(0x0B0B) +UINT T2MAXPROT @0x0299 =30775(0x7837) +UINT UMAXPROT @0x029A =33945(0x8499) +UINT UMINPROT @0x029B =5764(0x1684) +INT II2TPROT_D @0x0986 =13104(0x3330) +INT SFI2T_D @0x098C =4474(0x117A) +ULONG I2TINTLIM_D @0x0980 =6036849(0x005C1D71) +INT SATPWM @0x0254 =2621(0x0A3D) +FLOAT Vdc [V] @0x8016 =2.4e+001 >1 <9.875e+001 +FLOAT ImaxM [A] @0x8060 =8 >4 <1e+003 +FLOAT In [A] @0x8061 =4 >1e-003 <8 +FLOAT K [Nm/A] @0x8064 =3.9999999e-002 >0 <1e+001 +FLOAT R [Ohms] @0x8065 =2.698 >1e-003 <1e+003 +FLOAT L [mH] @0x8066 =2.1991001 >0 <1e+006 +DOUBLE Jm [kgm^2 E-7] @0x8067 =8e+001 >1.0000000000000001e-001 <1e+014 +INT SINCOS_FRACT @0x08CC =0(0x0000) >0(0x0000) <8(0x0008) +INT SINCOS_fract_LD @0x0917 =0(0x0000) >0(0x0000) <8(0x0008) +INT isMotorInertiaUnknown @0x8068 =0(0x0000) >0(0x0000) <1(0x0001) +LONG No_encoder_lines [lines] @0x806A =5e+002 >1 <1.07374182e+009 %10 +LONG No_encoder_lines_LD [lines] @0x80B2 =5e+002 >2 <1.07374182e+009 %10 +FLOAT Resolution_LD [m] @0x80AA =4.9999999 >0 <3.2000002e+004 +FLOAT Tacho_gain [V/rad/s] @0x80A0 =4.8e-002 >1e-003 <1 +INT MTSTYPE @0x028C =0(0x0000) +LONG MECRESL @0x024E =2000(0x000007D0) +LONG ENC2THL @0x024C =2147484(0x0020C49C) +INT TransmissionType @0x80A6 =0(0x0000) >0(0x0000) <3(0x0003) +FLOAT Motor_transmission [rot] @0x80A7 =1 >-1e+006 <1e+006 +FLOAT Load_transmission [rot] @0x80A8 =1 >-1e+006 <1e+006 +INT AAR_table @0x0913 =0(0x0000) >0(0x0000) <511(0x01FF) +UINT SCR @0x0300 =37120(0x9100) +UINT ICR @0x0304 =31(0x001F) +UINT OSR @0x0302 =24582(0x6006) +UINT PCR @0x0303 =187(0x00BB) +UINT ACR @0x0912 =17728(0x4540) +FLOAT Dump_C @0x8073 =1 >0 <2 +FLOAT PB_C_minim [rad/s ] @0x8074 =1e+003 >1e-003 <1e+007 +FLOAT PB_C_maxim [rad/s ] @0x8075 =4e+003 >1e-003 <1e+007 +FLOAT PB_C [rad/s ] @0x8076 =2e+003 >1e+003 <4e+003 +FLOAT PB_C_AT [Hz ] @0x8077 =2.0000001e+003 >1.591549e-001 <7.9577472e+003 +INT SFTKPI @0x0272 =3(0x0003) +INT KPI @0x0271 =20820(0x5154) +INT SFTKII @0x0274 =0(0x0000) +INT KII @0x0273 =24024(0x5DD8) +INT SATID @0x0275 =2621(0x0A3D) +INT SATIQ @0x0276 =2621(0x0A3D) +INT FILTERQ @0x0982 =32767(0x7FFF) +INT FFL @0x0223 =0(0x0000) +INT KFFL @0x026F =32767(0x7FFF) +FLOAT Dump_S @0x800B =1 >0 <2 +FLOAT PB_S_minim [rad/s ] @0x800C =3e+001 >1e-003 <1e+007 +FLOAT PB_S_maxim [rad/s ] @0x800D =4e+002 >9.9999998e-003 <1e+007 +FLOAT PB_S [rad/s ] @0x801A =1.5e+002 >3e+001 <4e+002 +DOUBLE Jt [kgm^2 E-7] @0x807D =2.6400000000000006 >1.0000000000000001e-001 <1e+014 +INT OnlinePlotS @0x8036 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT TestSpeed [rpm] @0x803D =9.6000003e+002 >-2.0219999e+004 <2.0219999e+004 +FLOAT TPS [s] @0x803B =5e-001 >1e-003 <6.5535004e+001 +FLOAT TNS [s] @0x803A =5e-001 >1e-003 <6.5535004e+001 +FLOAT TaPS [s] @0x8039 =1e-001 >1e-003 <6.5535004e+001 +FLOAT TaNS [s] @0x8038 =1e-001 >1e-003 <6.5535004e+001 +INT MultiCycleS @0x8037 =1(0x0001) >0(0x0000) <1(0x0001) +INT SFTKPS @0x0268 =4(0x0004) +INT KPS @0x0267 =20866(0x5182) +INT SFTKIS @0x026A =0(0x0000) +INT KIS @0x0269 =25040(0x61D0) +INT IMAXS @0x026C =28737(0x7041) >0(0x0000) +INT SATS @0x026B =22939(0x599B) >0(0x0000) +FLOAT Dump_P @0x800E =1 >0 <1 +FLOAT PB_P_minim [rad/s ] @0x800F =3e+001 >1e-003 <1e+007 +FLOAT PB_P_maxim [rad/s ] @0x8010 =4e+002 >1e-003 <1e+007 +FLOAT PB_P [rad/s ] @0x801B =1.5e+002 >3e+001 <4e+002 +INT OnlinePlotP @0x8080 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT TestPosition [rot] @0x8047 =2.0000001 >-4.9150503e+003 <4.9150503e+003 +FLOAT TPP [s] @0x804D =2e-001 >1e-003 <6.5535004e+001 +FLOAT TNP [s] @0x804C =2e-001 >1e-003 <6.5535004e+001 +FLOAT TaPP [s] @0x804B =3.0000001e-001 >2.0000001e-003 <6.5535004e+001 +FLOAT TaNP [s] @0x804A =3.0000001e-001 >2.0000001e-003 <6.5535004e+001 +INT MultiCycleP @0x8081 =1(0x0001) >0(0x0000) <1(0x0001) +INT SFTKPP @0x025F =2(0x0002) +INT KPP @0x025E =18780(0x495C) +INT SFTKIP @0x0261 =0(0x0000) +INT KIP @0x0260 =3756(0x0EAC) +INT SFTKDP @0x0263 =4(0x0004) +INT KDP @0x0262 =31299(0x7A43) +INT KDFP @0x0264 =13107(0x3333) +INT IMAXP @0x0266 =30801(0x7851) >0(0x0000) +INT SATP @0x0265 =22939(0x599B) >0(0x0000) +INT SFTSFFW @0x0292 =0(0x0000) +INT KFFS @0x026D =0(0x0000) +INT SFTAFFW @0x0291 =0(0x0000) +INT SFTKFF @0x0270 =0(0x0000) +INT KFFA @0x026E =0(0x0000) +INT IMAXPROT @0x0295 =11794(0x2E12) +UINT TIMAXPROT @0x02C4 =10(0x000A) +INT ERRMAX @0x02C5 =1000(0x03E8) +LONG ERRMAXL @0x09E0 =1000(0x000003E8) +UINT TERRMAX @0x02C6 =3000(0x0BB8) %5 +INT SERRMAX @0x0879 =62(0x003E) +UINT TSERRMAX @0x087A =3000(0x0BB8) +UINT T1MAXPROT @0x0298 =32767(0x7FFF) +INT II2TPROT_M @0x0818 =6552(0x1998) +ULONG I2TINTLIM_M @0x0814 =4621814(0x004685F6) +INT SFI2T_M @0x0819 =2237(0x08BD) +FIXED CACC @0x02A2 =3.18311(0x00032EE0) +FIXED CSPD @0x02A0 =100(0x00640000) +INT SFTADIN @0x025D =0(0x0000) +INT CADIN @0x025C =375(0x0177) +INT AD2OFF @0x0246 =32760(0x7FF8) +INT AD5OFF @0x0249 =0(0x0000) +INT FILTER1 @0x029D =1598(0x063E) +UINT LEVEL_AD5 @0x086F =0(0x0000) +INT E_LEVEL_AD5 @0x0876 =0(0x0000) +INT GEARMASTER @0x0255 =1(0x0001) +INT GEARSLAVE @0x0256 =1(0x0001) +FIXED GEAR @0x02AC =1(0x00010000) +UINT BRAKELIM @0x028A =32023(0x7D17) +UINT DIGIN_ACTIVE_LEVEL @0x090C =8(0x0008) +UINT DIGIN_INVERSION_MASK @0x090A =57344(0xE000) +UINT DIGOUT_INVERSION_MASK @0x090B =49167(0xC00F) +INT KPSPDEST @0x095C =8000(0x1F40) +INT KISPDEST @0x0953 =100(0x0064) +UINT POSOKLIM @0x036A =1000(0x03E8) +UINT TONPOSOK @0x036B =1(0x0001) %5 +UINT UPGRADE @0x0857 =16315(0x3FBB) +INT LSACTIVE @0x0832 =0(0x0000) +INT FLAGUV @0x02FB =1(0x0001) +INT SSI_isGray @0xC0E3 =0(0x0000) >0(0x0000) <1(0x0001) +ULONG SSI_freq [kHz] @0xC0E4 =2e+003 +INT SSI_isReverseCounting @0xC0E5 =0(0x0000) >0(0x0000) <1(0x0001) +UINT SSI_Offset @0xC0E6 =571(0x023B) <8192(0x2000) +FLOAT SSI_Resolution [m] @0x809A =4.9999999 >0 +FLOAT SSI_Resolution_LD [m] @0x809B =4.9999999 >0 +INT SSI_isGray_LD @0xC0EA =0(0x0000) >0(0x0000) <1(0x0001) +ULONG SSI_freq_LD [kHz] @0xC0EB =2e+003 +INT SSI_isReverseCounting_LD @0xC0EC =0(0x0000) >0(0x0000) <1(0x0001) +INT SMALLTIMEOUT @0xAF28 =0(0x0000) +INT NEW_SII_ELANGLE @0xAF29 =0(0x0000) +UINT SSI_Offset_LD @0xC0ED =571(0x023B) +FLOAT AEI_TransferTime [s] @0x8003 =8 +FLOAT AEI_GuardTime [s] @0x8004 =9.9999997 +FLOAT AEI_ComputeTime [s] @0x8005 =2.4999999e+001 +FLOAT AEI_ReadTime1Mhz [s] @0x8006 =4.9999999e+001 +UINT AEI_CMPTIME @0x02FA =2880(0x0B40) +UINT AEI_CLKDIV @0x0855 =0(0x0000) +UINT AEI_PER @0x0854 =8999(0x2327) +INT SSINRPARAMS @0x0841 =5(0x0005) +INT SSIFDBKTYPE @0x0842 =1(0x0001) +INT SSIREV @0x0843 =13(0x000D) +INT SSITURNS @0x0844 =12(0x000C) +INT SSITYPE @0x0845 =0(0x0000) +INT SSIBR @0x0846 =44(0x002C) +INT SSISENSE @0x02F9 =1(0x0001) +UINT SSI_ST_BITS_IGN @0xAF06 =0(0x0000) +UINT SSI_MT_BITS_IGN @0xAF07 =0(0x0000) +INT SSI_No_Bits_Revolution_Ignore [bits] @0xC0BA =0 >0 <1.3e+001 +INT SSI_No_Bits_Turns_Ignore [bits] @0xC0BB =0 >0 <1.2e+001 +INT SSI_No_Bits_Revolution_LD_Ignore [bits] @0xC0BC =0 >0 <1.3e+001 +INT SSI_No_Bits_Turns_LD_Ignore [bits] @0xC0BD =0 >0 <1.2e+001 +INT SPICLKMODE @0x0847 =2(0x0002) +FLOAT TransmisionRatio @0xC086 =9.999998e-001 >0 <1e+003 +INT isMotorTemperatureSensor @0xC00C =0(0x0000) >0(0x0000) <1(0x0001) +INT Motor_TempSensor_Type @0xC00D =0(0x0000) >0(0x0000) <1(0x0001) +DOUBLE PWM_freq [Hz] @0xC00F =2e+004 >6.15e+002 <1.25e+005 +DOUBLE PWMperiod [s] @0xC012 =5.0000000000000002e-005 +DOUBLE Ts_C [s] @0xC013 =1e-004 +DOUBLE Ts_S [s] @0xC014 =1e-003 +DOUBLE Ts_C_min @0xC0A5 =5e-005 +DOUBLE Ts_S_min @0xC0A6 =5e-004 +INT PosSpd_in_FastLoop @0xC015 =0(0x0000) >0(0x0000) <1(0x0001) +INT isDriveTemperatureSensor @0xC020 =1(0x0001) >0(0x0000) <1(0x0001) +INT isOverVoltage @0xC025 =1(0x0001) >0(0x0000) <1(0x0001) +UINT UMAX_PROT [V ] @0xC026 =5.3e+001 >9.9927e-001 %3 +INT isUnderVoltage @0xC027 =1(0x0001) >0(0x0000) <1(0x0001) +UINT UMIN_PROT [V ] @0xC028 =8.9997 >9.9927e-001 %3 +INT isDriveOverTemp @0xC029 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT Temp_2 [C] @0xC02A =1.0500229e+002 >-1e+002 <9.9999996e+002 %3 +INT isDriveI2t @0xC02B =1(0x0001) >0(0x0000) <1(0x0001) +INT I_I2t_D [A] @0xC02C =1e+001 >8 <2e+001 %4 +UINT t_I2t_D [s] @0xC02D =1.5e+001 >2.048 %5 +INT ControlMode @0xC02F =0(0x0000) >0(0x0000) <2(0x0002) +INT ExternalReference @0xC030 =1(0x0001) >0(0x0000) <1(0x0001) +INT isAutoActivatedAfterPowerOn @0xC031 =0(0x0000) >0(0x0000) <1(0x0001) +INT Axis_ID_list @0xC032 =0(0x0000) >0(0x0000) <511(0x01FF) +INT IlimPS [A] @0xC034 =6 >1.221e-003 <8 %4 +FIXED Kp_C_scl @0xC035 =5.08316(0x0005154A) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_C_scl @0xC036 =0.73317(0x0000BBB1) >0(0x00000000) <16384(0x40000000) %5 +FIXED Kp_C_scl_MANUAL @0xC0AC =0(0x00000000) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_C_scl_MANUAL @0xC0AD =0.79715(0x0000CC12) >0(0x00000000) <16384(0x40000000) %5 +FIXED Kp_C_scl_AT @0xC0AE =0.90973(0x0000E8E4) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_C_scl_AT @0xC0AF =2.62813(0x0002A0CD) >0(0x00000000) <16384(0x40000000) %5 +INT TestCurrent [A] @0xC037 =2 >1.221e-003 <4.3999 %4 +INT TestProtectionCurrent [A] @0xC038 =7.2002 >0 <8 %4 +INT isUseFilterOnCrtCtrlOutput @0xC03A =0(0x0000) >0(0x0000) <1(0x0001) +INT FilterOnCurrentControllerOutput [rad/s ] @0xC03B =5e+003 >0 <5e+003 %4 +INT isCompensateGravitationalLoads @0xC03C =0(0x0000) >0(0x0000) <1(0x0001) +INT OffsetCurrent [A] @0xC03D =0 >-4 <4 +FIXED Kp_S_scl @0xC03E =10.18878(0x000A3054) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_S_scl @0xC03F =0.76419(0x0000C3A2) >0(0x00000000) <16384(0x40000000) %5 +FLOAT IPSatS [%] @0xC040 =4.1005291e+001 >0 <1e+002 %4 +DOUBLE KFFA_scl @0x8017 =0 >0 <4.194304e+006 %5 +INT TestLimitCurrent [A] @0xC042 =6 >0 <8 %4 +FIXED Jload_over_J @0xC04D =0(0x00000000) >0(0x00000000) <100(0x00640000) %4 +FIXED Kp_P_scl @0xC04F =2.29256(0x00024AE5) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_P_scl @0xC050 =0.11462(0x00001D58) >0(0x00000000) <16384(0x40000000) %5 +FIXED Kd_P_scl @0xC051 =15.28319(0x000F487F) >0(0x00000000) <16384(0x40000000) %5 +FIXED filter_D @0xC052 =0.40001(0x00006667) >0(0x00000000) <1(0x00010000) %4 +FLOAT IPSatP [%] @0xC053 =2.000407e+001 >0 <1e+002 %4 +FLOAT Limit_Speed [rad/s] @0xC054 =2.1174334e+003 >0 %6 +FIXED KFFS_scl @0x8018 =0(0x00000000) >0(0x00000000) <16384(0x40000000) %5 +INT isOverCurrent @0xC060 =1(0x0001) >0(0x0000) <1(0x0001) +INT Imax_Prot [A] @0xC061 =7.2002 >1.221e-003 <8 %4 +UINT time_Imax_Prot [s] @0xC062 =1e-002 >1e-003 <3.2767e+001 %5 +INT isPositionControlError @0xC063 =1(0x0001) >0(0x0000) <1(0x0001) +LONG ERR_position [rot] @0xC064 =5e-001 >0 %5 +UINT time_ERR_pos [s] @0xC065 =3 >1e-003 %5 +INT isSpeedControlError @0xC066 =1(0x0001) >0(0x0000) <1(0x0001) +INT ERR_speed [rpm] @0xC067 =1.86e+003 >0 %6 +UINT time_ERR_spd [s] @0xC068 =3 >1e-003 %5 +INT isMotorOverTemp @0xC069 =0(0x0000) >0(0x0000) <1(0x0001) +INT isMotori2t @0xC06A =1(0x0001) >0(0x0000) <1(0x0001) +INT I_I2t_M [A] @0xC06B =6.6001 >4.3999 <8 %4 +UINT t_I2t_M [s] @0xC06C =2.9999e+001 >2.048 %5 +INT isBrakeResistor @0xC06D =0(0x0000) >0(0x0000) <1(0x0001) +UINT Vbrake [V ] @0xC06E =4.9999e+001 >9.9927e-001 <1.023e+002 %3 +INT EnablePolarity @0xC06F =0(0x0000) >0(0x0000) <1(0x0001) +INT LSPPolarity @0xC070 =0(0x0000) >0(0x0000) <1(0x0001) +INT LSNPolarity @0xC071 =0(0x0000) >0(0x0000) <1(0x0001) +LONG DeadBand_Point [V] @0xC07A =0 >0 <5 %5 +LONG DeadBand_Range [V] @0xC07B =0 >0 <5 %5 +INT UseFilter @0xC07C =1(0x0001) >0(0x0000) <1(0x0001) +INT filter [rad/s ] @0xC07D =5e+001 >0 <5e+002 %4 +INT isLimitMaximum @0xC080 =0(0x0000) >0(0x0000) <1(0x0001) +FIXED ErefMaxSpeed [rpm] @0xC081 =3e+003 >0 <9.8301e+005 %6 +FIXED ErefMaxAcceleration [rad/s^2] @0xC082 =1.00000208e+004 >0 <1.02940566e+008 %9 +INT isAnalogueReference @0xC072 =1(0x0001) >0(0x0000) <1(0x0001) +INT DigitalReferenceType @0xC073 =1(0x0001) >0(0x0000) <1(0x0001) +LONG POS_max [rot] @0xC087 =3.75e-001 >0 <1.63835e+001 %9 +LONG POS_min [rot] @0xC088 =0 >-1.63835e+001 <3.75e-001 %9 +INT SPD_max [rpm] @0xC089 =2.022e+004 >0 <2.022e+004 %6 +INT SPD_min [rpm] @0xC08A =0 >-2.022e+004 <2.022e+004 %6 +INT CRT_max [A] @0xC08B =4.5788e-001 >0 <8 %4 +INT CRT_min [A] @0xC08C =0 >-8 <4.5788e-001 %4 +INT TestMaxSpeed [rpm] @0xC090 =1.92e+003 >0 <5.73e+003 %6 +INT EnableDefault @0xC094 =0(0x0000) >0(0x0000) <1(0x0001) +ULONG InputCFG3_0 @0x09CA =403908390(0x18132726) +ULONG InputCFG7_4 @0x09CC =388046904(0x17212038) +ULONG InputCFG11_8 @0x09CE =168364040(0x0A090808) +ULONG InputCFG15_12 @0x09D0 =0(0x00000000) +ULONG OutputCFG3_0 @0x09D2 =2761657238(0xA49B8B96) +ULONG OutputCFG7_4 @0x09D4 =170(0x000000AA) +ULONG OutputCFG11_8 @0x09D6 =0(0x00000000) +ULONG OutputCFG15_12 @0x09D8 =0(0x00000000) +UINT SpecialIOs_position @0x09E9 =34115(0x8543) +ULONG FG_pos_numerator @0x0386 =1(0x00000001) >1(0x00000001) +ULONG FG_pos_divisor @0x0388 =1(0x00000001) >1(0x00000001) +ULONG FG_spd_numerator @0x038A =8192(0x00002000) >1(0x00000001) +ULONG FG_spd_divisor @0x038C =125(0x0000007D) >1(0x00000001) +ULONG FG_acc_numerator @0x038E =1(0x00000001) >1(0x00000001) +ULONG FG_acc_divisor @0x0390 =1000(0x000003E8) >1(0x00000001) +ULONG FG_time_numerator @0x0392 =1(0x00000001) >1(0x00000001) +ULONG FG_time_divisor @0x0394 =1(0x00000001) >1(0x00000001) +UINT CurrentScale @0x09B6 =0(0x0000) +UINT ASR @0x0201 =16386(0x4002) +UINT ASR2 @0x02A7 =974(0x03CE) +LONG SWNEGLS @0x088A =-2147483648(0x80000000) +LONG SWPOSLS @0x088C =2147483647(0x7FFFFFFF) +INT isSWLS @0xC0A0 =0(0x0000) >0(0x0000) <1(0x0001) +LONG Negative_SWLS [rot] @0xC0A1 =-1.07374182e+006 %9 +LONG Positive_SWLS [rot] @0xC0A2 =1.07374182e+006 %9 +INT save_CAN_baudrate @0xC0C0 =0(0x0000) >0(0x0000) <1(0x0001) +INT save_axis_id @0xC0C1 =1(0x0001) >0(0x0000) <1(0x0001) +INT LSS_Active @0x0823 =2(0x0002) >0(0x0000) <255(0x00FF) +INT SpeedForward @0xC0C9 =1(0x0001) +ULONG QUAL_ACT @0x07F0 =134221824(0x08001000) +ULONG QUAL_AQ1 @0x07F2 =304807935(0x122AFFFF) +ULONG QUAL_AQ2 @0x07F4 =143539(0x000230B3) +ULONG QUAL_BCT @0x07F6 =134219784(0x08000808) +ULONG QUAL_BQ1 @0x07F8 =41088(0x0000A080) +ULONG QUAL_BQ2 @0x0918 =0(0x00000000) +UINT QUAL @0x0806 =3(0x0003) +UINT BRAKECFG @0x0286 =5632(0x1600) +UINT BRAKEAPPLYDELAY @0x09F9 =0(0x0000) +UINT BRAKERELEASEDELAY @0x09FA =0(0x0000) +INT isMotorBrake @0xC0C4 =0(0x0000) >0(0x0000) <1(0x0001) +INT MotorBrake_output @0xC0C5 =0(0x0000) +INT MotorBrake_polarity @0xC0C6 =0(0x0000) >0(0x0000) <1(0x0001) +UINT MotorBrake_releasetime [ms] @0xC0C7 =0 +UINT MotorBrake_applytime [ms] @0xC0C8 =0 +INT MotionCompleteType @0xC0F2 =0(0x0000) >0(0x0000) <1(0x0001) +UINT MotionCompleteStabilizeTime [s] @0xC0F3 =1e-003 %5 +INT MotionCompleteSettleBand [rot] @0xC0F4 =5e-001 >0 %5 +INT MotionCompleteDefaultSettings @0x810A =1(0x0001) >0(0x0000) <1(0x0001) +UINT SSITIMEOUT @0x09FF =100(0x0064) +UINT AD2FIL_CFG @0x09DD =32767(0x7FFF) +UINT VARFIL_CFG @0x099C =1000(0x03E8) +UINT VARFIL_ADR @0x099D =560(0x0230) +ULONG UserVar1 @0xBFF8 =0(0x00000000) +ULONG UserVar2 @0xBFFA =0(0x00000000) +ULONG UserVar3 @0xBFFC =0(0x00000000) +ULONG UserVar4 @0xBFFE =0(0x00000000) +UINT ENCPULSES_LIMIT @0xAF19 =1(0x0001) +UINT REV_SPD_AMPL @0xAF24 =32768(0x8000) +INT SPD_EST_BQ_INI @0xAF18 =1(0x0001) +LONG BQSEA1_F @0xAF1A =-1085893905(0xBF4692EF) +LONG BQSEA2_F @0xAF1C =0(0x00000000) +LONG BQSEB0_F @0xAF1E =1038464069(0x3DE5B445) +LONG BQSEB1_F @0xAF20 =1038464069(0x3DE5B445) +LONG BQSEB2_F @0xAF22 =0(0x00000000) +INT BQFilterType1_SPD_EST @0x80C5 =0(0x0000) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ1_SPD_EST @0x80C6 =7.07e-001 >0 +DOUBLE BQFilterF11_SPD_EST [Hz] @0x80C7 =4e+002 >1 <4.999e+003 +DOUBLE BQFilterF21_SPD_EST [Hz] @0x80C8 =4e+002 >1 <4.999e+003 +FLOAT ZeroSpeedTime [s] @0xC0F5 =7.2816699e-001 >0 <2.1474839e+006 +FLOAT MotorSpeedMethodSwitch [rpm] @0xC0F6 =3e+002 +FLOAT SpeedReversalValue [%] @0xC0F7 =5.0000763e+001 +INT GSAutoUpdate @0xC2B3 =1(0x0001) +INT Auto_Default_IsCheckEncCount @0xC0F8 =1(0x0001) >0(0x0000) <1(0x0001) +INT Auto_Default_IsCheckCrtLevel @0xC0F9 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT Auto_Default_CheckCrtLevel [Hz ] @0xC0FA =1.8e+003 >1e+002 <3.0000001e+003 +INT GainScheduling_Edit_Value @0xC2B4 =0(0x0000) +FLOAT FilterMecreslTransmission @0xC0FB =2e+003 +UINT GS_K_POSERR @0xB7DC =13000(0x32C8) +FLOAT GainScheduling_PositionErrorGain @0xC0FC =1.3e+004 +INT Auto_Advanced_SpdIntegralLimit [%] @0xC0FD =4e+001 >0 <1e+002 +INT Auto_Advanced_PosIntegralLimit [%] @0xC0FE =4e+001 >0 <1e+002 +INT Auto_Responsive @0xC301 =3(0x0003) >1(0x0001) <5(0x0005) +INT Auto_Transient @0xC302 =8(0x0008) >0(0x0000) <25(0x0019) +INT Auto_RunStep @0xC303 =0(0x0000) +INT Auto_Bandwidth_Current @0xC304 =723(0x02D3) +FLOAT Auto_Bandwidth_Speed @0xC305 =7.27e+001 +FLOAT Auto_Bandwidth_Position @0xC306 =1.679e+002 +FLOAT Auto_PhaseMargin_Current @0xC307 =7.11e+001 +FLOAT Auto_PhaseMargin_Speed @0xC308 =6.82e+001 +FLOAT Auto_PhaseMargin_Position @0xC309 =3.87e+001 +FLOAT Auto_GainMargin_Current @0xC30A =1.65e+001 +FLOAT Auto_GainMargin_Speed @0xC30B =1.31e+001 +FLOAT Auto_GainMargin_Position @0xC30C =8.5 +INT Auto_IdentifiedPlant @0xC30D =1(0x0001) +INT Auto_PlantType @0xC30E =1(0x0001) +INT Auto_TuneMethod @0xC30F =0(0x0000) +INT Auto_NaturalFrequency @0xC310 =500(0x01F4) +INT Auto_DumpingFactor @0xC311 =10(0x000A) +INT Auto_AuxiliaryPoles @0xC312 =300(0x012C) +INT Auto_TotalInertia @0xC313 =0(0x0000) +INT Auto_GainMargin @0xC314 =0(0x0000) +INT Auto_PhaseMargin @0xC315 =0(0x0000) +INT Auto_OpenLoopBw @0xC316 =0(0x0000) +DOUBLE Auto_Bandwidth [Hz ] @0xC330 =1.8e+003 >1e+002 <5e+003 %6 +INT Auto_Passband [rad/s] @0xC332 =0 +INT Auto_MovementType @0xC320 =2(0x0002) +INT Auto_MovementAbsRel @0xC321 =1(0x0001) +FLOAT Auto_Test_Position [rot] @0xC322 =2 +FLOAT Auto_Test_Speed [rpm] @0xC323 =2.0000001 +FLOAT Auto_Test_Acc [rad/s^2] @0xC324 =1.9999999 +FLOAT Auto_Test_Wait [s] @0xC325 =1 +INT Auto_ReferenceType @0xC326 =0(0x0000) +FLOAT Auto_Ident_MinCrt [A] @0xC327 =2 >4.0000001e-001 <6 %4 +INT Auto_Ident_MaxFreq [Hz] @0xC329 =0 +INT Auto_Ident_NoPoints @0xC32A =1000(0x03E8) >500(0x01F4) <2048(0x0800) +INT Auto_AdvancedPlot @0xC32B =4(0x0004) +INT AT_CrtManual @0xC0A3 =0(0x0000) >0(0x0000) <1(0x0001) +INT AT_CrtLevel @0xC0A4 =1(0x0001) >0(0x0000) <2(0x0002) +FLOAT AT_BwDivHigh @0xC1A5 =4 +FLOAT AT_BwDivMedium @0xC1A6 =5 +FLOAT AT_BwDivLow @0xC0A7 =1e+001 +INT AT_REFSTARTADDR @0x09F6 =0(0x0000) +INT AT_REFMAXPOINTS @0x09F7 =0(0x0000) +INT AT_REFINDX @0x09F4 =0(0x0000) +INT ATR @0x09F5 =0(0x0000) +FLOAT AT_Teta @0xC0B5 =1 +INT CrtTuneSet @0xC0B6 =0(0x0000) >0(0x0000) <1(0x0001) +FLOAT AT_TransferFunction_a @0xC0B7 =2.220446e-016 +FLOAT AT_TransferFunction_b0 @0xC0B8 =2.088287e-027 +FLOAT AT_TransferFunction_b1 @0xC0B9 =2.082689e-027 +UINT GainScheduling_Type @0xC200 =0(0x0000) +FLOAT GainScheduling_SettlingTime [ms] @0xC201 =1e+002 +UINT GS_MEMORY_START @0xC202 =45056(0xB000) +UINT GS_MEMORY_LENGTH @0xC203 =1984(0x07C0) +UINT GS_START_ADDR @0xB7E0 =45056(0xB000) +UINT GS_MAX @0xB7E1 =0(0x0000) +UINT GS_WORDS @0xB7E2 =14(0x000E) +UINT GS_TYPE @0xB7E3 =0(0x0000) +UINT GS_MAN @0xB7E4 =0(0x0000) +UINT GS_TIME @0xB7E5 =100(0x0064) +UINT GS_01 @0xB7E6 =606(0x025E) +UINT GS_02 @0xB7E7 =607(0x025F) +UINT GS_03 @0xB7E8 =608(0x0260) +UINT GS_04 @0xB7E9 =609(0x0261) +UINT GS_05 @0xB7EA =610(0x0262) +UINT GS_06 @0xB7EB =611(0x0263) +UINT GS_07 @0xB7EC =614(0x0266) +UINT GS_08 @0xB7ED =615(0x0267) +UINT GS_09 @0xB7EE =616(0x0268) +UINT GS_10 @0xB7EF =617(0x0269) +UINT GS_11 @0xB7F0 =618(0x026A) +UINT GS_12 @0xB7F1 =620(0x026C) +FLOAT GS_User_Value @0xC204 =3.999329e-002 +FLOAT GS_User_Kpp @0xC205 =2.871246e-001 +FLOAT GS_User_Kip @0xC206 =0 +FLOAT GS_User_Kdp @0xC207 =0 +FLOAT GS_User_Ilimp @0xC208 =1e+001 +FLOAT GS_User_Kps @0xC209 =4.43201e+002 +FLOAT GS_User_Kis @0xC20A =4.204712 +FLOAT GS_User_Ilims @0xC20B =1e+001 +FLOAT GainScheduling_SpeedThreshold [rpm] @0xC20C =0 +FIXED GS_SPD @0xB7CC =0(0x00000000) +INT Auto_Method @0xC32C =2(0x0002) >0(0x0000) <2(0x0002) +INT Auto_LpFilter @0xC32D =1(0x0001) +INT Auto_GsType @0xC32E =0(0x0000) +INT AT_GsType @0xC32F =0(0x0000) +INT AT_GsRow @0xC333 =0(0x0000) +UINT GainScheduling_NoLines @0xC334 =64(0x0040) >2(0x0002) <64(0x0040) +FLOAT GainScheduling_MinValuePos [rot] @0xC335 =0 +FLOAT GainScheduling_MinValueSpd [rpm] @0xC336 =6.0000001 >1.5 <6.09e+003 +FLOAT GainScheduling_MaxValuePos [rot] @0xC337 =1.2e+002 +FLOAT GainScheduling_MaxValueSpd [rpm] @0xC338 =1.8599999e+002 >9.5492966e-001 <1.91323e+004 +UINT GainScheduling_OtherVariable @0xC339 =0(0x0000) +UINT GainScheduling_Edit_FillMode @0xC33A =0(0x0000) +UINT GainScheduling_Edit_Kpp @0xC33B =1(0x0001) +UINT GainScheduling_Edit_Kip @0xC33C =1(0x0001) +UINT GainScheduling_Edit_Kdp @0xC33D =1(0x0001) +UINT GainScheduling_Edit_Ilimp @0xC33E =1(0x0001) +UINT GainScheduling_Edit_Kps @0xC33F =1(0x0001) +UINT GainScheduling_Edit_Kis @0xC340 =1(0x0001) +UINT GainScheduling_Edit_Ilims @0xC341 =1(0x0001) +UINT GainScheduling_Edit_From @0xC342 =0(0x0000) +UINT GainScheduling_Edit_To @0xC343 =0(0x0000) +FLOAT GainScheduling_SpeedTrigger [rpm] @0xC344 =1.199798 +LONG GainScheduling_PositionTrigger [rot] @0xC345 =0 +FLOAT GS_User_Value2 @0xC346 =3.999329e-002 +FLOAT GS_User_Kpp2 @0xC347 =2.871246e-001 +FLOAT GS_User_Kip2 @0xC348 =0 +FLOAT GS_User_Kdp2 @0xC349 =0 +FLOAT GS_User_Ilimp2 @0xC34A =1e+001 +FLOAT GS_User_Kps2 @0xC34B =4.43201e+002 +FLOAT GS_User_Kis2 @0xC34C =4.204712 +FLOAT GS_User_Ilims2 @0xC34D =1e+001 +FLOAT GainScheduling_SpeedTrigger2 [rpm] @0xC34E =1.199798 +LONG GainScheduling_PositionTrigger2 [rot] @0xC34F =0 +UINT GS_TRIG_ADDR @0xB7D6 =692(0x02B4) +FLOAT Auto_Motor_R [Ohms] @0xC238 =2.0541511 >1e-003 <1e+003 %4 +FLOAT Auto_Motor_L [mH] @0xC239 =1.887935 >0 <1e+006 %4 +INT Auto_TuneLpFilter @0xC23A =0(0x0000) +INT Auto_Bandwidth_Sld @0xC23B =3(0x0003) >0(0x0000) <6(0x0006) +INT Auto_Overshoot_Sld @0xC23C =3(0x0003) >1(0x0001) <5(0x0005) +FLOAT Auto_Advanced_Imot [%] @0xC23D =2.5e+001 +FLOAT Auto_Advanced_OvsV0 @0xC23E =2 +FLOAT Auto_Advanced_GmMin @0xC23F =8 +FLOAT Auto_Advanced_PmMin @0xC240 =3e+001 +FLOAT Auto_Advanced_PmMin2L @0xC2AF =3.5e+001 +FLOAT Auto_Test_Pos_PosInc [rot] @0xC241 =1 +FLOAT Auto_Test_Pos_Spd [rpm] @0xC242 =1.2e+003 >-2.022e+004 <2.022e+004 +FLOAT Auto_Test_Pos_Acc [rad/s^2] @0xC243 =1.9999999e+003 +FLOAT Auto_Test_Pos_Wait [ms] @0xC244 =2e+002 +INT Auto_Pos_ReferenceType @0xC245 =3(0x0003) +FLOAT Auto_Test_Spd_PosInc [rot] @0xC246 =6.6283179 +FLOAT Auto_Test_Spd_Spd [rpm] @0xC247 =1.2e+003 >-2.022e+004 <2.022e+004 +FLOAT Auto_Test_Spd_Acc [rad/s^2] @0xC248 =1.9999999e+003 +FLOAT Auto_Test_Spd_Wait [ms] @0xC249 =4e+002 +INT Auto_Spd_ReferenceType @0xC24A =3(0x0003) +FLOAT Auto_Test_Spd_Freq [Hz] @0xC24B =1e+001 +FLOAT Auto_Test_Pos_Freq [Hz] @0xC24C =1e+001 +INT OnlinePlot @0xC24D =1(0x0001) >0(0x0000) <1(0x0001) +INT MultiCycle @0xC24E =1(0x0001) >0(0x0000) <1(0x0001) +INT Auto_Ident_Method @0xC24F =1(0x0001) >0(0x0000) <2(0x0002) +INT Auto_MovementTypeC @0xC250 =0(0x0000) +INT Auto_IsPlotInIU @0xC251 =0(0x0000) +INT R_lbl @0xC252 =0(0x0000) +INT L_lbl @0xC253 =0(0x0000) +FLOAT R_line [Ohms] @0xC254 =8.0000001e-001 >1e-003 <1e+003 +FLOAT L_line [mH] @0xC255 =1.2000001 >0 <1e+006 +FLOAT Auto_Motor_R_line [Ohms] @0xC256 =1.369434 >1e-003 <1e+003 %4 +FLOAT Auto_Motor_L_line [mH] @0xC257 =1.258623 >0 <1e+006 %4 +FLOAT Auto_Dumping @0xC258 =1.15 >7e-001 <2 +FLOAT Auto_Ident_MaxCrt_Crt [A] @0xC328 =4 >4.0000001e-001 <6 %4 +FLOAT Auto_Ident_MaxCrt_Pos [A] @0xC259 =4 >4.0000001e-001 <6 %4 +INT Auto_Tune_Details @0xC25A =0(0x0000) >0(0x0000) <1(0x0001) +UINT TestTime [ms] @0xC25B =1e+001 >5 <2.5e+001 %5 +INT Auto_RefType @0xC25C =0(0x0000) +FLOAT Auto_Test_Pos_Amp [rot] @0xC25D =5e-003 +FLOAT Auto_Test_Spd_Amp [rpm] @0xC25E =3e+002 >-2.022e+004 <2.022e+004 +UINT Auto_Indent_K_Use @0xC260 =0(0x0000) <1(0x0001) +FLOAT Auto_Indent_K [Nm/A] @0xC261 =3.9999999e-002 >0 %6 +DOUBLE Auto_Indent_J [kgm^2 E-7] @0xC262 =5.7632664861262406e+001 >1.0000000000000001e-001 <1e+014 %4 +DOUBLE Auto_Indent_F [Nms/rad] @0xC263 =1.07408187372837e-004 >0 %4 +INT Auto_Indent_IgnoreF @0xC264 =0(0x0000) >0(0x0000) <1(0x0001) +INT Auto_Indent_IncludeDelays @0xC265 =0(0x0000) >0(0x0000) <1(0x0001) +INT Auto_Ident_NoPoints_Pos @0xC266 =1000(0x03E8) >500(0x01F4) <2048(0x0800) +INT Auto_Ident_Method_Pos @0xC267 =0(0x0000) >0(0x0000) <2(0x0002) +INT Auto_Strategy_spd @0xC268 =0(0x0000) +INT Auto_Strategy_pos @0xC269 =2(0x0002) +INT Auto_IdentifiedPlant_spd @0xC26A =1(0x0001) +INT Auto_IdentifiedPlant_pos @0xC26B =1(0x0001) +INT Auto_PlantType_spd @0xC26C =1(0x0001) +INT Auto_PlantType_pos @0xC26D =1(0x0001) +INT Auto_TuneMethod_spd @0xC26F =0(0x0000) +INT Auto_TuneMethod_pos @0xC270 =0(0x0000) +DOUBLE Auto_Bandwidth_spd [Hz ] @0xC271 =3e+001 >3e+001 <4e+002 %6 +DOUBLE Auto_Bandwidth_pos [Hz ] @0xC272 =1.5030000000000001e+002 >3e+001 <4e+002 %6 +DOUBLE Auto_Overshoot_spd [%] @0xC273 =0 >0 <3e+001 +DOUBLE Auto_Overshoot_pos [%] @0xC274 =8 >0 <1e+001 +INT Auto_Responsive_spd @0xC275 =3(0x0003) >1(0x0001) <5(0x0005) +INT Auto_Responsive_pos @0xC276 =3(0x0003) >1(0x0001) <5(0x0005) +INT ModDerivPartLimit @0xC25F =10(0x000A) >2(0x0002) <100(0x0064) +INT ModDerivPartSetBand [Hz] @0xC360 =2.39e+002 >1 %5 +INT ModDerivPart @0x810B =1(0x0001) +INT KDFP2 @0xAF36 =19660(0x4CCC) +FIXED DTHETA0 @0xBE80 =655.36(0x028F5C29) +FIXED DTHETA_INC @0xBE82 =0(0x00000000) +LONG AMPL0 @0xBE84 =10(0x0000000A) +LONG AMPL_INC @0xBE86 =0(0x00000000) +LONG SIN_N @0xBE88 =0(0x00000000) +INT PHASE0 @0xBE8A =16384(0x4000) +INT useAutoTuning @0x8013 =0(0x0000) +FLOAT Auto_Test_Pos_Time [s] @0xC277 =4e-001 +FLOAT Auto_Test_Spd_Time [s] @0xC278 =4e-001 +INT Auto_AdvancedPlotSpd @0xC279 =0(0x0000) +INT Auto_AdvancedPlotPos @0xC28A =0(0x0000) +INT isFeedforwardAcc @0x801D =0(0x0000) >0(0x0000) <1(0x0001) +INT isFeedforwardSpd @0x801E =1(0x0001) >0(0x0000) <1(0x0001) +INT Auto_UseAdvancedSettings @0xC28B =0(0x0000) +INT AutotuningID @0x801C =1(0x0001) +DOUBLE Auto_Advanced_Kpp_max @0xC28C =1 +DOUBLE Auto_Advanced_GSMinSpd [rpm] @0xC28D =6 >1.5 <6.09e+003 +DOUBLE Auto_Advanced_GSMaxSpd [rpm] @0xC28E =1.86e+002 >1.5 <6.09e+003 +DOUBLE Auto_Advanced_GSMinPos [rot] @0xC28F =0 >-1.0737418234999999e+006 <1.0737418234999999e+006 +DOUBLE Auto_Advanced_GSMaxPos [rot] @0xC290 =1 >-1.0737418234999999e+006 <1.0737418234999999e+006 +INT Auto_Default_Ident_NoPoints @0xC291 =1000(0x03E8) >500(0x01F4) <2000(0x07D0) +INT Auto_Default_Ident_NoPoints_c @0xC292 =2048(0x0800) >512(0x0200) <2048(0x0800) +INT Auto_Default_PlantType @0xC293 =1(0x0001) +INT Auto_Default_TuneMethod @0xC294 =0(0x0000) +INT Auto_Default_Ident_NoPoints_Pos @0xC295 =1000(0x03E8) >500(0x01F4) <2000(0x07D0) +INT Auto_Default_Ident_NoPoints_Pos_c @0xC296 =2048(0x0800) >512(0x0200) <2048(0x0800) +INT Auto_Default_PlantType_spd @0xC297 =1(0x0001) +INT Auto_Default_TuneMethod_spd @0xC298 =0(0x0000) +INT Auto_Default_PlantType_pos @0xC299 =1(0x0001) +INT Auto_Default_TuneMethod_pos @0xC29A =0(0x0000) +INT Auto_Default_Strategy_spd @0xC29B =2(0x0002) +INT Auto_Default_Strategy_pos @0xC29C =2(0x0002) +INT Auto_Default_LpFilter @0xC29D =0(0x0000) +INT Auto_Default_GainScheduling_Type @0xC29E =0(0x0000) +DOUBLE Auto_Advanced_CLBwMin [Hz] @0xC29F =9e+001 +DOUBLE Auto_Advanced_SLPLBwMin [Hz] @0xC2A0 =3e+001 +INT Auto_Default_Ident_Method @0xC2A1 =1(0x0001) +INT Auto_Default_Ident_Method_Pos @0xC2A2 =0(0x0000) +INT Auto_Default_Indent_IgnoreF @0xC2A3 =0(0x0000) +INT Auto_Default_Indent_IncludeDelays @0xC2A4 =0(0x0000) +INT Auto_Default_GainScheduling_NoLines @0xC2A5 =64(0x0040) >2(0x0002) <64(0x0040) +DOUBLE Auto_Min_model_freq [Hz] @0xC2A6 =0 +DOUBLE Auto_Max_model_freq [Hz] @0xC2A7 =0 +INT Auto_Hann_window @0xC2A8 =32(0x0020) +DOUBLE Auto_Gain_err @0xC2A9 =1e-001 +DOUBLE Auto_Phase_err @0xC2AA =1 +INT Auto_Ident_NoPoints_Pos_c @0xC2AB =2048(0x0800) >512(0x0200) <2048(0x0800) +INT Auto_Ident_NoPoints_c @0xC2AC =2048(0x0800) +INT Auto_IsDetailedModel @0xC2AD =0(0x0000) +UINT BQ_MASK @0xAF10 =0(0x0000) +DOUBLE Auto_Advanced_PLBwMax [Hz] @0xC2AE =2.5e+002 +DOUBLE Auto_Advanced_SLBwMin [Hz] @0xC2B0 =5e+001 +INT Auto_Advanced_UseWN @0xC2B1 =0(0x0000) +FLOAT Auto_Ident_MaxCrt_Pos_Det [A] @0xC2B2 =4 >4.0000001e-001 <6 %4 +UINT CopenTableAdr @0x07FA =31129(0x7999) +INT SPDREF_BQ_INI @0x080C =1(0x0001) +INT IQREF_BQ_INI @0x080D =0(0x0000) +INT ASPD_BQ_INI @0x09DE =0(0x0000) +LONG BQ1A1_F @0xBF00 =1066552198(0x3F924B86) +LONG BQ1A2_F @0xBF02 =1054036613(0x3ED35285) +LONG BQ1B0_F @0xBF04 =1059295250(0x3F239012) +LONG BQ1B1_F @0xBF06 =1067683860(0x3FA39014) +LONG BQ1B2_F @0xBF08 =1059295252(0x3F239014) +LONG BQ2A1_F @0xBF0C =0(0x00000000) +LONG BQ2A2_F @0xBF0E =0(0x00000000) +LONG BQ2B0_F @0xBF10 =0(0x00000000) +LONG BQ2B1_F @0xBF12 =0(0x00000000) +LONG BQ2B2_F @0xBF14 =0(0x00000000) +LONG BQ3A1_F @0xBF18 =0(0x00000000) +LONG BQ3A2_F @0xBF1A =0(0x00000000) +LONG BQ3B0_F @0xBF1C =0(0x00000000) +LONG BQ3B1_F @0xBF1E =0(0x00000000) +LONG BQ3B2_F @0xBF20 =0(0x00000000) +LONG BQ4A1_F @0xBF24 =0(0x00000000) +LONG BQ4A2_F @0xBF26 =0(0x00000000) +LONG BQ4B0_F @0xBF28 =0(0x00000000) +LONG BQ4B1_F @0xBF2A =0(0x00000000) +LONG BQ4B2_F @0xBF2C =0(0x00000000) +LONG BQ5A1_F @0xBF30 =0(0x00000000) +LONG BQ5A2_F @0xBF32 =0(0x00000000) +LONG BQ5B0_F @0xBF34 =0(0x00000000) +LONG BQ5B1_F @0xBF36 =0(0x00000000) +LONG BQ5B2_F @0xBF38 =0(0x00000000) +LONG BQ6A1_F @0xBF3C =0(0x00000000) +LONG BQ6A2_F @0xBF3E =0(0x00000000) +LONG BQ6B0_F @0xBF40 =0(0x00000000) +LONG BQ6B1_F @0xBF42 =0(0x00000000) +LONG BQ6B2_F @0xBF44 =0(0x00000000) +LONG BQ7A1_F @0xBF48 =0(0x00000000) +LONG BQ7A2_F @0xBF4A =0(0x00000000) +LONG BQ7B0_F @0xBF4C =0(0x00000000) +LONG BQ7B1_F @0xBF4E =0(0x00000000) +LONG BQ7B2_F @0xBF50 =0(0x00000000) +LONG BQ8A1_F @0xBF54 =0(0x00000000) +LONG BQ8A2_F @0xBF56 =0(0x00000000) +LONG BQ8B0_F @0xBF58 =0(0x00000000) +LONG BQ8B1_F @0xBF5A =0(0x00000000) +LONG BQ8B2_F @0xBF5C =0(0x00000000) +LONG BQ9A1_F @0xBF60 =0(0x00000000) +LONG BQ9A2_F @0xBF62 =0(0x00000000) +LONG BQ9B0_F @0xBF64 =0(0x00000000) +LONG BQ9B1_F @0xBF66 =0(0x00000000) +LONG BQ9B2_F @0xBF68 =0(0x00000000) +LONG BQ10A1_F @0xBF6C =0(0x00000000) +LONG BQ10A2_F @0xBF6E =0(0x00000000) +LONG BQ10B0_F @0xBF70 =0(0x00000000) +LONG BQ10B1_F @0xBF72 =0(0x00000000) +LONG BQ10B2_F @0xBF74 =0(0x00000000) +INT BQFilter1 @0x80B9 =1(0x0001) >0(0x0000) <1(0x0001) +INT BQFilterType1 @0x80BA =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ1 @0x80BB =7.07e-001 >0 +DOUBLE BQFilterF11 [Hz] @0x80BC =4e+002 >1 <4.99e+002 +INT BQFilter2 @0x80BD =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType2 @0x80BE =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ2 @0x80BF =7.071e-001 >0 +DOUBLE BQFilterF12 [Hz] @0x80C0 =4.99e+002 >1 <4.99e+002 +INT BQFilter3 @0x80C1 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType3 @0x80C2 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ3 @0x80C3 =7.071e-001 >0 +DOUBLE BQFilterF13 [Hz] @0x80C4 =4.99e+002 >1 <4.99e+002 +INT BQFilterLocation1 @0x80D5 =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation2 @0x80D6 =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation3 @0x80D7 =0(0x0000) >0(0x0000) <2(0x0002) +DOUBLE BQFilterF21 [Hz] @0x80D8 =4e+002 >1 <6.25e+002 +DOUBLE BQFilterF22 [Hz] @0x80D9 =4e+002 >1 <6.25e+002 +DOUBLE BQFilterF23 [Hz] @0x80DA =5e+002 >1 <6.25e+002 +INT BQFilterLocation4 @0x80DB =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation5 @0x80DC =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation6 @0x80DD =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation7 @0x80DE =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation8 @0x80DF =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation9 @0x80E0 =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation10 @0x80E1 =0(0x0000) >0(0x0000) <2(0x0002) +DOUBLE BQFilterF24 [Hz] @0x80E2 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF25 [Hz] @0x80E3 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF26 [Hz] @0x80E4 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF27 [Hz] @0x80E5 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF28 [Hz] @0x80E6 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF29 [Hz] @0x80E7 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF210 [Hz] @0x80E8 =5e+002 >1 <6.25e+002 +INT BQFilter4 @0x80E9 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType4 @0x80EA =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ4 @0x80EB =7.071e-001 >0 +DOUBLE BQFilterF14 [Hz] @0x80EC =4.99e+002 >1 <4.99e+002 +INT BQFilter5 @0x80ED =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType5 @0x80EE =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ5 @0x80EF =7.071e-001 >0 +DOUBLE BQFilterF15 [Hz] @0x80F0 =4.99e+002 >1 <4.99e+002 +INT BQFilter6 @0x80F1 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType6 @0x80F2 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ6 @0x80F3 =7.071e-001 >0 +DOUBLE BQFilterF16 [Hz] @0x80F4 =4.99e+002 >1 <4.99e+002 +INT BQFilter7 @0x80F5 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType7 @0x80F6 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ7 @0x80F7 =7.071e-001 >0 +DOUBLE BQFilterF17 [Hz] @0x80F8 =4.99e+002 >1 <4.99e+002 +INT BQFilter8 @0x80F9 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType8 @0x80FA =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ8 @0x80FB =7.071e-001 >0 +DOUBLE BQFilterF18 [Hz] @0x80FC =4.99e+002 >1 <4.99e+002 +INT BQFilter9 @0x80FD =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType9 @0x80FE =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ9 @0x80FF =7.071e-001 >0 +DOUBLE BQFilterF19 [Hz] @0x8100 =4.99e+002 >1 <4.99e+002 +INT BQFilter10 @0x8101 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType10 @0x8102 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ10 @0x8103 =7.071e-001 >0 +DOUBLE BQFilterF110 [Hz] @0x8104 =4.99e+002 >1 <4.99e+002 +INT SpeedTestReferenceType @0x8009 =2(0x0002) >0(0x0000) <3(0x0003) +INT PositionTestReferenceType @0x800A =0(0x0000) >0(0x0000) <3(0x0003) +ULONG ABSTART_MINMOVE @0x08C8 =0(0x00000000) +INT ABSTART_MINMOVE_PERCENT [%] @0x80A1 =0 >0 <1e+002 +ULONG DTMIN @0x08B0 =1000(0x000003E8) +ULONG DTMAX @0x08B2 =4000(0x00000FA0) +INT UPPS @0x0881 =2(0x0002) +INT MAXCCPS @0x0880 =4(0x0004) +LONG ZEROSPDTLIM @0x08C0 =65535029(0x03E7FC35) +UINT RFOFFSET @0x0999 =2080(0x0820) +UINT RFGAIN @0x099A =34363(0x863B) +UINT POSOKLIM_FC @0x09FC =0(0x0000) +UINT TONPOSOK_FC @0x09FD =65535(0xFFFF) +INT isFreezeControl @0xC0CA =0(0x0000) >0(0x0000) <1(0x0001) +UINT FreezeControl_time [s] @0xC0CB =6.5535e+001 %5 +INT FreezeControl_errband [rot] @0xC0CC =0 >0 %5 +INT InputsPolarityType @0xC0CD =1(0x0001) >0(0x0000) <1(0x0001) +INT isSpeedEstimator @0xC0B0 =0(0x0000) >0(0x0000) <1(0x0001) +UINT COUNTINGDIR_MT @0x0805 =0(0x0000) +INT ReverseCounting_MT @0xC0CF =0(0x0000) >0(0x0000) <1(0x0001) +INT isFilterEnc_MT @0xC0D4 =0(0x0000) >0(0x0000) <1(0x0001) +INT FilterEncValue_MT @0x8084 =0(0x0000) >0(0x0000) <12(0x000C) +INT ReverseCounting_LD @0xC0D5 =0(0x0000) >0(0x0000) <1(0x0001) +INT isFilterEnc_LD @0xC0D6 =0(0x0000) >0(0x0000) <1(0x0001) +INT FilterEncValue_LD @0x8085 =0(0x0000) >0(0x0000) <12(0x000C) +INT COUNTINGDIR_LD @0x0916 =0(0x0000) +INT DigitalReferenceConnector @0xC0D8 =1(0x0001) >0(0x0000) <1(0x0001) +FIXED TRANSMISSION @0x037C =1(0x00010000) +UINT ZAOFF @0x0289 =571(0x023B) +UINT STOERRTIME @0x09F8 =20(0x0014) +UINT HOME_NR_6098 @0x039F =0(0x0000) +LONG HOME_OFFSET_607C @0x0992 =0(0x00000000) +FIXED HOME_HSPD_6099_01 @0x03A4 =1(0x00010000) +FIXED HOME_LSPD_6099_02 @0x03A2 =1(0x00010000) +FIXED HOME_ACC_609A @0x03A6 =0.10001(0x0000199A) +INT HOME_CRT_207B @0x08AC =0(0x0000) +UINT HOME_TIME_207C @0x08AD =0(0x0000) +UINT x6007 @0x09F0 =1(0x0001) +UINT x210A @0x0932 =3(0x0003) +UINT x210C @0xB9F2 =0(0x0000) +INT IsReverseMovementDirection @0xC09F =0(0x0000) >0(0x0000) <1(0x0001) +UINT STO_level_10C @0x0849 =32000(0x7D00) +UINT SYNCONFASTLOOP @0x0948 =0(0x0000) +UINT SLSyncOffset @0x0947 =1000(0x03E8) +FLOAT Limit_Speed_MaxPercent [%] @0xC056 =9e+001 >0 <1e+002 +LONG MINPOSRANGE @0xAF00 =0(0x00000000) +LONG MAXPOSRANGE @0xAF02 =0(0x00000000) +UINT POSRANGEDEF @0xAF04 =0(0x0000) +UINT POSOPTCODE @0xAF05 =0(0x0000) +UINT POLARITY @0xAF0A =0(0x0000) +LONG PosRange_Minimum [rot] @0xC099 =0 +LONG PosRange_Maximum [rot] @0xC09A =5e-004 +INT isPosRange @0xC09B =0(0x0000) >0(0x0000) <1(0x0001) +INT Auto_SkipUQLogging @0xC2FF =0(0x0000) +INT GSFilter @0xC362 =0(0x0000) >0(0x0000) <1(0x0001) +FLOAT GSFilterBW [rad/s ] @0xC363 =3.49979e+002 >6.2831848e+001 <3.141593e+003 %4 +INT GS_Filter @0xAF2F =32767(0x7FFF) +INT I2t_trig @0xC09D =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT TestMinMoveProcent [%] @0xC317 =1e+001 >0 +INT User_KDFP @0xC1AA =13107(0x3333) +INT User_KDFP2 @0xC1AB =19660(0x4CCC) +DOUBLE EnDAT_Ts_C_min @0x8105 =2e-004 +UINT BISS_CRC_5BIT_FDBK1_FDBK2 @0xAF6F =0(0x0000) +INT Biss_CRC_Bits @0xC1B1 =1(0x0001) >0(0x0000) <1(0x0001) +INT Biss_CRC_Bits_LD @0xC1B2 =1(0x0001) >0(0x0000) <1(0x0001) +LONG TSPDA1_F @0xBFDC =-1086718287(0xBF39FEB1) +LONG TSPDB0_F @0xBFDE =1040974494(0x3E0C029E) +LONG TACCA1_F @0xBFE2 =-1086718287(0xBF39FEB1) +LONG TACCB0_F @0xBFE4 =1040974494(0x3E0C029E) +UINT TACCFILTER_OPTION @0xBFEC =0(0x0000) +UINT WAIT_TSPD_0 @0xBFED =0(0x0000) +FIXED TACC_THRESHOLD_POS @0xBFE8 =0(0x00000000) +FIXED TACC_THRESHOLD_NEG @0xBFEA =0(0x00000000) +INT SFTDFFW @0xAF7E =0(0x0000) +INT KFFD @0xAF7F =0(0x0000) +INT isFeedforwardDec @0x8114 =0(0x0000) >0(0x0000) <1(0x0001) +DOUBLE KFFD_scl @0xC111 =0 >0 <4.194304e+006 %5 +UINT ASR3 @0xAF78 =27(0x001B) +INT isLoadMonitorOnly @0xC110 =0(0x0000) >0(0x0000) <1(0x0001) +UINT AUTORUNACTIVE @0xAF73 =0(0x0000) +UINT SI_POSITION_UNIT @0x8024 =203(0x00CB) +UINT SI_VELOCITY_UNIT @0x8025 =186(0x00BA) +UINT SI_ACCELERATION_UNIT @0x8026 =225(0x00E1) +UINT SI_JERK_UNIT @0x8027 =565(0x0235) +ULONG Encoder_increments @0xBAAE =2000(0x000007D0) >1(0x00000001) +ULONG Motor_revolutions @0xBAB0 =1(0x00000001) >1(0x00000001) +ULONG Feed_constant_numerator @0xBAB6 =2000(0x000007D0) >1(0x00000001) +ULONG Feed_constant_divisor @0xBAB8 =1(0x00000001) >1(0x00000001) +ULONG Gear_ratio_numerator @0xBAB2 =1(0x00000001) >1(0x00000001) +ULONG Gear_ratio_divisor @0xBAB4 =1(0x00000001) >1(0x00000001) +ULONG Spd_encoder_numerator @0xBACA =1(0x00000001) >1(0x00000001) +ULONG Spd_encoder_divisor @0xBACC =1(0x00000001) >1(0x00000001) +ULONG Acc_scaling_numerator @0xBAA2 =1(0x00000001) >1(0x00000001) +ULONG Acc_scaling_divisor @0xBAA4 =1(0x00000001) >1(0x00000001) +ULONG Jerk_factor_numerator @0xBAAA =1(0x00000001) >1(0x00000001) +ULONG Jerk_factor_divisor @0xBAAC =1000(0x000003E8) >1(0x00000001) +ULONG Jerk_scaling_numerator @0xBAA6 =1(0x00000001) >1(0x00000001) +ULONG Jerk_scaling_divisor @0xBAA8 =1(0x00000001) >1(0x00000001) +ULONG COFG_o60A8h @0xBABE =11862272(0x00B50100) +ULONG COFG_o60A9h @0xBAC0 =0(0x00000000) +ULONG COFG_o60AAh @0xBAC2 =0(0x00000000) +ULONG COFG_o60ABh @0xBAC4 =0(0x00000000) +UINT COFG_Pos_UD @0x8020 =0(0x0000) +UINT COFG_Spd_UD @0x8021 =0(0x0000) +UINT COFG_Acc_UD @0x8022 =0(0x0000) +UINT COFG_Jrk_UD @0x8023 =0(0x0000) +UINT enable_off @0x0926 =0(0x0000) +FLOAT AnalogInputAD2Range1 [V] @0x8110 =5 >3 <2e+001 +FLOAT AnalogInputAD2Range2 [V] @0x8111 =1e+001 >3 <2e+001 +FLOAT AnalogInputAD5Range1 [V] @0x8112 =5 >3 <2e+001 +FLOAT AnalogInputAD5Range2 [V] @0x8113 =1e+001 >3 <2e+001 +INT UseAnalogInputAD2 @0xC120 =1(0x0001) >0(0x0000) <1(0x0001) +INT UseAnalogInputAD5 @0xC121 =1(0x0001) >0(0x0000) <1(0x0001) +INT SelectAnalogInputAD2Range @0xC122 =0(0x0000) >0(0x0000) <1(0x0001) +INT SelectAnalogInputAD5Range @0xC123 =0(0x0000) >0(0x0000) <1(0x0001) +UINT User_RfOffset @0xC423 =416(0x01A0) +UINT User_RfGain @0xC424 =37050(0x90BA) +INT User_Ad2Off @0xC427 =5(0x0005) +INT isSwitchAD2AD5 @0xC124 =0(0x0000) >0(0x0000) <1(0x0001) +UINT MER_mask @0x0965 =65535(0xFFFF) +LONG ErrProt_SOL_PID @0xAF80 =0(0x00000000) +UINT TonErr_SOL_PID @0xAF82 =0(0x0000) +FIXED MAXMOTORSPEED @0xAF94 =0(0x00000000) +ULONG DRIVE_MAX_CURRENT @0xAF70 =0(0x00000000) +UINT SPDOKLIM @0xAF9A =3(0x0003) +UINT TONSPDOK @0xAF9B =0(0x0000) %5 +INT NEW_FREEZE @0xAF79 =0(0x0000) +INT UQREF_FREEZE @0xAF7A =0(0x0000) +INT UQREF_FREEZE_LIM @0xAF7B =32767(0x7FFF) +UINT POSOKLIMMAX_FC @0xAF83 =0(0x0000) +INT UDREF_FREEZE @0xAF8A =0(0x0000) +LONG ZAOFFL @0xAF98 =0(0x00000000) +UINT DIG_INTCFG @0xAF72 =0(0x0000) +UINT EXT_CHOPPER_CFG @0xAF9D =0(0x0000) +INT isBrakeModule @0xC113 =0(0x0000) >0(0x0000) <1(0x0001) +INT BrakeModule_output @0xC114 =5(0x0005) +INT ECATSPDREFOPTION @0xC115 =0(0x0000) >0(0x0000) <1(0x0001) +INT ECATACCREFOPTION @0xC116 =0(0x0000) >0(0x0000) <3(0x0003) +UINT ECATACCREFFORCETIME [ms] @0xC117 =0 %5 +FIXED ECATACCREFFORCESTART [rpm] @0xC118 =0 %6 +FIXED ECATACCREFFORCEEND [rpm] @0xC119 =0 %6 +FLOAT ECATSPDREFFILTER [Hz] @0x8106 =4e+002 +FLOAT ECATACCREFFILTER [Hz] @0x8107 =4e+002 +INT FREEZECONTROL_STOP_ERRBAND [rot] @0xC1AC =0 >0 %5 +UINT FREEZETYPESELECTION @0xC1AD =0(0x0000) +INT USERQVOLTAGE [V] @0xC1AE =0 +INT USERDVOLTAGE [V] @0xC1AF =0 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg new file mode 100644 index 000000000..e69de29bb diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg new file mode 100644 index 000000000..e69de29bb diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs new file mode 100644 index 0000000000000000000000000000000000000000..0781381c5234fcf643918718fa6306aaf422e741 GIT binary patch literal 5889 zcmeIu0Sy2E48kz(-}DWjfOHPlL<9&BAV7cs0RjXF5FkK+z`DS#5BeiOfB*pkP2d3@ C0ssO4 literal 0 HcmV?d00001 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg new file mode 100644 index 000000000..488f9ca4b --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg @@ -0,0 +1,6732 @@ + Start "home1" disabled + "Free Text" "/* Homing on the negative limit switch and index pulse. Move negative until the negative limit switch is reached. Reverse and stop at the first index pulse after the negative limit switch becomes inactive.*/" + Start "Setting parameters" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Homing_Number_Parity" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Start Moving High Speed" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Limit Switch inactive - move negative for 1,17 and positive for 2,18" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LimitSwitch_Inactive_1" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Wait_LS_transition_1" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_Skip_Waitindex Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_Waitindex" + End + Start "Limit Switch active - reverse and move slowly" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LimitSwitch_Active_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for first index transition(1,2) or stop at limit switch transition(17,18)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_homing_17_or_18 Variable=var_i3 Condition=5" + Start "TSH1_1 Waitindex" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=THS1_1_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "Jumps and Function Calls" "Type=0 Label=THS1_1_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=THS1_1_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "Jumps and Function Calls" "Type=6 Label=THS1_1_Waitindex_onFDBK1" + End + End + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Skip_Waitindex" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active again" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Homing_Number_Parity Variable=var_i2 Condition=3" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=0 Label=TSH1_1_exit_H" + Start "Homing 17 or 18" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_homing_17_or_18" + "Jumps and Function Calls" "Type=1 Label=TSH1_1_Wait_LS_transition_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + End + Start "Restore LSACTIVE and exit homing" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_exit_H" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_exit_H2" + End + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "Jumps and Function Calls" "Type=3" + End + Start "TSH1_1 Wait LS transition 1" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Wait_LS_transition_1" + Start "Find Homing Nr. Parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_Homing_mode_1_LSN_1 Variable=var_i3 Condition=3" + End + Start "Wait LSP to change status" + Start "Read DIGIN_ACTIVE_LEVEL.13 to determine what LSP transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_LSPisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LSPisActiveHigh" + Start "Wait for LSP to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=0" disabled + "Free Text" " // Define event : When the positive limit switch goes high->low\r\n DISLSP;\r\n !LSP;\r\n ENLSP0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LSPisActiveLow" + Start "Wait for LSP to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=1" disabled + "Free Text" " // Define event : When the positive limit switch goes low->high\r\n DISLSP;\r\n !LSP;\r\n ENLSP1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Homing_mode_1_LSN_1" + Start "Wait LSN to change status" + Start "Read DIGIN_ACTIVE_LEVEL.14 to determine what LSN transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_LSNisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LSNisActiveHigh" + Start "Wait for LSN to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=0" disabled + "Free Text" " // Define event : When the negative limit switch goes high->low\r\n DISLSN;\r\n !LSN;\r\n ENLSN0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LSNisActiveLow" + Start "Wait for LSN to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=1" disabled + "Free Text" " // Define event : When the negative limit switch goes low->high\r\n DISLSN;\r\n !LSN;\r\n ENLSN1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + End + Start "Check homing nr parity and reset CPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Homing_Number_Parity" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_Home1_Init_1 Variable=var_i3 Condition=3" + End + Start "Homing Number Is ODD" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Home1_Init_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Neg_Transm_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=3" + End + End + Start "Check_Special_IOs_Status" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_Check_Special_IO_Status" + "Free Text" "/* This function returns var_i2>0 if special_IO_status >0 only for the monitored limit switch. */\r\n" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Determine homing number parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_1_LimitSwitchNegative Variable=var_i3 Condition=3" + End + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_1_LimitSwitchNegative" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=3" + End + End + Start "home2" disabled + "Free Text" "/* Homing on the positive limit switch and index pulse. Move positive until the positive limit switch is reached. Reverse and stop at the first index pulse after the positive limit switch becomes inactive. */" + Start "Setting parameters" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Homing_Number_Parity" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Start Moving High Speed" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Limit Switch inactive - move negative for 1,17 and positive for 2,18" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LimitSwitch_Inactive_1" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Wait_LS_transition_1" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_Skip_Waitindex Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_Waitindex" + End + Start "Limit Switch active - reverse and move slowly" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LimitSwitch_Active_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for first index transition(1,2) or stop at limit switch transition(17,18)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_homing_17_or_18 Variable=var_i3 Condition=5" + Start "TSH1_2 Waitindex" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=THS1_2_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "Jumps and Function Calls" "Type=0 Label=THS1_2_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=THS1_2_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "Jumps and Function Calls" "Type=6 Label=THS1_2_Waitindex_onFDBK1" + End + End + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Skip_Waitindex" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active again" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Homing_Number_Parity Variable=var_i2 Condition=3" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=0 Label=TSH1_2_exit_H" + Start "Homing 17 or 18" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_homing_17_or_18" + "Jumps and Function Calls" "Type=1 Label=TSH1_2_Wait_LS_transition_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + End + Start "Restore LSACTIVE and exit homing" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_exit_H" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_exit_H2" + End + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "Jumps and Function Calls" "Type=3" + End + Start "TSH1_2 Wait LS transition 1" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Wait_LS_transition_1" + Start "Find Homing Nr. Parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_Homing_mode_1_LSN_1 Variable=var_i3 Condition=3" + End + Start "Wait LSP to change status" + Start "Read DIGIN_ACTIVE_LEVEL.13 to determine what LSP transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_LSPisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LSPisActiveHigh" + Start "Wait for LSP to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=0" disabled + "Free Text" " // Define event : When the positive limit switch goes high->low\r\n DISLSP;\r\n !LSP;\r\n ENLSP0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LSPisActiveLow" + Start "Wait for LSP to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=1" disabled + "Free Text" " // Define event : When the positive limit switch goes low->high\r\n DISLSP;\r\n !LSP;\r\n ENLSP1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Homing_mode_1_LSN_1" + Start "Wait LSN to change status" + Start "Read DIGIN_ACTIVE_LEVEL.14 to determine what LSN transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_LSNisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LSNisActiveHigh" + Start "Wait for LSN to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=0" disabled + "Free Text" " // Define event : When the negative limit switch goes high->low\r\n DISLSN;\r\n !LSN;\r\n ENLSN0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LSNisActiveLow" + Start "Wait for LSN to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=1" disabled + "Free Text" " // Define event : When the negative limit switch goes low->high\r\n DISLSN;\r\n !LSN;\r\n ENLSN1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + End + Start "Check homing nr parity and reset CPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Homing_Number_Parity" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_Home1_Init_1 Variable=var_i3 Condition=3" + End + Start "Homing Number Is ODD" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_27_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Home1_Init_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_27_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=6 Label=TSH1_27_Neg_Transm_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=3" + End + End + Start "Check_Special_IOs_Status" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_Check_Special_IO_Status" + "Free Text" "/* This function returns var_i2>0 if special_IO_status >0 only for the monitored limit switch. */\r\n" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Determine homing number parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_2_LimitSwitchNegative Variable=var_i3 Condition=3" + End + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_2_LimitSwitchNegative" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=3" + End + End + Start "home3" disabled + "Free Text" "/* Homing on the positive home switch and index pulse. Initial movement is negative if the home switch is high. Otherwise, initial movement is positive, then movement is reversed after home switch low-high transition. Wait for the home switch high-low transition and stop at the first index pulse. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H3_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H3_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H3_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H3_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H3_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H3_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H3_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H3_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H3_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H3_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H3_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H3_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H3_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H3_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H3_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H3_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H3_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_3_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_3_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H3_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H3_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H3_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H3_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H3_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H3_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_3_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_3_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home4" disabled + "Free Text" "/* Homing on the positive home switch and index pulse. Initial movement is positive if the home switch is low. Otherwise, initial movement is negative, then movement is reversed after home switch high-low transition. Wait for the home switch low-high transition and stop at the first index pulse. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H4_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H4_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H4_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H4_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H4_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H4_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H4_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H4_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H4_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H4_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H4_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H4_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H4_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H4_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H4_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H4_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H4_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_4_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_4_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H4_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H4_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H4_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H4_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H4_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H4_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_4_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_4_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home5" disabled + "Free Text" "/* Homing on the negative home switch and index pulse. Initial movement is positive if the home switch is high. Otherwise, initial movement is negative, then movement is reversed after home switch low-high transition. Wait for the home switch high-low transition and stop at the first index pulse. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H5_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H5_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H5_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H5_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H5_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H5_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H5_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H5_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H5_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H5_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H5_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H5_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H5_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H5_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H5_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H5_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H5_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_5_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_5_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H5_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H5_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H5_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H5_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H5_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H5_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_5_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_5_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home6" disabled + "Free Text" "/* Homing on the negative home switch and index pulse. Initial movement is negative if the home switch is low. Otherwise, initial movement is positive, then movement is reversed after home switch high-low transition. Wait for the home switch low-high transition and stop at the first index pulse. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H6_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H6_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H6_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H6_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H6_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H6_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H6_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H6_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H6_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H6_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H6_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H6_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H6_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H6_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H6_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H6_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H6_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_6_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_6_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H6_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H6_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H6_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H6_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H6_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H6_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_6_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_6_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home7" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is positive if the home switch is low, otherwise is negative. If moving positive, wait for either the home switch low-high transition or the positive limit switch, then reverse movement. While moving negative, wait for the home switch high-low transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H7_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H7_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H7_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_7_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_7_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H7_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H7_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_7_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_7_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home8" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is positive if the home switch is low, otherwise is negative. If moving negative, wait for the home switch high-low transition, then reverse movement. Movement is also reversed if the positive limit switch is reached. While moving positive, wait for the home switch low-high transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=8" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_Hom_Mode_8_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(12,28) or positive(8,24), else home input high move negative(8,24) or negative(12,28)" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(8,24) or positive(12,28) slowly until the home switch transition is reached, position at left" + Start "Move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move positive slowly (8,24) or negative(12,28)" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_WaitIndex" + End + End + Start "Home switch is low, move positive(8,24) or negative(12,28)." + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Move positive(8,24) or negative(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_start" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(12,26) or negative(8,22) slowly without reaching the LSP, position at left of home switch transition" + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_WaitIndex" + End + End + Start "Limit switch active move negative(8,24) or positive (12,28) and after home switch transition move slowly negative(12,28) or positive(8,24)" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_wait_homeswitch" + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(22,26)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H8_THS8_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H8_THS8_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H8_THS8_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H8_THS8_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_8_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_8_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H8_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H8_TSH8_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_8_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_8_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home9" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is positive. Reverse either after the home switch high-low transition or if the positive limit switch is reached. While moving negative, wait for the home switch low-high transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=9" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_Hom_Mode_9_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(9,25) or positive(13,29)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(13,29) or positive(9,25), else home input high move negative(9,25) or negative(13,29)" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(13,29) or positive(9,25) slowly until the home switch transition is reached, position at left" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Reverse slowly " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_WaitIndex" + End + End + Start "Home switch is low, move positive(9,25) or negative(13,29)." + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_positive" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_start" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_start Variable=var_i2 Condition=0" + End + Start "Move positive(13,29) or negative(9,25) without reaching the LS, position at left of home switch transition" + Start "Wait for the home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,23) or \"Wait for home switch\" for(13,27)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=23" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_WaitIndex" + End + End + Start "Move negative and move slowly after home switch transition" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_HomeTrans Variable=var_i3 Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H9_THS9_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H9_THS9_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H9_THS9_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H9_THS9_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_9_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_9_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H9_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H9_TSH9_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_9_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_9_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home10" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is positive. Reverse if the positive limit switch is reached, then reverse once again after home switch low-high transition. While moving positive, wait for the home switch high-low transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H10_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H10_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H10_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_10_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_10_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H10_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H10_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_10_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_10_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home11" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is negative if the home switch is low, otherwise is positive. If moving negative, wait for either the home swith low-high transition or the negative limit switch, then reverse movement. While moving positive, wait of the home switch high-low transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H11_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H11_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H11_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_11_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_11_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H11_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H11_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_11_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_11_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home12" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is negative if the home switch is low, otherwise is positive. If moving positive, wait for the home switch high-low transition, then reverse movement. Movement is also reversed if the negative limit switch is reached. While moving negative, wait for the home switch low-high transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=8" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_Hom_Mode_8_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(12,28) or positive(8,24), else home input high move negative(8,24) or negative(12,28)" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(8,24) or positive(12,28) slowly until the home switch transition is reached, position at left" + Start "Move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move positive slowly (8,24) or negative(12,28)" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_WaitIndex" + End + End + Start "Home switch is low, move positive(8,24) or negative(12,28)." + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Move positive(8,24) or negative(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_start" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(12,26) or negative(8,22) slowly without reaching the LSP, position at left of home switch transition" + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_WaitIndex" + End + End + Start "Limit switch active move negative(8,24) or positive (12,28) and after home switch transition move slowly negative(12,28) or positive(8,24)" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_wait_homeswitch" + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(22,26)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H12_THS8_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H12_THS8_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H12_THS8_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H12_THS8_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_12_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_12_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H12_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H12_TSH8_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_12_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_12_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home13" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is negative. Reverse either after the home switch high-low transition or if the negative limit switch is reached. While moving positive, wait for the home switch low-high transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=9" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_Hom_Mode_9_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(9,25) or positive(13,29)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(13,29) or positive(9,25), else home input high move negative(9,25) or negative(13,29)" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(13,29) or positive(9,25) slowly until the home switch transition is reached, position at left" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Reverse slowly " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_WaitIndex" + End + End + Start "Home switch is low, move positive(9,25) or negative(13,29)." + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_positive" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_start" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_start Variable=var_i2 Condition=0" + End + Start "Move positive(13,29) or negative(9,25) without reaching the LS, position at left of home switch transition" + Start "Wait for the home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,23) or \"Wait for home switch\" for(13,27)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=23" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_WaitIndex" + End + End + Start "Move negative and move slowly after home switch transition" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_HomeTrans Variable=var_i3 Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H13_THS9_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H13_THS9_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H13_THS9_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H13_THS9_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_13_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_13_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H13_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H13_TSH9_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_13_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_13_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home14" disabled + "Free Text" "/* Homing on the home switch and index pulse. Initial movement is negative. Reverse if the negative limit switch is reached, then reverse once again after home switch low-high transition. While moving negative, wait for the home switch high-low transition and stop at the first index pulse. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H14_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H14_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H14_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_14_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_14_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H14_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H14_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_14_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_14_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "" disabled + End + Start "" disabled + End + Start "home17" disabled + "Free Text" "/* Homing without an index pulse. Move negative until the negative limit switch is reached. Reverse and stop at negative limit switch active-inactive transition. */" + Start "Setting parameters" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Homing_Number_Parity" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Start Moving High Speed" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Limit Switch inactive - move negative for 1,17 and positive for 2,18" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LimitSwitch_Inactive_1" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Wait_LS_transition_1" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_Skip_Waitindex Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_Waitindex" + End + Start "Limit Switch active - reverse and move slowly" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LimitSwitch_Active_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for first index transition(1,2) or stop at limit switch transition(17,18)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_homing_17_or_18 Variable=var_i3 Condition=5" + Start "TSH1_17 Waitindex" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=THS1_17_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "Jumps and Function Calls" "Type=0 Label=THS1_17_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=THS1_17_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "Jumps and Function Calls" "Type=6 Label=THS1_17_Waitindex_onFDBK1" + End + End + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Skip_Waitindex" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active again" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Homing_Number_Parity Variable=var_i2 Condition=3" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=0 Label=TSH1_17_exit_H" + Start "Homing 17 or 18" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_homing_17_or_18" + "Jumps and Function Calls" "Type=1 Label=TSH1_17_Wait_LS_transition_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + End + Start "Restore LSACTIVE and exit homing" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_exit_H" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_exit_H2" + End + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "Jumps and Function Calls" "Type=3" + End + Start "TSH1_17 Wait LS transition 1" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Wait_LS_transition_1" + Start "Find Homing Nr. Parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_Homing_mode_1_LSN_1 Variable=var_i3 Condition=3" + End + Start "Wait LSP to change status" + Start "Read DIGIN_ACTIVE_LEVEL.13 to determine what LSP transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_LSPisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LSPisActiveHigh" + Start "Wait for LSP to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=0" disabled + "Free Text" " // Define event : When the positive limit switch goes high->low\r\n DISLSP;\r\n !LSP;\r\n ENLSP0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LSPisActiveLow" + Start "Wait for LSP to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=1" disabled + "Free Text" " // Define event : When the positive limit switch goes low->high\r\n DISLSP;\r\n !LSP;\r\n ENLSP1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Homing_mode_1_LSN_1" + Start "Wait LSN to change status" + Start "Read DIGIN_ACTIVE_LEVEL.14 to determine what LSN transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_LSNisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LSNisActiveHigh" + Start "Wait for LSN to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=0" disabled + "Free Text" " // Define event : When the negative limit switch goes high->low\r\n DISLSN;\r\n !LSN;\r\n ENLSN0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LSNisActiveLow" + Start "Wait for LSN to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=1" disabled + "Free Text" " // Define event : When the negative limit switch goes low->high\r\n DISLSN;\r\n !LSN;\r\n ENLSN1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + End + Start "Check homing nr parity and reset CPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Homing_Number_Parity" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_Home1_Init_1 Variable=var_i3 Condition=3" + End + Start "Homing Number Is ODD" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_177_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Home1_Init_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_177_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=6 Label=TSH1_177_Neg_Transm_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=3" + End + End + Start "Check_Special_IOs_Status" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_Check_Special_IO_Status" + "Free Text" "/* This function returns var_i2>0 if special_IO_status >0 only for the monitored limit switch. */\r\n" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Determine homing number parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_17_LimitSwitchNegative Variable=var_i3 Condition=3" + End + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_17_LimitSwitchNegative" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=3" + End + End + Start "home18" disabled + "Free Text" "/* Homing without an index pulse. Move positive until the positive limit switch is reached. Reverse and stop at positive limit switch active-inactive transition. */" + Start "Setting parameters" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Homing_Number_Parity" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Start Moving High Speed" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + Start "Limit Switch inactive - move negative for 1,17 and positive for 2,18" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LimitSwitch_Inactive_1" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Wait_LS_transition_1" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_Skip_Waitindex Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_Waitindex" + End + Start "Limit Switch active - reverse and move slowly" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LimitSwitch_Active_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for first index transition(1,2) or stop at limit switch transition(17,18)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=17" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_homing_17_or_18 Variable=var_i3 Condition=5" + Start "TSH1_18 Waitindex" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=THS1_18_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "Jumps and Function Calls" "Type=0 Label=THS1_18_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=THS1_18_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "Jumps and Function Calls" "Type=6 Label=THS1_18_Waitindex_onFDBK1" + End + End + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Skip_Waitindex" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "Verify if limit switch is active again" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Check_Special_IO_Status" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Homing_Number_Parity Variable=var_i2 Condition=3" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_LimitSwitch_Active_1 Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=0 Label=TSH1_18_exit_H" + Start "Homing 17 or 18" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_homing_17_or_18" + "Jumps and Function Calls" "Type=1 Label=TSH1_18_Wait_LS_transition_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + End + Start "Restore LSACTIVE and exit homing" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_exit_H" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_exit_H2" + End + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "Jumps and Function Calls" "Type=3" + End + Start "TSH1_18 Wait LS transition 1" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Wait_LS_transition_1" + Start "Find Homing Nr. Parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_Homing_mode_1_LSN_1 Variable=var_i3 Condition=3" + End + Start "Wait LSP to change status" + Start "Read DIGIN_ACTIVE_LEVEL.13 to determine what LSP transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_LSPisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LSPisActiveHigh" + Start "Wait for LSP to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=0" disabled + "Free Text" " // Define event : When the positive limit switch goes high->low\r\n DISLSP;\r\n !LSP;\r\n ENLSP0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LSPisActiveLow" + Start "Wait for LSP to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=2 EvInputLevel=1" disabled + "Free Text" " // Define event : When the positive limit switch goes low->high\r\n DISLSP;\r\n !LSP;\r\n ENLSP1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Homing_mode_1_LSN_1" + Start "Wait LSN to change status" + Start "Read DIGIN_ACTIVE_LEVEL.14 to determine what LSN transition to be expected next" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=DIGIN_ACTIVE_LEVEL" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_LSNisActiveLow Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LSNisActiveHigh" + Start "Wait for LSN to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=0" disabled + "Free Text" " // Define event : When the negative limit switch goes high->low\r\n DISLSN;\r\n !LSN;\r\n ENLSN0;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LSNisActiveLow" + Start "Wait for LSN to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=3 EvInputLevel=1" disabled + "Free Text" " // Define event : When the negative limit switch goes low->high\r\n DISLSN;\r\n !LSN;\r\n ENLSN1;\r\n WAIT!; // Wait until the event occurs" + End + "Jumps and Function Calls" "Type=3" + End + End + Start "Check homing nr parity and reset CPOS" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Homing_Number_Parity" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_Home1_Init_1 Variable=var_i3 Condition=3" + End + Start "Homing Number Is ODD" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_187_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Home1_Init_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_187_Neg_Transm_1 Variable=Transmission Condition=1" + "Jumps and Function Calls" "Type=3" + End + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=6 Label=TSH1_187_Neg_Transm_1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=3" + End + End + Start "Check_Special_IOs_Status" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_Check_Special_IO_Status" + "Free Text" "/* This function returns var_i2>0 if special_IO_status >0 only for the monitored limit switch. */\r\n" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Determine homing number parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH1_18_LimitSwitchNegative Variable=var_i3 Condition=3" + End + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=3" + "Jumps and Function Calls" "Type=6 Label=TSH1_18_LimitSwitchNegative" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=3" + End + End + Start "home19" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is negative if the home switch is high. Otherwise, initial movement is positive, then movement is reversed after home switch low-high transition. Stop at the home switch high-low transition. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H19_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H19_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H19_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H19_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H19_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H19_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H19_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H19_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H19_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H19_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H19_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H19_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H19_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H19_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H19_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H19_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H19_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_19_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_19_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H19_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H19_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H19_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H19_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H19_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H19_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_19_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_19_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home20" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is positive if the home switch is low. Otherwise, initial movement is negative, then movement is reversed after home switch high-low transition. Stop at the home switch low-high transition. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H20_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H20_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H20_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H20_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H20_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H20_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H20_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H20_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H20_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H20_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H20_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H20_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H20_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H20_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H20_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H20_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H20_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_20_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_20_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H20_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H20_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H20_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H20_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H20_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H20_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_20_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_20_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home21" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is positive if the home switch is high. Otherwise, initial movement is negative, then movement is reversed after home switch low-high transition. Stop at home switch high-low transition. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H21_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H21_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H21_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H21_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H21_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H21_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H21_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H21_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H21_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H21_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H21_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H21_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H21_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H21_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H21_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H21_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H21_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_21_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_21_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H21_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H21_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H21_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H21_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H21_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H21_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_21_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_21_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home22" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is negative if the home switch is low. Otherwise, initial movement is positive, then movement is reversed after home switch high-low transition. Stop at the home switch low-high transition. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H22_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H22_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H22_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H22_Homing_Mode_3_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_Start" + "Jumps and Function Calls" "Type=6 Label=H22_Homing_Mode_3_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H22_TSH3_Start" + End + Start "If Home high(3,5,19,21) or low(4,6,20,22) move normal; if home low(3,5,19,21) or high(4,6,20,22) move reverse" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_Home_reverse Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_reverse Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_normal" + "Jumps and Function Calls" "Type=6 Label=H22_THS3_Home_reverse" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_reverse Variable=var_i3 Condition=3" + End + Start "Move normal negative(3,6,19,22) or positive(4,5,20,21) then slow down at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H22_THS3_normal" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H22_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_HomeTrans Variable=var_i3 Condition=5" + Start "Move slowly in the same direction and wait for the first index transition" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + "Jumps and Function Calls" "Type=0 Label=H22_THS3_WaitIndex" + End + End + Start "Move reverse positive(3,6,19,22) or negative(4,5,20,21) then reverse at home switch status change" + "Jumps and Function Calls" "Type=6 Label=H22_THS3_reverse" + Start "Move reverse" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H22_TSH3_Home_change_status" + End + Start "Reverse again at home switch transition and move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=1 Label=H22_TSH3_Home_change_status" + End + Start "Go to \"Wait Index\" for(3,4,5,6) or \"Wait for home switch\" for(19,20,21,22)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=15" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_WaitIndex" + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H22_THS3_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H22_THS3_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H22_THS3_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H22_THS3_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_22_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_22_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home input to change status." + "Jumps and Function Calls" "Type=6 Label=H22_TSH3_Home_change_status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + Start "If Home is low, then go to Home is 0" + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_Homeis0 Variable=var_i2 Condition=0" + End + Start "Wait for Home input to go High - Low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_Home_changed" + "Jumps and Function Calls" "Type=6 Label=H22_TSH3_Homeis0" + Start "Wait forHome input to go Low - High" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + "Jumps and Function Calls" "Type=6 Label=H22_TSH3_Home_changed" + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H22_THS3_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H22_TSH3_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H22_TSH3_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH3_22_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH3_22_exit_H3" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home23" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is positive if the home switch is low, otherwise is negative. If moving positive, wait for either the home switch low-high transition or the positive limit switch, then reverse movement. While moving negative, stop at the home switch high-low transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H23_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H23_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H23_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_23_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_23_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H23_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H23_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_23_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_23_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home24" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is positive if the home switch is low, otherwise is negative. If moving negative, wait for the home switch high-low transition, then reverse movement. Movement is also reversed if the positive limit switch is reached. While moving positive, stop at the home switch low-high transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=8" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_Hom_Mode_8_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(12,28) or positive(8,24), else home input high move negative(8,24) or negative(12,28)" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(8,24) or positive(12,28) slowly until the home switch transition is reached, position at left" + Start "Move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move positive slowly (8,24) or negative(12,28)" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_WaitIndex" + End + End + Start "Home switch is low, move positive(8,24) or negative(12,28)." + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Move positive(8,24) or negative(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_start" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(12,26) or negative(8,22) slowly without reaching the LSP, position at left of home switch transition" + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_WaitIndex" + End + End + Start "Limit switch active move negative(8,24) or positive (12,28) and after home switch transition move slowly negative(12,28) or positive(8,24)" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_wait_homeswitch" + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(22,26)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H24_THS8_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H24_THS8_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H24_THS8_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H24_THS8_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_24_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_24_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H24_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H24_TSH8_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_24_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_24_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home25" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is positive. Reverse either after the home switch high-low transition or if the positive limit switch is reached. While moving negative, stop at the home switch low-high transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=9" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_Hom_Mode_9_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(9,25) or positive(13,29)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(13,29) or positive(9,25), else home input high move negative(9,25) or negative(13,29)" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(13,29) or positive(9,25) slowly until the home switch transition is reached, position at left" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Reverse slowly " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_WaitIndex" + End + End + Start "Home switch is low, move positive(9,25) or negative(13,29)." + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_positive" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_start" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_start Variable=var_i2 Condition=0" + End + Start "Move positive(13,29) or negative(9,25) without reaching the LS, position at left of home switch transition" + Start "Wait for the home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,23) or \"Wait for home switch\" for(13,27)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=23" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_WaitIndex" + End + End + Start "Move negative and move slowly after home switch transition" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_HomeTrans Variable=var_i3 Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H25_THS9_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H25_THS9_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H25_THS9_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H25_THS9_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_25_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_25_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H25_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H25_TSH9_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_25_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_25_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home26" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is positive. Reverse if the positive limit switch is reached, then reverse once again after home switch low-high transition. While moving positive, stop at the home switch high-low transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H26_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H26_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H26_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_26_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_26_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H26_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H26_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_26_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_26_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home27" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is negative if the home switch is low, otherwise is positive. If moving negative, wait for either the home swith low-high transition or the negative limit switch, then reverse movement. While moving positive, stop at the home switch high-low transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H27_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H27_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H27_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_27_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_27_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H27_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H27_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_27_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_27_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home28" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is negative if the home switch is low, otherwise is positive. If moving positive, wait for the home switch high-low transition, then reverse movement. Movement is also reversed if the negative limit switch is reached. While moving negative, stop at the home switch low-high transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=8" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_Hom_Mode_8_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_Hom_Mode_8_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(12,28) or positive(8,24), else home input high move negative(8,24) or negative(12,28)" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(8,24) or positive(12,28) slowly until the home switch transition is reached, position at left" + Start "Move negative(8,24) or positive(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move positive slowly (8,24) or negative(12,28)" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_WaitIndex" + End + End + Start "Home switch is low, move positive(8,24) or negative(12,28)." + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Move positive(8,24) or negative(12,28)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_start" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(12,26) or negative(8,22) slowly without reaching the LSP, position at left of home switch transition" + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(24,28)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_WaitIndex" + End + End + Start "Limit switch active move negative(8,24) or positive (12,28) and after home switch transition move slowly negative(12,28) or positive(8,24)" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_wait_homeswitch" + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(8,12) or \"Wait for home switch\" for(22,26)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=24" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H28_THS8_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H28_THS8_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H28_THS8_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H28_THS8_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_28_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_28_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H28_TSH8_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H28_TSH8_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH8_28_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH8_28_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home29" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is negative. Reverse either after the home switch high-low transition or if the negative limit switch is reached. While moving positive, stop at the home switch low-high transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=9" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=16" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_Hom_Mode_9_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_Hom_Mode_9_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_Start_Homing" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(9,25) or positive(13,29)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(13,29) or positive(9,25), else home input high move negative(9,25) or negative(13,29)" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(13,29) or positive(9,25) slowly until the home switch transition is reached, position at left" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Reverse slowly " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_WaitIndex" + End + End + Start "Home switch is low, move positive(9,25) or negative(13,29)." + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_positive" + Start "Start moving" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_start" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_start Variable=var_i2 Condition=0" + End + Start "Move positive(13,29) or negative(9,25) without reaching the LS, position at left of home switch transition" + Start "Wait for the home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Move slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,23) or \"Wait for home switch\" for(13,27)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=23" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_WaitIndex" + End + End + Start "Move negative and move slowly after home switch transition" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "Go to \"Wait Index\" for(9,25) or \"Wait for home switch\" for(13,29)" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=25" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_HomeTrans Variable=var_i3 Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Motor Commands" "Type=3" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H29_THS9_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H29_THS9_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H29_THS9_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H29_THS9_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_29_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_29_exit_H2" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H29_TSH9_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H29_TSH9_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH9_29_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH9_29_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "home30" disabled + "Free Text" "/* Homing without an index pulse. Initial movement is negative. Reverse if the negative limit switch is reached, then reverse once again after home switch low-high transition. While moving negative, stop at the home switch high-low transition. */" + Start "Save ASR and LSACTIVE value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=lsactive 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=0 Source=0" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=13" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=3" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Hm_Mode_Init Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Start_Homing" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_Hm_Mode_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_Start_Homing Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_Start_Homing" + End + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 1" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_1_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_monitor_LSP_1 Variable=CPOS Condition=2" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_1_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_monitor_LSP_1 Variable=CPOS Condition=1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_verify_LS_1" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_monitor_LSP_1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_verify_LS_1" + End + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_LimSw_Inactive Variable=var_i2 Condition=0" + End + Start "Limit switch active move negative(7,10,23,26) or positive(11,14,27,30)" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_wait_homeswitch" + End + Start "Limit switch is inactive, verify home input status" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_LimSw_Inactive" + Start "Read home input status" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + End + Start "If home input is low then move negative(11,14,27,30) or positive(7,10,23,26), else home input high move negative(11,10, 27,26) or negative(7,14,23,30)" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_positive Variable=var_i2 Condition=0" + End + Start "Home switch is high, move negative(7,14,23,30) or positive(10,11,26,27) slowly until the home switch transition is reached, position at left" + Start "For 10,14,26,30 invert parameter CPOS(move positive(10,11,26,27) or negative(7,14,23,30))" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_noninvert2 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_noninvert2" + End + Start "Start moving slowly" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached (transition high low)" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_WaitIndex" + End + End + Start "Home switch is low, move positive(7,10,23,26) or negative(11,14,27,30)." + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_positive" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + Start "Start moving" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait for home switch to be reached or limit switch become active" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_start" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_skipping" + Start "Reverse_Motion if limit switch active" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_reverse_motion" + "Events" "Stop=0 Wait=1 EvType=1 EvMCType=0 EvMCSetParameters=0" disabled + "Free Text" " !MC;\r\n WAIT!; // Wait until the event occurs" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_wait_homeswitch" + End + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_skipping" + Start "Verify if limit switch is active" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=special_IOs_status" + Start "Monitor only homing specific Limit Switch 2" + Start "If negative transmission" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_2_skipping Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_monitor_LSP_2 Variable=CPOS Condition=1" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_2_skipping" + End + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_monitor_LSP_2 Variable=CPOS Condition=2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_verify_LS_2" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_monitor_LSP_2" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=2000 OR=0" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_verify_LS_2" + End + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_reverse_motion Variable=var_i2 Condition=3" + End + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_EndLimitSwitch" + "I/O" "Type=0 SimpleType=0 Port=0 Variable=var_i2 SetLineType=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_start Variable=var_i2 Condition=0" + End + Start "Home switch reched and limit switch inactive move positive(10,11,26,27) or negative(7,14,23,30) slowly without reaching the LSP, position at left of home switch transition" + Start "For 7,11,23,27 invert parameter CPOS move slowly positive(10,11,26,27) or negative(7,14,23,30) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_noninvert Variable=var_i3 Condition=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_noninvert" + "Motor Commands" "Type=3" + End + Start "Wait for home switch position to be reached" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_WaitIndex" + End + End + Start "Limit switch active move negative(7,10,21,24) or positive (11,14,25,28) and after home switch transition move slowly negative(7,14,21,28) or positive(10,11,24,25)" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_wait_homeswitch" + Start "Wait for the home switch transition low high" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=1" + End + Start "For 10,14,26,30 invert parameter CPOS move slowly negative(7,14,23,30) or positive(10,11,26,27) " + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_noninvert3 Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_noninvert3" + "Motor Commands" "Type=3" + End + Start "Wait for home switch transition high low" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=5 EvInputLevel=0" + End + Start "Go to \"Wait Index\" for(7,10,11,14) or \"Wait for home switch\" for(23,26,27,30)" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=21" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_HomeTrans Variable=var_i3 Condition=5" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_WaitIndex" + End + End + End + End + Start "Wait_Index" + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_WaitIndex" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_THS7_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H30_THS7_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H30_THS7_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H30_THS7_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_30_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_30_exit_H2" + End + Start "Restore ASR and LSACITVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + "Jumps and Function Calls" "Type=3" + End + Start "Wait Home switch transition " + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=APOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CAPPOS Source=TPOS SetVarType=0" + Start "If StepperOpenLoop configuration, CPOS=TPOS" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H30_TSH7_PosTo_HomeTrans Variable=var_i2 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + End + "Jumps and Function Calls" "Type=6 Label=H30_TSH7_PosTo_HomeTrans" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH7_30_exit_H3 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH7_30_exit_H3" + End + Start "Restore ASR and LSACTIVE" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + "A 16-bit Integer" "Type=0 Destination=LSACTIVE SetVarType=2 32BitPart=0 Source=var_lf" + End + End + End + Start "" disabled + End + Start "" disabled + End + Start "home33" disabled + "Free Text" "/* Homing on the index pulse. Move negative and stop at the first index pulse. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H33_Homing_Mode_33_Init Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H33_TSH33_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H33_TSH33_Start" + "Jumps and Function Calls" "Type=6 Label=H33_Homing_Mode_33_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H33_TSH33_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H33_TSH33_Start" + End + Start "Start moving negative(33) or positive(34)" + "A 16-bit Integer" "Type=0 Destination=CSPD SetVarType=0 Source=HOMESPD" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait_Index" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H33_THS33_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H33_THS33_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H33_THS33_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H33_THS33_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "A 16-bit Integer" "Type=0 Destination=CSPD SetVarType=0 Source=HOMESPD" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH33_33_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH33_33_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home34" disabled + "Free Text" "/* Homing on the index pulse. Move positive and stop at the first index pulse. */" + Start "Save ASR value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=asr 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + "Jumps and Function Calls" "Type=0 Label=H34_Homing_Mode_33_Init Variable=var_i3 Condition=3" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H34_TSH33_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=0 Label=H34_TSH33_Start" + "Jumps and Function Calls" "Type=6 Label=H34_Homing_Mode_33_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H34_TSH33_Start Variable=Transmission Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CPOS SetVarType=2" + End + "Jumps and Function Calls" "Type=6 Label=H34_TSH33_Start" + End + Start "Start moving negative(33) or positive(34)" + "A 16-bit Integer" "Type=0 Destination=CSPD SetVarType=0 Source=HOMESPD" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=0" + End + Start "Wait_Index" + Start "Wait for encoder index pulse" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H34_THS33_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H34_THS33_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H34_THS33_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H34_THS33_Waitindex_onFDBK1" + End + End + End + Start "Position motor on encoder index" + "A 16-bit Integer" "Type=0 Destination=CSPD SetVarType=0 Source=HOMESPD" + "Trapezoidal Profiles" "Profile=0 Type=0 Additive=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH33_34_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH33_34_exit_H2" + End + Start "Restore ASR" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=1 Source=var_lf" + End + End + End + Start "home35" disabled + "Free Text" "/* Homing on current position. Set actual position as home position. */" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH35_35_exit_H2 Variable=var_i3 Condition=3" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH35_35_exit_H2" + End + End + Start "" disabled + End + Start "home37" disabled + "Free Text" "/*Home 37(-1) - Move negative until mechanical limit is reached. Reverse and stop at first index pulse after home threshold current is reached over an imposed time. */\r\n/* In case of Stepper Open Loop control + encoder configuration, the homing is based on the position control error set in Setup and the Current threshold time value. */" + Start "Save ASR and TERRMAX value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=PROD Source=ASR 32BitPart=0" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=0 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=PRODH Source=TERRMAX 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters And StartMotion" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=HOMETIME 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=0 Source=0xFFFF" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_HomeCrt_GT0_f Variable=homecrt Condition=5" + "A 16-bit Integer" "Type=0 Destination=HOMECRT SetVarType=0 Source=-HOMECRT" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_HomeCrt_GT0_f" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_NoNeg1_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_Homing_ODD_Init Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_Homing_Mode_37_Init" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_NoNeg1_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_Homing_Mode_37_Init Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_Homing_ODD_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Neg, if not, use Wait Current Neg" + Start "If not stepper use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load use Wait HardStop Poserr Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Negative Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Wait HardStop Poserr Positive" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Positive" + End + End + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_Homing_Mode_37_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Pos, if not, use Wait Current Pos" + Start "If not stepper use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=3" + End + Start "Current config SOL ==> use Wait HardStop Poserr Pos" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Positive" + End + End + End + End + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_waitCurrent_NegMot" + Start "Wait for hardstop NegMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_waitCurrent_PosMot" + Start "Wait for hardstop PosMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_waitPosERR_Negative" + Start "Wait for hardstop POSERR Negative" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_waitPosERR_Positive" + Start "Wait for hardstop POSERR Positive" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + End + Start "Quick STOP ( StopMotion)" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_StopMotion" + Start "If StepperOpenLoop configuration, use quickstop" + Start "If not stepper skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_StopMotion_skip Variable=var_i2 Condition=0" + End + Start "If not SCL skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load skip qick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Qucik Stop and wait" + "A 16-bit Integer" "Type=0 Destination=quickstops SetVarType=0 Source=1" + "Free Text" " !MC; WAIT!; // wait for completion" + End + End + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_StopMotion_skip" + End + Start "Wait for first index transition(37,38) or stop at current position(39,40) - homepos" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=39" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_homing_39_or_40 Variable=var_i3 Condition=5" + Start "Homing 37 or 38" + Start "Reverse Motion" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + End + Start "TSH37 Waitindex" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H37_THS37_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H37_THS37_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H37_THS37_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H37_THS37_Waitindex_onFDBK1" + End + End + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_exit_homing" + End + Start "Homing 39 or 40" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_homing_39_or_40" + Start "Determine homing_nr parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_NoNeg2_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_Homing_ODD2 Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_Homing_nr_even_f" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_NoNeg2_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_Homing_nr_even_f Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_Homing_ODD2" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_MoveAway_f Variable=CPOS Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_MoveAway_f" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_Homing_nr_even_f" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H37_TSH37_MoveAway_f Variable=CPOS Condition=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + End + Start "Move away from limit by absolute value of HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_MoveAway_f" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=1" + End + End + End + Start "Exit homing" + "Jumps and Function Calls" "Type=6 Label=H37_TSH37_exit_homing" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH37_37_exit_H2 Variable=var_i3 Condition=3" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 CPOS=0 Execute=0 WaitForCompletion=0" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH37_37_exit_H2" + End + Start "Restore ASR and TERRMAX" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=0 Source=PROD" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=2 32BitPart=1 Source=PRODH" + End + End + End + Start "home38" disabled + "Free Text" "/*Home 38(-2) - Move positive until mechanical limit is reached. Reverse and stop at first index pulse after home threshold current is reached over an imposed time. */\r\n/* In case of Stepper Open Loop control + encoder configuration, the homing is based on the position control error set in Setup and the Current threshold time value. */" + Start "Save ASR and TERRMAX value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=PROD Source=ASR 32BitPart=0" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=0 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=PRODH Source=TERRMAX 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters And StartMotion" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=HOMETIME 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=0 Source=0xFFFF" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_HomeCrt_GT0_f Variable=homecrt Condition=5" + "A 16-bit Integer" "Type=0 Destination=HOMECRT SetVarType=0 Source=-HOMECRT" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_HomeCrt_GT0_f" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_NoNeg1_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_Homing_ODD_Init Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_Homing_Mode_37_Init" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_NoNeg1_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_Homing_Mode_37_Init Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_Homing_ODD_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Neg, if not, use Wait Current Neg" + Start "If not stepper use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load use Wait HardStop Poserr Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Negative Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Wait HardStop Poserr Positive" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Positive" + End + End + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_Homing_Mode_37_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Pos, if not, use Wait Current Pos" + Start "If not stepper use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=3" + End + Start "Current config SOL ==> use Wait HardStop Poserr Pos" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Positive" + End + End + End + End + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_waitCurrent_NegMot" + Start "Wait for hardstop NegMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_waitCurrent_PosMot" + Start "Wait for hardstop PosMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_waitPosERR_Negative" + Start "Wait for hardstop POSERR Negative" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_waitPosERR_Positive" + Start "Wait for hardstop POSERR Positive" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + End + Start "Quick STOP ( StopMotion)" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_StopMotion" + "A 16-bit Integer" "Type=0 Destination=quickstops SetVarType=0 Source=1" + "Free Text" " !MC; WAIT!; // wait for completion" + Start "If StepperOpenLoop configuration, use quickstop" + Start "If not stepper skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_StopMotion_skip Variable=var_i2 Condition=0" + End + Start "If not SCL skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load skip qick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Qucik Stop and wait" + "A 16-bit Integer" "Type=0 Destination=quickstops SetVarType=0 Source=1" + "Free Text" " !MC; WAIT!; // wait for completion" + End + End + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_StopMotion_skip" + End + Start "Wait for first index transition(37,38) or stop at current position(39,40) - homepos" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=39" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_homing_39_or_40 Variable=var_i3 Condition=5" + Start "Homing 37 or 38" + Start "Reverse Motion" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + End + Start "TSH37 Waitindex" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H38_THS37_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H38_THS37_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H38_THS37_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H38_THS37_Waitindex_onFDBK1" + End + End + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_exit_homing" + End + Start "Homing 39 or 40" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_homing_39_or_40" + Start "Determine homing_nr parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_NoNeg2_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_Homing_ODD2 Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_Homing_nr_even_f" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_NoNeg2_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_Homing_nr_even_f Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_Homing_ODD2" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_MoveAway_f Variable=CPOS Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_MoveAway_f" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_Homing_nr_even_f" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H38_TSH37_MoveAway_f Variable=CPOS Condition=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + End + Start "Move away from limit by absolute value of HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_MoveAway_f" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=1" + End + End + End + Start "Exit homing" + "Jumps and Function Calls" "Type=6 Label=H38_TSH37_exit_homing" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH37_38_exit_H2 Variable=var_i3 Condition=3" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 CPOS=0 Execute=0 WaitForCompletion=0" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH37_38_exit_H2" + End + Start "Restore ASR and TERRMAX" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=0 Source=PROD" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=2 32BitPart=1 Source=PRODH" + End + End + End + Start "home39" disabled + "Free Text" "/*Home 39(-3) - Move negative until mechanical limit is reached. Stop when home threshold current is reached for an imposed time and move away from the limit with the absolute value or Home position variable.*/\r\n/* In case of Stepper Open Loop control + encoder configuration, the homing is based on the position control error set in Setup and the Current threshold time value. */" + Start "Save ASR and TERRMAX value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=PROD Source=ASR 32BitPart=0" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=0 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=PRODH Source=TERRMAX 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters And StartMotion" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=HOMETIME 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=0 Source=0xFFFF" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_HomeCrt_GT0_f Variable=homecrt Condition=5" + "A 16-bit Integer" "Type=0 Destination=HOMECRT SetVarType=0 Source=-HOMECRT" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_HomeCrt_GT0_f" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_NoNeg1_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_Homing_ODD_Init Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_Homing_Mode_37_Init" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_NoNeg1_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_Homing_Mode_37_Init Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_Homing_ODD_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Neg, if not, use Wait Current Neg" + Start "If not stepper use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load use Wait HardStop Poserr Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Negative Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Wait HardStop Poserr Positive" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Positive" + End + End + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_Homing_Mode_37_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Pos, if not, use Wait Current Pos" + Start "If not stepper use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=3" + End + Start "Current config SOL ==> use Wait HardStop Poserr Pos" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Positive" + End + End + End + End + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_waitCurrent_NegMot" + Start "Wait for hardstop NegMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_waitCurrent_PosMot" + Start "Wait for hardstop PosMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_waitPosERR_Negative" + Start "Wait for hardstop POSERR Negative" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_waitPosERR_Positive" + Start "Wait for hardstop POSERR Positive" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + End + Start "Quick STOP ( StopMotion)" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_StopMotion" + Start "If StepperOpenLoop configuration, use quickstop" + Start "If not stepper skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_StopMotion_skip Variable=var_i2 Condition=0" + End + Start "If not SCL skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load skip qick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Qucik Stop and wait" + "A 16-bit Integer" "Type=0 Destination=quickstops SetVarType=0 Source=1" + "Free Text" " !MC; WAIT!; // wait for completion" + End + End + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_StopMotion_skip" + End + Start "Wait for first index transition(37,38) or stop at current position(39,40) - homepos" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=39" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_homing_39_or_40 Variable=var_i3 Condition=5" + Start "Homing 37 or 38" + Start "Reverse Motion" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + End + Start "TSH37 Waitindex" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H39_THS37_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H39_THS37_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H39_THS37_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H39_THS37_Waitindex_onFDBK1" + End + End + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_exit_homing" + End + Start "Homing 39 or 40" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_homing_39_or_40" + Start "Determine homing_nr parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_NoNeg2_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_Homing_ODD2 Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_Homing_nr_even_f" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_NoNeg2_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_Homing_nr_even_f Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_Homing_ODD2" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_MoveAway_f Variable=CPOS Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_MoveAway_f" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_Homing_nr_even_f" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H39_TSH37_MoveAway_f Variable=CPOS Condition=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + End + Start "Move away from limit by absolute value of HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_MoveAway_f" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=1" + End + End + End + Start "Exit homing" + "Jumps and Function Calls" "Type=6 Label=H39_TSH37_exit_homing" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH37_39_exit_H2 Variable=var_i3 Condition=3" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 CPOS=0 Execute=0 WaitForCompletion=0" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH37_39_exit_H2" + End + Start "Restore ASR and TERRMAX" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=0 Source=PROD" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=2 32BitPart=1 Source=PRODH" + End + End + End + Start "home40" disabled + "Free Text" "/*Home 40(-4) - Move positive until mechanical limit is reached. Stop when home threshold current is reached for an imposed time and move away from the limit with the absolute value or Home position variable. */\r\n/* In case of Stepper Open Loop control + encoder configuration, the homing is based on the position control error set in Setup and the Current threshold time value. */" + Start "Save ASR and TERRMAX value in order to disable Software Limit Switches" + "A 32-bit Long or Fixed" "Type=1 Destination=PROD Source=ASR 32BitPart=0" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=0 32BitPart=1" + "A 32-bit Long or Fixed" "Type=1 Destination=PRODH Source=TERRMAX 32BitPart=1" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=4 AND=EFFF OR=0" + End + Start "Setting parameters And StartMotion" + "A 32-bit Long or Fixed" "Type=1 Destination=var_lf Source=HOMETIME 32BitPart=0" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=0 Source=0xFFFF" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_HomeCrt_GT0_f Variable=homecrt Condition=5" + "A 16-bit Integer" "Type=0 Destination=HOMECRT SetVarType=0 Source=-HOMECRT" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_HomeCrt_GT0_f" + Start "Is Homing Number EVEN ?" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_NoNeg1_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_Homing_ODD_Init Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_Homing_Mode_37_Init" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_NoNeg1_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_Homing_Mode_37_Init Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_Homing_ODD_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Neg, if not, use Wait Current Neg" + Start "If not stepper use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_NegMot Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load use Wait HardStop Poserr Neg" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Negative Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Wait HardStop Poserr Positive" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Positive" + End + End + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_Homing_Mode_37_Init" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=1000000000 SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + Start "If StepperOpenLoop configuration, use Wait HardStop Poserr Pos, if not, use Wait Current Pos" + Start "If not stepper use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=0" + End + Start "If not SCL use Wait Current Pos" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_PosMot Variable=var_i2 Condition=3" + End + Start "Current config SOL ==> use Wait HardStop Poserr Pos" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Positive" + End + End + End + End + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_waitCurrent_NegMot" + Start "Wait for hardstop NegMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_NegMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_waitCurrent_PosMot" + Start "Wait for hardstop PosMot" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=HOMECRT" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=IQREF" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitCurrent_PosMot Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_waitPosERR_Negative" + Start "Wait for hardstop POSERR Negative" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=0 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Negative Variable=var_i3 Condition=2" + End + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_StopMotion" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_waitPosERR_Positive" + Start "Wait for hardstop POSERR Positive" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + "Events" "Stop=0 Wait=1 EvType=4 EvSourceType=1 EvSrcVar=var_lf" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ERRMAX" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=POSERR" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_waitPosERR_Positive Variable=var_i3 Condition=2" + End + Start "Quick STOP ( StopMotion)" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_StopMotion" + Start "If StepperOpenLoop configuration, use quickstop" + Start "If not stepper skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=4000 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_StopMotion_skip Variable=var_i2 Condition=0" + End + Start "If not SCL skip quick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "If SOL + enc on load skip qick stop" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=0 Source=OSR" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=3" disabled + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_StopMotion_skip Variable=var_i2 Condition=3" + End + Start "Current config SOL + enc on motor ==> use Qucik Stop and wait" + "A 16-bit Integer" "Type=0 Destination=quickstops SetVarType=0 Source=1" + "Free Text" " !MC; WAIT!; // wait for completion" + End + End + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_StopMotion_skip" + End + Start "Wait for first index transition(37,38) or stop at current position(39,40) - homepos" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "Arithmetic Operations" "Type=1 Operand1=var_i3 Operand2=39" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_homing_39_or_40 Variable=var_i3 Condition=5" + Start "Homing 37 or 38" + Start "Reverse Motion" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-CPOS SetVarType=0" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=0" + End + Start "TSH37 Waitindex" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_Waitindex" + Start "Capture position on index pulse 1 or 2 and put it in CAPPOS variable" + Start "Determine if index pulse is on Feedback\d2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=SCR" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=400 OR=0" + "Jumps and Function Calls" "Type=0 Label=H40_THS37_Waitindex_onFDBK2 Variable=var_i3 Condition=2" + End + Start "Capture the index pulse of Feedback \d1" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=0 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H40_THS37_Waitindex_onFDBK1" + End + Start "Capture the index pulse of Feedback \d2" + "Jumps and Function Calls" "Type=6 Label=H40_THS37_Waitindex_onFDBK2" + "Events" "Stop=0 Wait=1 EvType=6 EvInput=1 EvInputLevel=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=CAPPOS SetVarType=0" + "Jumps and Function Calls" "Type=6 Label=H40_THS37_Waitindex_onFDBK1" + End + End + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=0 StartPoint=0 Execute=0 WaitForCompletion=1" + End + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_exit_homing" + End + Start "Homing 39 or 40" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_homing_39_or_40" + Start "Determine homing_nr parity" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=homing_nr" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1 OR=0" + Start "If negative transmission, reverse position command" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_NoNeg2_Transm Variable=Transmission Condition=5" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_Homing_ODD2 Variable=var_i3 Condition=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_Homing_nr_even_f" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_NoNeg2_Transm" + End + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_Homing_nr_even_f Variable=var_i3 Condition=0" + End + Start "Homing Number Is ODD" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_Homing_ODD2" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_MoveAway_f Variable=CPOS Condition=5" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_MoveAway_f" + End + Start "Homing Number is EVEN" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_Homing_nr_even_f" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=HOMEPOS SetVarType=0" + "Jumps and Function Calls" "Type=0 Label=H40_TSH37_MoveAway_f Variable=CPOS Condition=1" + "A 32-bit Long or Fixed" "Type=0 Destination=CPOS Source=-HOMEPOS SetVarType=0" + End + Start "Move away from limit by absolute value of HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_MoveAway_f" + "A 16-bit Integer" "Type=0 Destination=ASR SetVarType=4 AND=FFFF OR=48" + "A 32-bit Long or Fixed" "Type=0 Destination=CSPD Source=HOMESPD SetVarType=0" + "Trapezoidal Profiles" "Profile=0 Type=1 StartPoint=1 Execute=0 WaitForCompletion=1" + End + End + End + Start "Exit homing" + "Jumps and Function Calls" "Type=6 Label=H40_TSH37_exit_homing" + Start "If ASR2.12 = 1 do not execute SAP HOMEPOS" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=0 Source=ASR2" + "A 16-bit Integer" "Type=0 Destination=var_i3 SetVarType=4 AND=1000 OR=0" + "Jumps and Function Calls" "Type=0 Label=TSH37_40_exit_H2 Variable=var_i3 Condition=3" + "Trapezoidal Profiles" "Profile=0 Type=1 Additive=0 StartPoint=0 CPOS=0 Execute=0 WaitForCompletion=0" + "Motor Commands" "Type=5 SrcVar=HOMEPOS" + "Jumps and Function Calls" "Type=6 Label=TSH37_40_exit_H2" + End + Start "Restore ASR and TERRMAX" + "A 16-bit Integer" "Type=0 Destination=asr SetVarType=2 32BitPart=0 Source=PROD" + "A 16-bit Integer" "Type=0 Destination=TERRMAX SetVarType=2 32BitPart=1 Source=PRODH" + End + End + End diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg new file mode 100644 index 000000000..57c8ca8b3 --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg @@ -0,0 +1,153 @@ + Start "int0" disabled + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09B9" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Jumps and Function Calls" "Type=0 Label=INT0_CANOPEN Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=0 Source=MER" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=4 AND=8000 OR=0" + "Jumps and Function Calls" "Type=0 Label=AXISENABLE Variable=VAR_I1 Condition=0" + "Jumps and Function Calls" "Type=4" + "Jumps and Function Calls" "Type=6 Label=AXISENABLE" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=0 Source=ACR" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=4 AND=2 OR=0" + "Jumps and Function Calls" "Type=0 Label=RESTART Variable=VAR_I1 Condition=3" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=0 Source=ACR" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=4 AND=8 OR=0" + "Jumps and Function Calls" "Type=0 Label=RESTART Variable=VAR_I1 Condition=3" + "Jumps and Function Calls" "Type=4" + "Jumps and Function Calls" "Type=6 Label=RESTART" + "Miscellaneous" "Type=1" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=0 Source=MCR" + "A 16-bit Integer" "Type=0 Destination=VAR_I1 SetVarType=4 AND=1F OR=0" + "Arithmetic Operations" "Type=1 Operand1=VAR_I1 Operand2=4" + "Jumps and Function Calls" "Type=0 Label=REINIT Variable=VAR_I1 Condition=0" + "Arithmetic Operations" "Type=1 Operand1=VAR_I1 Operand2=1" + "Jumps and Function Calls" "Type=0 Label=CALL_AXISON Variable=VAR_I1 Condition=3" + "Jumps and Function Calls" "Type=6 Label=REINIT" + "Free Text" "MODE GS;\r\nUPD;" + "Jumps and Function Calls" "Type=6 Label=CALL_AXISON" + "Motor Commands" "Type=0" + "Jumps and Function Calls" "Type=6 Label=INT0_CANOPEN" + End + Start "int1" disabled + Start "Error Led ON" + "I/O" "Type=0 SimpleType=1 Port=2 SimpleSet=0 SetLineType=0" + End + Start "Ready Led OFF" + "I/O" "Type=0 SimpleType=1 Port=3 SimpleSet=1 SetLineType=0" + End + "Free Text" "/*\r\nDeactivate the control loops and power stage. The motor will stop freely.\r\n\r\nNOTE: Disabling the next instruction will NOT prevent the motor to stop, since the power stage is already hardware disabled in case of a short-circuit condition.\r\n*/" + "Motor Commands" "Type=1" + "Free Text" "/*\r\nTrigger the FAULT status by setting bit 3 of SRL register.\r\nAfter executing this instruction, the drive / motor will enter the FAULT status. This action will also stop the execution of the TML program!\r\n\r\nNOTE: To implement a custom error recovery, you can insert your own error recovery sequence before this line.\r\n*/" + "A 16-bit Integer" "Type=0 Destination=SRL SetVarType=4 AND=FFFF OR=8" + "A 16-bit Integer" "Type=0 Destination=FAULT_REACTION_ACTIVE SetVarType=0 Source=1" + End + Start "int2" disabled + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09B9" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Jumps and Function Calls" "Type=0 Label=INT2_CANOPEN Variable=var_i2 Condition=0" + Start "Error Led ON" + "I/O" "Type=0 SimpleType=1 Port=2 SimpleSet=0 SetLineType=0" + End + Start "Ready Led OFF" + "I/O" "Type=0 SimpleType=1 Port=3 SimpleSet=1 SetLineType=0" + End + "Free Text" "/*\r\nDeactivate the control loops and the power stage. The motor will stop freely.\r\n\r\nWARNING: Disabling the next instruction may damage your drive / motor!\r\n*/" + "Motor Commands" "Type=1" + "Free Text" "/*\r\nTrigger the FAULT status by setting bit 3 of SRL register.\r\nAfter executing this instruction, the drive / motor will enter the FAULT status. This action will also stop the execution of the TML program!\r\n\r\nNOTE: To implement a custom error recovery, you can insert your own error recovery sequence before this line.\r\n*/" + "A 16-bit Integer" "Type=0 Destination=SRL SetVarType=4 AND=FFFF OR=8" + "Jumps and Function Calls" "Type=0 Label=END_SW_PROTECTIONS" + "Jumps and Function Calls" "Type=6 Label=INT2_CANOPEN" + Start "Error Led ON" + "I/O" "Type=0 SimpleType=1 Port=2 SimpleSet=0 SetLineType=0" + End + Start "Ready Led OFF" + "I/O" "Type=0 SimpleType=1 Port=3 SimpleSet=1 SetLineType=0" + End + "A 16-bit Integer" "Type=0 Destination=SRL SetVarType=4 AND=FFFF OR=8" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=PCR" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=4 AND=C100 OR=0" + "Jumps and Function Calls" "Type=0 Label=OTHER_ERRORS Variable=var_i1 Condition=3" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09F1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Arithmetic Operations" "Type=1 Operand1=var_i2 Operand2=2" + "Jumps and Function Calls" "Type=0 Label=INT2_QUICKSTOP Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=6 Label=OTHER_ERRORS" + Start "Error Led ON" + "I/O" "Type=0 SimpleType=1 Port=2 SimpleSet=0 SetLineType=0" + End + Start "Ready Led OFF" + "I/O" "Type=0 SimpleType=1 Port=3 SimpleSet=1 SetLineType=0" + End + "Jumps and Function Calls" "Type=0 Label=END_SW_PROTECTIONS" + "Jumps and Function Calls" "Type=6 Label=INT2_QUICKSTOP" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09E4" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Arithmetic Operations" "Type=1 Operand1=var_i2 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=END_SW_PROTECTIONS Variable=var_i2 Condition=3" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x082F" + "A 16-bit Integer" "Type=1 Destination=var_i1 MemType=0 Source=1 IncPointer=0" + "Free Text" " // Define event : When actual position remains inside a settle band around the position to reach\r\n !MC;\r\n WAIT!; // Wait until the event occurs" + "Motor Commands" "Type=1" + "Jumps and Function Calls" "Type=6 Label=END_SW_PROTECTIONS" + "Motor Commands" "Type=1" + "A 16-bit Integer" "Type=0 Destination=FAULT_REACTION_ACTIVE SetVarType=0 Source=1" + End + Start "int3" disabled + Start "Error Led ON" + "I/O" "Type=0 SimpleType=1 Port=2 SimpleSet=0 SetLineType=0" + End + Start "Ready Led OFF" + "I/O" "Type=0 SimpleType=1 Port=3 SimpleSet=1 SetLineType=0" + End + "Free Text" "/*\r\nDeactivate the control loops and the power stage. The motor will stop freely.\r\n\r\nWARNING: Disabling the next instruction may damage your drive / motor!\r\n*/" + "Motor Commands" "Type=1" + "Free Text" "/*\r\nTrigger the FAULT status by setting bit 3 of SRL register.\r\nAfter executing this instruction, the drive / motor will enter the FAULT status. This action will also stop the execution of the TML program!\r\n\r\nNOTE: To implement a custom error recovery, you can insert your own error recovery sequence before this line.\r\n*/" + "A 16-bit Integer" "Type=0 Destination=SRL SetVarType=4 AND=FFFF OR=8" + "A 16-bit Integer" "Type=0 Destination=FAULT_REACTION_ACTIVE SetVarType=0 Source=1" + End + Start "int4" disabled + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09F1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Arithmetic Operations" "Type=0 Operand1=var_i2 Operand2=1" + "Jumps and Function Calls" "Type=0 Label=INT4_NOTHING Variable=var_i2 Condition=0" + "A 16-bit Integer" "Type=0 Destination=SRL SetVarType=4 AND=FFFF OR=8" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09F1" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Arithmetic Operations" "Type=1 Operand1=var_i2 Operand2=2" + "Jumps and Function Calls" "Type=0 Label=INT4_QUICKSTOP Variable=var_i2 Condition=0" + "Jumps and Function Calls" "Type=0 Label=END_ISR4_NOOPENABLED" + "Jumps and Function Calls" "Type=6 Label=INT4_QUICKSTOP" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x09E4" + "A 16-bit Integer" "Type=0 Destination=var_i2 SetVarType=1 MemType=0 Source=var_i1 IncPointer=0" + "Arithmetic Operations" "Type=1 Operand1=var_i2 Operand2=7" + "Jumps and Function Calls" "Type=0 Label=END_ISR4_NOOPENABLED Variable=var_i2 Condition=3" + "A 16-bit Integer" "Type=0 Destination=var_i1 SetVarType=0 Source=0x082f" + "A 16-bit Integer" "Type=1 Destination=var_i1 MemType=0 Source=1 IncPointer=0" + "Free Text" " // Define event : When actual position remains inside a settle band around the position to reach\r\n !MC;\r\n WAIT!; // Wait until the event occurs" + "Jumps and Function Calls" "Type=6 Label=END_ISR4_NOOPENABLED" + "Motor Commands" "Type=1" + Start "Error Led ON" + "I/O" "Type=0 SimpleType=1 Port=2 SimpleSet=0 SetLineType=0" + End + "A 16-bit Integer" "Type=0 Destination=FAULT_REACTION_ACTIVE SetVarType=0 Source=1" + "Jumps and Function Calls" "Type=6 Label=INT4_NOTHING" + End + Start "int5" disabled + End + Start "int6" disabled + End + Start "int7" disabled + End + Start "int8" disabled + End + Start "int9" disabled + End + Start "int10" disabled + End + Start "int11" disabled + End + Start "int12" disabled + End + Start "int13" disabled + "Free Text" "/* This interrupt requires configuration of the parameter DIG_INTCFG before enabling.\r\n\r\nBit description:\r\n0...3: This value represents the INPUT number (0x0 for IN0, 0x1 for IN1, up to 0xF for IN15)\r\n4...7: Reserved\r\n8 : The interrupt will trigger on the Low-High transition\r\n9 : The interrupt will trigger on the High-Low transition\r\nREMARK: if both bits 8 & 9 are set, the interrupt will trigger on both transitions\r\n10..15: Reserved */\r\n" + End diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs new file mode 100644 index 0000000000000000000000000000000000000000..15efc922cb177097cde596001af652a03c5e86ca GIT binary patch literal 818 zcmb7CK~BRk5L_oELZ}pwcmPL!0hSR6sgWwg0Zvh9O|V32>bRVJ=OuiA6DOX)OW=+a z){c`>FsN8j63H{OJ3AW@*xw+~gSsX#0G6_BD2sxtQ_agB0BjCrKFLP15?aVcg6NxYodpx|4buW`x)i@5WgBUCAJ#>W H!Fm9n<3znO literal 0 HcmV?d00001 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg new file mode 100644 index 000000000..e69de29bb diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg new file mode 100644 index 000000000..878a49eac --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg @@ -0,0 +1,851 @@ +INT MotorSensorConnector @0xC0D0 =0(0x0000) >0(0x0000) <3(0x0003) +INT MotorSensorType @0xC0D1 =1(0x0001) >0(0x0000) <8(0x0008) +INT LoadSensorConnector @0xC0D2 =0(0x0000) >0(0x0000) <3(0x0003) +INT LoadSensorType @0xC0D3 =0(0x0000) >0(0x0000) <8(0x0008) +FLOAT DSP_freq [Hz] @0x8000 =9e+007 >9.9999999e-009 +UINT PWMPER @0x0252 =2250(0x08CA) +INT CLPER @0x0250 =2(0x0002) >1(0x0001) +INT SLPER @0x0251 =20(0x0014) >1(0x0001) +INT PHASEADV @0x0257 =8192(0x2000) +UINT SCIBR_table @0x098D =0(0x0000) +UINT CBR_table @0x0928 =0(0x0000) +UINT PositionControlType @0x806E =0(0x0000) <1(0x0001) +FLOAT AnalogueInputsRange [V] @0x8002 =5 >3 <2e+001 +FLOAT ADCRange [V] @0x80A5 =3.3 >0 <2e+001 +UINT ADCResolution [V] @0x8058 =4.096e+003 +FLOAT VMOT_min [V] @0x804E =1.1e+001 >1 <2e+003 +FLOAT VMOT_max [V] @0x804F =5.2e+001 >1 <2e+003 +FLOAT VLOG_min [V] @0x8050 =8 >1 <2e+003 +FLOAT VLOG_max [V] @0x8051 =4e+001 >1 <2e+003 +FLOAT InPS [A] @0x8053 =8 >1e-003 <2.5e+001 +FLOAT ImaxPS [A] @0x8052 =2e+001 >1e-003 <1e+003 +FLOAT Auto_Default_CheckCrtValue [A] @0xC0FF =3.91e-001 +FLOAT VdcMaxMeasurable [V] @0x8054 =1.023e+002 >1 <2e+003 +FLOAT DriveTempSensorGain [V/C] @0x8056 =9.9999998e-003 +FLOAT DriveTempOutputAt0oC [V] @0x8057 =5e-001 +INT CurrentMeasurementType @0x8001 =1(0x0001) >0(0x0000) <1(0x0001) +INT SSI_No_Bits_Revolution [bits] @0xC0E1 =1.3e+001 >1 <5.6e+001 +INT SSI_No_Bits_Turns [bits] @0xC0E2 =1.2e+001 >0 <5.6e+001 +INT SSI_No_Bits_Revolution_LD [bits] @0xC0E8 =1.3e+001 >1 <5.6e+001 +INT SSI_No_Bits_Turns_LD [bits] @0xC0E9 =1.2e+001 >0 <5.6e+001 +UINT DBT @0x0253 =2827(0x0B0B) +UINT T2MAXPROT @0x0299 =30775(0x7837) +UINT UMAXPROT @0x029A =33945(0x8499) +UINT UMINPROT @0x029B =5764(0x1684) +INT II2TPROT_D @0x0986 =13104(0x3330) +INT SFI2T_D @0x098C =4474(0x117A) +ULONG I2TINTLIM_D @0x0980 =6036849(0x005C1D71) +INT SATPWM @0x0254 =2621(0x0A3D) +FLOAT Vdc [V] @0x8016 =4.8e+001 >1 <9.875e+001 +FLOAT ImaxM [A] @0x8060 =2e+001 >8 <1e+003 +FLOAT In [A] @0x8061 =8 >1e-003 <2e+001 +FLOAT K [Nm/A] @0x8064 =3.9999999e-002 >0 <1e+001 +FLOAT R [Ohms] @0x8065 =2.698 >1e-003 <1e+003 +FLOAT L [mH] @0x8066 =2.1991001 >0 <1e+006 +DOUBLE Jm [kgm^2 E-7] @0x8067 =8e+001 >1.0000000000000001e-001 <1e+014 +INT SINCOS_FRACT @0x08CC =0(0x0000) >0(0x0000) <8(0x0008) +INT SINCOS_fract_LD @0x0917 =0(0x0000) >0(0x0000) <8(0x0008) +INT isMotorInertiaUnknown @0x8068 =0(0x0000) >0(0x0000) <1(0x0001) +LONG No_encoder_lines [lines] @0x806A =5e+002 >1 <1.07374182e+009 %10 +LONG No_encoder_lines_LD [lines] @0x80B2 =5e+002 >2 <1.07374182e+009 %10 +FLOAT Resolution_LD [m] @0x80AA =4.9999999 >0 <3.2000002e+004 +FLOAT Tacho_gain [V/rad/s] @0x80A0 =4.8e-002 >1e-003 <1 +INT MTSTYPE @0x028C =0(0x0000) +LONG MECRESL @0x024E =2000(0x000007D0) +LONG ENC2THL @0x024C =2147484(0x0020C49C) +INT TransmissionType @0x80A6 =0(0x0000) >0(0x0000) <3(0x0003) +FLOAT Motor_transmission [rot] @0x80A7 =1 >-1e+006 <1e+006 +FLOAT Load_transmission [rot] @0x80A8 =1 >-1e+006 <1e+006 +INT AAR_table @0x0913 =0(0x0000) >0(0x0000) <511(0x01FF) +UINT SCR @0x0300 =37120(0x9100) +UINT ICR @0x0304 =31(0x001F) +UINT OSR @0x0302 =25094(0x6206) +UINT PCR @0x0303 =187(0x00BB) +UINT ACR @0x0912 =16640(0x4100) +FLOAT Dump_C @0x8073 =1 >0 <2 +FLOAT PB_C_minim [rad/s ] @0x8074 =1e+003 >1e-003 <1e+007 +FLOAT PB_C_maxim [rad/s ] @0x8075 =4e+003 >1e-003 <1e+007 +FLOAT PB_C [rad/s ] @0x8076 =2e+003 >1e+003 <4e+003 +FLOAT PB_C_AT [Hz ] @0x8077 =2.0000001e+003 >1.591549e-001 <7.9577472e+003 +INT SFTKPI @0x0272 =0(0x0000) +INT KPI @0x0271 =0(0x0000) +INT SFTKII @0x0274 =0(0x0000) +INT KII @0x0273 =0(0x0000) +INT SATID @0x0275 =2621(0x0A3D) +INT SATIQ @0x0276 =2621(0x0A3D) +INT FILTERQ @0x0982 =32767(0x7FFF) +INT FFL @0x0223 =0(0x0000) +INT KFFL @0x026F =32767(0x7FFF) +FLOAT Dump_S @0x800B =1 >0 <2 +FLOAT PB_S_minim [rad/s ] @0x800C =3e+001 >1e-003 <1e+007 +FLOAT PB_S_maxim [rad/s ] @0x800D =4e+002 >9.9999998e-003 <1e+007 +FLOAT PB_S [rad/s ] @0x801A =1.5e+002 >3e+001 <4e+002 +DOUBLE Jt [kgm^2 E-7] @0x807D =2.6400000000000006 >1.0000000000000001e-001 <1e+014 +INT OnlinePlotS @0x8036 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT TestSpeed [rpm] @0x803D =9.6000003e+002 >-2.0219999e+004 <2.0219999e+004 +FLOAT TPS [s] @0x803B =5e-001 >1e-003 <6.5535004e+001 +FLOAT TNS [s] @0x803A =5e-001 >1e-003 <6.5535004e+001 +FLOAT TaPS [s] @0x8039 =1e-001 >1e-003 <6.5535004e+001 +FLOAT TaNS [s] @0x8038 =1e-001 >1e-003 <6.5535004e+001 +INT MultiCycleS @0x8037 =1(0x0001) >0(0x0000) <1(0x0001) +INT SFTKPS @0x0268 =4(0x0004) +INT KPS @0x0267 =20866(0x5182) +INT SFTKIS @0x026A =0(0x0000) +INT KIS @0x0269 =25040(0x61D0) +INT IMAXS @0x026C =19334(0x4B86) >0(0x0000) +INT SATS @0x026B =7(0x0007) >0(0x0000) +FLOAT Dump_P @0x800E =1 >0 <1 +FLOAT PB_P_minim [rad/s ] @0x800F =3e+001 >1e-003 <1e+007 +FLOAT PB_P_maxim [rad/s ] @0x8010 =4e+002 >1e-003 <1e+007 +FLOAT PB_P [rad/s ] @0x801B =1.5e+002 >3e+001 <4e+002 +INT OnlinePlotP @0x8080 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT TestPosition [rot] @0x8047 =2.0000001 >-4.9150503e+003 <4.9150503e+003 +FLOAT TPP [s] @0x804D =2e-001 >1e-003 <6.5535004e+001 +FLOAT TNP [s] @0x804C =2e-001 >1e-003 <6.5535004e+001 +FLOAT TaPP [s] @0x804B =3.0000001e-001 >2.0000001e-003 <6.5535004e+001 +FLOAT TaNP [s] @0x804A =3.0000001e-001 >2.0000001e-003 <6.5535004e+001 +INT MultiCycleP @0x8081 =1(0x0001) >0(0x0000) <1(0x0001) +INT SFTKPP @0x025F =2(0x0002) +INT KPP @0x025E =18780(0x495C) +INT SFTKIP @0x0261 =0(0x0000) +INT KIP @0x0260 =3756(0x0EAC) +INT SFTKDP @0x0263 =4(0x0004) +INT KDP @0x0262 =31299(0x7A43) +INT KDFP @0x0264 =13107(0x3333) +INT IMAXP @0x0266 =26214(0x6666) >0(0x0000) +INT SATP @0x0265 =7(0x0007) >0(0x0000) +INT SFTSFFW @0x0292 =0(0x0000) +INT KFFS @0x026D =0(0x0000) +INT SFTAFFW @0x0291 =0(0x0000) +INT SFTKFF @0x0270 =0(0x0000) +INT KFFA @0x026E =0(0x0000) +INT IMAXPROT @0x0295 =32760(0x7FF8) +UINT TIMAXPROT @0x02C4 =10(0x000A) +INT ERRMAX @0x02C5 =1000(0x03E8) +LONG ERRMAXL @0x09E0 =1000(0x000003E8) +UINT TERRMAX @0x02C6 =3000(0x0BB8) %5 +INT SERRMAX @0x0879 =62(0x003E) +UINT TSERRMAX @0x087A =3000(0x0BB8) +UINT T1MAXPROT @0x0298 =32767(0x7FFF) +INT II2TPROT_M @0x0818 =13104(0x3330) +ULONG I2TINTLIM_M @0x0814 =56343924(0x035BBD74) +INT SFI2T_M @0x0819 =2237(0x08BD) +FIXED CACC @0x02A2 =3.18311(0x00032EE0) +FIXED CSPD @0x02A0 =100(0x00640000) +INT SFTADIN @0x025D =0(0x0000) +INT CADIN @0x025C =375(0x0177) +INT AD2OFF @0x0246 =32760(0x7FF8) +INT AD5OFF @0x0249 =0(0x0000) +INT FILTER1 @0x029D =1598(0x063E) +UINT LEVEL_AD5 @0x086F =0(0x0000) +INT E_LEVEL_AD5 @0x0876 =0(0x0000) +INT GEARMASTER @0x0255 =1(0x0001) +INT GEARSLAVE @0x0256 =1(0x0001) +FIXED GEAR @0x02AC =1(0x00010000) +UINT BRAKELIM @0x028A =32023(0x7D17) +UINT DIGIN_ACTIVE_LEVEL @0x090C =8(0x0008) +UINT DIGIN_INVERSION_MASK @0x090A =57344(0xE000) +UINT DIGOUT_INVERSION_MASK @0x090B =49167(0xC00F) +INT KPSPDEST @0x095C =8000(0x1F40) +INT KISPDEST @0x0953 =100(0x0064) +UINT POSOKLIM @0x036A =1000(0x03E8) +UINT TONPOSOK @0x036B =1(0x0001) %5 +UINT UPGRADE @0x0857 =16315(0x3FBB) +INT LSACTIVE @0x0832 =0(0x0000) +INT FLAGUV @0x02FB =1(0x0001) +INT SSI_isGray @0xC0E3 =0(0x0000) >0(0x0000) <1(0x0001) +ULONG SSI_freq [kHz] @0xC0E4 =2e+003 +INT SSI_isReverseCounting @0xC0E5 =0(0x0000) >0(0x0000) <1(0x0001) +UINT SSI_Offset @0xC0E6 =571(0x023B) <8192(0x2000) +FLOAT SSI_Resolution [m] @0x809A =4.9999999 >0 +FLOAT SSI_Resolution_LD [m] @0x809B =4.9999999 >0 +INT SSI_isGray_LD @0xC0EA =0(0x0000) >0(0x0000) <1(0x0001) +ULONG SSI_freq_LD [kHz] @0xC0EB =2e+003 +INT SSI_isReverseCounting_LD @0xC0EC =0(0x0000) >0(0x0000) <1(0x0001) +INT SMALLTIMEOUT @0xAF28 =0(0x0000) +INT NEW_SII_ELANGLE @0xAF29 =0(0x0000) +UINT SSI_Offset_LD @0xC0ED =571(0x023B) +FLOAT AEI_TransferTime [s] @0x8003 =8 +FLOAT AEI_GuardTime [s] @0x8004 =9.9999997 +FLOAT AEI_ComputeTime [s] @0x8005 =2.4999999e+001 +FLOAT AEI_ReadTime1Mhz [s] @0x8006 =4.9999999e+001 +UINT AEI_CMPTIME @0x02FA =2880(0x0B40) +UINT AEI_CLKDIV @0x0855 =0(0x0000) +UINT AEI_PER @0x0854 =8999(0x2327) +INT SSINRPARAMS @0x0841 =5(0x0005) +INT SSIFDBKTYPE @0x0842 =1(0x0001) +INT SSIREV @0x0843 =13(0x000D) +INT SSITURNS @0x0844 =12(0x000C) +INT SSITYPE @0x0845 =0(0x0000) +INT SSIBR @0x0846 =44(0x002C) +INT SSISENSE @0x02F9 =1(0x0001) +UINT SSI_ST_BITS_IGN @0xAF06 =0(0x0000) +UINT SSI_MT_BITS_IGN @0xAF07 =0(0x0000) +INT SSI_No_Bits_Revolution_Ignore [bits] @0xC0BA =0 >0 <1.3e+001 +INT SSI_No_Bits_Turns_Ignore [bits] @0xC0BB =0 >0 <1.2e+001 +INT SSI_No_Bits_Revolution_LD_Ignore [bits] @0xC0BC =0 >0 <1.3e+001 +INT SSI_No_Bits_Turns_LD_Ignore [bits] @0xC0BD =0 >0 <1.2e+001 +INT SPICLKMODE @0x0847 =2(0x0002) +FLOAT TransmisionRatio @0xC086 =9.999998e-001 >0 <1e+003 +INT isMotorTemperatureSensor @0xC00C =0(0x0000) >0(0x0000) <1(0x0001) +INT Motor_TempSensor_Type @0xC00D =0(0x0000) >0(0x0000) <1(0x0001) +DOUBLE PWM_freq [Hz] @0xC00F =2e+004 >6.15e+002 <1.25e+005 +DOUBLE PWMperiod [s] @0xC012 =5.0000000000000002e-005 +DOUBLE Ts_C [s] @0xC013 =1e-004 +DOUBLE Ts_S [s] @0xC014 =1e-003 +DOUBLE Ts_C_min @0xC0A5 =5e-005 +DOUBLE Ts_S_min @0xC0A6 =5e-004 +INT PosSpd_in_FastLoop @0xC015 =0(0x0000) >0(0x0000) <1(0x0001) +INT isDriveTemperatureSensor @0xC020 =1(0x0001) >0(0x0000) <1(0x0001) +INT isOverVoltage @0xC025 =1(0x0001) >0(0x0000) <1(0x0001) +UINT UMAX_PROT [V ] @0xC026 =5.3e+001 >9.9927e-001 %3 +INT isUnderVoltage @0xC027 =1(0x0001) >0(0x0000) <1(0x0001) +UINT UMIN_PROT [V ] @0xC028 =8.9997 >9.9927e-001 %3 +INT isDriveOverTemp @0xC029 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT Temp_2 [C] @0xC02A =1.0500229e+002 >-1e+002 <9.9999996e+002 %3 +INT isDriveI2t @0xC02B =1(0x0001) >0(0x0000) <1(0x0001) +INT I_I2t_D [A] @0xC02C =1e+001 >8 <2e+001 %4 +UINT t_I2t_D [s] @0xC02D =1.5e+001 >2.048 %5 +INT ControlMode @0xC02F =2(0x0002) >0(0x0000) <2(0x0002) +INT ExternalReference @0xC030 =0(0x0000) >0(0x0000) <1(0x0001) +INT isAutoActivatedAfterPowerOn @0xC031 =0(0x0000) >0(0x0000) <1(0x0001) +INT Axis_ID_list @0xC032 =0(0x0000) >0(0x0000) <511(0x01FF) +INT IlimPS [A] @0xC034 =2e+001 >1.221e-003 <2e+001 %4 +FIXED Kp_C_scl @0xC035 =0(0x00000000) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_C_scl @0xC036 =0(0x00000000) >0(0x00000000) <16384(0x40000000) %5 +FIXED Kp_C_scl_MANUAL @0xC0AC =0(0x00000000) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_C_scl_MANUAL @0xC0AD =0.79715(0x0000CC12) >0(0x00000000) <16384(0x40000000) %5 +FIXED Kp_C_scl_AT @0xC0AE =0.90973(0x0000E8E4) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_C_scl_AT @0xC0AF =2.62813(0x0002A0CD) >0(0x00000000) <16384(0x40000000) %5 +INT TestCurrent [A] @0xC037 =4 >1.221e-003 <8.7998 %4 +INT TestProtectionCurrent [A] @0xC038 =2e+001 >0 <2e+001 %4 +INT isUseFilterOnCrtCtrlOutput @0xC03A =0(0x0000) >0(0x0000) <1(0x0001) +INT FilterOnCurrentControllerOutput [rad/s ] @0xC03B =5e+003 >0 <5e+003 %4 +INT isCompensateGravitationalLoads @0xC03C =0(0x0000) >0(0x0000) <1(0x0001) +INT OffsetCurrent [A] @0xC03D =0 >-8 <8 +FIXED Kp_S_scl @0xC03E =10.18878(0x000A3054) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_S_scl @0xC03F =0.76419(0x0000C3A2) >0(0x00000000) <16384(0x40000000) %5 +FLOAT IPSatS [%] @0xC040 =4.1004272e+001 >0 <1e+002 %4 +DOUBLE KFFA_scl @0x8017 =0 >0 <4.194304e+006 %5 +INT TestLimitCurrent [A] @0xC042 =2e+001 >0 <2e+001 %4 +FIXED Jload_over_J @0xC04D =0(0x00000000) >0(0x00000000) <100(0x00640000) %4 +FIXED Kp_P_scl @0xC04F =2.29256(0x00024AE5) >0(0x00000000) <16384(0x40000000) %5 +FIXED Ki_P_scl @0xC050 =0.11462(0x00001D58) >0(0x00000000) <16384(0x40000000) %5 +FIXED Kd_P_scl @0xC051 =15.28319(0x000F487F) >0(0x00000000) <16384(0x40000000) %5 +FIXED filter_D @0xC052 =0.40001(0x00006667) >0(0x00000000) <1(0x00010000) %4 +FLOAT IPSatP [%] @0xC053 =2.000407e+001 >0 <1e+002 %4 +FLOAT Limit_Speed [rad/s] @0xC054 =2.1174334e+003 >0 %6 +FIXED KFFS_scl @0x8018 =0(0x00000000) >0(0x00000000) <16384(0x40000000) %5 +INT isOverCurrent @0xC060 =1(0x0001) >0(0x0000) <1(0x0001) +INT Imax_Prot [A] @0xC061 =2e+001 >1.221e-003 <2e+001 %4 +UINT time_Imax_Prot [s] @0xC062 =1e-002 >1e-003 <3.2767e+001 %5 +INT isPositionControlError @0xC063 =1(0x0001) >0(0x0000) <1(0x0001) +LONG ERR_position [rot] @0xC064 =5e-001 >0 %5 +UINT time_ERR_pos [s] @0xC065 =3 >1e-003 %5 +INT isSpeedControlError @0xC066 =1(0x0001) >0(0x0000) <1(0x0001) +INT ERR_speed [rpm] @0xC067 =1.86e+003 >0 %6 +UINT time_ERR_spd [s] @0xC068 =3 >1e-003 %5 +INT isMotorOverTemp @0xC069 =0(0x0000) >0(0x0000) <1(0x0001) +INT isMotori2t @0xC06A =1(0x0001) >0(0x0000) <1(0x0001) +INT I_I2t_M [A] @0xC06B =2e+001 >8.7998 <2e+001 %4 +UINT t_I2t_M [s] @0xC06C =2.9999e+001 >2.048 %5 +INT isBrakeResistor @0xC06D =1(0x0001) >0(0x0000) <1(0x0001) +UINT Vbrake [V ] @0xC06E =4.9999e+001 >9.9927e-001 <1.023e+002 %3 +INT EnablePolarity @0xC06F =0(0x0000) >0(0x0000) <1(0x0001) +INT LSPPolarity @0xC070 =0(0x0000) >0(0x0000) <1(0x0001) +INT LSNPolarity @0xC071 =0(0x0000) >0(0x0000) <1(0x0001) +LONG DeadBand_Point [V] @0xC07A =0 >0 <5 %5 +LONG DeadBand_Range [V] @0xC07B =0 >0 <5 %5 +INT UseFilter @0xC07C =1(0x0001) >0(0x0000) <1(0x0001) +INT filter [rad/s ] @0xC07D =5e+001 >0 <5e+002 %4 +INT isLimitMaximum @0xC080 =0(0x0000) >0(0x0000) <1(0x0001) +FIXED ErefMaxSpeed [rpm] @0xC081 =3e+003 >0 <9.8301e+005 %6 +FIXED ErefMaxAcceleration [rad/s^2] @0xC082 =1.00000208e+004 >0 <1.02940566e+008 %9 +INT isAnalogueReference @0xC072 =0(0x0000) >0(0x0000) <1(0x0001) +INT DigitalReferenceType @0xC073 =1(0x0001) >0(0x0000) <1(0x0001) +LONG POS_max [rot] @0xC087 =3.75e-001 >0 <1.63835e+001 %9 +LONG POS_min [rot] @0xC088 =0 >-1.63835e+001 <3.75e-001 %9 +INT SPD_max [rpm] @0xC089 =2.022e+004 >0 <2.022e+004 %6 +INT SPD_min [rpm] @0xC08A =0 >-2.022e+004 <2.022e+004 %6 +INT CRT_max [A] @0xC08B =4.5788e-001 >0 <2e+001 %4 +INT CRT_min [A] @0xC08C =0 >-2e+001 <4.5788e-001 %4 +INT TestMaxSpeed [rpm] @0xC090 =3.81e+003 >0 <1.146e+004 %6 +INT EnableDefault @0xC094 =0(0x0000) >0(0x0000) <1(0x0001) +ULONG InputCFG3_0 @0x09CA =403908390(0x18132726) +ULONG InputCFG7_4 @0x09CC =388046904(0x17212038) +ULONG InputCFG11_8 @0x09CE =168364040(0x0A090808) +ULONG InputCFG15_12 @0x09D0 =0(0x00000000) +ULONG OutputCFG3_0 @0x09D2 =2761657238(0xA49B8B96) +ULONG OutputCFG7_4 @0x09D4 =170(0x000000AA) +ULONG OutputCFG11_8 @0x09D6 =0(0x00000000) +ULONG OutputCFG15_12 @0x09D8 =0(0x00000000) +UINT SpecialIOs_position @0x09E9 =34115(0x8543) +ULONG FG_pos_numerator @0x0386 =1(0x00000001) >1(0x00000001) +ULONG FG_pos_divisor @0x0388 =1(0x00000001) >1(0x00000001) +ULONG FG_spd_numerator @0x038A =8192(0x00002000) >1(0x00000001) +ULONG FG_spd_divisor @0x038C =125(0x0000007D) >1(0x00000001) +ULONG FG_acc_numerator @0x038E =1(0x00000001) >1(0x00000001) +ULONG FG_acc_divisor @0x0390 =1000(0x000003E8) >1(0x00000001) +ULONG FG_time_numerator @0x0392 =1(0x00000001) >1(0x00000001) +ULONG FG_time_divisor @0x0394 =1(0x00000001) >1(0x00000001) +UINT CurrentScale @0x09B6 =0(0x0000) +UINT ASR @0x0201 =16386(0x4002) +UINT ASR2 @0x02A7 =974(0x03CE) +LONG SWNEGLS @0x088A =-2147483648(0x80000000) +LONG SWPOSLS @0x088C =2147483647(0x7FFFFFFF) +INT isSWLS @0xC0A0 =0(0x0000) >0(0x0000) <1(0x0001) +LONG Negative_SWLS [rot] @0xC0A1 =-1.07374182e+006 %9 +LONG Positive_SWLS [rot] @0xC0A2 =1.07374182e+006 %9 +INT save_CAN_baudrate @0xC0C0 =0(0x0000) >0(0x0000) <1(0x0001) +INT save_axis_id @0xC0C1 =1(0x0001) >0(0x0000) <1(0x0001) +INT LSS_Active @0x0823 =2(0x0002) >0(0x0000) <255(0x00FF) +INT SpeedForward @0xC0C9 =1(0x0001) +ULONG QUAL_ACT @0x07F0 =134221824(0x08001000) +ULONG QUAL_AQ1 @0x07F2 =304807935(0x122AFFFF) +ULONG QUAL_AQ2 @0x07F4 =143539(0x000230B3) +ULONG QUAL_BCT @0x07F6 =134219784(0x08000808) +ULONG QUAL_BQ1 @0x07F8 =41088(0x0000A080) +ULONG QUAL_BQ2 @0x0918 =0(0x00000000) +UINT QUAL @0x0806 =3(0x0003) +UINT BRAKECFG @0x0286 =5632(0x1600) +UINT BRAKEAPPLYDELAY @0x09F9 =0(0x0000) +UINT BRAKERELEASEDELAY @0x09FA =0(0x0000) +INT isMotorBrake @0xC0C4 =0(0x0000) >0(0x0000) <1(0x0001) +INT MotorBrake_output @0xC0C5 =0(0x0000) +INT MotorBrake_polarity @0xC0C6 =0(0x0000) >0(0x0000) <1(0x0001) +UINT MotorBrake_releasetime [ms] @0xC0C7 =0 +UINT MotorBrake_applytime [ms] @0xC0C8 =0 +INT MotionCompleteType @0xC0F2 =0(0x0000) >0(0x0000) <1(0x0001) +UINT MotionCompleteStabilizeTime [s] @0xC0F3 =1e-003 %5 +INT MotionCompleteSettleBand [rot] @0xC0F4 =5e-001 >0 %5 +INT MotionCompleteDefaultSettings @0x810A =1(0x0001) >0(0x0000) <1(0x0001) +UINT SSITIMEOUT @0x09FF =100(0x0064) +UINT AD2FIL_CFG @0x09DD =32767(0x7FFF) +UINT VARFIL_CFG @0x099C =1000(0x03E8) +UINT VARFIL_ADR @0x099D =560(0x0230) +ULONG UserVar1 @0xBFF8 =0(0x00000000) +ULONG UserVar2 @0xBFFA =0(0x00000000) +ULONG UserVar3 @0xBFFC =0(0x00000000) +ULONG UserVar4 @0xBFFE =0(0x00000000) +UINT ENCPULSES_LIMIT @0xAF19 =1(0x0001) +UINT REV_SPD_AMPL @0xAF24 =32768(0x8000) +INT SPD_EST_BQ_INI @0xAF18 =1(0x0001) +LONG BQSEA1_F @0xAF1A =-1085893905(0xBF4692EF) +LONG BQSEA2_F @0xAF1C =0(0x00000000) +LONG BQSEB0_F @0xAF1E =1038464069(0x3DE5B445) +LONG BQSEB1_F @0xAF20 =1038464069(0x3DE5B445) +LONG BQSEB2_F @0xAF22 =0(0x00000000) +INT BQFilterType1_SPD_EST @0x80C5 =0(0x0000) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ1_SPD_EST @0x80C6 =7.07e-001 >0 +DOUBLE BQFilterF11_SPD_EST [Hz] @0x80C7 =4e+002 >1 <4.999e+003 +DOUBLE BQFilterF21_SPD_EST [Hz] @0x80C8 =4e+002 >1 <4.999e+003 +FLOAT ZeroSpeedTime [s] @0xC0F5 =7.2816699e-001 >0 <2.1474839e+006 +FLOAT MotorSpeedMethodSwitch [rpm] @0xC0F6 =3e+002 +FLOAT SpeedReversalValue [%] @0xC0F7 =5.0000763e+001 +INT GSAutoUpdate @0xC2B3 =1(0x0001) +INT Auto_Default_IsCheckEncCount @0xC0F8 =1(0x0001) >0(0x0000) <1(0x0001) +INT Auto_Default_IsCheckCrtLevel @0xC0F9 =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT Auto_Default_CheckCrtLevel [Hz ] @0xC0FA =1.8e+003 >1e+002 <3.0000001e+003 +INT GainScheduling_Edit_Value @0xC2B4 =0(0x0000) +FLOAT FilterMecreslTransmission @0xC0FB =2e+003 +UINT GS_K_POSERR @0xB7DC =13000(0x32C8) +FLOAT GainScheduling_PositionErrorGain @0xC0FC =1.3e+004 +INT Auto_Advanced_SpdIntegralLimit [%] @0xC0FD =4e+001 >0 <1e+002 +INT Auto_Advanced_PosIntegralLimit [%] @0xC0FE =4e+001 >0 <1e+002 +INT Auto_Responsive @0xC301 =3(0x0003) >1(0x0001) <5(0x0005) +INT Auto_Transient @0xC302 =8(0x0008) >0(0x0000) <25(0x0019) +INT Auto_RunStep @0xC303 =0(0x0000) +INT Auto_Bandwidth_Current @0xC304 =723(0x02D3) +FLOAT Auto_Bandwidth_Speed @0xC305 =7.27e+001 +FLOAT Auto_Bandwidth_Position @0xC306 =1.679e+002 +FLOAT Auto_PhaseMargin_Current @0xC307 =7.11e+001 +FLOAT Auto_PhaseMargin_Speed @0xC308 =6.82e+001 +FLOAT Auto_PhaseMargin_Position @0xC309 =3.87e+001 +FLOAT Auto_GainMargin_Current @0xC30A =1.65e+001 +FLOAT Auto_GainMargin_Speed @0xC30B =1.31e+001 +FLOAT Auto_GainMargin_Position @0xC30C =8.5 +INT Auto_IdentifiedPlant @0xC30D =1(0x0001) +INT Auto_PlantType @0xC30E =1(0x0001) +INT Auto_TuneMethod @0xC30F =0(0x0000) +INT Auto_NaturalFrequency @0xC310 =500(0x01F4) +INT Auto_DumpingFactor @0xC311 =10(0x000A) +INT Auto_AuxiliaryPoles @0xC312 =300(0x012C) +INT Auto_TotalInertia @0xC313 =0(0x0000) +INT Auto_GainMargin @0xC314 =0(0x0000) +INT Auto_PhaseMargin @0xC315 =0(0x0000) +INT Auto_OpenLoopBw @0xC316 =0(0x0000) +DOUBLE Auto_Bandwidth [Hz ] @0xC330 =1.8e+003 >1e+002 <5e+003 %6 +INT Auto_Passband [rad/s] @0xC332 =0 +INT Auto_MovementType @0xC320 =2(0x0002) +INT Auto_MovementAbsRel @0xC321 =1(0x0001) +FLOAT Auto_Test_Position [rot] @0xC322 =2 +FLOAT Auto_Test_Speed [rpm] @0xC323 =2.0000001 +FLOAT Auto_Test_Acc [rad/s^2] @0xC324 =1.9999999 +FLOAT Auto_Test_Wait [s] @0xC325 =1 +INT Auto_ReferenceType @0xC326 =0(0x0000) +FLOAT Auto_Ident_MinCrt [A] @0xC327 =2 >4.0000001e-001 <6 %4 +INT Auto_Ident_MaxFreq [Hz] @0xC329 =0 +INT Auto_Ident_NoPoints @0xC32A =1000(0x03E8) >500(0x01F4) <2048(0x0800) +INT Auto_AdvancedPlot @0xC32B =4(0x0004) +INT AT_CrtManual @0xC0A3 =0(0x0000) >0(0x0000) <1(0x0001) +INT AT_CrtLevel @0xC0A4 =1(0x0001) >0(0x0000) <2(0x0002) +FLOAT AT_BwDivHigh @0xC1A5 =4 +FLOAT AT_BwDivMedium @0xC1A6 =5 +FLOAT AT_BwDivLow @0xC0A7 =1e+001 +INT AT_REFSTARTADDR @0x09F6 =0(0x0000) +INT AT_REFMAXPOINTS @0x09F7 =0(0x0000) +INT AT_REFINDX @0x09F4 =0(0x0000) +INT ATR @0x09F5 =0(0x0000) +FLOAT AT_Teta @0xC0B5 =1 +INT CrtTuneSet @0xC0B6 =0(0x0000) >0(0x0000) <1(0x0001) +FLOAT AT_TransferFunction_a @0xC0B7 =2.220446e-016 +FLOAT AT_TransferFunction_b0 @0xC0B8 =2.088287e-027 +FLOAT AT_TransferFunction_b1 @0xC0B9 =2.082689e-027 +UINT GainScheduling_Type @0xC200 =0(0x0000) +FLOAT GainScheduling_SettlingTime [ms] @0xC201 =1e+002 +UINT GS_MEMORY_START @0xC202 =45056(0xB000) +UINT GS_MEMORY_LENGTH @0xC203 =1984(0x07C0) +UINT GS_START_ADDR @0xB7E0 =45056(0xB000) +UINT GS_MAX @0xB7E1 =0(0x0000) +UINT GS_WORDS @0xB7E2 =14(0x000E) +UINT GS_TYPE @0xB7E3 =0(0x0000) +UINT GS_MAN @0xB7E4 =0(0x0000) +UINT GS_TIME @0xB7E5 =100(0x0064) +UINT GS_01 @0xB7E6 =606(0x025E) +UINT GS_02 @0xB7E7 =607(0x025F) +UINT GS_03 @0xB7E8 =608(0x0260) +UINT GS_04 @0xB7E9 =609(0x0261) +UINT GS_05 @0xB7EA =610(0x0262) +UINT GS_06 @0xB7EB =611(0x0263) +UINT GS_07 @0xB7EC =614(0x0266) +UINT GS_08 @0xB7ED =615(0x0267) +UINT GS_09 @0xB7EE =616(0x0268) +UINT GS_10 @0xB7EF =617(0x0269) +UINT GS_11 @0xB7F0 =618(0x026A) +UINT GS_12 @0xB7F1 =620(0x026C) +FLOAT GS_User_Value @0xC204 =3.999329e-002 +FLOAT GS_User_Kpp @0xC205 =2.871246e-001 +FLOAT GS_User_Kip @0xC206 =0 +FLOAT GS_User_Kdp @0xC207 =0 +FLOAT GS_User_Ilimp @0xC208 =1e+001 +FLOAT GS_User_Kps @0xC209 =4.43201e+002 +FLOAT GS_User_Kis @0xC20A =4.204712 +FLOAT GS_User_Ilims @0xC20B =1e+001 +FLOAT GainScheduling_SpeedThreshold [rpm] @0xC20C =0 +FIXED GS_SPD @0xB7CC =0(0x00000000) +INT Auto_Method @0xC32C =2(0x0002) >0(0x0000) <2(0x0002) +INT Auto_LpFilter @0xC32D =1(0x0001) +INT Auto_GsType @0xC32E =0(0x0000) +INT AT_GsType @0xC32F =0(0x0000) +INT AT_GsRow @0xC333 =0(0x0000) +UINT GainScheduling_NoLines @0xC334 =64(0x0040) >2(0x0002) <64(0x0040) +FLOAT GainScheduling_MinValuePos [rot] @0xC335 =0 +FLOAT GainScheduling_MinValueSpd [rpm] @0xC336 =6.0000001 >1.5 <6.09e+003 +FLOAT GainScheduling_MaxValuePos [rot] @0xC337 =1.2e+002 +FLOAT GainScheduling_MaxValueSpd [rpm] @0xC338 =1.8599999e+002 >9.5492966e-001 <1.91323e+004 +UINT GainScheduling_OtherVariable @0xC339 =0(0x0000) +UINT GainScheduling_Edit_FillMode @0xC33A =0(0x0000) +UINT GainScheduling_Edit_Kpp @0xC33B =1(0x0001) +UINT GainScheduling_Edit_Kip @0xC33C =1(0x0001) +UINT GainScheduling_Edit_Kdp @0xC33D =1(0x0001) +UINT GainScheduling_Edit_Ilimp @0xC33E =1(0x0001) +UINT GainScheduling_Edit_Kps @0xC33F =1(0x0001) +UINT GainScheduling_Edit_Kis @0xC340 =1(0x0001) +UINT GainScheduling_Edit_Ilims @0xC341 =1(0x0001) +UINT GainScheduling_Edit_From @0xC342 =0(0x0000) +UINT GainScheduling_Edit_To @0xC343 =0(0x0000) +FLOAT GainScheduling_SpeedTrigger [rpm] @0xC344 =1.199798 +LONG GainScheduling_PositionTrigger [rot] @0xC345 =0 +FLOAT GS_User_Value2 @0xC346 =3.999329e-002 +FLOAT GS_User_Kpp2 @0xC347 =2.871246e-001 +FLOAT GS_User_Kip2 @0xC348 =0 +FLOAT GS_User_Kdp2 @0xC349 =0 +FLOAT GS_User_Ilimp2 @0xC34A =1e+001 +FLOAT GS_User_Kps2 @0xC34B =4.43201e+002 +FLOAT GS_User_Kis2 @0xC34C =4.204712 +FLOAT GS_User_Ilims2 @0xC34D =1e+001 +FLOAT GainScheduling_SpeedTrigger2 [rpm] @0xC34E =1.199798 +LONG GainScheduling_PositionTrigger2 [rot] @0xC34F =0 +UINT GS_TRIG_ADDR @0xB7D6 =692(0x02B4) +FLOAT Auto_Motor_R [Ohms] @0xC238 =2.0541511 >1e-003 <1e+003 %4 +FLOAT Auto_Motor_L [mH] @0xC239 =1.887935 >0 <1e+006 %4 +INT Auto_TuneLpFilter @0xC23A =0(0x0000) +INT Auto_Bandwidth_Sld @0xC23B =3(0x0003) >0(0x0000) <6(0x0006) +INT Auto_Overshoot_Sld @0xC23C =3(0x0003) >1(0x0001) <5(0x0005) +FLOAT Auto_Advanced_Imot [%] @0xC23D =2.5e+001 +FLOAT Auto_Advanced_OvsV0 @0xC23E =2 +FLOAT Auto_Advanced_GmMin @0xC23F =8 +FLOAT Auto_Advanced_PmMin @0xC240 =3e+001 +FLOAT Auto_Advanced_PmMin2L @0xC2AF =3.5e+001 +FLOAT Auto_Test_Pos_PosInc [rot] @0xC241 =1 +FLOAT Auto_Test_Pos_Spd [rpm] @0xC242 =1.2e+003 >-2.022e+004 <2.022e+004 +FLOAT Auto_Test_Pos_Acc [rad/s^2] @0xC243 =1.9999999e+003 +FLOAT Auto_Test_Pos_Wait [ms] @0xC244 =2e+002 +INT Auto_Pos_ReferenceType @0xC245 =3(0x0003) +FLOAT Auto_Test_Spd_PosInc [rot] @0xC246 =6.6283179 +FLOAT Auto_Test_Spd_Spd [rpm] @0xC247 =1.2e+003 >-2.022e+004 <2.022e+004 +FLOAT Auto_Test_Spd_Acc [rad/s^2] @0xC248 =1.9999999e+003 +FLOAT Auto_Test_Spd_Wait [ms] @0xC249 =4e+002 +INT Auto_Spd_ReferenceType @0xC24A =3(0x0003) +FLOAT Auto_Test_Spd_Freq [Hz] @0xC24B =1e+001 +FLOAT Auto_Test_Pos_Freq [Hz] @0xC24C =1e+001 +INT OnlinePlot @0xC24D =1(0x0001) >0(0x0000) <1(0x0001) +INT MultiCycle @0xC24E =1(0x0001) >0(0x0000) <1(0x0001) +INT Auto_Ident_Method @0xC24F =1(0x0001) >0(0x0000) <2(0x0002) +INT Auto_MovementTypeC @0xC250 =0(0x0000) +INT Auto_IsPlotInIU @0xC251 =0(0x0000) +INT R_lbl @0xC252 =0(0x0000) +INT L_lbl @0xC253 =0(0x0000) +FLOAT R_line [Ohms] @0xC254 =8.0000001e-001 >1e-003 <1e+003 +FLOAT L_line [mH] @0xC255 =1.2000001 >0 <1e+006 +FLOAT Auto_Motor_R_line [Ohms] @0xC256 =1.369434 >1e-003 <1e+003 %4 +FLOAT Auto_Motor_L_line [mH] @0xC257 =1.258623 >0 <1e+006 %4 +FLOAT Auto_Dumping @0xC258 =1.15 >7e-001 <2 +FLOAT Auto_Ident_MaxCrt_Crt [A] @0xC328 =4 >4.0000001e-001 <6 %4 +FLOAT Auto_Ident_MaxCrt_Pos [A] @0xC259 =4 >4.0000001e-001 <6 %4 +INT Auto_Tune_Details @0xC25A =0(0x0000) >0(0x0000) <1(0x0001) +UINT TestTime [ms] @0xC25B =1e+001 >5 <2.5e+001 %5 +INT Auto_RefType @0xC25C =0(0x0000) +FLOAT Auto_Test_Pos_Amp [rot] @0xC25D =5e-003 +FLOAT Auto_Test_Spd_Amp [rpm] @0xC25E =3e+002 >-2.022e+004 <2.022e+004 +UINT Auto_Indent_K_Use @0xC260 =0(0x0000) <1(0x0001) +FLOAT Auto_Indent_K [Nm/A] @0xC261 =3.9999999e-002 >0 %6 +DOUBLE Auto_Indent_J [kgm^2 E-7] @0xC262 =5.7632664861262406e+001 >1.0000000000000001e-001 <1e+014 %4 +DOUBLE Auto_Indent_F [Nms/rad] @0xC263 =1.07408187372837e-004 >0 %4 +INT Auto_Indent_IgnoreF @0xC264 =0(0x0000) >0(0x0000) <1(0x0001) +INT Auto_Indent_IncludeDelays @0xC265 =0(0x0000) >0(0x0000) <1(0x0001) +INT Auto_Ident_NoPoints_Pos @0xC266 =1000(0x03E8) >500(0x01F4) <2048(0x0800) +INT Auto_Ident_Method_Pos @0xC267 =0(0x0000) >0(0x0000) <2(0x0002) +INT Auto_Strategy_spd @0xC268 =0(0x0000) +INT Auto_Strategy_pos @0xC269 =2(0x0002) +INT Auto_IdentifiedPlant_spd @0xC26A =1(0x0001) +INT Auto_IdentifiedPlant_pos @0xC26B =1(0x0001) +INT Auto_PlantType_spd @0xC26C =1(0x0001) +INT Auto_PlantType_pos @0xC26D =1(0x0001) +INT Auto_TuneMethod_spd @0xC26F =0(0x0000) +INT Auto_TuneMethod_pos @0xC270 =0(0x0000) +DOUBLE Auto_Bandwidth_spd [Hz ] @0xC271 =3e+001 >3e+001 <4e+002 %6 +DOUBLE Auto_Bandwidth_pos [Hz ] @0xC272 =1.5030000000000001e+002 >3e+001 <4e+002 %6 +DOUBLE Auto_Overshoot_spd [%] @0xC273 =0 >0 <3e+001 +DOUBLE Auto_Overshoot_pos [%] @0xC274 =8 >0 <1e+001 +INT Auto_Responsive_spd @0xC275 =3(0x0003) >1(0x0001) <5(0x0005) +INT Auto_Responsive_pos @0xC276 =3(0x0003) >1(0x0001) <5(0x0005) +INT ModDerivPartLimit @0xC25F =10(0x000A) >2(0x0002) <100(0x0064) +INT ModDerivPartSetBand [Hz] @0xC360 =2.39e+002 >1 %5 +INT ModDerivPart @0x810B =1(0x0001) +INT KDFP2 @0xAF36 =19660(0x4CCC) +FIXED DTHETA0 @0xBE80 =655.36(0x028F5C29) +FIXED DTHETA_INC @0xBE82 =0(0x00000000) +LONG AMPL0 @0xBE84 =10(0x0000000A) +LONG AMPL_INC @0xBE86 =0(0x00000000) +LONG SIN_N @0xBE88 =0(0x00000000) +INT PHASE0 @0xBE8A =16384(0x4000) +INT useAutoTuning @0x8013 =0(0x0000) +FLOAT Auto_Test_Pos_Time [s] @0xC277 =4e-001 +FLOAT Auto_Test_Spd_Time [s] @0xC278 =4e-001 +INT Auto_AdvancedPlotSpd @0xC279 =0(0x0000) +INT Auto_AdvancedPlotPos @0xC28A =0(0x0000) +INT isFeedforwardAcc @0x801D =0(0x0000) >0(0x0000) <1(0x0001) +INT isFeedforwardSpd @0x801E =1(0x0001) >0(0x0000) <1(0x0001) +INT Auto_UseAdvancedSettings @0xC28B =0(0x0000) +INT AutotuningID @0x801C =1(0x0001) +DOUBLE Auto_Advanced_Kpp_max @0xC28C =1 +DOUBLE Auto_Advanced_GSMinSpd [rpm] @0xC28D =6 >1.5 <6.09e+003 +DOUBLE Auto_Advanced_GSMaxSpd [rpm] @0xC28E =1.86e+002 >1.5 <6.09e+003 +DOUBLE Auto_Advanced_GSMinPos [rot] @0xC28F =0 >-1.0737418234999999e+006 <1.0737418234999999e+006 +DOUBLE Auto_Advanced_GSMaxPos [rot] @0xC290 =1 >-1.0737418234999999e+006 <1.0737418234999999e+006 +INT Auto_Default_Ident_NoPoints @0xC291 =1000(0x03E8) >500(0x01F4) <2000(0x07D0) +INT Auto_Default_Ident_NoPoints_c @0xC292 =2048(0x0800) >512(0x0200) <2048(0x0800) +INT Auto_Default_PlantType @0xC293 =1(0x0001) +INT Auto_Default_TuneMethod @0xC294 =0(0x0000) +INT Auto_Default_Ident_NoPoints_Pos @0xC295 =1000(0x03E8) >500(0x01F4) <2000(0x07D0) +INT Auto_Default_Ident_NoPoints_Pos_c @0xC296 =2048(0x0800) >512(0x0200) <2048(0x0800) +INT Auto_Default_PlantType_spd @0xC297 =1(0x0001) +INT Auto_Default_TuneMethod_spd @0xC298 =0(0x0000) +INT Auto_Default_PlantType_pos @0xC299 =1(0x0001) +INT Auto_Default_TuneMethod_pos @0xC29A =0(0x0000) +INT Auto_Default_Strategy_spd @0xC29B =2(0x0002) +INT Auto_Default_Strategy_pos @0xC29C =2(0x0002) +INT Auto_Default_LpFilter @0xC29D =0(0x0000) +INT Auto_Default_GainScheduling_Type @0xC29E =0(0x0000) +DOUBLE Auto_Advanced_CLBwMin [Hz] @0xC29F =9e+001 +DOUBLE Auto_Advanced_SLPLBwMin [Hz] @0xC2A0 =3e+001 +INT Auto_Default_Ident_Method @0xC2A1 =1(0x0001) +INT Auto_Default_Ident_Method_Pos @0xC2A2 =0(0x0000) +INT Auto_Default_Indent_IgnoreF @0xC2A3 =0(0x0000) +INT Auto_Default_Indent_IncludeDelays @0xC2A4 =0(0x0000) +INT Auto_Default_GainScheduling_NoLines @0xC2A5 =64(0x0040) >2(0x0002) <64(0x0040) +DOUBLE Auto_Min_model_freq [Hz] @0xC2A6 =0 +DOUBLE Auto_Max_model_freq [Hz] @0xC2A7 =0 +INT Auto_Hann_window @0xC2A8 =32(0x0020) +DOUBLE Auto_Gain_err @0xC2A9 =1e-001 +DOUBLE Auto_Phase_err @0xC2AA =1 +INT Auto_Ident_NoPoints_Pos_c @0xC2AB =2048(0x0800) >512(0x0200) <2048(0x0800) +INT Auto_Ident_NoPoints_c @0xC2AC =2048(0x0800) +INT Auto_IsDetailedModel @0xC2AD =0(0x0000) +UINT BQ_MASK @0xAF10 =0(0x0000) +DOUBLE Auto_Advanced_PLBwMax [Hz] @0xC2AE =2.5e+002 +DOUBLE Auto_Advanced_SLBwMin [Hz] @0xC2B0 =5e+001 +INT Auto_Advanced_UseWN @0xC2B1 =0(0x0000) +FLOAT Auto_Ident_MaxCrt_Pos_Det [A] @0xC2B2 =4 >4.0000001e-001 <6 %4 +UINT CopenTableAdr @0x07FA =31121(0x7991) +INT SPDREF_BQ_INI @0x080C =1(0x0001) +INT IQREF_BQ_INI @0x080D =0(0x0000) +INT ASPD_BQ_INI @0x09DE =0(0x0000) +LONG BQ1A1_F @0xBF00 =1066552198(0x3F924B86) +LONG BQ1A2_F @0xBF02 =1054036613(0x3ED35285) +LONG BQ1B0_F @0xBF04 =1059295250(0x3F239012) +LONG BQ1B1_F @0xBF06 =1067683860(0x3FA39014) +LONG BQ1B2_F @0xBF08 =1059295252(0x3F239014) +LONG BQ2A1_F @0xBF0C =0(0x00000000) +LONG BQ2A2_F @0xBF0E =0(0x00000000) +LONG BQ2B0_F @0xBF10 =0(0x00000000) +LONG BQ2B1_F @0xBF12 =0(0x00000000) +LONG BQ2B2_F @0xBF14 =0(0x00000000) +LONG BQ3A1_F @0xBF18 =0(0x00000000) +LONG BQ3A2_F @0xBF1A =0(0x00000000) +LONG BQ3B0_F @0xBF1C =0(0x00000000) +LONG BQ3B1_F @0xBF1E =0(0x00000000) +LONG BQ3B2_F @0xBF20 =0(0x00000000) +LONG BQ4A1_F @0xBF24 =0(0x00000000) +LONG BQ4A2_F @0xBF26 =0(0x00000000) +LONG BQ4B0_F @0xBF28 =0(0x00000000) +LONG BQ4B1_F @0xBF2A =0(0x00000000) +LONG BQ4B2_F @0xBF2C =0(0x00000000) +LONG BQ5A1_F @0xBF30 =0(0x00000000) +LONG BQ5A2_F @0xBF32 =0(0x00000000) +LONG BQ5B0_F @0xBF34 =0(0x00000000) +LONG BQ5B1_F @0xBF36 =0(0x00000000) +LONG BQ5B2_F @0xBF38 =0(0x00000000) +LONG BQ6A1_F @0xBF3C =0(0x00000000) +LONG BQ6A2_F @0xBF3E =0(0x00000000) +LONG BQ6B0_F @0xBF40 =0(0x00000000) +LONG BQ6B1_F @0xBF42 =0(0x00000000) +LONG BQ6B2_F @0xBF44 =0(0x00000000) +LONG BQ7A1_F @0xBF48 =0(0x00000000) +LONG BQ7A2_F @0xBF4A =0(0x00000000) +LONG BQ7B0_F @0xBF4C =0(0x00000000) +LONG BQ7B1_F @0xBF4E =0(0x00000000) +LONG BQ7B2_F @0xBF50 =0(0x00000000) +LONG BQ8A1_F @0xBF54 =0(0x00000000) +LONG BQ8A2_F @0xBF56 =0(0x00000000) +LONG BQ8B0_F @0xBF58 =0(0x00000000) +LONG BQ8B1_F @0xBF5A =0(0x00000000) +LONG BQ8B2_F @0xBF5C =0(0x00000000) +LONG BQ9A1_F @0xBF60 =0(0x00000000) +LONG BQ9A2_F @0xBF62 =0(0x00000000) +LONG BQ9B0_F @0xBF64 =0(0x00000000) +LONG BQ9B1_F @0xBF66 =0(0x00000000) +LONG BQ9B2_F @0xBF68 =0(0x00000000) +LONG BQ10A1_F @0xBF6C =0(0x00000000) +LONG BQ10A2_F @0xBF6E =0(0x00000000) +LONG BQ10B0_F @0xBF70 =0(0x00000000) +LONG BQ10B1_F @0xBF72 =0(0x00000000) +LONG BQ10B2_F @0xBF74 =0(0x00000000) +INT BQFilter1 @0x80B9 =1(0x0001) >0(0x0000) <1(0x0001) +INT BQFilterType1 @0x80BA =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ1 @0x80BB =7.07e-001 >0 +DOUBLE BQFilterF11 [Hz] @0x80BC =4e+002 >1 <4.99e+002 +INT BQFilter2 @0x80BD =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType2 @0x80BE =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ2 @0x80BF =7.071e-001 >0 +DOUBLE BQFilterF12 [Hz] @0x80C0 =4.99e+002 >1 <4.99e+002 +INT BQFilter3 @0x80C1 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType3 @0x80C2 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ3 @0x80C3 =7.071e-001 >0 +DOUBLE BQFilterF13 [Hz] @0x80C4 =4.99e+002 >1 <4.99e+002 +INT BQFilterLocation1 @0x80D5 =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation2 @0x80D6 =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation3 @0x80D7 =0(0x0000) >0(0x0000) <2(0x0002) +DOUBLE BQFilterF21 [Hz] @0x80D8 =4e+002 >1 <6.25e+002 +DOUBLE BQFilterF22 [Hz] @0x80D9 =4e+002 >1 <6.25e+002 +DOUBLE BQFilterF23 [Hz] @0x80DA =5e+002 >1 <6.25e+002 +INT BQFilterLocation4 @0x80DB =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation5 @0x80DC =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation6 @0x80DD =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation7 @0x80DE =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation8 @0x80DF =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation9 @0x80E0 =0(0x0000) >0(0x0000) <2(0x0002) +INT BQFilterLocation10 @0x80E1 =0(0x0000) >0(0x0000) <2(0x0002) +DOUBLE BQFilterF24 [Hz] @0x80E2 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF25 [Hz] @0x80E3 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF26 [Hz] @0x80E4 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF27 [Hz] @0x80E5 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF28 [Hz] @0x80E6 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF29 [Hz] @0x80E7 =5e+002 >1 <6.25e+002 +DOUBLE BQFilterF210 [Hz] @0x80E8 =5e+002 >1 <6.25e+002 +INT BQFilter4 @0x80E9 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType4 @0x80EA =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ4 @0x80EB =7.071e-001 >0 +DOUBLE BQFilterF14 [Hz] @0x80EC =4.99e+002 >1 <4.99e+002 +INT BQFilter5 @0x80ED =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType5 @0x80EE =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ5 @0x80EF =7.071e-001 >0 +DOUBLE BQFilterF15 [Hz] @0x80F0 =4.99e+002 >1 <4.99e+002 +INT BQFilter6 @0x80F1 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType6 @0x80F2 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ6 @0x80F3 =7.071e-001 >0 +DOUBLE BQFilterF16 [Hz] @0x80F4 =4.99e+002 >1 <4.99e+002 +INT BQFilter7 @0x80F5 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType7 @0x80F6 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ7 @0x80F7 =7.071e-001 >0 +DOUBLE BQFilterF17 [Hz] @0x80F8 =4.99e+002 >1 <4.99e+002 +INT BQFilter8 @0x80F9 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType8 @0x80FA =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ8 @0x80FB =7.071e-001 >0 +DOUBLE BQFilterF18 [Hz] @0x80FC =4.99e+002 >1 <4.99e+002 +INT BQFilter9 @0x80FD =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType9 @0x80FE =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ9 @0x80FF =7.071e-001 >0 +DOUBLE BQFilterF19 [Hz] @0x8100 =4.99e+002 >1 <4.99e+002 +INT BQFilter10 @0x8101 =0(0x0000) >0(0x0000) <1(0x0001) +INT BQFilterType10 @0x8102 =1(0x0001) >0(0x0000) <9(0x0009) +DOUBLE BQFilterQ10 @0x8103 =7.071e-001 >0 +DOUBLE BQFilterF110 [Hz] @0x8104 =4.99e+002 >1 <4.99e+002 +INT SpeedTestReferenceType @0x8009 =2(0x0002) >0(0x0000) <3(0x0003) +INT PositionTestReferenceType @0x800A =0(0x0000) >0(0x0000) <3(0x0003) +ULONG ABSTART_MINMOVE @0x08C8 =0(0x00000000) +INT ABSTART_MINMOVE_PERCENT [%] @0x80A1 =0 >0 <1e+002 +ULONG DTMIN @0x08B0 =1000(0x000003E8) +ULONG DTMAX @0x08B2 =4000(0x00000FA0) +INT UPPS @0x0881 =2(0x0002) +INT MAXCCPS @0x0880 =4(0x0004) +LONG ZEROSPDTLIM @0x08C0 =65535029(0x03E7FC35) +UINT RFOFFSET @0x0999 =2080(0x0820) +UINT RFGAIN @0x099A =34363(0x863B) +UINT POSOKLIM_FC @0x09FC =0(0x0000) +UINT TONPOSOK_FC @0x09FD =65535(0xFFFF) +INT isFreezeControl @0xC0CA =0(0x0000) >0(0x0000) <1(0x0001) +UINT FreezeControl_time [s] @0xC0CB =6.5535e+001 %5 +INT FreezeControl_errband [rot] @0xC0CC =0 >0 %5 +INT InputsPolarityType @0xC0CD =1(0x0001) >0(0x0000) <1(0x0001) +INT isSpeedEstimator @0xC0B0 =0(0x0000) >0(0x0000) <1(0x0001) +UINT COUNTINGDIR_MT @0x0805 =0(0x0000) +INT ReverseCounting_MT @0xC0CF =0(0x0000) >0(0x0000) <1(0x0001) +INT isFilterEnc_MT @0xC0D4 =0(0x0000) >0(0x0000) <1(0x0001) +INT FilterEncValue_MT @0x8084 =0(0x0000) >0(0x0000) <12(0x000C) +INT ReverseCounting_LD @0xC0D5 =0(0x0000) >0(0x0000) <1(0x0001) +INT isFilterEnc_LD @0xC0D6 =0(0x0000) >0(0x0000) <1(0x0001) +INT FilterEncValue_LD @0x8085 =0(0x0000) >0(0x0000) <12(0x000C) +INT COUNTINGDIR_LD @0x0916 =0(0x0000) +INT DigitalReferenceConnector @0xC0D8 =1(0x0001) >0(0x0000) <1(0x0001) +FIXED TRANSMISSION @0x037C =1(0x00010000) +UINT ZAOFF @0x0289 =571(0x023B) +UINT STOERRTIME @0x09F8 =20(0x0014) +UINT HOME_NR_6098 @0x039F =0(0x0000) +LONG HOME_OFFSET_607C @0x0992 =0(0x00000000) +FIXED HOME_HSPD_6099_01 @0x03A4 =1(0x00010000) +FIXED HOME_LSPD_6099_02 @0x03A2 =1(0x00010000) +FIXED HOME_ACC_609A @0x03A6 =0.10001(0x0000199A) +INT HOME_CRT_207B @0x08AC =0(0x0000) +UINT HOME_TIME_207C @0x08AD =0(0x0000) +UINT x6007 @0x09F0 =1(0x0001) +UINT x210A @0x0932 =3(0x0003) +UINT x210C @0xB9F2 =0(0x0000) +INT IsReverseMovementDirection @0xC09F =0(0x0000) >0(0x0000) <1(0x0001) +UINT STO_level_10C @0x0849 =32000(0x7D00) +UINT SYNCONFASTLOOP @0x0948 =0(0x0000) +UINT SLSyncOffset @0x0947 =1000(0x03E8) +FLOAT Limit_Speed_MaxPercent [%] @0xC056 =9e+001 >0 <1e+002 +LONG MINPOSRANGE @0xAF00 =0(0x00000000) +LONG MAXPOSRANGE @0xAF02 =0(0x00000000) +UINT POSRANGEDEF @0xAF04 =0(0x0000) +UINT POSOPTCODE @0xAF05 =0(0x0000) +UINT POLARITY @0xAF0A =0(0x0000) +LONG PosRange_Minimum [rot] @0xC099 =0 +LONG PosRange_Maximum [rot] @0xC09A =5e-004 +INT isPosRange @0xC09B =0(0x0000) >0(0x0000) <1(0x0001) +INT Auto_SkipUQLogging @0xC2FF =0(0x0000) +INT GSFilter @0xC362 =0(0x0000) >0(0x0000) <1(0x0001) +FLOAT GSFilterBW [rad/s ] @0xC363 =3.49979e+002 >6.2831848e+001 <3.141593e+003 %4 +INT GS_Filter @0xAF2F =32767(0x7FFF) +INT I2t_trig @0xC09D =1(0x0001) >0(0x0000) <1(0x0001) +FLOAT TestMinMoveProcent [%] @0xC317 =1e+001 >0 +INT User_KDFP @0xC1AA =13107(0x3333) +INT User_KDFP2 @0xC1AB =19660(0x4CCC) +DOUBLE EnDAT_Ts_C_min @0x8105 =2e-004 +UINT BISS_CRC_5BIT_FDBK1_FDBK2 @0xAF6F =0(0x0000) +INT Biss_CRC_Bits @0xC1B1 =1(0x0001) >0(0x0000) <1(0x0001) +INT Biss_CRC_Bits_LD @0xC1B2 =1(0x0001) >0(0x0000) <1(0x0001) +LONG TSPDA1_F @0xBFDC =1057124419(0x3F027043) +LONG TSPDB0_F @0xBFDE =1061238818(0x3F413822) +LONG TACCA1_F @0xBFE2 =1057124419(0x3F027043) +LONG TACCB0_F @0xBFE4 =1061238818(0x3F413822) +UINT TACCFILTER_OPTION @0xBFEC =0(0x0000) +UINT WAIT_TSPD_0 @0xBFED =0(0x0000) +FIXED TACC_THRESHOLD_POS @0xBFE8 =0(0x00000000) +FIXED TACC_THRESHOLD_NEG @0xBFEA =0(0x00000000) +INT SFTDFFW @0xAF7E =0(0x0000) +INT KFFD @0xAF7F =0(0x0000) +INT isFeedforwardDec @0x8114 =0(0x0000) >0(0x0000) <1(0x0001) +DOUBLE KFFD_scl @0xC111 =0 >0 <4.194304e+006 %5 +UINT ASR3 @0xAF78 =27(0x001B) +INT isLoadMonitorOnly @0xC110 =0(0x0000) >0(0x0000) <1(0x0001) +UINT AUTORUNACTIVE @0xAF73 =0(0x0000) +UINT SI_POSITION_UNIT @0x8024 =203(0x00CB) +UINT SI_VELOCITY_UNIT @0x8025 =186(0x00BA) +UINT SI_ACCELERATION_UNIT @0x8026 =225(0x00E1) +UINT SI_JERK_UNIT @0x8027 =565(0x0235) +ULONG Encoder_increments @0xBAAE =2000(0x000007D0) >1(0x00000001) +ULONG Motor_revolutions @0xBAB0 =1(0x00000001) >1(0x00000001) +ULONG Feed_constant_numerator @0xBAB6 =2000(0x000007D0) >1(0x00000001) +ULONG Feed_constant_divisor @0xBAB8 =1(0x00000001) >1(0x00000001) +ULONG Gear_ratio_numerator @0xBAB2 =1(0x00000001) >1(0x00000001) +ULONG Gear_ratio_divisor @0xBAB4 =1(0x00000001) >1(0x00000001) +ULONG Spd_encoder_numerator @0xBACA =1(0x00000001) >1(0x00000001) +ULONG Spd_encoder_divisor @0xBACC =1(0x00000001) >1(0x00000001) +ULONG Acc_scaling_numerator @0xBAA2 =1(0x00000001) >1(0x00000001) +ULONG Acc_scaling_divisor @0xBAA4 =1(0x00000001) >1(0x00000001) +ULONG Jerk_factor_numerator @0xBAAA =1(0x00000001) >1(0x00000001) +ULONG Jerk_factor_divisor @0xBAAC =1000(0x000003E8) >1(0x00000001) +ULONG Jerk_scaling_numerator @0xBAA6 =1(0x00000001) >1(0x00000001) +ULONG Jerk_scaling_divisor @0xBAA8 =1(0x00000001) >1(0x00000001) +ULONG COFG_o60A8h @0xBABE =11862272(0x00B50100) +ULONG COFG_o60A9h @0xBAC0 =0(0x00000000) +ULONG COFG_o60AAh @0xBAC2 =0(0x00000000) +ULONG COFG_o60ABh @0xBAC4 =0(0x00000000) +UINT COFG_Pos_UD @0x8020 =0(0x0000) +UINT COFG_Spd_UD @0x8021 =0(0x0000) +UINT COFG_Acc_UD @0x8022 =0(0x0000) +UINT COFG_Jrk_UD @0x8023 =0(0x0000) +UINT enable_off @0x0926 =0(0x0000) +FLOAT AnalogInputAD2Range1 [V] @0x8110 =5 >3 <2e+001 +FLOAT AnalogInputAD2Range2 [V] @0x8111 =1e+001 >3 <2e+001 +FLOAT AnalogInputAD5Range1 [V] @0x8112 =5 >3 <2e+001 +FLOAT AnalogInputAD5Range2 [V] @0x8113 =1e+001 >3 <2e+001 +INT UseAnalogInputAD2 @0xC120 =1(0x0001) >0(0x0000) <1(0x0001) +INT UseAnalogInputAD5 @0xC121 =1(0x0001) >0(0x0000) <1(0x0001) +INT SelectAnalogInputAD2Range @0xC122 =0(0x0000) >0(0x0000) <1(0x0001) +INT SelectAnalogInputAD5Range @0xC123 =0(0x0000) >0(0x0000) <1(0x0001) +UINT User_RfOffset @0xC423 =416(0x01A0) +UINT User_RfGain @0xC424 =37050(0x90BA) +INT User_Ad2Off @0xC427 =5(0x0005) +INT isSwitchAD2AD5 @0xC124 =0(0x0000) >0(0x0000) <1(0x0001) +UINT MER_mask @0x0965 =65535(0xFFFF) +LONG ErrProt_SOL_PID @0xAF80 =0(0x00000000) +UINT TonErr_SOL_PID @0xAF82 =0(0x0000) +FIXED MAXMOTORSPEED @0xAF94 =0(0x00000000) +ULONG DRIVE_MAX_CURRENT @0xAF70 =20000(0x00004E20) +UINT SPDOKLIM @0xAF9A =3(0x0003) +UINT TONSPDOK @0xAF9B =0(0x0000) %5 +INT NEW_FREEZE @0xAF79 =0(0x0000) +INT UQREF_FREEZE @0xAF7A =0(0x0000) +INT UQREF_FREEZE_LIM @0xAF7B =32767(0x7FFF) +UINT POSOKLIMMAX_FC @0xAF83 =0(0x0000) +INT UDREF_FREEZE @0xAF8A =0(0x0000) +LONG ZAOFFL @0xAF98 =0(0x00000000) +UINT DIG_INTCFG @0xAF72 =0(0x0000) +UINT EXT_CHOPPER_CFG @0xAF9D =10754(0x2A02) +INT isBrakeModule @0xC113 =0(0x0000) >0(0x0000) <1(0x0001) +INT BrakeModule_output @0xC114 =4(0x0004) +INT ECATSPDREFOPTION @0xC115 =0(0x0000) >0(0x0000) <1(0x0001) +INT ECATACCREFOPTION @0xC116 =0(0x0000) >0(0x0000) <3(0x0003) +UINT ECATACCREFFORCETIME [ms] @0xC117 =0 %5 +FIXED ECATACCREFFORCESTART [rpm] @0xC118 =0 %6 +FIXED ECATACCREFFORCEEND [rpm] @0xC119 =0 %6 +FLOAT ECATSPDREFFILTER [Hz] @0x8106 =4e+002 +FLOAT ECATACCREFFILTER [Hz] @0x8107 =4e+002 +INT FREEZECONTROL_STOP_ERRBAND [rot] @0xC1AC =0 >0 %5 +UINT FREEZETYPESELECTION @0xC1AD =0(0x0000) +INT USERQVOLTAGE [V] @0xC1AE =0 +INT USERDVOLTAGE [V] @0xC1AF =0 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc new file mode 100644 index 0000000000000000000000000000000000000000..31983fcc40141c94bc2f8714c5dfd44f60f112e3 GIT binary patch literal 3012 zcmZQ%VrEEXIKjZg@c%y}10RF4uXDUletLRpk!MM2E(-$#1Aj}gd_aD2W=Up# z9&=HC$)UpTZK-=Q?Sax@z+9A=0@U9CQqSv?pO`{~Y6fPYl?)7Q49?D_MP;c>Kxfn* zo}#+eb5qDDJsJ+9=>T^=NMR6gOfD?Vgk(sClFZyxrrcu2VrXt;s1{l0{;+BaG<#+` zfW;m99atJha~bYX9W8Z6OC97=Ck1QO2de5|`3$uh`~a^GNAnqSIF9D4(R_t3J)~f1 zG7^)^7x6GW9)FNhRR&8i#0Ln8mZ~-v{ z2pwQx05(6NKm^DG0Swv!EX*K+LW3I13=A9$&JmH|wkspZP@we(7=Z0)5CHLkH8QBF h4B~P%z*GROgs1?KNGh;3v{_S literal 0 HcmV?d00001 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg new file mode 100644 index 000000000..9fb7be444 --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg @@ -0,0 +1,120 @@ +FirmwareID = F515K +CustomCommPort = +ConfigurationID = 2E63 +Description = iPOS4808 BX-CAT-STO +ProductID = P027.314.E221 +CompatibleProductIDs = P027.214.E221, P027.324.E721 +E2ROMSize = 4000 +RAMStart = C000 +RAMSize = 4000 +LoadToRAMSectSize = 1 +LoadToE2ROM = 1 +RunFromE2ROM = 1 +TMLStartE2ROM = 4000 +TMLSizeRAM = 0000 +CAMSize = 0000 +PVTSize = 0040 +GUI_FILE = iDC_dl_AT.dll +HelpFile = iDC_DL_AT.chm +Analogue_Reference_Test = BLE\Analogue_Reference_Test_BLE_MC3_P.out +Current_Controller_Tuning_Test = DCET\Current_Controller_Tuning_Test_DCET_MC3_P1.out +Encoder_Connection_Test = BLE\Encoder_Connection_Test_BLE_MC3_P.out +Position_Controller_Tuning_Test_with_SpdCtrl = DCET\Pos_Controller_Tuning_Test_wth_SpdCtrl_DCET_MC3_P1.out +Position_Controller_Tuning_Test_without_SpdCtrl = DCET\Pos_Controller_Tuning_Test_wo_SpdCtrl_DCET_MC3_P1.out +Speed_Controller_Tuning_Test = DCET\Speed_Controller_Tuning_Test_DCET_MC3_P1.out +Total_Inertia_Identification_Test = DCET\Total_Inertia_Identification_Test_DCET_MC3_P1.out +VDC_Detection_Test = DCET\VDC_Detection_Test_DCET_MC3_P.out +Position_Controller_AutoTuning_Test = DCET\PosCtrl_DCET_MC3_P.out +Speed_Controller_AutoTuning_Test = DCET\SpdCtrl_DCET_MC3_P.out +Ident_R_or_Rs = DCET\Ident_R_or_Rs_DCET_MC3_P.out +Ident_L_or_Tau_el = DCET\Ident_L_or_Tau_el_DCET_MC3_P.out +Initial_Positioning_Test = DCET\Initial_Positioning_Test_DCET_MC3_P.out +SSI_Initial_Positioning_Test = BLSSI\Initial_Positioning_Test_BLSSI_MC3.out +SSI_Motor_Phase_Connection_Test = BLSSI\Motor_Phase_Connection_Test_BLSSI_MC3.out +SSI_Motor_Pole_Pairs_Detection_Test = BLSSI\Motor_Pole_Pairs_Detection_Test_BLSSI_MC3.out +SSI_Ident_R_or_Rs = BLSSI\Ident_R_or_Rs_BLSSI_MC3.out +SSI_Ident_L_or_Tau_el = BLSSI\Ident_L_or_Tau_el_BLSSI_MC3.out +SSI_Encoder_Connection_Test = BLSSI\Encoder_Connection_Test_BLSSI_MC3.out +SSI_Encoder_Offset_Detection_Test = BLSSI\Encoder_Detect_Offset_Test_BLSSI_MC3.out +SSI_Analogue_Reference_Test = BLSSI\Analogue_Reference_Test_BLSSI_MC3.out +SSI_VDC_Detection_Test = BLSSI\VDC_Detection_Test_BLSSI_MC3.out +SSI_Current_Controller_Tuning_Test = BLSSI\Current_Controller_Tuning_Test_BLSSI_MC3_P.out +SSI_Speed_Controller_Tuning_Test = BLSSI\Speed_Controller_Tuning_Test_BLSSI_MC3_P.out +SSI_Position_Controller_Tuning_Test_with_SpdCtrl = BLSSI\Pos_Control_Tuning_Test_with_SpdCtrl_BLSSI_P.out +SSI_Position_Controller_Tuning_Test_without_SpdCtrl = BLSSI\Position_Controller_Tuning_Test_wo_SpdCtrl_BLSSI_P.out +SSI_Total_Inertia_Identification_Test = BLSSI\Total_Inertia_Identification_Test_BLSSI_MC3_P.out +Encoder_Direction_Test = DCET\EncoderDirection_DCET_MC3_P.out +Image = default.jpg +Port[0] = IN "IN0" OUT "OUT0" +Port[1] = IN "IN1" OUT "OUT1" +Port[2] = IN "IN2/LSP" OUT "OUT2/Error" +Port[3] = IN "IN3/LSN" OUT "OUT3/Ready" +Port[4] = IN "Index2/CAPI2" OUT "OUT4" +Port[5] = IN "IN5" +Port[6] = IN "IN6" +Port[7] = IN "Index/CAPI" +Port[9] = IN "Hall1" +Port[10] = IN "Hall2" +Port[11] = IN "Hall3" +BrakeOutputs = 0 0, 1 0 +EnabledHomeProcIDs = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33,34,35,37,38,39,40 +HomeInput = 0 +SetupSettings = init_uv_MC3.cfg +IsClosedCurrent = 1 +IsClosedSpeed = 0 +IsClosedPosition = 0 +IsBrushedDC = 1 +isPositionFeedbackOnLoad = 0 +isPositionFeedbackOnMotor = 1 +isSpeedFeedback = 0 +isIndex = 1 +isIndex2 = 1 +isLSP = 1 +isLSN = 1 +IsInputsTypeProgrammable = 1 +hasOscilloscope = 1 +FoEcompatible = 1 +NewDeadband = 1 +DisableExternalDigitalReference = 0 +DisableTacho = 1 +DisableTachoAndEncoder = 0 +DisableMotorTemperature = 0 +MotorName = +DatabaseName = User +ReferenceName = DCET +MotorType = Brushed Motor +LoadPosition = +MotorPosition = Incremental Encoder on Feedback 1 +MotorSpeed = +Sensor[0] = "None" +Sensor[1] = "Incremental Encoder" +Sensor[2] = "Tacho" +Sensor[3] = "Sin/Cos" +Sensor[4] = "SSI" +Sensor[5] = "BiSS C" +Sensor[6] = "EnDat" +Feedback[0] = "Feedback 1" "0,0" "1,1" "3,1" +Feedback[1] = "Feedback 2" "0,0" "1,1" "2,2" "4,1" "5,1" "6,1" +FeedbackOnMotor = 1 2 3 4 5 6 +FeedbackOnLoad = 0 1 3 4 5 6 +FeedbackBlocked = "0,0" +hasNegTransmission = 1 +newSpeedEstimator = 2 +hideEnablePolarity = 1 +HallForSSI = 1 +SSIMaxBits = 56 +SSI_FreqList = "1000" "2000" "3000" +SSI_FreqList_LD = "1000" "2000" "3000" +BiSS_FreqList = "3000" "4000" +BiSS_FreqList_LD = "1000" "2000" "3000" +EnDat_FreqList = "1000" "2000" "3000" "4000" "5000" +EnDat_FreqList_LD = "1000" "2000" "3000" "4000" "5000" +AutotuningElectricValidCheck = In,ImaxM,PWMPER,CLPER +AutotuningMechanicValidCheck = In,ImaxM,PWMPER,SLPER,PositionControlType,ControlMode,MECRESL,TRANSMISSION +AtFiltersDefaultCfg = "V Ts_S 0.00044999999 0.001 " "V FilterMecreslTransmission 2500 20000 " "1 1 C 400" "1 2 C 800" "1 3 D " "2 1 C 400" "2 2 D " "2 3 D " "3 1 C 400" "3 2 C 0" "3 3 C 0" +AD2SelectableRange = 1 +AD5SelectableRange = 1 +AD2AD5LinkedSelectability = 0 +AD2CustomText = +/-10V only with external circuit +AD5CustomText = +/-10V only with external circuit +SSITotalBits = 32 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg new file mode 100644 index 000000000..33eab4665 --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg @@ -0,0 +1,19 @@ +LONG Load_Position [rot] @0x0228 +LONG Motor_Position [rot] @0x0988 +FIXED Load_Speed [rpm] @0x098A %4 +FIXED Motor_Speed [rpm] @0x022C %4 +INT Motor_Current [A] @0x07FC +LONG Target_Position [rot] @0xAF08 +FIXED Target_Speed [rpm] @0x02B4 %4 +FIXED Speed_Reference [rpm] @0x02B4 %4 +FIXED Motor_Speed_Reference [rpm] @0x02F2 %4 +INT Current_Reference [A] @0x0987 +INT Voltage_Reference [V] @0x0232 +INT Position_Error [rot] @0x022A +FIXED Speed_Error [rpm] @0x08C6 %4 +INT Pulse_Dir_Input_Speed [rpm] @0x0820 %4 +LONG Pulse_Dir_Input_Position [rot] @0x081C +UINT DC_Supply_Motor [V ] @0x0240 +UINT Drive_Temperature [C] @0x0243 +INT Error_Register @0x08FC +UINT Analogue_Input @0x0241 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs new file mode 100644 index 0000000000000000000000000000000000000000..ab64a990e8accbeb3084d312d079e9f963a97ab7 GIT binary patch literal 209 zcmZQ#WKdvcWB>w2hX4N=7}yw`olA?#Qkj4v|G_}OF}bibvpBOPGe1wEBr`V^q!<}| zu!rzqG?2&Ulb@cRTExJ>0ydO~!P&hiu^_`OGp8iAh#9K6p`ih2DGV?-P)8g9J2xZW literal 0 HcmV?d00001 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg new file mode 100644 index 000000000..4b165b192 --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg @@ -0,0 +1,8 @@ +ActiveApplication "Untitled Application" +Workspace 0 0 184 98 1186 505 200 +Interpreter 0 0 700 5 500 300 +Logger 0 0 0 100 1024 600 +MultiAxisLogger 1 -1 0 0 -1 -1 +Scope 1 -1 0 0 -1 -1 +Memory 1 -1 0 0 -1 -1 +EsmBuild 2024021502 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/ecmciPOS4808-Init.cmd b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/ecmciPOS4808-Init.cmd new file mode 100644 index 000000000..609c2c89d --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/ecmciPOS4808-Init.cmd @@ -0,0 +1,58 @@ +#-d /** +#-d \brief hardware script for iPOS8020-Init +#-d \details +#-d \author Anders Sandstroem +#-d \file +#-d */ + +############################################################ +############# General: +# This file is only used to download the basic setup to an technosoft drive. +# Normally this is done from Technosoft EasySetup or EasyMotion Studio. +# The setup information can be downloaded via SDO access (after parsing to ecmc format) +# Parsing tool can be found in ecmctraining/V2/startup/hardware/technosoft +# This procedure should only be needed to perform once (new drive or replacing of drive) +# Please ensure that the online cheksum corresponds to the offline checksum (see logfile printouts) +############################################################ + +# ECMC config +# Arguments +# [set by module] +# ECMC_CONFIG_ROOT == $(ecmccfg_DIR) +# ECMC_CONFIG_DB == $(ECMC_config_TEMPLATES) +# [mandatory] +# SYS +# [optional] +# ECMC_VER = 6.0.0 +# EthercatMC_VER = 3.0.0 +# INIT = initAll +# MASTER_ID = 0 +# +# calls initAll by default, which calls init +# calls 'add_master.cmd' +#require ecmccfg develop "SYS=STEST_KN82,SCRIPTEXEC=runScript" + +epicsEnvSet("IOC" ,"${IOC="IOC_TEST"}") + +require ecmccfg sandst_a "MASTER_ID=1" + +############################################################################## +## Config hardware: + +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=6,HW_DESC=iPOS4808BX_VOLT" + +# Download base config (parsed from Techosoft EasySetup configuration): Only needed first time a drive is used.. +${SCRIPTEXEC} ./4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd + +# Apply hardware configuration +ecmcConfigOrDie "Cfg.EcApplyConfig(1)" + +############################################################################## +############# Configure diagnostics: + +ecmcConfigOrDie "Cfg.EcSetDiagnostics(1)" +ecmcConfigOrDie "Cfg.EcEnablePrintouts(0)" +ecmcConfigOrDie "Cfg.EcSetDomainFailedCyclesLimit(100)" + +# go active +${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.s.zip b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.s.zip new file mode 100644 index 0000000000000000000000000000000000000000..eb8be9ae33bd25d07c71922c2f8bca2d65b1965b GIT binary patch literal 35976 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%0AxFHzdr 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 DHKRoI literal 0 HcmV?d00001 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.sw b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.sw new file mode 100644 index 000000000..f94e4deca --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.sw @@ -0,0 +1,1306 @@ +7ABF +649C +2E45 +16E +198 +1E5 +252 +8CA +250 +2 +251 +14 +257 +2000 +98D +0 +928 +0 +253 +1E1E +299 +7837 +29A +D227 +29B +1B85 +986 +3FFC +98C +9B6 +254 +A3D +8CC +0 +917 +0 +28C +0 +913 +0 +300 +9100 +304 +1F +302 +6206 +303 +BB +912 +4504 +272 +5 +271 +50D5 +274 +3 +273 +45B6 +275 +A3D +276 +A3D +982 +7FFF +223 +0 +26F +7FFF +268 +9 +267 +501F +26A +1 +269 +7CBA +26C +75C2 +26B +6667 +25F +0 +25E +4135 +261 +0 +260 +22C +263 +3 +262 +5182 +264 +3FFF +266 +7AE0 +265 +6667 +292 +0 +26D +0 +291 +0 +270 +0 +26E +0 +295 +1709 +2C4 +A +2C5 +3E8 +2C6 +BB8 +879 +3E +87A +BB8 +298 +7FFF +818 +CCC +819 +8BD +25D +0 +25C +151 +246 +7FF8 +249 +0 +29D +63E +86F +0 +876 +0 +255 +1 +256 +1 +28A +7D17 +90C +8 +90A +E000 +90B +C00F +95C +1F40 +953 +64 +36A +3E8 +36B +1 +857 +3FBB +832 +0 +2FB +1 +AF28 +0 +AF29 +0 +2FA +B40 +855 +0 +854 +2327 +841 +5 +842 +1 +843 +D +844 +C +845 +0 +846 +2C +2F9 +1 +AF06 +0 +AF07 +0 +847 +2 +9E9 +5643 +9B6 +0 +201 +5002 +2A7 +3CE +823 +2 +806 +3 +286 +1600 +9F9 +0 +9FA +0 +9F6 +0 +9F7 +0 +9F4 +0 +9F5 +0 +B7E0 +B000 +B7E1 +0 +B7E2 +E +B7E3 +0 +B7E4 +0 +B7E5 +64 +B7E6 +25E +B7E7 +25F +B7E8 +260 +B7E9 +261 +B7EA +262 +B7EB +263 +B7EC +266 +B7ED +267 +B7EE +268 +B7EF +269 +B7F0 +26A +B7F1 +26C +B7D6 +2B4 +AF36 +4000 +BE8A +4000 +AF10 +0 +7FA +7993 +80C +0 +80D +1 +9DE +0 +881 +2 +880 +4 +999 +1A0 +99A +90BA +9FC +0 +9FD +FFFF +805 +0 +916 +0 +289 +23B +9F8 +64 +39F +0 +8AC +0 +8AD +0 +9F0 +1 +932 +3 +B9F2 +0 +9FF +64 +9DD +7FFF +99C +3E8 +99D +230 +947 +3E8 +948 +0 +AF04 +0 +AF05 +0 +AF0A +0 +AF19 +1 +AF24 +8000 +AF18 +1 +B7DC +32C8 +AF2F +7FFF +AF6F +0 +BFEC +0 +BFED +0 +AF7E +0 +AF7F +0 +AF78 +1B +AF73 +0 +926 +0 +965 +FFFF +AF82 +0 +AF9A +3 +AF9B +0 +AF79 +0 +AF7A +0 +AF7B +7FFF +AF83 +0 +AF8A +0 +AF72 +0 +AF9D +2402 +980 +95C3 +70 +24E +7D0 +0 +24C +C49C +20 +9E0 +3E8 +0 +814 +A02C +11 +2A2 +2EE0 +3 +2A0 +0 +64 +2AC +0 +1 +9CA +2726 +1813 +9CC +3817 +908 +9CE +A +0 +9D0 +0 +0 +9D2 +8B96 +A49B +9D4 +0 +0 +9D6 +0 +0 +9D8 +0 +0 +386 +1 +0 +388 +1 +0 +38A +2000 +0 +38C +7D +0 +38E +1 +0 +390 +3E8 +0 +392 +1 +0 +394 +1 +0 +88A +0 +8000 +88C +FFFF +7FFF +7F0 +1000 +800 +7F2 +FFFF +122A +7F4 +30B3 +2 +7F6 +808 +800 +7F8 +A080 +0 +918 +0 +0 +B7CC +0 +0 +BE80 +5C29 +28F +BE82 +0 +0 +BE84 +A +0 +BE86 +0 +0 +BE88 +0 +0 +BF00 +4B86 +3F92 +BF02 +5285 +3ED3 +BF04 +9012 +3F23 +BF06 +9014 +3FA3 +BF08 +9014 +3F23 +BF0C +0 +0 +BF0E +0 +0 +BF10 +0 +0 +BF12 +0 +0 +BF14 +0 +0 +BF18 +0 +0 +BF1A +0 +0 +BF1C +0 +0 +BF1E +0 +0 +BF20 +0 +0 +BF24 +0 +0 +BF26 +0 +0 +BF28 +0 +0 +BF2A +0 +0 +BF2C +0 +0 +BF30 +0 +0 +BF32 +0 +0 +BF34 +0 +0 +BF36 +0 +0 +BF38 +0 +0 +BF3C +0 +0 +BF3E +0 +0 +BF40 +0 +0 +BF42 +0 +0 +BF44 +0 +0 +BF48 +0 +0 +BF4A +0 +0 +BF4C +0 +0 +BF4E +0 +0 +BF50 +0 +0 +BF54 +0 +0 +BF56 +0 +0 +BF58 +0 +0 +BF5A +0 +0 +BF5C +0 +0 +BF60 +0 +0 +BF62 +0 +0 +BF64 +0 +0 +BF66 +0 +0 +BF68 +0 +0 +BF6C +0 +0 +BF6E +0 +0 +BF70 +0 +0 +BF72 +0 +0 +BF74 +0 +0 +8C8 +0 +0 +8B0 +3E8 +0 +8B2 +FA0 +0 +8C0 +FC35 +3E7 +37C +0 +1 +992 +0 +0 +3A4 +0 +1 +3A2 +0 +1 +3A6 +199A +0 +BFF8 +0 +0 +BFFA +0 +0 +BFFC +0 +0 +BFFE +0 +0 +AF00 +0 +0 +AF02 +0 +0 +AF1A +92EF +BF46 +AF1C +0 +0 +AF1E +B445 +3DE5 +AF20 +B445 +3DE5 +AF22 +0 +0 +BFDC +7043 +3F02 +BFDE +3822 +3F41 +BFE2 +7043 +3F02 +BFE4 +3822 +3F41 +BFE8 +0 +0 +BFEA +0 +0 +BAAE +7D0 +0 +BAB0 +1 +0 +BAB6 +7D0 +0 +BAB8 +1 +0 +BAB2 +1 +0 +BAB4 +1 +0 +BACA +1 +0 +BACC +1 +0 +BAA2 +1 +0 +BAA4 +1 +0 +BAAA +1 +0 +BAAC +3E8 +0 +BAA6 +1 +0 +BAA8 +1 +0 +BABE +100 +B5 +BAC0 +0 +0 +BAC2 +0 +0 +BAC4 +0 +0 +AF80 +0 +0 +AF94 +0 +0 +AF70 +9C40 +0 +AF98 +0 +0 +8000 +A950 +4CAB +806E +0 +8002 +0 +40A0 +80A5 +3333 +4053 +8058 +1000 +804E +0 +4140 +804F +0 +42A4 +8050 +0 +4100 +8051 +0 +4220 +8053 +0 +41A0 +8052 +0 +4220 +8054 +999A +42CC +8056 +D70A +3C23 +8057 +0 +3F00 +8001 +1 +8016 +0 +4240 +8060 +0 +4100 +8061 +0 +4080 +8064 +D70A +3D23 +8065 +F50A +4048 +8066 +20FB +3B17 +8067 +ED8D +A0B5 +C6F7 +3EE0 +8068 +0 +806A +1F4 +0 +80B2 +1F4 +0 +80AA +C5AC +36A7 +80A0 +9BA6 +3D44 +80A6 +0 +80A7 +FDB +40C9 +80A8 +FDB +40C9 +8073 +0 +3F80 +8074 +0 +447A +8075 +0 +457A +8076 +0 +44FA +8077 +597C +4644 +800B +0 +3F80 +800C +0 +41F0 +800D +0 +43C8 +801A +0 +42C8 +807D +D4A +4768 +B77C +3E91 +8036 +1 +803D +FDB +42C9 +803B +0 +3F00 +803A +0 +3F00 +8039 +CCCD +3DCC +8038 +CCCD +3DCC +8037 +1 +800E +0 +3F80 +800F +0 +41F0 +8010 +0 +43C8 +801B +0 +42C8 +8080 +1 +8047 +FDB +4149 +804D +CCCD +3E4C +804C +CCCD +3E4C +804B +999A +3E99 +804A +999A +3E99 +8081 +1 +809A +C5AC +36A7 +809B +C5AC +36A7 +8003 +37BD +3706 +8004 +C5AC +3727 +8005 +B717 +37D1 +8006 +B717 +3851 +8017 +B694 +5B46 +ADA3 +4091 +8018 +0 +0 +810A +1 +810B +1 +8013 +0 +801D +0 +801E +1 +801C +1 +80B9 +1 +80BA +1 +80BB +B439 +76C8 +9FBE +3FE6 +80BC +0 +0 +0 +4079 +80BD +0 +80BE +1 +80BF +D1B +2DE0 +A090 +3FE6 +80C0 +0 +0 +3000 +407F +80C1 +0 +80C2 +1 +80C3 +D1B +2DE0 +A090 +3FE6 +80C4 +0 +0 +3000 +407F +80D5 +1 +80D6 +0 +80D7 +0 +80D8 +0 +0 +0 +4079 +80D9 +0 +0 +0 +4079 +80DA +0 +0 +4000 +407F +80DB +0 +80DC +0 +80DD +0 +80DE +0 +80DF +0 +80E0 +0 +80E1 +0 +80E2 +0 +0 +4000 +407F +80E3 +0 +0 +4000 +407F +80E4 +0 +0 +4000 +407F +80E5 +0 +0 +4000 +407F +80E6 +0 +0 +4000 +407F +80E7 +0 +0 +4000 +407F +80E8 +0 +0 +4000 +407F +80E9 +0 +80EA +1 +80EB +D1B +2DE0 +A090 +3FE6 +80EC +0 +0 +3000 +407F +80ED +0 +80EE +1 +80EF +D1B +2DE0 +A090 +3FE6 +80F0 +0 +0 +3000 +407F +80F1 +0 +80F2 +1 +80F3 +D1B +2DE0 +A090 +3FE6 +80F4 +0 +0 +3000 +407F +80F5 +0 +80F6 +1 +80F7 +D1B +2DE0 +A090 +3FE6 +80F8 +0 +0 +3000 +407F +80F9 +0 +80FA +1 +80FB +D1B +2DE0 +A090 +3FE6 +80FC +0 +0 +3000 +407F +80FD +0 +80FE +1 +80FF +D1B +2DE0 +A090 +3FE6 +8100 +0 +0 +3000 +407F +8101 +0 +8102 +1 +8103 +D1B +2DE0 +A090 +3FE6 +8104 +0 +0 +3000 +407F +8009 +2 +800A +0 +80A1 +0 +8084 +0 +8085 +0 +80C5 +0 +80C6 +B439 +76C8 +9FBE +3FE6 +80C7 +0 +0 +0 +4079 +80C8 +0 +0 +0 +4079 +8105 +432D +EB1C +36E2 +3F2A +8114 +0 +8024 +CB +8025 +BA +8026 +E1 +8027 +235 +8020 +0 +8021 +0 +8022 +0 +8023 +0 +8110 +0 +40A0 +8111 +0 +4120 +8112 +0 +40A0 +8113 +0 +4120 +8106 +0 +43C8 +8107 +0 +43C8 +C496 + +7FBF +50 +30 +32 +39 +30 +32 +36 +45 +32 +32 +31 +46 +35 +31 +35 +4B +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +389 +FE4B +FAA2 + +7FFF +7ABF + diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd new file mode 100644 index 000000000..845e26cdc --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd @@ -0,0 +1,2670 @@ +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE.sw +# Block start adress: 0x7abf +# Output file name: DC48V_TRQ_MODE.cmd +# Date: 2024/06/21 08:26:02 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x7ABF0008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x649C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2E45,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x16E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x198,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1E5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x252,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8CA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x250,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x251,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x14,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x257,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x98D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x928,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x253,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1E1E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x299,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7837,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x29A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD227,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x29B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1B85,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x986,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FFC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x98C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9B6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x254,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA3D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x917,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x28C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x913,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x300,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x304,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x302,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x6206,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x303,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x912,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4104,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x272,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x271,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x274,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x273,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x275,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA3D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x276,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA3D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x982,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x223,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x268,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x267,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x501F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x269,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7CBA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x75C2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x6667,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4135,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x261,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x260,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x22C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x263,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x262,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5182,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x264,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x266,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7AE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x265,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x6667,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x292,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x291,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x270,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x295,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1709,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBB8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x879,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x87A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBB8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x298,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x818,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x819,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8BD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x151,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x246,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FF8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x249,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x29D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x63E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x86F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x876,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x255,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x256,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x28A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D17,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xE000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC00F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x95C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x953,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x857,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FBB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x832,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF28,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF29,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x855,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x854,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2327,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x841,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x842,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x843,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x844,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x845,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x846,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2F9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF06,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF07,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x847,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9E9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5643,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9B6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x201,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5002,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3CE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x823,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x806,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x286,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1600,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x260,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x261,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x262,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x263,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x266,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7ED,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x267,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x268,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x269,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7F1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7D6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2B4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF36,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE8A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF10,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7993,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9DE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x881,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x880,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x99A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90BA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x805,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x916,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x289,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x23B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x39F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8AD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x932,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB9F2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9DD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x99C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x99D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x230,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x947,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x948,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF04,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF05,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF0A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF19,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF24,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF18,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7DC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF2F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF6F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFEC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFED,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF78,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF73,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x926,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x965,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF82,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF9A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF9B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF79,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF83,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF8A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF72,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF9D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2402,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x980,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x95C3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x70,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x24E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x24C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC49C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9E0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x814,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA02C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x11,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2EE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9CA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2726,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1813,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3817,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x908,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9CE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8B96,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA49B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x386,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x388,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x38A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x38C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x38E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x390,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x392,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x394,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x88A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x88C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x122A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x30B3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x808,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA080,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x918,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5C29,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x28F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE82,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE84,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE86,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE88,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4B86,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F92,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5285,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3ED3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF04,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9012,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF06,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9014,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FA3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF08,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9014,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF0C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF0E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF10,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF12,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF14,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF18,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF1A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF1C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF1E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF24,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF26,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF28,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF2A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF2C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF30,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF34,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF36,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF38,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF3C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF3E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF42,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF44,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF48,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF4A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF4C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF4E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF50,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF54,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF56,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF58,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF5A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF5C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF60,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF62,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF66,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF68,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF6C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF6E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF70,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF72,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF74,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8B0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8B2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFA0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFC35,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x37C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x992,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3A4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3A2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3A6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x199A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFF8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFFA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFFC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFFE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF1A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x92EF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF46,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF1C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF1E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB445,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DE5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB445,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DE5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF22,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFDC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7043,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFDE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3822,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F41,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFE2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7043,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFE4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3822,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F41,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFE8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFEA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAAE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBACA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBACC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAAA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAAC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBABE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAC0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAC2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAC4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF94,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF70,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9C40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF98,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA950,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4CAB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x806E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8002,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3333,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4053,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8058,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4140,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42A4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8050,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8051,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4220,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8053,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x41A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8052,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4220,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8054,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8056,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD70A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3C23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8057,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8001,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8016,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4240,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8060,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8061,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4080,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8064,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD70A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3D23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8065,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xF50A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4048,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8066,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x20FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3B17,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8067,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xED8D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA0B5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC6F7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3EE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8068,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x806A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80B2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80AA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9BA6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3D44,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8073,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8074,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x447A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8075,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x457A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8076,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x44FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8077,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x597C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4644,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x41F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x807D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD4A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4768,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB77C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E91,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8036,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x803D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x803B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x803A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8039,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DCC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8038,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DCC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8037,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x41F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8010,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8080,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8047,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4149,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E4C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E4C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E99,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E99,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8081,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x809A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x809B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8003,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x37BD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3706,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8004,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3727,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8005,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB717,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x37D1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8006,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB717,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3851,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8017,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB694,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5B46,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xADA3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4091,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8018,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x810A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x810B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8013,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80B9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB439,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x76C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FBE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80ED,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8101,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8102,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8103,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8104,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8009,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8084,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8085,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB439,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x76C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FBE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8105,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x432D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xEB1C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36E2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F2A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8114,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8024,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8025,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8026,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xE1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8027,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x235,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8020,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8021,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8022,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8023,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8110,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8111,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4120,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8112,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8113,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4120,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8106,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8107,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A03,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x7abf:0x7faf): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x7faf7abf,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 1265 +# Offline calculated checksum: 0x5406 (21510) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0x5406,2)" +######################################################### + +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE.sw +# Block start adress: 0x7fbf +# Output file name: DC48V_TRQ_MODE.cmd +# Date: 2024/06/21 08:26:02 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x7FBF0008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x50,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x30,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x39,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x30,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x45,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x31,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x46,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x35,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x31,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x35,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x389,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFE4B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFAA2,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x7fbf:0x7fe0): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x7fe07fbf,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 34 +# Offline calculated checksum: 0xffff (65535) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0xffff,2)" +######################################################### + +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE.sw +# Block start adress: 0x7fff +# Output file name: DC48V_TRQ_MODE.cmd +# Date: 2024/06/21 08:26:02 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x7FFF0008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7ABF,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x7fff:0x7fff): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x7fff7fff,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 1 +# Offline calculated checksum: 0x7abf (31423) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0x7abf,2)" +######################################################### + +# Reset drive to apply settings: +# NOTE: Reset drive command will return error -5 since no repsonse is sent back to the master! The drive will be reset anyway! +ecmcConfig "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2080,0x0,1,2)" +epicsThreadSleep(0.01) diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.s.zip b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.s.zip new file mode 100644 index 0000000000000000000000000000000000000000..1faa5b57ed493a2a9c910a564cd3df30046c63cd GIT binary patch literal 36000 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 literal 0 HcmV?d00001 diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw new file mode 100644 index 000000000..d376d472a --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw @@ -0,0 +1,1306 @@ +7ABF +649C +2E45 +16E +198 +1E5 +252 +8CA +250 +2 +251 +14 +257 +2000 +98D +0 +928 +0 +253 +1E1E +299 +7837 +29A +D227 +29B +1B85 +986 +3FFC +98C +9B6 +254 +A3D +8CC +0 +917 +0 +28C +0 +913 +0 +300 +9100 +304 +1F +302 +6206 +303 +BB +912 +4104 +272 +0 +271 +0 +274 +0 +273 +0 +275 +A3D +276 +A3D +982 +7FFF +223 +0 +26F +7FFF +268 +9 +267 +501F +26A +1 +269 +7CBA +26C +75C2 +26B +6667 +25F +0 +25E +4135 +261 +0 +260 +22C +263 +3 +262 +5182 +264 +3FFF +266 +7AE0 +265 +6667 +292 +0 +26D +0 +291 +0 +270 +0 +26E +0 +295 +1709 +2C4 +A +2C5 +3E8 +2C6 +BB8 +879 +3E +87A +BB8 +298 +7FFF +818 +CCC +819 +8BD +25D +0 +25C +151 +246 +7FF8 +249 +0 +29D +63E +86F +0 +876 +0 +255 +1 +256 +1 +28A +7D17 +90C +8 +90A +E000 +90B +C00F +95C +1F40 +953 +64 +36A +3E8 +36B +1 +857 +3FBB +832 +0 +2FB +1 +AF28 +0 +AF29 +0 +2FA +B40 +855 +0 +854 +2327 +841 +5 +842 +1 +843 +D +844 +C +845 +0 +846 +2C +2F9 +1 +AF06 +0 +AF07 +0 +847 +2 +9E9 +5643 +9B6 +0 +201 +5002 +2A7 +3CE +823 +2 +806 +3 +286 +1600 +9F9 +0 +9FA +0 +9F6 +0 +9F7 +0 +9F4 +0 +9F5 +0 +B7E0 +B000 +B7E1 +0 +B7E2 +E +B7E3 +0 +B7E4 +0 +B7E5 +64 +B7E6 +25E +B7E7 +25F +B7E8 +260 +B7E9 +261 +B7EA +262 +B7EB +263 +B7EC +266 +B7ED +267 +B7EE +268 +B7EF +269 +B7F0 +26A +B7F1 +26C +B7D6 +2B4 +AF36 +4000 +BE8A +4000 +AF10 +0 +7FA +7993 +80C +0 +80D +1 +9DE +0 +881 +2 +880 +4 +999 +1A0 +99A +90BA +9FC +0 +9FD +FFFF +805 +0 +916 +0 +289 +23B +9F8 +64 +39F +0 +8AC +0 +8AD +0 +9F0 +1 +932 +3 +B9F2 +0 +9FF +64 +9DD +7FFF +99C +3E8 +99D +230 +947 +3E8 +948 +0 +AF04 +0 +AF05 +0 +AF0A +0 +AF19 +1 +AF24 +8000 +AF18 +1 +B7DC +32C8 +AF2F +7FFF +AF6F +0 +BFEC +0 +BFED +0 +AF7E +0 +AF7F +0 +AF78 +1B +AF73 +0 +926 +0 +965 +FFFF +AF82 +0 +AF9A +3 +AF9B +0 +AF79 +0 +AF7A +0 +AF7B +7FFF +AF83 +0 +AF8A +0 +AF72 +0 +AF9D +2402 +980 +95C3 +70 +24E +7D0 +0 +24C +C49C +20 +9E0 +3E8 +0 +814 +A02C +11 +2A2 +2EE0 +3 +2A0 +0 +64 +2AC +0 +1 +9CA +2726 +1813 +9CC +3817 +908 +9CE +A +0 +9D0 +0 +0 +9D2 +8B96 +A49B +9D4 +0 +0 +9D6 +0 +0 +9D8 +0 +0 +386 +1 +0 +388 +1 +0 +38A +2000 +0 +38C +7D +0 +38E +1 +0 +390 +3E8 +0 +392 +1 +0 +394 +1 +0 +88A +0 +8000 +88C +FFFF +7FFF +7F0 +1000 +800 +7F2 +FFFF +122A +7F4 +30B3 +2 +7F6 +808 +800 +7F8 +A080 +0 +918 +0 +0 +B7CC +0 +0 +BE80 +5C29 +28F +BE82 +0 +0 +BE84 +A +0 +BE86 +0 +0 +BE88 +0 +0 +BF00 +4B86 +3F92 +BF02 +5285 +3ED3 +BF04 +9012 +3F23 +BF06 +9014 +3FA3 +BF08 +9014 +3F23 +BF0C +0 +0 +BF0E +0 +0 +BF10 +0 +0 +BF12 +0 +0 +BF14 +0 +0 +BF18 +0 +0 +BF1A +0 +0 +BF1C +0 +0 +BF1E +0 +0 +BF20 +0 +0 +BF24 +0 +0 +BF26 +0 +0 +BF28 +0 +0 +BF2A +0 +0 +BF2C +0 +0 +BF30 +0 +0 +BF32 +0 +0 +BF34 +0 +0 +BF36 +0 +0 +BF38 +0 +0 +BF3C +0 +0 +BF3E +0 +0 +BF40 +0 +0 +BF42 +0 +0 +BF44 +0 +0 +BF48 +0 +0 +BF4A +0 +0 +BF4C +0 +0 +BF4E +0 +0 +BF50 +0 +0 +BF54 +0 +0 +BF56 +0 +0 +BF58 +0 +0 +BF5A +0 +0 +BF5C +0 +0 +BF60 +0 +0 +BF62 +0 +0 +BF64 +0 +0 +BF66 +0 +0 +BF68 +0 +0 +BF6C +0 +0 +BF6E +0 +0 +BF70 +0 +0 +BF72 +0 +0 +BF74 +0 +0 +8C8 +0 +0 +8B0 +3E8 +0 +8B2 +FA0 +0 +8C0 +FC35 +3E7 +37C +0 +1 +992 +0 +0 +3A4 +0 +1 +3A2 +0 +1 +3A6 +199A +0 +BFF8 +0 +0 +BFFA +0 +0 +BFFC +0 +0 +BFFE +0 +0 +AF00 +0 +0 +AF02 +0 +0 +AF1A +92EF +BF46 +AF1C +0 +0 +AF1E +B445 +3DE5 +AF20 +B445 +3DE5 +AF22 +0 +0 +BFDC +7043 +3F02 +BFDE +3822 +3F41 +BFE2 +7043 +3F02 +BFE4 +3822 +3F41 +BFE8 +0 +0 +BFEA +0 +0 +BAAE +7D0 +0 +BAB0 +1 +0 +BAB6 +7D0 +0 +BAB8 +1 +0 +BAB2 +1 +0 +BAB4 +1 +0 +BACA +1 +0 +BACC +1 +0 +BAA2 +1 +0 +BAA4 +1 +0 +BAAA +1 +0 +BAAC +3E8 +0 +BAA6 +1 +0 +BAA8 +1 +0 +BABE +100 +B5 +BAC0 +0 +0 +BAC2 +0 +0 +BAC4 +0 +0 +AF80 +0 +0 +AF94 +0 +0 +AF70 +9C40 +0 +AF98 +0 +0 +8000 +A950 +4CAB +806E +0 +8002 +0 +40A0 +80A5 +3333 +4053 +8058 +1000 +804E +0 +4140 +804F +0 +42A4 +8050 +0 +4100 +8051 +0 +4220 +8053 +0 +41A0 +8052 +0 +4220 +8054 +999A +42CC +8056 +D70A +3C23 +8057 +0 +3F00 +8001 +1 +8016 +0 +4240 +8060 +0 +4100 +8061 +0 +4080 +8064 +D70A +3D23 +8065 +F50A +4048 +8066 +20FB +3B17 +8067 +ED8D +A0B5 +C6F7 +3EE0 +8068 +0 +806A +1F4 +0 +80B2 +1F4 +0 +80AA +C5AC +36A7 +80A0 +9BA6 +3D44 +80A6 +0 +80A7 +FDB +40C9 +80A8 +FDB +40C9 +8073 +0 +3F80 +8074 +0 +447A +8075 +0 +457A +8076 +0 +44FA +8077 +597C +4644 +800B +0 +3F80 +800C +0 +41F0 +800D +0 +43C8 +801A +0 +42C8 +807D +D4A +4768 +B77C +3E91 +8036 +1 +803D +FDB +42C9 +803B +0 +3F00 +803A +0 +3F00 +8039 +CCCD +3DCC +8038 +CCCD +3DCC +8037 +1 +800E +0 +3F80 +800F +0 +41F0 +8010 +0 +43C8 +801B +0 +42C8 +8080 +1 +8047 +FDB +4149 +804D +CCCD +3E4C +804C +CCCD +3E4C +804B +999A +3E99 +804A +999A +3E99 +8081 +1 +809A +C5AC +36A7 +809B +C5AC +36A7 +8003 +37BD +3706 +8004 +C5AC +3727 +8005 +B717 +37D1 +8006 +B717 +3851 +8017 +B694 +5B46 +ADA3 +4091 +8018 +0 +0 +810A +1 +810B +1 +8013 +0 +801D +0 +801E +1 +801C +1 +80B9 +1 +80BA +1 +80BB +B439 +76C8 +9FBE +3FE6 +80BC +0 +0 +0 +4079 +80BD +0 +80BE +1 +80BF +D1B +2DE0 +A090 +3FE6 +80C0 +0 +0 +3000 +407F +80C1 +0 +80C2 +1 +80C3 +D1B +2DE0 +A090 +3FE6 +80C4 +0 +0 +3000 +407F +80D5 +1 +80D6 +0 +80D7 +0 +80D8 +0 +0 +0 +4079 +80D9 +0 +0 +0 +4079 +80DA +0 +0 +4000 +407F +80DB +0 +80DC +0 +80DD +0 +80DE +0 +80DF +0 +80E0 +0 +80E1 +0 +80E2 +0 +0 +4000 +407F +80E3 +0 +0 +4000 +407F +80E4 +0 +0 +4000 +407F +80E5 +0 +0 +4000 +407F +80E6 +0 +0 +4000 +407F +80E7 +0 +0 +4000 +407F +80E8 +0 +0 +4000 +407F +80E9 +0 +80EA +1 +80EB +D1B +2DE0 +A090 +3FE6 +80EC +0 +0 +3000 +407F +80ED +0 +80EE +1 +80EF +D1B +2DE0 +A090 +3FE6 +80F0 +0 +0 +3000 +407F +80F1 +0 +80F2 +1 +80F3 +D1B +2DE0 +A090 +3FE6 +80F4 +0 +0 +3000 +407F +80F5 +0 +80F6 +1 +80F7 +D1B +2DE0 +A090 +3FE6 +80F8 +0 +0 +3000 +407F +80F9 +0 +80FA +1 +80FB +D1B +2DE0 +A090 +3FE6 +80FC +0 +0 +3000 +407F +80FD +0 +80FE +1 +80FF +D1B +2DE0 +A090 +3FE6 +8100 +0 +0 +3000 +407F +8101 +0 +8102 +1 +8103 +D1B +2DE0 +A090 +3FE6 +8104 +0 +0 +3000 +407F +8009 +2 +800A +0 +80A1 +0 +8084 +0 +8085 +0 +80C5 +0 +80C6 +B439 +76C8 +9FBE +3FE6 +80C7 +0 +0 +0 +4079 +80C8 +0 +0 +0 +4079 +8105 +432D +EB1C +36E2 +3F2A +8114 +0 +8024 +CB +8025 +BA +8026 +E1 +8027 +235 +8020 +0 +8021 +0 +8022 +0 +8023 +0 +8110 +0 +40A0 +8111 +0 +4120 +8112 +0 +40A0 +8113 +0 +4120 +8106 +0 +43C8 +8107 +0 +43C8 +2A03 + +7FBF +50 +30 +32 +39 +30 +32 +36 +45 +32 +32 +31 +46 +35 +31 +35 +4B +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +389 +FE4B +FAA2 + +7FFF +7ABF + diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.cmd b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.cmd new file mode 100644 index 000000000..fe911b6ff --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.cmd @@ -0,0 +1,2770 @@ +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE_plus_TMLCode.sw +# Block start adress: 0x7abf +# Output file name: DC48V_TRQ_MODE_plus_TMLCode.cmd +# Date: 2024/06/21 08:36:44 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x7ABF0008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x649C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2E45,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x16E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x198,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1E5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x252,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8CA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x250,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x251,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x14,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x257,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x98D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x928,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x253,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1E1E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x299,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7837,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x29A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD227,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x29B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1B85,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x986,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FFC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x98C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9B6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x254,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA3D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x917,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x28C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x913,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x300,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x304,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x302,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x6206,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x303,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x912,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4104,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x272,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x271,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x274,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x273,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x275,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA3D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x276,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA3D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x982,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x223,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x268,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x267,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x501F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x269,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7CBA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x75C2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x6667,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4135,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x261,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x260,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x22C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x263,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x262,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5182,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x264,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x266,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7AE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x265,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x6667,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x292,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x291,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x270,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x295,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1709,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBB8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x879,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x87A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBB8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x298,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x818,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x819,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8BD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x151,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x246,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FF8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x249,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x29D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x63E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x86F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x876,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x255,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x256,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x28A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D17,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xE000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC00F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x95C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x953,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x857,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FBB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x832,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF28,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF29,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x855,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x854,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2327,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x841,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x842,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x843,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x844,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x845,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x846,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2F9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF06,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF07,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x847,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9E9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5643,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9B6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x201,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5002,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3CE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x823,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x806,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x286,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1600,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x25F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x260,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7E9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x261,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x262,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x263,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x266,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7ED,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x267,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x268,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7EF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x269,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7F1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x26C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7D6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2B4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF36,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE8A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF10,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7993,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9DE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x881,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x880,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x99A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x90BA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x805,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x916,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x289,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x23B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x39F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8AD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x932,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB9F2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9DD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x99C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x99D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x230,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x947,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x948,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF04,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF05,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF0A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF19,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF24,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF18,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7DC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF2F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF6F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFEC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFED,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF78,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF73,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x926,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x965,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF82,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF9A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF9B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF79,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF7B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF83,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF8A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF72,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF9D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2402,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x980,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x95C3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x70,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x24E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x24C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC49C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9E0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x814,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA02C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x11,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2EE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9CA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2726,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1813,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3817,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x908,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9CE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8B96,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA49B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9D8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x386,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x388,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x38A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x38C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x38E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x390,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x392,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x394,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x88A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x88C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7FFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x122A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x30B3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x808,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7F8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA080,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x918,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB7CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5C29,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x28F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE82,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE84,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE86,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBE88,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4B86,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F92,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5285,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3ED3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF04,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9012,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF06,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9014,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FA3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF08,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9014,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF0C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF0E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF10,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF12,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF14,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF18,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF1A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF1C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF1E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF24,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF26,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF28,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF2A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF2C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF30,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF34,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF36,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF38,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF3C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF3E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF42,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF44,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF48,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF4A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF4C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF4E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF50,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF54,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF56,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF58,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF5A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF5C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF60,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF62,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF64,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF66,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF68,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF6C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF6E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF70,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF72,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF74,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8B0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8B2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFA0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFC35,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x37C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x992,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3A4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3A2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3A6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x199A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFF8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFFA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFFC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFFE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF1A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x92EF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBF46,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF1C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF1E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB445,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DE5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB445,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DE5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF22,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFDC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7043,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFDE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3822,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F41,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFE2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7043,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F02,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFE4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3822,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F41,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFE8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBFEA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAAE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7D0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAB4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBACA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBACC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAAA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAAC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAA8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBABE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAC0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAC2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBAC4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF94,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF70,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9C40,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xAF98,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA950,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4CAB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x806E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8002,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3333,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4053,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8058,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4140,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42A4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8050,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8051,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4220,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8053,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x41A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8052,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4220,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8054,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42CC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8056,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD70A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3C23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8057,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8001,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8016,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4240,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8060,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8061,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4080,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8064,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD70A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3D23,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8065,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xF50A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4048,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8066,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x20FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3B17,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8067,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xED8D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA0B5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC6F7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3EE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8068,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x806A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80B2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80AA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9BA6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3D44,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8073,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8074,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x447A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8075,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x457A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8076,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x44FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8077,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x597C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4644,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x41F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x807D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD4A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4768,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB77C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E91,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8036,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x803D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x803B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x803A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F00,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8039,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DCC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8038,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3DCC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8037,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F80,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x41F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8010,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x42C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8080,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8047,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFDB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4149,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E4C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCCCD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E4C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E99,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x804A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x999A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3E99,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8081,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x809A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x809B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36A7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8003,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x37BD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3706,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8004,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xC5AC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3727,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8005,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB717,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x37D1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8006,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB717,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3851,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8017,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB694,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5B46,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xADA3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4091,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8018,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x810A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x810B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8013,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x801C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80B9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB439,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x76C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FBE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80BF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80D9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80DF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80E9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80ED,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80EF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F3,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F4,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80F9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FC,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FD,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80FF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8100,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8101,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8102,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8103,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xD1B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2DE0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xA090,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8104,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x407F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8009,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x800A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80A1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8084,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8085,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C5,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB439,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x76C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9FBE,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3FE6,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C7,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x80C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4079,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8105,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x432D,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xEB1C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36E2,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x3F2A,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8114,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8024,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xCB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8025,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xBA,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8026,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xE1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8027,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x235,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8020,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8021,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8022,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8023,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8110,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8111,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4120,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8112,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x40A0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8113,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4120,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8106,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8107,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x43C8,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2A03,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x7abf:0x7faf): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x7faf7abf,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 1265 +# Offline calculated checksum: 0x5406 (21510) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0x5406,2)" +######################################################### + +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE_plus_TMLCode.sw +# Block start adress: 0x7fbf +# Output file name: DC48V_TRQ_MODE_plus_TMLCode.cmd +# Date: 2024/06/21 08:36:44 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x7FBF0008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x50,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x30,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x39,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x30,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x36,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x45,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x32,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x31,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x46,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x35,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x31,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x35,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x389,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFE4B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFAA2,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x7fbf:0x7fe0): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x7fe07fbf,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 34 +# Offline calculated checksum: 0xffff (65535) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0xffff,2)" +######################################################### + +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE_plus_TMLCode.sw +# Block start adress: 0x7fff +# Output file name: DC48V_TRQ_MODE_plus_TMLCode.cmd +# Date: 2024/06/21 08:36:44 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x7FFF0008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7ABF,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x7fff:0x7fff): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x7fff7fff,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 1 +# Offline calculated checksum: 0x7abf (31423) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0x7abf,2)" +######################################################### + +######################################################### +# Parsing of Technosoft setup-file to ECMC format. +# Input file name: DC48V_TRQ_MODE_plus_TMLCode.sw +# Block start adress: 0x4000 +# Output file name: DC48V_TRQ_MODE_plus_TMLCode.cmd +# Date: 2024/06/21 08:36:44 +######################################################### + +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x40000008,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x649C,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x23C9,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4014,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x23BF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x4013,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2398,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x400B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x74C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x9C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x400B,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x404,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5A57,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFFFF,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x20,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x7484,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x2FB,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x400F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x102,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x1,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x401E,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5909,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xFF3F,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x5909,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0xB0C0,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x8000,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x108,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x404,4)" +epicsThreadSleep(0.01) +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2065,0x0,0x0,4)" +epicsThreadSleep(0.01) +# Setup drive to calculate online checksum (0x4000:0x4026): +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2069,0x0,0x40264000,4)" +epicsThreadSleep(0.01) + +######################################################### +# Total number of lines parsed: 39 +# Offline calculated checksum: 0xcbf (3263) +# Online calculated checksum (in drive) (in dec..): +ecmcConfig "EcReadSdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,2)" +ecmcConfigOrDie "Cfg.EcVerifySdo(${ECMC_EC_SLAVE_NUM},0x206A,0x0,0xcbf,2)" +######################################################### + +# Reset drive to apply settings: +# NOTE: Reset drive command will return error -5 since no repsonse is sent back to the master! The drive will be reset anyway! +ecmcConfig "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2080,0x0,1,2)" +epicsThreadSleep(0.01) diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.sw b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.sw new file mode 100644 index 000000000..823b7d5a9 --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.sw @@ -0,0 +1,1347 @@ +7ABF +649C +2E45 +16E +198 +1E5 +252 +8CA +250 +2 +251 +14 +257 +2000 +98D +0 +928 +0 +253 +1E1E +299 +7837 +29A +D227 +29B +1B85 +986 +3FFC +98C +9B6 +254 +A3D +8CC +0 +917 +0 +28C +0 +913 +0 +300 +9100 +304 +1F +302 +6206 +303 +BB +912 +4104 +272 +0 +271 +0 +274 +0 +273 +0 +275 +A3D +276 +A3D +982 +7FFF +223 +0 +26F +7FFF +268 +9 +267 +501F +26A +1 +269 +7CBA +26C +75C2 +26B +6667 +25F +0 +25E +4135 +261 +0 +260 +22C +263 +3 +262 +5182 +264 +3FFF +266 +7AE0 +265 +6667 +292 +0 +26D +0 +291 +0 +270 +0 +26E +0 +295 +1709 +2C4 +A +2C5 +3E8 +2C6 +BB8 +879 +3E +87A +BB8 +298 +7FFF +818 +CCC +819 +8BD +25D +0 +25C +151 +246 +7FF8 +249 +0 +29D +63E +86F +0 +876 +0 +255 +1 +256 +1 +28A +7D17 +90C +8 +90A +E000 +90B +C00F +95C +1F40 +953 +64 +36A +3E8 +36B +1 +857 +3FBB +832 +0 +2FB +1 +AF28 +0 +AF29 +0 +2FA +B40 +855 +0 +854 +2327 +841 +5 +842 +1 +843 +D +844 +C +845 +0 +846 +2C +2F9 +1 +AF06 +0 +AF07 +0 +847 +2 +9E9 +5643 +9B6 +0 +201 +5002 +2A7 +3CE +823 +2 +806 +3 +286 +1600 +9F9 +0 +9FA +0 +9F6 +0 +9F7 +0 +9F4 +0 +9F5 +0 +B7E0 +B000 +B7E1 +0 +B7E2 +E +B7E3 +0 +B7E4 +0 +B7E5 +64 +B7E6 +25E +B7E7 +25F +B7E8 +260 +B7E9 +261 +B7EA +262 +B7EB +263 +B7EC +266 +B7ED +267 +B7EE +268 +B7EF +269 +B7F0 +26A +B7F1 +26C +B7D6 +2B4 +AF36 +4000 +BE8A +4000 +AF10 +0 +7FA +7993 +80C +0 +80D +1 +9DE +0 +881 +2 +880 +4 +999 +1A0 +99A +90BA +9FC +0 +9FD +FFFF +805 +0 +916 +0 +289 +23B +9F8 +64 +39F +0 +8AC +0 +8AD +0 +9F0 +1 +932 +3 +B9F2 +0 +9FF +64 +9DD +7FFF +99C +3E8 +99D +230 +947 +3E8 +948 +0 +AF04 +0 +AF05 +0 +AF0A +0 +AF19 +1 +AF24 +8000 +AF18 +1 +B7DC +32C8 +AF2F +7FFF +AF6F +0 +BFEC +0 +BFED +0 +AF7E +0 +AF7F +0 +AF78 +1B +AF73 +0 +926 +0 +965 +FFFF +AF82 +0 +AF9A +3 +AF9B +0 +AF79 +0 +AF7A +0 +AF7B +7FFF +AF83 +0 +AF8A +0 +AF72 +0 +AF9D +2402 +980 +95C3 +70 +24E +7D0 +0 +24C +C49C +20 +9E0 +3E8 +0 +814 +A02C +11 +2A2 +2EE0 +3 +2A0 +0 +64 +2AC +0 +1 +9CA +2726 +1813 +9CC +3817 +908 +9CE +A +0 +9D0 +0 +0 +9D2 +8B96 +A49B +9D4 +0 +0 +9D6 +0 +0 +9D8 +0 +0 +386 +1 +0 +388 +1 +0 +38A +2000 +0 +38C +7D +0 +38E +1 +0 +390 +3E8 +0 +392 +1 +0 +394 +1 +0 +88A +0 +8000 +88C +FFFF +7FFF +7F0 +1000 +800 +7F2 +FFFF +122A +7F4 +30B3 +2 +7F6 +808 +800 +7F8 +A080 +0 +918 +0 +0 +B7CC +0 +0 +BE80 +5C29 +28F +BE82 +0 +0 +BE84 +A +0 +BE86 +0 +0 +BE88 +0 +0 +BF00 +4B86 +3F92 +BF02 +5285 +3ED3 +BF04 +9012 +3F23 +BF06 +9014 +3FA3 +BF08 +9014 +3F23 +BF0C +0 +0 +BF0E +0 +0 +BF10 +0 +0 +BF12 +0 +0 +BF14 +0 +0 +BF18 +0 +0 +BF1A +0 +0 +BF1C +0 +0 +BF1E +0 +0 +BF20 +0 +0 +BF24 +0 +0 +BF26 +0 +0 +BF28 +0 +0 +BF2A +0 +0 +BF2C +0 +0 +BF30 +0 +0 +BF32 +0 +0 +BF34 +0 +0 +BF36 +0 +0 +BF38 +0 +0 +BF3C +0 +0 +BF3E +0 +0 +BF40 +0 +0 +BF42 +0 +0 +BF44 +0 +0 +BF48 +0 +0 +BF4A +0 +0 +BF4C +0 +0 +BF4E +0 +0 +BF50 +0 +0 +BF54 +0 +0 +BF56 +0 +0 +BF58 +0 +0 +BF5A +0 +0 +BF5C +0 +0 +BF60 +0 +0 +BF62 +0 +0 +BF64 +0 +0 +BF66 +0 +0 +BF68 +0 +0 +BF6C +0 +0 +BF6E +0 +0 +BF70 +0 +0 +BF72 +0 +0 +BF74 +0 +0 +8C8 +0 +0 +8B0 +3E8 +0 +8B2 +FA0 +0 +8C0 +FC35 +3E7 +37C +0 +1 +992 +0 +0 +3A4 +0 +1 +3A2 +0 +1 +3A6 +199A +0 +BFF8 +0 +0 +BFFA +0 +0 +BFFC +0 +0 +BFFE +0 +0 +AF00 +0 +0 +AF02 +0 +0 +AF1A +92EF +BF46 +AF1C +0 +0 +AF1E +B445 +3DE5 +AF20 +B445 +3DE5 +AF22 +0 +0 +BFDC +7043 +3F02 +BFDE +3822 +3F41 +BFE2 +7043 +3F02 +BFE4 +3822 +3F41 +BFE8 +0 +0 +BFEA +0 +0 +BAAE +7D0 +0 +BAB0 +1 +0 +BAB6 +7D0 +0 +BAB8 +1 +0 +BAB2 +1 +0 +BAB4 +1 +0 +BACA +1 +0 +BACC +1 +0 +BAA2 +1 +0 +BAA4 +1 +0 +BAAA +1 +0 +BAAC +3E8 +0 +BAA6 +1 +0 +BAA8 +1 +0 +BABE +100 +B5 +BAC0 +0 +0 +BAC2 +0 +0 +BAC4 +0 +0 +AF80 +0 +0 +AF94 +0 +0 +AF70 +9C40 +0 +AF98 +0 +0 +8000 +A950 +4CAB +806E +0 +8002 +0 +40A0 +80A5 +3333 +4053 +8058 +1000 +804E +0 +4140 +804F +0 +42A4 +8050 +0 +4100 +8051 +0 +4220 +8053 +0 +41A0 +8052 +0 +4220 +8054 +999A +42CC +8056 +D70A +3C23 +8057 +0 +3F00 +8001 +1 +8016 +0 +4240 +8060 +0 +4100 +8061 +0 +4080 +8064 +D70A +3D23 +8065 +F50A +4048 +8066 +20FB +3B17 +8067 +ED8D +A0B5 +C6F7 +3EE0 +8068 +0 +806A +1F4 +0 +80B2 +1F4 +0 +80AA +C5AC +36A7 +80A0 +9BA6 +3D44 +80A6 +0 +80A7 +FDB +40C9 +80A8 +FDB +40C9 +8073 +0 +3F80 +8074 +0 +447A +8075 +0 +457A +8076 +0 +44FA +8077 +597C +4644 +800B +0 +3F80 +800C +0 +41F0 +800D +0 +43C8 +801A +0 +42C8 +807D +D4A +4768 +B77C +3E91 +8036 +1 +803D +FDB +42C9 +803B +0 +3F00 +803A +0 +3F00 +8039 +CCCD +3DCC +8038 +CCCD +3DCC +8037 +1 +800E +0 +3F80 +800F +0 +41F0 +8010 +0 +43C8 +801B +0 +42C8 +8080 +1 +8047 +FDB +4149 +804D +CCCD +3E4C +804C +CCCD +3E4C +804B +999A +3E99 +804A +999A +3E99 +8081 +1 +809A +C5AC +36A7 +809B +C5AC +36A7 +8003 +37BD +3706 +8004 +C5AC +3727 +8005 +B717 +37D1 +8006 +B717 +3851 +8017 +B694 +5B46 +ADA3 +4091 +8018 +0 +0 +810A +1 +810B +1 +8013 +0 +801D +0 +801E +1 +801C +1 +80B9 +1 +80BA +1 +80BB +B439 +76C8 +9FBE +3FE6 +80BC +0 +0 +0 +4079 +80BD +0 +80BE +1 +80BF +D1B +2DE0 +A090 +3FE6 +80C0 +0 +0 +3000 +407F +80C1 +0 +80C2 +1 +80C3 +D1B +2DE0 +A090 +3FE6 +80C4 +0 +0 +3000 +407F +80D5 +1 +80D6 +0 +80D7 +0 +80D8 +0 +0 +0 +4079 +80D9 +0 +0 +0 +4079 +80DA +0 +0 +4000 +407F +80DB +0 +80DC +0 +80DD +0 +80DE +0 +80DF +0 +80E0 +0 +80E1 +0 +80E2 +0 +0 +4000 +407F +80E3 +0 +0 +4000 +407F +80E4 +0 +0 +4000 +407F +80E5 +0 +0 +4000 +407F +80E6 +0 +0 +4000 +407F +80E7 +0 +0 +4000 +407F +80E8 +0 +0 +4000 +407F +80E9 +0 +80EA +1 +80EB +D1B +2DE0 +A090 +3FE6 +80EC +0 +0 +3000 +407F +80ED +0 +80EE +1 +80EF +D1B +2DE0 +A090 +3FE6 +80F0 +0 +0 +3000 +407F +80F1 +0 +80F2 +1 +80F3 +D1B +2DE0 +A090 +3FE6 +80F4 +0 +0 +3000 +407F +80F5 +0 +80F6 +1 +80F7 +D1B +2DE0 +A090 +3FE6 +80F8 +0 +0 +3000 +407F +80F9 +0 +80FA +1 +80FB +D1B +2DE0 +A090 +3FE6 +80FC +0 +0 +3000 +407F +80FD +0 +80FE +1 +80FF +D1B +2DE0 +A090 +3FE6 +8100 +0 +0 +3000 +407F +8101 +0 +8102 +1 +8103 +D1B +2DE0 +A090 +3FE6 +8104 +0 +0 +3000 +407F +8009 +2 +800A +0 +80A1 +0 +8084 +0 +8085 +0 +80C5 +0 +80C6 +B439 +76C8 +9FBE +3FE6 +80C7 +0 +0 +0 +4079 +80C8 +0 +0 +0 +4079 +8105 +432D +EB1C +36E2 +3F2A +8114 +0 +8024 +CB +8025 +BA +8026 +E1 +8027 +235 +8020 +0 +8021 +0 +8022 +0 +8023 +0 +8110 +0 +40A0 +8111 +0 +4120 +8112 +0 +40A0 +8113 +0 +4120 +8106 +0 +43C8 +8107 +0 +43C8 +2A03 + +7FBF +50 +30 +32 +39 +30 +32 +36 +45 +32 +32 +31 +46 +35 +31 +35 +4B +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +389 +FE4B +FAA2 + +7FFF +7ABF + +4000 +649C +23C9 +4014 +23BF +4013 +2398 +400B +74C0 +9C0 +400B +404 +5A57 +FFFF +8000 +20 +7484 +2FB +400F +102 +1 +401E +0 +0 +0 +0 +0 +0 +0 +0 +0 +5909 +FF3F +0 +5909 +B0C0 +8000 +108 +404 +0 + diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/readme.md b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/readme.md new file mode 100644 index 000000000..0a2757c26 --- /dev/null +++ b/hardware/Technosoft_slaves/config/cfgVOLT_CoE/readme.md @@ -0,0 +1,92 @@ +# Brushed DC motor Open loop +Basically just sending voltage setpoint to motor.. Special config. +The setup requires that certain TML code is executed. + +NOTE: Different current scaling of the 4808 vs the 8020 + + +## current scaling factor +``` +current [A] = 2*Ipeak/65520*current[IO] + +``` +IU=internalunit (basically the word) + +### 8020 + +Current scaling factor, Ipeak=40A: +``` +scaling factor = 2*Ipeak/65520 + +2*40/65520=0.00122 +``` +### 4808 + +Current scaling factor, Ipeak=20A: +``` +scaling factor = 2*Ipeak/65520 + +2*20/65520=0.0006105 +``` + +## Configuration 8020 +See dir ipos8020. + +### TMLCode.sw +Includes the TML code needed to switch to: +``` +EXTREF 0 +MODE VES +UPD +``` + +### DC48V_TRQ_MODE_40A.sw +Basic EasySetup configuration exported as sw file + +### DC48V_TRQ_MODE_40A.s.zip +Easy Setup project file to be used if new settings neet to be made. Export of new ".sw" is then needed. + +### DC48V_TRQ_MODE_40A_AND_TML.sw +DC48V_TRQ_MODE.sw and TMLCode.sw concatenated with newline in between +``` +DC48V.sw + +TMLCode.sw +``` +NOTE: Make sure only one newline in the end.. + +This is the raw configuration for the drive + +### DC48V_TRQ_MODE_40A_AND_TML.cmd + +DC48ConfigPlusTML.sw converted to ecmc cmd file +``` +python3 generateEcmcCmdFromSwSetupFile.py DC48ConfigsPlusTML.sw DC48ConfigsPlusTML.cmd +``` +generateEcmcCmdFromSwSetupFile.py can be found in ecmccfg/hardware/Technosoft_slaves/config/CoE/tools + +This file can be used to configure the drive over CoE (only needs to be executed once) + +1. Edit ecmciPOS8020-Init.cmd to ensure correct versions of ecmc, ecmccfg. Also make sure the master id and slave id is correct. +2. ssh into controller +3. execute : sudo iocsh -7.0.7 ecmciPOS8020-Init.cmd + +``` +cd drvCfgs +sudo iocsh -7.0.7 ecmciPOS8020-Init.cmd +``` +This will load the settings needed and also reset the drive. This is only needed before the first use of the technosoft drive. + + +## Configuration 4808 +See dir ipos4808. + +Same procedure as for 8020 but different file names. + +NOTE: Different current scaling of the 4808 vs the 8020 + + +# TODO + + * Make script that uses etehrcat tool to write the settings + From 8684439a04682e05343ebb12d3bbfa25d18c9aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 24 Sep 2024 11:37:28 +0200 Subject: [PATCH 075/128] rename dir --- .../config/{cfgVOLT_CoE => CoE_VOLT}/TMLCode.sw | 0 .../ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin | Bin .../ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw | 0 .../ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd | 0 .../ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw | 0 .../Untitled Application/1_Motion Status.cp | 0 .../Untitled Application/2_Drive IO.cp | 0 .../Untitled Application/3_CANopen Status.cp | 0 .../Untitled Application/4_CoE Objects.cp | 0 .../Untitled Application/5_Drive Status.cp | 0 .../Untitled Application/application.cfg | 0 .../autotuning_parameters_bakup.cfg | 0 .../Untitled Application/cam.cfg | 0 .../Untitled Application/functions.cfg | 0 .../Untitled Application/gainscheduling.gs | Bin .../Untitled Application/homingmodes.cfg | 0 .../Untitled Application/interrupts.cfg | 0 .../Untitled Application/logger.lgs | Bin .../Untitled Application/main.cfg | 0 .../Untitled Application/parameters.cfg | 0 .../Untitled Application/scope.osc | Bin .../Untitled Application/setup.cfg | 0 .../Untitled Application/variables.cfg | 0 .../4808_DCBRUSH_VOLT_48V_20A/logger.lgs | Bin .../4808_DCBRUSH_VOLT_48V_20A/workspace.cfg | 0 .../ipos4808/ecmciPOS4808-Init.cmd | 0 .../ipos8020/DC48V_TRQ_MODE_40A.s.zip | Bin .../ipos8020/DC48V_TRQ_MODE_40A.sw | 0 .../ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd | 0 .../ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw | 0 .../ipos8020/FOESW_DC48V_TRQ.bin | Bin .../ipos8020/ecmciPOS8020-Init.cmd | 0 .../old/DC48ConfigsPlusTML.cmd | 0 .../old/DC48ConfigsPlusTML.sw | 0 .../{cfgVOLT_CoE => CoE_VOLT}/old/DC48V.s.zip | Bin .../config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V.sw | 0 .../old/DC48V_TRQ_MODE.cmd | 0 .../old/DC48V_TRQ_MODE.s.zip | Bin .../{cfgVOLT_CoE => CoE_VOLT}/old/DC48V_TRQ_MODE.sw | 0 .../old/DC48V_TRQ_MODE_plus_TMLCode.cmd | 0 .../old/DC48V_TRQ_MODE_plus_TMLCode.sw | 0 .../config/{cfgVOLT_CoE => CoE_VOLT}/readme.md | 0 42 files changed, 0 insertions(+), 0 deletions(-) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/TMLCode.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/1_Motion Status.cp (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/2_Drive IO.cp (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/3_CANopen Status.cp (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/4_CoE Objects.cp (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/5_Drive Status.cp (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/application.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/autotuning_parameters_bakup.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos4808/ecmciPOS4808-Init.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos8020/DC48V_TRQ_MODE_40A.s.zip (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos8020/DC48V_TRQ_MODE_40A.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos8020/FOESW_DC48V_TRQ.bin (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/ipos8020/ecmciPOS8020-Init.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48ConfigsPlusTML.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48ConfigsPlusTML.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V.s.zip (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V_TRQ_MODE.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V_TRQ_MODE.s.zip (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V_TRQ_MODE.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V_TRQ_MODE_plus_TMLCode.cmd (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/old/DC48V_TRQ_MODE_plus_TMLCode.sw (100%) rename hardware/Technosoft_slaves/config/{cfgVOLT_CoE => CoE_VOLT}/readme.md (100%) diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/TMLCode.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/TMLCode.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/TMLCode.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/TMLCode.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A.bin diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_BRUSHDC_VOLT_48V_20A_plusTML.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/1_Motion Status.cp b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/1_Motion Status.cp similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/1_Motion Status.cp rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/1_Motion Status.cp diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/2_Drive IO.cp b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/2_Drive IO.cp similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/2_Drive IO.cp rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/2_Drive IO.cp diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/3_CANopen Status.cp b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/3_CANopen Status.cp similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/3_CANopen Status.cp rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/3_CANopen Status.cp diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/4_CoE Objects.cp b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/4_CoE Objects.cp similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/4_CoE Objects.cp rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/4_CoE Objects.cp diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/5_Drive Status.cp b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/5_Drive Status.cp similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/5_Drive Status.cp rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/5_Drive Status.cp diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/application.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/application.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/application.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/application.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/autotuning_parameters_bakup.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/autotuning_parameters_bakup.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/autotuning_parameters_bakup.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/autotuning_parameters_bakup.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/cam.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/functions.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/gainscheduling.gs diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/homingmodes.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/interrupts.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/logger.lgs diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/main.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/parameters.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/scope.osc diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/setup.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/Untitled Application/variables.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/logger.lgs diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/4808_DCBRUSH_VOLT_48V_20A/4808_DCBRUSH_VOLT_48V_20A/workspace.cfg diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/ecmciPOS4808-Init.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/ecmciPOS4808-Init.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos4808/ecmciPOS4808-Init.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos4808/ecmciPOS4808-Init.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.s.zip b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A.s.zip similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.s.zip rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A.s.zip diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/DC48V_TRQ_MODE_40A_AND_TML.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/FOESW_DC48V_TRQ.bin b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/FOESW_DC48V_TRQ.bin similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/FOESW_DC48V_TRQ.bin rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/FOESW_DC48V_TRQ.bin diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/ecmciPOS8020-Init.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/ecmciPOS8020-Init.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/ipos8020/ecmciPOS8020-Init.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/ipos8020/ecmciPOS8020-Init.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48ConfigsPlusTML.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48ConfigsPlusTML.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48ConfigsPlusTML.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48ConfigsPlusTML.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48ConfigsPlusTML.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48ConfigsPlusTML.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48ConfigsPlusTML.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48ConfigsPlusTML.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.s.zip b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V.s.zip similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.s.zip rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V.s.zip diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.s.zip b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE.s.zip similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.s.zip rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE.s.zip diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.cmd b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE_plus_TMLCode.cmd similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.cmd rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE_plus_TMLCode.cmd diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.sw b/hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE_plus_TMLCode.sw similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/old/DC48V_TRQ_MODE_plus_TMLCode.sw rename to hardware/Technosoft_slaves/config/CoE_VOLT/old/DC48V_TRQ_MODE_plus_TMLCode.sw diff --git a/hardware/Technosoft_slaves/config/cfgVOLT_CoE/readme.md b/hardware/Technosoft_slaves/config/CoE_VOLT/readme.md similarity index 100% rename from hardware/Technosoft_slaves/config/cfgVOLT_CoE/readme.md rename to hardware/Technosoft_slaves/config/CoE_VOLT/readme.md From eb638445536e2b9ee9b108dece81f6f9a598cca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 24 Sep 2024 20:51:45 +0200 Subject: [PATCH 076/128] Add El5101-0010 --- db/Beckhoff_5XXX/ecmcEL5101-0010-chX.template | 199 ++++++++++++++++++ .../ecmcEL5101-0010.substitutions | 6 + hardware/Beckhoff_5XXX/EL/ecmcEL5101-0010.cmd | 25 +++ 3 files changed, 230 insertions(+) create mode 100644 db/Beckhoff_5XXX/ecmcEL5101-0010-chX.template create mode 100644 db/Beckhoff_5XXX/ecmcEL5101-0010.substitutions create mode 100644 hardware/Beckhoff_5XXX/EL/ecmcEL5101-0010.cmd diff --git a/db/Beckhoff_5XXX/ecmcEL5101-0010-chX.template b/db/Beckhoff_5XXX/ecmcEL5101-0010-chX.template new file mode 100644 index 000000000..f13c2ed9d --- /dev/null +++ b/db/Beckhoff_5XXX/ecmcEL5101-0010-chX.template @@ -0,0 +1,199 @@ +record(mbbiDirect,"${ECMC_P}Enc${CH_ID}-Stat"){ + field(DESC, "$(HWTYPE): Enc Status Word") + field(PINI, "$(PINI=1)") + field(DTYP, "asynUInt32Digital") + field(INP, "@asynMask($(PORT),$(ADDR=0),$(MASK=0xFFFFFFFF),$(TIMEOUT=1))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynUInt32Digital/ec$(MASTER_ID).s$(SLAVE_POS).encoderStatus${CH_ID}?") + field(SCAN, "I/O Intr") + field(FLNK, "${ECMC_P}Enc${CH_ID}-ExtLtchOK") + field(SHFT, "0") + field(TSE, "$(TSE=-2)") +} + +record(bi,"${ECMC_P}Enc${CH_ID}-ExtLtchOK"){ + field(DESC, "$(HWTYPE): Enc Latch extern valid") + field(INP, "${ECMC_P}Enc${CH_ID}-Stat.B1") + field(ZNAM, "no latch") + field(ONAM, "latched") + field(FLNK, "${ECMC_P}Enc${CH_ID}-OpnCrctAlrm") +} + +record(bi,"${ECMC_P}Enc${CH_ID}-OpnCrctAlrm"){ + field(DESC, "$(HWTYPE): Enc Opn Ccrt Alrm") + field(INP, "${ECMC_P}Enc${CH_ID}-Stat.B6") + field(ZNAM, "No Alarm") + field(ONAM, "Open Circuit") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") + field(FLNK, "${ECMC_P}Enc${CH_ID}-WrnAlrm") +} + +record(bi,"${ECMC_P}Enc${CH_ID}-WrnAlrm"){ + field(DESC, "$(HWTYPE): Enc Extpltn Stall Alrm") + field(INP, "${ECMC_P}Enc${CH_ID}-Stat.B7") + field(ZNAM, "No Alarm") + field(ONAM, "Alarm") + field(ZSV, "NO_ALARM") + field(OSV, "MINOR") + field(FLNK, "${ECMC_P}Enc${CH_ID}-SyncErrAlrm") +} + +record(bi,"${ECMC_P}Enc${CH_ID}-SyncErrAlrm"){ + field(DESC, "$(HWTYPE): Enc Sync Err Alrm") + field(INP, "${ECMC_P}Enc${CH_ID}-Stat.BD") + field(ZNAM, "No Alarm") + field(ONAM, "Alarm") + field(ZSV, "NO_ALARM") + field(OSV, "MAJOR") +} + +# latching +record(bo, "${ECMC_P}Enc${CH_ID}-LchAutRstSp"){ + field(DESC, "reset latch automatically") + field(ZNAM, "off") + field(ONAM, "on") + field(FLNK, "${ECMC_P}Enc${CH_ID}-LtchAutRst") +} + +record(calcout, "${ECMC_P}Enc${CH_ID}-LtchAutRst") { + field(DESC, "reset latch automatically calc") + field(CALC, "A&&B?2:1") + field(INPA, "${ECMC_P}Enc${CH_ID}-LchAutRstSp") + field(INPB, "${ECMC_P}Enc${CH_ID}-ExtLtchOK CP") + field(IVOA, "Don't drive outputs") + field(OUT, "${ECMC_P}Enc${CH_ID}-LtchRst.SELN PP") +} + +# to reset, the Enc-Cmd has to be set to 'no latching' and then to 'latching' again +record(seq, "${ECMC_P}Enc${CH_ID}-LtchRst") { + field(DESC, "reset latch") + field(SELM, "Specified") + field(DOL1, "${ECMC_P}Enc${CH_ID}-LtchCmd") + field(LNK1, "${ECMC_P}Enc${CH_ID}-Cmd PP") + field(DOL2, "0") + field(LNK2, "${ECMC_P}Enc${CH_ID}-Cmd PP") +} + +record(ai,"${ECMC_P}Enc${CH_ID}-PosAct"){ + field(DESC, "$(HWTYPE): Enc Actl Pos (Raw)") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))CMD=UINT32TOFLOAT64/T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynInt32/ec$(MASTER_ID).s$(SLAVE_POS).positionActual${CH_ID}?") + field(SCAN, "I/O Intr") + field(LINR, "$(LINR=SLOPE)") + field(ESLO, "$(ESLO=1)") + field(EOFF, "$(EOFF=0)") + field(EGU, "$(EGU=Counts)") + field(PREC, "$(PREC=7)") + field(LOW, "$(LOW=0)") + field(LOLO, "$(LOLO=0)") + field(HIGH, "$(HIGH=0)") + field(HIHI, "$(HIHI=0)") + field(HYST, "$(HYST=0)") + field(LLSV, "$(LLSV=NO_ALARM)") + field(LSV, "$(LSV=NO_ALARM)") + field(HSV, "$(HSV=NO_ALARM)") + field(HHSV, "$(HHSV=NO_ALARM)") + field(TSE, "$(TSE=-2)") +} + +record(ai,"${ECMC_P}Enc${CH_ID}-LtchPosAct"){ + field(DESC, "$(HWTYPE): Enc Latch Pos") + field(PINI, "$(PINI=1)") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))CMD=UINT32TOFLOAT64/T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynFloat64/ec$(MASTER_ID).s$(SLAVE_POS).encoderLatchPostion${CH_ID}?") + field(SCAN, "I/O Intr") + field(LINR, "$(LINR=SLOPE)") + field(ESLO, "$(ESLO=1)") + field(EOFF, "$(EOFF=0)") + field(EGU, "$(EGU=Counts)") + field(PREC, "$(PREC=7)") + field(LOW, "$(LOW=0)") + field(LOLO, "$(LOLO=0)") + field(HIGH, "$(HIGH=0)") + field(HIHI, "$(HIHI=0)") + field(HYST, "$(HYST=0)") + field(LLSV, "$(LLSV=NO_ALARM)") + field(LSV, "$(LSV=NO_ALARM)") + field(HSV, "$(HSV=NO_ALARM)") + field(HHSV, "$(HHSV=NO_ALARM)") + field(TSE, "$(TSE=-2)") +} + +record(mbbo, "${ECMC_P}Enc${CH_ID}-LtchCmd"){ + field(DESC, "latch source selector") + field(DTYP, "Raw Soft Channel") + field(ZRST, "no latching") + field(ZRVL, 0) + field(ONST, "latch C") + field(ONVL, 1) + field(TWST, "latch ext. rising") + field(TWVL, 2) + field(THST, "Set counter") + field(THVL, 3) + field(FRST, "latch ext. falling") + field(FRVL, 4) + field(OUT, "${ECMC_P}Enc${CH_ID}-Cmd PP") +} + +record(ao,"${ECMC_P}Enc${CH_ID}-Cmd"){ + field(DESC, "$(HWTYPE): Enc Ctrl Word") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynInt32/ec$(MASTER_ID).s$(SLAVE_POS).encoderControl${CH_ID}=") + field(PREC, "0") +} + +record(ai,"${ECMC_P}Enc${CH_ID}-Cmd-RB"){ + field(DESC, "$(HWTYPE): Enc Ctrl Word RB") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynInt32/ec$(MASTER_ID).s$(SLAVE_POS).encoderControl${CH_ID}?") + field(PREC, "0") + field(SCAN, "I/O Intr") + field(TSE, "$(TSE=-2)") +} + +record(ao,"${ECMC_P}Enc${CH_ID}-PosCmd"){ + field(DESC, "$(HWTYPE): Enc Counter Value Setpoint") + field(PINI, "$(PINI=1)") + field(DTYP, "asynFloat64") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))CMD=UINT32TOFLOAT64/T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynFloat64/ec$(MASTER_ID).s$(SLAVE_POS).encoderValue${CH_ID}=") + field(LINR, "$(LINR=SLOPE)") + field(ESLO, "$(ESLO=1)") + field(EOFF, "$(EOFF=0)") + field(EGU, "$(EGU=)") + field(PREC, "$(PREC=7)") + field(LOW, "$(LOW=0)") + field(LOLO, "$(LOLO=0)") + field(HIGH, "$(HIGH=0)") + field(HIHI, "$(HIHI=0)") + field(HYST, "$(HYST=0)") + field(LLSV, "$(LLSV=NO_ALARM)") + field(LSV, "$(LSV=NO_ALARM)") + field(HSV, "$(HSV=NO_ALARM)") + field(HHSV, "$(HHSV=NO_ALARM)") +} + +record(ai,"${ECMC_P}Enc${CH_ID}-PosCmd-RB"){ + field(DESC, "$(HWTYPE): Enc Ctrl Word RB") + field(PINI, "$(PINI=1)") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))CMD=UINT32TOFLOAT64/T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynFloat64/ec$(MASTER_ID).s$(SLAVE_POS).encoderValue${CH_ID}?") + field(SCAN, "I/O Intr") + field(LINR, "$(LINR=SLOPE)") + field(ESLO, "$(ESLO=1)") + field(EOFF, "$(EOFF=0)") + field(EGU, "$(EGU=Counts)") + field(PREC, "$(PREC=7)") + field(LOW, "$(LOW=0)") + field(LOLO, "$(LOLO=0)") + field(HIGH, "$(HIGH=0)") + field(HIHI, "$(HIHI=0)") + field(HYST, "$(HYST=0)") + field(LLSV, "$(LLSV=NO_ALARM)") + field(LSV, "$(LSV=NO_ALARM)") + field(HSV, "$(HSV=NO_ALARM)") + field(HHSV, "$(HHSV=NO_ALARM)") + field(TSE, "$(TSE=-2)") +} + diff --git a/db/Beckhoff_5XXX/ecmcEL5101-0010.substitutions b/db/Beckhoff_5XXX/ecmcEL5101-0010.substitutions new file mode 100644 index 000000000..e4cdc44d2 --- /dev/null +++ b/db/Beckhoff_5XXX/ecmcEL5101-0010.substitutions @@ -0,0 +1,6 @@ +file "ecmcEL5101-0010-chX.template" +{ + pattern {CH_ID} + {01 } +} + diff --git a/hardware/Beckhoff_5XXX/EL/ecmcEL5101-0010.cmd b/hardware/Beckhoff_5XXX/EL/ecmcEL5101-0010.cmd new file mode 100644 index 000000000..f2a99a95e --- /dev/null +++ b/hardware/Beckhoff_5XXX/EL/ecmcEL5101-0010.cmd @@ -0,0 +1,25 @@ +#-d /** +#-d \brief hardware script for EL5101-0010 +#-d \details EL5101 Incremental encoder interface (differential RS422) 32 bit support +#-d \author Anders Sandstroem +#-d \file +#-d */ + +epicsEnvSet("ECMC_EC_HWTYPE" "EL5101-0010") +epicsEnvSet("ECMC_EC_VENDOR_ID" "0x2") +epicsEnvSet("ECMC_EC_PRODUCT_ID" "0x13ed3052") +epicsEnvSet("ECMC_EC_COMP_TYPE" "EL5101") + +#- verify slave, including reset +ecmcFileExist(${ecmccfg_DIR}slaveVerify.cmd,1) +${SCRIPTEXEC} ${ecmccfg_DIR}slaveVerify.cmd "RESET=true" + +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1600,0x7000,0x01,16,encoderControl01)" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1600,0x7000,0x11,32,encoderValue01)" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a00,0x6000,0x01,16,encoderStatus01)" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a00,0x6000,0x11,32,positionActual01)" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a00,0x6000,0x12,32,encoderLatchPostion01)" + +#- Default panel +epicsEnvSet("ECMC_HW_PANEL" "EL5101") + From 2cb82c1f98bce4deaa61b56bfa99e09751077ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 24 Sep 2024 20:57:50 +0200 Subject: [PATCH 077/128] Add examples --- .../motion/stepper_bissc_no_mr/README.md | 100 ++++++++++++++++++ .../motion/stepper_bissc_no_mr/cfg/axis.yaml | 90 ++++++++++++++++ .../cfg/enc_open_loop.yaml | 12 +++ .../motion/stepper_bissc_no_mr/startup.cmd | 65 ++++++++++++ examples/test/el5042/el5042_SSI.script | 35 ++++++ examples/test/el5101-0010/el5101-0010.script | 13 +++ 6 files changed, 315 insertions(+) create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_no_mr/README.md create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/axis.yaml create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/enc_open_loop.yaml create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_no_mr/startup.cmd create mode 100644 examples/test/el5042/el5042_SSI.script create mode 100644 examples/test/el5101-0010/el5101-0010.script diff --git a/examples/PSI/best_practice/motion/stepper_bissc_no_mr/README.md b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/README.md new file mode 100644 index 000000000..44ce4d6d2 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/README.md @@ -0,0 +1,100 @@ +# Configuration for EL7041-0052 and EL5042 +* 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 + +### Encoder scalings +Two encoders are configured: +1. Closed loop: BISS-C. This is used as the default encoder for control +2. Open loop: EL7041 Step counter + +Both these encoders (and drive) should be scaled to the same unit (mm). + +#### RLS BISS-C (encoder 1) + +RLS BISS-C: +* 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 +``` + +#### Open loop (encoder 2) +The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): +* 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): +* 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: +``` +axis: + id: 1 # Axis id + feedSwitchesOutput: ec0.s5.binaryOutput01 # Ethercat entry for feed switches + +``` diff --git a/examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/axis.yaml b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/axis.yaml new file mode 100644 index 000000000..ef5eb29d0 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/axis.yaml @@ -0,0 +1,90 @@ +axis: + id: ${AXIS_ID=1} # Axis id + feedSwitchesOutput: ec0.s${BO_SID}.binaryOutput${BO_CH=01} # Ethercat entry for feed switches + +epics: + name: ${AX_NAME=M1} # Axis anme + precision: 3 # Decimal count + description: Test cfg # Axis description + unit: mm # Unit + motorRecord: + enable: False + fieldInit: 'RTRY=0,FOFF=Frozen' # Extra config for Motor record + +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) + +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: 32 # 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 + +controller: + Kp: 10 # Kp proportinal gain + Ki: 0 # Ki integral gain + Kd: 0 # Kd derivative gain + +trajectory: + axis: + velocity: 2 # Default velo for axis + acceleration: 2 # Default acc for axis + deceleration: 2 # Default dec for axis + emergencyDeceleration: 5 # Deceleration when axis in error state + jerk: 10 # Default jerk for axis + jog: + velocity: 1 # Default velo fro JOG (motor record) + +input: + 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 + +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: true # Enable position lag monitoring (following error) + tolerance: 0.1 # Allowed tolerance + time: 10 # Allowed time outside tolerance target: + velocity: + enable: false # Enable velocity monitoring + max: 8 # 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 + target: + enable: true # Enable at target monitoring (needs to be enabled if using motor record) + tolerance: 0.01 # Allowed tolerance + time: 10 # Filter time inside tolerance to be at target diff --git a/examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/enc_open_loop.yaml b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/enc_open_loop.yaml new file mode 100644 index 000000000..3abf8df5f --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/cfg/enc_open_loop.yaml @@ -0,0 +1,12 @@ +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) diff --git a/examples/PSI/best_practice/motion/stepper_bissc_no_mr/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/startup.cmd new file mode 100644 index 000000000..7f2647486 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_no_mr/startup.cmd @@ -0,0 +1,65 @@ +############################################################################## +## Example config for EL7041 and EL5042 + +require ecmccfg "MODE=NO_MR,ENG_MODE=1,EC_RATE=100" +require ecmccomp + +#- ############################################################################ +#- Master0 +#- 0 0:0 PREOP + EK1100 EtherCAT-Koppler (2A E-Bus) +#- 1 0:1 PREOP + EL9227-5500 �berstromschutz 24V DC, 2K., max. 10A (Summe), eins +#- 2 0:2 PREOP + EL5042 2Ch. BiSS-C Encoder +#- 3 0:3 PREOP + EL5042 2Ch. BiSS-C Encoder +#- 4 0:4 PREOP + EL3204 4K. Ana. Eingang PT100 (RTD) +#- 5 0:5 PREOP + EL2008 8K. Dig. Ausgang 24V, 0.5A +#- 6 0:6 PREOP + EL1008 8K. Dig. Eingang 24V, 3ms +#- 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) + + +# 0:0 - EK1100 EtherCAT coupler +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EK1100" + +# 0:1 - EL9227-5500 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL9227-5500" + +# 0:2 - EL5042 2Ch BiSS-C Encoder, RLS-LA11 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL5042" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=2" +epicsEnvSet(ENC_SID,${ECMC_EC_SLAVE_NUM}) + +# 0:3 - EL5042 2Ch BiSS-C Encoder +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL5042" + +# 0:4 - EL3204 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL3204" + +# 0:5 - EL2008 +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL2008" +epicsEnvSet(BO_SID,${ECMC_EC_SLAVE_NUM}) + +# 0:6 - EL1008 8K. Dig. Eingang 24V, 3ms +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL1008" + +# 0:7 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml, DEV=${IOC}, AX_NAME=M1, AXIS_ID=1, DRV_SID=${ECMC_EC_SLAVE_NUM}, ENC_SID=${ENC_SID}, ENC_CH=01, BO_SID=${BO_SID}, BO_CH=01" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlEnc.cmd, "FILE=./cfg/enc_open_loop.yaml, DEV=${IOC}, DRV_SID=${ECMC_EC_SLAVE_NUM}" + +# 0:8 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" + +# 0:9 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" + +# 0:10 - EL7041 1Ch Stepper +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" + +#- ########################################################################### +#- go active +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd diff --git a/examples/test/el5042/el5042_SSI.script b/examples/test/el5042/el5042_SSI.script new file mode 100644 index 000000000..18872134a --- /dev/null +++ b/examples/test/el5042/el5042_SSI.script @@ -0,0 +1,35 @@ +############################################################################## +## Example config for el5042 for SSI +# Can not get the encoder to get ready in SSI mode.. + +require ecmccfg "MASTER_ID=1" +require ecmccomp + +############################################################################## +## Config hardware: + +epicsEnvSet("ECMC_EC_SLAVE_NUM", "14") +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(ECMC_EC_SLAVE_NUM), HW_DESC=EL5042" + +#- Apply encoder config with some custom macros +#${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-24bit,CH_ID=1" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=26,CLK_FRQ_KHZ=1000" + +ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x14,0,1)" +ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x2,1,1)" +ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x3,1,1)" +ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x11,0,4)" + +#Apply hardware configuration +ecmcConfigOrDie "Cfg.EcApplyConfig(1)" + +############################################################################## +############# Configure diagnostics: + +ecmcConfigOrDie "Cfg.EcSetDiagnostics(1)" +ecmcConfigOrDie "Cfg.EcEnablePrintouts(0)" +ecmcConfigOrDie "Cfg.EcSetDomainFailedCyclesLimit(100)" + +############################################################################## +## Go active: +$(SCRIPTEXEC) ($(ecmccfg_DIR)setAppMode.cmd) diff --git a/examples/test/el5101-0010/el5101-0010.script b/examples/test/el5101-0010/el5101-0010.script new file mode 100644 index 000000000..e19e36056 --- /dev/null +++ b/examples/test/el5101-0010/el5101-0010.script @@ -0,0 +1,13 @@ +############################################################################## +## Example config for el5101-0010 + +require ecmccfg v9.6.2_RC1 + +############################################################################## +## Config hardware: + +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=9, HW_DESC=EL5101-0010" + +# go active +ecmcConfigOrDie "Cfg.EcApplyConfig(1)" +$(SCRIPTEXEC) ($(ecmccfg_DIR)setAppMode.cmd) From a0181f823cc112ffe8552e5dcfccde4bdd436f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 08:32:56 +0200 Subject: [PATCH 078/128] EL5042: Fix SSI cfg --- examples/test/el5042/el5042_SSI.script | 28 +++++++++----------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/examples/test/el5042/el5042_SSI.script b/examples/test/el5042/el5042_SSI.script index 18872134a..4a2ef1e82 100644 --- a/examples/test/el5042/el5042_SSI.script +++ b/examples/test/el5042/el5042_SSI.script @@ -1,6 +1,6 @@ ############################################################################## ## Example config for el5042 for SSI -# Can not get the encoder to get ready in SSI mode.. +## Encoder RLS on lab motion stage require ecmccfg "MASTER_ID=1" require ecmccomp @@ -12,24 +12,14 @@ epicsEnvSet("ECMC_EC_SLAVE_NUM", "14") ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(ECMC_EC_SLAVE_NUM), HW_DESC=EL5042" #- Apply encoder config with some custom macros -#${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-24bit,CH_ID=1" -${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=26,CLK_FRQ_KHZ=1000" - -ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x14,0,1)" -ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x2,1,1)" -ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x3,1,1)" -ecmcConfigOrDie "Cfg.EcAddSdo(14,0x8008,0x11,0,4)" - -#Apply hardware configuration -ecmcConfigOrDie "Cfg.EcApplyConfig(1)" - -############################################################################## -############# Configure diagnostics: - -ecmcConfigOrDie "Cfg.EcSetDiagnostics(1)" -ecmcConfigOrDie "Cfg.EcEnablePrintouts(0)" -ecmcConfigOrDie "Cfg.EcSetDomainFailedCyclesLimit(100)" +#- The encoder is 26bit but also has two status bits, the two status bits are on the LSB side.. +#- This results in total of 28bits. +#- For some reason it's not working enabling status bits 0x80p8:02, therefore set ST to 28, +#- else if set to 26 then the EL5042 will not report READY. +#- These extra 2 LSB bits can be masked away in the axis yaml cfg with the encoder.mask = 0xFFFFFFC setting. +${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" ############################################################################## ## Go active: -$(SCRIPTEXEC) ($(ecmccfg_DIR)setAppMode.cmd) +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +$(SCRIPTEXEC) $(ecmccfg_DIR)setAppMode.cmd From e0d458e87bb9309d7ce61185bc66e0e3390aa6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 09:30:22 +0200 Subject: [PATCH 079/128] Update EL5042 example --- examples/test/el5042/el5042.script | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/examples/test/el5042/el5042.script b/examples/test/el5042/el5042.script index 43ba61c79..913199bfb 100644 --- a/examples/test/el5042/el5042.script +++ b/examples/test/el5042/el5042.script @@ -1,27 +1,21 @@ ############################################################################## ## Example config for el5042 -require ecmccfg sandst_a "ECMC_VER=sandst_a" +require ecmccfg "MASTER_ID=1" +require ecmccomp ############################################################################## ## Config hardware: -epicsEnvSet("ECMC_EC_SLAVE_NUM", "14") -${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(ECMC_EC_SLAVE_NUM), HW_DESC=EL5042" +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=14, HW_DESC=EL5042" #- Apply encoder config with some custom macros -${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-24bit,CH_ID=1" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1,OFF_BITS=0" -#Apply hardware configuration -ecmcConfigOrDie "Cfg.EcApplyConfig(1)" - -############################################################################## -############# Configure diagnostics: - -ecmcConfigOrDie "Cfg.EcSetDiagnostics(1)" -ecmcConfigOrDie "Cfg.EcEnablePrintouts(0)" -ecmcConfigOrDie "Cfg.EcSetDomainFailedCyclesLimit(100)" +#- 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" ############################################################################## ## Go active: -$(SCRIPTEXEC) ($(ecmccfg_DIR)setAppMode.cmd) +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +$(SCRIPTEXEC) $(ecmccfg_DIR)setAppMode.cmd From c45b8f85b2e0433ef11cb671bc3af00fb0ccc60c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 13:57:46 +0200 Subject: [PATCH 080/128] Update troubleshooting section of manual with some info on EL5042 --- .../manual/troubleshooting/hardware.md | 51 ++++++++++++++++++- hugo/content/manual/troubleshooting/tuning.md | 3 ++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index fc3016483..d26eac3fa 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -10,6 +10,7 @@ chapter = false 1. [over current protection](#over current protection) 2. [el7041 error/warning](#el7041 error/warning) 3. [latency issues](#latency issues) +4. [latency issues](#latency issues) --- ### 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. @@ -151,6 +152,53 @@ 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. +### EL5042 configuration + +#### Offset LSB Bit [Bit] (0x80p8:17) +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 on EL5042 +* 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). + +{{% warning %}} +If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning). +{{% /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 +# 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 "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 teh 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. + ### 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 teh ecmc_rt thread can be related to: @@ -185,7 +233,7 @@ The sample rate is defined when require ecmccfg (example set to 500Hz, instead o require ecmccfg "EC_RATE=500" ``` {{% notice info %}} -Theer 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. +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. {{% /notice %}} ** Affinity** @@ -211,4 +259,3 @@ afterInit "epicsThreadSetAffinity cbLow 6" {{% notice info %}} cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. {{% /notice %}} - diff --git a/hugo/content/manual/troubleshooting/tuning.md b/hugo/content/manual/troubleshooting/tuning.md index 1a8875d58..53068ccb8 100644 --- a/hugo/content/manual/troubleshooting/tuning.md +++ b/hugo/content/manual/troubleshooting/tuning.md @@ -25,3 +25,6 @@ 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. +### Backlash +Tuning systems with backlash can be difficult. Sometimes a small D-part helps to reduce spikes in the centralized ecmc position loop controller output. + From 8065a037991b02e48413651cd6b5d42f36e44219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 14:07:17 +0200 Subject: [PATCH 081/128] Add script for reading EL5042 diag --- utils/read_el5042_diag.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 utils/read_el5042_diag.sh diff --git a/utils/read_el5042_diag.sh b/utils/read_el5042_diag.sh new file mode 100644 index 000000000..ece43d0a8 --- /dev/null +++ b/utils/read_el5042_diag.sh @@ -0,0 +1,30 @@ +MID=$1 +SID=$2 +CH_ID=${$3:-0} + +echo "" +echo "#########################################################" +echo "Reading EL5042 ch $CH_ID status at master id $MID and slave id $SID:" +echo "" +echo "Power supply present:" +ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x1 + +echo "Error:" +ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x2 + +echo "SDC Error:" +ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x3 + +echo "WD Error:" +ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x4 + +echo "Data valid:" +ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x5 + +echo "Data raw value:" +ethercat upload -m $MID -p $SID --type uint64 0xA0$CH_ID0 0x11 + +echo "" +echo "#########################################################" +echo "" + From e6084a2e416435448bbb9db20d09b3c6344f212e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 14:14:23 +0200 Subject: [PATCH 082/128] Fix stat read script for EL5042 --- examples/test/el5042/el5042_SSI.script | 5 ++++- utils/read_el5042_diag.sh | 15 ++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/examples/test/el5042/el5042_SSI.script b/examples/test/el5042/el5042_SSI.script index 4a2ef1e82..b2b0d6927 100644 --- a/examples/test/el5042/el5042_SSI.script +++ b/examples/test/el5042/el5042_SSI.script @@ -17,7 +17,10 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=$(ECMC_EC_SLAVE_NUM), HW_DES #- For some reason it's not working enabling status bits 0x80p8:02, therefore set ST to 28, #- else if set to 26 then the EL5042 will not report READY. #- These extra 2 LSB bits can be masked away in the axis yaml cfg with the encoder.mask = 0xFFFFFFC setting. -${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" +#${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" + +#- Shift away the 2 status bits (ST_BITS=26, OFF_BITS=2, total 28bits) +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=0,ST_BITS=26,CLK_FRQ_KHZ=1000,CODING=0,OFF_BITS=2" ############################################################################## ## Go active: diff --git a/utils/read_el5042_diag.sh b/utils/read_el5042_diag.sh index ece43d0a8..ce79b281d 100644 --- a/utils/read_el5042_diag.sh +++ b/utils/read_el5042_diag.sh @@ -1,28 +1,29 @@ MID=$1 SID=$2 -CH_ID=${$3:-0} +CH_ID=$3 +echo "0xA0${CH_ID}0" echo "" echo "#########################################################" echo "Reading EL5042 ch $CH_ID status at master id $MID and slave id $SID:" echo "" echo "Power supply present:" -ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x1 +ethercat upload -m $MID -p $SID --type uint8 0xA0${CH_ID}8 0x1 echo "Error:" -ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x2 +ethercat upload -m $MID -p $SID --type uint8 0xA0${CH_ID}8 0x2 echo "SDC Error:" -ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x3 +ethercat upload -m $MID -p $SID --type uint8 0xA0${CH_ID}8 0x3 echo "WD Error:" -ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x4 +ethercat upload -m $MID -p $SID --type uint8 0xA0${CH_ID}8 0x4 echo "Data valid:" -ethercat upload -m $MID -p $SID --type uint8 0xA0$CH_ID0 0x5 +ethercat upload -m $MID -p $SID --type uint8 0xA0${CH_ID}8 0x5 echo "Data raw value:" -ethercat upload -m $MID -p $SID --type uint64 0xA0$CH_ID0 0x11 +ethercat upload -m $MID -p $SID --type uint64 0xA0${CH_ID}8 0x11 echo "" echo "#########################################################" From a6c0173c79ad8ca10d18cc27b1a54c083b215191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 14:26:52 +0200 Subject: [PATCH 083/128] Cleanup --- utils/read_el5042_diag.sh | 4 +--- utils/readme.md | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/utils/read_el5042_diag.sh b/utils/read_el5042_diag.sh index ce79b281d..b9cfd5293 100644 --- a/utils/read_el5042_diag.sh +++ b/utils/read_el5042_diag.sh @@ -2,10 +2,9 @@ MID=$1 SID=$2 CH_ID=$3 -echo "0xA0${CH_ID}0" echo "" echo "#########################################################" -echo "Reading EL5042 ch $CH_ID status at master id $MID and slave id $SID:" +echo "Reading EL5042 Ch $CH_ID status at master id $MID and slave id $SID:" echo "" echo "Power supply present:" ethercat upload -m $MID -p $SID --type uint8 0xA0${CH_ID}8 0x1 @@ -28,4 +27,3 @@ ethercat upload -m $MID -p $SID --type uint64 0xA0${CH_ID}8 0x11 echo "" echo "#########################################################" echo "" - diff --git a/utils/readme.md b/utils/readme.md index 13777d43d..620ae9f8f 100644 --- a/utils/readme.md +++ b/utils/readme.md @@ -9,7 +9,7 @@ Call: ``` #- Generate hw snippet (WIP) PDOS in top and (commented) SDOs in bottom: python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -d CMMT-ST-MP-S0 -r 0x00000021 -o test.txt | tee test.test -python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -d EL7041-0052 -r 0x00100034 -o test.cmd +python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -d el70xx-0052 -r 0x00100034 -o test.cmd #- List available devices and version in the xml lib python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -l -o slask.txt ``` @@ -33,10 +33,10 @@ bash read_el70xx_diag.sh Example: master 0, slave 3, drive under voltage warning ```bash -bash read_el7041_diag.sh 0 3 +bash read_el70xx_diag.sh 0 3 ######################################################### -Reading EL7041 status at masterid 0 and slave id 3: +Reading el70xx status at masterid 0 and slave id 3: Saturated: 0x00 0 @@ -63,3 +63,29 @@ Misc error: For more information check docs for [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) +## Read EL5042 diagnostic, read_el5042_diag.sh +Read diagnostics from EL5042 + +Example: master 1, slave 14, ch 0 +```bash +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: +0x00 0 +WD Error: +0x00 0 +Data valid: +0x01 1 +Data raw value: +0xd00000007f231e1b 14987979562022018587 + +######################################################### +``` +For more information check docs for [Index A0p8 FB BiSS-C Diag data (for Ch.1, p = 0; Ch.2, p = 1)](https://infosys.beckhoff.com/english.php?content=../content/1033/el5042/4216754315.html&id=695067345900842552) From fabf224a171bede76b07344cbae30e3a43110135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 14:38:00 +0200 Subject: [PATCH 084/128] Fix doc --- hugo/content/manual/troubleshooting/hardware.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index d26eac3fa..3048113cc 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -172,9 +172,9 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-BISS-C,CH_ * 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). -{{% warning %}} +{{% notice warning %}} If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning). -{{% /warning %}} +{{% /notice %}} Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28) ``` From cefe2d3a3eef7c7f27fe3a352b3307647f062cce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 25 Sep 2024 14:42:38 +0200 Subject: [PATCH 085/128] Fix doc --- hugo/content/manual/troubleshooting/hardware.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 3048113cc..d5d4383c1 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -7,10 +7,11 @@ chapter = false *** *** ## Topics -1. [over current protection](#over current protection) -2. [el7041 error/warning](#el7041 error/warning) -3. [latency issues](#latency issues) -4. [latency issues](#latency issues) +1. [over current protection](#over-current-protection) +2. [el7041 error/warning](#el7041-error/warning) +3. [EL5042](el5042-configuration) +4. [latency issues](#latency-issues) + --- ### 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. From 192a7943e3c53e3b4603e0e2f1436602e86d8162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 26 Sep 2024 11:06:10 +0200 Subject: [PATCH 086/128] Update manual --- .../best_practice/stepper_biss_c.md | 6 +++ .../manual/troubleshooting/hardware.md | 43 ++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md index e1422834e..0c5db9095 100644 --- a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md @@ -48,6 +48,12 @@ encoder: - 1 # Error 0 ``` +**Hardware configuration EL5042** + +{{% notice warning %}} +Do not use the LSB offset functionality of the EL5042 (0x80p8:17). The same amount of ones ("1") 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. +{{% /notice %}} + #### open loop (encoder 2) The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): * encoder.numerator: Travels 1 mm/rev diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index d5d4383c1..8a0cd62b2 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -8,8 +8,8 @@ chapter = false *** ## Topics 1. [over current protection](#over-current-protection) -2. [el7041 error/warning](#el7041-error/warning) -3. [EL5042](el5042-configuration) +2. [EL7041 error/warning](#EL7041-error/warning) +3. [EL5042](EL5042-configuration) 4. [latency issues](#latency-issues) --- @@ -156,6 +156,11 @@ Increase until the motor misbehaves and go back to a safe setting. ### EL5042 configuration #### Offset LSB Bit [Bit] (0x80p8:17) + +{{% notice warning %}} +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. +{{% /notice %}} + 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 @@ -200,6 +205,40 @@ 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 teh 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. +#### 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)](https://infosys.beckhoff.com/english.php?content=../content/1033/el5042/4216754315.html&id=695067345900842552): + +The ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics: +```bash +bash read_el5042_diag.sh +``` +NOTE: The channel id starts at 0. First encoder channel is 0. + +Example: master 1, slave 14, channel 0 +```bash +# 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. + ### 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 teh ecmc_rt thread can be related to: From 5c24ff61494b04f7688d146603160e864c41dccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 26 Sep 2024 11:39:27 +0200 Subject: [PATCH 087/128] Fix PV for next PLC obj ID --- db/core/ecmcPlc.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/core/ecmcPlc.template b/db/core/ecmcPlc.template index 826700534..c7b25469f 100644 --- a/db/core/ecmcPlc.template +++ b/db/core/ecmcPlc.template @@ -29,7 +29,7 @@ record(ai,"$(Name)$(PLC_ERROR)"){ field(FLNK, "$(FLNK=)") } -record(ao,"$(Name)MCU-Cfg-PLC${Index}-NxtObjId") { +record(ai,"$(Name)MCU-Cfg-PLC${Index}-NxtObjId") { field(DESC, "PLC number of next PLC") field(VAL, "$(NEXT_OBJ_ID=-1)") } From c87ff5109ed383274708cbc02774447eabca94d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 26 Sep 2024 11:54:09 +0200 Subject: [PATCH 088/128] Initilaze PVs for all first objects to -1 --- startup.cmd | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/startup.cmd b/startup.cmd index 1672ef1f3..88a1ab8a8 100644 --- a/startup.cmd +++ b/startup.cmd @@ -148,6 +148,23 @@ ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}setDiagnostics.cmd # Load ecmc inforamtion into record dbLoadRecords("ecmcMcuInfo.db","P=${SM_PREFIX},ECMC_VER=${ECMC_VER}, M_ID=${ECMC_EC_MASTER_ID}, ,MCU_NAME=${ECMC_P_SCRIPT}, M_RATE=${ECMC_EC_SAMPLE_RATE}, M_TIME=${ECMC_EC_SAMPLE_RATE_MS},PV_TIME=${ECMC_SAMPLE_RATE_MS}, MCU_MODE=${ECMC_MODE},MCU_PVA=${PVA=No},MCU_ENG=${ECMC_ENG_MODE=0}") +#------------------------------------------------------------------------------- +#- Initialize links to first objects to -1 +ecmcFileExist(ecmcAxFirstAxis.db,1,1) +dbLoadRecords(ecmcAxFirstAxis.db,"P=${ECMC_PREFIX}") + +ecmcFileExist(ecmcEcFirstSlave.db,1,1) +dbLoadRecords(ecmcEcFirstSlave.db,"P=${ECMC_PREFIX}") + +ecmcFileExist(ecmcPlcFirstPlc.db,1,1) +dbLoadRecords(ecmcPlcFirstPlc.db,"P=${ECMC_PREFIX}") + +ecmcFileExist(ecmcPlgFirstPlg.db,1,1) +dbLoadRecords(ecmcPlgFirstPlg.db,"P=${ECMC_PREFIX}") + +ecmcFileExist(ecmcDsFirstDs.db,1,1) +dbLoadRecords(ecmcDsFirstDs.db,"P=${ECMC_PREFIX}") + #------------------------------------------------------------------------------- #- Set path to ethercat tool #- Set default From 9ee44a30b8232ffc5b4b9a809e7c159dc8b02f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 08:35:02 +0200 Subject: [PATCH 089/128] Remove PINI for mr sync cmd --- db/core/ecmcMotorRecord.template | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/db/core/ecmcMotorRecord.template b/db/core/ecmcMotorRecord.template index 3b1fe206c..960c26961 100644 --- a/db/core/ecmcMotorRecord.template +++ b/db/core/ecmcMotorRecord.template @@ -388,8 +388,7 @@ record(seq, "${PREFIX}${MOTOR_NAME}-StpCmd_") { ################################################################ # Sync only record(longin,"${PREFIX}${MOTOR_NAME}-SyncMrCmd"){ - field(DESC, "${MOTOR_NAME}: Sync MR") - field(PINI, "$(PINI=1)") + field(DESC, "${MOTOR_NAME}: Sync MR") field(DTYP, "asynInt32") field(INP, "@asyn($(MOTOR_PORT),$(AXIS_NO))TRIGG_SYNC") field(SCAN, "I/O Intr") From e257a07c95c95df5262c2c408edd1ecdac14251d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 11:04:09 +0200 Subject: [PATCH 090/128] Add DESC macro to loadPLCFile.cmd --- scripts/loadPLCFile.cmd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/loadPLCFile.cmd b/scripts/loadPLCFile.cmd index ea1937f9f..95e1c8670 100644 --- a/scripts/loadPLCFile.cmd +++ b/scripts/loadPLCFile.cmd @@ -19,6 +19,7 @@ #-d \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). #-d \param SUBST_FILE (optional) custom substitution file otherwise ecmccfg default will be loaded #-d \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). +#-d \param DESC (optional) Description of PLC #-d \note Example call: #-d \code #-d ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100" @@ -60,7 +61,7 @@ ecmcConfigOrDie "Cfg.LoadPLCFile(${ECMC_PLC_ID},${ECMC_TMP_FILE})" system "rm -f ${ECMC_TMP_FILE}" ecmcFileExist(${SUBST_FILE="ecmcPlc.substitutions"},1,1) ecmcEpicsEnvSetCalc(ECMC_PLC_ID_2_CHARS, "${ECMC_PLC_ID}", "%02d") -dbLoadTemplate(${SUBST_FILE="ecmcPlc.substitutions"}, "PORT=${ECMC_ASYN_PORT},A=0,P=${ECMC_PREFIX},Index=${ECMC_PLC_ID},Name=${ECMC_PREFIX},Index2Char=${ECMC_PLC_ID_2_CHARS},T_SMP_MS=${ECMC_SAMPLE_RATE_MS},PREV_OBJ_ID=${ECMC_PREV_PLC_OBJ_ID=-1}") +dbLoadTemplate(${SUBST_FILE="ecmcPlc.substitutions"}, "PORT=${ECMC_ASYN_PORT},A=0,P=${ECMC_PREFIX},Index=${ECMC_PLC_ID},Name=${ECMC_PREFIX},Index2Char=${ECMC_PLC_ID_2_CHARS},T_SMP_MS=${ECMC_SAMPLE_RATE_MS},PREV_OBJ_ID=${ECMC_PREV_PLC_OBJ_ID=-1}, DESC='${DESC=PLC_${ECMC_PLC_ID}}'") epicsEnvUnset(ECMC_PLC_ID_2_CHARS) #- Below for facilitate auto gui generation From 60a07a4951551b79ff1d6650844bceb40ce62be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 11:04:32 +0200 Subject: [PATCH 091/128] Update PLC db --- db/core/ecmcPlc.substitutions | 4 +- db/core/ecmcPlc.template | 15 +- qt/ecmcPLCxx.ui | 375 ++++++++++++++++++++++++++-------- 3 files changed, 303 insertions(+), 91 deletions(-) diff --git a/db/core/ecmcPlc.substitutions b/db/core/ecmcPlc.substitutions index e432c35cb..77d1c9f37 100644 --- a/db/core/ecmcPlc.substitutions +++ b/db/core/ecmcPlc.substitutions @@ -1,5 +1,5 @@ file ecmcPlc.template { - pattern { PLC_ENABLE, PLC_SCANTIME, PLC_ERROR } - { PLC$(Index2Char)-EnaCmd, PLC$(Index2Char)-ScanTime, PLC$(Index2Char)-Err } + pattern { PLC_ENABLE, PLC_SCANTIME, PLC_ERROR, DESC_NAME} + { PLC$(Index2Char)-EnaCmd, PLC$(Index2Char)-ScanTime, PLC$(Index2Char)-Err, PLC$(Index2Char)-Desc } } diff --git a/db/core/ecmcPlc.template b/db/core/ecmcPlc.template index c7b25469f..3dc0c4bf4 100644 --- a/db/core/ecmcPlc.template +++ b/db/core/ecmcPlc.template @@ -1,32 +1,30 @@ record(bo,"$(Name)$(PLC_ENABLE)"){ info(asyn:READBACK,"1") field(PINI, "$(PINI=YES)") - field(DESC, "$(DESC=PLC$(Index) enable)") + field(DESC, "PLC$(Index) enable") field(DTYP, "$(DTYP=asynInt32)") field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))CMD=FLOAT64TOINT32/T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynFloat64/plcs.plc${Index}.enable?") field(ZNAM, "disable") field(ONAM, "enable") field(SCAN, "Passive") - field(FLNK, "$(FLNK=)") } record(ai,"$(Name)$(PLC_SCANTIME)"){ field(PINI, "$(PINI=YES)") - field(DESC, "$(DESC=PLC$(Index) scantime)") + field(DESC, "PLC$(Index) scantime") field(DTYP, "$(DTYP=asynFloat64)") field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynFloat64/plcs.plc${Index}.scantime?") field(SCAN, "Passive") + field(PREC, "4") field(EGU, "s") - field(FLNK, "$(FLNK=)") } record(ai,"$(Name)$(PLC_ERROR)"){ field(PINI, "$(PINI=YES)") - field(DESC, "$(DESC=PLC$(Index) error)") + field(DESC, "PLC$(Index) error") field(DTYP, "$(DTYP=asynFloat64)") field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))T_SMP_MS=$(T_SMP_MS=1000)/TYPE=asynFloat64/plcs.plc${Index}.error?") field(SCAN, "Passive") - field(FLNK, "$(FLNK=)") } record(ai,"$(Name)MCU-Cfg-PLC${Index}-NxtObjId") { @@ -38,3 +36,8 @@ record(ao,"$(Name)MCU-Cfg-PLC${Index}-PrvObjId") { field(DESC, "PLC number of prev PLC") field(VAL, "$(PREV_OBJ_ID=-1)") } + +record(stringin,"$(Name)$(DESC_NAME)") { + field(DESC, "PLC Info") + field(VAL, "${DESC=PLC ${index}}") +} diff --git a/qt/ecmcPLCxx.ui b/qt/ecmcPLCxx.ui index 3b69992cc..abaa452b7 100644 --- a/qt/ecmcPLCxx.ui +++ b/qt/ecmcPLCxx.ui @@ -1,30 +1,142 @@ - MainWindow - + Dialog + 0 0 - 163 - 154 + 359 + 196 - MainWindow + Dialog - - + + + + 205 + 75 + 146 + 111 + + + + Navigation: + + + + + 25 + 30 + 100 + 16 + + + + + 16777215 + 16 + + + + + 11 + + + + Next: + + + ESimpleLabel::None + + + + + + -55 + 30 + 100 + 16 + + + + + 16777215 + 16 + + + + + 11 + + + + Prev: + + + ESimpleLabel::None + + + + + + 55 + 55 + 31 + 18 + + + + + 16777215 + 18 + + + + $(ID_1) + + + + + + + 192 + 192 + 192 + + + + caLineEdit::Static + + + caLineEdit::Channel + + + caLineEdit::User + + + caLineEdit::WidthAndHeight + + + true + + + - 10 - 60 - 51 - 46 + 85 + 50 + 66 + 51 + + -2 + - SYS=$(SYS),IOC=$(IOC),ID_1=$(ID_1),ID_2=$(ID_2) + SYS=$(IOC),IOC=$(IOC),ID_1=$(ID_1) caFrame::Calc @@ -33,35 +145,35 @@ A>-1 - $(IOC):MCU-Cfg-PLC$(ID_1)-PrvObjId + $(IOC):MCU-Cfg-PLC$(ID_1)-NxtObjId - + - 5 - 2 + 10 + 5 41 18 - << + >> Open first axis - bash /ioc/modules/qt/ecmcOpenPrevPLC.sh + bash /ioc/modules/qt/ecmcOpenNextPLC.sh $(SYS) $(ID_1) - + - 5 - 25 + 10 + 30 41 16 @@ -73,7 +185,7 @@ - $(IOC):MCU-Cfg-PLC$(ID_1)-PrvObjId + $(IOC):MCU-Cfg-PLC$(ID_1)-NxtObjId @@ -96,36 +208,20 @@ - + - 25 - 45 - 100 - 16 + -5 + 50 + 66 + 51 - - - 16777215 - 16 - - - - Next: - - - - - - 85 - 60 - 56 - 46 - + + -2 - SYS=$(SYS),IOC=$(IOC),ID_1=$(ID_1),ID_2=$(ID_2) + SYS=$(IOC),IOC=$(IOC),ID_1=$(ID_1) caFrame::Calc @@ -134,35 +230,35 @@ A>-1 - $(IOC):MCU-Cfg-PLC$(ID_1)-NxtObjId + $(IOC):MCU-Cfg-PLC$(ID_1)-PrvObjId - + 10 - 2 + 5 41 18 - >> + << Open first axis - bash /ioc/modules/qt/ecmcOpenNextPLC.sh + bash /ioc/modules/qt/ecmcOpenPrevPLC.sh $(SYS) $(ID_1) - + 10 - 25 + 30 41 16 @@ -174,7 +270,7 @@ - $(IOC):MCU-Cfg-PLC$(ID_1)-NxtObjId + $(IOC):MCU-Cfg-PLC$(ID_1)-PrvObjId @@ -197,12 +293,74 @@ - + + + + + 10 + 42 + 341 + 20 + + + + true + + + $(IOC):PLC$(ID_2)-Desc + + + caLineEdit::WidthAndHeight + + + caLineEdit::string + + + + + + 10 + 75 + 186 + 111 + + + + Status/Control: + + - -55 - 45 - 100 + 120 + 25 + 30 + 30 + + + + $(IOC):PLC$(ID_2)-Err + + + + 0 + 85 + 0 + + + + + 170 + 0 + 0 + + + + + + + -35 + 30 + 131 16 @@ -212,16 +370,24 @@ 16 + + + 11 + + - Prev: + Error: + + + ESimpleLabel::None - + - 60 - 60 - 31 + 110 + 55 + 56 16 @@ -231,11 +397,8 @@ 18 - - $(ID_1) - - + $(IOC):PLC$(ID_2)-ScanTime @@ -257,27 +420,38 @@ true - + - 15 - 10 - 100 - 22 + -35 + 55 + 131 + 16 + + + 16777215 + 16 + + + + + 11 + + - Enable + Scan time [s]: - - $(IOC):PLC$(ID_2)-EnaCmd + + ESimpleLabel::None - 90 - 5 + 135 + 75 30 30 @@ -293,18 +467,53 @@ + + + + 25 + 80 + 100 + 22 + + + + + 11 + + + + Qt::RightToLeft + + + Enable: + + + $(IOC):PLC$(ID_2)-EnaCmd + + + caToggleButton::None + + - + - 0 - 0 - 163 - 25 + 10 + 20 + 181 + 21 + + PLC $(ID_1) description: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + - From 0acc749e7a6b598b8db42c993adc8b42b46a5fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 11:05:08 +0200 Subject: [PATCH 092/128] Add a few topics on EL5042 troubleshooting --- .../manual/troubleshooting/hardware.md | 73 +++++++++++++++++-- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 8a0cd62b2..e4b12b985 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -9,7 +9,7 @@ chapter = false ## Topics 1. [over current protection](#over-current-protection) 2. [EL7041 error/warning](#EL7041-error/warning) -3. [EL5042](EL5042-configuration) +3. [EL5042](EL5042) 4. [latency issues](#latency-issues) --- @@ -153,7 +153,70 @@ 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. -### EL5042 configuration +### EL5042 + +#### No reading from EL5042 + +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 +* Long cabling lengths + +**Bad electrical connection** + +The serial communication performed by two RS422 channels, one for the clock and one for data. These channels can easily 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. 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. faulty EL5042 + +**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. + +{{% notice warning %}} +Never apply a higher voltage than the specified operating voltage for the encoder. +{{% /notice %}} + +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 ensureing that the encoder is correctly supplied, it's a good ide to measure the power consumption of the encoder and compare with the specified consumption. If the power consumption does not match, the encoder might be borken 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): + +```bash +${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. #### Offset LSB Bit [Bit] (0x80p8:17) @@ -202,7 +265,7 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID= ``` 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 teh status bits (to use from PLC or for interlock) +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. #### Diagnostics @@ -241,7 +304,7 @@ Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnosti ### 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 teh ecmc_rt thread can be related to: +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 3. ... @@ -282,7 +345,7 @@ Setting the affinity of the ecmc realtiem thread can often improve the performac At PSI, core 0 is always isolated, do not move any threads to core 0. {{% /notice %}} -In order to pin teh ecmc thread to a single core, add the following line to the startup script (after setAppMode.cmd): +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 From d2a803e3a18028bb8e739cad4d91ac8cf1272447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 11:16:35 +0200 Subject: [PATCH 093/128] Cleanup EL5042 troubleshooting --- .../manual/troubleshooting/hardware.md | 81 ++++++++++--------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index e4b12b985..327b7a6de 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -9,7 +9,7 @@ chapter = false ## Topics 1. [over current protection](#over-current-protection) 2. [EL7041 error/warning](#EL7041-error/warning) -3. [EL5042](EL5042) +3. [EL5042](#EL5042) 4. [latency issues](#latency-issues) --- @@ -161,9 +161,11 @@ 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 +* 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 performed by two RS422 channels, one for the clock and one for data. These channels can easily be measured with a scope: @@ -174,9 +176,10 @@ 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. faulty EL5042 +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. {{% notice warning %}} @@ -185,9 +188,10 @@ Never apply a higher voltage than the specified operating voltage for the encode 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 ensureing that the encoder is correctly supplied, it's a good ide to measure the power consumption of the encoder and compare with the specified consumption. If the power consumption does not match, the encoder might be borken or a faulty cabling. +After ensureing that the encoder is correctly supplied, it's a good ide to measure 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:_ @@ -218,6 +222,41 @@ For EL5042 the following rates are availble: 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)](https://infosys.beckhoff.com/english.php?content=../content/1033/el5042/4216754315.html&id=695067345900842552): + +The ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics: +```bash +bash read_el5042_diag.sh +``` +NOTE: The channel id starts at 0. First encoder channel is 0. + +Example: master 1, slave 14, channel 0 +```bash +# 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. + #### Offset LSB Bit [Bit] (0x80p8:17) {{% notice warning %}} @@ -268,40 +307,6 @@ 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. -#### 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)](https://infosys.beckhoff.com/english.php?content=../content/1033/el5042/4216754315.html&id=695067345900842552): - -The ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics: -```bash -bash read_el5042_diag.sh -``` -NOTE: The channel id starts at 0. First encoder channel is 0. - -Example: master 1, slave 14, channel 0 -```bash -# 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. - ### 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: From e5d5cd01e8dff34cd9f815466e1328c08fb18f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 11:24:25 +0200 Subject: [PATCH 094/128] Update EL70xx trouble shooting --- hugo/content/manual/troubleshooting/hardware.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 327b7a6de..f11c77d13 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -108,27 +108,31 @@ Misc error: Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics. #### under voltage -Under voltage could be that the drive voltage setting is 48V but the drive is only powered with 24V. -The nominal voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). +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). + +The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). Example: Set nominal voltage to 24V ``` ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=24000, R_COIL_MOHM=1230'" - ``` +{{% notice info %}} +For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). +{{% /notice %}} + #### over voltage -Over voltage could be that the drive voltage setting is 24V but the drive is powered with 48V. -The nominal voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). +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). + +The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). Example: Set nominal voltage to 48V ``` ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" - ``` {{% notice info %}} From 94ba82265a19c9dd7b45943d89ae70441e4808ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 12:00:52 +0200 Subject: [PATCH 095/128] Divide hardware troubleshooting in the hardweare types --- .../manual/troubleshooting/hardware.md | 373 ------------------ .../manual/troubleshooting/hardware/EL5042.md | 168 ++++++++ .../manual/troubleshooting/hardware/EL70x1.md | 159 ++++++++ .../manual/troubleshooting/hardware/EL9xxx.md | 26 ++ .../manual/troubleshooting/hardware/_index.md | 10 + .../manual/troubleshooting/hardware/host.md | 73 ++++ hugo/content/manual/troubleshooting/tuning.md | 2 +- 7 files changed, 437 insertions(+), 374 deletions(-) delete mode 100644 hugo/content/manual/troubleshooting/hardware.md create mode 100644 hugo/content/manual/troubleshooting/hardware/EL5042.md create mode 100644 hugo/content/manual/troubleshooting/hardware/EL70x1.md create mode 100644 hugo/content/manual/troubleshooting/hardware/EL9xxx.md create mode 100644 hugo/content/manual/troubleshooting/hardware/_index.md create mode 100644 hugo/content/manual/troubleshooting/hardware/host.md diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md deleted file mode 100644 index f11c77d13..000000000 --- a/hugo/content/manual/troubleshooting/hardware.md +++ /dev/null @@ -1,373 +0,0 @@ -+++ -title = "hardware" -weight = 16 -chapter = false -+++ - -*** -*** -## Topics -1. [over current protection](#over-current-protection) -2. [EL7041 error/warning](#EL7041-error/warning) -3. [EL5042](#EL5042) -4. [latency issues](#latency-issues) - ---- -### 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. - -{{% notice warning %}} -Before pressing the buttons, check the electrical drawings. Make sure it's safe to power on the system. -{{% /notice %}} - -#### 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. - -### el7041 error/warning -If 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](ethercatcli) for more info. - -{{% notice info %}} -In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. -{{% /notice %}} - - -The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the folowing syntax: - -```bash -ethercat upload -m -p --type uint8 0xA010 -``` -Example for master 0, slave position 3: -```bash -# 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: -```bash -bash read_el70xx_diag.sh -``` - -Example: master 0, slave 3, drive under voltage warning -```bash -bash 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. - -#### under 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). - -The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). - -Example: Set nominal voltage to 24V -``` -${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" -${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=24000, R_COIL_MOHM=1230'" -``` - -{{% notice info %}} -For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). -{{% /notice %}} - -#### 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). - -The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). - -Example: Set nominal voltage to 48V -``` -${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" -${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" -``` - -{{% notice info %}} -For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). -{{% /notice %}} - -### 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. 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. - -### EL5042 - -#### No reading from EL5042 - -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 performed by two RS422 channels, one for the clock and one for data. These channels can easily 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. 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. - -{{% notice warning %}} -Never apply a higher voltage than the specified operating voltage for the encoder. -{{% /notice %}} - -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 ensureing that the encoder is correctly supplied, it's a good ide to measure 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): - -```bash -${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)](https://infosys.beckhoff.com/english.php?content=../content/1033/el5042/4216754315.html&id=695067345900842552): - -The ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics: -```bash -bash read_el5042_diag.sh -``` -NOTE: The channel id starts at 0. First encoder channel is 0. - -Example: master 1, slave 14, channel 0 -```bash -# 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. - -#### Offset LSB Bit [Bit] (0x80p8:17) - -{{% notice warning %}} -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. -{{% /notice %}} - -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 on EL5042 -* 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). - -{{% notice warning %}} -If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning). -{{% /notice %}} - -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 -# 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 "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. - -### 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 -3. ... - -#### 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/\/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" -``` -{{% notice info %}} -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. -{{% /notice %}} - -** Affinity** -Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. -{{% notice warning %}} -At PSI, core 0 is always isolated, do not move any threads to core 0. -{{% /notice %}} - -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" -``` -{{% notice info %}} -cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. -{{% /notice %}} diff --git a/hugo/content/manual/troubleshooting/hardware/EL5042.md b/hugo/content/manual/troubleshooting/hardware/EL5042.md new file mode 100644 index 000000000..1400c16b3 --- /dev/null +++ b/hugo/content/manual/troubleshooting/hardware/EL5042.md @@ -0,0 +1,168 @@ ++++ +title = "EL5042" +weight = 15 +chapter = false ++++ + +*** +*** + +## Topics +1. [No reading](#No-reading) +2. [Diagnostics](#Diagnostics) +3. [Offset LSB Bit [Bit] (0x80p8:17)](#Offset-LSB-Bit-[Bit]-(0x80p8:17)) +4. [SSI](#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 performed by two RS422 channels, one for the clock and one for data. These channels can easily 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. 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. + +{{% notice warning %}} +Never apply a higher voltage than the specified operating voltage for the encoder. +{{% /notice %}} + +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 ensureing that the encoder is correctly supplied, it's a good ide to measure 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): + +```bash +${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)](https://infosys.beckhoff.com/english.php?content=../content/1033/el5042/4216754315.html&id=695067345900842552): + +The ecmccfg/utils/read_el5042_diag.sh tool can be used for reading the diagnostics: +```bash +bash read_el5042_diag.sh +``` +NOTE: The channel id starts at 0. First encoder channel is 0. + +Example: master 1, slave 14, channel 0 +```bash +# 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. + +### Offset LSB Bit [Bit] (0x80p8:17) + +{{% notice warning %}} +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. +{{% /notice %}} + +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). + +{{% notice warning %}} +If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning). +{{% /notice %}} + +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 +# 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 "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. diff --git a/hugo/content/manual/troubleshooting/hardware/EL70x1.md b/hugo/content/manual/troubleshooting/hardware/EL70x1.md new file mode 100644 index 000000000..4238bfefc --- /dev/null +++ b/hugo/content/manual/troubleshooting/hardware/EL70x1.md @@ -0,0 +1,159 @@ ++++ +title = "EL70x1" +weight = 18 +chapter = false ++++ + +*** +*** + +## Topics +1. [Diagnostics](#Diagnostics) +2. [Tuning](#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](ethercatcli) for more info. + +{{% notice info %}} +In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. +{{% /notice %}} + +The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the folowing syntax: + +```bash +ethercat upload -m -p --type uint8 0xA010 +``` +Example for master 0, slave position 3: +```bash +# 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: +```bash +bash read_el70xx_diag.sh +``` + +Example: master 0, slave 3, drive under voltage warning +```bash +bash 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. + +#### under 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). + +The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). + +Example: Set nominal voltage to 24V +``` +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=24000, R_COIL_MOHM=1230'" +``` + +{{% notice info %}} +For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). +{{% /notice %}} + +#### 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). + +The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). + +Example: Set nominal voltage to 48V +``` +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" +``` + +{{% notice info %}} +For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). +{{% /notice %}} + +### Tuning + +There are normally several control loops in an ecmc system: +* Position loop (centralized in ecmc if CSV) +* Velocity loop (in drive) +* Current loop (in drive) + +However, for the EL70x1 drives there's no dedicated velocity loop (however some current boost settings that can be applied in acc/dec, see below) + +#### Position 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. + +#### Current 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. + +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. 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. + +Also see troubleshooting/tuning section. + diff --git a/hugo/content/manual/troubleshooting/hardware/EL9xxx.md b/hugo/content/manual/troubleshooting/hardware/EL9xxx.md new file mode 100644 index 000000000..b17e65717 --- /dev/null +++ b/hugo/content/manual/troubleshooting/hardware/EL9xxx.md @@ -0,0 +1,26 @@ ++++ +title = "EL9xxx" +weight = 20 +chapter = false ++++ + +*** +*** +## Topics +1. [over current protection](#over-current-protection) + +--- +### 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. + +{{% notice warning %}} +Before pressing the buttons, check the electrical drawings. Make sure it's safe to power on the system. +{{% /notice %}} + +#### 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. diff --git a/hugo/content/manual/troubleshooting/hardware/_index.md b/hugo/content/manual/troubleshooting/hardware/_index.md new file mode 100644 index 000000000..70dcccf14 --- /dev/null +++ b/hugo/content/manual/troubleshooting/hardware/_index.md @@ -0,0 +1,10 @@ ++++ +title = "hardware" +weight = 15 +chapter = false ++++ + +*** +## Topics +{{% children %}} +--- diff --git a/hugo/content/manual/troubleshooting/hardware/host.md b/hugo/content/manual/troubleshooting/hardware/host.md new file mode 100644 index 000000000..661b3c477 --- /dev/null +++ b/hugo/content/manual/troubleshooting/hardware/host.md @@ -0,0 +1,73 @@ ++++ +title = "ecmc server" +weight = 14 +chapter = false ++++ + +*** +*** +## Topics +1. [latency issues](#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 +3. ... + +#### 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/\/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" +``` +{{% notice info %}} +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. +{{% /notice %}} + +** Affinity** +Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. +{{% notice warning %}} +At PSI, core 0 is always isolated, do not move any threads to core 0. +{{% /notice %}} + +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" +``` +{{% notice info %}} +cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. +{{% /notice %}} diff --git a/hugo/content/manual/troubleshooting/tuning.md b/hugo/content/manual/troubleshooting/tuning.md index 53068ccb8..abe8fbbac 100644 --- a/hugo/content/manual/troubleshooting/tuning.md +++ b/hugo/content/manual/troubleshooting/tuning.md @@ -1,6 +1,6 @@ +++ title = "tuning" -weight = 15 +weight = 16 chapter = false +++ From eea44eccb63cd38c30e8afa90b122f61e0c2a4e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 12:06:08 +0200 Subject: [PATCH 096/128] Remove yaml-homing section in docs (moved to encoder.homing) --- hugo/content/manual/motion_cfg/axisYaml.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/hugo/content/manual/motion_cfg/axisYaml.md b/hugo/content/manual/motion_cfg/axisYaml.md index 9c541ad7e..75b95a551 100644 --- a/hugo/content/manual/motion_cfg/axisYaml.md +++ b/hugo/content/manual/motion_cfg/axisYaml.md @@ -562,20 +562,6 @@ input: 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 -# 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) -# acc: 20 # Acceleration during homing -# dec: 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 -# timeout: 100 # Sequence timeout softlimits: enable: false # Enable soft limits From dc9b73e7fca50d3a90c7643eaf7035211ec13bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 12:11:01 +0200 Subject: [PATCH 097/128] Cleanup --- hugo/content/manual/troubleshooting/hardware/EL5042.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware/EL5042.md b/hugo/content/manual/troubleshooting/hardware/EL5042.md index 1400c16b3..ed396cbfd 100644 --- a/hugo/content/manual/troubleshooting/hardware/EL5042.md +++ b/hugo/content/manual/troubleshooting/hardware/EL5042.md @@ -28,8 +28,8 @@ Always start troubleshooting by checking the error, warning and ready bits and r #### Bad electrical connection -The serial communication performed by two RS422 channels, one for the clock and one for data. These channels can easily 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. And the frequency of the clock pulses should correspond with the setting in your startup script (normally 250kHz..10Mhz depending on configuration) +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): @@ -48,13 +48,13 @@ Never apply a higher voltage than the specified operating voltage for the encode 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 ensureing that the encoder is correctly supplied, it's a good ide to measure 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. +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:_ +**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. @@ -63,7 +63,7 @@ If the voltage is to low (mainly for 5V encoders): 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:_ +**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): ```bash From 6a1b75dbb3327a4951ef5f4905cbefedf0be2bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 12:31:00 +0200 Subject: [PATCH 098/128] Rename troubleshooting to knowledgebase --- .../_index.md | 2 +- .../ethercatCLI.md | 0 .../general.md | 0 .../hardware/EL5042.md | 0 .../hardware/EL70x1.md | 0 .../manual/knowledgebase/hardware/EL9xxx.md | 36 +++++++++++++++++++ .../hardware/_index.md | 0 .../hardware/host.md | 0 .../manual.md | 0 .../motion.md | 0 .../tuning.md | 0 .../manual/troubleshooting/hardware/EL9xxx.md | 26 -------------- 12 files changed, 37 insertions(+), 27 deletions(-) rename hugo/content/manual/{troubleshooting => knowledgebase}/_index.md (97%) rename hugo/content/manual/{troubleshooting => knowledgebase}/ethercatCLI.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/general.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/hardware/EL5042.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/hardware/EL70x1.md (100%) create mode 100644 hugo/content/manual/knowledgebase/hardware/EL9xxx.md rename hugo/content/manual/{troubleshooting => knowledgebase}/hardware/_index.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/hardware/host.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/manual.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/motion.md (100%) rename hugo/content/manual/{troubleshooting => knowledgebase}/tuning.md (100%) delete mode 100644 hugo/content/manual/troubleshooting/hardware/EL9xxx.md diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/knowledgebase/_index.md similarity index 97% rename from hugo/content/manual/troubleshooting/_index.md rename to hugo/content/manual/knowledgebase/_index.md index 52cb4f63a..25c5071a8 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/knowledgebase/_index.md @@ -1,5 +1,5 @@ +++ -title = "troubleshooting" +title = "knowledge base" weight = 15 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/ethercatCLI.md b/hugo/content/manual/knowledgebase/ethercatCLI.md similarity index 100% rename from hugo/content/manual/troubleshooting/ethercatCLI.md rename to hugo/content/manual/knowledgebase/ethercatCLI.md diff --git a/hugo/content/manual/troubleshooting/general.md b/hugo/content/manual/knowledgebase/general.md similarity index 100% rename from hugo/content/manual/troubleshooting/general.md rename to hugo/content/manual/knowledgebase/general.md diff --git a/hugo/content/manual/troubleshooting/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md similarity index 100% rename from hugo/content/manual/troubleshooting/hardware/EL5042.md rename to hugo/content/manual/knowledgebase/hardware/EL5042.md diff --git a/hugo/content/manual/troubleshooting/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md similarity index 100% rename from hugo/content/manual/troubleshooting/hardware/EL70x1.md rename to hugo/content/manual/knowledgebase/hardware/EL70x1.md diff --git a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md new file mode 100644 index 000000000..c4bfd8399 --- /dev/null +++ b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md @@ -0,0 +1,36 @@ ++++ +title = "EL9xxx" +weight = 20 +chapter = false ++++ + +*** +*** +## Topics +1. [over current protection](#over-current-protection) +2. [passive terminals](#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. + +{{% notice warning %}} +Before pressing the buttons, check the electrical drawings. Make sure it's safe to power on the system. +{{% /notice %}} + +#### 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. + +{{% notice warning %}} +**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.** +{{% /notice %}} diff --git a/hugo/content/manual/troubleshooting/hardware/_index.md b/hugo/content/manual/knowledgebase/hardware/_index.md similarity index 100% rename from hugo/content/manual/troubleshooting/hardware/_index.md rename to hugo/content/manual/knowledgebase/hardware/_index.md diff --git a/hugo/content/manual/troubleshooting/hardware/host.md b/hugo/content/manual/knowledgebase/hardware/host.md similarity index 100% rename from hugo/content/manual/troubleshooting/hardware/host.md rename to hugo/content/manual/knowledgebase/hardware/host.md diff --git a/hugo/content/manual/troubleshooting/manual.md b/hugo/content/manual/knowledgebase/manual.md similarity index 100% rename from hugo/content/manual/troubleshooting/manual.md rename to hugo/content/manual/knowledgebase/manual.md diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/knowledgebase/motion.md similarity index 100% rename from hugo/content/manual/troubleshooting/motion.md rename to hugo/content/manual/knowledgebase/motion.md diff --git a/hugo/content/manual/troubleshooting/tuning.md b/hugo/content/manual/knowledgebase/tuning.md similarity index 100% rename from hugo/content/manual/troubleshooting/tuning.md rename to hugo/content/manual/knowledgebase/tuning.md diff --git a/hugo/content/manual/troubleshooting/hardware/EL9xxx.md b/hugo/content/manual/troubleshooting/hardware/EL9xxx.md deleted file mode 100644 index b17e65717..000000000 --- a/hugo/content/manual/troubleshooting/hardware/EL9xxx.md +++ /dev/null @@ -1,26 +0,0 @@ -+++ -title = "EL9xxx" -weight = 20 -chapter = false -+++ - -*** -*** -## Topics -1. [over current protection](#over-current-protection) - ---- -### 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. - -{{% notice warning %}} -Before pressing the buttons, check the electrical drawings. Make sure it's safe to power on the system. -{{% /notice %}} - -#### 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. From d34e209565fc6c44fb87199d75ba2332837de9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 13:52:51 +0200 Subject: [PATCH 099/128] Slight resturcture in manual --- .../manual/general_cfg/best_practice.md | 28 ++++++++++++ .../manual/general_cfg/startup/_index.md | 3 -- .../manual/knowledgebase/hardware/EL5042.md | 8 ++-- .../manual/knowledgebase/hardware/EL70x1.md | 2 +- .../manual/knowledgebase/hardware/EL9xxx.md | 4 +- .../knowledgebase/{ => hardware}/general.md | 2 +- .../manual/knowledgebase/hardware/host.md | 43 ++++++++++++++++++- 7 files changed, 77 insertions(+), 13 deletions(-) create mode 100644 hugo/content/manual/general_cfg/best_practice.md rename hugo/content/manual/knowledgebase/{ => hardware}/general.md (99%) diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md new file mode 100644 index 000000000..4e18bb5c6 --- /dev/null +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -0,0 +1,28 @@ ++++ +title = "best practice" +weight = 14 +chapter = false ++++ + +## 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](../startup/_index.md). + +As a comparison, TwinCAT default EtherCAT rates are: +* 100Hz for PLC +* 500Hz for motion + +See [ecmc_server](../knowledgebase/hardware/host.md) for more information. + +## ecmc server setup +* If possible, make sure you use the native igb ethercat driver. + +For more information see: +* https://git.psi.ch/motion/ecmc_server_cfg +* [ecmc_server](../knowledgebase/hardware/host.md) for more information. diff --git a/hugo/content/manual/general_cfg/startup/_index.md b/hugo/content/manual/general_cfg/startup/_index.md index 62d3a4b1a..812c783cd 100644 --- a/hugo/content/manual/general_cfg/startup/_index.md +++ b/hugo/content/manual/general_cfg/startup/_index.md @@ -48,7 +48,4 @@ Normally these arguments are set when the module is required: require ecmccfg "ENG_MODE=1,MASTER_ID=2" ``` -### [set mode](modes) -A very powerful tool is provided through the command line. -See a summary, incl. some examples of what possible [here](ethercatcli). diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index ed396cbfd..426d12230 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -1,6 +1,6 @@ +++ title = "EL5042" -weight = 15 +weight = 18 chapter = false +++ @@ -43,7 +43,7 @@ Lack of clock or data pulses could be caused by (in order of probability): 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. {{% notice warning %}} -Never apply a higher voltage than the specified operating voltage for the encoder. +**Never apply a higher voltage than the specified operating voltage for the encoder.** {{% /notice %}} 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). @@ -120,7 +120,7 @@ Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnosti ### Offset LSB Bit [Bit] (0x80p8:17) {{% notice warning %}} -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, the same amount of ones ("1") will be shifted in as MSB. Therefore the LSB offset should normally not be used.** {{% /notice %}} When using the LSB offset setting, the same amout of bits needs to be subtracted from the ST_BITS or MT_BITS @@ -141,7 +141,7 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-BISS-C,CH_ * Enabling status bits by SDO (0x80p8:02) will not work, seems only valid for BISS-C (kind of hints this in manual). {{% notice warning %}} -If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning). +**If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning).** {{% /notice %}} Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28) diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 4238bfefc..6ccca495c 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -1,6 +1,6 @@ +++ title = "EL70x1" -weight = 18 +weight = 19 chapter = false +++ diff --git a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md index c4bfd8399..541334fb4 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md +++ b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md @@ -17,7 +17,7 @@ In the standard setup at PSI over current protection modules are used to feed 24 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. {{% notice warning %}} -Before pressing the buttons, check the electrical drawings. Make sure it's safe to power on the system. +**Before pressing any button, check the electrical drawings and make sure it's safe to power on the system.** {{% /notice %}} #### el9221-5000 @@ -32,5 +32,5 @@ Some terminals are passive. Passive terminals are not EtherCAT slaves and do not 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. {{% notice warning %}} -**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.** +**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.** {{% /notice %}} diff --git a/hugo/content/manual/knowledgebase/general.md b/hugo/content/manual/knowledgebase/hardware/general.md similarity index 99% rename from hugo/content/manual/knowledgebase/general.md rename to hugo/content/manual/knowledgebase/hardware/general.md index a3271b223..691fe92ec 100644 --- a/hugo/content/manual/knowledgebase/general.md +++ b/hugo/content/manual/knowledgebase/hardware/general.md @@ -1,7 +1,7 @@ +++ title = "general" -weight = 12 +weight = 16 chapter = false +++ diff --git a/hugo/content/manual/knowledgebase/hardware/host.md b/hugo/content/manual/knowledgebase/hardware/host.md index 661b3c477..c6112e79e 100644 --- a/hugo/content/manual/knowledgebase/hardware/host.md +++ b/hugo/content/manual/knowledgebase/hardware/host.md @@ -1,6 +1,6 @@ +++ title = "ecmc server" -weight = 14 +weight = 17 chapter = false +++ @@ -8,6 +8,7 @@ chapter = false *** ## Topics 1. [latency issues](#latency-issues) +2. [EtherCAT rate (EC_RATE)](#EtherCAT-rate-(EC_RATE)) --- @@ -45,7 +46,7 @@ The sample rate is defined when require ecmccfg (example set to 500Hz, instead o require ecmccfg "EC_RATE=500" ``` {{% notice info %}} -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. +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. {{% /notice %}} ** Affinity** @@ -71,3 +72,41 @@ afterInit "epicsThreadSetAffinity cbLow 6" {{% notice info %}} cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. {{% /notice %}} + +### 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 From 6361ba6485211fc8e5133a027353d7224a435332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 13:56:12 +0200 Subject: [PATCH 100/128] Cleanup --- .../manual/knowledgebase/hardware/_index.md | 40 ++++++++++++++++ .../manual/knowledgebase/hardware/general.md | 48 ------------------- 2 files changed, 40 insertions(+), 48 deletions(-) delete mode 100644 hugo/content/manual/knowledgebase/hardware/general.md diff --git a/hugo/content/manual/knowledgebase/hardware/_index.md b/hugo/content/manual/knowledgebase/hardware/_index.md index 70dcccf14..4b7e98b2b 100644 --- a/hugo/content/manual/knowledgebase/hardware/_index.md +++ b/hugo/content/manual/knowledgebase/hardware/_index.md @@ -8,3 +8,43 @@ chapter = false ## Topics {{% children %}} --- + +### 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 +* ... + +```bash +caqtdm -macro "IOC=" 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 +{{% notice warning %}} +Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!! +{{% /notice %}} + +Check the hardware BEFORE restarting the IOC! diff --git a/hugo/content/manual/knowledgebase/hardware/general.md b/hugo/content/manual/knowledgebase/hardware/general.md deleted file mode 100644 index 691fe92ec..000000000 --- a/hugo/content/manual/knowledgebase/hardware/general.md +++ /dev/null @@ -1,48 +0,0 @@ - -+++ -title = "general" -weight = 16 -chapter = false -+++ - -*** - -### 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 -* ... - -```bash -caqtdm -macro "IOC=" 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 -{{% notice warning %}} -Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!! -{{% /notice %}} - -Check the hardware BEFORE restarting the IOC! From 8decd9eb4818f21fac6b61359e94a8e3e970597f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:01:03 +0200 Subject: [PATCH 101/128] Cleanup --- hugo/content/manual/knowledgebase/_index.md | 4 +--- hugo/content/manual/knowledgebase/hardware/host.md | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/hugo/content/manual/knowledgebase/_index.md b/hugo/content/manual/knowledgebase/_index.md index 25c5071a8..5df1ccc30 100644 --- a/hugo/content/manual/knowledgebase/_index.md +++ b/hugo/content/manual/knowledgebase/_index.md @@ -13,9 +13,6 @@ chapter = false 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](general) -For general issues, a very short troubleshooting guide is provided [here](general). - ### [command line interface](ethercatcli) A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible [here](ethercatcli). @@ -31,3 +28,4 @@ For hardware related issues, a very short troubleshooting guide is provided [her ### [manual motion](manual) Trigger manual motion (without motion ecmc-axis). + diff --git a/hugo/content/manual/knowledgebase/hardware/host.md b/hugo/content/manual/knowledgebase/hardware/host.md index c6112e79e..3853d0d8a 100644 --- a/hugo/content/manual/knowledgebase/hardware/host.md +++ b/hugo/content/manual/knowledgebase/hardware/host.md @@ -94,7 +94,7 @@ Issues that could occour in rates below 100Hz: * some slaves might not support it #### Higher rates -Issues that could occour in rates over 1000Kz: +Issues that could occour in rates over 1Kz: * missed frames * issues with dc clock syncs * some slaves might not support it. From eefd058c09ae99b8cb8d7d7779bdf7b2e41a95ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:04:53 +0200 Subject: [PATCH 102/128] fix type --- hugo/content/manual/knowledgebase/hardware/host.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugo/content/manual/knowledgebase/hardware/host.md b/hugo/content/manual/knowledgebase/hardware/host.md index 3853d0d8a..d96d59c1c 100644 --- a/hugo/content/manual/knowledgebase/hardware/host.md +++ b/hugo/content/manual/knowledgebase/hardware/host.md @@ -90,7 +90,7 @@ As a comparison, TwinCAT default EtherCAT rates are: #### 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) +* issues with dc clock syncs (DC capabale slaves normally performs best with at a rate of atleast 500Hz) * some slaves might not support it #### Higher rates From e0eae4f10e48848d0a393c20615fe1047adced03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:07:34 +0200 Subject: [PATCH 103/128] fix links --- hugo/content/manual/general_cfg/best_practice.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md index 4e18bb5c6..9cf89d566 100644 --- a/hugo/content/manual/general_cfg/best_practice.md +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -12,17 +12,17 @@ Example: Set rate to 500Hz require ecmccfg "EC_RATE=500" ... ``` -For more information see the chapter [startup.cmd](../startup/_index.md). +For more information see the chapter [startup.cmd](../startup/). As a comparison, TwinCAT default EtherCAT rates are: * 100Hz for PLC * 500Hz for motion -See [ecmc_server](../knowledgebase/hardware/host.md) for more information. +See [ecmc_server](../knowledgebase/hardware/host/) for more information. ## ecmc server setup * If possible, make sure you use the native igb ethercat driver. For more information see: * https://git.psi.ch/motion/ecmc_server_cfg -* [ecmc_server](../knowledgebase/hardware/host.md) for more information. +* [ecmc_server](../knowledgebase/hardware/host) for more information. From 21361682a47c8a580c820b2632e416717c8360ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:10:05 +0200 Subject: [PATCH 104/128] fix links --- hugo/content/manual/general_cfg/best_practice.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md index 9cf89d566..c7ea8237f 100644 --- a/hugo/content/manual/general_cfg/best_practice.md +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -18,11 +18,11 @@ As a comparison, TwinCAT default EtherCAT rates are: * 100Hz for PLC * 500Hz for motion -See [ecmc_server](../knowledgebase/hardware/host/) for more information. +See [ecmc_server](../../knowledgebase/hardware/host/) for more information. ## ecmc server setup * If possible, make sure you use the native igb ethercat driver. For more information see: * https://git.psi.ch/motion/ecmc_server_cfg -* [ecmc_server](../knowledgebase/hardware/host) for more information. +* [ecmc_server](../../knowledgebase/hardware/host/) for more information. From 8560d7d115f72fc9a25f7436eb78280b89e43d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:25:50 +0200 Subject: [PATCH 105/128] fix links --- hugo/content/manual/general_cfg/best_practice.md | 2 +- hugo/content/manual/knowledgebase/hardware/EL5042.md | 7 ++++--- hugo/content/manual/knowledgebase/hardware/EL70x1.md | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md index c7ea8237f..f8c146157 100644 --- a/hugo/content/manual/general_cfg/best_practice.md +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -1,6 +1,6 @@ +++ title = "best practice" -weight = 14 +weight = 25 chapter = false +++ diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index 426d12230..a7157479c 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -64,6 +64,7 @@ If the voltage is to low (mainly for 5V encoders): 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): ```bash @@ -74,9 +75,9 @@ For EL5042 the following rates are availble: * 10 MHz * 5 MHz * 3.33 MHz -* 2.5 MHz default for some encoders +* 2.5 MHz default for some encoders in ecmccomp * 2 MHz -* 1 MHz Max for SSI and default for some encoders +* 1 MHz Max for SSI and default for some encoders in ecmccomp * 500 kHz * 250 kHz @@ -141,7 +142,7 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-BISS-C,CH_ * Enabling status bits by SDO (0x80p8:02) will not work, seems only valid for BISS-C (kind of hints this in manual). {{% notice warning %}} -**If the total bit count does not match, the READY bit of the EL5042 will be low (and soemtimes also error or warning).** +**If the total bit count does not match, the READY bit of the EL5042 will be low (and sometimes also error or warning).** {{% /notice %}} Example: 26bit RLS encoder with 2 status bits (set ST_BITS=28) diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 6ccca495c..398ee6532 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -132,9 +132,12 @@ There are normally several control loops in an ecmc system: However, for the EL70x1 drives there's no dedicated velocity loop (however some current boost settings that can be applied in acc/dec, see below) +For more information see [tuning](../../tuning) + #### Position 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. + #### Current 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. @@ -155,5 +158,3 @@ 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. -Also see troubleshooting/tuning section. - From 716efa35e3316c6f1b145f82236615ac962a1bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:50:36 +0200 Subject: [PATCH 106/128] Clenaup tuning --- .../manual/knowledgebase/hardware/EL70x1.md | 15 +++----- hugo/content/manual/knowledgebase/tuning.md | 37 +++++++++---------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 398ee6532..d1444b853 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -132,11 +132,7 @@ There are normally several control loops in an ecmc system: However, for the EL70x1 drives there's no dedicated velocity loop (however some current boost settings that can be applied in acc/dec, see below) -For more information see [tuning](../../tuning) - -#### Position 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. - +For more information on tuning the position loop see [tuning](../../tuning) #### Current 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. @@ -147,14 +143,13 @@ For EL70x1 stepper drives the following parameters can be tuned: * 8011:01 Kp factor * 8011:02 Ki factor -** 8011:07 Ka and 8011:08 Kd 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: ** +Default they are set to 100% which is normally is 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. 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. - diff --git a/hugo/content/manual/knowledgebase/tuning.md b/hugo/content/manual/knowledgebase/tuning.md index abe8fbbac..851aa10ab 100644 --- a/hugo/content/manual/knowledgebase/tuning.md +++ b/hugo/content/manual/knowledgebase/tuning.md @@ -6,25 +6,22 @@ chapter = false *** -### 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. 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. - -### Backlash +### Tuning + +There are normally several control loops in an ecmc motion system: +* Position loop (centralized in ecmc if CSV) +* Velocity loop (in drive) +* Current loop (in drive) + +#### Position 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. + +**Backlash** + Tuning systems with backlash can be difficult. Sometimes a small D-part helps to reduce spikes in the centralized ecmc position loop controller output. +#### Velocity and Current loop +These control loops need to be tuned in the drive. + +For EL70x1, see [EL70x1 tuning](../hardware/EL70x1) +For other drives, consult the dedicated manual. From f19ba5521395c884678e2d972c1c67be0ba0a5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:52:48 +0200 Subject: [PATCH 107/128] Clenaup tuning --- hugo/content/manual/knowledgebase/hardware/EL70x1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index d1444b853..48facdb22 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -137,7 +137,7 @@ For more information on tuning the position loop see [tuning](../../tuning) #### Current 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. -For EL70x1 stepper drives the following parameters can be tuned: +The following parameters can be tuned for a EL70x1 stepper drive: * 8011:07 Ka factor * 8011:08 Kd factor * 8011:01 Kp factor From a4bab8efd2b91cd5ba51069b1c598bf63b76031e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 14:56:14 +0200 Subject: [PATCH 108/128] fix links --- hugo/content/manual/knowledgebase/tuning.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugo/content/manual/knowledgebase/tuning.md b/hugo/content/manual/knowledgebase/tuning.md index 851aa10ab..465838c1a 100644 --- a/hugo/content/manual/knowledgebase/tuning.md +++ b/hugo/content/manual/knowledgebase/tuning.md @@ -23,5 +23,5 @@ Tuning systems with backlash can be difficult. Sometimes a small D-part helps to #### Velocity and Current loop These control loops need to be tuned in the drive. -For EL70x1, see [EL70x1 tuning](../hardware/EL70x1) +For EL70x1, see [EL70x1 tuning](../hardware/el70x1) For other drives, consult the dedicated manual. From 7dbbb2d91ab60bd5ac2d1dd71e8a55f0a8c5613a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 15:07:04 +0200 Subject: [PATCH 109/128] move manual motion to motion --- hugo/content/manual/knowledgebase/_index.md | 6 +----- hugo/content/manual/knowledgebase/manual.md | 23 --------------------- hugo/content/manual/knowledgebase/motion.md | 17 +++++++++++++++ 3 files changed, 18 insertions(+), 28 deletions(-) delete mode 100644 hugo/content/manual/knowledgebase/manual.md diff --git a/hugo/content/manual/knowledgebase/_index.md b/hugo/content/manual/knowledgebase/_index.md index 5df1ccc30..0b688e7bf 100644 --- a/hugo/content/manual/knowledgebase/_index.md +++ b/hugo/content/manual/knowledgebase/_index.md @@ -9,7 +9,7 @@ chapter = false {{% children %}} --- -## troubleshooting +## Knowledge base 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! @@ -25,7 +25,3 @@ Tune drive control loops ### [hardware](hardware) For hardware related issues, a very short troubleshooting guide is provided [here](hardware). - -### [manual motion](manual) -Trigger manual motion (without motion ecmc-axis). - diff --git a/hugo/content/manual/knowledgebase/manual.md b/hugo/content/manual/knowledgebase/manual.md deleted file mode 100644 index f109c8da8..000000000 --- a/hugo/content/manual/knowledgebase/manual.md +++ /dev/null @@ -1,23 +0,0 @@ -+++ -title = "manual motion" -weight = 17 -chapter = false -+++ - -*** - -## force manual motion -{{% notice warning %}} -This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! -{{% /notice %}} -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 diff --git a/hugo/content/manual/knowledgebase/motion.md b/hugo/content/manual/knowledgebase/motion.md index 962f5e126..e787c930b 100644 --- a/hugo/content/manual/knowledgebase/motion.md +++ b/hugo/content/manual/knowledgebase/motion.md @@ -11,6 +11,7 @@ chapter = false 2. [position lag error, (following error), tuning](#position-lag-error) 3. [latency issues](#latency-issues) 4. [drive refuse to enable](#drive-refuse-to-enable) +5. [force manual motion](#force-manual-motion) --- @@ -85,3 +86,19 @@ Possible reasons: 5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state 6. Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). 7. Axis object configured with external interlock (yaml->input.interlock). + +## force manual motion +{{% notice warning %}} +This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! +{{% /notice %}} +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. From 78af68fd45a82f7191a0cfa4b5bee5f8b06dba99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 15:29:21 +0200 Subject: [PATCH 110/128] Update PLC best practice with DESC --- examples/PSI/best_practice/plcs/startup.cmd | 2 +- hugo/content/manual/PLC_cfg/best_practice.md | 17 +++++++++++++++-- .../manual/general_cfg/startup/_index.md | 2 +- hugo/content/manual/knowledgebase/motion.md | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/examples/PSI/best_practice/plcs/startup.cmd b/examples/PSI/best_practice/plcs/startup.cmd index 2f56a5815..54c59a233 100644 --- a/examples/PSI/best_practice/plcs/startup.cmd +++ b/examples/PSI/best_practice/plcs/startup.cmd @@ -14,7 +14,7 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=10, HW_DESC=EL2819" #- ############################################################################ #- Load PLC (note the include dir (INC) and the use of ECMC_EC_SLAVE_NUM) -${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, DESC='Toggle bits', SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" #- ############################################################################ #- Go active diff --git a/hugo/content/manual/PLC_cfg/best_practice.md b/hugo/content/manual/PLC_cfg/best_practice.md index 81074013a..7167aab3a 100644 --- a/hugo/content/manual/PLC_cfg/best_practice.md +++ b/hugo/content/manual/PLC_cfg/best_practice.md @@ -9,13 +9,14 @@ Here you can find some best practice configurations for common usecases. * Macros * MSI include, substitute * Printouts +* Description The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) ### macros Use of macros makes the code more generic. When loading a PLC file with "loadPLCFile.cmd", custom macros can be defined in "PLC\_MACROS": ```shell -${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, DESC='Test', SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" ``` NOTE: ECMC\_EC\_SLAVE\_NUM expands to the ID of the last added slave. @@ -66,7 +67,7 @@ Since all PLC files and PLC libs are parsed through MSI the "include" and "subst When using the include command, the file location dir of the file must be added in the INC parameter when loading the PLC: ```shell -${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, DESC='Test', SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" ``` The "INC" parameter can contain several directories separated with a ":", making it possible to include PLC files from several locations/modules. @@ -113,3 +114,15 @@ Will result in the below if setting the DBG='' (and some other macros, see above ```C println('Value: ', ec0.s10.binaryOutput01); ``` + +### Description +Always add a description when creating a PLC by setting the DESC macro when calling loadPLCFile.cmd. + +Example: +```shell +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, DESC='Toggle some bits', SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" +``` + +{{% notice info %}} +The description can maximum be 40 chars long. +{{% /notice %}} diff --git a/hugo/content/manual/general_cfg/startup/_index.md b/hugo/content/manual/general_cfg/startup/_index.md index 812c783cd..0bf8222ca 100644 --- a/hugo/content/manual/general_cfg/startup/_index.md +++ b/hugo/content/manual/general_cfg/startup/_index.md @@ -31,7 +31,7 @@ startup.cmd takes the following arguments: 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_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 diff --git a/hugo/content/manual/knowledgebase/motion.md b/hugo/content/manual/knowledgebase/motion.md index e787c930b..dbd8e5370 100644 --- a/hugo/content/manual/knowledgebase/motion.md +++ b/hugo/content/manual/knowledgebase/motion.md @@ -100,5 +100,5 @@ For this however, the IOC needs to be reconfigured to _not_ link the hardware to 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. +7. After the amplifier is engaged, write a small number to `-Drv01-Spd`. Depending 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. From ee4aacad8187edd7c97c700f49825f07e55eea07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 15:40:15 +0200 Subject: [PATCH 111/128] Fix links --- examples/PSI/best_practice/plcs/startup.cmd | 2 +- .../manual/knowledgebase/hardware/EL70x1.md | 37 +------------------ hugo/content/manual/knowledgebase/tuning.md | 2 +- 3 files changed, 4 insertions(+), 37 deletions(-) diff --git a/examples/PSI/best_practice/plcs/startup.cmd b/examples/PSI/best_practice/plcs/startup.cmd index 54c59a233..e995e914a 100644 --- a/examples/PSI/best_practice/plcs/startup.cmd +++ b/examples/PSI/best_practice/plcs/startup.cmd @@ -1,7 +1,7 @@ ############################################################################## ## Simple example config for plcs -require ecmccfg v9.5.5_RC1, "ECMC_VER=v9.5.5_RC1,ENG_MODE=1" +require ecmccfg "ENG_MODE=1" #- ############################################################################ #- Configure hardware diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 48facdb22..522c420f5 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -22,47 +22,14 @@ In order to use the ethercat command, you must first login to the server where t The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the folowing syntax: -```bash -ethercat upload -m -p --type uint8 0xA010 -``` -Example for master 0, slave position 3: -```bash -# 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: +The ecmccfg/utils/read_el70xx_diag.sh tool can be used to read all the diagnostic registers: ```bash bash read_el70xx_diag.sh ``` Example: master 0, slave 3, drive under voltage warning ```bash -bash read_el7041_diag.sh 0 3 +bash read_el70xx_diag.sh 0 3 ######################################################### Reading EL70xx status at master id 0 and slave id 3: diff --git a/hugo/content/manual/knowledgebase/tuning.md b/hugo/content/manual/knowledgebase/tuning.md index 465838c1a..4c0b0194a 100644 --- a/hugo/content/manual/knowledgebase/tuning.md +++ b/hugo/content/manual/knowledgebase/tuning.md @@ -23,5 +23,5 @@ Tuning systems with backlash can be difficult. Sometimes a small D-part helps to #### Velocity and Current loop These control loops need to be tuned in the drive. -For EL70x1, see [EL70x1 tuning](../hardware/el70x1) +For EL70x1, see [EL70x1 Tuning](../hardware/el70x1/#Tuning) For other drives, consult the dedicated manual. From f7fe9d7d8196ec483be53ebe261e19a8eb4b6f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 15:43:28 +0200 Subject: [PATCH 112/128] Fix links --- hugo/content/manual/knowledgebase/hardware/EL5042.md | 8 ++++---- hugo/content/manual/knowledgebase/hardware/EL70x1.md | 4 ++-- hugo/content/manual/knowledgebase/tuning.md | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index a7157479c..43bfe7074 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -8,10 +8,10 @@ chapter = false *** ## Topics -1. [No reading](#No-reading) -2. [Diagnostics](#Diagnostics) -3. [Offset LSB Bit [Bit] (0x80p8:17)](#Offset-LSB-Bit-[Bit]-(0x80p8:17)) -4. [SSI](#SSI) +1. [No reading](#no-reading) +2. [Diagnostics](#diagnostics) +3. [Offset LSB Bit [Bit] (0x80p8:17)](#offset-lsb-bit-[bit]-(0x80p8:17)) +4. [SSI](#ssi) --- diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 522c420f5..28839e6b7 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -8,8 +8,8 @@ chapter = false *** ## Topics -1. [Diagnostics](#Diagnostics) -2. [Tuning](#Tuning) +1. [Diagnostics](#diagnostics) +2. [Tuning](#tuning) --- diff --git a/hugo/content/manual/knowledgebase/tuning.md b/hugo/content/manual/knowledgebase/tuning.md index 4c0b0194a..5eef885c0 100644 --- a/hugo/content/manual/knowledgebase/tuning.md +++ b/hugo/content/manual/knowledgebase/tuning.md @@ -23,5 +23,5 @@ Tuning systems with backlash can be difficult. Sometimes a small D-part helps to #### Velocity and Current loop These control loops need to be tuned in the drive. -For EL70x1, see [EL70x1 Tuning](../hardware/el70x1/#Tuning) +For EL70x1, see [EL70x1 Tuning](../hardware/el70x1/#tuning) For other drives, consult the dedicated manual. From bd5101e1ab43ce76fad8984a2221c2ad4e24b423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 15:46:11 +0200 Subject: [PATCH 113/128] Remove some dividing lines --- hugo/content/manual/knowledgebase/_index.md | 1 - hugo/content/manual/knowledgebase/ethercatCLI.md | 2 -- hugo/content/manual/knowledgebase/hardware/EL5042.md | 3 --- hugo/content/manual/knowledgebase/hardware/EL70x1.md | 3 --- hugo/content/manual/knowledgebase/hardware/EL9xxx.md | 2 -- hugo/content/manual/knowledgebase/hardware/_index.md | 1 - hugo/content/manual/knowledgebase/hardware/host.md | 2 -- hugo/content/manual/knowledgebase/motion.md | 2 -- hugo/content/manual/knowledgebase/tuning.md | 2 -- hugo/content/manual/motion_cfg/_index.md | 2 +- 10 files changed, 1 insertion(+), 19 deletions(-) diff --git a/hugo/content/manual/knowledgebase/_index.md b/hugo/content/manual/knowledgebase/_index.md index 0b688e7bf..24055ff83 100644 --- a/hugo/content/manual/knowledgebase/_index.md +++ b/hugo/content/manual/knowledgebase/_index.md @@ -4,7 +4,6 @@ weight = 15 chapter = false +++ -*** ## Topics {{% children %}} --- diff --git a/hugo/content/manual/knowledgebase/ethercatCLI.md b/hugo/content/manual/knowledgebase/ethercatCLI.md index 1c0576f17..56178b64b 100644 --- a/hugo/content/manual/knowledgebase/ethercatCLI.md +++ b/hugo/content/manual/knowledgebase/ethercatCLI.md @@ -4,8 +4,6 @@ weight = 13 chapter = false +++ -*** - ### `ethercat` CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index 43bfe7074..91ddbf7ee 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -4,9 +4,6 @@ weight = 18 chapter = false +++ -*** -*** - ## Topics 1. [No reading](#no-reading) 2. [Diagnostics](#diagnostics) diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 28839e6b7..24d50a13c 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -4,9 +4,6 @@ weight = 19 chapter = false +++ -*** -*** - ## Topics 1. [Diagnostics](#diagnostics) 2. [Tuning](#tuning) diff --git a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md index 541334fb4..222f24cea 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md +++ b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md @@ -4,8 +4,6 @@ weight = 20 chapter = false +++ -*** -*** ## Topics 1. [over current protection](#over-current-protection) 2. [passive terminals](#passive-terminals) diff --git a/hugo/content/manual/knowledgebase/hardware/_index.md b/hugo/content/manual/knowledgebase/hardware/_index.md index 4b7e98b2b..137a40911 100644 --- a/hugo/content/manual/knowledgebase/hardware/_index.md +++ b/hugo/content/manual/knowledgebase/hardware/_index.md @@ -4,7 +4,6 @@ weight = 15 chapter = false +++ -*** ## Topics {{% children %}} --- diff --git a/hugo/content/manual/knowledgebase/hardware/host.md b/hugo/content/manual/knowledgebase/hardware/host.md index d96d59c1c..f39c418e8 100644 --- a/hugo/content/manual/knowledgebase/hardware/host.md +++ b/hugo/content/manual/knowledgebase/hardware/host.md @@ -4,8 +4,6 @@ weight = 17 chapter = false +++ -*** -*** ## Topics 1. [latency issues](#latency-issues) 2. [EtherCAT rate (EC_RATE)](#EtherCAT-rate-(EC_RATE)) diff --git a/hugo/content/manual/knowledgebase/motion.md b/hugo/content/manual/knowledgebase/motion.md index dbd8e5370..3dae2bce3 100644 --- a/hugo/content/manual/knowledgebase/motion.md +++ b/hugo/content/manual/knowledgebase/motion.md @@ -4,8 +4,6 @@ weight = 14 chapter = false +++ -*** - ## Topics 1. [both_limits error](#both_limits-error) 2. [position lag error, (following error), tuning](#position-lag-error) diff --git a/hugo/content/manual/knowledgebase/tuning.md b/hugo/content/manual/knowledgebase/tuning.md index 5eef885c0..948638282 100644 --- a/hugo/content/manual/knowledgebase/tuning.md +++ b/hugo/content/manual/knowledgebase/tuning.md @@ -4,8 +4,6 @@ weight = 16 chapter = false +++ -*** - ### Tuning There are normally several control loops in an ecmc motion system: diff --git a/hugo/content/manual/motion_cfg/_index.md b/hugo/content/manual/motion_cfg/_index.md index 8a0cc6a1c..00475d4a2 100644 --- a/hugo/content/manual/motion_cfg/_index.md +++ b/hugo/content/manual/motion_cfg/_index.md @@ -4,7 +4,7 @@ weight = 10 chapter = false +++ -*** + ## Topics {{% children %}} --- From 46045e15cce94fc05b93b41138b6404787427d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 16:08:41 +0200 Subject: [PATCH 114/128] Add DS desc --- db/core/ecmcDS-idx.template | 5 + db/core/ecmcDS.substitutions | 4 +- hugo/content/manual/knowledgebase/_index.md | 23 + qt/ecmcDSxx.ui | 732 ++++++++++---------- scripts/addDataStorage.cmd | 3 +- 5 files changed, 412 insertions(+), 355 deletions(-) diff --git a/db/core/ecmcDS-idx.template b/db/core/ecmcDS-idx.template index 13dd6907a..8288bb5b6 100644 --- a/db/core/ecmcDS-idx.template +++ b/db/core/ecmcDS-idx.template @@ -71,3 +71,8 @@ record(ai,"$(P)MCU-Cfg-DS${Index}-PrvObjId") { field(DESC, "DS number of next DS") field(VAL, "$(PREV_OBJ_ID=-1)") } + +record(stringin,"$(Name)$(DESC_NAME)") { + field(DESC, "DS Info") + field(VAL, "${DESC=PLC ${index}}") +} diff --git a/db/core/ecmcDS.substitutions b/db/core/ecmcDS.substitutions index 6f1fa5d5b..2d32c7e37 100644 --- a/db/core/ecmcDS.substitutions +++ b/db/core/ecmcDS.substitutions @@ -1,5 +1,5 @@ file ecmcDS-idx.template { - pattern { DS_DATAINDEX_ACT, DS_DATA_ACT , DS_STAT, DS_TYPE, DS_STAT_, DS_FULL, DS_CLEAR_CMD } - { DS$(Index2Char)-DataIdAct, DS$(Index2Char)-DataAct, DS$(Index2Char)-Stat, DS$(Index2Char)-Type, DS$(Index2Char)-Stat_, DS$(Index2Char)-Full, DS$(Index2Char)-ClrCmd } + pattern { DS_DATAINDEX_ACT, DS_DATA_ACT , DS_STAT, DS_TYPE, DS_STAT_, DS_FULL, DS_CLEAR_CMD, DESC_NAME } + { DS$(Index2Char)-DataIdAct, DS$(Index2Char)-DataAct, DS$(Index2Char)-Stat, DS$(Index2Char)-Type, DS$(Index2Char)-Stat_, DS$(Index2Char)-Full, DS$(Index2Char)-ClrCmd, DS$(Index2Char)-Desc } } diff --git a/hugo/content/manual/knowledgebase/_index.md b/hugo/content/manual/knowledgebase/_index.md index 24055ff83..2a5371c84 100644 --- a/hugo/content/manual/knowledgebase/_index.md +++ b/hugo/content/manual/knowledgebase/_index.md @@ -8,6 +8,29 @@ chapter = false {{% children %}} --- +## Overview panel +For an overview of an ecmc system, the ecmcMain.ui panel is a good starting point. +The ecmcMain.ui covers most parts of an ecmc system: +* ecmc_rt thread diagnostics: + - Jitter + - Cycle time +* EtherCAT: + - Status + - Lost frames + - Slave count + - master Id + - Links to dedicated sub panels for each slave type. +* Links to all configured objects: + - motion expert panels + - PLC objects + - plugin objects + - data storage objects + +The ecmcMain.ui is started with the following syntax: +``` +caqtdm -macro "IOC=" ecmcMain.ui +``` + ## Knowledge base 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! diff --git a/qt/ecmcDSxx.ui b/qt/ecmcDSxx.ui index e8f9d8c58..6a7575364 100644 --- a/qt/ecmcDSxx.ui +++ b/qt/ecmcDSxx.ui @@ -1,227 +1,362 @@ - MainWindow - + Dialog + 0 0 - 700 - 256 + 706 + 260 - MainWindow + Dialog - - - - - 535 - 145 - 51 - 46 - - - - SYS=$(SYS),IOC=$(IOC),ID_1=$(ID_1),ID_2=$(ID_2) - - - caFrame::Calc - - - A>-1 - - - $(IOC):MCU-Cfg-DS$(ID_1)-PrvObjId - - - - - 5 - 2 - 41 - 18 - - - - << - - - Open first axis - - - bash /ioc/modules/qt/ecmcOpenPrevDS.sh - - - $(SYS) $(ID_1) - - - - - - 5 - 25 - 41 - 16 - - - - - 16777215 - 18 - - - - $(IOC):MCU-Cfg-DS$(ID_1)-PrvObjId - - - - 192 - 192 - 192 - - - - caLineEdit::Static - - - caLineEdit::Channel - - - caLineEdit::User - - - true - - - - - - - 550 - 130 - 100 - 16 - - - - - 16777215 - 16 - - - - Next: - - - + + + + 10 + 40 + 681 + 131 + + + + $(IOC):DS$(ID_2)-DataAct + + + 1 + + + true + + + false + + + + + + 25 + 25 + 341 + 20 + + + + true + + + $(IOC):DS$(ID_2)-Desc + + + caLineEdit::WidthAndHeight + + + caLineEdit::string + + + + + + 25 + 3 + 181 + 21 + + + + DS $(ID_1) description: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + + + -5 + 225 + 100 + 16 + + + + + 16777215 + 16 + + + + Full: + + + + + + 105 + 200 + 36 + 16 + + + + + 16777215 + 18 + + + + $(SYS):DS$(ID_2)-DataIdAct + + + + 192 + 192 + 192 + + + + caLineEdit::Static + + + caLineEdit::User + + + caLineEdit::User + + + true + + + + + + -5 + 200 + 100 + 16 + + + + + 16777215 + 16 + + + + Data ID: + + + + + + 105 + 180 + 36 + 16 + + + + + 16777215 + 18 + + + + $(SYS):DS$(ID_2)-Type + + + + 192 + 192 + 192 + + + + caLineEdit::Static + + + caLineEdit::User + + + caLineEdit::User + + + true + + + + + + 110 + 220 + 30 + 30 + + + + $(SYS):DS$(ID_2)-Full + + + + 0 + 0 + 255 + + + + + + + -5 + 180 + 100 + 16 + + + + + 16777215 + 16 + + + + Type: + + + + + + 530 + 185 + 31 + 16 + + + + + 16777215 + 18 + + + + $(ID_1) + + + + + + + 192 + 192 + 192 + + + + caLineEdit::Static + + + caLineEdit::Channel + + + caLineEdit::User + + + true + + + + + + 415 + 170 + 100 + 16 + + + + + 16777215 + 16 + + + + Prev: + + + + + + 495 + 170 + 100 + 16 + + + + + 16777215 + 16 + + + + Next: + + + + + + 555 + 185 + 56 + 46 + + + + SYS=$(SYS),IOC=$(IOC),ID_1=$(ID_1),ID_2=$(ID_2) + + + caFrame::Calc + + + A>-1 + + + $(IOC):MCU-Cfg-DS$(ID_1)-NxtObjId + + - 610 - 145 - 56 - 46 + 10 + 2 + 41 + 18 - - SYS=$(SYS),IOC=$(IOC),ID_1=$(ID_1),ID_2=$(ID_2) + + >> - - caFrame::Calc + + Open first axis - - A>-1 + + bash /ioc/modules/qt/ecmcOpenNextDS.sh - - $(IOC):MCU-Cfg-DS$(ID_1)-NxtObjId + + $(SYS) $(ID_1) - - - - 10 - 2 - 41 - 18 - - - - >> - - - Open first axis - - - bash /ioc/modules/qt/ecmcOpenNextDS.sh - - - $(SYS) $(ID_1) - - - - - - 10 - 25 - 41 - 16 - - - - - 16777215 - 18 - - - - $(IOC):MCU-Cfg-DS$(ID_1)-NxtObjId - - - - 192 - 192 - 192 - - - - caLineEdit::Static - - - caLineEdit::Channel - - - caLineEdit::User - - - true - - - + - 470 - 130 - 100 - 16 - - - - - 16777215 - 16 - - - - Prev: - - - - - - 585 - 145 - 31 + 10 + 25 + 41 16 @@ -231,11 +366,8 @@ 18 - - $(ID_1) - - + $(IOC):MCU-Cfg-DS$(ID_1)-NxtObjId @@ -257,89 +389,56 @@ true - - - - 10 - 140 - 100 - 16 - - - - - 16777215 - 16 - - - - Type: - - - + + + + + 480 + 185 + 51 + 46 + + + + SYS=$(SYS),IOC=$(IOC),ID_1=$(ID_1),ID_2=$(ID_2) + + + caFrame::Calc + + + A>-1 + + + $(IOC):MCU-Cfg-DS$(ID_1)-PrvObjId + + - 120 - 140 - 36 - 16 - - - - - 16777215 + 5 + 2 + 41 18 - - - - $(SYS):DS$(ID_2)-Type - - - - 192 - 192 - 192 - + - - caLineEdit::Static + + << - - caLineEdit::User + + Open first axis - - caLineEdit::User + + bash /ioc/modules/qt/ecmcOpenPrevDS.sh - - true + + $(SYS) $(ID_1) - + - 125 - 180 - 30 - 30 - - - - $(SYS):DS$(ID_2)-Full - - - - 0 - 0 - 255 - - - - - - - 120 - 160 - 36 + 5 + 25 + 41 16 @@ -350,7 +449,7 @@ - $(SYS):DS$(ID_2)-DataIdAct + $(IOC):MCU-Cfg-DS$(ID_1)-PrvObjId @@ -363,7 +462,7 @@ caLineEdit::Static - caLineEdit::User + caLineEdit::Channel caLineEdit::User @@ -372,78 +471,7 @@ true - - - - 10 - 160 - 100 - 16 - - - - - 16777215 - 16 - - - - Data ID: - - - - - - 10 - 185 - 100 - 16 - - - - - 16777215 - 16 - - - - Full: - - - - - - 40 - 0 - 671 - 131 - - - - $(IOC):DS$(ID_2)-DataAct - - - 1 - - - true - - - false - - - - - - - 0 - 0 - 700 - 25 - - - diff --git a/scripts/addDataStorage.cmd b/scripts/addDataStorage.cmd index 0db5e6f30..a0aa77153 100644 --- a/scripts/addDataStorage.cmd +++ b/scripts/addDataStorage.cmd @@ -12,6 +12,7 @@ #-d \param DS_TYPE (optional), default 0, 0: Normal Buffer, 1: Ring Buffer, 2: FIFO Buffer #-d \param SAMPLE_RATE_MS (optional), default 1 #-d \param DS_DEBUG (optional), default 0, 0: No debug printouts, 1: Debug printouts +#-d \param DESC (optional) Description of PLC #-d \note Example calls: #-d \note - call for 1000 elements at 10 Hz #-d \code @@ -42,7 +43,7 @@ ecmcConfigOrDie "Cfg.SetStorageEnablePrintouts(${ECMC_STORAGE_INDEX},${DS_DEBUG= ecmcFileExist(${SUBST_FILE="ecmcDS.substitutions"},1,1) ecmcEpicsEnvSetCalc(ECMC_DS_ID_2_CHARS, "${ECMC_STORAGE_INDEX}", "%02d") -dbLoadTemplate(${SUBST_FILE="ecmcDS.substitutions"}, "P=${ECMC_PREFIX}, PORT=${ECMC_ASYN_PORT}, ADDR=${ECMC_ASYN_ADDR}, TIMEOUT=${ECMC_ASYN_TIMEOUT},A=0,Index=${ECMC_STORAGE_INDEX},Index2Char=${ECMC_DS_ID_2_CHARS},NELM=${ECMC_STORAGE_SIZE},T_SMP_MS=${SAMPLE_RATE_MS=1},PREV_OBJ_ID=${ECMC_PREV_STORAGE_INDEX=-1}") +dbLoadTemplate(${SUBST_FILE="ecmcDS.substitutions"}, "P=${ECMC_PREFIX}, PORT=${ECMC_ASYN_PORT}, ADDR=${ECMC_ASYN_ADDR}, TIMEOUT=${ECMC_ASYN_TIMEOUT},A=0,Index=${ECMC_STORAGE_INDEX},Index2Char=${ECMC_DS_ID_2_CHARS},NELM=${ECMC_STORAGE_SIZE},T_SMP_MS=${SAMPLE_RATE_MS=1},PREV_OBJ_ID=${ECMC_PREV_STORAGE_INDEX=-1}, DESC='${DESC=PLC_${ECMC_PLC_ID}}'") epicsEnvUnset(ECMC_DS_ID_2_CHARS) #- Below for facilitate auto gui generation From 5d3c5967418e9fc784b4398936f107c9b15346a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 16:11:13 +0200 Subject: [PATCH 115/128] Add default DESC for DS --- scripts/addDataStorage.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/addDataStorage.cmd b/scripts/addDataStorage.cmd index a0aa77153..9ad1f24eb 100644 --- a/scripts/addDataStorage.cmd +++ b/scripts/addDataStorage.cmd @@ -43,7 +43,7 @@ ecmcConfigOrDie "Cfg.SetStorageEnablePrintouts(${ECMC_STORAGE_INDEX},${DS_DEBUG= ecmcFileExist(${SUBST_FILE="ecmcDS.substitutions"},1,1) ecmcEpicsEnvSetCalc(ECMC_DS_ID_2_CHARS, "${ECMC_STORAGE_INDEX}", "%02d") -dbLoadTemplate(${SUBST_FILE="ecmcDS.substitutions"}, "P=${ECMC_PREFIX}, PORT=${ECMC_ASYN_PORT}, ADDR=${ECMC_ASYN_ADDR}, TIMEOUT=${ECMC_ASYN_TIMEOUT},A=0,Index=${ECMC_STORAGE_INDEX},Index2Char=${ECMC_DS_ID_2_CHARS},NELM=${ECMC_STORAGE_SIZE},T_SMP_MS=${SAMPLE_RATE_MS=1},PREV_OBJ_ID=${ECMC_PREV_STORAGE_INDEX=-1}, DESC='${DESC=PLC_${ECMC_PLC_ID}}'") +dbLoadTemplate(${SUBST_FILE="ecmcDS.substitutions"}, "P=${ECMC_PREFIX}, PORT=${ECMC_ASYN_PORT}, ADDR=${ECMC_ASYN_ADDR}, TIMEOUT=${ECMC_ASYN_TIMEOUT},A=0,Index=${ECMC_STORAGE_INDEX},Index2Char=${ECMC_DS_ID_2_CHARS},NELM=${ECMC_STORAGE_SIZE},T_SMP_MS=${SAMPLE_RATE_MS=1},PREV_OBJ_ID=${ECMC_PREV_STORAGE_INDEX=-1}, DESC='${DESC=DS_${ECMC_PLC_ID}}'") epicsEnvUnset(ECMC_DS_ID_2_CHARS) #- Below for facilitate auto gui generation From 3f52d8b1b408353b99193dcb9ddce41310d6a687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 16:24:22 +0200 Subject: [PATCH 116/128] Chaneg voltage on EL5042 --- .../manual/knowledgebase/hardware/EL5042.md | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index 91ddbf7ee..65dcb34ce 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -43,9 +43,32 @@ Make sure the encoder is powered with the correct voltage. Most encoders require **Never apply a higher voltage than the specified operating voltage for the encoder.** {{% /notice %}} -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). +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 below and the 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. +{{% notice warning %}} +**The voltage cannot be different on the two channels. A change to 9V will apply to both channels!** +{{% /notice %}} + +From EL5042 manual: +``` +# Setting the encoder supply voltage +# Condition: To write 0x8008:12 “Supply Voltage”, the value 0x72657375 (ASCII: “user”) must be set in 0xF008 “Code word”. +# +# Set the value into index 0x8008:12 “Supply Voltage” (Specification in steps of 0.1 V). +# Only the values 50 (5.0 V) and 90 (9.0 V) are permissible. +# This setting applies to both channels. +# Before switching to 9.0 V make sure that both BiSS encoders support the extended voltage range! +# +# The encoder supply voltage is set for both channels in object 0x8008:12 +# -------------------------------------------------------------------------------------------------------------------------- +``` +After the above sequence is executed, the slave must go to INIT state before the new settings is applied. This can be done with the ethercat tool: +``` +ethercat states -m -p INIT +# then back to preop +ethercat rescan +``` +After ensuring that the encoder is correctly supplied, then 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 From 8b3c4ef194c9fc9d1abe359b06329baa7424d7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 27 Sep 2024 16:29:07 +0200 Subject: [PATCH 117/128] Change heading --- hugo/content/manual/knowledgebase/hardware/EL5042.md | 6 +++--- hugo/content/manual/knowledgebase/hardware/EL70x1.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index 65dcb34ce..cc5fbeb15 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -5,14 +5,14 @@ chapter = false +++ ## Topics -1. [No reading](#no-reading) +1. [error/warning](#error/warning) 2. [Diagnostics](#diagnostics) 3. [Offset LSB Bit [Bit] (0x80p8:17)](#offset-lsb-bit-[bit]-(0x80p8:17)) 4. [SSI](#ssi) --- -### No reading +### error/warning Could be caused by: * Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). @@ -62,7 +62,7 @@ From EL5042 manual: # The encoder supply voltage is set for both channels in object 0x8008:12 # -------------------------------------------------------------------------------------------------------------------------- ``` -After the above sequence is executed, the slave must go to INIT state before the new settings is applied. This can be done with the ethercat tool: +After the above sequence is executed, the slave must go to INIT state before the new setting is applied. This can be done with the ethercat tool: ``` ethercat states -m -p INIT # then back to preop diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 24d50a13c..2b977dea5 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -5,12 +5,12 @@ chapter = false +++ ## Topics -1. [Diagnostics](#diagnostics) +1. [error/warning](#error/warning) 2. [Tuning](#tuning) --- -### Diagnostics +### error/warning 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](ethercatcli) for more info. {{% notice info %}} From 975824224992c1be648e8a0eb601db21a4253be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sat, 28 Sep 2024 13:51:15 +0200 Subject: [PATCH 118/128] Fix spelling in manual --- hugo/content/manual/PLC_cfg/_index.md | 4 +- hugo/content/manual/PLC_cfg/best_practice.md | 12 ++-- hugo/content/manual/PLC_cfg/function_libs.md | 10 ++-- hugo/content/manual/PLC_cfg/syntax.md | 16 +++--- .../manual/general_cfg/best_practice.md | 2 +- .../manual/general_cfg/data_storage.md | 8 +-- .../content/manual/general_cfg/iocsh_utils.md | 4 +- .../manual/general_cfg/startup/_index.md | 4 +- .../manual/knowledgebase/ethercatCLI.md | 2 +- .../manual/knowledgebase/hardware/EL5042.md | 18 +++--- .../manual/knowledgebase/hardware/EL70x1.md | 8 +-- .../manual/knowledgebase/hardware/EL9xxx.md | 6 +- .../manual/knowledgebase/hardware/host.md | 20 +++---- hugo/content/manual/knowledgebase/motion.md | 34 +++++------ hugo/content/manual/motion_cfg/_index.md | 2 +- hugo/content/manual/motion_cfg/axisPLC.md | 2 +- hugo/content/manual/motion_cfg/axisYaml.md | 16 +++--- .../manual/motion_cfg/best_practice/_index.md | 8 +-- .../manual/motion_cfg/best_practice/servo.md | 10 ++-- .../best_practice/stepper_biss_c.md | 16 +++--- hugo/content/manual/motion_cfg/direction.md | 4 +- hugo/content/manual/motion_cfg/homing.md | 56 +++++++++---------- hugo/content/manual/motion_cfg/scaling.md | 24 ++++---- 23 files changed, 143 insertions(+), 143 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/_index.md b/hugo/content/manual/PLC_cfg/_index.md index 8134d163b..4b4498e5e 100644 --- a/hugo/content/manual/PLC_cfg/_index.md +++ b/hugo/content/manual/PLC_cfg/_index.md @@ -42,7 +42,7 @@ All keys are mandatory. - `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`. +- `rateMilliseconds`: execution rate in ms. To execute every cycle, independent of cycle rate, use `-1`. - `code`: dictionary of code lines. {{% notice note %}} @@ -73,7 +73,7 @@ All keys are mandatory. - `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`. +- `rateMilliseconds`: execution rate in ms. To execute every cycle, independent of cycle rate, use `-1`. - `file`: PLC text file to load. {{% notice warning %}} diff --git a/hugo/content/manual/PLC_cfg/best_practice.md b/hugo/content/manual/PLC_cfg/best_practice.md index 7167aab3a..328e0c932 100644 --- a/hugo/content/manual/PLC_cfg/best_practice.md +++ b/hugo/content/manual/PLC_cfg/best_practice.md @@ -5,13 +5,13 @@ chapter = false +++ ## best practice -Here you can find some best practice configurations for common usecases. +Here you can find some best practice configurations for common use cases. * Macros * MSI include, substitute * Printouts * Description -The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) +The complete examples with startup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) ### macros Use of macros makes the code more generic. When loading a PLC file with "loadPLCFile.cmd", custom macros can be defined in "PLC\_MACROS": @@ -27,7 +27,7 @@ In addition to the custom macros, a few macros, that are often needed, are prede 4. M : ec #### SELF_ID and SELF example -A common usecase is that some initiation is needed, could be triggering of a custom homing sequence: +A common use case is that some initiation is needed, could be triggering of a custom homing sequence: ```C if(${SELF}.firstscan) { @@ -72,8 +72,8 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cf The "INC" parameter can contain several directories separated with a ":", making it possible to include PLC files from several locations/modules. #### example: Toggle a few outputs -As a demo usecase let's consider that a few outputs needs to be toggled. -NOTE: There are simpler ways to write this specifc code but it's used to demo how code can be divided. +As a demo use case let's consider that a few outputs needs to be toggled. +NOTE: There are simpler ways to write this specific code but it's used to demo how code can be divided. Lets first define some code that toggles a bit (toggle\_output.plc\_inc): ```shell @@ -104,7 +104,7 @@ The resulting code will toggle two different outputs, the state of the last outp 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. +Adding a DBG macro can be use full to be able to turn on/off printouts. Typically during commissioning it can be use full 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) ```C diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index b5530f6c2..abf4c9e0e 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -22,7 +22,7 @@ Example: ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" ``` -The functions must be defined accordning to this template (max 5 parameters): +The functions must be defined according to this template (max 5 parameters): ```C function (,...,) { ; @@ -38,9 +38,9 @@ function () { * Several functions can be defined in the same file. * For syntax of the "code body", check [plc syntax](../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). +* The parameters as well 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). * "#" 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, "include" and "subsitute" commands. For more info check [best practice](../best_practice) and msi documentation/help. +* The lib file will be parsed through MSI allowing macro expansion, "include" and "substitute" commands. For more info check [best practice](../best_practice) and msi documentation/help. ### can be used in functions 1. The parameters @@ -105,8 +105,8 @@ function testm2m() { ``` ### debugging -Unfortunately debugging of function libs is not as easy as normal PLC:s since exprtk returns less infomation at compile failure. +Unfortunately debugging of function libs is not as easy as normal PLC:s since exprtk returns less information at compile failure. {{% notice tip %}} -In 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. +In order to troubleshoot, load the code as a normal PLC instead. This way you will get more diagnostics. Also remember, ecmc variables cannot be accessed in plc libs. {{% /notice %}} diff --git a/hugo/content/manual/PLC_cfg/syntax.md b/hugo/content/manual/PLC_cfg/syntax.md index 528510def..19977bc5d 100644 --- a/hugo/content/manual/PLC_cfg/syntax.md +++ b/hugo/content/manual/PLC_cfg/syntax.md @@ -14,8 +14,8 @@ For detailed syntax help please visit the [exprtk website](https://github.com/Ar ### 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. +The PLC will execute synchronous to the cycle, or at an integer fraction of it. +The processed data will be send to the bus with the next cycle. PLCs do _not_ delay the bus! ### statement terminator @@ -25,7 +25,7 @@ Statements are terminated by a semicolon `;` All variables are initiated to `0` ### comments -The hash charactoer `#` is reserved for comments. +The hash character `#` is reserved for comments. Everything after this char will be removed before compile. {{% notice warning %}} `println('########');` will be seen by the compiler as `println('` ! @@ -66,7 +66,7 @@ Custom plc functions can be written in c in plugins. # 1. Assignment: # ec0.s1.VALUE:=100; # -# 2. if-else (note the equl sign): +# 2. if-else (note the equal sign): # if(ec0.s1.VALUE=100) { # # code # } @@ -215,14 +215,14 @@ Custom plc functions can be written in c in plugins. ```shell # 1. plc.enable plc enable (rw) # (end exe with "plc.enable:=0#" -# Could be usefull for startup +# Could be use full for startup # sequences) # 2. plc.error plc error (rw) # Will be forwarded to user as # controller error. # 3. plc.scantime plc sample time in seconds (ro) # 4. plc.firstscan true during first plc scan only (ro) -# usefull for initiations of variables +# use full for initiations of variables # 5. ax.plc.enable Same as plc.enable but for # axis sync plc. # 6. ax.plc.error Same as plc.error but for @@ -319,9 +319,9 @@ Custom plc functions can be written in c in plugins. # ); # 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. +# amount 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): +# Note: The mmId can be retrieved by the bellow ecmc command (and feed into plc via macro): # ecmcConfig "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" # epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) # diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md index f8c146157..413a4468b 100644 --- a/hugo/content/manual/general_cfg/best_practice.md +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -5,7 +5,7 @@ chapter = false +++ ## 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. +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 outside 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 ``` diff --git a/hugo/content/manual/general_cfg/data_storage.md b/hugo/content/manual/general_cfg/data_storage.md index 2a12be429..b750c410a 100644 --- a/hugo/content/manual/general_cfg/data_storage.md +++ b/hugo/content/manual/general_cfg/data_storage.md @@ -7,8 +7,8 @@ chapter = false ## data storage examples This dir contains two examples: [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/test/dataStorage). -1. Continiously add value to data storage. Push to epics by hw trigger. -2. Continiously add value to data storage. Push to epics by epics pv trigger. +1. Continuously add value to data storage. Push to epics by hw trigger. +2. Continuously 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. @@ -17,7 +17,7 @@ Custom scale and offset can be applied to the stored values by MACROS (to the pl In this example the data stored in dataStorage 0 is pushed to epics at a falling edge of the axis 1 high limit. -Example 1 is started with the following stratup file: "add_data_to_buffer_trigg_push_hw.script" +Example 1 is started with the following startup file: "add_data_to_buffer_trigg_push_hw.script" ``` iocsh.bash add_data_to_buffer_trigg_push_hw.script @@ -55,7 +55,7 @@ static.highlimOld:=ax1.mon.highlim; In this example the data stored in dataStorage 0 is pushed to epics at a rising edge of the "IOC_TEST:Set-PushDataTrigger-RB" pv. -Example 2 is started with the following stratup file: "add_data_to_buffer_trigg_push_hw.script" +Example 2 is started with the following startup file: "add_data_to_buffer_trigg_push_hw.script" ``` iocsh.bash add_data_to_buffer_trigg_push_epics.script ``` diff --git a/hugo/content/manual/general_cfg/iocsh_utils.md b/hugo/content/manual/general_cfg/iocsh_utils.md index 5097251a0..94fb4c5e3 100644 --- a/hugo/content/manual/general_cfg/iocsh_utils.md +++ b/hugo/content/manual/general_cfg/iocsh_utils.md @@ -48,7 +48,7 @@ ecmcEpicsEnvSetCalc("test2", "061+1+2+3+4+5*10.1", "This is the number: 0x%06x") epicsEnvShow("test2") test2=This is the number: 0x00007a -#### Calculate scalings (floating point) +#### Calculate scaling (floating point) epicsEnvSet("IORange",32768) # ecmcEpicsEnvSetCalc("scaling", "$(test1)/$(IORange)*10", "%lf") ecmcEpicsEnvSetCalc("scaling", "061/32768*10", "%lf") @@ -87,7 +87,7 @@ result=0 ``` ### Iocsh function "ecmcEpicsEnvSetCalcTernary()" "ecmcEpicsEnvSetCalcTernary()" is used o evaluate expressions and set EPCIS environment variables to different strings. - depending on if the expression evaluates to "true" or "false". Can be usefull for: + depending on if the expression evaluates to "true" or "false". Can be useful for: * Choose different files to load like plc-files, axis configurations, db-files or.. * making conditional ecmc settings * ... diff --git a/hugo/content/manual/general_cfg/startup/_index.md b/hugo/content/manual/general_cfg/startup/_index.md index 0bf8222ca..e238faa16 100644 --- a/hugo/content/manual/general_cfg/startup/_index.md +++ b/hugo/content/manual/general_cfg/startup/_index.md @@ -12,7 +12,7 @@ startup.cmd takes the following arguments: ECMC_VER = 9.5.4 EthercatMC_VER = 3.0.2 (obsolete) INIT = initAll - MASTER_ID = 0 <-- put negatuve number to disable master, aka non ec-mode + MASTER_ID = 0 <-- put negative number to disable master, aka non ec-mode SCRIPTEXEC = iocshLoad NAMING = mXsXXX (default), ClassicNaming, ESSnaming EC_RATE = 1000 @@ -39,7 +39,7 @@ startup.cmd takes the following arguments: ECMC_SUPPORT_MOTION = Variable to be used to block use of motion (""/empty=support motion or "#-"=disable motion) ECMC_TMP_DIR = directory for temporary files, defaults to "/tmp/${IOC}/EcMaster_${ECMC_EC_MASTER_ID}}/" ECMC_EC_TOOL_PATH = path to ethercat tool - ECMC_SAMPLE_RATE_MS = current record update rate in milli seconds + ECMC_SAMPLE_RATE_MS = current record update rate in milliseconds ECMC_SAMPLE_RATE_MS_ORIGINAL = ECMC_SAMPLE_RATE_MS (used for restore to default if ECMC_SAMPLE_RATE_MS is changed) ``` diff --git a/hugo/content/manual/knowledgebase/ethercatCLI.md b/hugo/content/manual/knowledgebase/ethercatCLI.md index 56178b64b..fb6976b67 100644 --- a/hugo/content/manual/knowledgebase/ethercatCLI.md +++ b/hugo/content/manual/knowledgebase/ethercatCLI.md @@ -69,7 +69,7 @@ Ethernet devices: If the link is `DOWN`, try bringing the network device up manually. This, can be done with `ip link set up` -If the device name is unkown, check with `ip link show` and search for the MAC the EtherCAT master is bound to. +If the device name is unknown, check with `ip link show` and search for the MAC the EtherCAT master is bound to. ### `ethercat slaves` As the command suggest, this will provide a list of the EtherCAT slaves. diff --git a/hugo/content/manual/knowledgebase/hardware/EL5042.md b/hugo/content/manual/knowledgebase/hardware/EL5042.md index cc5fbeb15..c21b0c503 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL5042.md +++ b/hugo/content/manual/knowledgebase/hardware/EL5042.md @@ -15,7 +15,7 @@ chapter = false ### error/warning Could be caused by: -* Wrong settings (bit counts, ..), see futher below on this page (and also motion/best practice). +* Wrong settings (bit counts, ..), see further below on this page (and also motion/best practice). * Bad electrical connection * Wrong power supply * Defect encoder or EL5042 @@ -25,7 +25,7 @@ Always start troubleshooting by checking the error, warning and ready bits and r #### 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 serial communication is handled 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. @@ -76,22 +76,22 @@ Long cable lengths can affect both power supply levels and the serial data chann **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. +Longer cables will normally also result in a higher voltage drops. Especially 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. +3. Add a separate (5V) power supply with possibilities 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): +The serial communication is also affected by the cable length. 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): ```bash ${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: +For EL5042 the following rates are available: * 10 MHz * 5 MHz * 3.33 MHz @@ -144,7 +144,7 @@ Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnosti **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.** {{% /notice %}} -When using the LSB offset setting, the same amout of bits needs to be subtracted from the ST_BITS or MT_BITS +When using the LSB offset setting, the same amount of bits needs to be subtracted from the ST_BITS or MT_BITS Example: 26bit RLS, no LSB offset ``` @@ -153,7 +153,7 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BIS 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) +#If the offset is needed then the sum of the bit's still need to match the bit-count 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" ``` @@ -180,7 +180,7 @@ Example: Posital kit SSI encoder, KCD-S1X3B-1617-IE4F-GRQ # 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) +# ST_BITS=17 + 2 = 19 (single turn bits + status bits) ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-Generic-SSI,CH_ID=1,MACROS=MT_BITS=24,ST_BITS=19" ``` diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 2b977dea5..a89093572 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -17,7 +17,7 @@ If the drive is in error or warning state, further information about the reason In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. {{% /notice %}} -The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the folowing syntax: +The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the following syntax: The ecmccfg/utils/read_el70xx_diag.sh tool can be used to read all the diagnostic registers: ```bash @@ -57,7 +57,7 @@ Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnosti #### under 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). +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 wrong setting of nominal drive voltage setting (48V but the drive is powered with 24V). The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). @@ -73,7 +73,7 @@ For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles t #### 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). +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 wrong setting of nominal drive voltage setting (24V but the drive is powered with 48V). The nominal drive voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). @@ -99,7 +99,7 @@ However, for the EL70x1 drives there's no dedicated velocity loop (however some For more information on tuning the position loop see [tuning](../../tuning) #### Current 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. +For most use cases, the default current controller parameters are already well tuned. Sometimes when operating at higher speeds the current loop needs to be tuned. The following parameters can be tuned for a EL70x1 stepper drive: * 8011:07 Ka factor diff --git a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md index 222f24cea..a5d037408 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md +++ b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md @@ -12,7 +12,7 @@ chapter = false ### 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. +First time, (and only first time), a system is in use, the over-current 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. {{% notice warning %}} **Before pressing any button, check the electrical drawings and make sure it's safe to power on the system.** @@ -22,12 +22,12 @@ First time, (and only first time), a system is in use, the overcurrent modules n 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. +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 strange issues. Both EL9227-5500 and EL9221-5000 have dedicated panels where 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. +The passive terminals will not show up as an EtherCAT slave when issuing 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. {{% notice warning %}} **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.** diff --git a/hugo/content/manual/knowledgebase/hardware/host.md b/hugo/content/manual/knowledgebase/hardware/host.md index f39c418e8..1be519054 100644 --- a/hugo/content/manual/knowledgebase/hardware/host.md +++ b/hugo/content/manual/knowledgebase/hardware/host.md @@ -36,7 +36,7 @@ After editing the file, the host needs to be rebooted in order for the changes t #### 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. +Reducing the ethercat cycle time is often very efficient 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): @@ -48,7 +48,7 @@ There are some restrictions on the sample rate. Normally, a rate in the range 10 {{% /notice %}} ** Affinity** -Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. +Setting the affinity of the ecmc realtime thread can often improve the performance. First check how many cores the controller has. {{% notice warning %}} At PSI, core 0 is always isolated, do not move any threads to core 0. {{% /notice %}} @@ -61,9 +61,9 @@ ${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. +If more than one ecmc ioc is running on the server, then make sure the ecmc_rt threads run on different cores. -Also other threads might take a lot of resources, for instace the epics thread "cbLow": +Also other threads might take a lot of resources, for instance the epics thread "cbLow": ``` afterInit "epicsThreadSetAffinity cbLow 6" ``` @@ -72,32 +72,32 @@ cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be exec {{% /notice %}} ### 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. +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 outside 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. +For more information see the chapter describing 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: +Issues that could occur in rates below 100Hz: * triggering of slave watchdogs -* issues with dc clock syncs (DC capabale slaves normally performs best with at a rate of atleast 500Hz) +* issues with dc clock syncs (DC capable slaves normally performs best with at a rate of at least 500Hz) * some slaves might not support it #### Higher rates -Issues that could occour in rates over 1Kz: +Issues that could occur in rates over 1Kz: * 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. +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 unnecessary/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) diff --git a/hugo/content/manual/knowledgebase/motion.md b/hugo/content/manual/knowledgebase/motion.md index 3dae2bce3..d744bc0a7 100644 --- a/hugo/content/manual/knowledgebase/motion.md +++ b/hugo/content/manual/knowledgebase/motion.md @@ -14,7 +14,7 @@ chapter = false --- ## 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: +The "BOTH_LIMITS" error can be related to that limits switches are not powered with 24V. As standard at PSI, limits are feed from 24V outputs, normally an EL2819 terminal. Basically the outputs 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: Define the output in axis yaml file: ``` @@ -25,17 +25,17 @@ axis: ... ``` -By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binaryOutput\,\): +By using the command Cfg.WriteEcEntryEcPath(ec\.s\.binaryOutput\,\): ``` ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" ``` ## position lag error -A position lag error (following error) can be genereated in the following situations: +A position lag error (following error) can be generated in the following situations: 1. The motor torque is too low, making it hard for the motor to keep up with the setpoint. 2. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. 3. The velocity setpoint is too high resulting in motor stall (common for stepper motors). -4. The velocity setpoint is higher than what the drive can achive (saturated velocity setpoint). +4. The velocity setpoint is higher than what the drive can achieve (saturated velocity setpoint). ### 1. motor torque to low @@ -44,7 +44,7 @@ A position lag error (following error) can be genereated in the following situat 3. Check the current setting of the motor. If possible increase the current setting to get a higher torque. {{% notice warning %}} -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. +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 vacuum applications. {{% /notice %}} ### 2. scaling factors are wrong @@ -52,24 +52,24 @@ Check the scaling documentation [here](https://paulscherrerinstitute.github.io/e 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. ### 3. the velocity setpoint is too high resulting in stall -If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higehr velocities: -1. Add a damper: This is nromally very effichient but not always possible. -2. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive), see hardware/tuning +If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higher velocities: +1. Add a damper: This is normally very efficient but not always possible. +2. Tune controller parameters (both position loop in ecmc and the controller loops in the drive), see hardware/tuning 3. If possible, test to increase or reduce current (make sure you do not burn the motor if increasing). {{% notice warning %}} -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. +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 vacuum applications. {{% /notice %}} ### 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: +For EL704x stepper drives are default setup to maximum velocity range of +-2000 full-steps/s. The 16bit velocity setpoint that are sent to the drive corresponds to this range. Basically trying to write a higher value than that will saturate the velocity setpoint resulting in that the required speed is not achieved, resulting in position lag error. The speed range for the EL704x can however be changed by setting SDO 8012:05: ``` -0 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 +0 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. @@ -80,7 +80,7 @@ Possible reasons: 1. For systems with safety, tripp off STO or power to the drive removed by contactor. Check status of safety system. 2. Over current protection of 48V tripped. 3. No 48V connected. -4. ecmc PLC disabaling axis, check PLC sources. +4. ecmc PLC disabling axis, check PLC sources. 5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state 6. Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). 7. Axis object configured with external interlock (yaml->input.interlock). diff --git a/hugo/content/manual/motion_cfg/_index.md b/hugo/content/manual/motion_cfg/_index.md index 00475d4a2..41b3a4408 100644 --- a/hugo/content/manual/motion_cfg/_index.md +++ b/hugo/content/manual/motion_cfg/_index.md @@ -25,7 +25,7 @@ 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. ### [plc yaml config](axisPLC) -Syncronization configurations +Synchronization configurations ### [scaling](scaling) Configuration of scaling diff --git a/hugo/content/manual/motion_cfg/axisPLC.md b/hugo/content/manual/motion_cfg/axisPLC.md index 29d7565a4..f698596ed 100644 --- a/hugo/content/manual/motion_cfg/axisPLC.md +++ b/hugo/content/manual/motion_cfg/axisPLC.md @@ -6,7 +6,7 @@ chapter = false ## Introduction Each axis can have a native PLC. -This PLC can be e.g. used for interlocking or synchronisation. +This PLC can be e.g. used for interlocking or synchronization. The axis PLC is part of the [yaml](axisyaml) config. The code can be provided [inline](#inline) or in a separate [file](#file). diff --git a/hugo/content/manual/motion_cfg/axisYaml.md b/hugo/content/manual/motion_cfg/axisYaml.md index 75b95a551..14cdfdfed 100644 --- a/hugo/content/manual/motion_cfg/axisYaml.md +++ b/hugo/content/manual/motion_cfg/axisYaml.md @@ -62,7 +62,7 @@ axis: id: 1 # type: joint # axis types: # 1 (equiv: physical, joint, j, motor, real) - # 2 (equiv: virtual, end_effector, endeffector, ee, e) + # 2 (equiv: virtual, end_effector, end-effector, ee, e) # mode: CSV # supported modes: CSV and CSP # parameters: powerAutoOnOff=2;powerOnDelay=6.0;powerOffDelay=1.0; ``` @@ -235,11 +235,11 @@ mandatory optional - `source`: source of position setpoint, 0=trajectory generator of axis ; 1=from PLC -- `type`: type of velocity profile: 0=trapezoidal ; 1=scurve +- `type`: type of velocity profile: 0=trapezoidal ; 1=s-curve - `axis` - - `deceleration`: deccelerartion setpoint for initialization (in EGU/sec2) + - `deceleration`: deceleration 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) + - `jerk`: jerk for s-curved profiles (in EGU/sec3) - `jog` * `velocity`: velocity setpoint the axis will be initialized to for jogging * `acceleration`: acceleration setpoint for initialization, for jogging @@ -304,7 +304,7 @@ optional ``` ## homing -This section is should be obsolete at PSI, as for all new installation using EtherCAT, absoulte encoders are mandatory. +This section is should be obsolete at PSI, as for all new installation using EtherCAT, absolute 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. optional @@ -426,14 +426,14 @@ axis: 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 + allowSrcChangeWhenEnabled: false # Allow traj/enc source change when axis is enabled allowedFunctions: homing: true # Allow homing constantVelocity: true # Allow constant velocity positioning: true # Allow positioning epics: - name: M1 # Axis anme + name: M1 # Axis name precision: 3 # Decimal count description: very important motor axis # Axis description unit: mm # Unit @@ -514,7 +514,7 @@ encoder: latchCount: 1 # latch number to ref on (1=ref on first latch) controller: - Kp: 15 # Kp proportinal gain + Kp: 15 # Kp proportional gain Ki: 0.02 # Ki integral gain Kd: 0 # Kd derivative gain Kff: 1 # Feed forward gain diff --git a/hugo/content/manual/motion_cfg/best_practice/_index.md b/hugo/content/manual/motion_cfg/best_practice/_index.md index 512b6a7db..b1e3a4112 100644 --- a/hugo/content/manual/motion_cfg/best_practice/_index.md +++ b/hugo/content/manual/motion_cfg/best_practice/_index.md @@ -5,13 +5,13 @@ chapter = false +++ ## best Practice -Here you can find some best practice configurations for common usecases. -The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) +Here you can find some best practice configurations for common use cases. +The complete examples with startup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) ### [stepper and BISS-C](stepper_biss_c) An example configuration of a EL7041-0052 and a EL5042. -The complete example with starup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/stepper_bissc) +The complete example with startup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/stepper_bissc) ### [servo](servo) An example configuration of a Ex72xx servo drive with AM8xxx motor. -The complete example with starup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/servo) +The complete example with startup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/servo) diff --git a/hugo/content/manual/motion_cfg/best_practice/servo.md b/hugo/content/manual/motion_cfg/best_practice/servo.md index 5be849e85..4159a3f8b 100644 --- a/hugo/content/manual/motion_cfg/best_practice/servo.md +++ b/hugo/content/manual/motion_cfg/best_practice/servo.md @@ -9,7 +9,7 @@ chapter = false * Lab test stage (1mm/rev) * Motor : AM8111-0F20 -### scalings +### scaling Config for scaling in mm, mm/s, mm/s2 ### motor AM8111-XFX0 @@ -24,16 +24,16 @@ Only the encoder integrated encoder is configured in this example. The specifica ``` One 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. +However, when connecting to an Ex72xx drive the single turn count will be 20bits and 12bits multi-turn, resulting in a total of 32bits absolute bits. * 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) +* encoder.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) +# The encoder on most motors are 20bit single turn and 12 bit multi-turn (4096 turns) encoder: type: 1 position: ec0.s$(DRV_ID).positionActual01 @@ -44,7 +44,7 @@ encoder: absOffset: -1000 ``` -### drive scalings +### drive scaling Max scale for motors depend on the pole count: * 6 pole: Max scale is 8000revs/s (in this case 8000mm/s) * 8 pole: Max scale is 6000revs/s diff --git a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md index 0c5db9095..800136264 100644 --- a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md @@ -15,7 +15,7 @@ chapter = false ## scalings Config for scaling in mm, mm/s, mm/s2 -### encoder scalings +### encoder scaling Two encoders are configured: 1. Closed loop: BISS-C. This is used as the default encoder for control 2. Open loop: EL7041 Step counter @@ -29,7 +29,7 @@ RLS BISS-C: * 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.absOffset: Offset to 0 position of linear stage (-1408.794 in this example) ``` encoder: @@ -51,13 +51,13 @@ encoder: **Hardware configuration EL5042** {{% notice warning %}} -Do not use the LSB offset functionality of the EL5042 (0x80p8:17). The same amount of ones ("1") 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. +Do not use the LSB offset functionality of the EL5042 (0x80p8:17). The same amount of ones ("1") will be shifted in as MSB which then normally leads to a higher position value, which is confusing. For more information see the knowledge-base/hardware section. {{% /notice %}} #### open loop (encoder 2) -The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): +The EL7041 drive has a build in micro step counter (64 micro-steps/full-step): * encoder.numerator: Travels 1 mm/rev -* encoder.denominator: Resolution: 200*64=12800 microsteps/rev = 12800 microsteps/mm +* encoder.denominator: Resolution: 200*64=12800 micro-steps/rev = 12800 micro-steps/mm * encoder.bits: The counter is 16bit (default) * encoder.type: Incremental (type 0) @@ -79,13 +79,13 @@ encoder: ### 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): -* drive.numerator: Max velo = 2000 fullsteps/s == 10mm/s +* drive.numerator: Max velo = 2000 full-steps/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) + numerator: 10 # Fastest speed in eng. units (2000 Full-steps/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 @@ -113,7 +113,7 @@ axis: ``` -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: +At PSI, the limit switches are connected directly to the 2 inputs of the EL70xx stepper drives and are accessible in the status word, bit 11 and 12: ``` input: limit: diff --git a/hugo/content/manual/motion_cfg/direction.md b/hugo/content/manual/motion_cfg/direction.md index daf3636f6..e195276fe 100644 --- a/hugo/content/manual/motion_cfg/direction.md +++ b/hugo/content/manual/motion_cfg/direction.md @@ -26,11 +26,11 @@ Consult the respective slave manual for the correct SDO. ### encoder direction -In many cases inverstion of the encoder value is possible in the ethercat slave. +In many cases inversion of the encoder value is possible in the ethercat slave. By using INV_DIR macro to applyComponent.cmd, the direction can be changed. {{% notice info %}} -For EL5042, example below, the invertion leads to a very high number since the data size is 64bit. Therefore, it's advisable to switch sign in the axis configuration instead. +For EL5042, example below, the inversion leads to a very high number since the data size is 64bit. Therefore, it's advisable to switch sign in the axis configuration instead. {{% /notice %}} ```shell diff --git a/hugo/content/manual/motion_cfg/homing.md b/hugo/content/manual/motion_cfg/homing.md index 2214ecddb..0e7699b70 100644 --- a/hugo/content/manual/motion_cfg/homing.md +++ b/hugo/content/manual/motion_cfg/homing.md @@ -6,7 +6,7 @@ chapter = false ## homing -The follwoing sequences are available: +The following sequences are available: ``` ECMC_SEQ_HOME_NOT_VALID = 0, ECMC_SEQ_HOME_LOW_LIM = 1, @@ -33,67 +33,67 @@ Not a valid homing sequence, can be used if encoder is absolute. ### ECMC_SEQ_HOME_LOW_LIM = 1, 1. Axis moves backward until low limit switch and stops -2. Axis moves forward untill edge detected in limit switch signal. Position is latched. +2. Axis moves forward until edge detected in limit switch signal. Position is latched. 3. Axis stops 4. Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. ### ECMC_SEQ_HOME_HIGH_LIM = 2, 1. Axis moves forward until high limit switch and stops -2. Axis moves backward untill edge detected in limit switch signal. Position is latched. +2. Axis moves backward until edge detected in limit switch signal. Position is latched. 3. Axis stops 4. 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, 1. Axis moves backward until low limit switch and stops -2. Axis moves forward untill edge detected in home switch signal. Position is latched. +2. Axis moves forward until edge detected in home switch signal. Position is latched. 3. Axis stops 4. 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, 1. Axis moves forward until high limit switch and stops -2. Axis moves backward untill edge detected in home switch signal. Position is latched. +2. Axis moves backward until edge detected in home switch signal. Position is latched. 3. Axis stops 4. 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, 1. Axis moves backward until low limit switch and stops -2. Axis moves forward untill edge detected in home switch signal. Position is latched. -3. Axis continues untill second edge of home sensor. Motion is stopped. -4. Axis moves backward untill edge of home sensor. Position is latched. +2. Axis moves forward until edge detected in home switch signal. Position is latched. +3. Axis continues until second edge of home sensor. Motion is stopped. +4. Axis moves backward until edge of home sensor. Position is latched. 5. 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, 1. Axis moves forward until low limit switch and stops -2. Axis moves backward untill edge detected in home switch signal. Position is latched. -3. Axis continues untill second edge of home sensor. Motion is stopped. -4. Axis moves forward untill edge of home sensor. Position is latched. +2. Axis moves backward until edge detected in home switch signal. Position is latched. +3. Axis continues until second edge of home sensor. Motion is stopped. +4. Axis moves forward until edge of home sensor. Position is latched. 5. 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, -1. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +1. Axis moves backward until positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) 2. Axis stops 3. Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 1. ### ECMC_SEQ_HOME_FWD_HOME = 8, -1. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +1. Axis moves forward until positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) 2. Axis stops 3. 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, -1. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +1. Axis moves backward until positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) 2. Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. -3. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +3. Axis moves forward until positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) 4. 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, -1. Axis moves forward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +1. Axis moves forward until positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) 2. Axis contiues to move until a negative edge of the home sensor is detected. Axis stops. -3. Axis moves backward untill positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) +3. Axis moves backward until positive edge detected in limit switch signal. Position is latched. (polarity of home sensor can be changed) 4. 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, 1. Axis moves backward until low limit switch and stops -2. 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. +2. Axis moves forward until the predefined index signals (ECMC_HOME_LATCH_COUNT_OFFSET)from the encoder is encountered. Position is latched at the desired index position. 3. Axis stops 4. Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. @@ -107,7 +107,7 @@ epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # ### ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, 1. Axis moves forward until high limit switch and stops -2. 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. +2. Axis moves backward until the predefined index signals (ECMC_HOME_LATCH_COUNT_OFFSET) from the encoder is encountered. Position is latched at the desired index position. 3. Axis stops 4. Homing is performed. ECMC_HOME_POS will be the new position at the position latched in step 2. @@ -139,9 +139,9 @@ 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. 1. Axis moves backward until low limit switch and stops -2. Axis moves forward untill limit switch change state +2. Axis moves forward until limit switch change state 3. Axis stops -4. 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. +4. Homing is performed. The multi-turn bits will be homed to the value of ECMC_HOME_POS also considering a offset of turns defined in ECMC_HOME_LATCH_COUNT_OFFSET. Some additional parameters are important for this homing sequence should work (example): ``` @@ -152,9 +152,9 @@ epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # Number o ### ECMC_SEQ_HOME_HIGH_LIM_SINGLE_TURN_ABS = 22, 1. Axis moves forward until high limit switch and stops -2. Axis moves backward untill limit switch change state +2. Axis moves backward until limit switch change state 3. Axis stops -4. 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. +4. Homing is performed. The multi turn bits will be homed to the value of ECMC_HOME_POS also considering a offset of turns defined in ECMC_HOME_LATCH_COUNT_OFFSET. Note: Only the multi turn bits are updated! @@ -170,18 +170,18 @@ Sequence 25 is the same as 15 but not blocked by motor record. The sequence will ### ECMC_SEQ_HOME_TRIGG_EXTERN = 26 Trigger external homing sequence in drive. -1. Optional: set drive mode to homing (and wait for mode readback) +1. Optional: set drive mode to homing (and wait for mode read-back) 3. Set trigg of homing (bit) -4. Wait for homing ready (bit). Reference the ecmc encoder object on rising edge of the homing reday bit -5. Optional: Change drive mode back to motion (and wait for mode readback) +4. Wait for homing ready (bit). Reference the ecmc encoder object on rising edge of the homing ready bit +5. Optional: Change drive mode back to motion (and wait for mode read-back) 6. Optional: Init post move if configured Currently used for smaract: [smaracat example](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/test/smaract) -In this exmaple also the drive modes is automatically handled by ecmc. +In this example also the drive modes is automatically handled by ecmc. ## setting 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: +For some of the sequences it could be useful to change the polarity of the home sensor. That can be done with the following command: ``` "Cfg.SetAxisMonHomeSwitchPolarity(int axisIndex, int polarity)"; # polarity==0 is NC (default) diff --git a/hugo/content/manual/motion_cfg/scaling.md b/hugo/content/manual/motion_cfg/scaling.md index fa1a3bc04..beb259daa 100644 --- a/hugo/content/manual/motion_cfg/scaling.md +++ b/hugo/content/manual/motion_cfg/scaling.md @@ -15,16 +15,16 @@ If the drive scaling is changes, make sure to adjust the PID parameters accordin ## 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](#stepper-motor-drives) and [servo drives](#servo-motor-drives) +Scaling is similar, but slightly different for [stepper drives](#stepper-motor-drives) and [servo drives](#servo-motor-drives) ### stepper motor drives The scaling for the Ex70xx slaves will be explained based on two very common examples. #### simple linear axis Assumptions: -* 200 fullsteps/rev motor +* 200 full-steps/rev motor * lead screw pitch: 5 mm/rev -* Register `0x8012:05` is set to `1` --> 2000 fullsteps max step rate (default for ECMC, check for other slaves!) +* Register `0x8012:05` is set to `1` --> 2000 full-steps max step rate (default for ECMC, check for other slaves!) * `velocitySetpoint` is in 16-bits. ```yaml @@ -36,15 +36,15 @@ drive: ##### 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. +This means that at full output the motor would receive 2000 full-steps 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. #### rotational axis Assumptions: -* 400 fullsteps/rev motor +* 400 full-steps/rev motor * drive train ratio: 36 deg/rev -* Register `0x8012:05` is set to `1` --> 2000 fullsteps max step rate (default for ECMC, check for other slaves!) +* Register `0x8012:05` is set to `1` --> 2000 full-steps max step rate (default for ECMC, check for other slaves!) * `velocitySetpoint` is in 16-bits. ```yaml @@ -54,8 +54,8 @@ drive: ``` ##### 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 +At full output, the motor receives 2000 full-steps/s, which results in 5 rev/s +due to the higher full-step 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 @@ -86,7 +86,7 @@ drive: This scaling ratio describes the relation of encoder counts and engineering units of the axis. Unlike 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. +It represents merely the relation between the observed counts on the encoder and the displacement of the load. ### closed-loop @@ -112,15 +112,15 @@ In the example below such a case is presented, with an explanation. ```yaml encoder: numerator: 0.125 # 0.125 mm/rev lead screw - denominator: 12800 # 200 fullsteps/rev with 64 microsteps/fullstep + denominator: 12800 # 200 full-steps/rev with 64 micro-steps/full-step type: 0 # Type: 0=Incremental, 1=Absolute bits: 16 # Total bit count of encoder raw data ``` #### explanation -The internal step counter operates in microsteps. +The internal step counter operates in micro-steps. 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`. +In case of a 200 full-steps/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. From b0b5f8bd5b3c19aec045b2a24e58240141989144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sat, 28 Sep 2024 21:16:53 +0200 Subject: [PATCH 119/128] Adjust manual fonts --- hugo/Readme.md | 2 +- hugo/config.toml | 2 ++ hugo/static/css/custom.css | 49 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 hugo/static/css/custom.css diff --git a/hugo/Readme.md b/hugo/Readme.md index ece8e0c4a..e5c617e3e 100644 --- a/hugo/Readme.md +++ b/hugo/Readme.md @@ -36,7 +36,7 @@ Observe the CLI output for details. 1. gawk at the beauty of the produced web-site :) ### editing the code -* contend is found in the `content` directory +* content is found in the `content` directory * mostly everything is done in markdown * the HUGO theme ["learn"](http://github.com/matcornic/hugo-theme-learn) is used. Follow the instructions [here](https://learn.netlify.app/en/) for examples and an overview of it's capabilities. * changes are reflected immediately in the browser after saving your changes. diff --git a/hugo/config.toml b/hugo/config.toml index 8f8ac84f6..a6691ed3d 100644 --- a/hugo/config.toml +++ b/hugo/config.toml @@ -4,6 +4,7 @@ title = 'ecmccfg' theme = "hugo-theme-learn" relativeURLs = true canonifyURLs = true + [markup] [markup.goldmark] [markup.goldmark.renderer] @@ -15,3 +16,4 @@ canonifyURLs = true themeVariant = "green" # Set this to true to disable copy-to-clipboard button for inline code. disableInlineCopyToClipBoard = true + custom_css = ["css/custom.css"] diff --git a/hugo/static/css/custom.css b/hugo/static/css/custom.css new file mode 100644 index 000000000..981805ec3 --- /dev/null +++ b/hugo/static/css/custom.css @@ -0,0 +1,49 @@ +html { + font-size: 40%; /* Adjust this percentage to scale all font sizes */ +} + +/* Target the specific note classes */ +.admonition.note p, +.admonition.warning p, +.admonition.tip p, +.admonition.info p { + font-size: 1.2rem !important; /* Adjust size as needed */ +} + +/* Additional targeting, if needed */ +.note p, .warning p, .tip p, .info p { + font-size: 2.2rem !important; +} + +code { + font-size: 1.8rem !important; /* Adjust size as needed */ +} + +/* General heading font size increases */ +h1 { + font-size: 3rem !important; /* Adjust for h1 */ +} + +h2 { + font-size: 3rem !important; /* Adjust for h2 */ +} + +h3 { + font-size: 3rem !important; /* Adjust for h3 */ +} + +h4 { + font-size: 3rem !important; /* Adjust for h4 */ +} + +h5 { + font-size: 2rem !important; /* Adjust for h5 */ +} + +h6 { + font-size: 2rem !important; /* Adjust for h6 */ +} + +.page-title { + font-size: 4rem !important; +} From 1daf0e534c09f9dbd42a67dc197e9a9132e1608e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sat, 28 Sep 2024 23:14:42 +0200 Subject: [PATCH 120/128] Add some content and adjust fontsizes --- .gitignore | 1 + .../content/manual/general_cfg/iocsh_utils.md | 127 ++++++++++++++++-- .../manual/general_cfg/startup/modes.md | 10 +- hugo/content/manual/introduction.md | 2 +- hugo/content/manual/knowledgebase/_index.md | 29 +--- hugo/content/manual/knowledgebase/panel.md | 28 ++++ hugo/static/css/custom.css | 20 +-- 7 files changed, 167 insertions(+), 50 deletions(-) create mode 100644 hugo/content/manual/knowledgebase/panel.md diff --git a/.gitignore b/.gitignore index e2bd7fe6c..22dfcc58c 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ hugo/content/source/ *.pyc .hugo_build.lock +hugo/public diff --git a/hugo/content/manual/general_cfg/iocsh_utils.md b/hugo/content/manual/general_cfg/iocsh_utils.md index 94fb4c5e3..8476b0d55 100644 --- a/hugo/content/manual/general_cfg/iocsh_utils.md +++ b/hugo/content/manual/general_cfg/iocsh_utils.md @@ -14,7 +14,7 @@ chapter = false * record fields * ... -``` +```text ecmcEpicsEnvSetCalc -h Use "ecmcEpicsEnvSetCalc(, , )" to evaluate the expression and assign the variable. @@ -82,8 +82,6 @@ result=0 ecmcEpicsEnvSetCalc("result", "if('ecmcEL3002.cmd'='test.script') {RESULT:=1;}else{RESULT:=0;};") epicsEnvShow("result") result=0 - - ``` ### Iocsh function "ecmcEpicsEnvSetCalcTernary()" "ecmcEpicsEnvSetCalcTernary()" is used o evaluate expressions and set EPCIS environment variables to different strings. @@ -92,7 +90,7 @@ result=0 * making conditional ecmc settings * ... -``` +```text ecmcEpicsEnvSetCalcTernary -h Test iocsh function "ecmcEpicsEnvSetCalcTernary()" t @@ -134,8 +132,6 @@ result=equal ecmcEpicsEnvSetCalcTernary("result", "if('./plc_slow.cfg'='test') {RESULT:=1;}else{RESULT:=0;};","use_this_file.cfg","no_use_this_file.cfg") epicsEnvShow("result") result=no_use_this_file.cfg - - ``` ### Use return value of ecmcConfig(OrDie): @@ -158,10 +154,125 @@ The variable "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, nam Note: PDO reads need to be after "SetAppMode(1)" since cyclic value ``` ecmcConfig "ReadEcEntryIDString(${ECMC_SLAVE_NUM},"ID")" -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 "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. + +### ecmcIf(\,\,\) +ecmcIf() set two macros depending on the value of the evaluated expression. If it evaluates to true: +1. IF_TRUE="" Allows execution of a line of code +2. IF_FALSE= "#-" Block execution of a line of code + +If expression evaluates to false: +1. IF_TRUE="#-" Block execution of a line of code +2. IF_FALSE= "" Allows execution of a line of code + +Note: These macros is the default names for the macros (but can be changed by assignment of the 2 last params in call to ecmcIf()): +1. IF_TRUE for true +2. IF_FALSE for false + +### ecmcIf +``` +ecmcEndIf(\,\) +``` + +The ecmcEndIf() command unsets the last used macros (for true and false), if different names are passed as arguments then then these macros are unset (for nested if statements). + +#### Example of of syntax +Example 1: +``` +ecmcIf("") +${IF_TRUE} # Code to execute if expression eval true +#- else +${IF_FALSE} # Code to execute if expression eval false +ecmcEndIf() +``` +Example 2: +``` +ecmcIf("$(VAL1)=$(VAL2)") +${IF_TRUE}epicsEnvSet(IS_EQUAL,"1") +#- else +${IF_FALSE}epicsEnvSet(IS_EQUAL,"0") +ecmcEndIf() +``` +Note: For nested calls to ecmcIf() and ecmcEndIf() optional macros must be used. + +### ecmcForLoop +Useful for: +* Large systems with many similar sub systems +* Configuring hardware with many PDOs (oversampling) + +``` +"ecmcForLoop(, , , , , )" to loop execution of file with a changing loop variable. + : Filename to execute in for loop. + : Macros to feed to execution of file. + : start value. + : end value. + : Step to increase each loop cycle. + +``` +Example ("ECMC_LOOP_IDX" as loop variable): + +``` +ecmcForLoop(./loopStep.cmd,"",ECMC_LOOP_IDX,1,5,1) +ecmcEpicsEnvSetCalc("TESTING",1*10) +epicsEnvShow("TESTING") +TESTING=10 +ecmcEpicsEnvSetCalc("TESTING",2*10) +epicsEnvShow("TESTING") +TESTING=20 +ecmcEpicsEnvSetCalc("TESTING",3*10) +epicsEnvShow("TESTING") +TESTING=30 +ecmcEpicsEnvSetCalc("TESTING",4*10) +epicsEnvShow("TESTING") +TESTING=40 +ecmcEpicsEnvSetCalc("TESTING",5*10) +epicsEnvShow("TESTING") +TESTING=50 +``` +where "loopStep.cmd" file looks like this (note the use of "ECMC_LOOP_IDX"): +``` +#- Commands tp execute in each loop of example ecmcForLoop.script +ecmcEpicsEnvSetCalc("TESTING",${ECMC_LOOP_IDX}*10) +epicsEnvShow("TESTING") +``` + +### ecmcFileExist +Useful for checking that configuration files really exist and then can be loaded. +``` +ecmcFileExist(, , , )" to check if a file exists. + : Filename to check. + : Exit EPICS if file not exist. Optional, defaults to 0. + : Look for files in EPICS_DB_INCLUDE_PATH dirs. Optional, defaults to 0.\n"); + : List of dirs to search for file in (separated with ':'). +result will be stored in the EPICS environment variable "ECMC_FILE_EXIST_RETURN_VAL" +``` +Example: +``` +ecmcFileExist("file_exist.cfg") +epicsEnvShow(ECMC_FILE_EXIST_RETURN_VAL) +ECMC_FILE_EXIST_RETURN_VAL=1 + +ecmcFileExist("file_not_exist.cfg",1) +Error: File "file_not_exist.cfg" does not exist. ECMC shuts down. + +ecmcFileExist("ecmcEK1100.substitutions",1,1) +epicsEnvShow(ECMC_FILE_EXIST_RETURN_VAL) +ECMC_FILE_EXIST_RETURN_VAL=1 + +ecmcFileExist("ecmcEK1100.substitutions",0,0,"/home/") +epicsEnvShow(ECMC_FILE_EXIST_RETURN_VAL) +ECMC_FILE_EXIST_RETURN_VAL=0 +``` +### Todo +Add docs for: +* ecmcConfigOrDie +* ecmcConfig +* ecmcGrepParam +* ecmcGrepRecord +* ecmcReport +* ecmcAsynPortDriverConfigure diff --git a/hugo/content/manual/general_cfg/startup/modes.md b/hugo/content/manual/general_cfg/startup/modes.md index 8aef82a53..9ae3b830d 100644 --- a/hugo/content/manual/general_cfg/startup/modes.md +++ b/hugo/content/manual/general_cfg/startup/modes.md @@ -4,7 +4,7 @@ weight = 15 chapter = false +++ -## ecmc modes +### ecmc modes ecmc can be started in different modes by setting the MODE parameter to startup.cmd (or require ecmccfg): 1. FULL 2. DAQ @@ -12,7 +12,7 @@ ecmc can be started in different modes by setting the MODE parameter to startup. A separate mode for commissioning is also available, called ENG_MODE. -### mode==FULL (default) +#### mode==FULL (default) In FULL mode all ecmc functionalities are supported, like motion, daq and plcs. @@ -25,7 +25,7 @@ $(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, "IOC=$(IOC),ECMC_VER=dev $(ECMCCFG_INIT)$(SCRIPTEXEC) ${ecmccfg_DIR}startup.cmd, "IOC=$(IOC),ECMC_VER=develop" ``` -### mode==DAQ +#### mode==DAQ In DAQ mode, motion functionalities are disabled and the following commands are blocked: 1. configureAxis.cmd 2. configureVirtualAxis.cmd @@ -44,11 +44,11 @@ NOTE: The default record update rate is set to 10ms in initAlll.cmd. For DAQ app epicsEnvSet("ECMC_SAMPLE_RATE_MS",1) ``` -### mode==NO_MR +#### mode==NO_MR In this mode all features are supported, but motor record will not be created for motion axes. -### ENG_MODE +#### ENG_MODE Setting the parameter ENG_MODE=1 will result in loading of extra PVs usefull for commissioning, i.e. controller parameters for motion axes. diff --git a/hugo/content/manual/introduction.md b/hugo/content/manual/introduction.md index 50aa92795..7bceff688 100644 --- a/hugo/content/manual/introduction.md +++ b/hugo/content/manual/introduction.md @@ -12,7 +12,7 @@ During IOC-startup, the requested configuration is validated against the actuall Mismatches will result in an error, the IOC will _not_ start. {{% notice warning %}} -Blindly restarting the IOC, with only partially working EtherCAT hardware, will results in an inoperable IOC! Refer to the [troubleshooting guide](../troubleshooting) for details. +Blindly restarting the IOC, with only partially working EtherCAT hardware, will results in an inoperable IOC! If troubleshooting is needed then check out the [knowledge base](../knowledgebase) for details. {{% /notice %}} ### IOC structure diff --git a/hugo/content/manual/knowledgebase/_index.md b/hugo/content/manual/knowledgebase/_index.md index 2a5371c84..2273d475b 100644 --- a/hugo/content/manual/knowledgebase/_index.md +++ b/hugo/content/manual/knowledgebase/_index.md @@ -8,29 +8,6 @@ chapter = false {{% children %}} --- -## Overview panel -For an overview of an ecmc system, the ecmcMain.ui panel is a good starting point. -The ecmcMain.ui covers most parts of an ecmc system: -* ecmc_rt thread diagnostics: - - Jitter - - Cycle time -* EtherCAT: - - Status - - Lost frames - - Slave count - - master Id - - Links to dedicated sub panels for each slave type. -* Links to all configured objects: - - motion expert panels - - PLC objects - - plugin objects - - data storage objects - -The ecmcMain.ui is started with the following syntax: -``` -caqtdm -macro "IOC=" ecmcMain.ui -``` - ## Knowledge base 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! @@ -42,8 +19,8 @@ See a summary, incl. some examples of what possible [here](ethercatcli). ### [motion](motion) For motion related issues, a very short troubleshooting guide is provided [here](motion). -### [drive tuning](tuning) -Tune drive control loops - ### [hardware](hardware) For hardware related issues, a very short troubleshooting guide is provided [here](hardware). + +### [tuning](tuning) +Tune drive control loops diff --git a/hugo/content/manual/knowledgebase/panel.md b/hugo/content/manual/knowledgebase/panel.md new file mode 100644 index 000000000..60d72dce4 --- /dev/null +++ b/hugo/content/manual/knowledgebase/panel.md @@ -0,0 +1,28 @@ ++++ +title = "panel" +weight = 20 +chapter = false ++++ + +### Overview panel +For an overview of an ecmc system, the ecmcMain.ui panel is a good starting point. +The ecmcMain.ui covers most parts of an ecmc system: +* ecmc_rt thread diagnostics: + - Jitter + - Cycle time +* EtherCAT: + - Status + - Lost frames + - Slave count + - master Id + - Links to dedicated sub panels for each slave type. +* Links to all configured objects: + - motion expert panels + - PLC objects + - plugin objects + - data storage objects + +The ecmcMain.ui is started with the following syntax: +``` +caqtdm -macro "IOC=" ecmcMain.ui +``` diff --git a/hugo/static/css/custom.css b/hugo/static/css/custom.css index 981805ec3..4a70f4eb9 100644 --- a/hugo/static/css/custom.css +++ b/hugo/static/css/custom.css @@ -1,5 +1,5 @@ html { - font-size: 40%; /* Adjust this percentage to scale all font sizes */ + font-size: 100%; /* Adjust this percentage to scale all font sizes */ } /* Target the specific note classes */ @@ -12,38 +12,38 @@ html { /* Additional targeting, if needed */ .note p, .warning p, .tip p, .info p { - font-size: 2.2rem !important; + font-size: 0.9rem !important; } code { - font-size: 1.8rem !important; /* Adjust size as needed */ + font-size: 0.8rem !important; /* Adjust size as needed */ } /* General heading font size increases */ h1 { - font-size: 3rem !important; /* Adjust for h1 */ + font-size: 1.5rem !important; /* Adjust for h1 */ } h2 { - font-size: 3rem !important; /* Adjust for h2 */ + font-size: 1.3rem !important; /* Adjust for h2 */ } h3 { - font-size: 3rem !important; /* Adjust for h3 */ + font-size: 1.2rem !important; /* Adjust for h3 */ } h4 { - font-size: 3rem !important; /* Adjust for h4 */ + font-size: 1.1rem !important; /* Adjust for h4 */ } h5 { - font-size: 2rem !important; /* Adjust for h5 */ + font-size: 1rem !important; /* Adjust for h5 */ } h6 { - font-size: 2rem !important; /* Adjust for h6 */ + font-size: 1rem !important; /* Adjust for h6 */ } .page-title { - font-size: 4rem !important; + font-size: 1rem !important; } From c536e8ca21e99503dbaaf6555fefa085b9eaa7af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sun, 29 Sep 2024 18:11:13 +0200 Subject: [PATCH 121/128] Add more info to manual --- hugo/content/manual/PLC_cfg/function_libs.md | 2 +- hugo/content/manual/best_practice.md | 10 +++ .../manual/general_cfg/best_practice.md | 2 +- hugo/content/manual/introduction.md | 14 ++++ .../manual/knowledgebase/hardware/EL1xxx.md | 30 +++++++ .../manual/knowledgebase/hardware/EL51xx.md | 82 +++++++++++++++++++ .../manual/knowledgebase/hardware/EL70x1.md | 6 +- .../manual/knowledgebase/hardware/ELxxxx.md | 23 ++++++ .../manual/knowledgebase/hardware/_index.md | 2 +- .../knowledgebase/{hardware => }/host.md | 4 +- hugo/content/manual/knowledgebase/panel.md | 2 +- 11 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 hugo/content/manual/best_practice.md create mode 100644 hugo/content/manual/knowledgebase/hardware/EL1xxx.md create mode 100644 hugo/content/manual/knowledgebase/hardware/EL51xx.md create mode 100644 hugo/content/manual/knowledgebase/hardware/ELxxxx.md rename hugo/content/manual/knowledgebase/{hardware => }/host.md (99%) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index abf4c9e0e..575bb274c 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -6,7 +6,7 @@ chapter = false ## 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 +* FILE: 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 diff --git a/hugo/content/manual/best_practice.md b/hugo/content/manual/best_practice.md new file mode 100644 index 000000000..ee24abdea --- /dev/null +++ b/hugo/content/manual/best_practice.md @@ -0,0 +1,10 @@ ++++ +title = "best practice" +weight = 6 +chapter = false ++++ + +### links to best practice: +* [General](../general_cfg/best_practice/) +* [Motion](../motion_cfg/best_practice/) +* [PLC](../plc_cfg/best_practice/) diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md index 413a4468b..af7c9afe4 100644 --- a/hugo/content/manual/general_cfg/best_practice.md +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -18,7 +18,7 @@ As a comparison, TwinCAT default EtherCAT rates are: * 100Hz for PLC * 500Hz for motion -See [ecmc_server](../../knowledgebase/hardware/host/) for more information. +See [host/ecmc_server](../../knowledgebase/host/) for more information. ## ecmc server setup * If possible, make sure you use the native igb ethercat driver. diff --git a/hugo/content/manual/introduction.md b/hugo/content/manual/introduction.md index 7bceff688..438394edb 100644 --- a/hugo/content/manual/introduction.md +++ b/hugo/content/manual/introduction.md @@ -41,6 +41,8 @@ For this purpose scripts can be called for: * **adding and configure** while adding * **applying** a configuration to the previously added slaves +In addition to these ecmccfg scripts also the ecmccomp repo that contains a component library can be used. Settings are then applied with the ecmccomp/applyComponent.cmd, see below examples. + ##### 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. @@ -109,17 +111,26 @@ It is theoretically possible to use a mix of `yaml` and classic configuration, b epicsEnvSet("DEV", "STEST-MYDEVICE") ${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, "CONFIG=./cfg/axis_1" ``` +{{% notice tip %}} +See [best practice](../motion_cfg/best_practice/) and [yaml cfg](../motion_cfg/axisyaml/) and for more information. +{{% /notice %}} ##### adding a virtual motor axis ```bash ${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, "CONFIG=./cfg/axis_11_virt" ``` +{{% notice tip %}} +See [best practice](../motion_cfg/best_practice/) and [yaml cfg](../motion_cfg/axisyaml/) and for more information. +{{% /notice %}} ##### adding synchronization ```bash ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, "CONFIG=./cfg/axis_1_sync" ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, "CONFIG=./cfg/axis_11_sync" ``` +{{% notice tip %}} +See [best practice](../motion_cfg/best_practice/) and [yaml cfg](../motion_cfg/axisyaml/) and for more information. +{{% /notice %}} ##### loading a PLC from file The PLC functionality is explained in detail here. @@ -136,6 +147,9 @@ ECMC PLCs can be loaded from classical PLC files, from pure yaml files or from a ```bash ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd "FILE=./plc1File.yaml" ``` +{{% notice tip %}} +See [plc cfg](../plc_cfg/best_practice/) for more information. +{{% /notice %}} #### go active ```bash diff --git a/hugo/content/manual/knowledgebase/hardware/EL1xxx.md b/hugo/content/manual/knowledgebase/hardware/EL1xxx.md new file mode 100644 index 000000000..f66fe495a --- /dev/null +++ b/hugo/content/manual/knowledgebase/hardware/EL1xxx.md @@ -0,0 +1,30 @@ ++++ +title = "EL1xxx" +weight = 17 +chapter = false ++++ + +### EL1252, EL1252-0050 +EL1252-xxxx is a 2 ch digital input terminal with timestamps (low to high, high to low): +* EL1252: **24V signals** +* EL1252-0050: **5V signals** + +Both terminals have the product id and process data and can therefore be configured as EL1252: +``` +# One channel: +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL1252" +``` + +These terminals are very powerful since they can latch the time of the positive edge and/or negative edge of the input signal (independent of the ethercat bus rate). These timestamps can then be used to correlated other data, like encoders or analog inputs with timestamps. + +**IMPORTANT** +Sine the EL1252-0050 is a 5V terminal, it needs to be powered with **5V** if the terminal is powered with 24V, the terminal will burn. The simplest way to achieve a correct power supply is by adding an EL9505 (or similar) before the EL1252-0050. +See above for more information [5v-and-24v-terminals](../elxxxx#5v-and-24v-terminals) + +{{% notice warning %}} +**Make sure the EL1252-0050 has a 5V power supply by an EL9505 (or similar), before powering the system. If the terminal is powered with the normal 24V it will most likely break** +{{% /notice %}} + +{{% notice note %}} +A 5v signal will not be detected with the 24V version (EL1252), the terminal will however not be damaged. Further more, it's not a good idea to to power the 24V version with 5V (EL9505, or similar) +{{% /notice %}} diff --git a/hugo/content/manual/knowledgebase/hardware/EL51xx.md b/hugo/content/manual/knowledgebase/hardware/EL51xx.md new file mode 100644 index 000000000..3e6bdfb23 --- /dev/null +++ b/hugo/content/manual/knowledgebase/hardware/EL51xx.md @@ -0,0 +1,82 @@ ++++ +title = "EL51xx" +weight = 20 +chapter = false ++++ + +## Overview +The EL51xx series covers incremental encoder interfaces: +1. EL5101: 1 ch, diff rs422, ttl, 1MHz +2. EL5101-0010: 1 ch, diff rs422, 5MHz +3. EL5101-0011: 1 ch, diff rs422, 5MHz, oversampling 100kHz +4. EL5112: 2 ch ABC or 1ch AB, rs422, 5MHz, **PSI standard** +5. EL5131: 1 ch, diff rs422, 5MHz, 2 digital outputs for cam/trigger + +### General +Normally, the incremental encoder interfaces do not require any SDO configuration. Therefore, the ecmccomp/applyComponent.cmd, which many times are needed after the ecmccfg/addSlave.cmd, is in most cases not needed. + +### Adding the slave +Make sure you use the correct slave type when adding the slave. Some of the slaves have the same product id but totally different process data which can result in that the slave will not go into OP mode and ecmc will fail to start and a timeout will occur. + +For example, the EL5101-**0010** and EL5101-**0011** has the same product id but very different process data. +So, if an EL5101-**0011** is added to the configuration but the actual slave connected is an EL5101-**0010**, the initial product id verification will not catch the miss match. However, later the slave will not go online since the process data is wrong. + +The issue can be diagnosed by checking the dmesg logs: +```bash +# first login to host (ecmc server) +sudo dmesg +``` +Configuring the wrong process data will lead to an error message "* EtherCAT * Invalid input configuration" + +The solution is to use the correct configuration script. + +### EL5101-0010 +This is commonly used at PSI (even though the EL5112 should be teh standard choice). For configuration, use the EL5101-0010 configuration script: +``` +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5101-0010" +``` +### EL5101-0011 +This is an oversampling slave, use the EL5101-0011 configuration script with an optional NELM which defines the levels of oversampling: +Example: Add an EL5101-0011, with 100 levels of oversampling: +``` +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5101-0011, NELM=100" +``` +In the above example, for each ethercat frame, an array of 100 elements will be transferred. If the ethercat rate is 1kHz, then the incremental data will be sampled at 100kHz (which also is the maximum rate for this terminal). + +{{% notice note %}} +NELM cannot be freely defined, depending on the ethercat rate different NELM values will be accepted. Consult the EL5101-0011 manual for more information. +Normally, NELM needs to be an integer value, like 10,20,50, 100. +{{% /notice %}} + +### EL5112 +This is the PSI standard incremental encoder interface. The terminal can be used as one channel if index pulse needs to be connected or two channel if only A and B pulse trains are needed. + +For 1 channel operation with index pulse, use the EL5112_ABC configuration script and for two channel, the EL5112_AB script: +``` +# One channel: +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5112_ABC" + +# Two channel: +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5112_AB" +``` + +### EL5131 +This terminal support setting cam/trigger outputs at certain counter values (for predefined time, and direction). + +8 predefined threshold counter values can be entered and configured switch outputs on or off. These thresholds can also be accessed/updated during runtime. + +Depending how the terminal should be used, the following startup scripts exists: +* EL5131: Normal increment encoder operation +* EL5131_DC: Normal incremental encoder and DC clock (access to timestamps) +* EL5131_DC_TRG: Incremental encoder, access to timestamps, access to configuration of thresholds for outputs for triggering. + +``` +# EL5131: Normal increment encoder operation: +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5131" + +# EL5131_DC: Normal incremental encoder and DC clock (access to timestamps) +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5131_DC" + +# EL5131_DC_TRG: Incremental encoder, access to timestamps and configuration of thresholds for outputs/triggering. +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "SLAVE_ID=16, HW_DESC=EL5131_DC" +``` diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index a89093572..e4a0b873b 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -1,6 +1,6 @@ +++ title = "EL70x1" -weight = 19 +weight = 22 chapter = false +++ @@ -8,10 +8,8 @@ chapter = false 1. [error/warning](#error/warning) 2. [Tuning](#tuning) ---- - ### error/warning -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](ethercatcli) for more info. +If the El70x1 is in error or warning state, further information about the reason for the error/warning can be read from the drives diagnostic register by using the ethercat command. See [command line interface](ethercatcli). {{% notice info %}} In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. diff --git a/hugo/content/manual/knowledgebase/hardware/ELxxxx.md b/hugo/content/manual/knowledgebase/hardware/ELxxxx.md new file mode 100644 index 000000000..87e898062 --- /dev/null +++ b/hugo/content/manual/knowledgebase/hardware/ELxxxx.md @@ -0,0 +1,23 @@ ++++ +title = "ELxxxx" +weight = 16 +chapter = false ++++ + +# 5V and 24V terminals +24V is the most common signal level for the terminals, however, a few terminals also support other voltage levels, for instance 5V. +In that case, normally the terminal needs to be powered with the same voltage. +For 5V terminals, normally this is handled by adding a EL9505 before the 5v terminal in the ethercat chain. The EL9505 will supply the power bus with 5V instead of the normal 24V . + +Example of slaves needing 5V power supply: +* EL1124 +* El1252-0050 +* ... + +{{% notice warning %}} +**If a 5V terminal is supplied with 24V it will most likely break. Make sure the terminals has the correct power supply __before__ powering the system.** +{{% /notice %}} + +{{% notice note %}} +**The voltage level of the power bus after (downstream) of a 5V terminal is normally also 5V, if another voltage is needed then another system terminal is needed to set a new voltage level of the power bus** +{{% /notice %}} diff --git a/hugo/content/manual/knowledgebase/hardware/_index.md b/hugo/content/manual/knowledgebase/hardware/_index.md index 137a40911..857b33364 100644 --- a/hugo/content/manual/knowledgebase/hardware/_index.md +++ b/hugo/content/manual/knowledgebase/hardware/_index.md @@ -1,6 +1,6 @@ +++ title = "hardware" -weight = 15 +weight = 22 chapter = false +++ diff --git a/hugo/content/manual/knowledgebase/hardware/host.md b/hugo/content/manual/knowledgebase/host.md similarity index 99% rename from hugo/content/manual/knowledgebase/hardware/host.md rename to hugo/content/manual/knowledgebase/host.md index 1be519054..4fd9d9e60 100644 --- a/hugo/content/manual/knowledgebase/hardware/host.md +++ b/hugo/content/manual/knowledgebase/host.md @@ -1,5 +1,5 @@ +++ -title = "ecmc server" +title = "host / ecmc server" weight = 17 chapter = false +++ @@ -8,8 +8,6 @@ chapter = false 1. [latency issues](#latency-issues) 2. [EtherCAT rate (EC_RATE)](#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: diff --git a/hugo/content/manual/knowledgebase/panel.md b/hugo/content/manual/knowledgebase/panel.md index 60d72dce4..86cf60c2d 100644 --- a/hugo/content/manual/knowledgebase/panel.md +++ b/hugo/content/manual/knowledgebase/panel.md @@ -22,7 +22,7 @@ The ecmcMain.ui covers most parts of an ecmc system: - plugin objects - data storage objects -The ecmcMain.ui is started with the following syntax: +The panel is started with the following syntax: ``` caqtdm -macro "IOC=" ecmcMain.ui ``` From ef5e00a07b0f0764f76e82881762cb39ecead34a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sun, 29 Sep 2024 19:10:08 +0200 Subject: [PATCH 122/128] Add more info to manual --- .../manual/knowledgebase/hardware/EL1xxx.md | 2 +- .../manual/knowledgebase/hardware/EL70x1.md | 18 +++++++++++- .../manual/knowledgebase/hardware/ELxxxx.md | 6 ++-- hugo/content/manual/knowledgebase/host.md | 4 +-- hugo/content/manual/knowledgebase/motion.md | 29 +++++++++---------- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL1xxx.md b/hugo/content/manual/knowledgebase/hardware/EL1xxx.md index f66fe495a..65d803b6c 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL1xxx.md +++ b/hugo/content/manual/knowledgebase/hardware/EL1xxx.md @@ -19,7 +19,7 @@ These terminals are very powerful since they can latch the time of the positive **IMPORTANT** Sine the EL1252-0050 is a 5V terminal, it needs to be powered with **5V** if the terminal is powered with 24V, the terminal will burn. The simplest way to achieve a correct power supply is by adding an EL9505 (or similar) before the EL1252-0050. -See above for more information [5v-and-24v-terminals](../elxxxx#5v-and-24v-terminals) +See above for more information [5v-and-24v-terminals](../elxxxx#power-bus-5v-and-24v-terminals) {{% notice warning %}} **Make sure the EL1252-0050 has a 5V power supply by an EL9505 (or similar), before powering the system. If the terminal is powered with the normal 24V it will most likely break** diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index e4a0b873b..1d42c13bc 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -6,7 +6,8 @@ chapter = false ## Topics 1. [error/warning](#error/warning) -2. [Tuning](#tuning) +2. [tuning](#tuning) +3. [Speed range](#speed-range) ### error/warning If the El70x1 is in error or warning state, further information about the reason for the error/warning can be read from the drives diagnostic register by using the ethercat command. See [command line interface](ethercatcli). @@ -115,3 +116,18 @@ This is the current loop settings and this is also what affect the performance. 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. + +### speed range +The EL704x stepper drives are default setup to a maximum velocity range of +-2000 full-steps/s. The 16bit velocity setpoint that are sent to the drive corresponds to this range. The speed range for the EL704x can however be changed by setting SDO 8012:05: +``` +0 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 +``` + +{{% notice info %}} +The drive scaling in the axis yaml configuration must be updated if the speed range is changed. See [scaling](../../../motion_cfg/scaling/). +{{% /notice %}} diff --git a/hugo/content/manual/knowledgebase/hardware/ELxxxx.md b/hugo/content/manual/knowledgebase/hardware/ELxxxx.md index 87e898062..22db16183 100644 --- a/hugo/content/manual/knowledgebase/hardware/ELxxxx.md +++ b/hugo/content/manual/knowledgebase/hardware/ELxxxx.md @@ -4,10 +4,10 @@ weight = 16 chapter = false +++ -# 5V and 24V terminals -24V is the most common signal level for the terminals, however, a few terminals also support other voltage levels, for instance 5V. +# Power bus - 5V or 24V terminals +24V is the most common signal level for the terminals, however, some also support other voltage levels, for instance 5V, or 12V or.... In that case, normally the terminal needs to be powered with the same voltage. -For 5V terminals, normally this is handled by adding a EL9505 before the 5v terminal in the ethercat chain. The EL9505 will supply the power bus with 5V instead of the normal 24V . +For 5V terminals, normally a EL9505 is added before the 5v terminal in the ethercat chain supplying the power bus with 5V. Example of slaves needing 5V power supply: * EL1124 diff --git a/hugo/content/manual/knowledgebase/host.md b/hugo/content/manual/knowledgebase/host.md index 4fd9d9e60..86cbc012e 100644 --- a/hugo/content/manual/knowledgebase/host.md +++ b/hugo/content/manual/knowledgebase/host.md @@ -5,10 +5,10 @@ chapter = false +++ ## Topics -1. [latency issues](#latency-issues) +1. [latency issues / lost frames](#latency-issues--lost-frames) 2. [EtherCAT rate (EC_RATE)](#EtherCAT-rate-(EC_RATE)) -### latency issues +### latency issues / lost frames 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 diff --git a/hugo/content/manual/knowledgebase/motion.md b/hugo/content/manual/knowledgebase/motion.md index d744bc0a7..c83dcf1f6 100644 --- a/hugo/content/manual/knowledgebase/motion.md +++ b/hugo/content/manual/knowledgebase/motion.md @@ -6,8 +6,7 @@ chapter = false ## Topics 1. [both_limits error](#both_limits-error) -2. [position lag error, (following error), tuning](#position-lag-error) -3. [latency issues](#latency-issues) +2. [position lag error, (following error)](#position-lag-error) 4. [drive refuse to enable](#drive-refuse-to-enable) 5. [force manual motion](#force-manual-motion) @@ -48,8 +47,8 @@ Before increase current to the motor, make sure that both motor and drive can ha {{% /notice %}} ### 2. scaling factors are wrong -Check the scaling documentation [here](https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/scaling/). -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. +Check the scaling documentation [here](../../motion_cfg/scaling/). +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 the same slope. If the slope differs, then the scaling factors are wrong. ### 3. the velocity setpoint is too high resulting in stall If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higher velocities: @@ -62,24 +61,22 @@ Before increase current to the motor, make sure that both motor and drive can ha {{% /notice %}} ### 4. velocity higher than allowed by driver -For EL704x stepper drives are default setup to maximum velocity range of +-2000 full-steps/s. The 16bit velocity setpoint that are sent to the drive corresponds to this range. Basically trying to write a higher value than that will saturate the velocity setpoint resulting in that the required speed is not achieved, resulting in position lag error. The speed range for the EL704x can however be changed by setting SDO 8012:05: -``` -0 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. +The velocity setpoint of drives covers a certain velocity range: +* EL70xx stepper drives default: 16bit setpoint that corresponds to a velocity range of +-2000full-steps/s. +* EL72xx servo drives default: 32bit setpoint that corresponds to a velocity range of either +-6000Hz or +-8000Hz depending on the motor pole count. + +If a velocity outside the velocity range is requested, the velocity setpoint will be saturated and the requested velocity will not be reached resulting in a position lag error. + +For EL70xx drives the velocity range can be configured to other values than the default +-2000full-steps/s. See +[el70x1 speed range](../hardware/el70x1#speed-range) for setting other velocity range. ## drive 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](hardware). +First check the dedicated hardware drive panel for diagnostics. If the drive is in warning or error state then, if an EL70x1 drive, diagnose the problem further with the tool described in [hardware](../hardware/el70x1). Possible reasons: 1. For systems with safety, tripp off STO or power to the drive removed by contactor. Check status of safety system. 2. Over current protection of 48V tripped. -3. No 48V connected. +3. No motor power connected (48V or24V). 4. ecmc PLC disabling axis, check PLC sources. 5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state 6. Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). From 7bfc84930be110a7ba39c8459fa17f6b3901de6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sun, 29 Sep 2024 20:12:47 +0200 Subject: [PATCH 123/128] Add more info to manual --- .../manual/knowledgebase/hardware/EL51xx.md | 2 +- .../manual/knowledgebase/hardware/EL70x1.md | 21 +++++++------------ hugo/content/manual/knowledgebase/motion.md | 16 ++++++++------ 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL51xx.md b/hugo/content/manual/knowledgebase/hardware/EL51xx.md index 3e6bdfb23..42e59fd85 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL51xx.md +++ b/hugo/content/manual/knowledgebase/hardware/EL51xx.md @@ -9,7 +9,7 @@ The EL51xx series covers incremental encoder interfaces: 1. EL5101: 1 ch, diff rs422, ttl, 1MHz 2. EL5101-0010: 1 ch, diff rs422, 5MHz 3. EL5101-0011: 1 ch, diff rs422, 5MHz, oversampling 100kHz -4. EL5112: 2 ch ABC or 1ch AB, rs422, 5MHz, **PSI standard** +4. EL5112: 2 ch ABC or 1 ch AB, rs422, 5MHz, **PSI standard** 5. EL5131: 1 ch, diff rs422, 5MHz, 2 digital outputs for cam/trigger ### General diff --git a/hugo/content/manual/knowledgebase/hardware/EL70x1.md b/hugo/content/manual/knowledgebase/hardware/EL70x1.md index 1d42c13bc..0bb387644 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL70x1.md +++ b/hugo/content/manual/knowledgebase/hardware/EL70x1.md @@ -10,15 +10,11 @@ chapter = false 3. [Speed range](#speed-range) ### error/warning -If the El70x1 is in error or warning state, further information about the reason for the error/warning can be read from the drives diagnostic register by using the ethercat command. See [command line interface](ethercatcli). +If the drive is in error/warning state and not possible to enable, see [drive refuse to enable](../../motion/#drive-refuse-to-enable). -{{% notice info %}} -In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. -{{% /notice %}} - -The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the following syntax: +Further information about the error/warning can be read from from the drive's diagnostic register, [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959): -The ecmccfg/utils/read_el70xx_diag.sh tool can be used to read all the diagnostic registers: +The ecmccfg/utils/read_el70xx_diag.sh tool can be used to read all the diagnostic registers of any ex70xx drive: ```bash bash read_el70xx_diag.sh ``` @@ -50,9 +46,8 @@ Misc error: 0x00 0 ######################################################### - ``` -Note: The tool ecmccfg/utils/PDO_read can also be used for reading the diagnostics. +Note: The tool```ecmccfg/utils/PDO_read``` can also be used for reading the diagnostics. #### under voltage @@ -89,13 +84,11 @@ For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles t ### Tuning There are normally several control loops in an ecmc system: -* Position loop (centralized in ecmc if CSV) +* Position loop (centralized in ecmc if CSV), see [tuning](../../tuning) * Velocity loop (in drive) * Current loop (in drive) -However, for the EL70x1 drives there's no dedicated velocity loop (however some current boost settings that can be applied in acc/dec, see below) - -For more information on tuning the position loop see [tuning](../../tuning) +However, for the EL70x1 drives there's no dedicated velocity loop. #### Current loop For most use cases, the default current controller parameters are already well tuned. Sometimes when operating at higher speeds the current loop needs to be tuned. @@ -129,5 +122,5 @@ The EL704x stepper drives are default setup to a maximum velocity range of +-20 ``` {{% notice info %}} -The drive scaling in the axis yaml configuration must be updated if the speed range is changed. See [scaling](../../../motion_cfg/scaling/). +When changing the speed range of the drive, also the drive scaling in the axis yaml configuration must be updated, see [scaling](../../../motion_cfg/scaling/). {{% /notice %}} diff --git a/hugo/content/manual/knowledgebase/motion.md b/hugo/content/manual/knowledgebase/motion.md index c83dcf1f6..63d97a394 100644 --- a/hugo/content/manual/knowledgebase/motion.md +++ b/hugo/content/manual/knowledgebase/motion.md @@ -71,16 +71,20 @@ For EL70xx drives the velocity range can be configured to other values than the [el70x1 speed range](../hardware/el70x1#speed-range) for setting other velocity range. ## drive refuse to enable -First check the dedicated hardware drive panel for diagnostics. If the drive is in warning or error state then, if an EL70x1 drive, diagnose the problem further with the tool described in [hardware](../hardware/el70x1). +First check the dedicated hardware drive panel for diagnostics and errors/warnings. +For EL70x1 drive diagnostics, check [el70x1](../hardware/el70x1). Possible reasons: -1. For systems with safety, tripp off STO or power to the drive removed by contactor. Check status of safety system. -2. Over current protection of 48V tripped. +1. For systems equipped with motion safety (STO or power to the drive removed by contactor): Check status of safety system. Drives with STO: + * EL72xx-9xxx + * EP7211-0034 + * Festo CMMT-S +2. Over current protection of motor power (48V) tripped. 3. No motor power connected (48V or24V). 4. ecmc PLC disabling axis, check PLC sources. -5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state -6. Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). -7. Axis object configured with external interlock (yaml->input.interlock). +5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state. +6. Drive hardware enable input not set high (valid for EL70xx if special cfgs). +7. Axis object configured with external interlock (yaml->input.interlock). ## force manual motion {{% notice warning %}} From ed7caae6cc0670b6dc213e7fa86d47a13139aa58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sun, 29 Sep 2024 20:42:15 +0200 Subject: [PATCH 124/128] Update wheight of el9xxx.md --- hugo/content/manual/knowledgebase/hardware/EL9xxx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md index a5d037408..31476a1ab 100644 --- a/hugo/content/manual/knowledgebase/hardware/EL9xxx.md +++ b/hugo/content/manual/knowledgebase/hardware/EL9xxx.md @@ -1,6 +1,6 @@ +++ title = "EL9xxx" -weight = 20 +weight = 24 chapter = false +++ From 24b2105c17989682b8610176eb59d82796f3b32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstro=CC=88m?= Date: Sun, 29 Sep 2024 22:00:58 +0200 Subject: [PATCH 125/128] cleanup --- hugo/content/manual/PLC_cfg/syntax.md | 1484 ++++++++--------- hugo/content/manual/build.md | 2 +- .../manual/general_cfg/best_practice.md | 2 +- .../content/manual/general_cfg/iocsh_utils.md | 93 +- hugo/content/manual/knowledgebase/host.md | 10 +- 5 files changed, 796 insertions(+), 795 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/syntax.md b/hugo/content/manual/PLC_cfg/syntax.md index 19977bc5d..6ce81b439 100644 --- a/hugo/content/manual/PLC_cfg/syntax.md +++ b/hugo/content/manual/PLC_cfg/syntax.md @@ -61,372 +61,370 @@ Custom plc functions can be written in c in plugins. ### general -```shell -# -# 1. Assignment: -# ec0.s1.VALUE:=100; -# -# 2. if-else (note the equal sign): -# if(ec0.s1.VALUE=100) { -# # code -# } -# else { -# # code -# }; -# -# 3. for loop: -# for (static.i := 0; static.i < static.elements; static.i += 1) { -# # code -# }; -# -# 4. printouts (minimize printouts or use only for debug): -# print("The value of ec0.s1.VALUE is: ",ec0.s1.VALUE); # Without line feed -# println("The value of ec0.s1.VALUE is: ",ec0.s1.VALUE); # With line feed -# -# Also see the "ec_print_bin()" and "ec_print_hex()" below. +```text + 1. Assignment: + ec0.s1.VALUE:=100; + + 2. if-else (note the equal sign): + if(ec0.s1.VALUE=100) { + # code + } + else { + # code + }; + + 3. for loop: + for (static.i := 0; static.i < static.elements; static.i += 1) { + # code + }; + + 4. printouts (minimize printouts or use only for debug): + print("The value of ec0.s1.VALUE is: ",ec0.s1.VALUE); # Without line feed + println("The value of ec0.s1.VALUE is: ",ec0.s1.VALUE); # With line feed + + Also see the "ec_print_bin()" and "ec_print_hex()" below. ``` ### variables #### generic -```shell -# 1. static. Static variable. Initiated to 0. (rw) -# Access only in the PLC where defined. -# Will keep value between execution -# loops. -# 2. global. Global variable. Initiated to 0. (rw) -# Access from all PLCs. -# Will keep value between execution -# loops. -# 3. var Local variable (exprtk syntax) (rw) -# Will NOT keep value between -# execution loops. +```text + 1. static. Static variable. Initiated to 0. (rw) + Access only in the PLC where defined. + Will keep value between execution + loops. + 2. global. Global variable. Initiated to 0. (rw) + Access from all PLCs. + Will keep value between execution + loops. + 3. var Local variable (exprtk syntax) (rw) + Will NOT keep value between + execution loops. ``` #### EtherCAT -```shell -# 1. ec.s. ethetcat data (rw) -# ecid: ethercat master index -# sid: ethercat slave bus position -# alias: entry name as defined in -# "Cfg.EcAddEntryComplete() -# 2. ec.masterstatus Status of master (1=OK) +```text + 1. ec.s. ethetcat data (rw) + ecid: ethercat master index + sid: ethercat slave bus position + alias: entry name as defined in + "Cfg.EcAddEntryComplete() + 2. ec.masterstatus Status of master (1=OK) ``` #### motion -```shell -# 1. ax.id axis id (ro) -# 2. ax.reset reset axis error (rw) -# 3. ax.counter execution counter (ro) -# 4. ax.error error (ro) -# 5. ax.allowplccmd Allow writes to axis from PLC (rw) -# 6. ax.enc.actpos actual position (rw) -# 7. ax.enc.extactpos actual position from plc sync. -# expression (ro) -# 8. ax.enc.actvel actual velocity (ro) -# 9. ax.enc.rawpos actual raw position (ro) -# 10. ax.enc.source internal source or expressions (rw) -# source = 0: internal encoder -# source > 0: actual pos from expr -# 11. ax.enc.homed encoder homed (rw) -# 12. ax.enc.homepos homing position (rw) -# 13. ax.traj.setpos curent trajectory setpoint (rw) -# 14. ax.traj.targetpos target position (rw) -# 15. ax.traj.extsetpos current trajecrory setpoint from -# plc sync. expression (rw) -# 16. ax.traj.targetvel target velocity setpoint (rw) -# 17. ax.traj.targetacc target acceleration setpoint (rw) -# 18. ax.traj.targetdec target deceleration setpoint (rw) -# 19. ax.traj.setvel current velocity setpoint (ro) -# 20. ax.traj.setvelffraw feed forward raw velocity (ro) -# 21. ax.traj.command command (rw) -# command=1: move velocity -# command=2: move rel. pos -# command=3: move abs. pos -# command=10: homing -# 22. ax.traj.cmddata cmddat. Homing procedure -# only valid if ax.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.traj.source internal source or expressions (rw) -# source = 0: internal traj -# source > 0: setpoints from expr -# 24. ax.traj.execute execute motion command (rw) -# 25. ax.traj.busy axis busy (ro) -# 26. ax.traj.dir axis setpoint direction (ro) -# ax.traj.dir>0: forward -# ax.traj.dir<0: backward -# ax.traj.dir=0: standstill -# 27. ax.cntrl.error actual controller error (ro) -# 28. ax.cntrl.poserror actual position error (ro) -# 29. ax.cntrl.output actual controller output (ro) -# 30. ax.drv.setvelraw actual raw velocity setpoint (ro) -# 31. ax.drv.enable enable drive command (rw) -# 32. ax.drv.enabled drive enabled (ro) -# 33. ax.seq.state sequence state (homing) (ro) -# 34. ax.mon.ilock motion interlock (both dir) (rw) -# ax.mon.ilock=1: motion allowed -# ax.mon.ilock=0: motion not allowed -# 35. ax.mon.ilockbwd motion interlock bwd dir (rw) -# ax.mon.ilockbwd=1: motion allowed -# ax.mon.ilockbwd=0: motion not allowed -# 36. ax.mon.ilockfwd motion interlock fwd dir (rw) -# ax.mon.ilockfwd=1: motion allowed -# ax.mon.ilockfwd=0: motion not allowed -# 37. ax.mon.attarget axis at taget (ro) -# 38. ax.mon.lowlim low limit switch (ro) -# 39. ax.mon.highlim high limit switch (ro) -# 40. ax.mon.homesensor home sensor (ro) -# 41. ax.mon.lowsoftlim low soft limit (rw) -# 42. ax.mon.highsoftlim high soft limit (rw) -# 43. ax.mon.lowsoftlimenable low soft limit enable (rw) -# 44. ax.mon.highsoftlimenable high soft limit enable (rw) -# 45. ax.blockcom Enables/disables "set" commands (rw) -# via command parser (ascii commands) -# Statuses can still be read. -# Exceptions ("set"-commands) that -# will work: -# - "StopMotion(axid)" -# - "Cfg.SetAxisBlockCom(axid,block)" -# 46. ax.ctrl.kp Set PID-controller kp (rw) -# 47. ax.ctrl.ki Set PID-controller ki (rw) -# 48. ax.ctrl.kd Set PID-controller kd (rw) -# 49. ax.ctrl.kff Set PID-controller kff (rw) +```text + 1. ax.id axis id (ro) + 2. ax.reset reset axis error (rw) + 3. ax.counter execution counter (ro) + 4. ax.error error (ro) + 5. ax.allowplccmd Allow writes to axis from PLC (rw) + 6. ax.enc.actpos actual position (rw) + 7. ax.enc.extactpos actual position from plc sync. + expression (ro) + 8. ax.enc.actvel actual velocity (ro) + 9. ax.enc.rawpos actual raw position (ro) + 10. ax.enc.source internal source or expressions (rw) + source = 0: internal encoder + source > 0: actual pos from expr + 11. ax.enc.homed encoder homed (rw) + 12. ax.enc.homepos homing position (rw) + 13. ax.traj.setpos curent trajectory setpoint (rw) + 14. ax.traj.targetpos target position (rw) + 15. ax.traj.extsetpos current trajecrory setpoint from + plc sync. expression (rw) + 16. ax.traj.targetvel target velocity setpoint (rw) + 17. ax.traj.targetacc target acceleration setpoint (rw) + 18. ax.traj.targetdec target deceleration setpoint (rw) + 19. ax.traj.setvel current velocity setpoint (ro) + 20. ax.traj.setvelffraw feed forward raw velocity (ro) + 21. ax.traj.command command (rw) + command=1: move velocity + command=2: move rel. pos + command=3: move abs. pos + command=10: homing + 22. ax.traj.cmddata cmddat. Homing procedure + only valid if ax.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.traj.source internal source or expressions (rw) + source = 0: internal traj + source > 0: setpoints from expr + 24. ax.traj.execute execute motion command (rw) + 25. ax.traj.busy axis busy (ro) + 26. ax.traj.dir axis setpoint direction (ro) + ax.traj.dir>0: forward + ax.traj.dir<0: backward + ax.traj.dir=0: standstill + 27. ax.cntrl.error actual controller error (ro) + 28. ax.cntrl.poserror actual position error (ro) + 29. ax.cntrl.output actual controller output (ro) + 30. ax.drv.setvelraw actual raw velocity setpoint (ro) + 31. ax.drv.enable enable drive command (rw) + 32. ax.drv.enabled drive enabled (ro) + 33. ax.seq.state sequence state (homing) (ro) + 34. ax.mon.ilock motion interlock (both dir) (rw) + ax.mon.ilock=1: motion allowed + ax.mon.ilock=0: motion not allowed + 35. ax.mon.ilockbwd motion interlock bwd dir (rw) + ax.mon.ilockbwd=1: motion allowed + ax.mon.ilockbwd=0: motion not allowed + 36. ax.mon.ilockfwd motion interlock fwd dir (rw) + ax.mon.ilockfwd=1: motion allowed + ax.mon.ilockfwd=0: motion not allowed + 37. ax.mon.attarget axis at taget (ro) + 38. ax.mon.lowlim low limit switch (ro) + 39. ax.mon.highlim high limit switch (ro) + 40. ax.mon.homesensor home sensor (ro) + 41. ax.mon.lowsoftlim low soft limit (rw) + 42. ax.mon.highsoftlim high soft limit (rw) + 43. ax.mon.lowsoftlimenable low soft limit enable (rw) + 44. ax.mon.highsoftlimenable high soft limit enable (rw) + 45. ax.blockcom Enables/disables "set" commands (rw) + via command parser (ascii commands) + Statuses can still be read. + Exceptions ("set"-commands) that + will work: + - "StopMotion(axid)" + - "Cfg.SetAxisBlockCom(axid,block)" + 46. ax.ctrl.kp Set PID-controller kp (rw) + 47. ax.ctrl.ki Set PID-controller ki (rw) + 48. ax.ctrl.kd Set PID-controller kd (rw) + 49. ax.ctrl.kff Set PID-controller kff (rw) ``` #### PLC -```shell -# 1. plc.enable plc enable (rw) -# (end exe with "plc.enable:=0#" -# Could be use full for startup -# sequences) -# 2. plc.error plc error (rw) -# Will be forwarded to user as -# controller error. -# 3. plc.scantime plc sample time in seconds (ro) -# 4. plc.firstscan true during first plc scan only (ro) -# use full for initiations of variables -# 5. ax.plc.enable Same as plc.enable but for -# axis sync plc. -# 6. ax.plc.error Same as plc.error but for -# axis sync plc. -# 7. ax.plc.scantime Same as plc.scantime but for -# axis sync plc. -# 8. ax.plc.firstscan Same as plc.firstscan but for -# axis sync plc. +```text + 1. plc.enable plc enable (rw) + (end exe with "plc.enable:=0#" + Could be use full for startup + sequences) + 2. plc.error plc error (rw) + Will be forwarded to user as + controller error. + 3. plc.scantime plc sample time in seconds (ro) + 4. plc.firstscan true during first plc scan only (ro) + use full for initiations of variables + 5. ax.plc.enable Same as plc.enable but for + axis sync plc. + 6. ax.plc.error Same as plc.error but for + axis sync plc. + 7. ax.plc.scantime Same as plc.scantime but for + axis sync plc. + 8. ax.plc.firstscan Same as plc.firstscan but for + axis sync plc. ``` ### data storage -```shell -# 1. ds.size Set/get size of data storage (rw) -# Set will clear the data storage -# 2. ds.append Add new data at end (rw) -# Current position index will be -# increased -# 3. ds.data Set/get data ar current position (rw) -# 4. ds.index Set/get current position index (rw) -# 5. ds.error Data storage class error (ro) -# 6. ds.clear Data buffer clear (set to zero) (ro) -# 7. ds.full True if data storage is full (ro) +```text + 1. ds.size Set/get size of data storage (rw) + Set will clear the data storage + 2. ds.append Add new data at end (rw) + Current position index will be + increased + 3. ds.data Set/get data ar current position (rw) + 4. ds.index Set/get current position index (rw) + 5. ds.error Data storage class error (ro) + 6. ds.clear Data buffer clear (set to zero) (ro) + 7. ds.full True if data storage is full (ro) ``` ### functions #### EtherCAT -```shell -# -# 1. retvalue = ec_set_bit( -# , : Value to change -# : Bit index -# ); -# Sets bit at bitindex position of value. Returns the new value. -# -# 2. retvalue = ec_wrt_bit( -# , : Value to change -# , : Value of bit to write -# : Bit index -# ); -# Write wrtValue to a bit at bitindex position of value. Returns the new value. -# -# 3. retvalue = ec_wrt_bits( -# , : Value to change -# , : Value of bit to write -# : Start bit index (lsb is bit 0) -# : Stop bit index -# ); -# Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. -# -# 4. retvalue = ec_clr_bit( -# , : Value to change -# : Bit index -# ); -# Clears bit at bitindex position of value. Returns the new value. -# -# 5. retvalue = ec_flp_bit( -# , : Value to change -# : Bit index -# ); -# Flips bit at bitindex position of value. Returns the new value. -# -# 6. retvalue = ec_chk_bit( -# , : Value to change -# : Bit index -# ); -# Checks bit at bitindex position of value. Returns the value of bit. -# -# 7. retvalue = ec_chk_bits( -# , : Value to change -# : Start bit index (lsb is bit 0) -# : Stop bit index -# ); -# Checks range of bits (startBit..stopBit) of value. Returns the value of bits. -# -# 8. retvalue = ec_print_hex( -# , : Value to print -# : Start bit index -# : Stop bit index -# ); -# Prints to of in hex format -# Returns error code or 0 if success. -# -# 9. retvalue = ec_print_bin( -# , : Value to print -# : Start bit index -# : Stop bit index -# ); -# Prints to of in bin format -# Returns error code or 0 if success. -# -# 10. retvalue = ec_mm_cp( -# , : Source memmap index -# : 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 -# amount of data copied. Returns 0 for success or an error code. -# -# Note: The mmId can be retrieved by the bellow ecmc command (and feed into plc via macro): -# ecmcConfig "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# -# 11. retvalue = ec_get_mm_type( -# , : Source memmap index -# ); -# Returns data type of memmap: -# 0 = Not defined (Use "Cfg.EcAddMemMapDT()" instead of "Cfg.EcAddMemMap()") -# 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# -# 12. retvalue = ec_get_mm_data( -# , : Source memmap index -# : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# 13. retvalue = ec_set_mm_data( -# , : Source memmap index -# : Index of data element -# : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# 14. retvalue = ec_get_mm_size( -# , : Source memmap index -# ); -# Returns number of elements (of type "ec_get_mm_type()")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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# 14. retvalue = ec_mm_ds_append( -# , : Source memmap index -# ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# 15. retvalue = ec_mm_append_to_ds_scale_offset( -# , : Source memmap index -# : Destination data storage index -# : Scale -# ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) -# -# 16. retvalue = ec_mm_push_asyn( -# ) : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" -# 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. +```text + 1. retvalue = ec_set_bit( + , : Value to change + : Bit index + ); + Sets bit at bitindex position of value. Returns the new value. + + 2. retvalue = ec_wrt_bit( + , : Value to change + , : Value of bit to write + : Bit index + ); + Write wrtValue to a bit at bitindex position of value. Returns the new value. + + 3. retvalue = ec_wrt_bits( + , : Value to change + , : Value of bit to write + : Start bit index (lsb is bit 0) + : Stop bit index + ); + Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. + + 4. retvalue = ec_clr_bit( + , : Value to change + : Bit index + ); + Clears bit at bitindex position of value. Returns the new value. + + 5. retvalue = ec_flp_bit( + , : Value to change + : Bit index + ); + Flips bit at bitindex position of value. Returns the new value. + + 6. retvalue = ec_chk_bit( + , : Value to change + : Bit index + ); + Checks bit at bitindex position of value. Returns the value of bit. + + 7. retvalue = ec_chk_bits( + , : Value to change + : Start bit index (lsb is bit 0) + : Stop bit index + ); + Checks range of bits (startBit..stopBit) of value. Returns the value of bits. + + 8. retvalue = ec_print_hex( + , : Value to print + : Start bit index + : Stop bit index + ); + Prints to of in hex format + Returns error code or 0 if success. + + 9. retvalue = ec_print_bin( + , : Value to print + : Start bit index + : Stop bit index + ); + Prints to of in bin format + Returns error code or 0 if success. + + 10. retvalue = ec_mm_cp( + , : Source memmap index + : 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 + amount of data copied. Returns 0 for success or an error code. + + Note: The mmId can be retrieved by the bellow ecmc command (and feed into plc via macro): + ecmcConfig "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + + 11. retvalue = ec_get_mm_type( + , : Source memmap index + ); + Returns data type of memmap: + 0 = Not defined (Use "Cfg.EcAddMemMapDT()" instead of "Cfg.EcAddMemMap()") + 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + + 12. retvalue = ec_get_mm_data( + , : Source memmap index + : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + 13. retvalue = ec_set_mm_data( + , : Source memmap index + : Index of data element + : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + 14. retvalue = ec_get_mm_size( + , : Source memmap index + ); + Returns number of elements (of type "ec_get_mm_type()")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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + 14. retvalue = ec_mm_ds_append( + , : Source memmap index + ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + 15. retvalue = ec_mm_append_to_ds_scale_offset( + , : Source memmap index + : Destination data storage index + : Scale + ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) + + 16. retvalue = ec_mm_push_asyn( + ) : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" + 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) @@ -434,412 +432,412 @@ Custom plc functions can be written in c in plugins. 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. -```shell -# 1. retvalue = m2m_write( -# , : Mem buffer index (index must be 0..119) -# ): : 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(); : 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(); -# -# returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). -# -# 7. retvalue = m2m_ioc_run(); -# -# checks of a certian master is running (negative master id is ioc:s without ec master). +```text + 1. retvalue = m2m_write( + , : Mem buffer index (index must be 0..119) + ): : 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(); : 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(); + + returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). + + 7. retvalue = m2m_ioc_run(); + + checks of a certian master is running (negative master id is ioc:s without ec master). ``` #### Motion -```shell -# 1. retvalue = mc_move_abs( -# , : Axis index -# , : Trigger -# , : Target position -# , : Target velocity -# , : Acceleration -# : Deceleration -# ): -# Absolute motion of axis. -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 2. retvalue = mc_move_rel( -# , : Axis index -# , : Trigger -# , : Target position -# , : Target velocity -# , : Acceleration -# : Deceleration -# ); -# Relative motion of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 3. retvalue = mc_move_ext_pos( -# , : Axis index -# , : Trigger -# , : Target velocity -# , : Acceleration -# : 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 "mc_move_pos()" with the target postion ax.traj.extsetpos. -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# -# 4. retvalue = mc_move_vel( -# , : Axis index -# , : Trigger -# , : Target velocity -# , : Acceleration -# : Deceleration -# ); -# Constant velocity motion of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 5. retvalue = mc_home( -# , : Axis index -# , : Trigger -# , : Motion sequence -# , : Target Velocity twords cam -# : Target velocity off cam -# ); -# Perform a homing sequence of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 6. retvalue = mc_home_pos( -# , : Axis index -# , : Trigger -# , : Motion sequence -# , : Target Velocity twords cam -# : Target velocity off cam -# : Homing position -# ); -# Perform a homing sequence of axis -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 7. retvalue = mc_halt( -# , : Axis index -# , : Trigger -# ); -# Stop motion of axis . -# Command is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 8. retvalue = mc_power( -# , : Axis index -# , : Enable power -# ); -# Enable power of axis . -# Motion is triggerd with a positive edge on input. -# returns 0 if success or error code. -# -# 9. retvalue = mc_get_busy( -# , : 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( -# , : 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(); -# Resets error of motion axis. -# -# 13. retvalue = mc_get_axis_err(); -# Returns motion axis error code. -# -# 14. retvalue = mc_set_enable_motion_funcs( -# , : Axis index -# , : Enable positioning -# , : Enable const velo -# , : Enable const homing -# ); -# -# Enables/disables motion functionalities. Returns error code. -# -# 15. retvalue = mc_get_act_pos( -# , : Axis index -# : Encoder index -# ); -# -# Returns encoder position for any of the configured encoders of an axis. -# -# 16. retvalue = mc_set_prim_enc( -# , : Axis index -# : 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( -# , : Axis index -# ); -# -# Returns primary encoder index of the axis (the encoder used for control). -# -# 18. mc_set_axis_error( -# , : Axis index -# : Error code to set -# ); -# -# Sets an arbitrary error code to an axis object. -# -# 19. mc_set_slaved_axis_in_error( -# , : Axis index -# ); -# -# Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). +```text + 1. retvalue = mc_move_abs( + , : Axis index + , : Trigger + , : Target position + , : Target velocity + , : Acceleration + : Deceleration + ): + Absolute motion of axis. + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + 2. retvalue = mc_move_rel( + , : Axis index + , : Trigger + , : Target position + , : Target velocity + , : Acceleration + : Deceleration + ); + Relative motion of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + 3. retvalue = mc_move_ext_pos( + , : Axis index + , : Trigger + , : Target velocity + , : Acceleration + : 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 "mc_move_pos()" with the target postion ax.traj.extsetpos. + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + + 4. retvalue = mc_move_vel( + , : Axis index + , : Trigger + , : Target velocity + , : Acceleration + : Deceleration + ); + Constant velocity motion of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + 5. retvalue = mc_home( + , : Axis index + , : Trigger + , : Motion sequence + , : Target Velocity twords cam + : Target velocity off cam + ); + Perform a homing sequence of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + 6. retvalue = mc_home_pos( + , : Axis index + , : Trigger + , : Motion sequence + , : Target Velocity twords cam + : Target velocity off cam + : Homing position + ); + Perform a homing sequence of axis + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + 7. retvalue = mc_halt( + , : Axis index + , : Trigger + ); + Stop motion of axis . + Command is triggerd with a positive edge on input. + returns 0 if success or error code. + + 8. retvalue = mc_power( + , : Axis index + , : Enable power + ); + Enable power of axis . + Motion is triggerd with a positive edge on input. + returns 0 if success or error code. + + 9. retvalue = mc_get_busy( + , : 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( + , : 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(); + Resets error of motion axis. + + 13. retvalue = mc_get_axis_err(); + Returns motion axis error code. + + 14. retvalue = mc_set_enable_motion_funcs( + , : Axis index + , : Enable positioning + , : Enable const velo + , : Enable const homing + ); + + Enables/disables motion functionalities. Returns error code. + + 15. retvalue = mc_get_act_pos( + , : Axis index + : Encoder index + ); + + Returns encoder position for any of the configured encoders of an axis. + + 16. retvalue = mc_set_prim_enc( + , : Axis index + : 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( + , : Axis index + ); + + Returns primary encoder index of the axis (the encoder used for control). + + 18. mc_set_axis_error( + , : Axis index + : Error code to set + ); + + Sets an arbitrary error code to an axis object. + + 19. mc_set_slaved_axis_in_error( + , : Axis index + ); + + Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). ``` #### Motion Group -```shell -# 1. mc_grp_get_enable( -# , : 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( -# , : Group index -# ); -# -# Returns true if atleast one axis in the group has the enable bit set, else false. -# -# 3. mc_grp_get_enabled( -# , : Group index -# ); -# -# Returns true if all axes in the group are in enabled state, else false. -# -# 4. mc_grp_get_any_enabled( -# , : Group index -# ); -# -# Returns true if atleast one axis in the group is in enabled state, else false. -# -# 5. mc_grp_get_busy( -# , : Group index -# ); -# -# Returns true if all axes in the group are in busy state, else false. -# -# 6. mc_grp_get_any_busy( -# , : Group index -# ); -# -# Returns true if atleast one axis in the group is in busy state, else false. -# -# 7. mc_grp_get_any_error_id( -# , : Group index -# ); -# -# Returns error id if atleast one axis in the group is in error state, else zero. -# -# 8. mc_grp_set_enable( -# , : Group index -# : Enable state -# ); -# -# Sets enable for all axes in group. -# Returns 0 or error id. -# -# 9. mc_grp_set_traj_src( -# , : Group index -# : 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( -# , : Group index -# : 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( -# , : Group index -# ); -# -# Resets error of all axes in group. -# -# 12. mc_grp_set_error( -# , : Group index -# : Error Id -# ); -# -# Set error id of all axes in group. -# -# 13. mc_grp_set_slaved_axis_in_error( -# , : Group index -# ); -# -# Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) -# -# 14. mc_grp_halt( -# , : Group index -# ); -# -# Halt all axes in group (only works if traj source = internal/0) -# -# 15. mc_grp_axis_in_grp( -# , : Group index -# , : Axis index -# ); -# -# Returns true if axis is in group, else false. -# -# 16. mc_grp_size( -# , : Group index -# ); -# -# Returns the number of axes in group. -# -# -# 17. mc_grp_get_traj_src_ext( -# , : Group index -# ); -# -# Returns true if all axes in the group have trajectory source set to external. -# -# 18. mc_grp_get_any_traj_src_ext( -# , : 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( -# , : Group index -# , : Allow change of source -# ); -# Allow source change for trajectory and encoder when axis is enabled. -# -# 20. mc_grp_sync_act_set( -# , : Group index -# , : 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). -# +```text + 1. mc_grp_get_enable( + , : 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( + , : Group index + ); + + Returns true if atleast one axis in the group has the enable bit set, else false. + + 3. mc_grp_get_enabled( + , : Group index + ); + + Returns true if all axes in the group are in enabled state, else false. + + 4. mc_grp_get_any_enabled( + , : Group index + ); + + Returns true if atleast one axis in the group is in enabled state, else false. + + 5. mc_grp_get_busy( + , : Group index + ); + + Returns true if all axes in the group are in busy state, else false. + + 6. mc_grp_get_any_busy( + , : Group index + ); + + Returns true if atleast one axis in the group is in busy state, else false. + + 7. mc_grp_get_any_error_id( + , : Group index + ); + + Returns error id if atleast one axis in the group is in error state, else zero. + + 8. mc_grp_set_enable( + , : Group index + : Enable state + ); + + Sets enable for all axes in group. + Returns 0 or error id. + + 9. mc_grp_set_traj_src( + , : Group index + : 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( + , : Group index + : 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( + , : Group index + ); + + Resets error of all axes in group. + + 12. mc_grp_set_error( + , : Group index + : Error Id + ); + + Set error id of all axes in group. + + 13. mc_grp_set_slaved_axis_in_error( + , : Group index + ); + + Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) + + 14. mc_grp_halt( + , : Group index + ); + + Halt all axes in group (only works if traj source = internal/0) + + 15. mc_grp_axis_in_grp( + , : Group index + , : Axis index + ); + + Returns true if axis is in group, else false. + + 16. mc_grp_size( + , : Group index + ); + + Returns the number of axes in group. + + + 17. mc_grp_get_traj_src_ext( + , : Group index + ); + + Returns true if all axes in the group have trajectory source set to external. + + 18. mc_grp_get_any_traj_src_ext( + , : 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( + , : Group index + , : Allow change of source + ); + Allow source change for trajectory and encoder when axis is enabled. + + 20. mc_grp_sync_act_set( + , : Group index + , : 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 -```shell -# 1. retvalue = ds_append_data( -# , : Data storage index -# , : Data -# ); -# Append data to data storage. -# returns 0 if success or error code. -# -# 2. retvalue = ds_clear_data( -# , : Data storage index -# ); -# Clear data to data storage. -# returns 0 if success or error code. -# -# 3. retvalue = ds_get_data( -# , : Data storage index -# , : Buffer index -# ); -# Returns data from buffer. -# -# 4. retvalue = ds_set_data( -# , : Data storage index -# , : Buffer index -# ); -# Sets data in data storage buffer. -# returns 0 if success or error code. -# -# 5. retvalue = ds_get_buff_id( -# , : Data storage index -# ); -# Returns current buffer index. -# -# 6. retvalue = ds_set_buff_id( -# , : Data storage index -# , : Buffer index -# ); -# Sets current buffer index in data storage buffer. -# returns 0 if success or error code. -# -# 7. retvalue = ds_is_full( -# , : Data storage index -# ); -# Returns true if buffer is full. -# -# 8. retvalue = ds_get_size( -# , : 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( -# , : Data storage index -# ); -# Triggers push of all asyn parameters in ds to EPICS (including data). -# -# 11. retvalue = ds_get_avg( -# , : Data storage index -# ); -# Returns average of the values in the data storage. -# -# 12. retvalue = ds_get_min( -# , : Data storage index -# ); -# Returns minimum of the values in the data storage. -# -# 13. retvalue = ds_get_max( -# , : Data storage index -# ); -# Returns maximum of the values in the data storage. -# -# 14. retvalue=ds_append_to_ds( -# , : Source data storage index -# , : Source data element index -# , : Number of elements to copy -# : 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. -# +```text + 1. retvalue = ds_append_data( + , : Data storage index + , : Data + ); + Append data to data storage. + returns 0 if success or error code. + + 2. retvalue = ds_clear_data( + , : Data storage index + ); + Clear data to data storage. + returns 0 if success or error code. + + 3. retvalue = ds_get_data( + , : Data storage index + , : Buffer index + ); + Returns data from buffer. + + 4. retvalue = ds_set_data( + , : Data storage index + , : Buffer index + ); + Sets data in data storage buffer. + returns 0 if success or error code. + + 5. retvalue = ds_get_buff_id( + , : Data storage index + ); + Returns current buffer index. + + 6. retvalue = ds_set_buff_id( + , : Data storage index + , : Buffer index + ); + Sets current buffer index in data storage buffer. + returns 0 if success or error code. + + 7. retvalue = ds_is_full( + , : Data storage index + ); + Returns true if buffer is full. + + 8. retvalue = ds_get_size( + , : 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( + , : Data storage index + ); + Triggers push of all asyn parameters in ds to EPICS (including data). + + 11. retvalue = ds_get_avg( + , : Data storage index + ); + Returns average of the values in the data storage. + + 12. retvalue = ds_get_min( + , : Data storage index + ); + Returns minimum of the values in the data storage. + + 13. retvalue = ds_get_max( + , : Data storage index + ); + Returns maximum of the values in the data storage. + + 14. retvalue=ds_append_to_ds( + , : Source data storage index + , : Source data element index + , : Number of elements to copy + : 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. + ``` diff --git a/hugo/content/manual/build.md b/hugo/content/manual/build.md index 473d58c28..fca00e7f0 100644 --- a/hugo/content/manual/build.md +++ b/hugo/content/manual/build.md @@ -9,7 +9,7 @@ These instructions only work at PSI! {{% /notice %}} ## Build at PSI, using driver.makefile -by default this module is only build for RHEL7 and Epics >=R7.0.5 +by default this module is only build for Debian 10 and Epics >=R7.0.6 ### build on login cluster ```bash diff --git a/hugo/content/manual/general_cfg/best_practice.md b/hugo/content/manual/general_cfg/best_practice.md index af7c9afe4..f8c15d627 100644 --- a/hugo/content/manual/general_cfg/best_practice.md +++ b/hugo/content/manual/general_cfg/best_practice.md @@ -21,7 +21,7 @@ As a comparison, TwinCAT default EtherCAT rates are: See [host/ecmc_server](../../knowledgebase/host/) for more information. ## ecmc server setup -* If possible, make sure you use the native igb ethercat driver. +* If possible, make sure the native igb ethercat driver is used. For more information see: * https://git.psi.ch/motion/ecmc_server_cfg diff --git a/hugo/content/manual/general_cfg/iocsh_utils.md b/hugo/content/manual/general_cfg/iocsh_utils.md index 8476b0d55..4e3f0a617 100644 --- a/hugo/content/manual/general_cfg/iocsh_utils.md +++ b/hugo/content/manual/general_cfg/iocsh_utils.md @@ -6,11 +6,11 @@ chapter = false ## ECMC Iocsh Utilities -### Iocsh function "ecmcEpicsEnvSetCalc()" - "ecmcEpicsEnvSetCalc()" is used to evaluate expressions and set result to EPCIS environment variables. Usefull for calculate: +### ecmcEpicsEnvSetCalc + "ecmcEpicsEnvSetCalc()" is used to evaluate expressions and set result to EPCIS environment variables. Useful for calculate: * slave offsets - * sdo/pdo adresses (also in hex) - * scalings in motion + * sdo/pdo addresses (also in hex) + * motion scaling * record fields * ... @@ -31,11 +31,11 @@ ecmcEpicsEnvSetCalc -h 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. + - Non floating point values will be rounded to nearest int. ``` #### Examples: -``` +```text #### Calculate addresses in HEX with specified width # ecmcEpicsEnvSetCalc("test2", "$(test1)+1+2+3+4+5*10.1", "%03x") ecmcEpicsEnvSetCalc("test2", "061+1+2+3+4+5*10.1", "%03x") @@ -83,7 +83,7 @@ ecmcEpicsEnvSetCalc("result", "if('ecmcEL3002.cmd'='test.script') {RESULT:=1;}el epicsEnvShow("result") result=0 ``` -### Iocsh function "ecmcEpicsEnvSetCalcTernary()" +### ecmcEpicsEnvSetCalcTernary "ecmcEpicsEnvSetCalcTernary()" is used o evaluate expressions and set EPCIS environment variables to different strings. depending on if the expression evaluates to "true" or "false". Can be useful for: * Choose different files to load like plc-files, axis configurations, db-files or.. @@ -107,7 +107,7 @@ ecmcEpicsEnvSetCalcTernary -h ``` #### Examples: -``` +```text ### Simple true false epicsEnvSet("VALUE",10) # ecmcEpicsEnvSetCalcTernary("test_var", "${VALUE}+2+5/10","True","False") @@ -134,32 +134,6 @@ epicsEnvShow("result") 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 -"ECMC_CONFIG_RETURN_VAL". This value can be used to make som dynamic configuration. -All ASCII configuration commands for ecmcConfig(OrDie) can be used in the same way. - -#### Example: Read firmware version of an EL7037 stepper drive -Note: SDO reads need to be before "SetAppMode(1)" -``` -ecmcConfig "EcReadSdo(${ECMC_SLAVE_NUM},0x100a,0x0,2)" -epicsEnvShow(ECMC_CONFIG_RETURN_VAL) -ECMC_CONFIG_RETURN_VAL=14640 - -``` -The variable "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. - -### Example: Read "ID" PDO from EK1101 (shown in detail in aliasRecordFromPdoData.script) -Note: PDO reads need to be after "SetAppMode(1)" since cyclic value -``` -ecmcConfig "ReadEcEntryIDString(${ECMC_SLAVE_NUM},"ID")" -## This is the value of the EK1101 ID switch -epicsEnvShow(ECMC_CONFIG_RETURN_VAL) -ECMC_CONFIG_RETURN_VAL=1024 -``` -The variable "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. - ### ecmcIf(\,\,\) ecmcIf() set two macros depending on the value of the evaluated expression. If it evaluates to true: 1. IF_TRUE="" Allows execution of a line of code @@ -169,20 +143,19 @@ If expression evaluates to false: 1. IF_TRUE="#-" Block execution of a line of code 2. IF_FALSE= "" Allows execution of a line of code -Note: These macros is the default names for the macros (but can be changed by assignment of the 2 last params in call to ecmcIf()): +Note: These macros are the default names for the macros (but can be changed by assignment of the 2 last params in call to ecmcIf()): 1. IF_TRUE for true 2. IF_FALSE for false -### ecmcIf -``` -ecmcEndIf(\,\) +### ecmcEndIf +```text +ecmcEndIf() ``` - The ecmcEndIf() command unsets the last used macros (for true and false), if different names are passed as arguments then then these macros are unset (for nested if statements). -#### Example of of syntax +#### Example of syntax Example 1: -``` +```text ecmcIf("") ${IF_TRUE} # Code to execute if expression eval true #- else @@ -190,7 +163,7 @@ ${IF_FALSE} # Code to execute if expression eval false ecmcEndIf() ``` Example 2: -``` +```text ecmcIf("$(VAL1)=$(VAL2)") ${IF_TRUE}epicsEnvSet(IS_EQUAL,"1") #- else @@ -204,7 +177,7 @@ Useful for: * Large systems with many similar sub systems * Configuring hardware with many PDOs (oversampling) -``` +```text "ecmcForLoop(, , , , , )" to loop execution of file with a changing loop variable. : Filename to execute in for loop. : Macros to feed to execution of file. @@ -216,7 +189,7 @@ Useful for: ``` Example ("ECMC_LOOP_IDX" as loop variable): -``` +```text ecmcForLoop(./loopStep.cmd,"",ECMC_LOOP_IDX,1,5,1) ecmcEpicsEnvSetCalc("TESTING",1*10) epicsEnvShow("TESTING") @@ -235,7 +208,7 @@ epicsEnvShow("TESTING") TESTING=50 ``` where "loopStep.cmd" file looks like this (note the use of "ECMC_LOOP_IDX"): -``` +```text #- Commands tp execute in each loop of example ecmcForLoop.script ecmcEpicsEnvSetCalc("TESTING",${ECMC_LOOP_IDX}*10) epicsEnvShow("TESTING") @@ -243,7 +216,7 @@ epicsEnvShow("TESTING") ### ecmcFileExist Useful for checking that configuration files really exist and then can be loaded. -``` +```text ecmcFileExist(, , , )" to check if a file exists. : Filename to check. : Exit EPICS if file not exist. Optional, defaults to 0. @@ -252,7 +225,7 @@ ecmcFileExist(, , , )" to check if a file result will be stored in the EPICS environment variable "ECMC_FILE_EXIST_RETURN_VAL" ``` Example: -``` +```text ecmcFileExist("file_exist.cfg") epicsEnvShow(ECMC_FILE_EXIST_RETURN_VAL) ECMC_FILE_EXIST_RETURN_VAL=1 @@ -268,6 +241,32 @@ ecmcFileExist("ecmcEK1100.substitutions",0,0,"/home/") epicsEnvShow(ECMC_FILE_EXIST_RETURN_VAL) ECMC_FILE_EXIST_RETURN_VAL=0 ``` +### Use return value of ecmcConfig(OrDie): + +The return value from ecmcConfig(OrDie) is stored in the EPICS environment variable +"ECMC_CONFIG_RETURN_VAL". This value can be used to make som dynamic configuration. +All ASCII configuration commands for ecmcConfig(OrDie) can be used in the same way. + +#### Example: Read firmware version of an EL7037 stepper drive +Note: SDO reads need to be before "SetAppMode(1)" +```text +ecmcConfig "EcReadSdo(${ECMC_SLAVE_NUM},0x100a,0x0,2)" +epicsEnvShow(ECMC_CONFIG_RETURN_VAL) +ECMC_CONFIG_RETURN_VAL=14640 + +``` +The variable "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. + +### Example: Read "ID" PDO from EK1101 (shown in detail in aliasRecordFromPdoData.script) +Note: PDO reads need to be after "SetAppMode(1)" since cyclic value +```text +ecmcConfig "ReadEcEntryIDString(${ECMC_SLAVE_NUM},"ID")" +## This is the value of the EK1101 ID switch +epicsEnvShow(ECMC_CONFIG_RETURN_VAL) +ECMC_CONFIG_RETURN_VAL=1024 +``` +The variable "ECMC_CONFIG_RETURN_VAL" then can be used to set record fields, name or alias for instance.. + ### Todo Add docs for: * ecmcConfigOrDie diff --git a/hugo/content/manual/knowledgebase/host.md b/hugo/content/manual/knowledgebase/host.md index 86cbc012e..74b57bb4d 100644 --- a/hugo/content/manual/knowledgebase/host.md +++ b/hugo/content/manual/knowledgebase/host.md @@ -10,7 +10,7 @@ chapter = false ### latency issues / lost frames -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: +High latency, more than 30% of the ethercat cycle time, can result in lost ethercat frames, which means data are lost. High latency of the ecmc_rt thread can be related to: 1. The generic device driver is used 2. High load on system 3. ... @@ -61,12 +61,16 @@ epicsThreadSetAffinity ecmc_rt 5 ``` If more than one ecmc ioc is running on the server, then make sure the ecmc_rt threads run on different cores. -Also other threads might take a lot of resources, for instance the epics thread "cbLow": +Further tuning might include moving other cpu intensive threads to dedicated cores, for instance the epics thread ```cbLow```: ``` afterInit "epicsThreadSetAffinity cbLow 6" ``` {{% notice info %}} -cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. +```cbLow``` is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. +{{% /notice %}} + +{{% notice note %}} +The affinity can also be set with the tools accessible in the EPICS module MCoreUtils. {{% /notice %}} ### EtherCAT rate (EC_RATE) From bbc70352ab96a62150a77ec8478e53f66014e531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 2 Oct 2024 09:46:08 +0200 Subject: [PATCH 126/128] Add yaml based example for enc index homing --- hugo/content/manual/motion_cfg/homing.md | 52 ++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/hugo/content/manual/motion_cfg/homing.md b/hugo/content/manual/motion_cfg/homing.md index 2214ecddb..323689305 100644 --- a/hugo/content/manual/motion_cfg/homing.md +++ b/hugo/content/manual/motion_cfg/homing.md @@ -105,6 +105,32 @@ epicsEnvSet("ECMC_EC_ENC_LATCH_STATUS", "ec0.s3.encoderStatus01.0") # epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # Number of latch/over/under-flow for home (home seq 11,12,21,22) ``` +yaml-based EL51xx: +``` +encoder: + position: ec$(MASTER_ID).s$(ENC_SID).positionActual$(ENC_CHAN) + type: 0 # Type (0=Incremental, 1=Absolute) + numerator: -3.1415926 # + denominator: 118000 # + bits: 32 # Total bit count of encoder raw data + primary: 0 +  control:'ec$(MASTER_ID).s$(ENC_SID).encoderControl$(ENC_CHAN)' +  status: 'ec$(MASTER_ID).s$(ENC_SID).encoderStatus$(ENC_CHAN)' + position: 0 +  latch: +    position: 'ec$(MASTER_ID).s$(ENC_SID).encoderLatchPostion$(ENC_CHAN)' # 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 + homing: + type: 11 # low limit, encoder index + latchCount: 1 # latch number to ref on (1=ref on first latch) +``` + +**Backround to the cfgs (control and status word for latching)** +* bit 0 of control word is: 0x7000:01 - Enable latch on index +* bit 0 of status word is: 0x6000:01 - Latch occured + + ### ECMC_SEQ_HOME_HIGH_LIM_INDEX = 12, 1. Axis moves forward until high limit switch and stops 2. 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. @@ -119,6 +145,32 @@ epicsEnvSet("ECMC_EC_ENC_LATCH_STATUS", "ec0.s3.encoderStatus01.0") # epicsEnvSet("ECMC_HOME_LATCH_COUNT_OFFSET","2") # Number of latch/over/under-flow for home (home seq 11,12,21,22) ``` +yaml-based EL51xx: +``` +encoder: + position: ec$(MASTER_ID).s$(ENC_SID).positionActual$(ENC_CHAN) + type: 0 # Type (0=Incremental, 1=Absolute) + numerator: -3.1415926 # + denominator: 118000 # + bits: 32 # Total bit count of encoder raw data + primary: 0 +  control:'ec$(MASTER_ID).s$(ENC_SID).encoderControl$(ENC_CHAN)' +  status: 'ec$(MASTER_ID).s$(ENC_SID).encoderStatus$(ENC_CHAN)' + position: 0 +  latch: +    position: 'ec$(MASTER_ID).s$(ENC_SID).encoderLatchPostion$(ENC_CHAN)' # 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 + homing: + type: 12 # high limit, encoder index + latchCount: 1 # latch number to ref on (1=ref on first latch) +``` + +**Backround to the cfgs (control and status word for latching)** +* bit 0 of control word is: 0x7000:01 - Enable latch on index +* bit 0 of status word is: 0x6000:01 - Latch occured + + ### ECMC_SEQ_HOME_SET_POS = 15, (setPosition) Sequence 15 is resereved for save/restore functionality. Use ECMC_SEQ_HOME_SET_POS_2 instead (same but not blocked by motor record). From 5400bb6783187cdf85164fb2941172693811116c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 2 Oct 2024 10:01:55 +0200 Subject: [PATCH 127/128] homing --- hugo/content/manual/motion_cfg/homing.md | 36 ++++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/hugo/content/manual/motion_cfg/homing.md b/hugo/content/manual/motion_cfg/homing.md index aa76fd12a..d948c2558 100644 --- a/hugo/content/manual/motion_cfg/homing.md +++ b/hugo/content/manual/motion_cfg/homing.md @@ -109,21 +109,21 @@ yaml-based EL51xx: ``` encoder: position: ec$(MASTER_ID).s$(ENC_SID).positionActual$(ENC_CHAN) - type: 0 # Type (0=Incremental, 1=Absolute) - numerator: -3.1415926 # - denominator: 118000 # - bits: 32 # Total bit count of encoder raw data + type: 0 # Type (0=Incremental, 1=Absolute) + numerator: -3.1415926 # + denominator: 118000 # + bits: 32 # Total bit count of encoder raw data primary: 0 -  control:'ec$(MASTER_ID).s$(ENC_SID).encoderControl$(ENC_CHAN)' +  control: 'ec$(MASTER_ID).s$(ENC_SID).encoderControl$(ENC_CHAN)'   status: 'ec$(MASTER_ID).s$(ENC_SID).encoderStatus$(ENC_CHAN)' position: 0   latch:     position: 'ec$(MASTER_ID).s$(ENC_SID).encoderLatchPostion$(ENC_CHAN)' # 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 +   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 homing: - type: 11 # low limit, encoder index - latchCount: 1 # latch number to ref on (1=ref on first latch) + type: 11 # low limit, encoder index + latchCount: 1 # latch number to ref on (1=ref on first latch) ``` **Backround to the cfgs (control and status word for latching)** @@ -149,21 +149,21 @@ yaml-based EL51xx: ``` encoder: position: ec$(MASTER_ID).s$(ENC_SID).positionActual$(ENC_CHAN) - type: 0 # Type (0=Incremental, 1=Absolute) - numerator: -3.1415926 # - denominator: 118000 # - bits: 32 # Total bit count of encoder raw data + type: 0 # Type (0=Incremental, 1=Absolute) + numerator: -3.1415926 # + denominator: 118000 # + bits: 32 # Total bit count of encoder raw data primary: 0 -  control:'ec$(MASTER_ID).s$(ENC_SID).encoderControl$(ENC_CHAN)' +  control: 'ec$(MASTER_ID).s$(ENC_SID).encoderControl$(ENC_CHAN)'   status: 'ec$(MASTER_ID).s$(ENC_SID).encoderStatus$(ENC_CHAN)' position: 0   latch:     position: 'ec$(MASTER_ID).s$(ENC_SID).encoderLatchPostion$(ENC_CHAN)' # 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 +   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 homing: - type: 12 # high limit, encoder index - latchCount: 1 # latch number to ref on (1=ref on first latch) + type: 12 # high limit, encoder index + latchCount: 1 # latch number to ref on (1=ref on first latch) ``` **Backround to the cfgs (control and status word for latching)** From 96ee7ddb7f3ba124904ec3a540bad5a5084d83e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 2 Oct 2024 10:14:16 +0200 Subject: [PATCH 128/128] update best practice --- .../motion/stepper_bissc_hw_subst/cfg/{hw.subst => hw.subs} | 0 .../PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/{hw.subst => hw.subs} (100%) diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subs similarity index 100% rename from examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst rename to examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subs diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd index 1df54a74b..b4e2a526f 100644 --- a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd @@ -6,7 +6,7 @@ require ecmccomp ############################################################################## # - apply hardware configuration -${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=cfg/hw.subst" +${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=cfg/hw.subs" ############################################################################## # - motion

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 diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 893e22c85..f7d240377 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -30,7 +30,7 @@ In order to use the etehrcat command, you must first login to the server where t The diagnostic data can be read from register 0xA010: -![0xA010](el7041_diag_regs.png) +[0xA010](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) The registers can be read with the folowing syntax: ```bash From 776a256c59d6a51d871145ef2d765f6bb01cbd31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 12:55:38 +0200 Subject: [PATCH 040/128] Update doc --- hugo/content/manual/troubleshooting/hardware.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index f7d240377..f9478fbb7 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -29,8 +29,7 @@ In order to use the etehrcat command, you must first login to the server where t {{% /notice %}} -The diagnostic data can be read from register 0xA010: -[0xA010](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) +The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) The registers can be read with the folowing syntax: ```bash From 5160a883c620174e951b2d54cc4557f248e8661f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 12:58:11 +0200 Subject: [PATCH 041/128] Fix typo --- hugo/content/manual/troubleshooting/hardware.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index f9478fbb7..9c04ec32b 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -25,13 +25,12 @@ The EL9227-5500 is a 2 channel module and normally both channels needs to be ena If 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. {{% notice info %}} -In order to use the etehrcat command, you must first login to the server where the ecmc IOC is running. +In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. {{% /notice %}} -The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) +The diagnostic data can be read from register [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) with the folowing syntax: -The registers can be read with the folowing syntax: ```bash ethercat upload -m -p --type uint8 0xA010 ``` From f25143911d2b6d3b23e68e3c42c7a73420724913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 13:54:47 +0200 Subject: [PATCH 042/128] Update docs --- hugo/content/manual/axis/axisPLC.md | 2 +- .../manual/axis/best_practice/_index.md | 4 +- .../manual/axis/best_practice/servo.md | 2 +- .../axis/best_practice/stepper_biss_c.md | 6 +- hugo/content/manual/axis/direction.md | 21 ++++--- hugo/content/manual/axis/homing.md | 2 +- hugo/content/manual/axis/scaling.md | 6 +- hugo/content/manual/introduction.md | 58 ++++++++++--------- .../manual/troubleshooting/hardware.md | 15 ++--- hugo/content/manual/troubleshooting/motion.md | 28 ++++++--- 10 files changed, 78 insertions(+), 66 deletions(-) diff --git a/hugo/content/manual/axis/axisPLC.md b/hugo/content/manual/axis/axisPLC.md index dcefbf8a4..3ed3a9e01 100644 --- a/hugo/content/manual/axis/axisPLC.md +++ b/hugo/content/manual/axis/axisPLC.md @@ -4,7 +4,7 @@ weight = 26 chapter = false +++ -## introduction +## 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](axisyaml) config. diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/axis/best_practice/_index.md index 6c4f13899..80ab63acc 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/axis/best_practice/_index.md @@ -8,10 +8,10 @@ chapter = false Here you can find some best practice configurations for common usecases. The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) -### [Stepper and BISS-C](stepper_biss_c) +### [stepper and BISS-C](stepper_biss_c) An example configuration of a EL7041-0052 and a EL5042. The complete example with starup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/stepper_bissc) -### [Servo](servo) +### [servo](servo) An example configuration of a Ex72xx servo drive with AM8xxx motor. The complete example with starup file can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice/motion/servo) diff --git a/hugo/content/manual/axis/best_practice/servo.md b/hugo/content/manual/axis/best_practice/servo.md index af1af06c6..2ad7c896c 100644 --- a/hugo/content/manual/axis/best_practice/servo.md +++ b/hugo/content/manual/axis/best_practice/servo.md @@ -42,7 +42,7 @@ encoder: absOffset: -1000 ``` -### Drive scalings +### drive scalings Max scale for motors depend on the pole count: * 6 pole: Max scale is 8000revs/s (in this case 8000mm/s) * 8 pole: Max scale is 6000revs/s diff --git a/hugo/content/manual/axis/best_practice/stepper_biss_c.md b/hugo/content/manual/axis/best_practice/stepper_biss_c.md index 667843d54..04bc91c8f 100644 --- a/hugo/content/manual/axis/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/axis/best_practice/stepper_biss_c.md @@ -12,7 +12,7 @@ chapter = false ## Scalings Config for scaling in mm, mm/s, mm/s2 -### Encoder scalings +### encoder scalings Two encoders are configured: 1. Closed loop: BISS-C. This is used as the default encoder for control 2. Open loop: EL7041 Step counter @@ -45,7 +45,7 @@ encoder: - 1 # Error 0 ``` -#### Open loop (encoder 2) +#### open loop (encoder 2) The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): * encoder.numerator: Travels 1 mm/rev * encoder.denominator: Resolution: 200*64=12800 microsteps/rev = 12800 microsteps/mm @@ -67,7 +67,7 @@ encoder: refToEncIDAtStartup: 1 # Ref encoder at startup (to BISS value) ``` -### Drive scalings +### 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): * drive.numerator: Max velo = 2000 fullsteps/s == 10mm/s diff --git a/hugo/content/manual/axis/direction.md b/hugo/content/manual/axis/direction.md index 2ff87c784..a3fbee202 100644 --- a/hugo/content/manual/axis/direction.md +++ b/hugo/content/manual/axis/direction.md @@ -26,22 +26,25 @@ Consult the respective slave manual for the correct SDO. ### encoder direction -In many cases invertion of teh encoder value is possible in the ethercat slave. For EL5042, example below, the invertion leads to a very high number since the data size is 64bit. Therefore, it's advisable to switch sign in the axis configuration instead. +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. + +{{% notice info %}} +For EL5042, example below, the invertion leads to a very high number since the data size is 64bit. Therefore, it's advisable to switch sign in the axis configuration instead. +{{% /notice %}} + ```shell # slave 7 {ecmcEL5042} -${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureSlave.cmd, "HW_DESC=EL5042, CONFIG=-Encoder-ch12-Renishaw_RL26BUT001B30V" -# Reverse encoder direction of ch1 -ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x8008,0x1,1,1)" -# Reverse encoder direction of ch2 -ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x8018,0x1,1,1)" +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL5042" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=1, MACROS='INV_DIR=1'" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Encoder-RLS-LA11-26bit-BISS-C,CH_ID=2, MACROS='INV_DIR=1'" ``` ### drive direction ```shell # slave 18 {ecmcEL7041} -${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureSlave.cmd, "HW_DESC=EL7041, CONFIG=-Motor-Phytron-VSS-42.200.2.5" -# Reverse motor direction: -ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x8012,0x9,1,1)" +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230,INV_DIR=1'" ``` ## ECMC scaling diff --git a/hugo/content/manual/axis/homing.md b/hugo/content/manual/axis/homing.md index 3cb4df8c0..99cb5470a 100644 --- a/hugo/content/manual/axis/homing.md +++ b/hugo/content/manual/axis/homing.md @@ -177,7 +177,7 @@ Trigger external homing sequence in drive. 6. Optional: Init post move if configured Currently used for smaract: -[smaracat example](../smaract/smaract.script) +[smaracat example](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/test/smaract) In this exmaple also the drive modes is automatically handled by ecmc. ## Setting polarity of home sensor diff --git a/hugo/content/manual/axis/scaling.md b/hugo/content/manual/axis/scaling.md index 8f08885ea..e47eab4ff 100644 --- a/hugo/content/manual/axis/scaling.md +++ b/hugo/content/manual/axis/scaling.md @@ -13,7 +13,7 @@ Changes 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. {{% /notice %}} -## drive scaling +## 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](#stepper-motor-drives) and [servo drives](#servo-motor-drives) @@ -82,7 +82,7 @@ drive: denominator: 2147483648 # I/O range 2^31, because 32-bit register, half is forward, the other half is backward ``` -## encoder scaling +## Encoder scaling This scaling ratio describes the relation of encoder counts and engineering units of the axis. Unlike the drive scaling, the encoder scaling is much simpler. @@ -100,7 +100,7 @@ encoder: bits: 32 # Total bit count of encoder raw data ``` -#### Explanation +#### explanation none, this should be simple enough! ### open-loop diff --git a/hugo/content/manual/introduction.md b/hugo/content/manual/introduction.md index c95474c54..50aa92795 100644 --- a/hugo/content/manual/introduction.md +++ b/hugo/content/manual/introduction.md @@ -4,7 +4,7 @@ weight = 5 chapter = false +++ -## principle +## 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**. @@ -49,39 +49,40 @@ This behaviour can be modified by arguments. * add a coupler and slaves ```bash - # slave 0 {ecmcEK1100} - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EK1100" + # slave 0 {EK1100} + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EK1100" # SLAVE_ID is automatically incremented - # slave 1 {ecmcEL1018} - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EL1018" + # slave 1 {EL1018} + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL1018" # skip slaves 2..6 - # slave 7 {ecmcEL2008}, with optional SLAVE_ID - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EL2008, SLAVE_ID=7" - # slave 9 {ecmcEL2008}, with optional SLAVE_ID and P_SCRIPT - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EL2008, SLAVE_ID=7, P_SCRIPT=mXsXXX" - # slave 10 {ecmcEL3204}, without any of the default PVs - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EL3204, DEFAULT_SUBS=false, DEFAULT_SLAVE_PVS=true" + # slave 7 {EL2008}, with optional SLAVE_ID + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL2008, SLAVE_ID=7" + # slave 9 {EL2008}, with optional SLAVE_ID and P_SCRIPT + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL2008, SLAVE_ID=7, P_SCRIPT=mXsXXX" + # slave 10 {EL3204}, without any of the default PVs + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL3204, DEFAULT_SUBS=false, DEFAULT_SLAVE_PVS=true" ``` * add more slaves and apply configuration to the slaves ```bash - # slave 8 {ecmcEL7037}, configure slave with optional SLAVE_ID - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureSlave.cmd, "HW_DESC=EL7037, CONFIG=-Motor-Nanotec-ST4118L1804-B, SLAVE_ID=8" - # slave 9 {ecmcEL7037}, addSlave, with immediate call off applySlaveConfig + # slave 8 {EL7037}, configure slave using applyComponent.cmd from ecmccomp module with optional SLAVE_ID. + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7037, SLAVE_ID=8" + ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" + # slave 9 {EL7037}, addSlave, with immediate call off applySlaveConfig # slave with global configuration - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EL7037" - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applySlaveConfig, "CONFIG=-Motor-Nanotec-ST4118L1804-B" + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7037" + ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, "CONFIG=-Motor-Nanotec-ST4118L1804-B" # slave with local configuration, in this case provided by the module `ECMC_AGIR` epicsEnvSet("CFG_ROOT", "${ECMC_AGIR_DIR}/") - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}addSlave.cmd, "HW_DESC=EP7211-0034_ALL" - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applySlaveConfig.cmd, "LOCAL_CONFIG=${CFG_ROOT}AM8211_AGIR.cfg" + ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EP7211-0034_ALL" + ${SCRIPTEXEC} ${ecmccfg_DIR}applySlaveConfig.cmd, "LOCAL_CONFIG=${CFG_ROOT}AM8211_AGIR.cfg" ``` #### apply the configuration The configured process image is applied to the master ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applyConfig.cmd + ${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd ``` ##### additional configuration @@ -90,6 +91,7 @@ Optionally, manual modifications can be made to the default configuration. In order to manually set `binaryOutput01` to `1` at startup, the following can be added to the startup script. ```bash ecmcConfigOrDie "Cfg.WriteEcEntryIDString(${ECMC_EC_SLAVE_NUM_DIG_OUT},binaryOutput01,1)" + ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s${ECMC_EC_SLAVE_NUM_DIG_OUT}.binaryOutput12,1)" ``` ##### adding a physical motor axis @@ -100,23 +102,23 @@ It is theoretically possible to use a mix of `yaml` and classic configuration, b * yaml config ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlAxis.cmd, "FILE=./cfg/ax1.yaml, DEV=${DEV}, DRV_SLAVE=4, ENC_SLAVE=3, ENC_CHANNEL=01" + ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/ax1.yaml, DEV=${DEV}, DRV_SLAVE=4, ENC_SLAVE=3, ENC_CHANNEL=01" ``` * classic config ```bash epicsEnvSet("DEV", "STEST-MYDEVICE") - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureAxis.cmd, "CONFIG=./cfg/axis_1" + ${SCRIPTEXEC} ${ecmccfg_DIR}configureAxis.cmd, "CONFIG=./cfg/axis_1" ``` ##### adding a virtual motor axis ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}configureVirtualAxis.cmd, "CONFIG=./cfg/axis_11_virt" + ${SCRIPTEXEC} ${ecmccfg_DIR}configureVirtualAxis.cmd, "CONFIG=./cfg/axis_11_virt" ``` ##### adding synchronization ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applyAxisSynchronization.cmd, "CONFIG=./cfg/axis_1_sync" - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}applyAxisSynchronization.cmd, "CONFIG=./cfg/axis_11_sync" + ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, "CONFIG=./cfg/axis_1_sync" + ${SCRIPTEXEC} ${ecmccfg_DIR}applyAxisSynchronization.cmd, "CONFIG=./cfg/axis_11_sync" ``` ##### loading a PLC from file @@ -124,18 +126,18 @@ 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. * classic PLC-file ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCFile.cmd, "PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100" + ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "PLC_ID=0, FILE=./plc/homeSlit.plc, SAMPLE_RATE_MS=100" ``` * pure yaml based PLC ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlPlc.cmd "FILE=./plc1.yaml" + ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd "FILE=./plc1.yaml" ``` * yaml definition, with classic PLC-file, Note: `file` key in yaml config will overwrite anything in the `code` key! ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadYamlPlc.cmd "FILE=./plc1File.yaml" + ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlPlc.cmd "FILE=./plc1File.yaml" ``` #### go active ```bash - ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}setAppMode.cmd + ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd ``` diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 9c04ec32b..e6dd253ae 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -4,9 +4,7 @@ weight = 11 chapter = false +++ -### Hardware - -### Over current protection EL9227-5500, EL9221-5000 +### over current protection el9227-5500, el9221-5000 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. @@ -15,14 +13,14 @@ First time, (and only first time), a system is in use, the overcurrent modules n Before pressing the buttons make sure it's safe to power on the system. {{% /notice %}} -#### EL9221-5000 +#### el9221-5000 The EL9221-5000 has one channel and can therefore only the top button is needed to be pressed. -#### EL9227-5500 +#### 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. -### EL7041 -If 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. +### el7041 +If 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](ethercatcli) for more info. {{% notice info %}} In order to use the ethercat command, you must first login to the server where the ecmc IOC is running. @@ -63,6 +61,3 @@ ethercat upload -m 0 -p 3 --type uint8 0xA010 0x8 # Misc error ethercat upload -m 0 -p 3 --type uint8 0xA010 0x9 ``` - - - diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index 49783ba22..dec2b1326 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -4,8 +4,7 @@ weight = 12 chapter = false +++ - -## BOTH_LIMITS error +## 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: Define the output in axis yaml file: @@ -22,25 +21,25 @@ By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binar ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" ``` -## Position Lag Error (following error): +## position lag error (following error): A position lag error is normally genereated in the following situations: 1. The motor torque is too low, making it hard for the motor to keep up with the setpoint. 2. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. 3. The velocity setpoint is too high resulting in motor stall (common for stepper motors). 4. The velocity setpoint is higher than what the drive can achive (saturated velocity setpoint). -### 1. Motor torque to low +### 1. motor torque to low If possible, increase current to the motor. {{% notice warning %}} 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. {{% /notice %}} -### 2. Scaling factors are wrong +### 2. scaling factors are wrong Check the scaling documentation [here](https://paulscherrerinstitute.github.io/ecmccfg/manual/axis/scaling/). 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. -### 3. The velocity setpoint is too high resulting in stall +### 3. the velocity setpoint is too high resulting in stall If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higehr velocities: 1. Add a damper: This is nromally very effichient but not always possible. 2. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive) @@ -50,7 +49,7 @@ If a stepper motor stalls because of too high velocity there's a few thing that 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. {{% /notice %}} -#### Tuning +#### tuning For EL70x1 stepper drives the following parameters can be tuned: * 8011:07 Ka factor * 8011:08 Kd factor @@ -68,7 +67,7 @@ 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. -### 4. Velocity higher than allowed by driver +### 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: ``` 0 for 1000 full steps/second @@ -80,6 +79,19 @@ For EL704x stepper drives are default setup to maximum veleocity range of +-2000 ``` After changing this value you also need to change the drive scaling in the axis yaml file. +## drive refuse to enable + +First check the dedicated hardware drive panel for diagnostics. + +Possible reasons: +1. For systems with safety, tripp off STO or power to the drive might be cut by contactor. Check status of safety system. +2. Over current protection of 48V tripped. +3. No 48V connected. +4. ecmc PLC disabaling axis, check PLC sources. +5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state +6. Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). +7. Axis object configured with external interlock (yaml->input.interlock). + ## force manual motion {{% notice warning %}} This procedure is for experst only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! From c4c9929d42ff0e3a4be3af011673a7886e84ae1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 16:12:35 +0200 Subject: [PATCH 043/128] update utils --- .../manual/troubleshooting/hardware.md | 66 ++++++++- utils/parse_ec_esi_xml.py | 140 +++++++++--------- utils/read_el70xx_diag.sh | 36 +++++ utils/readme.md | 59 +++++++- 4 files changed, 224 insertions(+), 77 deletions(-) mode change 100755 => 100644 utils/parse_ec_esi_xml.py create mode 100644 utils/read_el70xx_diag.sh diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index e6dd253ae..a0d139124 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -19,7 +19,7 @@ The EL9221-5000 has one channel and can therefore only the top button is needed #### 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. -### el7041 +### el7041 error/warning If 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](ethercatcli) for more info. {{% notice info %}} @@ -61,3 +61,67 @@ 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: +```bash +bash read_el70xx_diag.sh +``` + +Example: master 0, slave 3, drive under voltage warning +```bash +bash 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. + +#### under voltage +Under voltage could be that the drive voltage setting is 48V but the drive is only powered with 24V. + +The nominal voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). + +Example: Set nominal voltage to 24V +``` +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=24000, R_COIL_MOHM=1230'" + +``` + +#### over voltage +Over voltage could be that the drive voltage setting is 24V but the drive is powered with 48V. + +The nominal voltage setting can be changed by the U_NOM_MV macro when applying the component (ecmccomp). + +Example: Set nominal voltage to 48V +``` +${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" +${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230'" + +``` + +{{% notice info %}} +For the EL703x drives the nominal voltage must be set to 24V. +{{% /notice %}} diff --git a/utils/parse_ec_esi_xml.py b/utils/parse_ec_esi_xml.py old mode 100755 new mode 100644 index 613fa1d46..d2e4b25ac --- a/utils/parse_ec_esi_xml.py +++ b/utils/parse_ec_esi_xml.py @@ -2,9 +2,8 @@ # need system python for libxml2 support with xpath -#- Originally written by Dimaond Light EPICS EtherCAT support. - -#- Copied and rewritten/edited by Anders Sandström for use with ecmc (generating hardware support) +#- Originally written for Dimaond light epics ethercat support: +#- Rewritten/edited by Anders Sandström for use with ecmc import libxml2 import sys @@ -12,7 +11,6 @@ reqs = set() base = None verbose = False -printedPDOHeader = False def parseInt(text): if text.startswith("#x") or text.startswith("0x"): @@ -72,7 +70,7 @@ def getSDOBitSize(node): bitlen= bitlen.replace(" ", "") return int(bitlen) -def printEcmcAddEntry(vendor,product,pdo,entry,direction,updateInRT,outputfile): +def printEcmcAddEntry(vendor,product,pdo,entry,direction,updateInRT): # sm = pdo.prop("Sm") pdoName = getPdoName(pdo) @@ -82,9 +80,9 @@ def printEcmcAddEntry(vendor,product,pdo,entry,direction,updateInRT,outputfile): entrySubIndex = getEntrySubIndex(entry) dt = getEntryDataType(entry) dataLen = getEntryBitLen(entry) - print('ecmcConfigOrDie "Cfg.EcAddEntryDT(${ECMC_EC_SLAVE_NUM},0x%x,0x%x,%d,%d,0x%x,0x%x,0x%x,%s_%d,%s,%d)' % (vendor, product, int(direction), int(sm), pdoIndex, entryIndex, entrySubIndex, dt, int(dataLen), entryName ,int(updateInRT) ),file=outputfile) + print('ecmcConfigOrDie "Cfg.EcAddEntryDT(${ECMC_EC_SLAVE_NUM},0x%x,0x%x,%d,%d,0x%x,0x%x,0x%x,%s_%d,%s,%d)' % (vendor, product, int(direction), int(sm), pdoIndex, entryIndex, entrySubIndex, dt, int(dataLen), entryName ,int(updateInRT) )) -def printEcmcAddEntryEmpty(vendor,product,pdo,entry,direction,emptyIndex,outputfile): +def printEcmcAddEntryEmpty(vendor,product,pdo,entry,direction,emptyIndex): # sm = int(pdo.prop("Sm")) pdoName = getPdoName(pdo) @@ -92,60 +90,69 @@ def printEcmcAddEntryEmpty(vendor,product,pdo,entry,direction,emptyIndex,outputf entryName = "ec${ECMC_EC_MASTER_ID}.s${ECMC_EC_SLAVE_NUM}.sm" + str(sm) + ".pdo" + str(pdo) + ".empty" + str(emptyIndex) entryIndex = getEntryIndex(entry) dataLen = getEntryBitLen(entry) - print(entry,file=outputfile) - -def printPDOHeader(outputfile): - print("#- =================================== ",file=outputfile) - print("#- PDOs ",file=outputfile) - print("#-",file=outputfile) - -def printSDOHeader(outputfile): - print("",file=outputfile) - print("#- =================================== ",file=outputfile) - print("#- SDOs ",file=outputfile) - print("#-",file=outputfile) - -def printSDO(sdoObject,dtlist,outputfile): - sdoName = getEntryName(sdoObject) - sdoIndex = getEntryIndex(sdoObject) - datatype = getSDODataType(sdoObject) - dataLen = getSDOBitSize(sdoObject) - byteCount = dataLen/8 + print(entry) + +def printSDO(sdoObject,dtlist): + #print(sdoObject) + sdoName = getEntryName(sdoObject) + sdoIndex = getEntryIndex(sdoObject) + dt = getSDODataType(sdoObject) + dataLen = getSDOBitSize(sdoObject) + byteCount = dataLen/8 bitsExByte = dataLen-byteCount*8 - print("#- SDO 0x%x, %s (%d.%d), %s" % (sdoIndex,datatype, byteCount, bitsExByte, sdoName),file=outputfile) - dtlist[datatype].printRecursive(" ",dtlist) + print("SDO 0x%x, %s (%d.%d), %s" % (sdoIndex,dt, byteCount, bitsExByte, sdoName)) + # print recursive datatype + dtlist[dt].printRecursive(" ",dtlist) -class ecDataType: - def __init__(self,outputfile): - self.f = outputfile +class ecDataTypeSubItem: + def __init__(self): self.name = "" self.subIdx = -1 self.bits = -1 self.bitoffset = -1 self.type = "" + def print(self, indentStr): + self.bytes=self.bits/8 + print("%s 0x%x, %s %d.%d %d: %s" % (indentStr,self.subIdx,self.type, self.bytes, self.bits-self.bytes*8,self.bitoffset,self.name)) + + # Loop until "native" type + def printRecursive(self, indentStr, datatypelist): + self.bytes=self.bits/8 + indent=indentStr + while not isinstance(datatypelist[self.type],ecDataTypeItem): + datatypelist[self.type].print(indent) + indent = indent + " " + print("%s 0x%x, %s %d.%d %d: %s" % (indentStr,self.subIdx,self.type, self.bytes, self.bits-self.bytes*8,self.bitoffset,self.name)) + #print("%s %s %d.%d: %s" % (indentStr,self.type,self.bytes, self.bits-self.bytes*8, self.name)) + +class ecDataTypeItem: + def __init__(self): + self.name = "" + self.bits = -1 self.subItems = [] - self.bytes = -1 def print(self, indentStr): - self.bytes = self.bits/8 - if len(self.subItems) == 0 and self.subIdx >= 0: - print("#- %s 0x%02x %20s %5d.%d (%3d): %s" % (indentStr,self.subIdx, self.type, self.bytes, self.bits-self.bytes*8, self.bitoffset, self.name),file=self.f) + self.bytes=self.bits/8 + print("%s %d.%d: %s" % (indentStr,self.bytes, self.bits-self.bytes*8, self.name)) + for subItem in self.subItems: + subItem.print(indentStr+ " ") - # Loop until "native" type def printRecursive(self, indentStr, datatypelist): - self.bytes = self.bits/8 - indent = indentStr - self.print(indent) + self.bytes=self.bits/8 + print("%s %d.%d: %s" % (indentStr,self.bytes, self.bits-self.bytes*8, self.name)) for subItem in self.subItems: - subItem.printRecursive(indent + " ",datatypelist) + subItem.printRecursive(indentStr+ " ",datatypelist) -def parseDataType(dtnode,outputfilename): - dt = ecDataType(outputfilename) +def parseDataType(dtnode): + dt = ecDataTypeItem() dt.name = dtnode.xpathEval("Name")[0].content dt.bits = int(dtnode.xpathEval("BitSize")[0].content) counter = 0 - for subItemNode in dtnode.xpathEval("SubItem"): - subItem = ecDataType(outputfilename) + for subItemNode in dtnode.xpathEval("SubItem"): + #print ("subItemNode") + #print (subItemNode) + + subItem = ecDataTypeSubItem() subItem.subIdxNode = subItemNode.xpathEval("SubIdx") if len(subItem.subIdxNode)>0: subItem.subIdx= int(subItem.subIdxNode[0].content) @@ -158,9 +165,9 @@ def parseDataType(dtnode,outputfilename): dt.subItems.append(subItem) counter = counter+1 return dt + -def parseFile(filename, outputfile, list_devices, extraPdos): - printedPDOHeader = False +def parseFile(filename, output, list_devices, extraPdos): doc = libxml2.parseFile(filename) vendor = parseInt(doc.xpathEval("//Vendor/Id")[0].content) for device in doc.xpathEval("//Device"): @@ -205,16 +212,10 @@ def parseFile(filename, outputfile, list_devices, extraPdos): ai.append(getPdoName(txpdo) + "." + getEntryName(entry) ) else: longin.append(getPdoName(txpdo) + "." + getEntryName(entry) ) - if not printedPDOHeader: - printPDOHeader(outputfile) - printedPDOHeader = True - printEcmcAddEntry(vendor,product,txpdo,entry,2,1,outputfile) + printEcmcAddEntry(vendor,product,txpdo,entry,2,1) elif verbose or True: - if not printedPDOHeader: - printPDOHeader(outputfile) - printedPDOHeader = True - print("Ignoring entry in pdo %s" % getPdoName(txpdo),file=outputfile) - printEcmcAddEntryEmpty(vendor,product,txpdo,entry,2,emptyIndex,outputfile) + print("Ignoring entry in pdo %s" % getPdoName(txpdo)) + printEcmcAddEntryEmpty(vendor,product,txpdo,entry,2,emptyIndex) emptyIndex = emptyIndex + 1 emptyIndex = 0 for rxpdo in device.xpathEval("RxPdo"): @@ -230,29 +231,23 @@ def parseFile(filename, outputfile, list_devices, extraPdos): bo.append(getPdoName(rxpdo) + "." + getEntryName(entry) ) else: longout.append(getPdoName(rxpdo) + "." + getEntryName(entry) ) - if not printedPDOHeader: - printPDOHeader(outputfile) - printedPDOHeader = True - - printEcmcAddEntry(vendor,product,rxpdo,entry,1,1,outputfile) + printEcmcAddEntry(vendor,product,rxpdo,entry,1,1) elif verbose: - if not printedPDOHeader: - printPDOHeader(outputfile) - printedPDOHeader = True - print("Ignoring entry in pdo %s" % getPdoName(txpdo), file=outputfile) - printEcmcAddEntryEmpty(vendor,product,rxpdo,entry,1,emptyIndex,outputfile) + print("Ignoring entry in pdo %s" % getPdoName(txpdo)) + printEcmcAddEntryEmpty(vendor,product,rxpdo,entry,1,emptyIndex) emptyIndex = emptyIndex + 1 for dtnode in device.xpathEval("Profile/Dictionary/DataTypes/DataType"): - dt = parseDataType(dtnode,outputfile) + dt = parseDataType(dtnode) dt.print(" ") dataTypeList[dt.name] = dt - printSDOHeader(outputfile) for sdoObject in device.xpathEval("Profile/Dictionary/Objects/Object"): - printSDO(sdoObject,dataTypeList,outputfile) + printSDO(sdoObject,dataTypeList) + + #makeTemplate(ai, longin, longout, bi, bo, output, base, devtype, revision, extraPdos) def usage(progname): print("%s: Generate hardware support for ecmc " % progname) @@ -261,9 +256,9 @@ def usage(progname): print(" %s -b -l Lists the devices in the database" % progname) print(""" %s -b -d -r [-p comma-separated-pdo-list] -o output-file - Generates a ecmc hw support snippet in for the given device and revision. + Generates a template in for the given device and revision. rev-no must be input as a hex number, e.g. 0x00100000 - Use the -p argument to include additional pdos in the snippet + Use the -p argument to include additional pdos in the template """ % progname) def parsePdoassignments(s): @@ -344,16 +339,13 @@ def parsePdoassignments(s): assert(list_devices or len(reqs) == 1) import os - outputfile = open(output, "w") for f in os.listdir(base): if f.endswith("xml"): filename = os.path.join(base, f) if verbose: print("Parsing %s" % filename) - parseFile(filename, outputfile, list_devices, + parseFile(filename, output, list_devices, parsePdoassignments(pdoassignment)) - outputfile.close() - # loads chain description, outputs complete config file... diff --git a/utils/read_el70xx_diag.sh b/utils/read_el70xx_diag.sh new file mode 100644 index 000000000..614c9cdac --- /dev/null +++ b/utils/read_el70xx_diag.sh @@ -0,0 +1,36 @@ +MID=$1 +SID=$2 + +echo "" +echo "#########################################################" +echo "Reading EL70xx status at master id $MID and slave id $SID:" +echo "" +echo "Saturated:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x1 + +echo "Over temperature:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x2 + +echo "Torque overload:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x3 + +echo "Under voltage:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x4 + +echo "Over voltage:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x5 + +echo "Short circuit A:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x6 + +echo "Short circuit B:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x7 + +echo "No control power:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x8 + +echo "Misc error:" +ethercat upload -m $MID -p $SID --type uint8 0xA010 0x9 +echo "" +echo "#########################################################" +echo "" diff --git a/utils/readme.md b/utils/readme.md index cdad4bebc..13777d43d 100644 --- a/utils/readme.md +++ b/utils/readme.md @@ -1,6 +1,11 @@ -# EtherCAT slave description file parser (ESI/XML) WIP +# ecmc utilities +## PDO read -## Call +Tool to read data from slaves (actually SDO data). + +## EtherCAT slave description file parser (ESI/XML) WIP + +Call: ``` #- Generate hw snippet (WIP) PDOS in top and (commented) SDOs in bottom: python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -d CMMT-ST-MP-S0 -r 0x00000021 -o test.txt | tee test.test @@ -8,3 +13,53 @@ python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -d EL7041-0052 -r 0x00100034 #- List available devices and version in the xml lib python3 parse_ec_esi_xml.py -b ../../beckhoff_xml/ -l -o slask.txt ``` + +### Known issues +* Outputfile seems not to be written. Pipe to file instead.. +* Outpuit need manual editing + + +## Read EL70xx diagnostic, read_el70xx_diag.sh + +A tool that reads error and warning state of a EL70xx stepper drive. The error and warning diagnostics are read from the 0xA010 register. + +Note: The PDO_read tool can also be used to read these diagnostics. + +The script must be executed on the ecmc server where the the EL70xx slave is connected. + +```bash +bash read_el70xx_diag.sh +``` + +Example: master 0, slave 3, drive under voltage warning +```bash +bash read_el7041_diag.sh 0 3 + +######################################################### +Reading EL7041 status at masterid 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 + +######################################################### + +``` + +For more information check docs for [Index A010 STM Diag data Ch.1](https://infosys.beckhoff.com/english.php?content=../content/1033/el70x1/2286662027.html&id=126846504617985959) + From 672a2809d0be5c774a09b38a1a5bec08101af5c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 16:19:46 +0200 Subject: [PATCH 044/128] Update docs --- hugo/content/manual/troubleshooting/motion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index dec2b1326..a3609a4dc 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -81,7 +81,7 @@ After changing this value you also need to change the drive scaling in the axis ## drive refuse to enable -First check the dedicated hardware drive panel for diagnostics. +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](hardware.md#el7041 error/warning) Possible reasons: 1. For systems with safety, tripp off STO or power to the drive might be cut by contactor. Check status of safety system. From bcd6276fd98b3ca8cf13d040169d86bdf14c34db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 16:29:57 +0200 Subject: [PATCH 045/128] Update docs --- hugo/content/manual/troubleshooting/motion.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index a3609a4dc..8b6b17576 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -30,7 +30,10 @@ A position lag error is normally genereated in the following situations: ### 1. motor torque to low -If possible, increase current to the motor. +1. 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. +2. Check motor data, can the motor deliver the required torque at the required speed. If not, then a motor with higher torque is needed. +3. Check the current setting of the motor. If possible increase the current setting to get a higher torque. + {{% notice warning %}} 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. {{% /notice %}} @@ -81,10 +84,10 @@ After changing this value you also need to change the drive scaling in the axis ## drive 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](hardware.md#el7041 error/warning) +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](hardware). Possible reasons: -1. For systems with safety, tripp off STO or power to the drive might be cut by contactor. Check status of safety system. +1. For systems with safety, tripp off STO or power to the drive removed by contactor. Check status of safety system. 2. Over current protection of 48V tripped. 3. No 48V connected. 4. ecmc PLC disabaling axis, check PLC sources. From 967551cb7e791e8de54bffc185cae426d2ebc29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 16:34:22 +0200 Subject: [PATCH 046/128] Update docs --- hugo/content/manual/troubleshooting/_index.md | 3 +++ .../manual/troubleshooting/ethercatCLI.md | 2 +- .../content/manual/troubleshooting/general.md | 6 ++++++ .../manual/troubleshooting/hardware.md | 2 +- hugo/content/manual/troubleshooting/manual.md | 21 +++++++++++++++++++ hugo/content/manual/troubleshooting/motion.md | 4 ++-- 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 hugo/content/manual/troubleshooting/manual.md diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index 3065330f5..333d89ed7 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -21,3 +21,6 @@ For motion related issues, a very short troubleshooting guide is provided [here] ### [troubles with hardware](hardware) For hardware related issues, a very short troubleshooting guide is provided [here](hardware). + +### [manual motion](manual) +Trigger manual motion (without motion ecmc-axis). diff --git a/hugo/content/manual/troubleshooting/ethercatCLI.md b/hugo/content/manual/troubleshooting/ethercatCLI.md index e1ba69daf..6066f0646 100644 --- a/hugo/content/manual/troubleshooting/ethercatCLI.md +++ b/hugo/content/manual/troubleshooting/ethercatCLI.md @@ -1,6 +1,6 @@ +++ title = "ethercat command line interface" -weight = 11 +weight = 15 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/general.md b/hugo/content/manual/troubleshooting/general.md index 12d454521..20b2ffc21 100644 --- a/hugo/content/manual/troubleshooting/general.md +++ b/hugo/content/manual/troubleshooting/general.md @@ -1,4 +1,10 @@ ++++ +title = "ethercat command line interface" +weight = 12 +chapter = false ++++ + ### culprit From experience, very few issues are related to the EtherCAT hardware itself. diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index a0d139124..86a5c8583 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -1,6 +1,6 @@ +++ title = "hardware" -weight = 11 +weight = 13 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/manual.md b/hugo/content/manual/troubleshooting/manual.md new file mode 100644 index 000000000..00f905751 --- /dev/null +++ b/hugo/content/manual/troubleshooting/manual.md @@ -0,0 +1,21 @@ ++++ +title = "manual motion" +weight = 16 +chapter = false ++++ + +## force manual motion +{{% notice warning %}} +This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! +{{% /notice %}} +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 diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index 8b6b17576..d0e8e78af 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -1,6 +1,6 @@ +++ title = "motion" -weight = 12 +weight = 14 chapter = false +++ @@ -97,7 +97,7 @@ Possible reasons: ## force manual motion {{% notice warning %}} -This procedure is for experst only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! +This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! {{% /notice %}} 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. From ded59339862cf138f123d59d1d850ff003bca7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 16:39:59 +0200 Subject: [PATCH 047/128] Udpate docs --- hugo/content/manual/troubleshooting/general.md | 2 +- hugo/content/manual/troubleshooting/hardware.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hugo/content/manual/troubleshooting/general.md b/hugo/content/manual/troubleshooting/general.md index 20b2ffc21..5ce5b9485 100644 --- a/hugo/content/manual/troubleshooting/general.md +++ b/hugo/content/manual/troubleshooting/general.md @@ -1,6 +1,6 @@ +++ -title = "ethercat command line interface" +title = "general" weight = 12 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 86a5c8583..7e0169f8f 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -10,11 +10,11 @@ In the standard setup at PSI over current protection modules are used to feed 24 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. {{% notice warning %}} -Before pressing the buttons make sure it's safe to power on the system. +Before pressing the buttons, check the electrical drawings. Make sure it's safe to power on the system. {{% /notice %}} #### el9221-5000 -The EL9221-5000 has one channel and can therefore only the top button is needed to be pressed. +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. From 8f314a59022c3954b40f4ee7d6de384aae74c984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 16:47:12 +0200 Subject: [PATCH 048/128] Update general.md --- .../content/manual/troubleshooting/general.md | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/hugo/content/manual/troubleshooting/general.md b/hugo/content/manual/troubleshooting/general.md index 5ce5b9485..d313e5a27 100644 --- a/hugo/content/manual/troubleshooting/general.md +++ b/hugo/content/manual/troubleshooting/general.md @@ -16,21 +16,31 @@ Even more likely is human error, such as: * ... #### check the status -Before anything is restarted or power cycled, check the status of the slaves. -Either from a dedicated shell, or from within the `iocsh`. +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 +* ... -If all slaves are in 'OP' state, at least data is exchanged between the hardware and the master. +```bash +caqtdm -macro "IOC=" ecmcMain.ui +``` -Depending on the integrator and overview panel might exist. -Consult this panel for further details. 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 {{% notice warning %}} Blindly restarting the IOC, with only partially working EtherCAT hardware, WILL RESULT IN TOTAL FAILURE OF THE IOC!!! {{% /notice %}} Check the hardware BEFORE restarting the IOC! - From 243ee1d64683863ed945124dfe833cc153816c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 17:17:04 +0200 Subject: [PATCH 049/128] Update docs with latency troubleshooting --- .../manual/troubleshooting/hardware.md | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 7e0169f8f..24ca6372f 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -123,5 +123,54 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepp ``` {{% notice info %}} -For the EL703x drives the nominal voltage must be set to 24V. +For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). +{{% /notice %}} + +### 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 teh ecmc_rt thread can be related to: +1. The generic device driver is used +2. High load on system +3. ... + +#### 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/\/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 +Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. +{{% notice warning %}} +At PSI, core 0 is always isolated, do not move any threads to core 0. +{{% /notice %}} + +In order to pin teh 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" + +``` +{{% notice info %}} +cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. {{% /notice %}} From 8582d2ccaa968a023bbe2095c2ff3145f5f88fd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Wed, 11 Sep 2024 17:24:23 +0200 Subject: [PATCH 050/128] update docs --- hugo/content/manual/troubleshooting/hardware.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 24ca6372f..93fff3926 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -150,6 +150,20 @@ In this case, the system will first try to use igb driver, if not possible it wi 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" +``` +{{% notice info %}} +Theer 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. +{{% /notice %}} + +** Affinity** Setting the affinity of the ecmc realtiem thread can often improve the performace. First check how many cores the controller has. {{% notice warning %}} At PSI, core 0 is always isolated, do not move any threads to core 0. @@ -162,15 +176,14 @@ ${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" - ``` {{% notice info %}} cbLow is created at iocInit, therefore the "epicsThreadSetAffinity" must be executed with the "afterInit" command. {{% /notice %}} + From 1a5bc18adcceb5e6698e473c8d9072ffc4dc2ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 08:40:08 +0200 Subject: [PATCH 051/128] restructure manual --- .../content/manual/{PLC => PLC_cfg}/_index.md | 2 +- .../manual/{PLC => PLC_cfg}/best_practice.md | 2 +- .../manual/{PLC => PLC_cfg}/plcSyntax.md | 0 hugo/content/manual/general_cfg/_index.md | 10 +++++ .../data_storage.md | 0 .../ecmc_command_ref.md} | 10 ++--- .../iocsh_utils.md | 2 +- .../startup/_index.md | 0 .../startup/modes.md | 0 .../manual/{axis => motion_cfg}/_index.md | 12 +++--- .../manual/{axis => motion_cfg}/axisPLC.md | 0 .../manual/{axis => motion_cfg}/axisYaml.md | 0 .../best_practice/_index.md | 2 +- .../best_practice/servo.md | 0 .../best_practice/stepper_biss_c.md | 0 .../manual/{axis => motion_cfg}/direction.md | 0 .../manual/{axis => motion_cfg}/homing.md | 0 .../manual/{axis => motion_cfg}/scaling.md | 0 hugo/content/manual/troubleshooting/_index.md | 11 +++-- .../manual/troubleshooting/ethercatCLI.md | 2 +- .../manual/troubleshooting/hardware.md | 26 ++++++++++- hugo/content/manual/troubleshooting/manual.md | 2 +- hugo/content/manual/troubleshooting/motion.md | 43 +++---------------- hugo/content/manual/troubleshooting/tuning.md | 25 +++++++++++ 24 files changed, 88 insertions(+), 61 deletions(-) rename hugo/content/manual/{PLC => PLC_cfg}/_index.md (99%) rename hugo/content/manual/{PLC => PLC_cfg}/best_practice.md (99%) rename hugo/content/manual/{PLC => PLC_cfg}/plcSyntax.md (100%) create mode 100644 hugo/content/manual/general_cfg/_index.md rename hugo/content/manual/{configuration => general_cfg}/data_storage.md (100%) rename hugo/content/manual/{configuration/_index.md => general_cfg/ecmc_command_ref.md} (66%) rename hugo/content/manual/{configuration => general_cfg}/iocsh_utils.md (99%) rename hugo/content/manual/{configuration => general_cfg}/startup/_index.md (100%) rename hugo/content/manual/{configuration => general_cfg}/startup/modes.md (100%) rename hugo/content/manual/{axis => motion_cfg}/_index.md (85%) rename hugo/content/manual/{axis => motion_cfg}/axisPLC.md (100%) rename hugo/content/manual/{axis => motion_cfg}/axisYaml.md (100%) rename hugo/content/manual/{axis => motion_cfg}/best_practice/_index.md (96%) rename hugo/content/manual/{axis => motion_cfg}/best_practice/servo.md (100%) rename hugo/content/manual/{axis => motion_cfg}/best_practice/stepper_biss_c.md (100%) rename hugo/content/manual/{axis => motion_cfg}/direction.md (100%) rename hugo/content/manual/{axis => motion_cfg}/homing.md (100%) rename hugo/content/manual/{axis => motion_cfg}/scaling.md (100%) create mode 100644 hugo/content/manual/troubleshooting/tuning.md diff --git a/hugo/content/manual/PLC/_index.md b/hugo/content/manual/PLC_cfg/_index.md similarity index 99% rename from hugo/content/manual/PLC/_index.md rename to hugo/content/manual/PLC_cfg/_index.md index bc7398208..ee19a0c1c 100644 --- a/hugo/content/manual/PLC/_index.md +++ b/hugo/content/manual/PLC_cfg/_index.md @@ -1,5 +1,5 @@ +++ -title = "PLC" +title = "PLC cfg" weight = 15 chapter = false +++ diff --git a/hugo/content/manual/PLC/best_practice.md b/hugo/content/manual/PLC_cfg/best_practice.md similarity index 99% rename from hugo/content/manual/PLC/best_practice.md rename to hugo/content/manual/PLC_cfg/best_practice.md index f53877b11..76a7377a6 100644 --- a/hugo/content/manual/PLC/best_practice.md +++ b/hugo/content/manual/PLC_cfg/best_practice.md @@ -1,5 +1,5 @@ +++ -title = "PLC best practice" +title = "best practice" weight = 10 chapter = false +++ diff --git a/hugo/content/manual/PLC/plcSyntax.md b/hugo/content/manual/PLC_cfg/plcSyntax.md similarity index 100% rename from hugo/content/manual/PLC/plcSyntax.md rename to hugo/content/manual/PLC_cfg/plcSyntax.md diff --git a/hugo/content/manual/general_cfg/_index.md b/hugo/content/manual/general_cfg/_index.md new file mode 100644 index 000000000..3e9ab3f89 --- /dev/null +++ b/hugo/content/manual/general_cfg/_index.md @@ -0,0 +1,10 @@ ++++ +title = "general cfg" +weight = 7 +chapter = false ++++ + +## [startup.cmd](startup) +## [data storage](data_storage) +## [iocsh utils](iocsh_utils) +## [ecmc command reference](ecmc_command_reference) diff --git a/hugo/content/manual/configuration/data_storage.md b/hugo/content/manual/general_cfg/data_storage.md similarity index 100% rename from hugo/content/manual/configuration/data_storage.md rename to hugo/content/manual/general_cfg/data_storage.md diff --git a/hugo/content/manual/configuration/_index.md b/hugo/content/manual/general_cfg/ecmc_command_ref.md similarity index 66% rename from hugo/content/manual/configuration/_index.md rename to hugo/content/manual/general_cfg/ecmc_command_ref.md index e099d0fa4..cda5a48cf 100644 --- a/hugo/content/manual/configuration/_index.md +++ b/hugo/content/manual/general_cfg/ecmc_command_ref.md @@ -1,16 +1,12 @@ +++ -title = "configuration" -weight = 7 +title = "ecmc command reference" +weight = 20 chapter = false +++ -## [startup.cmd](startup) -## [Data Storage](data_storage) -## [iocsh Utils](iocsh_utils) -## [ecmc Command Reference](https://epics-modules.github.io/ecmc/files.html) +## [ecmc command reference](https://epics-modules.github.io/ecmc/files.html) * [ethercat](https://epics-modules.github.io/ecmc/ecmcEthercat_8h.html) * [motion](https://epics-modules.github.io/ecmc/ecmcMotion_8h.html) * [general](https://epics-modules.github.io/ecmc/ecmcGeneral_8h.html) * [misc](https://epics-modules.github.io/ecmc/ecmcMisc_8h.html) * [plc](https://epics-modules.github.io/ecmc/ecmcPLC_8h.html) - diff --git a/hugo/content/manual/configuration/iocsh_utils.md b/hugo/content/manual/general_cfg/iocsh_utils.md similarity index 99% rename from hugo/content/manual/configuration/iocsh_utils.md rename to hugo/content/manual/general_cfg/iocsh_utils.md index 1f0e5c65a..5097251a0 100644 --- a/hugo/content/manual/configuration/iocsh_utils.md +++ b/hugo/content/manual/general_cfg/iocsh_utils.md @@ -1,6 +1,6 @@ +++ title = "iocsh utilities" -weight = 20 +weight = 17 chapter = false +++ diff --git a/hugo/content/manual/configuration/startup/_index.md b/hugo/content/manual/general_cfg/startup/_index.md similarity index 100% rename from hugo/content/manual/configuration/startup/_index.md rename to hugo/content/manual/general_cfg/startup/_index.md diff --git a/hugo/content/manual/configuration/startup/modes.md b/hugo/content/manual/general_cfg/startup/modes.md similarity index 100% rename from hugo/content/manual/configuration/startup/modes.md rename to hugo/content/manual/general_cfg/startup/modes.md diff --git a/hugo/content/manual/axis/_index.md b/hugo/content/manual/motion_cfg/_index.md similarity index 85% rename from hugo/content/manual/axis/_index.md rename to hugo/content/manual/motion_cfg/_index.md index af6018787..2e2d1680a 100644 --- a/hugo/content/manual/axis/_index.md +++ b/hugo/content/manual/motion_cfg/_index.md @@ -1,5 +1,5 @@ +++ -title = "axis" +title = "motion cfg" weight = 10 chapter = false +++ @@ -9,7 +9,7 @@ chapter = false 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. -### [axis yaml config](axisYaml) +### [yaml config](axisYaml) 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. @@ -19,15 +19,15 @@ From v8+ yaml files are linted for syntactic errors, observe the iocsh for warni 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. -### [axis plc yaml config](axisPLC) +### [plc yaml config](axisPLC) Syncronization configurations -### [Scaling](scaling) +### [scaling](scaling) Configuration of scaling -### [Direction](direction) +### [direction](direction) Defining the direction of motion -### [Homing](homing) +### [homing](homing) Configuration of homing diff --git a/hugo/content/manual/axis/axisPLC.md b/hugo/content/manual/motion_cfg/axisPLC.md similarity index 100% rename from hugo/content/manual/axis/axisPLC.md rename to hugo/content/manual/motion_cfg/axisPLC.md diff --git a/hugo/content/manual/axis/axisYaml.md b/hugo/content/manual/motion_cfg/axisYaml.md similarity index 100% rename from hugo/content/manual/axis/axisYaml.md rename to hugo/content/manual/motion_cfg/axisYaml.md diff --git a/hugo/content/manual/axis/best_practice/_index.md b/hugo/content/manual/motion_cfg/best_practice/_index.md similarity index 96% rename from hugo/content/manual/axis/best_practice/_index.md rename to hugo/content/manual/motion_cfg/best_practice/_index.md index 80ab63acc..0aa044dad 100644 --- a/hugo/content/manual/axis/best_practice/_index.md +++ b/hugo/content/manual/motion_cfg/best_practice/_index.md @@ -1,5 +1,5 @@ +++ -title = "axis best practice" +title = "best practice" weight = 30 chapter = false +++ diff --git a/hugo/content/manual/axis/best_practice/servo.md b/hugo/content/manual/motion_cfg/best_practice/servo.md similarity index 100% rename from hugo/content/manual/axis/best_practice/servo.md rename to hugo/content/manual/motion_cfg/best_practice/servo.md diff --git a/hugo/content/manual/axis/best_practice/stepper_biss_c.md b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md similarity index 100% rename from hugo/content/manual/axis/best_practice/stepper_biss_c.md rename to hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md diff --git a/hugo/content/manual/axis/direction.md b/hugo/content/manual/motion_cfg/direction.md similarity index 100% rename from hugo/content/manual/axis/direction.md rename to hugo/content/manual/motion_cfg/direction.md diff --git a/hugo/content/manual/axis/homing.md b/hugo/content/manual/motion_cfg/homing.md similarity index 100% rename from hugo/content/manual/axis/homing.md rename to hugo/content/manual/motion_cfg/homing.md diff --git a/hugo/content/manual/axis/scaling.md b/hugo/content/manual/motion_cfg/scaling.md similarity index 100% rename from hugo/content/manual/axis/scaling.md rename to hugo/content/manual/motion_cfg/scaling.md diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index 333d89ed7..28aacc782 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -9,17 +9,20 @@ chapter = false 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](general) +For motion related issues, a very short troubleshooting guide is provided [here](motion). + ### [command line interface](ethercatcli) A very powerful tool is provided through the command line. See a summary, incl. some examples of what possible [here](ethercatcli). -### [general problems](general) +### [motion](motion) For motion related issues, a very short troubleshooting guide is provided [here](motion). -### [troubles with motion](motion) -For motion related issues, a very short troubleshooting guide is provided [here](motion). +### [drive tuning](tuning) +Tune drive control loops -### [troubles with hardware](hardware) +### [hardware](hardware) For hardware related issues, a very short troubleshooting guide is provided [here](hardware). ### [manual motion](manual) diff --git a/hugo/content/manual/troubleshooting/ethercatCLI.md b/hugo/content/manual/troubleshooting/ethercatCLI.md index 6066f0646..56178b64b 100644 --- a/hugo/content/manual/troubleshooting/ethercatCLI.md +++ b/hugo/content/manual/troubleshooting/ethercatCLI.md @@ -1,6 +1,6 @@ +++ title = "ethercat command line interface" -weight = 15 +weight = 13 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 93fff3926..0ec454e07 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -1,10 +1,14 @@ +++ title = "hardware" -weight = 13 +weight = 16 chapter = false +++ -### over current protection el9227-5500, el9221-5000 +### 1. [over current protection](#over current protection) +### 2. [el7041 error/warning](#el7041 error/warning) +### 3. [latency issues](#latency issues) + +### 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. @@ -126,6 +130,24 @@ ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepp For the EL703x drives the nominal voltage must be set to 24V (ecmccomp handles this automatically). {{% /notice %}} +### 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. 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. + ### 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 teh ecmc_rt thread can be related to: diff --git a/hugo/content/manual/troubleshooting/manual.md b/hugo/content/manual/troubleshooting/manual.md index 00f905751..7da403e24 100644 --- a/hugo/content/manual/troubleshooting/manual.md +++ b/hugo/content/manual/troubleshooting/manual.md @@ -1,6 +1,6 @@ +++ title = "manual motion" -weight = 16 +weight = 17 chapter = false +++ diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index d0e8e78af..bf65d75d9 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -4,6 +4,11 @@ weight = 14 chapter = false +++ +### 1. [both_limits error](#both_limits error) +### 2. [position lag error, (following error), tuning](#position lag error (following error)) +### 3. [latency issues](#latency issues) +### 4. [drive refuse to enable](#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: @@ -21,7 +26,7 @@ By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binar ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" ``` -## position lag error (following error): +## position lag error (following error) A position lag error is normally genereated in the following situations: 1. The motor torque is too low, making it hard for the motor to keep up with the setpoint. 2. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. @@ -45,31 +50,13 @@ One way to test if the scaling is correct is to set all controller parameters (e ### 3. the velocity setpoint is too high resulting in stall If a stepper motor stalls because of too high velocity there's a few thing that can be done in order to improve the ability to reach higehr velocities: 1. Add a damper: This is nromally very effichient but not always possible. -2. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive) +2. Tune controller parameters (both position loop in ecmc andn the controller loops in the drive), see hardware/tuning 3. If possible, test to increase or reduce current (make sure you do not burn the motor if increasing). {{% notice warning %}} 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. {{% /notice %}} -#### 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. 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. - ### 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: ``` @@ -94,19 +81,3 @@ Possible reasons: 5. Motion axis in error state. Some errors prevent the axis from being enabled. Check axis error state 6. Drive hardware enable input not set high (valid for EP7211-0034, EL70xx if special cfgs). 7. Axis object configured with external interlock (yaml->input.interlock). - -## force manual motion -{{% notice warning %}} -This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! -{{% /notice %}} -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 diff --git a/hugo/content/manual/troubleshooting/tuning.md b/hugo/content/manual/troubleshooting/tuning.md new file mode 100644 index 000000000..1ac93f799 --- /dev/null +++ b/hugo/content/manual/troubleshooting/tuning.md @@ -0,0 +1,25 @@ ++++ +title = "hardware" +weight = 15 +chapter = false ++++ + +### 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. 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. + From 85a91b17558ba099bf32488af66b778cea72f888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 10:09:43 +0200 Subject: [PATCH 052/128] restructure manual --- hugo/content/manual/PLC_cfg/_index.md | 2 +- hugo/content/manual/PLC_cfg/best_practice.md | 10 +++--- hugo/content/manual/PLC_cfg/plcSyntax.md | 2 +- hugo/content/manual/general_cfg/_index.md | 4 +-- .../manual/general_cfg/data_storage.md | 6 ++-- hugo/content/manual/motion_cfg/_index.md | 2 +- hugo/content/manual/motion_cfg/axisPLC.md | 2 +- hugo/content/manual/motion_cfg/axisYaml.md | 2 +- .../manual/motion_cfg/best_practice/servo.md | 10 +++--- .../best_practice/stepper_biss_c.md | 31 +++++++++++++++++-- hugo/content/manual/motion_cfg/direction.md | 2 +- hugo/content/manual/motion_cfg/homing.md | 6 ++-- hugo/content/manual/motion_cfg/scaling.md | 14 ++++----- hugo/content/manual/troubleshooting/_index.md | 2 +- 14 files changed, 62 insertions(+), 33 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/_index.md b/hugo/content/manual/PLC_cfg/_index.md index ee19a0c1c..bc7398208 100644 --- a/hugo/content/manual/PLC_cfg/_index.md +++ b/hugo/content/manual/PLC_cfg/_index.md @@ -1,5 +1,5 @@ +++ -title = "PLC cfg" +title = "PLC" weight = 15 chapter = false +++ diff --git a/hugo/content/manual/PLC_cfg/best_practice.md b/hugo/content/manual/PLC_cfg/best_practice.md index 76a7377a6..f5a2f8837 100644 --- a/hugo/content/manual/PLC_cfg/best_practice.md +++ b/hugo/content/manual/PLC_cfg/best_practice.md @@ -4,7 +4,7 @@ weight = 10 chapter = false +++ -## Best Practice +## best practice Here you can find some best practice configurations for common usecases. * Macros * MSI include, substitute @@ -12,7 +12,7 @@ Here you can find some best practice configurations for common usecases. The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) -### Macros +### macros Use of macros makes the code more generic. When loading a PLC file with "loadPLCFile.cmd", custom macros can be defined in "PLC\_MACROS": ```shell ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cfg/, SAMPLE_RATE_MS=1000, PLC_MACROS='BO_S_ID=${ECMC_EC_SLAVE_NUM}'" @@ -61,7 +61,7 @@ ec0.s10.binaryOutput01:=not(ec0.s10.binaryOutput01); #println('State: ', ec0.s10.binaryOutput01); ``` -### Include and substitute +### include and substitute Since all PLC files and PLC libs are parsed through MSI the "include" and "substitute" commands can be used. When using the include command, the file location dir of the file must be added in the INC parameter when loading the PLC: @@ -70,7 +70,7 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=./cfg/main.plc, INC=.:./cf ``` The "INC" parameter can contain several directories separated with a ":", making it possible to include PLC files from several locations/modules. -#### Example: Toggle a few outputs +#### example: Toggle a few outputs As a demo usecase let's consider that a few outputs needs to be toggled. NOTE: There are simpler ways to write this specifc code but it's used to demo how code can be divided. @@ -102,7 +102,7 @@ The resulting code will toggle two different outputs, the state of the last outp 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 +### 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) diff --git a/hugo/content/manual/PLC_cfg/plcSyntax.md b/hugo/content/manual/PLC_cfg/plcSyntax.md index ac0f6ee92..3de08ed52 100644 --- a/hugo/content/manual/PLC_cfg/plcSyntax.md +++ b/hugo/content/manual/PLC_cfg/plcSyntax.md @@ -1,5 +1,5 @@ +++ -title = "PLC syntax help" +title = "syntax" weight = 15 chapter = false +++ diff --git a/hugo/content/manual/general_cfg/_index.md b/hugo/content/manual/general_cfg/_index.md index 3e9ab3f89..0e1c3623e 100644 --- a/hugo/content/manual/general_cfg/_index.md +++ b/hugo/content/manual/general_cfg/_index.md @@ -1,5 +1,5 @@ +++ -title = "general cfg" +title = "general" weight = 7 chapter = false +++ @@ -7,4 +7,4 @@ chapter = false ## [startup.cmd](startup) ## [data storage](data_storage) ## [iocsh utils](iocsh_utils) -## [ecmc command reference](ecmc_command_reference) +## [ecmc command reference](ecmc_command_ref) diff --git a/hugo/content/manual/general_cfg/data_storage.md b/hugo/content/manual/general_cfg/data_storage.md index 43ce02790..2a12be429 100644 --- a/hugo/content/manual/general_cfg/data_storage.md +++ b/hugo/content/manual/general_cfg/data_storage.md @@ -4,7 +4,7 @@ weight = 16 chapter = false +++ -## Data storage examples +## data storage examples This dir contains two examples: [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/test/dataStorage). 1. Continiously add value to data storage. Push to epics by hw trigger. @@ -13,7 +13,7 @@ Data buffered data can be accessed by the "IOC_TEST:ds0-Data-Act" waveform pv (N 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 +### 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. @@ -51,7 +51,7 @@ static.highlimOld:=ax1.mon.highlim; ``` -### 2 Push to epics by epics pv trigger +### 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 "IOC_TEST:Set-PushDataTrigger-RB" pv. diff --git a/hugo/content/manual/motion_cfg/_index.md b/hugo/content/manual/motion_cfg/_index.md index 2e2d1680a..39d1d59a3 100644 --- a/hugo/content/manual/motion_cfg/_index.md +++ b/hugo/content/manual/motion_cfg/_index.md @@ -1,5 +1,5 @@ +++ -title = "motion cfg" +title = "motion" weight = 10 chapter = false +++ diff --git a/hugo/content/manual/motion_cfg/axisPLC.md b/hugo/content/manual/motion_cfg/axisPLC.md index 3ed3a9e01..29d7565a4 100644 --- a/hugo/content/manual/motion_cfg/axisPLC.md +++ b/hugo/content/manual/motion_cfg/axisPLC.md @@ -1,5 +1,5 @@ +++ -title = "axis PLC" +title = "PLC" weight = 26 chapter = false +++ diff --git a/hugo/content/manual/motion_cfg/axisYaml.md b/hugo/content/manual/motion_cfg/axisYaml.md index 3021849d8..9c541ad7e 100644 --- a/hugo/content/manual/motion_cfg/axisYaml.md +++ b/hugo/content/manual/motion_cfg/axisYaml.md @@ -1,5 +1,5 @@ +++ -title = "axis yaml configuration" +title = "yaml configuration" weight = 15 chapter = false +++ diff --git a/hugo/content/manual/motion_cfg/best_practice/servo.md b/hugo/content/manual/motion_cfg/best_practice/servo.md index 2ad7c896c..5a8905352 100644 --- a/hugo/content/manual/motion_cfg/best_practice/servo.md +++ b/hugo/content/manual/motion_cfg/best_practice/servo.md @@ -7,16 +7,16 @@ chapter = false * Lab test stage (1mm/rev) * Motor : AM8111-0F20 -## Scalings +### scalings Config for scaling in mm, mm/s, mm/s2 -## Motor AM8111-XFX0 +### motor AM8111-XFX0 Data about the motor can be found here: https://infosys.beckhoff.com/english.php?content=../content/1033/am8100/index.html&id= Important for scaling factors in axis.yaml is the motor pole count. For the AM8111-XFX0 motor the pole count is 6. -## Encoder scaling +### encoder scaling Only the encoder integrated encoder is configured in this example. The specification of the encoder for a AM8111-0F20 motor: ``` @@ -63,7 +63,7 @@ drive: reset: 7 ``` -## Switches +### 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: ``` @@ -71,3 +71,5 @@ axis: id: ${AX_ID=1} feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches ``` + +#### diff --git a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md index 04bc91c8f..2b274be38 100644 --- a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md @@ -9,7 +9,7 @@ chapter = false * RLS BISS-C linear encoder (absolute) * Open loop encoder (incremental) -## Scalings +## scalings Config for scaling in mm, mm/s, mm/s2 ### encoder scalings @@ -94,7 +94,7 @@ drive: - 14 # Error 2 (if no drive error bit then leave empty) ``` -## Switches +## 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: ``` @@ -103,3 +103,30 @@ axis: 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: +``` +input: + 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 +``` + +{{% notice warning %}} +Always verify where the switches are connected in the electrical drawings. +{{% /notice %}} + +All switches in the "input" section needs to be linked. If not used, then the simulation registers, "ONE" and "ZERO", can be used: +* 32 bit register of ones (rw): ec\.s\.ONE. +* 32 bit register of zeros (rw): ec\.s\.ZERO. + +Example, Use bit 1 in the ONE register of slave 1: +``` +ec0.s1.ONE.1 +``` + +{{% notice tip %}} +If no ethercat slave is defined, slave number "-1" can be used: ec\.s-1.ONE. +{{% /notice %}} diff --git a/hugo/content/manual/motion_cfg/direction.md b/hugo/content/manual/motion_cfg/direction.md index a3fbee202..daf3636f6 100644 --- a/hugo/content/manual/motion_cfg/direction.md +++ b/hugo/content/manual/motion_cfg/direction.md @@ -47,7 +47,7 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041" ${SCRIPTEXEC} ${ecmccomp_DIR}applyComponent.cmd "COMP=Motor-Generic-2Phase-Stepper, MACROS='I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230,INV_DIR=1'" ``` -## ECMC scaling +## ecmc scaling A negative numerator can be used to change the direction of motion. Refer to the [scaling](../scaling) section for details. diff --git a/hugo/content/manual/motion_cfg/homing.md b/hugo/content/manual/motion_cfg/homing.md index 99cb5470a..2214ecddb 100644 --- a/hugo/content/manual/motion_cfg/homing.md +++ b/hugo/content/manual/motion_cfg/homing.md @@ -1,10 +1,10 @@ +++ -title = "axis homing" +title = "homing" weight = 25 chapter = false +++ -## Homing +## homing The follwoing sequences are available: ``` @@ -180,7 +180,7 @@ Currently used for smaract: [smaracat example](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/test/smaract) In this exmaple also the drive modes is automatically handled by ecmc. -## Setting polarity of home sensor +## setting 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: ``` "Cfg.SetAxisMonHomeSwitchPolarity(int axisIndex, int polarity)"; diff --git a/hugo/content/manual/motion_cfg/scaling.md b/hugo/content/manual/motion_cfg/scaling.md index e47eab4ff..fa1a3bc04 100644 --- a/hugo/content/manual/motion_cfg/scaling.md +++ b/hugo/content/manual/motion_cfg/scaling.md @@ -1,19 +1,19 @@ +++ -title = "axis scaling" +title = "scaling" weight = 20 chapter = false +++ By popular demand, the topic scaling will be discusses in closer detail. -ECMC has to scaling factors for each joint, firstly the [drive](#drive-scaling) scaling, secondly the [encoder](#encoder-scaling) scaling. +ecmc has to scaling factors for each joint, firstly the [drive](#drive-scaling) scaling, secondly the [encoder](#encoder-scaling) scaling. {{% notice warning %}} Changes 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. {{% /notice %}} -## Drive scaling +## 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](#stepper-motor-drives) and [servo drives](#servo-motor-drives) @@ -33,7 +33,7 @@ drive: denominator: 32768 # I/O range 2^15, because 16-bit register, half is forward, the other half is backward ``` -##### Explanation +##### 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. @@ -53,7 +53,7 @@ drive: denominator: 32768 # I/O range 2^15, because 16-bit register, half is forward, the other half is backward ``` -##### Explanation +##### 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, @@ -82,7 +82,7 @@ drive: denominator: 2147483648 # I/O range 2^31, because 32-bit register, half is forward, the other half is backward ``` -## Encoder scaling +## encoder scaling This scaling ratio describes the relation of encoder counts and engineering units of the axis. Unlike the drive scaling, the encoder scaling is much simpler. @@ -117,7 +117,7 @@ encoder: bits: 16 # Total bit count of encoder raw data ``` -#### Explanation +#### 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`. diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index 28aacc782..7dfba7c93 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -10,7 +10,7 @@ Due to the complexity an EtherCAT bus topology can assume, troubleshooting can b This guide should provide the basic means to diagnose simple errors and is by no means complete! ### [general problems](general) -For motion related issues, a very short troubleshooting guide is provided [here](motion). +For general issues, a very short troubleshooting guide is provided [here](general). ### [command line interface](ethercatcli) A very powerful tool is provided through the command line. From c167bed47e37641879394bd792145b1ed2196459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 11:09:48 +0200 Subject: [PATCH 053/128] update docs --- hugo/content/manual/PLC_cfg/_index.md | 15 +- hugo/content/manual/PLC_cfg/best_practice.md | 2 +- hugo/content/manual/PLC_cfg/function_libs.md | 90 + hugo/content/manual/PLC_cfg/plcSyntax.md | 1447 +++++++++-------- .../manual/motion_cfg/best_practice/_index.md | 2 +- .../manual/motion_cfg/best_practice/servo.md | 6 +- .../best_practice/stepper_biss_c.md | 5 +- 7 files changed, 836 insertions(+), 731 deletions(-) create mode 100644 hugo/content/manual/PLC_cfg/function_libs.md diff --git a/hugo/content/manual/PLC_cfg/_index.md b/hugo/content/manual/PLC_cfg/_index.md index bc7398208..99ebfa80b 100644 --- a/hugo/content/manual/PLC_cfg/_index.md +++ b/hugo/content/manual/PLC_cfg/_index.md @@ -2,16 +2,25 @@ title = "PLC" weight = 15 chapter = false -+++ ++++ In `ECMC`, PLCs are a very powerful tool to handle EtherCAT data in real-time. Since `ecmccfg` v7, the PLCs can be instantiated from: +- [pure text files](#pure-text-files), classic ecmc PLC - [pure yaml](#pure-yaml) files or - text files, with [yaml header](#yaml-header). +## pure text files +The simplest and most generic way to load plc file is by the loadPLCFile.cmd command: +``` +${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCFile.cmd, "FILE=, INC=, SAMPLE_RATE_MS=, PLC_MACROS=''" +``` + +## pure yaml + {{% notice info %}} -Backwards compatibility for classic, text based PLCs is assured. +Backwards compatibility for classic, text based PLCs is assured for yaml based. {{% /notice %}} {{% notice warning %}} @@ -22,8 +31,6 @@ Backwards compatibility for classic, text based PLCs is assured. Indent with 2 spaces. {{% /notice %}} -## pure yaml - All keys are mandatory. - `id`: PLC id, unique **uint** diff --git a/hugo/content/manual/PLC_cfg/best_practice.md b/hugo/content/manual/PLC_cfg/best_practice.md index f5a2f8837..81074013a 100644 --- a/hugo/content/manual/PLC_cfg/best_practice.md +++ b/hugo/content/manual/PLC_cfg/best_practice.md @@ -1,6 +1,6 @@ +++ title = "best practice" -weight = 10 +weight = 20 chapter = false +++ diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md new file mode 100644 index 000000000..2e17f50b3 --- /dev/null +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -0,0 +1,90 @@ ++++ +title = "function libs" +weight = 17 +chapter = false ++++ + + +## PLC function libs: +Function libs can be loaded into ecmc-PLCs +``` +${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" +``` +The functions must be defined accordning to template: +``` +function (,...) { + ; +} + +also without param is allowed: +function () { + ; +} + +``` +* For syntax of the "code body", check the exprtk website. +* Several functions can be defined in the same file. +* 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). +* "#" as a first char in a line is considered a comment (the line will be removed before compile). +* MSI: The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check the msi documentation/help. + +### Can be used in a function: +1. The parameters +2. Other functions (also recursive) +3. The normal ecmc function libs: + * motion: mc_* + * ethercat: ec_* + * data storages: ds_*, + * master 2 master: m2m_* +4. the exprtk functions libs: + * println + * print + * open + * close + * write + * read", + * getline + * eof + 5. vectors in the calculations (but NOT as parameter or return value). + +### "ecmc variables" can _NOT_ be used/accessed in a functions: +1. EtherCAT I/0 direct access ec.s.* +2. Data storage variables: ds.* +3. Motion variables: ax.* +4. Static variables: static.* +5. Global variables: global.* +6. Vectors as parameter or return value (only first value will be passed). + +### A function lib file example +``` +# 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)); +} +``` diff --git a/hugo/content/manual/PLC_cfg/plcSyntax.md b/hugo/content/manual/PLC_cfg/plcSyntax.md index 3de08ed52..b7bff8bb2 100644 --- a/hugo/content/manual/PLC_cfg/plcSyntax.md +++ b/hugo/content/manual/PLC_cfg/plcSyntax.md @@ -51,6 +51,14 @@ PLC can access: [Function](#functions) examples are given at the end. +{{% notice tip %}} +Custom function libs in exprtk syntax can be added and loaded to the PLC objects. +{{% /notice %}} + +{{% notice tip %}} +Custom plc functions can be written in c in plugins. +{{% /notice %}} + ### general ```shell @@ -79,755 +87,752 @@ PLC can access: ``` ### variables -Below the ECMC specific accessible variables and functions are listed: +#### generic ```shell -# 1. static. Static variable. Initiated to 0. (rw) -# Access only in the PLC where defined. -# Will keep value between execution -# loops. -# 2. global. Global variable. Initiated to 0. (rw) -# Access from all PLCs. -# Will keep value between execution -# loops. -# 3. var Local variable (exprtk syntax) (rw) -# Will NOT keep value between -# execution loops. +# 1. static. Static variable. Initiated to 0. (rw) +# Access only in the PLC where defined. +# Will keep value between execution +# loops. +# 2. global. Global variable. Initiated to 0. (rw) +# Access from all PLCs. +# Will keep value between execution +# loops. +# 3. var Local variable (exprtk syntax) (rw) +# Will NOT keep value between +# execution loops. ``` -### process data +#### EtherCAT ```shell -# EtherCAT data: -# 1. ec.s. ethetcat data (rw) -# ecid: ethercat master index -# sid: ethercat slave bus position -# alias: entry name as defined in -# "Cfg.EcAddEntryComplete() -# 2. ec.masterstatus Status of master (1=OK) +# 1. ec.s. ethetcat data (rw) +# ecid: ethercat master index +# sid: ethercat slave bus position +# alias: entry name as defined in +# "Cfg.EcAddEntryComplete() +# 2. ec.masterstatus Status of master (1=OK) ``` -### axis +#### motion ```shell -1. ax.id axis id (ro) -2. ax.reset reset axis error (rw) -3. ax.counter execution counter (ro) -4. ax.error error (ro) -5. ax.allowplccmd Allow writes to axis from PLC (rw) -6. ax.enc.actpos actual position (rw) -7. ax.enc.extactpos actual position from plc sync. - expression (ro) -8. ax.enc.actvel actual velocity (ro) -9. ax.enc.rawpos actual raw position (ro) -10. ax.enc.source internal source or expressions (rw) - source = 0: internal encoder - source > 0: actual pos from expr -11. ax.enc.homed encoder homed (rw) -12. ax.enc.homepos homing position (rw) -13. ax.traj.setpos curent trajectory setpoint (rw) -14. ax.traj.targetpos target position (rw) -15. ax.traj.extsetpos current trajecrory setpoint from - plc sync. expression (rw) -16. ax.traj.targetvel target velocity setpoint (rw) -17. ax.traj.targetacc target acceleration setpoint (rw) -18. ax.traj.targetdec target deceleration setpoint (rw) -19. ax.traj.setvel current velocity setpoint (ro) -20. ax.traj.setvelffraw feed forward raw velocity (ro) -21. ax.traj.command command (rw) - command=1: move velocity - command=2: move rel. pos - command=3: move abs. pos - command=10: homing -22. ax.traj.cmddata cmddat. Homing procedure - only valid if ax.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.traj.source internal source or expressions (rw) - source = 0: internal traj - source > 0: setpoints from expr -24. ax.traj.execute execute motion command (rw) -25. ax.traj.busy axis busy (ro) -26. ax.traj.dir axis setpoint direction (ro) - ax.traj.dir>0: forward - ax.traj.dir<0: backward - ax.traj.dir=0: standstill -27. ax.cntrl.error actual controller error (ro) -28. ax.cntrl.poserror actual position error (ro) -29. ax.cntrl.output actual controller output (ro) -30. ax.drv.setvelraw actual raw velocity setpoint (ro) -31. ax.drv.enable enable drive command (rw) -32. ax.drv.enabled drive enabled (ro) -33. ax.seq.state sequence state (homing) (ro) -34. ax.mon.ilock motion interlock (both dir) (rw) - ax.mon.ilock=1: motion allowed - ax.mon.ilock=0: motion not allowed -35. ax.mon.ilockbwd motion interlock bwd dir (rw) - ax.mon.ilockbwd=1: motion allowed - ax.mon.ilockbwd=0: motion not allowed -36. ax.mon.ilockfwd motion interlock fwd dir (rw) - ax.mon.ilockfwd=1: motion allowed - ax.mon.ilockfwd=0: motion not allowed -37. ax.mon.attarget axis at taget (ro) -38. ax.mon.lowlim low limit switch (ro) -39. ax.mon.highlim high limit switch (ro) -40. ax.mon.homesensor home sensor (ro) -41. ax.mon.lowsoftlim low soft limit (rw) -42. ax.mon.highsoftlim high soft limit (rw) -43. ax.mon.lowsoftlimenable low soft limit enable (rw) -44. ax.mon.highsoftlimenable high soft limit enable (rw) -45. ax.blockcom Enables/disables "set" commands (rw) - via command parser (ascii commands) - Statuses can still be read. - Exceptions ("set"-commands) that - will work: - - "StopMotion(axid)" - - "Cfg.SetAxisBlockCom(axid,block)" -46. ax.ctrl.kp Set PID-controller kp (rw) -47. ax.ctrl.ki Set PID-controller ki (rw) -48. ax.ctrl.kd Set PID-controller kd (rw) -49. ax.ctrl.kff Set PID-controller kff (rw) - "Cfg.SetAxisBlockCom(axid,block)" +# 1. ax.id axis id (ro) +# 2. ax.reset reset axis error (rw) +# 3. ax.counter execution counter (ro) +# 4. ax.error error (ro) +# 5. ax.allowplccmd Allow writes to axis from PLC (rw) +# 6. ax.enc.actpos actual position (rw) +# 7. ax.enc.extactpos actual position from plc sync. +# expression (ro) +# 8. ax.enc.actvel actual velocity (ro) +# 9. ax.enc.rawpos actual raw position (ro) +# 10. ax.enc.source internal source or expressions (rw) +# source = 0: internal encoder +# source > 0: actual pos from expr +# 11. ax.enc.homed encoder homed (rw) +# 12. ax.enc.homepos homing position (rw) +# 13. ax.traj.setpos curent trajectory setpoint (rw) +# 14. ax.traj.targetpos target position (rw) +# 15. ax.traj.extsetpos current trajecrory setpoint from +# plc sync. expression (rw) +# 16. ax.traj.targetvel target velocity setpoint (rw) +# 17. ax.traj.targetacc target acceleration setpoint (rw) +# 18. ax.traj.targetdec target deceleration setpoint (rw) +# 19. ax.traj.setvel current velocity setpoint (ro) +# 20. ax.traj.setvelffraw feed forward raw velocity (ro) +# 21. ax.traj.command command (rw) +# command=1: move velocity +# command=2: move rel. pos +# command=3: move abs. pos +# command=10: homing +# 22. ax.traj.cmddata cmddat. Homing procedure +# only valid if ax.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.traj.source internal source or expressions (rw) +# source = 0: internal traj +# source > 0: setpoints from expr +# 24. ax.traj.execute execute motion command (rw) +# 25. ax.traj.busy axis busy (ro) +# 26. ax.traj.dir axis setpoint direction (ro) +# ax.traj.dir>0: forward +# ax.traj.dir<0: backward +# ax.traj.dir=0: standstill +# 27. ax.cntrl.error actual controller error (ro) +# 28. ax.cntrl.poserror actual position error (ro) +# 29. ax.cntrl.output actual controller output (ro) +# 30. ax.drv.setvelraw actual raw velocity setpoint (ro) +# 31. ax.drv.enable enable drive command (rw) +# 32. ax.drv.enabled drive enabled (ro) +# 33. ax.seq.state sequence state (homing) (ro) +# 34. ax.mon.ilock motion interlock (both dir) (rw) +# ax.mon.ilock=1: motion allowed +# ax.mon.ilock=0: motion not allowed +# 35. ax.mon.ilockbwd motion interlock bwd dir (rw) +# ax.mon.ilockbwd=1: motion allowed +# ax.mon.ilockbwd=0: motion not allowed +# 36. ax.mon.ilockfwd motion interlock fwd dir (rw) +# ax.mon.ilockfwd=1: motion allowed +# ax.mon.ilockfwd=0: motion not allowed +# 37. ax.mon.attarget axis at taget (ro) +# 38. ax.mon.lowlim low limit switch (ro) +# 39. ax.mon.highlim high limit switch (ro) +# 40. ax.mon.homesensor home sensor (ro) +# 41. ax.mon.lowsoftlim low soft limit (rw) +# 42. ax.mon.highsoftlim high soft limit (rw) +# 43. ax.mon.lowsoftlimenable low soft limit enable (rw) +# 44. ax.mon.highsoftlimenable high soft limit enable (rw) +# 45. ax.blockcom Enables/disables "set" commands (rw) +# via command parser (ascii commands) +# Statuses can still be read. +# Exceptions ("set"-commands) that +# will work: +# - "StopMotion(axid)" +# - "Cfg.SetAxisBlockCom(axid,block)" +# 46. ax.ctrl.kp Set PID-controller kp (rw) +# 47. ax.ctrl.ki Set PID-controller ki (rw) +# 48. ax.ctrl.kd Set PID-controller kd (rw) +# 49. ax.ctrl.kff Set PID-controller kff (rw) ``` -### PLC +#### PLC ```shell -# PLC variables: -# 1. plc.enable plc enable (rw) -# (end exe with "plc.enable:=0#" -# Could be usefull for startup -# sequences) -# 2. plc.error plc error (rw) -# Will be forwarded to user as -# controller error. -# 3. plc.scantime plc sample time in seconds (ro) -# 4. plc.firstscan true during first plc scan only (ro) -# usefull for initiations of variables -# 5. ax.plc.enable Same as plc.enable but for -# axis sync plc. -# 6. ax.plc.error Same as plc.error but for -# axis sync plc. -# 7. ax.plc.scantime Same as plc.scantime but for -# axis sync plc. -# 8. ax.plc.firstscan Same as plc.firstscan but for -# axis sync plc. +# 1. plc.enable plc enable (rw) +# (end exe with "plc.enable:=0#" +# Could be usefull for startup +# sequences) +# 2. plc.error plc error (rw) +# Will be forwarded to user as +# controller error. +# 3. plc.scantime plc sample time in seconds (ro) +# 4. plc.firstscan true during first plc scan only (ro) +# usefull for initiations of variables +# 5. ax.plc.enable Same as plc.enable but for +# axis sync plc. +# 6. ax.plc.error Same as plc.error but for +# axis sync plc. +# 7. ax.plc.scantime Same as plc.scantime but for +# axis sync plc. +# 8. ax.plc.firstscan Same as plc.firstscan but for +# axis sync plc. ``` ### data storage ```shell -# Data Storage variables: -# 1. ds.size Set/get size of data storage (rw) -# Set will clear the data storage -# 2. ds.append Add new data at end (rw) -# Current position index will be -# increased -# 3. ds.data Set/get data ar current position (rw) -# 4. ds.index Set/get current position index (rw) -# 5. ds.error Data storage class error (ro) -# 6. ds.clear Data buffer clear (set to zero) (ro) -# 7. ds.full True if data storage is full (ro) +# 1. ds.size Set/get size of data storage (rw) +# Set will clear the data storage +# 2. ds.append Add new data at end (rw) +# Current position index will be +# increased +# 3. ds.data Set/get data ar current position (rw) +# 4. ds.index Set/get current position index (rw) +# 5. ds.error Data storage class error (ro) +# 6. ds.clear Data buffer clear (set to zero) (ro) +# 7. ds.full True if data storage is full (ro) ``` ### functions -#### Function Lib: EtherCAT -```C - -1. retvalue = ec_set_bit( - , : Value to change - : Bit index - ); - Sets bit at bitindex position of value. Returns the new value. - -2. retvalue = ec_wrt_bit( - , : Value to change - , : Value of bit to write - : Bit index - ); - Write wrtValue to a bit at bitindex position of value. Returns the new value. - -3. retvalue = ec_wrt_bits( - , : Value to change - , : Value of bit to write - : Start bit index (lsb is bit 0) - : Stop bit index - ); - Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. - -4. retvalue = ec_clr_bit( - , : Value to change - : Bit index - ); - Clears bit at bitindex position of value. Returns the new value. - -5. retvalue = ec_flp_bit( - , : Value to change - : Bit index - ); - Flips bit at bitindex position of value. Returns the new value. - -6. retvalue = ec_chk_bit( - , : Value to change - : Bit index - ); - Checks bit at bitindex position of value. Returns the value of bit. - -7. retvalue = ec_chk_bits( - , : Value to change - : Start bit index (lsb is bit 0) - : Stop bit index - ); - Checks range of bits (startBit..stopBit) of value. Returns the value of bits. - -8. retvalue = ec_print_hex( - , : Value to print - : Start bit index - : Stop bit index - ); - Prints to of in hex format - Returns error code or 0 if success. - -9. retvalue = ec_print_bin( - , : Value to print - : Start bit index - : Stop bit index - ); - Prints to of in bin format - Returns error code or 0 if success. - -10. retvalue = ec_mm_cp( - , : Source memmap index - : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - - -11. retvalue = ec_get_mm_type( - , : Source memmap index - ); - Returns data type of memmap: - 0 = Not defined (Use "Cfg.EcAddMemMapDT()" instead of "Cfg.EcAddMemMap()") - 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - - -12. retvalue = ec_get_mm_data( - , : Source memmap index - : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - -13. retvalue = ec_set_mm_data( - , : Source memmap index - : Index of data element - : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - -14. retvalue = ec_get_mm_size( - , : Source memmap index - ); - Returns number of elements (of type "ec_get_mm_type()")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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - -14. retvalue = ec_mm_ds_append( - , : Source memmap index - ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - -15. retvalue = ec_mm_append_to_ds_scale_offset( - , : Source memmap index - : Destination data storage index - : Scale - ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) - -16. retvalue = ec_mm_push_asyn( - ) : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" - 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. +#### EtherCAT +```shell +# +# 1. retvalue = ec_set_bit( +# , : Value to change +# : Bit index +# ); +# Sets bit at bitindex position of value. Returns the new value. +# +# 2. retvalue = ec_wrt_bit( +# , : Value to change +# , : Value of bit to write +# : Bit index +# ); +# Write wrtValue to a bit at bitindex position of value. Returns the new value. +# +# 3. retvalue = ec_wrt_bits( +# , : Value to change +# , : Value of bit to write +# : Start bit index (lsb is bit 0) +# : Stop bit index +# ); +# Write wrtValue to a range of bits (statBit..stopBit) of value. Returns the new value. +# +# 4. retvalue = ec_clr_bit( +# , : Value to change +# : Bit index +# ); +# Clears bit at bitindex position of value. Returns the new value. +# +# 5. retvalue = ec_flp_bit( +# , : Value to change +# : Bit index +# ); +# Flips bit at bitindex position of value. Returns the new value. +# +# 6. retvalue = ec_chk_bit( +# , : Value to change +# : Bit index +# ); +# Checks bit at bitindex position of value. Returns the value of bit. +# +# 7. retvalue = ec_chk_bits( +# , : Value to change +# : Start bit index (lsb is bit 0) +# : Stop bit index +# ); +# Checks range of bits (startBit..stopBit) of value. Returns the value of bits. +# +# 8. retvalue = ec_print_hex( +# , : Value to print +# : Start bit index +# : Stop bit index +# ); +# Prints to of in hex format +# Returns error code or 0 if success. +# +# 9. retvalue = ec_print_bin( +# , : Value to print +# : Start bit index +# : Stop bit index +# ); +# Prints to of in bin format +# Returns error code or 0 if success. +# +# 10. retvalue = ec_mm_cp( +# , : Source memmap index +# : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# +# 11. retvalue = ec_get_mm_type( +# , : Source memmap index +# ); +# Returns data type of memmap: +# 0 = Not defined (Use "Cfg.EcAddMemMapDT()" instead of "Cfg.EcAddMemMap()") +# 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# +# 12. retvalue = ec_get_mm_data( +# , : Source memmap index +# : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# 13. retvalue = ec_set_mm_data( +# , : Source memmap index +# : Index of data element +# : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# 14. retvalue = ec_get_mm_size( +# , : Source memmap index +# ); +# Returns number of elements (of type "ec_get_mm_type()")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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# 14. retvalue = ec_mm_ds_append( +# , : Source memmap index +# ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# 15. retvalue = ec_mm_append_to_ds_scale_offset( +# , : Source memmap index +# : Destination data storage index +# : Scale +# ); : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# epicsEnvSet(MM_CH_1_IN,${ECMC_CONFIG_RETURN_VAL}) +# +# 16. retvalue = ec_mm_push_asyn( +# ) : 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 "EcGetMemMapId(ec0.s11.mm.analogInputArray01)" +# 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. ``` - -#### Function Lib: Master to Master communication (within same host) + +#### 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. -```C -1. retvalue = m2m_write( - , : Mem buffer index (index must be 0..119) - ): : 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(); : 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(); - - returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). - -7. retvalue = m2m_ioc_run(); - - checks of a certian master is running (negative master id is ioc:s without ec master). +```shell +# 1. retvalue = m2m_write( +# , : Mem buffer index (index must be 0..119) +# ): : 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(); : 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(); +# +# returns status etehrcat status of another ecmc ioc (1==op, 0==not op, -1==error). +# +# 7. retvalue = m2m_ioc_run(); +# +# checks of a certian master is running (negative master id is ioc:s without ec master). ``` -#### Function Lib: Motion -```C -1. retvalue = mc_move_abs( - , : Axis index - , : Trigger - , : Target position - , : Target velocity - , : Acceleration - : Deceleration - ): - Absolute motion of axis. - Motion is triggerd with a positive edge on input. - returns 0 if success or error code. - -2. retvalue = mc_move_rel( - , : Axis index - , : Trigger - , : Target position - , : Target velocity - , : Acceleration - : Deceleration - ); - Relative motion of axis . - Motion is triggerd with a positive edge on input. - returns 0 if success or error code. - -3. retvalue = mc_move_ext_pos( - , : Axis index - , : Trigger - , : Target velocity - , : Acceleration - : 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 "mc_move_pos()" with the target postion ax.traj.extsetpos. - Motion is triggerd with a positive edge on input. - returns 0 if success or error code. - - -4. retvalue = mc_move_vel( - , : Axis index - , : Trigger - , : Target velocity - , : Acceleration - : Deceleration - ); - Constant velocity motion of axis . - Motion is triggerd with a positive edge on input. - returns 0 if success or error code. - -5. retvalue = mc_home( - , : Axis index - , : Trigger - , : Motion sequence - , : Target Velocity twords cam - : Target velocity off cam - ); - Perform a homing sequence of axis . - Motion is triggerd with a positive edge on input. - returns 0 if success or error code. - -6. retvalue = mc_home_pos( - , : Axis index - , : Trigger - , : Motion sequence - , : Target Velocity twords cam - : Target velocity off cam - : Homing position - ); -Perform a homing sequence of axis -Motion is triggerd with a positive edge on input. -returns 0 if success or error code. - -7. retvalue = mc_halt( - , : Axis index - , : Trigger - ); - Stop motion of axis . - Command is triggerd with a positive edge on input. - returns 0 if success or error code. - -8. retvalue = mc_power( - , : Axis index - , : Enable power - ); - Enable power of axis . - Motion is triggerd with a positive edge on input. - returns 0 if success or error code. - -9. retvalue = mc_get_busy( - , : 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( - , : 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(); - Resets error of motion axis. - -13. retvalue = mc_get_axis_err(); - Returns motion axis error code. - -14. retvalue = mc_set_enable_motion_funcs( - , : Axis index - , : Enable positioning - , : Enable const velo - , : Enable const homing - ); - - Enables/disables motion functionalities. Returns error code. - -15. retvalue = mc_get_act_pos( - , : Axis index - : Encoder index - ); - - Returns encoder position for any of the configured encoders of an axis. - -16. retvalue = mc_set_prim_enc( - , : Axis index - : 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( - , : Axis index - ); - - Returns primary encoder index of the axis (the encoder used for control). - -18. mc_set_axis_error( - , : Axis index - : Error code to set - ); - - Sets an arbitrary error code to an axis object. - -19. mc_set_slaved_axis_in_error( - , : Axis index - ); - - Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). +#### Motion +```shell +# 1. retvalue = mc_move_abs( +# , : Axis index +# , : Trigger +# , : Target position +# , : Target velocity +# , : Acceleration +# : Deceleration +# ): +# Absolute motion of axis. +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 2. retvalue = mc_move_rel( +# , : Axis index +# , : Trigger +# , : Target position +# , : Target velocity +# , : Acceleration +# : Deceleration +# ); +# Relative motion of axis . +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 3. retvalue = mc_move_ext_pos( +# , : Axis index +# , : Trigger +# , : Target velocity +# , : Acceleration +# : 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 "mc_move_pos()" with the target postion ax.traj.extsetpos. +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# +# 4. retvalue = mc_move_vel( +# , : Axis index +# , : Trigger +# , : Target velocity +# , : Acceleration +# : Deceleration +# ); +# Constant velocity motion of axis . +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 5. retvalue = mc_home( +# , : Axis index +# , : Trigger +# , : Motion sequence +# , : Target Velocity twords cam +# : Target velocity off cam +# ); +# Perform a homing sequence of axis . +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 6. retvalue = mc_home_pos( +# , : Axis index +# , : Trigger +# , : Motion sequence +# , : Target Velocity twords cam +# : Target velocity off cam +# : Homing position +# ); +# Perform a homing sequence of axis +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 7. retvalue = mc_halt( +# , : Axis index +# , : Trigger +# ); +# Stop motion of axis . +# Command is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 8. retvalue = mc_power( +# , : Axis index +# , : Enable power +# ); +# Enable power of axis . +# Motion is triggerd with a positive edge on input. +# returns 0 if success or error code. +# +# 9. retvalue = mc_get_busy( +# , : 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( +# , : 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(); +# Resets error of motion axis. +# +# 13. retvalue = mc_get_axis_err(); +# Returns motion axis error code. +# +# 14. retvalue = mc_set_enable_motion_funcs( +# , : Axis index +# , : Enable positioning +# , : Enable const velo +# , : Enable const homing +# ); +# +# Enables/disables motion functionalities. Returns error code. +# +# 15. retvalue = mc_get_act_pos( +# , : Axis index +# : Encoder index +# ); +# +# Returns encoder position for any of the configured encoders of an axis. +# +# 16. retvalue = mc_set_prim_enc( +# , : Axis index +# : 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( +# , : Axis index +# ); +# +# Returns primary encoder index of the axis (the encoder used for control). +# +# 18. mc_set_axis_error( +# , : Axis index +# : Error code to set +# ); +# +# Sets an arbitrary error code to an axis object. +# +# 19. mc_set_slaved_axis_in_error( +# , : Axis index +# ); +# +# Set axis error that indicates that a slaved axis is in error state (ERROR_AXIS_SLAVED_AXIS_IN_ERROR 0x1432B). ``` -#### Function Lib: Motion Group - -```C -1. mc_grp_get_enable( - , : 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( - , : Group index - ); - - Returns true if atleast one axis in the group has the enable bit set, else false. - -3. mc_grp_get_enabled( - , : Group index - ); - - Returns true if all axes in the group are in enabled state, else false. - -4. mc_grp_get_any_enabled( - , : Group index - ); - - Returns true if atleast one axis in the group is in enabled state, else false. - -5. mc_grp_get_busy( - , : Group index - ); - - Returns true if all axes in the group are in busy state, else false. - -6. mc_grp_get_any_busy( - , : Group index - ); - - Returns true if atleast one axis in the group is in busy state, else false. - -7. mc_grp_get_any_error_id( - , : Group index - ); - - Returns error id if atleast one axis in the group is in error state, else zero. - -8. mc_grp_set_enable( - , : Group index - : Enable state - ); - - Sets enable for all axes in group. - Returns 0 or error id. - -9. mc_grp_set_traj_src( - , : Group index - : 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( - , : Group index - : 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( - , : Group index - ); - - Resets error of all axes in group. - -12. mc_grp_set_error( - , : Group index - : Error Id - ); - - Set error id of all axes in group. - -13. mc_grp_set_slaved_axis_in_error( - , : Group index - ); - - Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) - -14. mc_grp_halt( - , : Group index - ); - - Halt all axes in group (only works if traj source = internal/0) - -15. mc_grp_axis_in_grp( - , : Group index - , : Axis index - ); - - Returns true if axis is in group, else false. - -16. mc_grp_size( - , : Group index - ); - - Returns the number of axes in group. - - -17. mc_grp_get_traj_src_ext( - , : Group index - ); - - Returns true if all axes in the group have trajectory source set to external. - -18. mc_grp_get_any_traj_src_ext( - , : 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( - , : Group index - , : Allow change of source - ); - Allow source change for trajectory and encoder when axis is enabled. +#### Motion Group +```shell +# 1. mc_grp_get_enable( +# , : 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( +# , : Group index +# ); +# +# Returns true if atleast one axis in the group has the enable bit set, else false. +# +# 3. mc_grp_get_enabled( +# , : Group index +# ); +# +# Returns true if all axes in the group are in enabled state, else false. +# +# 4. mc_grp_get_any_enabled( +# , : Group index +# ); +# +# Returns true if atleast one axis in the group is in enabled state, else false. +# +# 5. mc_grp_get_busy( +# , : Group index +# ); +# +# Returns true if all axes in the group are in busy state, else false. +# +# 6. mc_grp_get_any_busy( +# , : Group index +# ); +# +# Returns true if atleast one axis in the group is in busy state, else false. +# +# 7. mc_grp_get_any_error_id( +# , : Group index +# ); +# +# Returns error id if atleast one axis in the group is in error state, else zero. +# +# 8. mc_grp_set_enable( +# , : Group index +# : Enable state +# ); +# +# Sets enable for all axes in group. +# Returns 0 or error id. +# +# 9. mc_grp_set_traj_src( +# , : Group index +# : 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( +# , : Group index +# : 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( +# , : Group index +# ); +# +# Resets error of all axes in group. +# +# 12. mc_grp_set_error( +# , : Group index +# : Error Id +# ); +# +# Set error id of all axes in group. +# +# 13. mc_grp_set_slaved_axis_in_error( +# , : Group index +# ); +# +# Set error id of all axes in group to ERROR_AXIS_SLAVED_AXIS_IN_ERROR (0x1432B) +# +# 14. mc_grp_halt( +# , : Group index +# ); +# +# Halt all axes in group (only works if traj source = internal/0) +# +# 15. mc_grp_axis_in_grp( +# , : Group index +# , : Axis index +# ); +# +# Returns true if axis is in group, else false. +# +# 16. mc_grp_size( +# , : Group index +# ); +# +# Returns the number of axes in group. +# +# +# 17. mc_grp_get_traj_src_ext( +# , : Group index +# ); +# +# Returns true if all axes in the group have trajectory source set to external. +# +# 18. mc_grp_get_any_traj_src_ext( +# , : 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( +# , : Group index +# , : Allow change of source +# ); +# Allow source change for trajectory and encoder when axis is enabled. +# ``` -#### Function Lib: Data Storage -```C -1. retvalue = ds_append_data( - , : Data storage index - , : Data - ); - Append data to data storage. - returns 0 if success or error code. - -2. retvalue = ds_clear_data( - , : Data storage index - ); - Clear data to data storage. - returns 0 if success or error code. - -3. retvalue = ds_get_data( - , : Data storage index - , : Buffer index - ); - Returns data from buffer. - -4. retvalue = ds_set_data( - , : Data storage index - , : Buffer index - ); - Sets data in data storage buffer. - returns 0 if success or error code. - -5. retvalue = ds_get_buff_id( - , : Data storage index - ); - Returns current buffer index. - -6. retvalue = ds_set_buff_id( - , : Data storage index - , : Buffer index - ); - Sets current buffer index in data storage buffer. - returns 0 if success or error code. - -7. retvalue = ds_is_full( - , : Data storage index - ); - Returns true if buffer is full. - -8. retvalue = ds_get_size( - , : 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( - , : Data storage index - ); - Triggers push of all asyn parameters in ds to EPICS (including data). - -11. retvalue = ds_get_avg( - , : Data storage index - ); - Returns average of the values in the data storage. - -12. retvalue = ds_get_min( - , : Data storage index - ); - Returns minimum of the values in the data storage. - -13. retvalue = ds_get_max( - , : Data storage index - ); - Returns maximum of the values in the data storage. - -14. retvalue=ds_append_to_ds( - , : Source data storage index - , : Source data element index - , : Number of elements to copy - : 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. - +#### Data Storage +```shell +# 1. retvalue = ds_append_data( +# , : Data storage index +# , : Data +# ); +# Append data to data storage. +# returns 0 if success or error code. +# +# 2. retvalue = ds_clear_data( +# , : Data storage index +# ); +# Clear data to data storage. +# returns 0 if success or error code. +# +# 3. retvalue = ds_get_data( +# , : Data storage index +# , : Buffer index +# ); +# Returns data from buffer. +# +# 4. retvalue = ds_set_data( +# , : Data storage index +# , : Buffer index +# ); +# Sets data in data storage buffer. +# returns 0 if success or error code. +# +# 5. retvalue = ds_get_buff_id( +# , : Data storage index +# ); +# Returns current buffer index. +# +# 6. retvalue = ds_set_buff_id( +# , : Data storage index +# , : Buffer index +# ); +# Sets current buffer index in data storage buffer. +# returns 0 if success or error code. +# +# 7. retvalue = ds_is_full( +# , : Data storage index +# ); +# Returns true if buffer is full. +# +# 8. retvalue = ds_get_size( +# , : 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( +# , : Data storage index +# ); +# Triggers push of all asyn parameters in ds to EPICS (including data). +# +# 11. retvalue = ds_get_avg( +# , : Data storage index +# ); +# Returns average of the values in the data storage. +# +# 12. retvalue = ds_get_min( +# , : Data storage index +# ); +# Returns minimum of the values in the data storage. +# +# 13. retvalue = ds_get_max( +# , : Data storage index +# ); +# Returns maximum of the values in the data storage. +# +# 14. retvalue=ds_append_to_ds( +# , : Source data storage index +# , : Source data element index +# , : Number of elements to copy +# : 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. +# ``` diff --git a/hugo/content/manual/motion_cfg/best_practice/_index.md b/hugo/content/manual/motion_cfg/best_practice/_index.md index 0aa044dad..512b6a7db 100644 --- a/hugo/content/manual/motion_cfg/best_practice/_index.md +++ b/hugo/content/manual/motion_cfg/best_practice/_index.md @@ -4,7 +4,7 @@ weight = 30 chapter = false +++ -## Best Practice +## best Practice Here you can find some best practice configurations for common usecases. The complete examples with starup files can be found [here](https://github.com/paulscherrerinstitute/ecmccfg/tree/master/examples/PSI/best_practice) diff --git a/hugo/content/manual/motion_cfg/best_practice/servo.md b/hugo/content/manual/motion_cfg/best_practice/servo.md index 5a8905352..5be849e85 100644 --- a/hugo/content/manual/motion_cfg/best_practice/servo.md +++ b/hugo/content/manual/motion_cfg/best_practice/servo.md @@ -4,6 +4,8 @@ weight = 20 chapter = false +++ +## setup +* EP7211-0034 servo drive slave * Lab test stage (1mm/rev) * Motor : AM8111-0F20 @@ -63,7 +65,7 @@ drive: reset: 7 ``` -### Switches +### 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: ``` @@ -71,5 +73,3 @@ axis: id: ${AX_ID=1} feedSwitchesOutput: ec0.s$(BO_ID).binaryOutput01.0 # Ethercat entry for feed switches ``` - -#### diff --git a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md index 2b274be38..e1422834e 100644 --- a/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md +++ b/hugo/content/manual/motion_cfg/best_practice/stepper_biss_c.md @@ -1,9 +1,12 @@ +++ -title = "stepper and biss-c (EL7041, EL5042)" +title = "stepper and biss-c" weight = 15 chapter = false +++ +## 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) From 7b5952ca67fd26e76c0a508c193e783b5419de79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 11:43:15 +0200 Subject: [PATCH 054/128] update docs --- hugo/content/manual/PLC_cfg/_index.md | 2 +- hugo/content/manual/PLC_cfg/function_libs.md | 53 ++++++++++++++++---- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/_index.md b/hugo/content/manual/PLC_cfg/_index.md index 99ebfa80b..5230707d6 100644 --- a/hugo/content/manual/PLC_cfg/_index.md +++ b/hugo/content/manual/PLC_cfg/_index.md @@ -6,7 +6,7 @@ chapter = false In `ECMC`, PLCs are a very powerful tool to handle EtherCAT data in real-time. -Since `ecmccfg` v7, the PLCs can be instantiated from: +Since `ecmccfg` v7, the PLCs can be instantiated in 3 different ways: - [pure text files](#pure-text-files), classic ecmc PLC - [pure yaml](#pure-yaml) files or - text files, with [yaml header](#yaml-header). diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index 2e17f50b3..98499aa9b 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -4,31 +4,54 @@ weight = 17 chapter = false +++ +Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd: +``` +# \brief 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 +# \file +# \param FILE PLC definition file, i.e. ./plc/homeSlit.plc +# \param PLC_ID (optional) PLC number, default last loaded PLC +# \param 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}" +# \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). +# \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution +# \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). +# \note Example call: +# \code +# ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCLib.cmd, "PLC_ID=0, FILE=./plc/test.plc_lib, SAMPLE_RATE_MS=100" +# \endcode +``` -## PLC function libs: -Function libs can be loaded into ecmc-PLCs +Example: ``` ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" ``` -The functions must be defined accordning to template: + +The functions must be defined accordning to this template (max 5 parameters): ``` -function (,...) { +function (,...,) { ; } +``` also without param is allowed: +``` function () { ; } - ``` -* For syntax of the "code body", check the exprtk website. + * Several functions can be defined in the same file. +* For syntax of the "code body", check [plc syntax](plcSyntax) 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). * "#" as a first char in a line is considered a comment (the line will be removed before compile). -* MSI: The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check the msi documentation/help. - -### Can be used in a function: +* The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check [best practice](best_practice) and msi documentation/help. + +### can be used in a functions 1. The parameters 2. Other functions (also recursive) 3. The normal ecmc function libs: @@ -47,7 +70,8 @@ function () { * eof 5. vectors in the calculations (but NOT as parameter or return value). -### "ecmc variables" can _NOT_ be used/accessed in a functions: +### can _NOT_ be used in functions +"ecmc variables" can _NOT_ be used/accessed in functions: 1. EtherCAT I/0 direct access ec.s.* 2. Data storage variables: ds.* 3. Motion variables: ax.* @@ -55,7 +79,7 @@ function () { 5. Global variables: global.* 6. Vectors as parameter or return value (only first value will be passed). -### A function lib file example +### example function lib file ``` # Nothing fancy function add(a,b,c,d,e) { @@ -88,3 +112,10 @@ function testm2m() { 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. + +{{% notice tip %}} +In 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. +{{% /notice %}} From b42342718f4cfb8d9b3a599b3b384df5f151b428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 11:59:21 +0200 Subject: [PATCH 055/128] update docs --- hugo/content/manual/PLC_cfg/function_libs.md | 4 ++-- hugo/content/manual/PLC_cfg/{plcSyntax.md => syntax.md} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename hugo/content/manual/PLC_cfg/{plcSyntax.md => syntax.md} (100%) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index 98499aa9b..7c2534c1a 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -46,10 +46,10 @@ function () { ``` * Several functions can be defined in the same file. -* For syntax of the "code body", check [plc syntax](plcSyntax) and the exprtk website. +* For syntax of the "code body", check [plc syntax](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). * "#" 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, "include" and "subsitute" commands. For more info check [best practice](best_practice) and msi documentation/help. +* The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check [best practice](best-practice) and msi documentation/help. ### can be used in a functions 1. The parameters diff --git a/hugo/content/manual/PLC_cfg/plcSyntax.md b/hugo/content/manual/PLC_cfg/syntax.md similarity index 100% rename from hugo/content/manual/PLC_cfg/plcSyntax.md rename to hugo/content/manual/PLC_cfg/syntax.md From 52e1ba4f62448d9fad4a9eba43186d8a5335da65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 12:02:08 +0200 Subject: [PATCH 056/128] update docs --- hugo/content/manual/PLC_cfg/function_libs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index 7c2534c1a..b57e77a23 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -46,10 +46,10 @@ function () { ``` * Several functions can be defined in the same file. -* For syntax of the "code body", check [plc syntax](syntax) and the exprtk website. +* For syntax of the "code body", check [plc syntax](../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). * "#" 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, "include" and "subsitute" commands. For more info check [best practice](best-practice) and msi documentation/help. +* The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check [best practice](../best-practice) and msi documentation/help. ### can be used in a functions 1. The parameters From addcd8354941aa30bd86dbc0bce76c46b84a7910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 13:13:21 +0200 Subject: [PATCH 057/128] update docs --- hugo/content/manual/PLC_cfg/function_libs.md | 34 +++++++------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index b57e77a23..8f58a0f51 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -4,28 +4,18 @@ weight = 17 chapter = false +++ -Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd: +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 thendivide with ':'). +* 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)). ``` -# \brief 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 -# \file -# \param FILE PLC definition file, i.e. ./plc/homeSlit.plc -# \param PLC_ID (optional) PLC number, default last loaded PLC -# \param 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}" -# \param INC (optional) List of directories for include files to pass to MSI (if several paths thendivide with ':'). -# \param TMP_PATH (optional) directory to dump the temporary plc file after macro substitution -# \param PRINT_PLC_FILE (optional) 1/0, printout msi parsed plc file (default enable(1)). -# \note Example call: -# \code -# ${SCRIPTEXEC} ${ecmccfg_DIR}loadPLCLib.cmd, "PLC_ID=0, FILE=./plc/test.plc_lib, SAMPLE_RATE_MS=100" -# \endcode -``` - Example: ``` ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" @@ -49,7 +39,7 @@ function () { * For syntax of the "code body", check [plc syntax](../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). * "#" 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, "include" and "subsitute" commands. For more info check [best practice](../best-practice) and msi documentation/help. +* The lib file will be parsed through MSI allowing macro expansion, "include" and "subsitute" commands. For more info check [best practice](../best_practice) and msi documentation/help. ### can be used in a functions 1. The parameters From c9a83ee25a5be0c672048c52f46f6d6db4c20f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 13:20:55 +0200 Subject: [PATCH 058/128] update docs --- hugo/content/manual/PLC_cfg/function_libs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index 8f58a0f51..2236f5674 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -12,10 +12,10 @@ Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command t * "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 thendivide with ':'). +* INC: (optional) List of directories for include files to pass to MSI (if several paths then divide with ':'). * 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: ``` ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" From 8484d549826b3eba15d55c4cec8f823ced7e2869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 13:25:14 +0200 Subject: [PATCH 059/128] update docs --- hugo/content/manual/PLC_cfg/function_libs.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index 2236f5674..bee174bd9 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -8,10 +8,10 @@ Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command t * 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}" + - "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 ':'). * 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)). From c311cd45f1598490d9b2af15ffa63daca64b870f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 13:49:33 +0200 Subject: [PATCH 060/128] update docs --- hugo/content/manual/PLC_cfg/_index.md | 9 ++++++++- hugo/content/manual/PLC_cfg/function_libs.md | 7 ++++--- hugo/content/manual/general_cfg/_index.md | 8 ++++---- hugo/content/manual/motion_cfg/_index.md | 9 ++++++++- hugo/content/manual/troubleshooting/_index.md | 8 ++++++-- hugo/content/manual/troubleshooting/ethercatCLI.md | 2 ++ hugo/content/manual/troubleshooting/general.md | 2 ++ hugo/content/manual/troubleshooting/hardware.md | 11 +++++++---- hugo/content/manual/troubleshooting/manual.md | 2 ++ hugo/content/manual/troubleshooting/motion.md | 13 +++++++++---- hugo/content/manual/troubleshooting/tuning.md | 2 ++ 11 files changed, 54 insertions(+), 19 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/_index.md b/hugo/content/manual/PLC_cfg/_index.md index 5230707d6..8134d163b 100644 --- a/hugo/content/manual/PLC_cfg/_index.md +++ b/hugo/content/manual/PLC_cfg/_index.md @@ -1,9 +1,16 @@ +++ title = "PLC" -weight = 15 +weight = 12 chapter = false +++ +*** +## Topics +{{% children %}} +--- + +## PLCs + In `ECMC`, PLCs are a very powerful tool to handle EtherCAT data in real-time. Since `ecmccfg` v7, the PLCs can be instantiated in 3 different ways: diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index bee174bd9..1e4ce1f0e 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -4,6 +4,7 @@ weight = 17 chapter = false +++ +## 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 @@ -17,19 +18,19 @@ Function libraries can be loaded into ecmc PLCs by loadPLCLib.cmd. The command t * PRINT_PLC_FILE: (optional) 1/0, printout msi parsed plc file (default enable(1)). Example: -``` +```bash ${SCRIPTEXEC} ${ECMC_CONFIG_ROOT}loadPLCLib.cmd, "FILE=./plc/test.plc_lib, PLC_MACROS='OFFSET=3'" ``` The functions must be defined accordning to this template (max 5 parameters): -``` +```C function (,...,) { ; } ``` also without param is allowed: -``` +```C function () { ; } diff --git a/hugo/content/manual/general_cfg/_index.md b/hugo/content/manual/general_cfg/_index.md index 0e1c3623e..b6b9970bd 100644 --- a/hugo/content/manual/general_cfg/_index.md +++ b/hugo/content/manual/general_cfg/_index.md @@ -4,7 +4,7 @@ weight = 7 chapter = false +++ -## [startup.cmd](startup) -## [data storage](data_storage) -## [iocsh utils](iocsh_utils) -## [ecmc command reference](ecmc_command_ref) +*** +## Topics +{{% children %}} + diff --git a/hugo/content/manual/motion_cfg/_index.md b/hugo/content/manual/motion_cfg/_index.md index 39d1d59a3..600e89230 100644 --- a/hugo/content/manual/motion_cfg/_index.md +++ b/hugo/content/manual/motion_cfg/_index.md @@ -2,7 +2,14 @@ title = "motion" weight = 10 chapter = false -+++ ++++ + +*** + +*** +## Topics +{{% children %}} +--- ## axis diff --git a/hugo/content/manual/troubleshooting/_index.md b/hugo/content/manual/troubleshooting/_index.md index 7dfba7c93..52cb4f63a 100644 --- a/hugo/content/manual/troubleshooting/_index.md +++ b/hugo/content/manual/troubleshooting/_index.md @@ -1,11 +1,15 @@ +++ title = "troubleshooting" -weight = 11 +weight = 15 chapter = false +++ -## troubleshooting +*** +## Topics +{{% children %}} +--- +## 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! diff --git a/hugo/content/manual/troubleshooting/ethercatCLI.md b/hugo/content/manual/troubleshooting/ethercatCLI.md index 56178b64b..1c0576f17 100644 --- a/hugo/content/manual/troubleshooting/ethercatCLI.md +++ b/hugo/content/manual/troubleshooting/ethercatCLI.md @@ -4,6 +4,8 @@ weight = 13 chapter = false +++ +*** + ### `ethercat` CLI The IgH EtherCAT master provides a command line interface (CLI) which is a very powerful tool. diff --git a/hugo/content/manual/troubleshooting/general.md b/hugo/content/manual/troubleshooting/general.md index d313e5a27..a3271b223 100644 --- a/hugo/content/manual/troubleshooting/general.md +++ b/hugo/content/manual/troubleshooting/general.md @@ -5,6 +5,8 @@ weight = 12 chapter = false +++ +*** + ### culprit From experience, very few issues are related to the EtherCAT hardware itself. diff --git a/hugo/content/manual/troubleshooting/hardware.md b/hugo/content/manual/troubleshooting/hardware.md index 0ec454e07..fc3016483 100644 --- a/hugo/content/manual/troubleshooting/hardware.md +++ b/hugo/content/manual/troubleshooting/hardware.md @@ -4,10 +4,13 @@ weight = 16 chapter = false +++ -### 1. [over current protection](#over current protection) -### 2. [el7041 error/warning](#el7041 error/warning) -### 3. [latency issues](#latency issues) - +*** +*** +## Topics +1. [over current protection](#over current protection) +2. [el7041 error/warning](#el7041 error/warning) +3. [latency issues](#latency issues) +--- ### 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. diff --git a/hugo/content/manual/troubleshooting/manual.md b/hugo/content/manual/troubleshooting/manual.md index 7da403e24..f109c8da8 100644 --- a/hugo/content/manual/troubleshooting/manual.md +++ b/hugo/content/manual/troubleshooting/manual.md @@ -4,6 +4,8 @@ weight = 17 chapter = false +++ +*** + ## force manual motion {{% notice warning %}} This procedure is for experts only. You run the risk of destroying expansive devices! Limit switches are _not_ obeyed! YOU HAVE BEEN WARNED! diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index bf65d75d9..8b4bea4ac 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -4,10 +4,15 @@ weight = 14 chapter = false +++ -### 1. [both_limits error](#both_limits error) -### 2. [position lag error, (following error), tuning](#position lag error (following error)) -### 3. [latency issues](#latency issues) -### 4. [drive refuse to enable](#drive refuse to enable) +*** + +## Topics +1. [both_limits error](#both_limits error) +2. [position lag error, (following error), tuning](#position lag error (following error)) +3. [latency issues](#latency issues) +4. [drive refuse to enable](#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: diff --git a/hugo/content/manual/troubleshooting/tuning.md b/hugo/content/manual/troubleshooting/tuning.md index 1ac93f799..f7340af47 100644 --- a/hugo/content/manual/troubleshooting/tuning.md +++ b/hugo/content/manual/troubleshooting/tuning.md @@ -4,6 +4,8 @@ weight = 15 chapter = false +++ +*** + ### EL70x1 Tuning For EL70x1 stepper drives the following parameters can be tuned: From 154771a9feb27fd93c026ec629cf23dd79633995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 13:53:49 +0200 Subject: [PATCH 061/128] update docs --- hugo/content/manual/motion_cfg/_index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/hugo/content/manual/motion_cfg/_index.md b/hugo/content/manual/motion_cfg/_index.md index 600e89230..8a0cc6a1c 100644 --- a/hugo/content/manual/motion_cfg/_index.md +++ b/hugo/content/manual/motion_cfg/_index.md @@ -4,8 +4,6 @@ weight = 10 chapter = false +++ -*** - *** ## Topics {{% children %}} From 87a4b81a3b14bb706dfe0d415287ec0817203576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 14:15:31 +0200 Subject: [PATCH 062/128] update docs --- hugo/content/manual/troubleshooting/motion.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/hugo/content/manual/troubleshooting/motion.md b/hugo/content/manual/troubleshooting/motion.md index 8b4bea4ac..962f5e126 100644 --- a/hugo/content/manual/troubleshooting/motion.md +++ b/hugo/content/manual/troubleshooting/motion.md @@ -7,10 +7,10 @@ chapter = false *** ## Topics -1. [both_limits error](#both_limits error) -2. [position lag error, (following error), tuning](#position lag error (following error)) -3. [latency issues](#latency issues) -4. [drive refuse to enable](#drive refuse to enable) +1. [both_limits error](#both_limits-error) +2. [position lag error, (following error), tuning](#position-lag-error) +3. [latency issues](#latency-issues) +4. [drive refuse to enable](#drive-refuse-to-enable) --- @@ -31,8 +31,8 @@ By using the commad Cfg.WriteEcEntryEcPath(ec\.s\.binar ecmcConfigOrDie "Cfg.WriteEcEntryEcPath(ec0.s5>.binaryOutput02,1)" ``` -## position lag error (following error) -A position lag error is normally genereated in the following situations: +## position lag error +A position lag error (following error) can be genereated in the following situations: 1. The motor torque is too low, making it hard for the motor to keep up with the setpoint. 2. The scaling factors are wrong resulting in that the feed forward part of the controller is not working well. 3. The velocity setpoint is too high resulting in motor stall (common for stepper motors). @@ -75,7 +75,6 @@ For EL704x stepper drives are default setup to maximum veleocity range of +-2000 After changing this value you also need to change the drive scaling in the axis yaml file. ## drive 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](hardware). Possible reasons: From 220f36b73f4848e9cf53081bf8927e8c4a9b700d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 12 Sep 2024 14:24:09 +0200 Subject: [PATCH 063/128] update docs --- hugo/content/manual/PLC_cfg/function_libs.md | 2 +- hugo/content/manual/troubleshooting/tuning.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo/content/manual/PLC_cfg/function_libs.md b/hugo/content/manual/PLC_cfg/function_libs.md index 1e4ce1f0e..b5530f6c2 100644 --- a/hugo/content/manual/PLC_cfg/function_libs.md +++ b/hugo/content/manual/PLC_cfg/function_libs.md @@ -42,7 +42,7 @@ function () { * "#" 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, "include" and "subsitute" commands. For more info check [best practice](../best_practice) and msi documentation/help. -### can be used in a functions +### can be used in functions 1. The parameters 2. Other functions (also recursive) 3. The normal ecmc function libs: diff --git a/hugo/content/manual/troubleshooting/tuning.md b/hugo/content/manual/troubleshooting/tuning.md index f7340af47..1a8875d58 100644 --- a/hugo/content/manual/troubleshooting/tuning.md +++ b/hugo/content/manual/troubleshooting/tuning.md @@ -1,5 +1,5 @@ +++ -title = "hardware" +title = "tuning" weight = 15 chapter = false +++ From 35b115969251f1459d622e66c2a3e25f9285ba9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Fri, 13 Sep 2024 08:22:45 +0200 Subject: [PATCH 064/128] Use ecmc 9.6.0 --- startup.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/startup.cmd b/startup.cmd index ffb529ed1..c7a5a977b 100644 --- a/startup.cmd +++ b/startup.cmd @@ -15,7 +15,7 @@ #- SYS #- #- [optional] -#- ECMC_VER = 9.5.4 +#- ECMC_VER = 9.6.0 #- EthercatMC_VER = 3.0.2 (obsolete) #- INIT = initAll #- MASTER_ID = 0 <-- put negatuve number to disable master, aka non ec-mode @@ -54,7 +54,7 @@ on error halt #- #------------------------------------------------------------------------------- #- load required modules -epicsEnvSet(ECMC_VER,${ECMC_VER=9.5.4}) +epicsEnvSet(ECMC_VER,${ECMC_VER=9.6.0}) require ecmc "${ECMC_VER}" #- Require EthercatMC if used. From 3775cbe43ca3c7ad5d5f717756aa2de3d97e7b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 16 Sep 2024 11:45:52 +0200 Subject: [PATCH 065/128] Add MR SYNC --- db/core/ecmcMotorRecord.template | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/db/core/ecmcMotorRecord.template b/db/core/ecmcMotorRecord.template index 3600f1c2e..3b1fe206c 100644 --- a/db/core/ecmcMotorRecord.template +++ b/db/core/ecmcMotorRecord.template @@ -327,6 +327,8 @@ record (asyn, "$(PREFIX)$(MOTOR_NAME)-$(MOTOR_PORT)-asyn") { } +################################################################ +# Sync and stop on interlock record(calcout,"$(PREFIX)$(MOTOR_NAME)-MR-SyncTrgH2L"){ #field(PINI, "1") field(DESC, "Trigg MR Sync") @@ -382,3 +384,26 @@ record(seq, "${PREFIX}${MOTOR_NAME}-StpCmd_") { field(LNK1, "") field(LNK2, "${PREFIX}${MOTOR_NAME}.STOP PP") } + +################################################################ +# Sync only +record(longin,"${PREFIX}${MOTOR_NAME}-SyncMrCmd"){ + field(DESC, "${MOTOR_NAME}: Sync MR") + field(PINI, "$(PINI=1)") + field(DTYP, "asynInt32") + field(INP, "@asyn($(MOTOR_PORT),$(AXIS_NO))TRIGG_SYNC") + field(SCAN, "I/O Intr") + field(FLNK, "${PREFIX}${MOTOR_NAME}-MR-SyncOnly.PROC") + field(TSE, "$(TSE=-2)") +} + +record(seq, "$(PREFIX)$(MOTOR_NAME)-MR-SyncOnly") { + field(DESC, "Trigg MR Sync") + field(PINI, "1") + field(DO1, "0") + field(DO2, "1") + field(DLY1, "0.01") + field(DLY2, "0.01") + field(LNK1, "$(PREFIX)$(MOTOR_NAME).SYNC PP") + field(LNK2, "$(PREFIX)$(MOTOR_NAME).SYNC PP") +} From f541ebe157709f68575fdb6ff73d049e372cc0a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 17 Sep 2024 09:33:16 +0200 Subject: [PATCH 066/128] Update PLC syntax doc with new grp func --- hugo/content/manual/PLC_cfg/syntax.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hugo/content/manual/PLC_cfg/syntax.md b/hugo/content/manual/PLC_cfg/syntax.md index b7bff8bb2..528510def 100644 --- a/hugo/content/manual/PLC_cfg/syntax.md +++ b/hugo/content/manual/PLC_cfg/syntax.md @@ -748,6 +748,13 @@ A shared memory buffer of 120 doubles can be accessed for read and write operati # , : Allow change of source # ); # Allow source change for trajectory and encoder when axis is enabled. +# +# 20. mc_grp_sync_act_set( +# , : Group index +# , : 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). # ``` From 07180bca5860bc257af8d3faaa0379a5192246dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 17 Sep 2024 09:33:56 +0200 Subject: [PATCH 067/128] Use ecmc 9.6.1 --- startup.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/startup.cmd b/startup.cmd index c7a5a977b..1672ef1f3 100644 --- a/startup.cmd +++ b/startup.cmd @@ -15,7 +15,7 @@ #- SYS #- #- [optional] -#- ECMC_VER = 9.6.0 +#- ECMC_VER = 9.6.1 #- EthercatMC_VER = 3.0.2 (obsolete) #- INIT = initAll #- MASTER_ID = 0 <-- put negatuve number to disable master, aka non ec-mode @@ -54,7 +54,7 @@ on error halt #- #------------------------------------------------------------------------------- #- load required modules -epicsEnvSet(ECMC_VER,${ECMC_VER=9.6.0}) +epicsEnvSet(ECMC_VER,${ECMC_VER=9.6.1}) require ecmc "${ECMC_VER}" #- Require EthercatMC if used. From 6dcef2bbab9219f60297fc5332ccffef5b35a127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 17 Sep 2024 16:00:40 +0200 Subject: [PATCH 068/128] Add best practice with hw.subst --- .../motion/stepper_bissc_hw_subst/README.md | 100 ++++++++++++++++++ .../stepper_bissc_hw_subst/cfg/axis.yaml | 89 ++++++++++++++++ .../cfg/enc_open_loop.yaml | 12 +++ .../stepper_bissc_hw_subst/cfg/hw.subst | 35 ++++++ .../motion/stepper_bissc_hw_subst/startup.cmd | 19 ++++ 5 files changed, 255 insertions(+) create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_hw_subst/README.md create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/axis.yaml create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/enc_open_loop.yaml create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst create mode 100644 examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/README.md b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/README.md new file mode 100644 index 000000000..44ce4d6d2 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/README.md @@ -0,0 +1,100 @@ +# Configuration for EL7041-0052 and EL5042 +* 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 + +### Encoder scalings +Two encoders are configured: +1. Closed loop: BISS-C. This is used as the default encoder for control +2. Open loop: EL7041 Step counter + +Both these encoders (and drive) should be scaled to the same unit (mm). + +#### RLS BISS-C (encoder 1) + +RLS BISS-C: +* 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 +``` + +#### Open loop (encoder 2) +The EL7041 drive has a build in micro step counter (64 microsteps/fullstep): +* 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): +* 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: +``` +axis: + id: 1 # Axis id + feedSwitchesOutput: ec0.s5.binaryOutput01 # Ethercat entry for feed switches + +``` diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/axis.yaml b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/axis.yaml new file mode 100644 index 000000000..b85b249c2 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/axis.yaml @@ -0,0 +1,89 @@ +axis: + id: ${AXIS_ID=1} # Axis id + feedSwitchesOutput: ec0.s${BO_SID}.binaryOutput${BO_CH=01} # Ethercat entry for feed switches + +epics: + name: ${AX_NAME=M1} # Axis anme + precision: 3 # Decimal count + description: Test cfg # Axis description + unit: mm # Unit + motorRecord: + fieldInit: 'RTRY=0,FOFF=Frozen' # Extra config for Motor record + +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) + +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: 32 # 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 + +controller: + Kp: 10 # Kp proportinal gain + Ki: 0 # Ki integral gain + Kd: 0 # Kd derivative gain + +trajectory: + axis: + velocity: 2 # Default velo for axis + acceleration: 2 # Default acc for axis + deceleration: 2 # Default dec for axis + emergencyDeceleration: 5 # Deceleration when axis in error state + jerk: 10 # Default jerk for axis + jog: + velocity: 1 # Default velo fro JOG (motor record) + +input: + 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 + +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: true # Enable position lag monitoring (following error) + tolerance: 0.1 # Allowed tolerance + time: 10 # Allowed time outside tolerance target: + velocity: + enable: false # Enable velocity monitoring + max: 8 # 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 + target: + enable: true # Enable at target monitoring (needs to be enabled if using motor record) + tolerance: 0.01 # Allowed tolerance + time: 10 # Filter time inside tolerance to be at target diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/enc_open_loop.yaml b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/enc_open_loop.yaml new file mode 100644 index 000000000..3abf8df5f --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/enc_open_loop.yaml @@ -0,0 +1,12 @@ +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) diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst new file mode 100644 index 000000000..d85485038 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst @@ -0,0 +1,35 @@ +#- ############################################################################ +#- Master0 +#- 0 0:0 PREOP + EK1100 EtherCAT-Koppler (2A E-Bus) +#- 1 0:1 PREOP + EL9227-5500 �berstromschutz 24V DC, 2K., max. 10A (Summe), eins +#- 2 0:2 PREOP + EL5042 2Ch. BiSS-C Encoder +#- 3 0:3 PREOP + EL5042 2Ch. BiSS-C Encoder +#- 4 0:4 PREOP + EL3204 4K. Ana. Eingang PT100 (RTD) +#- 5 0:5 PREOP + EL2008 8K. Dig. Ausgang 24V, 0.5A +#- 6 0:6 PREOP + EL1008 8K. Dig. Eingang 24V, 3ms +#- 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) + +file "${ecmccomp_DIR}/HWTemplate.cmd" { +pattern { SLAVE_ID HW_DESC COMP COMP_CH COMP_MACROS} + + { 0 EK1100 -1 -1 -1} + { 1 EL9227-5500 -1 -1 -1} + +# Encoders + { 2 EL5042 Encoder-Renishaw-26bit-BISS-C 1 ""} + { 2 EL5042 Encoder-Renishaw-26bit-BISS-C 2 ""} + + { 3 EL5042 -1 -1 -1} + +# Drives + {4 EL3204 -1 -1 -1} + {5 EL2008 -1 -1 -1} + {6 EL1008 -1 -1 -1} + {7 EL7041-0052 Motor-Generic-2Phase-Stepper 1 "I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230"} + {8 EL7041-0052 Motor-Generic-2Phase-Stepper 1 "I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230"} + {9 EL7041-0052 -1 -1 -1} + {10 EL7041-0052 -1 -1 -1} +} diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd new file mode 100644 index 000000000..ee7f067d0 --- /dev/null +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd @@ -0,0 +1,19 @@ +############################################################################## +## Example config for EL7041 and EL5042 + +require ecmccfg "ENG_MODE=1" +require ecmccomp + +############################################################################## +# - apply hardware configuration +${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=cfg/hw.subst" + +############################################################################## +# - motion +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml, DEV=${IOC}, AX_NAME=M1, AXIS_ID=1, DRV_SID=7, ENC_SID=2, ENC_CH=01, BO_SID=${BO_SID}, BO_CH=01" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlEnc.cmd, "FILE=./cfg/enc_open_loop.yaml, DEV=${IOC}, DRV_SID=${ECMC_EC_SLAVE_NUM}" + +#- ################################################################# +#- go active +${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd +${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd From e8d9cb0a77c03f714d33ef89c9b512b092184481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 17 Sep 2024 16:16:00 +0200 Subject: [PATCH 069/128] fix hw_subst best practice example --- .../best_practice/motion/stepper_bissc_hw_subst/startup.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd index ee7f067d0..2f29b9ef8 100644 --- a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd @@ -10,8 +10,8 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=cfg/hw.subst" ############################################################################## # - motion -${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml, DEV=${IOC}, AX_NAME=M1, AXIS_ID=1, DRV_SID=7, ENC_SID=2, ENC_CH=01, BO_SID=${BO_SID}, BO_CH=01" -${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlEnc.cmd, "FILE=./cfg/enc_open_loop.yaml, DEV=${IOC}, DRV_SID=${ECMC_EC_SLAVE_NUM}" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml, DEV=${IOC}, AX_NAME=M1, AXIS_ID=1, DRV_SID=7, ENC_SID=2, ENC_CH=01, BO_SID=5, BO_CH=01" +${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlEnc.cmd, "FILE=./cfg/enc_open_loop.yaml, DEV=${IOC}, DRV_SID=7" #- ################################################################# #- go active From fe75b5f92ab8296702b266d8eb637dd25ba51501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 17 Sep 2024 16:22:46 +0200 Subject: [PATCH 070/128] Minor clean up in best practice examples --- examples/PSI/best_practice/README.md | 7 ++++++- examples/PSI/best_practice/motion/servo/startup.cmd | 2 +- .../PSI/best_practice/motion/stepper_bissc/startup.cmd | 6 +++--- .../motion/stepper_bissc_hw_subst/cfg/hw.subst | 7 ++++--- .../motion/stepper_bissc_hw_subst/startup.cmd | 4 ++-- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/examples/PSI/best_practice/README.md b/examples/PSI/best_practice/README.md index 96176ed20..2d76d9e98 100644 --- a/examples/PSI/best_practice/README.md +++ b/examples/PSI/best_practice/README.md @@ -2,7 +2,12 @@ ## Motion -### stepper and BISS_C +### stepper and BISS-C +* Stepper motor +* RLS BISS encoder +* Open loop encoder + +### stepper and BISS-C using hw substitution file * Stepper motor * RLS BISS encoder * Open loop encoder diff --git a/examples/PSI/best_practice/motion/servo/startup.cmd b/examples/PSI/best_practice/motion/servo/startup.cmd index 1947a9452..998164967 100644 --- a/examples/PSI/best_practice/motion/servo/startup.cmd +++ b/examples/PSI/best_practice/motion/servo/startup.cmd @@ -1,7 +1,7 @@ ############################################################################## ## Example config for ep7211-0034 -require ecmccfg v9.5.5_RC1, "ECMC_VER=v9.5.5_RC1,ENG_MODE=1" +require ecmccfg "ENG_MODE=1" require ecmccomp #- ############################################################################ diff --git a/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd index 75da18f24..80a345c93 100644 --- a/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd +++ b/examples/PSI/best_practice/motion/stepper_bissc/startup.cmd @@ -1,7 +1,7 @@ ############################################################################## ## Example config for EL7041 and EL5042 -require ecmccfg v9.5.5_RC1 "ECMC_VER=v9.5.5_RC1,ENG_MODE=1" +require ecmccfg "ENG_MODE=1" require ecmccomp #- ############################################################################ @@ -59,7 +59,7 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" # 0:10 - EL7041 1Ch Stepper ${SCRIPTEXEC} ${ecmccfg_DIR}addSlave.cmd, "HW_DESC=EL7041-0052" -#- ################################################################# -#- Go active +#- ########################################################################### +#- go active ${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst index d85485038..4a664591e 100644 --- a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/cfg/hw.subst @@ -21,13 +21,14 @@ pattern { SLAVE_ID HW_DESC COMP COMP_CH # Encoders { 2 EL5042 Encoder-Renishaw-26bit-BISS-C 1 ""} { 2 EL5042 Encoder-Renishaw-26bit-BISS-C 2 ""} + { 3 EL5042 -1 -1 -1} - { 3 EL5042 -1 -1 -1} - -# Drives +# I/O {4 EL3204 -1 -1 -1} {5 EL2008 -1 -1 -1} {6 EL1008 -1 -1 -1} + +# Drives {7 EL7041-0052 Motor-Generic-2Phase-Stepper 1 "I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230"} {8 EL7041-0052 Motor-Generic-2Phase-Stepper 1 "I_MAX_MA=1000, I_STDBY_MA=500, U_NOM_MV=48000, R_COIL_MOHM=1230"} {9 EL7041-0052 -1 -1 -1} diff --git a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd index 2f29b9ef8..1df54a74b 100644 --- a/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd +++ b/examples/PSI/best_practice/motion/stepper_bissc_hw_subst/startup.cmd @@ -1,5 +1,5 @@ ############################################################################## -## Example config for EL7041 and EL5042 +## Example config for EL7041 and EL5042 using loadSubstConfig.cmd require ecmccfg "ENG_MODE=1" require ecmccomp @@ -13,7 +13,7 @@ ${SCRIPTEXEC} ${ecmccfg_DIR}loadSubstConfig.cmd, "FILE=cfg/hw.subst" ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlAxis.cmd, "FILE=./cfg/axis.yaml, DEV=${IOC}, AX_NAME=M1, AXIS_ID=1, DRV_SID=7, ENC_SID=2, ENC_CH=01, BO_SID=5, BO_CH=01" ${SCRIPTEXEC} ${ecmccfg_DIR}loadYamlEnc.cmd, "FILE=./cfg/enc_open_loop.yaml, DEV=${IOC}, DRV_SID=7" -#- ################################################################# +#- ########################################################################### #- go active ${SCRIPTEXEC} ${ecmccfg_DIR}applyConfig.cmd ${SCRIPTEXEC} ${ecmccfg_DIR}setAppMode.cmd From 66482af51341b8de8cae39b288a3bbbd7d44fdb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 23 Sep 2024 14:34:55 +0200 Subject: [PATCH 071/128] Add ipos4808_VOLT --- .../ecmciPOS4808BX_VOLT.substitutions | 95 +++++++++++++++++++ db/core/ecmcDS-idx.template | 4 +- .../Technosoft_slaves/ecmciPOS4808BX_VOLT.cmd | 79 +++++++++++++++ 3 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 db/Technosoft/ecmciPOS4808BX_VOLT.substitutions create mode 100644 hardware/Technosoft_slaves/ecmciPOS4808BX_VOLT.cmd diff --git a/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions b/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions new file mode 100644 index 000000000..367879736 --- /dev/null +++ b/db/Technosoft/ecmciPOS4808BX_VOLT.substitutions @@ -0,0 +1,95 @@ +# Encoder actual position +file "ecmc_analogInput-chX.template" +{ + pattern {CH_ID, KEY, suffix, sourceName, EGU, DESC , PREC} + {01, "Enc", "-PosAct", "positionActual", "Counts", "Encoder Actual position", 3} + {02, "Enc", "-PosAct", "positionActual", "Counts", "Encoder Actual position", 3} +} + +# Drive Control word +file "ecmc_controlWord-chX.template" +{ + pattern {CH_ID, KEY, suffix, sourceName, DESC } + {01, "Drv", "-Cmd", "driveControl", "Drive Control Word"} +} + +# Drive EREF (Voltage setpoint over 0x2067) +# tmlComCfgIF should always be 0x02A9 (address of EREF(h)) +file "ecmc_analogOutput-chX.template" +{ + pattern {CH_ID, KEY, suffix, sourceName, DESC , LINR, ESLO , PREC, EGU} + {01, "Drv", "-Spd", "velocitySetpoint", "Velocity setpoint", SLOPE, 0.0015, 3 , "V"} +} + +# Drive Status word +file "ecmcIPOSXXXX-drvStat-chX.template" +{ + pattern {CH_ID} + {01 } +} + +# binaryOutputArray01 +file "ecmc_binaryOutputArray-chX.template" +{ + pattern {CH_ID } + {01 } +} + +# binaryOutputArrayMask01 +file "ecmc_binaryOutputArray-chX.template" +{ + pattern {CH_ID, Suffix, } + {01, "-ArrayMask" } +} + +# binaryOutputArrayReadBack01 skip since kind of "duplicate" + +# binaryInputArray01 +file "ecmc_binaryInputArray-chX.template" +{ + pattern {CH_ID } + {01 } +} + +# currentActual +file "ecmc_analogInput-chX.template" +{ + pattern {CH_ID, KEY, suffix, sourceName, LINR, ESLO, EGU, PREC } + {01, "Drv", "-CurAct", "currentActual", "SLOPE", 0.0012210, "A", 3 } +} + +# voltageActual, ESLO= 102.3/65520 (see manual) +file "ecmc_analogInput-chX.template" +{ + pattern {CH_ID, KEY, suffix, sourceName, LINR, ESLO, EGU, PREC } + {01, "Drv", "-VolAct", "voltageActual", "SLOPE", 0.0015614, "V", 3 } +} + +# temperatureActual, ESLO= 102.3/65520 (see manual) +file "ecmc_analogInput-chX.template" +{ + pattern {CH_ID, KEY, suffix, sourceName, LINR, ESLO, EGU , PREC } + {01, "Drv", "-TmpAct", "temperatureActual", "SLOPE", 0.001221, "DegC", 2 } +} + +# analogInputActual (analog drive feedback) +file "ecmc_analogInput-chX.template" +{ + pattern {CH_ID} + {01 } + {02 } +} + +# ecmcDS402Enable +file "ecmcDS402Enable-chX.template" +{ + pattern {CH_ID} + {01 } +} + +# ecmcIPOSXXXX_VOLT-chX.template: Trigg TML function when srive is in Operation Enable +file "ecmcIPOSXXXX_VOLT-chX.template" +{ + pattern {CH_ID, TML} + {01 , 1 } +} diff --git a/db/core/ecmcDS-idx.template b/db/core/ecmcDS-idx.template index faa1d4049..13dd6907a 100644 --- a/db/core/ecmcDS-idx.template +++ b/db/core/ecmcDS-idx.template @@ -62,12 +62,12 @@ record(bi,"$(P)$(DS_FULL)"){ field(OSV, "NO_ALARM") } -record(ao,"$(P)MCU-Cfg-DS${Index}-NxtObjId") { +record(ai,"$(P)MCU-Cfg-DS${Index}-NxtObjId") { field(DESC, "DS number of next DS") field(VAL, "$(NEXT_OBJ_ID=-1)") } -record(ao,"$(P)MCU-Cfg-DS${Index}-PrvObjId") { +record(ai,"$(P)MCU-Cfg-DS${Index}-PrvObjId") { field(DESC, "DS number of next DS") field(VAL, "$(PREV_OBJ_ID=-1)") } diff --git a/hardware/Technosoft_slaves/ecmciPOS4808BX_VOLT.cmd b/hardware/Technosoft_slaves/ecmciPOS4808BX_VOLT.cmd new file mode 100644 index 000000000..8a3264c5e --- /dev/null +++ b/hardware/Technosoft_slaves/ecmciPOS4808BX_VOLT.cmd @@ -0,0 +1,79 @@ +#-d /** +#-d \brief hardware script for iPOSXXXX for voltage mode +#-d \details +#-d \author Anders Sandstroem +#-d \file +#-d */ + +# WARNING THIS CONFIGURATION IS ONLY INTENDED FOR MODE VES (PURE VOLTAGE MODE), MOST OF THE PDOS are not working + +epicsEnvSet("ECMC_EC_HWTYPE" "iPOS4808BX_VOLT") +epicsEnvSet("ECMC_EC_VENDOR_ID" "0x000001a3") +epicsEnvSet("ECMC_EC_PRODUCT_ID" "0x01a0c82d") + +#- verify slave +${SCRIPTEXEC} ${ecmccfg_DIR}slaveVerify.cmd + +############################################################# +############# Configure PDOS: + +epicsEnvSet("ECMC_CH_ID", "01") +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1600,0x6040,0x0,16,driveControl${ECMC_CH_ID})" +# NOT USED in voltage mode (MODE VES) +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1600,0x60FF,0x0,32,1,dummyVeloSet${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1601,0x60FE,0x1,32,binaryOutputArray${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1601,0x60FE,0x2,32,binaryOutputArrayMask${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},1,2,0x1602,0x2067,0x0,32,1,tmlComIF${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a00,0x6041,0x0,16,driveStatus${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a00,0x6064,0x0,32,positionActual${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a00,0x6077,0x0,16,1,currentActual${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a01,0x60FD,0x0,32,binaryInputArray${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a01,0x2045,0x0,16,binaryOutputArrayReadBack${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a02,0x2046,0x0,16,analogInput01)" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a02,0x2047,0x0,16,analogInput02)" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a02,0x2055,0x0,16,voltageActual${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a02,0x2058,0x0,16,temperatureActual${ECMC_CH_ID})" +ecmcConfigOrDie "Cfg.EcAddEntryComplete(${ECMC_EC_SLAVE_NUM},${ECMC_EC_VENDOR_ID},${ECMC_EC_PRODUCT_ID},2,3,0x1a03,0x6063,0x0,32,positionActual02)" +epicsEnvUnset(ECMC_CH_ID) + +#- MAP EREF(h) as voltage setpoint +# Special for access of EREF (output voltage) +# CFG +# 0084=16 bit cfg +# 02A9 is the address of EREF(H) +# => write 0x2064 0x0 0x02A90084 +ecmcConfigOrDie "Cfg.EcWriteSdo(${ECMC_EC_SLAVE_NUM},0x2064,0x0,0x02A90084,4)" +${SCRIPTEXEC} ${ecmccfg_DIR}addEcDataItem.cmd "STRT_ENTRY_NAME=tmlComIF01,OFFSET_BYTE=2,OFFSET_BITS=0,RW=1,DT=U16,NAME=TML-ComCfgIF01" +#- This is actuall the output voltage setpoint corresponfing to the velo setpoint (record loaded in subst later) +${SCRIPTEXEC} ${ecmccfg_DIR}addEcDataItem.cmd "STRT_ENTRY_NAME=tmlComIF01,OFFSET_BYTE=0,OFFSET_BITS=0,RW=1,DT=S16,NAME=velocitySetpoint01, LOAD_RECS='#-'" +#- Write adress 0x02A9 = +ecmcConfigOrDie "Cfg.WriteEcEntryIDString(${ECMC_EC_SLAVE_NUM},TML-ComCfgIF01,681)" +#- Now direct access to EREF should be possible through DATA_IF_DATA_01 + +# The tml trigger function cannot be mapped as PDO so need SDO async +#- Trigger this TML function (1) every time drive is beeing enabled: +#- EXTREF 0 // Take value from EREF(h) +#- MODE VES // Pure volateg mode +#- UPD // Update (use settings) +${SCRIPTEXEC} ${ecmccfg_DIR}addEcSdoRT.cmd, "SLAVE_ID=${ECMC_EC_SLAVE_NUM},INDEX=0x2006,SUBINDEX=0x0,DT=U16,NAME=TML-TrgFunc" +#- Default trigger TML func 1: +afterInit "dbpf ${ECMC_P}SDO-TML-TrgFunc-Val 1" + +############################################################# +############# Settings: + +#-#Set Cyclic Sync Velocity (CSV) mode (9) +#-ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x6060,0x0,9,1)" +#-epicsThreadSleep(0.01) +#Set sample time 1*10^-3) +ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x60C2,0x1,1,1)" +epicsThreadSleep(0.01) +#Set sample time exponent =-3 +ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x60C2,0x2,-3,1)" +epicsThreadSleep(0.01) +#Set action if communication is lost (Quickstop=3, Diasble voltage=2, Execute fault routine = 1, No action (continue running)=0) +ecmcConfigOrDie "Cfg.EcAddSdo(${ECMC_EC_SLAVE_NUM},0x6007,0x0,3,2)" +epicsThreadSleep(0.01) + +#- Default panel +epicsEnvSet("ECMC_HW_PANEL" "iPOSXXX_VOLT") From db1189b5ca27d8f2282717e3943614ca28aeb00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 23 Sep 2024 15:02:45 +0200 Subject: [PATCH 072/128] Fix some panels --- qt/ecmcEL9505.ui | 159 +++++++++++++++++++++++++++++++++++++++++ qt/ecmcEx3255.ui | 22 +++--- qt/ecmciPOSXXX_VOLT.ui | 39 +++++----- 3 files changed, 191 insertions(+), 29 deletions(-) create mode 100644 qt/ecmcEL9505.ui diff --git a/qt/ecmcEL9505.ui b/qt/ecmcEL9505.ui new file mode 100644 index 000000000..6c4b5f293 --- /dev/null +++ b/qt/ecmcEL9505.ui @@ -0,0 +1,159 @@ + + + Form + + + + 0 + 0 + 125 + 500 + + + + Form + + + + + 0 + 0 + 128 + 500 + + + + IOC=$(IOC),MasterID=$(MasterID),SlaveID=$(SlaveID) + + + ecmcE_slave_frame.ui + + + + + + 80 + 60 + 22 + 22 + + + + <html><head/><body><p>EBus power Alarm</p></body></html> + + + true + + + false + + + $(IOC):m$(MasterID)s$(SlaveID)-CH01-PowAlrm + + + caLed::Static + + + + 170 + 0 + 0 + + + + + 0 + 85 + 0 + + + + + + + 30 + 60 + 32 + 22 + + + + Power + + + + + + 20 + 90 + 46 + 22 + + + + Ovr load: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 80 + 90 + 22 + 22 + + + + <html><head/><body><p>power rail alarm</p></body></html> + + + true + + + false + + + $(IOC):m$(MasterID)s$(SlaveID)-CH01-OvrldAlrm + + + caLed::Static + + + + 0 + 85 + 0 + + + + + 170 + 0 + 0 + + + + + + + caLabel + QLabel +