I am trying out etherlab to connect my computer to a Parker Hannifin motor
controller - you can read about it here:
http://www.parker.com/Literature/Electromechanical%20North%20America/CATALOGS-BROCHURES/PSeries/PSeries_UG_EtherCAT_A.pdf
I am trying to tell it to use a certain PDO, which on page 68 of the manual is
called 1st PDO mapping. I use the ecrt_slave_config_pdos function to tell it
what PDO to use. But whenever I run the program, and ask it to print out the
PDO using ecrt_master_get_pdo and ecrt_master_get_pdo_entry, I get output that
tells me it is using the 2nd PDO mapping (see below). I feel like I am missing
something. Is there a good sample program that shows me how to set up
something like this that I can copy?
(I have used EC-Master from Acontis, and I was able operate the controller
using their software. But I want to find an open source solution.)
Output of my program:
Output PDO 0x1601 with 4 entries:
PDO entry 0: 0x6040 0 16
PDO entry 1: 0x607a 0 32
PDO entry 2: 0x60b8 0 16
PDO entry 3: 0x60fe 1 32
Input PDO 0x1a01 with 6 entries:
PDO entry 0: 0x6041 0 16
PDO entry 1: 0x6064 0 32
PDO entry 2: 0x60f4 0 32
PDO entry 3: 0x60b9 0 16
PDO entry 4: 0x60ba 0 32
PDO entry 5: 0x60fd 0 32
Thanks, Stephen
#include <ecrt.h>
#include <pthread.h>
#include <sys/time.h>
#include <signal.h>
#include <math.h>
#include <stdio.h>
ec_master_t *master;
ec_slave_config_t *slave0;
int main() {
int ret_val;
if ((master = ecrt_open_master(0)) == NULL) {
printf("Unable to request master\n");
exit(1);
}
if ((ret_val = ecrt_master_reserve(master)) < 0) {
printf("Unable to reserve master %d\n", ret_val);
exit(1);
}
ec_domain_t *domain;
if ((domain = ecrt_master_create_domain(master)) == NULL) {
printf("Unable to create domain\n");
}
if ((slave0 = ecrt_master_slave_config(master, 0, 0, 0x9000089, 0x10001)) == NULL) {
printf("Unable to request slave0\n");
exit(1);
}
#define SYNC_OUT 2
#define SYNC_IN 3
ec_pdo_entry_info_t pdo_entries_out[] = {{0x6040, 0, 16},
{0x6071, 0, 16},
{0x607a, 0, 32},
{0x6060, 0, 8},
{0x60b8, 0, 16}};
ec_pdo_info_t pdos_out[] = {{0x1600, 5, pdo_entries_out}};
// ec_pdo_info_t pdos_out[] = {{0x1600, 0, NULL}};
ec_sync_info_t syncs_out[] = {{SYNC_OUT, EC_DIR_OUTPUT, 1, pdos_out, EC_WD_DEFAULT}};
if ((ret_val = ecrt_slave_config_pdos(slave0, 1, syncs_out)) < 0) {
printf("Unable to configure output pdos %d\n", ret_val);
exit(1);
}
ec_pdo_info_t pdos_in[] = {{0x1a00, 0, NULL}, {0x1a01, 0, NULL}, {0x1a02, 0, NULL}, {0x1a03, 0, NULL}};
ec_sync_info_t syncs_in[] = {{SYNC_IN, EC_DIR_INPUT, 4, pdos_in, EC_WD_DEFAULT}};
if ((ret_val = ecrt_slave_config_pdos(slave0, 1, syncs_in)) < 0) {
printf("Unable to configure input pdos %d\n", ret_val);
exit(1);
}
ec_pdo_info_t pdo_read;
ec_pdo_entry_info_t pdo_entry;
if ((ret_val = ecrt_master_get_pdo(master, 0, SYNC_OUT, 0, &pdo_read)) < 0) {
printf("Unable to read output pdos %d\n", ret_val);
exit(1);
}
printf("Output PDO 0x%x with %d entries:\n", pdo_read.index, pdo_read.n_entries);
for (int i=0; i<pdo_read.n_entries; i++) {
if ((ret_val = ecrt_master_get_pdo_entry(master, 0, SYNC_OUT, 0, i, &pdo_entry)) < 0) {
printf("Unable to read output pdo entry %d %d\n", i, ret_val);
exit(1);
}
printf(" PDO entry %d: 0x%x %d %d\n", i, pdo_entry.index, pdo_entry.subindex, pdo_entry.bit_length);
}
if ((ret_val = ecrt_master_get_pdo(master, 0, SYNC_IN, 0, &pdo_read)) < 0) {
printf("Unable to read input pdos %d\n", ret_val);
exit(1);
}
printf("Input PDO 0x%x with %d entries:\n", pdo_read.index, pdo_read.n_entries);
for (int i=0; i<pdo_read.n_entries; i++) {
if ((ret_val = ecrt_master_get_pdo_entry(master, 0, SYNC_IN, 0, i, &pdo_entry)) < 0) {
printf("Unable to read output pdo entry %d %d\n", i, ret_val);
exit(1);
}
printf(" PDO entry %d: 0x%x %d %d\n", i, pdo_entry.index, pdo_entry.subindex, pdo_entry.bit_length);
}
}
_______________________________________________
etherlab-users mailing list
[email protected]
http://lists.etherlab.org/mailman/listinfo/etherlab-users