Dear EtherLab Users,
I installed the IgH EtherCAT master, and to educate myself how to implement the communication, I set up a small network comprising of IgH master and one Technosoft Motion iPOS4808 drive. The ./ethercat slaves command detects it. The ./ethercat cstruct gives me the following configuration: ec_pdo_entry_info_t slave_0_pdo_entries[] = { {0x6040, 0x00, 16}, {0x607a, 0x00, 32}, {0x6041, 0x00, 16}, {0x6064, 0x00, 32}, {0x6077, 0x00, 16}, {0x60f4, 0x00, 32}, {0x60fd, 0x00, 32}, }; ec_pdo_info_t slave_0_pdos[] = { {0x1600, 2, slave_0_pdo_entries + 0}, {0x1a00, 3, slave_0_pdo_entries + 2}, {0x1a01, 2, slave_0_pdo_entries + 5}, }; ec_sync_info_t slave_0_syncs[] = { {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE}, {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE}, {2, EC_DIR_OUTPUT, 1, slave_0_pdos + 0, EC_WD_DISABLE}, {3, EC_DIR_INPUT, 2, slave_0_pdos + 1, EC_WD_DISABLE}, {0xff} }; Now I want to use C++ functions, to change the value outputted at 0x1a00 x02 to the object 0x2058 x00 with size 16 bit. Hence, based on the cstruct file, as well as ~/ethercat-1.5.2/example/user/main.c , I write the following code (spread over main.h and main.cpp) to achieve this. #include "auxfun.h" // Application parameters #define FREQUENCY 100 #define PRIORITY 1 // Optional features #define CONFIGURE_PDOS 1 #define SDO_ACCESS 0 // EtherCAT static ec_master_t *master = NULL; static ec_master_state_t master_state = {}; static ec_domain_t *domain1 = NULL; static ec_domain_state_t domain1_state = {}; static ec_slave_config_t *sc_iPOS0 = NULL; static ec_slave_config_state_t sc_iPOS0_state = {}; // Timer static unsigned int sig_alarms = 0; static unsigned int user_alarms = 0; /****************************************************************************/ // process data static uint8_t *domain1_pd = NULL; #define AxisBotPos 0, 0 //Bottom frame iPOS Alias #define IPOS4808BX_CAT 0x000001a3, 0x019f418d // Vendor ID, Product Code const static ec_pdo_entry_reg_t domain1_regs[] = { {AxisBotPos, IPOS4808BX_CAT, 0x6060, 0x00, &off_iPOS0_Rx}, {AxisBotPos, IPOS4808BX_CAT, 0x2058, 0x00, &off_iPOS0_Tx}, {} }; // Analog in -------------------------- ec_pdo_entry_info_t iPOS0_pdo_entries[] = { {0x6040, 0x00, 16}, {0x6060, 0x00, 8}, {0x6041, 0x00, 16}, {0x2058, 0x00, 16}, {0x6077, 0x00, 16}, {0x60f4, 0x00, 32}, {0x60fd, 0x00, 32}, }; ec_pdo_info_t iPOS0_pdo[] = { {0x1600, 2, iPOS0_pdo_entries + 0}, {0x1a00, 3, iPOS0_pdo_entries + 2}, {0x1a01, 2, iPOS0_pdo_entries + 5}, }; ec_sync_info_t iPOS0_syncs[] = { {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE}, {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE}, {2, EC_DIR_OUTPUT, 1, iPOS0_pdo + 0, EC_WD_DISABLE}, {3, EC_DIR_INPUT, 2, iPOS0_pdo + 1, EC_WD_DISABLE}, {0xff} }; #include "main.h" /****************************************************************************/ int main(int argc, char **argv) { ?? struct itimerval tv; master = ecrt_request_master(0); if (!master) return -1; ? domain1 = ecrt_master_create_domain(master); if (!domain1) return -1; if (!(sc_iPOS0 = ecrt_master_slave_config( master, AxisBotPos, IPOS4808BX_CAT))) { fprintf(stderr, "Failed to get slave configuration.\n"); return -1; } printf("Configuring PDOs...\n"); if (ecrt_slave_config_pdos(sc_iPOS0, 4, iPOS0_syncs)) { fprintf(stderr, "Failed to configure PDOs.\n"); return -1; } cout << "Done" << endl; return 0; }? I run the code above. It executes with no problem. Now, I checked, using: sudo ethercat upload -a 0 0x1a00 01 whether the introduced mapping modification worked. Unfortunately it seems that it is not the case and I get the same variable that was in ./ethercat cstruct at that position. Then I tried to change the variable manually using ./ethercat download -a 0 0x1a00 01 0x20580010. This worked, at least in the console (confirmed by ./ethercat upload). However, cstruct still outputs previous values. I also tried the same procedure with other PDO variables to the same effect, my C++ code changes nothing in the mapping. If anyone of you could look into the code and tell me whether what I am doing is correct (or wrong), I would be exteremely grateful. I mostly do not know where even to start debugging right now. Thank you a lot in advance. Yours faithfully, Jakub Sikorski
_______________________________________________ etherlab-users mailing list etherlab-users@etherlab.org http://lists.etherlab.org/mailman/listinfo/etherlab-users