45 #define EC_AL_STATE_CHANGE_TIMEOUT 5 130 fsm->
state(fsm, datagram);
241 EC_SLAVE_ERR(slave,
"Failed to receive state datagram: ");
256 EC_SLAVE_ERR(slave,
"Failed to set state %s: ", state_str);
271 EC_SLAVE_ERR(slave,
"Failed to set state %s: ", state_str);
305 EC_SLAVE_ERR(slave,
"Failed to receive state checking datagram: ");
314 EC_SLAVE_ERR(slave,
"Failed to check state %s: ", req_state);
353 EC_SLAVE_ERR(slave,
"Failed to set %s state, slave refused state" 354 " change (%s).\n", req_state, cur_state);
368 EC_SLAVE_ERR(slave,
"Timeout while setting state %s.\n", state_str);
400 {0x0000,
"No error"},
401 {0x0001,
"Unspecified error"},
402 {0x0002,
"No Memory"},
403 {0x0011,
"Invalid requested state change"},
404 {0x0012,
"Unknown requested state"},
405 {0x0013,
"Bootstrap not supported"},
406 {0x0014,
"No valid firmware"},
407 {0x0015,
"Invalid mailbox configuration"},
408 {0x0016,
"Invalid mailbox configuration"},
409 {0x0017,
"Invalid sync manager configuration"},
410 {0x0018,
"No valid inputs available"},
411 {0x0019,
"No valid outputs"},
412 {0x001A,
"Synchronization error"},
413 {0x001B,
"Sync manager watchdog"},
414 {0x001C,
"Invalid sync manager types"},
415 {0x001D,
"Invalid output configuration"},
416 {0x001E,
"Invalid input configuration"},
417 {0x001F,
"Invalid watchdog configuration"},
418 {0x0020,
"Slave needs cold start"},
419 {0x0021,
"Slave needs INIT"},
420 {0x0022,
"Slave needs PREOP"},
421 {0x0023,
"Slave needs SAFEOP"},
422 {0x0024,
"Invalid Input Mapping"},
423 {0x0025,
"Invalid Output Mapping"},
424 {0x0026,
"Inconsistent Settings"},
425 {0x0027,
"Freerun not supported"},
426 {0x0028,
"Synchronization not supported"},
427 {0x0029,
"Freerun needs 3 Buffer Mode"},
428 {0x002A,
"Background Watchdog"},
429 {0x002B,
"No Valid Inputs and Outputs"},
430 {0x002C,
"Fatal Sync Error"},
431 {0x002D,
"No Sync Error"},
432 {0x0030,
"Invalid DC SYNCH configuration"},
433 {0x0031,
"Invalid DC latch configuration"},
434 {0x0032,
"PLL error"},
435 {0x0033,
"DC Sync IO Error"},
436 {0x0034,
"DC Sync Timeout Error"},
437 {0x0035,
"DC Invalid Sync Cycle Time"},
438 {0x0036,
"DC Sync0 Cycle Time"},
439 {0x0037,
"DC Sync1 Cycle Time"},
446 {0x0050,
"EEPROM No Access"},
447 {0x0051,
"EEPROM Error"},
448 {0x0060,
"Slave Restarted Locally"},
475 " AL status code datagram: ");
482 " datagram failed: ");
488 for (al_msg = al_status_messages; al_msg->
code != 0xffff; al_msg++) {
489 if (al_msg->
code != code) {
497 if (al_msg->
code == 0xffff) {
529 EC_SLAVE_ERR(slave,
"Failed to receive state ack datagram: ");
536 EC_SLAVE_ERR(slave,
"Reception of state ack datagram failed: ");
569 EC_SLAVE_ERR(slave,
"Failed to receive state ack check datagram: ");
576 EC_SLAVE_ERR(slave,
"Reception of state ack check datagram failed: ");
607 EC_SLAVE_ERR(slave,
"Timeout while acknowledging state %s.\n",
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
uint8_t spontaneous_change
spontaneous state change detected
void ec_fsm_change_state_error(ec_fsm_change_t *, ec_datagram_t *)
State: ERROR.
#define EC_AL_STATE_CHANGE_TIMEOUT
Timeout while waiting for AL state change [s].
EtherCAT state change FSM.
size_t ec_state_string(uint8_t, char *, uint8_t)
Prints slave states in clear text.
uint8_t take_time
take sending timestamp
ec_slave_state_t current_state
Current application state.
void ec_fsm_change_init(ec_fsm_change_t *fsm)
Constructor.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
void ec_fsm_change_start(ec_fsm_change_t *fsm, ec_slave_t *slave, ec_slave_state_t state)
Starts the change state machine.
uint16_t working_counter
Working counter.
static void ec_fsm_change_prepare_write_requested(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
Acknowledge/Error bit (no actual state)
uint16_t station_address
Configured station address.
const char * message
Message belonging to code.
Global definitions and macros.
ec_datagram_t * datagram
datagram used in the state machine
EtherCAT master structure.
void ec_fsm_change_state_code(ec_fsm_change_t *, ec_datagram_t *)
Change state: CODE.
void ec_fsm_change_state_check_ack(ec_fsm_change_t *, ec_datagram_t *)
Change state: CHECK ACK.
only state acknowledgement
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
void(* state)(ec_fsm_change_t *, ec_datagram_t *)
slave state change state function
void ec_fsm_change_state_ack(ec_fsm_change_t *, ec_datagram_t *)
Change state: ACK.
ec_datagram_state_t state
State.
static void ec_fsm_change_prepare_write_current(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
unsigned long jiffies_start
change timer
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
void ec_datagram_print_wc_error(const ec_datagram_t *datagram)
Evaluates the working counter of a single-cast datagram.
void ec_fsm_change_state_status(ec_fsm_change_t *, ec_datagram_t *)
Change state: STATUS.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
void ec_fsm_change_state_start_code(ec_fsm_change_t *, ec_datagram_t *)
Enter reading AL status code.
void ec_fsm_change_clear(ec_fsm_change_t *fsm)
Destructor.
int ec_datagram_fpwr(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPWR datagram.
ec_fsm_change_mode_t mode
full state change, or ack only.
ec_slave_state_t
State of an EtherCAT slave.
int ec_datagram_fprd(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRD datagram.
static void ec_fsm_change_prepare_read_code(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
#define EC_SLAVE_INFO(slave, fmt, args...)
Convenience macro for printing slave-specific information to syslog.
const ec_code_msg_t al_status_messages[]
Application layer status messages.
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
ec_slave_state_t requested_state
input: state
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
ec_slave_t * slave
slave the FSM runs on
#define EC_STATE_STRING_SIZE
Minimum size of a buffer used with ec_state_string().
void ec_fsm_change_ack(ec_fsm_change_t *fsm, ec_slave_t *slave)
Starts the change state machine to only acknowlegde a slave's state.
int ec_fsm_change_exec(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
void ec_fsm_change_state_check(ec_fsm_change_t *, ec_datagram_t *)
Change state: CHECK.
uint8_t * data
Datagram payload.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
void ec_fsm_change_state_end(ec_fsm_change_t *, ec_datagram_t *)
State: END.
void ec_fsm_change_state_start(ec_fsm_change_t *, ec_datagram_t *)
Change state: START.
ec_slave_state_t old_state
prior slave state
unsigned int retries
retries upon datagram timeout
unsigned int error_flag
Stop processing after an error.
uint16_t last_al_error
Last AL state error code.
unsigned long jiffies_received
Jiffies, when the datagram was received.
EtherCAT state change FSM.
static void ec_fsm_change_prepare_read_state(ec_fsm_change_t *fsm, ec_datagram_t *datagram)
int ec_fsm_change_success(ec_fsm_change_t *fsm)
Returns, if the state machine terminated with success.