mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-06 03:41:52 +08:00
Improved handling for spontaneous AL state changes.
This commit is contained in:
1
NEWS
1
NEWS
@@ -6,6 +6,7 @@ $Id$
|
||||
|
||||
Changes in version 1.3.2:
|
||||
|
||||
* Improved handling for spontaneous AL state changes.
|
||||
* Master takes mailbox sync manager configurations from EEPROM words
|
||||
0x0018-0x001b, if no sync manager configurations are provided.
|
||||
* Calculate checksum when writing EEPROM or alias address.
|
||||
|
||||
@@ -66,6 +66,7 @@ void ec_fsm_change_init(ec_fsm_change_t *fsm, /**< finite state machine */
|
||||
{
|
||||
fsm->state = NULL;
|
||||
fsm->datagram = datagram;
|
||||
fsm->spontaneous_change = 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -223,6 +224,7 @@ void ec_fsm_change_state_check(ec_fsm_change_t *fsm
|
||||
// read AL status from slave
|
||||
ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
|
||||
fsm->retries = EC_FSM_RETRIES;
|
||||
fsm->spontaneous_change = 0;
|
||||
fsm->state = ec_fsm_change_state_status;
|
||||
}
|
||||
|
||||
@@ -281,10 +283,11 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
|
||||
// Slave spontaneously changed its state just before the new state
|
||||
// was written. Accept current state as old state and wait for
|
||||
// state change
|
||||
fsm->spontaneous_change = 1;
|
||||
fsm->old_state = slave->current_state;
|
||||
EC_WARN("Slave %i changed to %s in the meantime.\n",
|
||||
slave->ring_position, cur_state);
|
||||
goto again;
|
||||
goto check_again;
|
||||
}
|
||||
|
||||
// state change error
|
||||
@@ -309,11 +312,11 @@ void ec_fsm_change_state_status(ec_fsm_change_t *fsm
|
||||
ec_state_string(fsm->requested_state, state_str);
|
||||
fsm->state = ec_fsm_change_state_error;
|
||||
EC_ERR("Timeout while setting state %s on slave %i.\n",
|
||||
state_str, slave->ring_position);
|
||||
state_str, slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
||||
again:
|
||||
check_again:
|
||||
// no timeout yet. check again
|
||||
ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2);
|
||||
fsm->retries = EC_FSM_RETRIES;
|
||||
|
||||
@@ -78,6 +78,7 @@ struct ec_fsm_change
|
||||
ec_slave_state_t old_state; /**< prior slave state */
|
||||
unsigned long jiffies_start; /**< change timer */
|
||||
uint8_t take_time; /**< take sending timestamp */
|
||||
uint8_t spontaneous_change; /**< spontaneous state change detected */
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
@@ -595,7 +595,8 @@ void ec_fsm_slave_conf_state_init(ec_fsm_slave_t *fsm /**< slave state machine *
|
||||
if (ec_fsm_change_exec(&fsm->fsm_change)) return;
|
||||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
slave->error_flag = 1;
|
||||
if (!fsm->fsm_change.spontaneous_change)
|
||||
slave->error_flag = 1;
|
||||
fsm->state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
@@ -799,7 +800,8 @@ void ec_fsm_slave_conf_state_preop(ec_fsm_slave_t *fsm /**< slave state machine
|
||||
if (ec_fsm_change_exec(&fsm->fsm_change)) return;
|
||||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
slave->error_flag = 1;
|
||||
if (!fsm->fsm_change.spontaneous_change)
|
||||
slave->error_flag = 1;
|
||||
fsm->state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
@@ -1077,7 +1079,8 @@ void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *fsm /**< slave state machine
|
||||
if (ec_fsm_change_exec(&fsm->fsm_change)) return;
|
||||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
fsm->slave->error_flag = 1;
|
||||
if (!fsm->fsm_change.spontaneous_change)
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
@@ -1117,7 +1120,8 @@ void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *fsm /**< slave state machine */)
|
||||
if (ec_fsm_change_exec(&fsm->fsm_change)) return;
|
||||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
slave->error_flag = 1;
|
||||
if (!fsm->fsm_change.spontaneous_change)
|
||||
slave->error_flag = 1;
|
||||
fsm->state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user