mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-06 11:51:45 +08:00
Clear DC assignment after going to INIT.
This commit is contained in:
@@ -1557,7 +1557,7 @@ slave and bringing it to a certain application-layer state.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[height=.9\textheight]{graphs/fsm_slave_conf}
|
||||
\includegraphics[height=\textheight]{graphs/fsm_slave_conf}
|
||||
\caption{Transition diagram of the slave configuration state
|
||||
machine}
|
||||
\label{fig:fsm-slaveconf}
|
||||
|
||||
@@ -11,9 +11,9 @@ digraph slaveconf {
|
||||
enter_init -> init [weight=10]
|
||||
|
||||
reconfigure [shape=point, label=""]
|
||||
reconfigure -> init [fontname="Helvetica", label="Config\ndetached"]
|
||||
reconfigure -> enter_init [fontname="Helvetica", label="Config\ndetached"]
|
||||
|
||||
init [fontname="Helvetica"]
|
||||
init [fontname="Helvetica", style="bold"]
|
||||
init -> enter_clear_sync [fontname="Helvetica", label="No FMMUs"]
|
||||
init -> clear_fmmus [weight=10]
|
||||
|
||||
@@ -21,11 +21,18 @@ digraph slaveconf {
|
||||
clear_fmmus -> enter_clear_sync [weight=10]
|
||||
|
||||
enter_clear_sync [shape=point, label=""]
|
||||
enter_clear_sync -> enter_mbox_sync [fontname="Helvetica", label="No SMs"]
|
||||
enter_clear_sync -> enter_clear_dc_assign [fontname="Helvetica", label="No SMs"]
|
||||
enter_clear_sync -> clear_sync [weight=10]
|
||||
|
||||
clear_sync [fontname="Helvetica"]
|
||||
clear_sync -> enter_mbox_sync [weight=10]
|
||||
clear_sync -> enter_clear_dc_assign [weight=10]
|
||||
|
||||
enter_clear_dc_assign [shape=point, label=""]
|
||||
enter_clear_dc_assign -> enter_mbox_sync [fontname="Helvetica", label="No DC\nsupport"]
|
||||
enter_clear_dc_assign -> clear_dc_assign [weight=10]
|
||||
|
||||
clear_dc_assign [fontname="Helvetica"]
|
||||
clear_dc_assign -> enter_mbox_sync [weight=10]
|
||||
|
||||
enter_mbox_sync [shape=point, label=""]
|
||||
enter_mbox_sync -> end [fontname="Helvetica", label="INIT\nrequested"]
|
||||
@@ -38,7 +45,7 @@ digraph slaveconf {
|
||||
enter_boot_preop [shape=point, label=""]
|
||||
enter_boot_preop -> boot_preop [weight=10]
|
||||
|
||||
boot_preop [fontname="Helvetica"]
|
||||
boot_preop [fontname="Helvetica", style="bold"]
|
||||
boot_preop -> end [fontname="Helvetica", label="PREOP\nor BOOT\nrequested"]
|
||||
boot_preop -> enter_safeop [fontname="Helvetica", label="No slave\nconfig attached"]
|
||||
boot_preop -> enter_sdo_conf [weight=10]
|
||||
@@ -96,12 +103,12 @@ digraph slaveconf {
|
||||
enter_safeop [shape=point,label=""]
|
||||
enter_safeop -> safeop [weight=10]
|
||||
|
||||
safeop [fontname="Helvetica"]
|
||||
safeop [fontname="Helvetica", style="bold"]
|
||||
safeop -> end [fontname="Helvetica", label="SAFEOP\nrequested"]
|
||||
safeop -> op [weight=10]
|
||||
|
||||
op [fontname="Helvetica"]
|
||||
op -> end// [weight=10]
|
||||
op [fontname="Helvetica", style="bold"]
|
||||
op -> end
|
||||
|
||||
end [fontname="Helvetica"]
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ void ec_fsm_slave_config_state_start(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_init(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_clear_fmmus(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_clear_sync(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_clear_dc_assign(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_mbox_sync(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_boot_preop(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *);
|
||||
@@ -62,6 +63,7 @@ void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
|
||||
|
||||
void ec_fsm_slave_config_enter_init(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_enter_clear_sync(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_enter_clear_dc_assign(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_enter_boot_preop(ec_fsm_slave_config_t *);
|
||||
void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
|
||||
@@ -286,7 +288,7 @@ void ec_fsm_slave_config_enter_clear_sync(
|
||||
|
||||
if (!slave->sii.sync_count) { // FIXME use base_sync_count?
|
||||
// no sync managers
|
||||
ec_fsm_slave_config_enter_mbox_sync(fsm);
|
||||
ec_fsm_slave_config_enter_clear_dc_assign(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -332,6 +334,64 @@ void ec_fsm_slave_config_state_clear_sync(
|
||||
return;
|
||||
}
|
||||
|
||||
ec_fsm_slave_config_enter_clear_dc_assign(fsm);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Clear the DC assignment.
|
||||
*/
|
||||
void ec_fsm_slave_config_enter_clear_dc_assign(
|
||||
ec_fsm_slave_config_t *fsm /**< slave state machine */
|
||||
)
|
||||
{
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
ec_datagram_t *datagram = fsm->datagram;
|
||||
|
||||
if (!slave->base_dc_supported) {
|
||||
ec_fsm_slave_config_enter_mbox_sync(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
if (slave->master->debug_level)
|
||||
EC_DBG("Clearing DC assignment of slave %u...\n",
|
||||
slave->ring_position);
|
||||
|
||||
ec_datagram_fpwr(datagram, slave->station_address, 0x0980, 2);
|
||||
ec_datagram_zero(datagram);
|
||||
fsm->retries = EC_FSM_RETRIES;
|
||||
fsm->state = ec_fsm_slave_config_state_clear_dc_assign;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Slave configuration state: CLEAR DC ASSIGN.
|
||||
*/
|
||||
void ec_fsm_slave_config_state_clear_dc_assign(
|
||||
ec_fsm_slave_config_t *fsm /**< slave state machine */
|
||||
)
|
||||
{
|
||||
ec_datagram_t *datagram = fsm->datagram;
|
||||
|
||||
if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
|
||||
return;
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED) {
|
||||
fsm->state = ec_fsm_slave_config_state_error;
|
||||
EC_ERR("Failed receive DC assignment clearing datagram"
|
||||
" for slave %u.\n", fsm->slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
||||
if (datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->state = ec_fsm_slave_config_state_error;
|
||||
EC_ERR("Failed to clear DC assignment of slave %u: ",
|
||||
fsm->slave->ring_position);
|
||||
ec_datagram_print_wc_error(datagram);
|
||||
return;
|
||||
}
|
||||
|
||||
ec_fsm_slave_config_enter_mbox_sync(fsm);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user