Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
#!/bin/sh
#------------------------------------------------------------------------------
#
# Init script for EtherCAT
#
# $Id$
#
# Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
#
# This file is part of the IgH EtherCAT Master.
#
# The IgH EtherCAT Master is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2, as
# published by the Free Software Foundation.
#
# The IgH EtherCAT Master is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with the IgH EtherCAT Master; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ---
#
# The license mentioned above concerns the source code only. Using the EtherCAT
# technology and brand is only permitted in compliance with the industrial
# property and similar rights of Beckhoff Automation GmbH.
#
# vim: expandtab
#
#------------------------------------------------------------------------------
### BEGIN INIT INFO
# Provides: ethercat
# Required-Start: $local_fs $syslog $network
# Should-Start: $time ntp
# Required-Stop: $local_fs $syslog $network
# Should-Stop: $time ntp
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: EtherCAT master
# Description: EtherCAT master @VERSION@
### END INIT INFO
#------------------------------------------------------------------------------
LSMOD=/sbin/lsmod
MODPROBE=/sbin/modprobe
RMMOD=/sbin/rmmod
MODINFO=/sbin/modinfo
ETHERCAT=@prefix@/bin/ethercat
MASTER_ARGS=
#------------------------------------------------------------------------------
ETHERCAT_CONFIG=/etc/sysconfig/ethercat
if [ ! -r ${ETHERCAT_CONFIG} ]; then
echo ${ETHERCAT_CONFIG} not existing;
if [ "${1}" = "stop" ]; then
exit 0
else
exit 6
fi
fi
. ${ETHERCAT_CONFIG}
#------------------------------------------------------------------------------
exit_success() {
if [ -r /etc/rc.status ]; then
rc_reset
rc_status -v
rc_exit
else
echo " done"
exit 0
fi
}
#------------------------------------------------------------------------------
exit_fail() {
if [ -r /etc/rc.status ]; then
rc_failed
rc_status -v
rc_exit
else
echo " failed"
exit 1
fi
}
#------------------------------------------------------------------------------
print_running() {
if [ -r /etc/rc.status ]; then
rc_reset
rc_status -v
else
echo " running"
fi
}
#------------------------------------------------------------------------------
print_dead() {
if [ -r /etc/rc.status ]; then
rc_failed
rc_status -v
else
echo " dead"
fi
}
#------------------------------------------------------------------------------
parse_mac_address() {
if [ -z "${1}" ]; then
MAC=""
elif echo ${1} | grep -qE '^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$'; then
MAC=${1}
else
echo Invalid MAC address \"${1}\" in ${ETHERCAT_CONFIG}
exit_fail
fi
}
#------------------------------------------------------------------------------
if [ -r /etc/rc.status ]; then
. /etc/rc.status
rc_reset
fi
case "${1}" in
start)
echo -n "Starting EtherCAT master @VERSION@ "
# construct DEVICES and BACKUPS from configuration variables
DEVICES=""
BACKUPS=""
MASTER_INDEX=0
while true; do
DEVICE=$(eval echo "\${MASTER${MASTER_INDEX}_DEVICE}")
BACKUP=$(eval echo "\${MASTER${MASTER_INDEX}_BACKUP}")
if [ -z "${DEVICE}" ]; then break; fi
if [ ${MASTER_INDEX} -gt 0 ]; then
DEVICES=${DEVICES},
BACKUPS=${BACKUPS},
fi
parse_mac_address ${DEVICE}
DEVICES=${DEVICES}${MAC}
parse_mac_address ${BACKUP}
BACKUPS=${BACKUPS}${MAC}
MASTER_INDEX=$(expr ${MASTER_INDEX} + 1)
done
# load master module
if ! ${MODPROBE} ${MODPROBE_FLAGS} ec_master ${MASTER_ARGS} \
main_devices=${DEVICES} backup_devices=${BACKUPS}; then
exit_fail
fi
# check for modules to replace
for MODULE in ${DEVICE_MODULES}; do
ECMODULE=ec_${MODULE}
if ! ${MODINFO} ${ECMODULE} > /dev/null; then
continue # ec_* module not found
fi
if [ ${MODULE} != "generic" ]; then
if ${LSMOD} | grep "^${MODULE} " > /dev/null; then
if ! ${RMMOD} ${MODULE}; then
exit_fail
fi
fi
fi
if ! ${MODPROBE} ${MODPROBE_FLAGS} ${ECMODULE}; then
if [ ${MODULE} != "generic" ]; then
${MODPROBE} ${MODPROBE_FLAGS} ${MODULE} # try to restore
fi
exit_fail
fi
done
exit_success
;;
stop)
echo -n "Shutting down EtherCAT master @VERSION@ "
# unload EtherCAT device modules
for MODULE in ${DEVICE_MODULES} master; do
ECMODULE=ec_${MODULE}
if ! ${LSMOD} | grep -q "^${ECMODULE} "; then
continue # ec_* module not loaded
fi
if ! ${RMMOD} ${ECMODULE}; then
exit_fail
fi;
done
sleep 1
# reload previous modules
for MODULE in ${DEVICE_MODULES}; do
if [ ${MODULE} != "generic" ]; then
if ! ${MODPROBE} ${MODPROBE_FLAGS} ${MODULE}; then
echo Warning: Failed to restore ${MODULE}.
fi
fi
done
exit_success
;;
restart)
$0 stop || exit 1
sleep 1
$0 start
exit
;;
status)
echo "Checking for EtherCAT master @VERSION@ "
# count masters in configuration file
MASTER_COUNT=0
while true; do
DEVICE=$(eval echo "\${MASTER${MASTER_COUNT}_DEVICE}")
if [ -z "${DEVICE}" ]; then break; fi
MASTER_COUNT=$(expr ${MASTER_COUNT} + 1)
done
RESULT=0
for i in `seq 0 $(expr ${MASTER_COUNT} - 1)`; do
echo -n "Master${i} "
# Check if the master is in idle or operation phase
${ETHERCAT} master --master ${i} 2>/dev/null | \
grep -qE 'Phase:[[:space:]]*Idle|Phase:[[:space:]]*Operation'
EXITCODE=$?
if [ ${EXITCODE} -eq 0 ]; then
print_running
else
print_dead
RESULT=1
fi
done
exit ${RESULT}
;;
*)
echo "USAGE: $0 {start|stop|restart|status}"
;;
esac
if [ -r /etc/rc.status ]; then
rc_exit
else
exit 1
fi
#------------------------------------------------------------------------------