<div dir="ltr"><div><div><div>HI<br><br></div>I use ethercat-1.5.2 and connect to the driver ( HIWIN D2 driver)<br><br></div>But I can't change the state from Servo not ready to Servo ready<br><br></div><div>the module is 8139too, and I tried generic but it still not work<br></div><div><br></div><div>I think the reason is my code is wrong.<br><br></div><div>So I tried to change the "EC_WRITE_S16(domainOutput_pd + HIWIN_cntlwd, 0xF); "<br><br></div><div>But whatever I modify the code , the message i get by dmesg is state change error and UNMATCHED datagram everytime.<br><br></div><div>I don't know where have error and I want to know what " 0B 7F 00 00 00 00 13 80 00 00 00 00 00 00 00 00 " means.<br><br><br></div><div><br></div><div><br></div><div>When I execute my program, the terminal always show the slave state is:<br>0  0:0  PREOP  E  D2 CoE Drive<br><br></div><div><br>And the dmesg show that:<br><br></div><div><div><div><div>[19967.768070] EtherCAT ERROR 0-0: Failed to set SAFEOP state, slave refused state change (PREOP + ERROR).<br>[19967.808571] EtherCAT ERROR 0-0: AL status message 0x001E: "Invalid input configuration".<br>[19967.890679] EtherCAT 0-0: Acknowledged state PREOP.<br>[19968.764822] EtherCAT 0: Domain 0: Working counter changed to 0/1.<br>[19980.238918] EtherCAT 0: Releasing master...<br>[19980.238924] EtherCAT DEBUG 0: ecrt_master_deactivate(master = 0xffff88014f4e2000)<br>[19980.238926] EtherCAT DEBUG 0: Stopping master thread.<br>[19980.238932] EtherCAT DEBUG 0: Master OP thread exiting...<br>[19980.238948] EtherCAT 0: Master thread exited.<br>[19980.238958] EtherCAT 0: Starting EtherCAT-IDLE thread.<br>[19980.238986] EtherCAT DEBUG 0: OPERATION -> IDLE.<br>[19980.238988] EtherCAT 0: Released.<br>[19980.239791] EtherCAT DEBUG 0: Idle thread running with send interval = 10000 us, max data size=112500<br>[19980.239800] EtherCAT DEBUG 0: UNMATCHED datagram:<br>[19980.239802] EtherCAT DEBUG: 0B 7F 00 00 00 00 13 80 00 00 00 00 00 00 00 00 <br>[19980.239810] EtherCAT DEBUG: 00 00 00 00 00 00 0F 00 00 00 00 00 00 00 00 <br>[19980.239818] EtherCAT DEBUG 0: UNMATCHED datagram:<br>[19980.239819] EtherCAT DEBUG: 0A 80 13 00 00 00 0E 80 00 00 00 00 00 00 00 00 <br>[19980.239827] EtherCAT DEBUG: 00 00 00 00 00 00 00 00 00 00 <br><br></div><div>-----------------------------------------------------------------------------------------------------</div><div><br></div><div>my code:<br><br>#include <errno.h><br>#include <signal.h><br>#include <stdio.h><br>#include <string.h><br>#include <sys/resource.h><br>#include <sys/time.h><br>#include <sys/types.h><br>#include <unistd.h><br>#include <inttypes.h><br>/****************************************************************************/<br><br>#include "ecrt.h"<br>/****************************************************************************/<br><br>// Application parameters<br>#define FREQUENCY 50<br>#define PRIORITY 1<br><br>/****************************************************************************/<br><br>// EtherCAT<br>static ec_master_t *master = NULL;<br>static ec_master_state_t master_state = {};<br><br>static ec_domain_t *domainInput = NULL;<br>static ec_domain_state_t domainInput_state = {};<br><br>static ec_domain_t *domainOutput = NULL;<br>static ec_domain_state_t domainOutput_state = {};<br><br>static ec_slave_config_t *sc_motor = NULL;<br>static ec_slave_config_state_t sc_motor_state = {};<br><br>// Timer<br>static unsigned int sig_alarms = 0;<br>static unsigned int user_alarms = 0;<br><br>/****************************************************************************/<br><br>// process data<br>static uint8_t *domainOutput_pd = NULL;<br>static uint8_t *domainInput_pd = NULL;<br><br>#define MotorSlavePos 0, 0<br>#define HIWIN 0x0000AAAA, 0x00000003<br><br>// offsets for PDO entries<br>static unsigned int HIWIN_cntlwd;<br>static unsigned int HIWIN_tarvel;<br>static unsigned int HIWIN_tarpos;<br>static unsigned int HIWIN_provel;<br>static unsigned int HIWIN_proacc;<br>static unsigned int HIWIN_prodec;<br>static unsigned int HIWIN_maxvel;<br>static unsigned int HIWIN_modeop;<br>static unsigned int HIWIN_status;<br>static unsigned int HIWIN_actpos;<br>static unsigned int HIWIN_actvel;<br>static unsigned int HIWIN_feacv;<br>static unsigned int HIWIN_proacc;<br><br><br>const static ec_pdo_entry_reg_t domainOutput_regs[] = {<br> //{ MotorSlavePos, HIWIN, 0x607F, 0, &HIWIN_maxvel },<br> { MotorSlavePos, HIWIN, 0x60FF, 0, &HIWIN_tarvel },<br> { MotorSlavePos, HIWIN, 0x607A, 0, &HIWIN_tarpos },<br> { MotorSlavePos, HIWIN, 0x6081, 0, &HIWIN_provel },<br> { MotorSlavePos, HIWIN, 0x6040, 0, &HIWIN_cntlwd },<br> { MotorSlavePos, HIWIN, 0x6060, 0, &HIWIN_modeop },<br> { MotorSlavePos, HIWIN, 0x6083, 0, &HIWIN_proacc },//Profile acceleration<br> {}<br>};<br><br>const static ec_pdo_entry_reg_t domainInput_regs[] = {<br> { MotorSlavePos, HIWIN, 0x6064, 0, &HIWIN_actpos },<br> { MotorSlavePos, HIWIN, 0x606C, 0, &HIWIN_actvel },<br> { MotorSlavePos, HIWIN, 0x6041, 0, &HIWIN_status },<br> { MotorSlavePos, HIWIN, 0x60F4, 0, &HIWIN_feacv },//Following error actual value<br> {}<br>};<br>/*****************************************************************************/<br>static ec_pdo_entry_info_t HIWIN_pdo_entries_output[] = {<br> { 0x60FF, 0x00, 32 },<br> { 0x607A, 0x00, 32 },<br> { 0x6081, 0x00, 32 },<br> { 0x6040, 0x00, 16 },<br> { 0x6060, 0x00, 8 },<br> { 0x6083, 0x00, 32},<br>};<br><br>static ec_pdo_entry_info_t HIWIN_pdo_entries_input[] = {<br> { 0x6064, 0x00, 32 },<br> { 0x606C, 0x00, 32 },<br> { 0x6041, 0x00, 16 },<br> { 0x60F4, 0x00, 32 },<br>};<br><br>static ec_pdo_info_t HIWIN_pdo_1600[] = {<br> { 0x1600, 6, HIWIN_pdo_entries_output },<br>};<br><br>static ec_pdo_info_t HIWIN_pdo_1a00[] = {<br> { 0x1A00, 4, HIWIN_pdo_entries_input },<br>};<br><br>static ec_sync_info_t HIWIN_syncs[] = {<br> { 0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE },<br> { 1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE },<br> { 2, EC_DIR_OUTPUT, 1, HIWIN_pdo_1600, EC_WD_DISABLE },<br> { 3, EC_DIR_INPUT, 1, HIWIN_pdo_1a00, EC_WD_DISABLE },<br> { 0xff }<br>};<br><br>/*****************************************************************************/<br><br>void check_domain_state(void)<br>{<br> ec_domain_state_t ds;<br><br> ecrt_domain_state(domainOutput, &ds);<br><br> if (ds.working_counter != domainOutput_state.working_counter)<br>  printf("domainOutput: WC %u.\n", ds.working_counter);<br> if (ds.wc_state != domainOutput_state.wc_state)<br> printf("domainOutput: State %u.\n", ds.wc_state);<br><br> domainOutput_state = ds;<br><br> ecrt_domain_state(domainInput, &ds);<br><br> if (ds.working_counter != domainInput_state.working_counter)<br>  printf("domainInput: WC %u.\n", ds.working_counter);<br> if (ds.wc_state != domainInput_state.wc_state)<br>  printf("domainInput: State %u.\n", ds.wc_state);<br><br> domainInput_state = ds;<br>}<br><br>/*****************************************************************************/<br><br>void check_master_state(void)<br>{<br> ec_master_state_t ms;<br><br> ecrt_master_state(master, &ms);<br><br> if (ms.slaves_responding != master_state.slaves_responding)<br>  printf("%u slave(s).\n", ms.slaves_responding);<br> if (ms.al_states != master_state.al_states)<br>{<br>  printf("AL states: 0x%02X.\n", ms.al_states);<br>//printf("state: %d\n",state);<br>}<br> if (ms.link_up != master_state.link_up)<br>  printf("Link is %s.\n", ms.link_up ? "up" : "down");<br><br> master_state = ms;<br>}<br><br>/*****************************************************************************/<br><br>void check_slave_config_states(void)<br>{<br> ec_slave_config_state_t s;<br> ecrt_slave_config_state(sc_motor, &s);<br><br> if (s.al_state != sc_motor_state.al_state)<br>  printf("Motor: State 0x%02X.\n", s.al_state);<br> if (s.online != sc_motor_state.online)<br>  printf("Motor: %s.\n", s.online ? "online" : "offline");<br> if (s.operational != sc_motor_state.operational)<br>  printf("Motor: %soperational.\n",s.operational ? "" : "Not ");<br><br> sc_motor_state = s;<br>}<br><br>/****************************************************************************/<br><br>void cyclic_task()<br>{<br>static int state = 0;<br> // receive process data<br> ecrt_master_receive(master);<br> ecrt_domain_process(domainOutput);<br> ecrt_domain_process(domainInput);<br><br> // check process data state (optional)<br> check_domain_state();<br><br>  // check for master state (optional)<br>  check_master_state();<br><br>  // check for islave configuration state(s) (optional)<br>  check_slave_config_states();<br> }<br><br>EC_WRITE_S16(domainOutput_pd + HIWIN_cntlwd, 0xF);    <br><br><br> ecrt_domain_queue(domainOutput);<br> ecrt_domain_queue(domainInput);<br> ecrt_master_send(master);<br>}<br><br>/********************************************************cntlwd********************/<br>int main(int argc, char **argv)<br>{<br> // Requests an EtherCAT master for realtime operation.<br> master = ecrt_request_master(0); // Index of the master to request.<br> if (!master)<br>  return -1;<br><br> // Creates a new process data domain<br> domainOutput = ecrt_master_create_domain(master);<br> if (!domainOutput)<br>  return -1;<br> domainInput = ecrt_master_create_domain(master);<br> if (!domainInput)<br>  return -1;<br><br> // Obtains a slave configuration<br> if (!(sc_motor = ecrt_master_slave_config(master, MotorSlavePos, HIWIN))) {<br>  fprintf(stderr, "Failed to get slave configuration.\n");<br>  return -1;<br> }<br><br> // Configuring PDOs<br> printf("Configuring PDOs...\n");<br> if (ecrt_slave_config_pdos(sc_motor, EC_END, HIWIN_syncs)) {<br>  fprintf(stderr, "Failed to configure PDOs.\n");//error<br>  return -1;<br> }<br><br> if (ecrt_domain_reg_pdo_entry_list(domainOutput, domainOutput_regs)) {<br>  fprintf(stderr, "PDO entry registration failed!\n");//error<br>  return -1;<br> }<br><br> if (ecrt_domain_reg_pdo_entry_list(domainInput, domainInput_regs)) {<br>  fprintf(stderr, "PDO entry registration failed!\n");<br>  return -1;<br> }<br><br> printf("Activating master...\n");<br> if (ecrt_master_activate(master))<br>  return -1;<br><br> if (!(domainOutput_pd = ecrt_domain_data(domainOutput))) {<br>  return -1;<br> }<br><br> if (!(domainInput_pd = ecrt_domain_data(domainInput))) {<br>  return -1;<br> }<br><br> printf("Started.\n");<br> while (1) {<br>  usleep(1000000 / FREQUENCY);<br>  cyclic_task();<br> }<br> return 0;<br>}<br><br><br>---------------------------------------------------------------<br></div><div>If the information is not enough, please tell me and I'll supplement as soon as possible<br><br></div><div>thanks<br><br></div><div>Best regard -Young<br></div></div></div></div></div>