From 930d6e07c81591a9ed49d2ebd86c2c73856d966f Mon Sep 17 00:00:00 2001 From: Andreas Karlsson Date: Fri, 8 Mar 2019 16:35:16 +0100 Subject: [PATCH] improve groups, make memory usage more efficient, fix erroneous byte calculations and dc frame handling --- soem/ethercatconfig.c | 55 +++++++++++++++++++++++++++++++++---------- soem/ethercatdc.c | 4 ++-- soem/ethercatmain.h | 1 + soem/ethercattype.h | 2 ++ 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/soem/ethercatconfig.c b/soem/ethercatconfig.c index 1f68db0..b936e68 100644 --- a/soem/ethercatconfig.c +++ b/soem/ethercatconfig.c @@ -111,7 +111,8 @@ void ecx_init_context(ecx_contextt *context) ecx_siigetbyte(context, 0, EC_MAXEEPBUF); for(lp = 0; lp < context->maxgroup; lp++) { - context->grouplist[lp].logstartaddr = lp << 16; /* default start address per group entry */ + /* default start address per group entry */ + context->grouplist[lp].logstartaddr = lp << EC_LOGGROUPOFFSET; } } @@ -992,8 +993,19 @@ static void ecx_config_create_input_mappings(ecx_contextt *context, void *pIOmap } if (!context->slavelist[slave].inputs) { - context->slavelist[slave].inputs = - (uint8 *)(pIOmap)+etohl(context->slavelist[slave].FMMU[FMMUc].LogStart); + if (group) + { + context->slavelist[slave].inputs = + (uint8 *)(pIOmap) + + etohl(context->slavelist[slave].FMMU[FMMUc].LogStart) - + context->grouplist[group].logstartaddr; + } + else + { + context->slavelist[slave].inputs = + (uint8 *)(pIOmap) + + etohl(context->slavelist[slave].FMMU[FMMUc].LogStart); + } context->slavelist[slave].Istartbit = context->slavelist[slave].FMMU[FMMUc].LogStartbit; EC_PRINT(" Inputs %p startbit %d\n", @@ -1109,8 +1121,19 @@ static void ecx_config_create_output_mappings(ecx_contextt *context, void *pIOma context->grouplist[group].outputsWKC++; if (!context->slavelist[slave].outputs) { - context->slavelist[slave].outputs = - (uint8 *)(pIOmap)+etohl(context->slavelist[slave].FMMU[FMMUc].LogStart); + if (group) + { + context->slavelist[slave].outputs = + (uint8 *)(pIOmap) + + etohl(context->slavelist[slave].FMMU[FMMUc].LogStart) - + context->grouplist[group].logstartaddr; + } + else + { + context->slavelist[slave].outputs = + (uint8 *)(pIOmap) + + etohl(context->slavelist[slave].FMMU[FMMUc].LogStart); + } context->slavelist[slave].Ostartbit = context->slavelist[slave].FMMU[FMMUc].LogStartbit; EC_PRINT(" slave %d Outputs %p startbit %d\n", @@ -1204,14 +1227,15 @@ int ecx_config_map_group(ecx_contextt *context, void *pIOmap, uint8 group) } } context->grouplist[group].outputs = pIOmap; - context->grouplist[group].Obytes = LogAddr; + context->grouplist[group].Obytes = LogAddr - context->grouplist[group].logstartaddr; context->grouplist[group].nsegments = currentsegment + 1; context->grouplist[group].Isegment = currentsegment; context->grouplist[group].Ioffset = segmentsize; if (!group) { context->slavelist[0].outputs = pIOmap; - context->slavelist[0].Obytes = LogAddr; /* store output bytes in master record */ + context->slavelist[0].Obytes = LogAddr - + context->grouplist[group].logstartaddr; /* store output bytes in master record */ } /* do input mapping of slave and program FMMUs */ @@ -1274,11 +1298,15 @@ int ecx_config_map_group(ecx_contextt *context, void *pIOmap, uint8 group) context->grouplist[group].IOsegment[currentsegment] = segmentsize; context->grouplist[group].nsegments = currentsegment + 1; context->grouplist[group].inputs = (uint8 *)(pIOmap) + context->grouplist[group].Obytes; - context->grouplist[group].Ibytes = LogAddr - context->grouplist[group].Obytes; + context->grouplist[group].Ibytes = LogAddr - + context->grouplist[group].logstartaddr - + context->grouplist[group].Obytes; if (!group) { context->slavelist[0].inputs = (uint8 *)(pIOmap) + context->slavelist[0].Obytes; - context->slavelist[0].Ibytes = LogAddr - context->slavelist[0].Obytes; /* store input bytes in master record */ + context->slavelist[0].Ibytes = LogAddr - + context->grouplist[group].logstartaddr - + context->slavelist[0].Obytes; /* store input bytes in master record */ } EC_PRINT("IOmapSize %d\n", LogAddr - context->grouplist[group].logstartaddr); @@ -1391,8 +1419,8 @@ int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uint8 grou context->grouplist[group].Isegment = 0; context->grouplist[group].Ioffset = 0; - context->grouplist[group].Obytes = soLogAddr; - context->grouplist[group].Ibytes = siLogAddr; + context->grouplist[group].Obytes = soLogAddr - context->grouplist[group].logstartaddr; + context->grouplist[group].Ibytes = siLogAddr - context->grouplist[group].logstartaddr; context->grouplist[group].outputs = pIOmap; context->grouplist[group].inputs = (uint8 *)pIOmap + context->grouplist[group].Obytes; @@ -1404,10 +1432,11 @@ int ecx_config_overlap_map_group(ecx_contextt *context, void *pIOmap, uint8 grou if (!group) { + /* store output bytes in master record */ context->slavelist[0].outputs = pIOmap; - context->slavelist[0].Obytes = soLogAddr; /* store output bytes in master record */ + context->slavelist[0].Obytes = soLogAddr - context->grouplist[group].logstartaddr; context->slavelist[0].inputs = (uint8 *)pIOmap + context->slavelist[0].Obytes; - context->slavelist[0].Ibytes = siLogAddr; + context->slavelist[0].Ibytes = siLogAddr - context->grouplist[group].logstartaddr; } EC_PRINT("IOmapSize %d\n", context->grouplist[group].Obytes + context->grouplist[group].Ibytes); diff --git a/soem/ethercatdc.c b/soem/ethercatdc.c index 40c4340..b6220b1 100644 --- a/soem/ethercatdc.c +++ b/soem/ethercatdc.c @@ -281,8 +281,8 @@ boolean ecx_configdc(ecx_contextt *context) context->slavelist[0].hasdc = TRUE; context->slavelist[0].DCnext = i; context->slavelist[i].DCprevious = 0; - context->grouplist[0].hasdc = TRUE; - context->grouplist[0].DCnext = i; + context->grouplist[context->slavelist[i].group].hasdc = TRUE; + context->grouplist[context->slavelist[i].group].DCnext = i; } else { diff --git a/soem/ethercatmain.h b/soem/ethercatmain.h index 1e09751..3c39674 100644 --- a/soem/ethercatmain.h +++ b/soem/ethercatmain.h @@ -517,6 +517,7 @@ int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeou int ecx_send_processdata(ecx_contextt *context); int ecx_send_overlap_processdata(ecx_contextt *context); int ecx_receive_processdata(ecx_contextt *context, int timeout); +int ecx_send_processdata_group(ecx_contextt *context, uint8 group); #ifdef __cplusplus } diff --git a/soem/ethercattype.h b/soem/ethercattype.h index a0eb8a6..1881df3 100644 --- a/soem/ethercattype.h +++ b/soem/ethercattype.h @@ -71,6 +71,8 @@ extern "C" #define EC_MAXEEPBUF EC_MAXEEPBITMAP << 5 /** default number of retries if wkc <= 0 */ #define EC_DEFAULTRETRIES 3 +/** default group size in 2^x */ +#define EC_LOGGROUPOFFSET 16 /** definition for frame buffers */ typedef uint8 ec_bufT[EC_BUFSIZE];