<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Hi, guys</div><div>            I have written a program about Beckhoff EL2252. But there are some problems during running.</div><div>            The message is showed below.</div><div>/****************************************************************************/</div><div><div>Configuring PDOs...</div><div>Activating master...</div><div>Starting timer...</div><div>Started.</div><div>4 slave(s).</div><div>AL states: 0x02.</div><div>Link is up.</div><div>AnaIn: State 0x02.</div><div>AnaIn: online.</div><div>EtherCAT ERROR 0-1: Slave does not support CoE!</div><div>EtherCAT ERROR 0-1: Failed to read number of mapped PDO entries.</div><div>Domain1: WC 3.</div><div>Domain1: State 2.</div><div>AL states: 0x0A.</div><div>AnaIn: State 0x08.</div><div>AnaIn: operational.</div></div><div><span style="line-height: 23.8px;">/****************************************************************************/</span></div><div>The program:</div><div><div>#include <errno.h></div><div><br></div><div>#include <signal.h></div><div><br></div><div>#include <stdio.h></div><div><br></div><div>#include <string.h></div><div><br></div><div>#include <sys/resource.h></div><div><br></div><div>#include <sys/time.h></div><div><br></div><div>#include <sys/types.h></div><div><br></div><div>#include <unistd.h></div><div><br></div><div><br></div><div><br></div><div>/****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>#include "ecrt.h"</div><div><br></div><div>#include "slaves.h" //generated with the ethercat cstruct command</div><div><br></div><div>#include "EL2252.h"</div><div><br></div><div><br></div><div><br></div><div>/****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>// Application parameters</div><div><br></div><div>#define FREQUENCY 100</div><div><br></div><div>#define PRIORITY 0</div><div><br></div><div><br></div><div><br></div><div>// Optional features</div><div><br></div><div>#define CONFIGURE_PDOS  1</div><div><br></div><div>#define SDO_ACCESS 0</div><div><br></div><div><br></div><div><br></div><div>/****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>// EtherCAT</div><div><br></div><div>static ec_master_t *master = NULL;</div><div><br></div><div>static ec_master_state_t master_state = {};</div><div><br></div><div><br></div><div><br></div><div>static ec_domain_t *domain1 = NULL;</div><div><br></div><div>static ec_domain_state_t domain1_state = {};</div><div><br></div><div><br></div><div><br></div><div>//static ec_domain_t *domain2 = NULL;</div><div><br></div><div>//static ec_domain_state_t domain2_state = {};</div><div><br></div><div><br></div><div><br></div><div>static ec_slave_config_t *sc_ana_in = NULL;</div><div><br></div><div>static ec_slave_config_state_t sc_ana_in_state = {};</div><div><br></div><div><br></div><div><br></div><div>// Timer</div><div><br></div><div>static unsigned int sig_alarms = 0;</div><div><br></div><div>static unsigned int user_alarms = 0;</div><div><br></div><div><br></div><div><br></div><div>/****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>// process data</div><div><br></div><div>static uint8_t *domain1_pd = NULL;</div><div><br></div><div>//static uint8_t *domain2_pd = NULL;</div><div><br></div><div><br></div><div><br></div><div>#define BusCouplerPos  0, 0</div><div><br></div><div>#define Slave1Pos 0,1</div><div><br></div><div>#define Slave2Pos 0,2</div><div><br></div><div><br></div><div><br></div><div>//#define TI_AM3359ICE    0xE000059D, 0x54490001</div><div><br></div><div>#define Beckhoff_EL3702 0x00000002, 0x0e763052</div><div><br></div><div>#define Beckhoff_EK1100 0x00000002, 0x044c2c52</div><div><br></div><div><br></div><div><br></div><div>// Define a struct for each slave to hold values read or written</div><div><br></div><div>static El2252 el2252; // frist slave</div><div><br></div><div><br></div><div><br></div><div>const static ec_pdo_entry_reg_t domain1_regs[] = {</div><div><br></div><div>     // Slave 1: EL2252</div><div><br></div><div>    {Slave1Pos, Beckhoff_EL2252, 0x1d09, 0x81, &el2252.offset_activate, &el2252.bit_pos_activate},</div><div><br></div><div>    {Slave1Pos, Beckhoff_EL2252, 0x1d09, 0x90, &el2252.offset_start_time, &el2252.bit_pos_start_time},</div><div><br></div><div>    {Slave1Pos, Beckhoff_EL2252, 0x7000, 0x01, &el2252.offset_out[0], &el2252.bit_pos_out[0]},</div><div><br></div><div>    {Slave1Pos, Beckhoff_EL2252, 0x7000, 0x02, &el2252.offset_tristate[0], &el2252.bit_pos_tristate[0]},</div><div><br></div><div>    {Slave1Pos, Beckhoff_EL2252, 0x7010, 0x01, &el2252.offset_out[1], &el2252.bit_pos_out[1]},</div><div><br></div><div>    {Slave1Pos, Beckhoff_EL2252, 0x7010, 0x02, &el2252.offset_tristate[1], &el2252.bit_pos_tristate[1]},</div><div><br></div><div>    // Slave 2:EL3702</div><div><br></div><div>    {}</div><div><br></div><div>};</div><div><br></div><div><br></div><div><br></div><div>// offsets for PDO entries</div><div><br></div><div>//static unsigned int off_dig_out2;</div><div><br></div><div>//static unsigned int off_dig_in2;</div><div><br></div><div><br></div><div><br></div><div>static unsigned int counter = 0;</div><div><br></div><div>static unsigned int blink = 0;</div><div><br></div><div><br></div><div><br></div><div>/*****************************************************************************/</div><div><br></div><div>#if SDO_ACCESS</div><div><br></div><div>static ec_sdo_request_t *sdo;</div><div><br></div><div>#endif</div><div><br></div><div>/*****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>static void check_domain1_state(void)</div><div><br></div><div>{</div><div><br></div><div>    ec_domain_state_t ds;</div><div><br></div><div><br></div><div><br></div><div>    ecrt_domain_state(domain1, &ds);</div><div><br></div><div><br></div><div><br></div><div>    if (ds.working_counter != domain1_state.working_counter)</div><div><br></div><div>        printf("Domain1: WC %u.\n", ds.working_counter);</div><div><br></div><div>    if (ds.wc_state != domain1_state.wc_state)</div><div><br></div><div>        printf("Domain1: State %u.\n", ds.wc_state);</div><div><br></div><div><br></div><div><br></div><div>    domain1_state = ds;</div><div><br></div><div>}</div><div>/*****************************************************************************/</div><div>void check_master_state(void)</div><div><br></div><div>{</div><div><br></div><div>    ec_master_state_t ms;</div><div><br></div><div><br></div><div><br></div><div>    ecrt_master_state(master, &ms);</div><div><br></div><div><br></div><div><br></div><div>    if (ms.slaves_responding != master_state.slaves_responding)</div><div><br></div><div>        printf("%u slave(s).\n", ms.slaves_responding);</div><div><br></div><div>    if (ms.al_states != master_state.al_states)</div><div><br></div><div>        printf("AL states: 0x%02X.\n", ms.al_states);</div><div><br></div><div>    if (ms.link_up != master_state.link_up)</div><div><br></div><div>        printf("Link is %s.\n", ms.link_up ? "up" : "down");</div><div><br></div><div><br></div><div><br></div><div>    master_state = ms;</div><div><br></div><div>}</div><div><br></div><div><br></div><div><br></div><div>/*****************************************************************************/</div><div><br></div><div>void check_slave_config_states(void)</div><div><br></div><div>{</div><div><br></div><div>    ec_slave_config_state_t s;</div><div><br></div><div><br></div><div><br></div><div>    ecrt_slave_config_state(sc_ana_in, &s);</div><div><br></div><div><br></div><div><br></div><div>    if (s.al_state != sc_ana_in_state.al_state)</div><div><br></div><div>        printf("AnaIn: State 0x%02X.\n", s.al_state);</div><div><br></div><div>    if (s.online != sc_ana_in_state.online)</div><div><br></div><div>        printf("AnaIn: %s.\n", s.online ? "online" : "offline");</div><div><br></div><div>    if (s.operational != sc_ana_in_state.operational)</div><div><br></div><div>        printf("AnaIn: %soperational.\n",</div><div><br></div><div>                s.operational ? "" : "Not ");</div><div><br></div><div><br></div><div><br></div><div>    sc_ana_in_state = s;</div><div><br></div><div>}</div><div><br></div><div>/*****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>#if SDO_ACCESS</div><div><br></div><div>static void read_sdo(void)</div><div><br></div><div>{</div><div><br></div><div>    switch (ecrt_sdo_request_state(sdo)) {</div><div><br></div><div>        case EC_REQUEST_UNUSED: // request was not used yet</div><div><br></div><div>            ecrt_sdo_request_read(sdo); // trigger first read</div><div><br></div><div>            break;</div><div><br></div><div>        case EC_REQUEST_BUSY:</div><div><br></div><div>            fprintf(stderr, "Still busy...\n");</div><div><br></div><div>            break;</div><div><br></div><div>        case EC_REQUEST_SUCCESS:</div><div><br></div><div>            fprintf(stderr, "SDO value: 0x%04X\n",</div><div><br></div><div>                    EC_READ_U16(ecrt_sdo_request_data(sdo)));</div><div><br></div><div>            ecrt_sdo_request_read(sdo); // trigger next read</div><div><br></div><div>            break;</div><div><br></div><div>        case EC_REQUEST_ERROR:</div><div><br></div><div>            fprintf(stderr, "Failed to read SDO!\n");</div><div><br></div><div>            ecrt_sdo_request_read(sdo); // retry reading</div><div><br></div><div>            break;</div><div><br></div><div>    }</div><div><br></div><div>}</div><div><br></div><div>#endif</div><div><br></div><div>/****************************************************************************/</div><div><br></div><div>// Do the write for the EL2252: alternately blink the LEDs</div><div><br></div><div>static void write_process_data_el2252() {</div><div><br></div><div>    EC_WRITE_BIT(domain1_pd + el2252.offset_tristate[0], el2252.bit_pos_tristate[0], 0x00);</div><div><br></div><div>    EC_WRITE_BIT(domain1_pd + el2252.offset_tristate[1], el2252.bit_pos_tristate[1], 0x00);</div><div><br></div><div>    EC_WRITE_BIT(domain1_pd + el2252.offset_out[0], el2252.bit_pos_out[0], blink ? 0x01 : 0x00);</div><div><br></div><div>    EC_WRITE_BIT(domain1_pd + el2252.offset_out[1], el2252.bit_pos_out[1], blink ? 0x00 : 0x01);</div><div><br></div><div>}</div><div><br></div><div>/****************************************************************************/</div><div><br></div><div>static void write_process_data() {</div><div><br></div><div>    write_process_data_el2252();</div><div><br></div><div>}</div><div><br></div><div>/****************************************************************************/</div><div><br></div><div>// ONCE THE MASTER IS ACTIVATED, THE APP IS IN CHARGE OF EXCHANGING DATA THROUGH</div><div><br></div><div>// EXPLICIT CALLS TO THE ECRT LIBRARY (DONE IN THE IDLE STATE BY THE MASTER)</div><div><br></div><div>static void cyclic_task()</div><div><br></div><div>{</div><div><br></div><div>    int i;</div><div><br></div><div>    // receive process data</div><div><br></div><div>    ecrt_master_receive(master);    // RECEIVE A FRAME</div><div><br></div><div>    ecrt_domain_process(domain1);   // DETERMINE THE DATAGRAM STATES</div><div><br></div><div><br></div><div><br></div><div>    // check process data state (optional)</div><div><br></div><div>    check_domain1_state();</div><div><br></div><div><br></div><div><br></div><div>    if (counter) {</div><div><br></div><div>        counter--;</div><div><br></div><div>    } else { // do this at 1 Hz</div><div><br></div><div>        counter = FREQUENCY;</div><div><br></div><div><br></div><div><br></div><div>        // calculate new process data</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">         </span>blink = !blink;</div><div><br></div><div><br></div><div><br></div><div>        // check for master state (optional)</div><div><br></div><div>        check_master_state();</div><div><br></div><div><br></div><div><br></div><div>        // check for islave configuration state(s) (optional)</div><div><br></div><div>        check_slave_config_states();</div><div><br></div><div>#if SDO_ACCESS</div><div><br></div><div>    read_sdo();</div><div><br></div><div>#endif</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>}</div><div><br></div><div>#if 0</div><div><br></div><div>   printf("Slave1 Out1: state %u value %u\n",</div><div><br></div><div>            EC_READ_U8(domain1_pd + slave1_out1_status),</div><div><br></div><div>            EC_READ_U16(domain1_pd + slave1_out1_value));</div><div><br></div><div>#endif</div><div><br></div><div>     // write process data</div><div><br></div><div>    write_process_data();</div><div><br></div><div>    // send process data</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span>ecrt_domain_queue(domain1); // MARK THE DOMAIN DATA AS READY FOR EXCHANGE</div><div><br></div><div>    ecrt_master_send(master);   // SEND ALL QUEUED DATAGRAMS</div><div><br></div><div>}</div><div><br></div><div><br></div><div><br></div><div>/****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>void signal_handler(int signum) {</div><div><br></div><div>    switch (signum) {</div><div><br></div><div>        case SIGALRM:</div><div><br></div><div>            sig_alarms++;</div><div><br></div><div>            break;</div><div><br></div><div>    }</div><div><br></div><div>}</div><div><br></div><div><br></div><div><br></div><div>/****************************************************************************/</div><div><br></div><div>// Configures the PDO given the address of the slave's config pointer, syncs (from slaves.h),</div><div><br></div><div>// the slave's position and vendor info.</div><div><br></div><div>// Returns non-zero on error.</div><div><br></div><div>static int configure_pdo(</div><div><br></div><div>    ec_slave_config_t** config, // output param</div><div><br></div><div>    ec_sync_info_t* syncs, </div><div><br></div><div>    uint16_t alias, </div><div><br></div><div>    uint16_t position, </div><div><br></div><div>    uint32_t vendor_id, </div><div><br></div><div>    uint32_t product_code) {</div><div><br></div><div><br></div><div><br></div><div>    if (!(*config = ecrt_master_slave_config(master, alias, position, vendor_id, product_code))) {</div><div><br></div><div>        fprintf(stderr, "Failed to get slave configuration.\n");</div><div><br></div><div>        return -1;</div><div><br></div><div>    }</div><div><br></div><div><br></div><div><br></div><div>    if (ecrt_slave_config_pdos(*config, EC_END, syncs)) {</div><div><br></div><div>        fprintf(stderr, "Failed to configure PDOs.\n");</div><div><br></div><div>        return -1;</div><div><br></div><div>    }</div><div><br></div><div>    return 0;</div><div><br></div><div>}</div><div><br></div><div>/****************************************************************************/</div><div><br></div><div><br></div><div><br></div><div>int main(int argc, char **argv)</div><div><br></div><div>{</div><div><br></div><div>    ec_slave_config_t *sc;</div><div>    struct sigaction sa;</div><div>    struct itimerval tv;</div><div><br></div><div>    // FIRST, REQUEST A MASTER INSTANCE</div><div><br></div><div>    master = ecrt_request_master(0);</div><div><br></div><div>    if (!master)</div><div><br></div><div>        return -1;</div><div><br></div><div>    </div><div><br></div><div>    // THEN, CREATE A DOMAIN</div><div><br></div><div>    domain1 = ecrt_master_create_domain(master);</div><div><br></div><div>    if (!domain1)</div><div><br></div><div>        return -1;</div><div><br></div><div>    if (!(sc_ana_in = ecrt_master_slave_config(</div><div>                    master, Slave1Pos, Beckhoff_EL2252))) {</div><div>        fprintf(stderr, "Failed to get slave configuration.\n");</div><div>        return -1;</div><div>    }</div><div><br></div><div><br></div><div>    printf("Configuring PDOs...\n");     </div><div><br></div><div>    if (configure_pdo(&el2252.config, slave_1_syncs, Slave1Pos, Beckhoff_EL2252)) return -1;</div><div><br></div><div>    // Create configuration for bus coupler</div><div><br></div><div>    sc = ecrt_master_slave_config(master, BusCouplerPos, Beckhoff_EK1100);</div><div><br></div><div>    if (!sc) {</div><div><br></div><div>        return -1;</div><div><br></div><div>    }</div><div><br></div><div><br></div><div><br></div><div>    if (ecrt_domain_reg_pdo_entry_list(domain1, domain1_regs)) {</div><div><br></div><div>        fprintf(stderr, "PDO entry registration failed!\n");</div><div><br></div><div>        return -1;</div><div><br></div><div>    }</div><div><br></div><div><br></div><div><br></div><div>// ACTIVATE THE MASTER. DO NOT APPLY ANY CONFIGURATION AFTER THIS, IT WON'T WORK</div><div><br></div><div>    printf("Activating master...\n");</div><div><br></div><div>    if (ecrt_master_activate(master))</div><div><br></div><div>        return -1;</div><div><br></div><div>    </div><div><br></div><div>// INITIALIZE THE PROCESS DOMAIN MEMORY (FOR USER-SPACE APPS)</div><div><br></div><div>    if (!(domain1_pd = ecrt_domain_data(domain1))) {</div><div><br></div><div>        return -1;</div><div><br></div><div>    }</div><div><br></div><div>#if PRIORITY</div><div><br></div><div>    pid_t pid = getpid();</div><div><br></div><div>        if (setpriority(PRIO_PROCESS, pid, -19))</div><div><br></div><div>            fprintf(stderr, "Warning: Failed to set priority: %s\n", strerror(errno));</div><div><br></div><div>#endif</div><div><br></div><div><br></div><div><br></div><div>    sa.sa_handler = signal_handler;</div><div>    sigemptyset(&sa.sa_mask);</div><div>    sa.sa_flags = 0;</div><div>    if (sigaction(SIGALRM, &sa, 0)) {</div><div>        fprintf(stderr, "Failed to install signal handler!\n");</div><div>        return -1;</div><div>    }</div><div><br></div><div>    printf("Starting timer...\n");</div><div>    tv.it_interval.tv_sec = 0;</div><div>    tv.it_interval.tv_usec = 1000000 / FREQUENCY;</div><div>    tv.it_value.tv_sec = 0;</div><div>    tv.it_value.tv_usec = 1000;</div><div>    if (setitimer(ITIMER_REAL, &tv, NULL)) {</div><div>        fprintf(stderr, "Failed to start timer: %s\n", strerror(errno));</div><div>        return 1;</div><div>    }</div><div><br></div><div><br></div><div>        printf("Started.\n");</div><div><br></div><div>        while (1) {</div><div><br></div><div>            pause();</div><div><br></div><div>    </div><div><br></div><div>#if 0</div><div><br></div><div>            struct timeval t;</div><div><br></div><div>            gettimeofday(&t, NULL);</div><div><br></div><div>            printf("%u.%06u\n", t.tv_sec, t.tv_usec);</div><div><br></div><div>#endif</div><div><br></div><div>        while (sig_alarms != user_alarms) {</div><div><br></div><div>            cyclic_task();</div><div><br></div><div>            user_alarms++;</div><div><br></div><div>        }</div><div><br></div><div>    }</div><div><br></div><div>    return 0;</div><div><br></div><div>}</div><div><br></div><div>/****************************************************************************/</div></div><div>Can anyone gives me some suggestions?</div><div>Best Regards,</div><div>Yang</div></div><br><br><span title="neteasefooter"><p> </p></span>