SOEM EtherCAT Master library for STM Nucleo F767ZI

Dependents:   EasyCAT_LAB_simple EasyCAT_LAB_very_simple EasyCAT_LAB

  • It has been developed for the EasyCAT LAB , a complete educational and experimental EtherCAT® system, composed of one master and two slaves .

Warning

/media/uploads/EasyCAT/easycat_lab.jpg

Committer:
EasyCAT
Date:
Tue Jun 11 10:29:09 2019 +0000
Revision:
0:543d6784d4cc
SOEM EtherCAT Master Library for STM Nucleo F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EasyCAT 0:543d6784d4cc 1 /*
EasyCAT 0:543d6784d4cc 2 * Licensed under the GNU General Public License version 2 with exceptions. See
EasyCAT 0:543d6784d4cc 3 * LICENSE file in the project root for full license information
EasyCAT 0:543d6784d4cc 4 */
EasyCAT 0:543d6784d4cc 5
EasyCAT 0:543d6784d4cc 6 /** \file
EasyCAT 0:543d6784d4cc 7 * \brief
EasyCAT 0:543d6784d4cc 8 * Headerfile for ethercatmain.c
EasyCAT 0:543d6784d4cc 9 */
EasyCAT 0:543d6784d4cc 10
EasyCAT 0:543d6784d4cc 11 #ifndef _ethercatmain_
EasyCAT 0:543d6784d4cc 12 #define _ethercatmain_
EasyCAT 0:543d6784d4cc 13
EasyCAT 0:543d6784d4cc 14
EasyCAT 0:543d6784d4cc 15 #ifdef __cplusplus
EasyCAT 0:543d6784d4cc 16 extern "C"
EasyCAT 0:543d6784d4cc 17 {
EasyCAT 0:543d6784d4cc 18 #endif
EasyCAT 0:543d6784d4cc 19
EasyCAT 0:543d6784d4cc 20 /** max. entries in EtherCAT error list */
EasyCAT 0:543d6784d4cc 21 #define EC_MAXELIST 64
EasyCAT 0:543d6784d4cc 22 /** max. length of readable name in slavelist and Object Description List */
EasyCAT 0:543d6784d4cc 23 #define EC_MAXNAME 40
EasyCAT 0:543d6784d4cc 24 /** max. number of slaves in array */
EasyCAT 0:543d6784d4cc 25 #define EC_MAXSLAVE 200
EasyCAT 0:543d6784d4cc 26 /** max. number of groups */
EasyCAT 0:543d6784d4cc 27 #define EC_MAXGROUP 2
EasyCAT 0:543d6784d4cc 28 /** max. number of IO segments per group */
EasyCAT 0:543d6784d4cc 29 #define EC_MAXIOSEGMENTS 64
EasyCAT 0:543d6784d4cc 30 /** max. mailbox size */
EasyCAT 0:543d6784d4cc 31 #define EC_MAXMBX 1486
EasyCAT 0:543d6784d4cc 32 /** max. eeprom PDO entries */
EasyCAT 0:543d6784d4cc 33 #define EC_MAXEEPDO 0x200
EasyCAT 0:543d6784d4cc 34 /** max. SM used */
EasyCAT 0:543d6784d4cc 35 #define EC_MAXSM 8
EasyCAT 0:543d6784d4cc 36 /** max. FMMU used */
EasyCAT 0:543d6784d4cc 37 #define EC_MAXFMMU 4
EasyCAT 0:543d6784d4cc 38 /** max. Adapter */
EasyCAT 0:543d6784d4cc 39 #define EC_MAXLEN_ADAPTERNAME 128
EasyCAT 0:543d6784d4cc 40 /** define maximum number of concurrent threads in mapping */
EasyCAT 0:543d6784d4cc 41 #define EC_MAX_MAPT 1
EasyCAT 0:543d6784d4cc 42
EasyCAT 0:543d6784d4cc 43 typedef struct ec_adapter ec_adaptert;
EasyCAT 0:543d6784d4cc 44 struct ec_adapter
EasyCAT 0:543d6784d4cc 45 {
EasyCAT 0:543d6784d4cc 46 char name[EC_MAXLEN_ADAPTERNAME];
EasyCAT 0:543d6784d4cc 47 char desc[EC_MAXLEN_ADAPTERNAME];
EasyCAT 0:543d6784d4cc 48 ec_adaptert *next;
EasyCAT 0:543d6784d4cc 49 };
EasyCAT 0:543d6784d4cc 50
EasyCAT 0:543d6784d4cc 51 /** record for FMMU */
EasyCAT 0:543d6784d4cc 52 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 53 typedef struct PACKED ec_fmmu
EasyCAT 0:543d6784d4cc 54 {
EasyCAT 0:543d6784d4cc 55 uint32 LogStart;
EasyCAT 0:543d6784d4cc 56 uint16 LogLength;
EasyCAT 0:543d6784d4cc 57 uint8 LogStartbit;
EasyCAT 0:543d6784d4cc 58 uint8 LogEndbit;
EasyCAT 0:543d6784d4cc 59 uint16 PhysStart;
EasyCAT 0:543d6784d4cc 60 uint8 PhysStartBit;
EasyCAT 0:543d6784d4cc 61 uint8 FMMUtype;
EasyCAT 0:543d6784d4cc 62 uint8 FMMUactive;
EasyCAT 0:543d6784d4cc 63 uint8 unused1;
EasyCAT 0:543d6784d4cc 64 uint16 unused2;
EasyCAT 0:543d6784d4cc 65 } ec_fmmut;
EasyCAT 0:543d6784d4cc 66 PACKED_END
EasyCAT 0:543d6784d4cc 67
EasyCAT 0:543d6784d4cc 68 /** record for sync manager */
EasyCAT 0:543d6784d4cc 69 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 70 typedef struct PACKED ec_sm
EasyCAT 0:543d6784d4cc 71 {
EasyCAT 0:543d6784d4cc 72 uint16 StartAddr;
EasyCAT 0:543d6784d4cc 73 uint16 SMlength;
EasyCAT 0:543d6784d4cc 74 uint32 SMflags;
EasyCAT 0:543d6784d4cc 75 } ec_smt;
EasyCAT 0:543d6784d4cc 76 PACKED_END
EasyCAT 0:543d6784d4cc 77
EasyCAT 0:543d6784d4cc 78 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 79 typedef struct PACKED ec_state_status
EasyCAT 0:543d6784d4cc 80 {
EasyCAT 0:543d6784d4cc 81 uint16 State;
EasyCAT 0:543d6784d4cc 82 uint16 Unused;
EasyCAT 0:543d6784d4cc 83 uint16 ALstatuscode;
EasyCAT 0:543d6784d4cc 84 } ec_state_status;
EasyCAT 0:543d6784d4cc 85 PACKED_END
EasyCAT 0:543d6784d4cc 86
EasyCAT 0:543d6784d4cc 87 #define ECT_MBXPROT_AOE 0x0001
EasyCAT 0:543d6784d4cc 88 #define ECT_MBXPROT_EOE 0x0002
EasyCAT 0:543d6784d4cc 89 #define ECT_MBXPROT_COE 0x0004
EasyCAT 0:543d6784d4cc 90 #define ECT_MBXPROT_FOE 0x0008
EasyCAT 0:543d6784d4cc 91 #define ECT_MBXPROT_SOE 0x0010
EasyCAT 0:543d6784d4cc 92 #define ECT_MBXPROT_VOE 0x0020
EasyCAT 0:543d6784d4cc 93
EasyCAT 0:543d6784d4cc 94 #define ECT_COEDET_SDO 0x01
EasyCAT 0:543d6784d4cc 95 #define ECT_COEDET_SDOINFO 0x02
EasyCAT 0:543d6784d4cc 96 #define ECT_COEDET_PDOASSIGN 0x04
EasyCAT 0:543d6784d4cc 97 #define ECT_COEDET_PDOCONFIG 0x08
EasyCAT 0:543d6784d4cc 98 #define ECT_COEDET_UPLOAD 0x10
EasyCAT 0:543d6784d4cc 99 #define ECT_COEDET_SDOCA 0x20
EasyCAT 0:543d6784d4cc 100
EasyCAT 0:543d6784d4cc 101 #define EC_SMENABLEMASK 0xfffeffff
EasyCAT 0:543d6784d4cc 102
EasyCAT 0:543d6784d4cc 103 /** for list of ethercat slaves detected */
EasyCAT 0:543d6784d4cc 104 typedef struct ec_slave
EasyCAT 0:543d6784d4cc 105 {
EasyCAT 0:543d6784d4cc 106 /** state of slave */
EasyCAT 0:543d6784d4cc 107 uint16 state;
EasyCAT 0:543d6784d4cc 108 /** AL status code */
EasyCAT 0:543d6784d4cc 109 uint16 ALstatuscode;
EasyCAT 0:543d6784d4cc 110 /** Configured address */
EasyCAT 0:543d6784d4cc 111 uint16 configadr;
EasyCAT 0:543d6784d4cc 112 /** Alias address */
EasyCAT 0:543d6784d4cc 113 uint16 aliasadr;
EasyCAT 0:543d6784d4cc 114 /** Manufacturer from EEprom */
EasyCAT 0:543d6784d4cc 115 uint32 eep_man;
EasyCAT 0:543d6784d4cc 116 /** ID from EEprom */
EasyCAT 0:543d6784d4cc 117 uint32 eep_id;
EasyCAT 0:543d6784d4cc 118 /** revision from EEprom */
EasyCAT 0:543d6784d4cc 119 uint32 eep_rev;
EasyCAT 0:543d6784d4cc 120 /** Interface type */
EasyCAT 0:543d6784d4cc 121 uint16 Itype;
EasyCAT 0:543d6784d4cc 122 /** Device type */
EasyCAT 0:543d6784d4cc 123 uint16 Dtype;
EasyCAT 0:543d6784d4cc 124 /** output bits */
EasyCAT 0:543d6784d4cc 125 uint16 Obits;
EasyCAT 0:543d6784d4cc 126 /** output bytes, if Obits < 8 then Obytes = 0 */
EasyCAT 0:543d6784d4cc 127 uint32 Obytes;
EasyCAT 0:543d6784d4cc 128 /** output pointer in IOmap buffer */
EasyCAT 0:543d6784d4cc 129 uint8 *outputs;
EasyCAT 0:543d6784d4cc 130 /** startbit in first output byte */
EasyCAT 0:543d6784d4cc 131 uint8 Ostartbit;
EasyCAT 0:543d6784d4cc 132 /** input bits */
EasyCAT 0:543d6784d4cc 133 uint16 Ibits;
EasyCAT 0:543d6784d4cc 134 /** input bytes, if Ibits < 8 then Ibytes = 0 */
EasyCAT 0:543d6784d4cc 135 uint32 Ibytes;
EasyCAT 0:543d6784d4cc 136 /** input pointer in IOmap buffer */
EasyCAT 0:543d6784d4cc 137 uint8 *inputs;
EasyCAT 0:543d6784d4cc 138 /** startbit in first input byte */
EasyCAT 0:543d6784d4cc 139 uint8 Istartbit;
EasyCAT 0:543d6784d4cc 140 /** SM structure */
EasyCAT 0:543d6784d4cc 141 ec_smt SM[EC_MAXSM];
EasyCAT 0:543d6784d4cc 142 /** SM type 0=unused 1=MbxWr 2=MbxRd 3=Outputs 4=Inputs */
EasyCAT 0:543d6784d4cc 143 uint8 SMtype[EC_MAXSM];
EasyCAT 0:543d6784d4cc 144 /** FMMU structure */
EasyCAT 0:543d6784d4cc 145 ec_fmmut FMMU[EC_MAXFMMU];
EasyCAT 0:543d6784d4cc 146 /** FMMU0 function */
EasyCAT 0:543d6784d4cc 147 uint8 FMMU0func;
EasyCAT 0:543d6784d4cc 148 /** FMMU1 function */
EasyCAT 0:543d6784d4cc 149 uint8 FMMU1func;
EasyCAT 0:543d6784d4cc 150 /** FMMU2 function */
EasyCAT 0:543d6784d4cc 151 uint8 FMMU2func;
EasyCAT 0:543d6784d4cc 152 /** FMMU3 function */
EasyCAT 0:543d6784d4cc 153 uint8 FMMU3func;
EasyCAT 0:543d6784d4cc 154 /** length of write mailbox in bytes, if no mailbox then 0 */
EasyCAT 0:543d6784d4cc 155 uint16 mbx_l;
EasyCAT 0:543d6784d4cc 156 /** mailbox write offset */
EasyCAT 0:543d6784d4cc 157 uint16 mbx_wo;
EasyCAT 0:543d6784d4cc 158 /** length of read mailbox in bytes */
EasyCAT 0:543d6784d4cc 159 uint16 mbx_rl;
EasyCAT 0:543d6784d4cc 160 /** mailbox read offset */
EasyCAT 0:543d6784d4cc 161 uint16 mbx_ro;
EasyCAT 0:543d6784d4cc 162 /** mailbox supported protocols */
EasyCAT 0:543d6784d4cc 163 uint16 mbx_proto;
EasyCAT 0:543d6784d4cc 164 /** Counter value of mailbox link layer protocol 1..7 */
EasyCAT 0:543d6784d4cc 165 uint8 mbx_cnt;
EasyCAT 0:543d6784d4cc 166 /** has DC capability */
EasyCAT 0:543d6784d4cc 167 boolean hasdc;
EasyCAT 0:543d6784d4cc 168 /** Physical type; Ebus, EtherNet combinations */
EasyCAT 0:543d6784d4cc 169 uint8 ptype;
EasyCAT 0:543d6784d4cc 170 /** topology: 1 to 3 links */
EasyCAT 0:543d6784d4cc 171 uint8 topology;
EasyCAT 0:543d6784d4cc 172 /** active ports bitmap : ....3210 , set if respective port is active **/
EasyCAT 0:543d6784d4cc 173 uint8 activeports;
EasyCAT 0:543d6784d4cc 174 /** consumed ports bitmap : ....3210, used for internal delay measurement **/
EasyCAT 0:543d6784d4cc 175 uint8 consumedports;
EasyCAT 0:543d6784d4cc 176 /** slave number for parent, 0=master */
EasyCAT 0:543d6784d4cc 177 uint16 parent;
EasyCAT 0:543d6784d4cc 178 /** port number on parent this slave is connected to **/
EasyCAT 0:543d6784d4cc 179 uint8 parentport;
EasyCAT 0:543d6784d4cc 180 /** port number on this slave the parent is connected to **/
EasyCAT 0:543d6784d4cc 181 uint8 entryport;
EasyCAT 0:543d6784d4cc 182 /** DC receivetimes on port A */
EasyCAT 0:543d6784d4cc 183 int32 DCrtA;
EasyCAT 0:543d6784d4cc 184 /** DC receivetimes on port B */
EasyCAT 0:543d6784d4cc 185 int32 DCrtB;
EasyCAT 0:543d6784d4cc 186 /** DC receivetimes on port C */
EasyCAT 0:543d6784d4cc 187 int32 DCrtC;
EasyCAT 0:543d6784d4cc 188 /** DC receivetimes on port D */
EasyCAT 0:543d6784d4cc 189 int32 DCrtD;
EasyCAT 0:543d6784d4cc 190 /** propagation delay */
EasyCAT 0:543d6784d4cc 191 int32 pdelay;
EasyCAT 0:543d6784d4cc 192 /** next DC slave */
EasyCAT 0:543d6784d4cc 193 uint16 DCnext;
EasyCAT 0:543d6784d4cc 194 /** previous DC slave */
EasyCAT 0:543d6784d4cc 195 uint16 DCprevious;
EasyCAT 0:543d6784d4cc 196 /** DC cycle time in ns */
EasyCAT 0:543d6784d4cc 197 int32 DCcycle;
EasyCAT 0:543d6784d4cc 198 /** DC shift from clock modulus boundary */
EasyCAT 0:543d6784d4cc 199 int32 DCshift;
EasyCAT 0:543d6784d4cc 200 /** DC sync activation, 0=off, 1=on */
EasyCAT 0:543d6784d4cc 201 uint8 DCactive;
EasyCAT 0:543d6784d4cc 202 /** link to config table */
EasyCAT 0:543d6784d4cc 203 uint16 configindex;
EasyCAT 0:543d6784d4cc 204 /** link to SII config */
EasyCAT 0:543d6784d4cc 205 uint16 SIIindex;
EasyCAT 0:543d6784d4cc 206 /** 1 = 8 bytes per read, 0 = 4 bytes per read */
EasyCAT 0:543d6784d4cc 207 uint8 eep_8byte;
EasyCAT 0:543d6784d4cc 208 /** 0 = eeprom to master , 1 = eeprom to PDI */
EasyCAT 0:543d6784d4cc 209 uint8 eep_pdi;
EasyCAT 0:543d6784d4cc 210 /** CoE details */
EasyCAT 0:543d6784d4cc 211 uint8 CoEdetails;
EasyCAT 0:543d6784d4cc 212 /** FoE details */
EasyCAT 0:543d6784d4cc 213 uint8 FoEdetails;
EasyCAT 0:543d6784d4cc 214 /** EoE details */
EasyCAT 0:543d6784d4cc 215 uint8 EoEdetails;
EasyCAT 0:543d6784d4cc 216 /** SoE details */
EasyCAT 0:543d6784d4cc 217 uint8 SoEdetails;
EasyCAT 0:543d6784d4cc 218 /** E-bus current */
EasyCAT 0:543d6784d4cc 219 int16 Ebuscurrent;
EasyCAT 0:543d6784d4cc 220 /** if >0 block use of LRW in processdata */
EasyCAT 0:543d6784d4cc 221 uint8 blockLRW;
EasyCAT 0:543d6784d4cc 222 /** group */
EasyCAT 0:543d6784d4cc 223 uint8 group;
EasyCAT 0:543d6784d4cc 224 /** first unused FMMU */
EasyCAT 0:543d6784d4cc 225 uint8 FMMUunused;
EasyCAT 0:543d6784d4cc 226 /** Boolean for tracking whether the slave is (not) responding, not used/set by the SOEM library */
EasyCAT 0:543d6784d4cc 227 boolean islost;
EasyCAT 0:543d6784d4cc 228 /** registered configuration function PO->SO */
EasyCAT 0:543d6784d4cc 229 int (*PO2SOconfig)(uint16 slave);
EasyCAT 0:543d6784d4cc 230 /** readable name */
EasyCAT 0:543d6784d4cc 231 char name[EC_MAXNAME + 1];
EasyCAT 0:543d6784d4cc 232 } ec_slavet;
EasyCAT 0:543d6784d4cc 233
EasyCAT 0:543d6784d4cc 234 /** for list of ethercat slave groups */
EasyCAT 0:543d6784d4cc 235 typedef struct ec_group
EasyCAT 0:543d6784d4cc 236 {
EasyCAT 0:543d6784d4cc 237 /** logical start address for this group */
EasyCAT 0:543d6784d4cc 238 uint32 logstartaddr;
EasyCAT 0:543d6784d4cc 239 /** output bytes, if Obits < 8 then Obytes = 0 */
EasyCAT 0:543d6784d4cc 240 uint32 Obytes;
EasyCAT 0:543d6784d4cc 241 /** output pointer in IOmap buffer */
EasyCAT 0:543d6784d4cc 242 uint8 *outputs;
EasyCAT 0:543d6784d4cc 243 /** input bytes, if Ibits < 8 then Ibytes = 0 */
EasyCAT 0:543d6784d4cc 244 uint32 Ibytes;
EasyCAT 0:543d6784d4cc 245 /** input pointer in IOmap buffer */
EasyCAT 0:543d6784d4cc 246 uint8 *inputs;
EasyCAT 0:543d6784d4cc 247 /** has DC capabillity */
EasyCAT 0:543d6784d4cc 248 boolean hasdc;
EasyCAT 0:543d6784d4cc 249 /** next DC slave */
EasyCAT 0:543d6784d4cc 250 uint16 DCnext;
EasyCAT 0:543d6784d4cc 251 /** E-bus current */
EasyCAT 0:543d6784d4cc 252 int16 Ebuscurrent;
EasyCAT 0:543d6784d4cc 253 /** if >0 block use of LRW in processdata */
EasyCAT 0:543d6784d4cc 254 uint8 blockLRW;
EasyCAT 0:543d6784d4cc 255 /** IO segments used */
EasyCAT 0:543d6784d4cc 256 uint16 nsegments;
EasyCAT 0:543d6784d4cc 257 /** 1st input segment */
EasyCAT 0:543d6784d4cc 258 uint16 Isegment;
EasyCAT 0:543d6784d4cc 259 /** Offset in input segment */
EasyCAT 0:543d6784d4cc 260 uint16 Ioffset;
EasyCAT 0:543d6784d4cc 261 /** Expected workcounter outputs */
EasyCAT 0:543d6784d4cc 262 uint16 outputsWKC;
EasyCAT 0:543d6784d4cc 263 /** Expected workcounter inputs */
EasyCAT 0:543d6784d4cc 264 uint16 inputsWKC;
EasyCAT 0:543d6784d4cc 265 /** check slave states */
EasyCAT 0:543d6784d4cc 266 boolean docheckstate;
EasyCAT 0:543d6784d4cc 267 /** IO segmentation list. Datagrams must not break SM in two. */
EasyCAT 0:543d6784d4cc 268 uint32 IOsegment[EC_MAXIOSEGMENTS];
EasyCAT 0:543d6784d4cc 269 } ec_groupt;
EasyCAT 0:543d6784d4cc 270
EasyCAT 0:543d6784d4cc 271 /** SII FMMU structure */
EasyCAT 0:543d6784d4cc 272 typedef struct ec_eepromFMMU
EasyCAT 0:543d6784d4cc 273 {
EasyCAT 0:543d6784d4cc 274 uint16 Startpos;
EasyCAT 0:543d6784d4cc 275 uint8 nFMMU;
EasyCAT 0:543d6784d4cc 276 uint8 FMMU0;
EasyCAT 0:543d6784d4cc 277 uint8 FMMU1;
EasyCAT 0:543d6784d4cc 278 uint8 FMMU2;
EasyCAT 0:543d6784d4cc 279 uint8 FMMU3;
EasyCAT 0:543d6784d4cc 280 } ec_eepromFMMUt;
EasyCAT 0:543d6784d4cc 281
EasyCAT 0:543d6784d4cc 282 /** SII SM structure */
EasyCAT 0:543d6784d4cc 283 typedef struct ec_eepromSM
EasyCAT 0:543d6784d4cc 284 {
EasyCAT 0:543d6784d4cc 285 uint16 Startpos;
EasyCAT 0:543d6784d4cc 286 uint8 nSM;
EasyCAT 0:543d6784d4cc 287 uint16 PhStart;
EasyCAT 0:543d6784d4cc 288 uint16 Plength;
EasyCAT 0:543d6784d4cc 289 uint8 Creg;
EasyCAT 0:543d6784d4cc 290 uint8 Sreg; /* don't care */
EasyCAT 0:543d6784d4cc 291 uint8 Activate;
EasyCAT 0:543d6784d4cc 292 uint8 PDIctrl; /* don't care */
EasyCAT 0:543d6784d4cc 293 } ec_eepromSMt;
EasyCAT 0:543d6784d4cc 294
EasyCAT 0:543d6784d4cc 295 /** record to store rxPDO and txPDO table from eeprom */
EasyCAT 0:543d6784d4cc 296 typedef struct ec_eepromPDO
EasyCAT 0:543d6784d4cc 297 {
EasyCAT 0:543d6784d4cc 298 uint16 Startpos;
EasyCAT 0:543d6784d4cc 299 uint16 Length;
EasyCAT 0:543d6784d4cc 300 uint16 nPDO;
EasyCAT 0:543d6784d4cc 301 uint16 Index[EC_MAXEEPDO];
EasyCAT 0:543d6784d4cc 302 uint16 SyncM[EC_MAXEEPDO];
EasyCAT 0:543d6784d4cc 303 uint16 BitSize[EC_MAXEEPDO];
EasyCAT 0:543d6784d4cc 304 uint16 SMbitsize[EC_MAXSM];
EasyCAT 0:543d6784d4cc 305 } ec_eepromPDOt;
EasyCAT 0:543d6784d4cc 306
EasyCAT 0:543d6784d4cc 307 /** mailbox buffer array */
EasyCAT 0:543d6784d4cc 308 typedef uint8 ec_mbxbuft[EC_MAXMBX + 1];
EasyCAT 0:543d6784d4cc 309
EasyCAT 0:543d6784d4cc 310 /** standard ethercat mailbox header */
EasyCAT 0:543d6784d4cc 311 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 312 typedef struct PACKED ec_mbxheader
EasyCAT 0:543d6784d4cc 313 {
EasyCAT 0:543d6784d4cc 314 uint16 length;
EasyCAT 0:543d6784d4cc 315 uint16 address;
EasyCAT 0:543d6784d4cc 316 uint8 priority;
EasyCAT 0:543d6784d4cc 317 uint8 mbxtype;
EasyCAT 0:543d6784d4cc 318 } ec_mbxheadert;
EasyCAT 0:543d6784d4cc 319 PACKED_END
EasyCAT 0:543d6784d4cc 320
EasyCAT 0:543d6784d4cc 321 /** ALstatus and ALstatus code */
EasyCAT 0:543d6784d4cc 322 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 323 typedef struct PACKED ec_alstatus
EasyCAT 0:543d6784d4cc 324 {
EasyCAT 0:543d6784d4cc 325 uint16 alstatus;
EasyCAT 0:543d6784d4cc 326 uint16 unused;
EasyCAT 0:543d6784d4cc 327 uint16 alstatuscode;
EasyCAT 0:543d6784d4cc 328 } ec_alstatust;
EasyCAT 0:543d6784d4cc 329 PACKED_END
EasyCAT 0:543d6784d4cc 330
EasyCAT 0:543d6784d4cc 331 /** stack structure to store segmented LRD/LWR/LRW constructs */
EasyCAT 0:543d6784d4cc 332 typedef struct ec_idxstack
EasyCAT 0:543d6784d4cc 333 {
EasyCAT 0:543d6784d4cc 334 uint8 pushed;
EasyCAT 0:543d6784d4cc 335 uint8 pulled;
EasyCAT 0:543d6784d4cc 336 uint8 idx[EC_MAXBUF];
EasyCAT 0:543d6784d4cc 337 void *data[EC_MAXBUF];
EasyCAT 0:543d6784d4cc 338 uint16 length[EC_MAXBUF];
EasyCAT 0:543d6784d4cc 339 } ec_idxstackT;
EasyCAT 0:543d6784d4cc 340
EasyCAT 0:543d6784d4cc 341 /** ringbuf for error storage */
EasyCAT 0:543d6784d4cc 342 typedef struct ec_ering
EasyCAT 0:543d6784d4cc 343 {
EasyCAT 0:543d6784d4cc 344 int16 head;
EasyCAT 0:543d6784d4cc 345 int16 tail;
EasyCAT 0:543d6784d4cc 346 ec_errort Error[EC_MAXELIST + 1];
EasyCAT 0:543d6784d4cc 347 } ec_eringt;
EasyCAT 0:543d6784d4cc 348
EasyCAT 0:543d6784d4cc 349 /** SyncManager Communication Type structure for CA */
EasyCAT 0:543d6784d4cc 350 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 351 typedef struct PACKED ec_SMcommtype
EasyCAT 0:543d6784d4cc 352 {
EasyCAT 0:543d6784d4cc 353 uint8 n;
EasyCAT 0:543d6784d4cc 354 uint8 nu1;
EasyCAT 0:543d6784d4cc 355 uint8 SMtype[EC_MAXSM];
EasyCAT 0:543d6784d4cc 356 } ec_SMcommtypet;
EasyCAT 0:543d6784d4cc 357 PACKED_END
EasyCAT 0:543d6784d4cc 358
EasyCAT 0:543d6784d4cc 359 /** SDO assign structure for CA */
EasyCAT 0:543d6784d4cc 360 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 361 typedef struct PACKED ec_PDOassign
EasyCAT 0:543d6784d4cc 362 {
EasyCAT 0:543d6784d4cc 363 uint8 n;
EasyCAT 0:543d6784d4cc 364 uint8 nu1;
EasyCAT 0:543d6784d4cc 365 uint16 index[256];
EasyCAT 0:543d6784d4cc 366 } ec_PDOassignt;
EasyCAT 0:543d6784d4cc 367 PACKED_END
EasyCAT 0:543d6784d4cc 368
EasyCAT 0:543d6784d4cc 369 /** SDO description structure for CA */
EasyCAT 0:543d6784d4cc 370 PACKED_BEGIN
EasyCAT 0:543d6784d4cc 371 typedef struct PACKED ec_PDOdesc
EasyCAT 0:543d6784d4cc 372 {
EasyCAT 0:543d6784d4cc 373 uint8 n;
EasyCAT 0:543d6784d4cc 374 uint8 nu1;
EasyCAT 0:543d6784d4cc 375 uint32 PDO[256];
EasyCAT 0:543d6784d4cc 376 } ec_PDOdesct;
EasyCAT 0:543d6784d4cc 377 PACKED_END
EasyCAT 0:543d6784d4cc 378
EasyCAT 0:543d6784d4cc 379 /** Context structure , referenced by all ecx functions*/
EasyCAT 0:543d6784d4cc 380 typedef struct ecx_context ecx_contextt;
EasyCAT 0:543d6784d4cc 381 struct ecx_context
EasyCAT 0:543d6784d4cc 382 {
EasyCAT 0:543d6784d4cc 383 /** port reference, may include red_port */
EasyCAT 0:543d6784d4cc 384 ecx_portt *port;
EasyCAT 0:543d6784d4cc 385 /** slavelist reference */
EasyCAT 0:543d6784d4cc 386 ec_slavet *slavelist;
EasyCAT 0:543d6784d4cc 387 /** number of slaves found in configuration */
EasyCAT 0:543d6784d4cc 388 int *slavecount;
EasyCAT 0:543d6784d4cc 389 /** maximum number of slaves allowed in slavelist */
EasyCAT 0:543d6784d4cc 390 int maxslave;
EasyCAT 0:543d6784d4cc 391 /** grouplist reference */
EasyCAT 0:543d6784d4cc 392 ec_groupt *grouplist;
EasyCAT 0:543d6784d4cc 393 /** maximum number of groups allowed in grouplist */
EasyCAT 0:543d6784d4cc 394 int maxgroup;
EasyCAT 0:543d6784d4cc 395 /** internal, reference to eeprom cache buffer */
EasyCAT 0:543d6784d4cc 396 uint8 *esibuf;
EasyCAT 0:543d6784d4cc 397 /** internal, reference to eeprom cache map */
EasyCAT 0:543d6784d4cc 398 uint32 *esimap;
EasyCAT 0:543d6784d4cc 399 /** internal, current slave for eeprom cache */
EasyCAT 0:543d6784d4cc 400 uint16 esislave;
EasyCAT 0:543d6784d4cc 401 /** internal, reference to error list */
EasyCAT 0:543d6784d4cc 402 ec_eringt *elist;
EasyCAT 0:543d6784d4cc 403 /** internal, reference to processdata stack buffer info */
EasyCAT 0:543d6784d4cc 404 ec_idxstackT *idxstack;
EasyCAT 0:543d6784d4cc 405 /** reference to ecaterror state */
EasyCAT 0:543d6784d4cc 406 boolean *ecaterror;
EasyCAT 0:543d6784d4cc 407 /** internal, position of DC datagram in process data packet */
EasyCAT 0:543d6784d4cc 408 uint16 DCtO;
EasyCAT 0:543d6784d4cc 409 /** internal, length of DC datagram */
EasyCAT 0:543d6784d4cc 410 uint16 DCl;
EasyCAT 0:543d6784d4cc 411 /** reference to last DC time from slaves */
EasyCAT 0:543d6784d4cc 412 int64 *DCtime;
EasyCAT 0:543d6784d4cc 413 /** internal, SM buffer */
EasyCAT 0:543d6784d4cc 414 ec_SMcommtypet *SMcommtype;
EasyCAT 0:543d6784d4cc 415 /** internal, PDO assign list */
EasyCAT 0:543d6784d4cc 416 ec_PDOassignt *PDOassign;
EasyCAT 0:543d6784d4cc 417 /** internal, PDO description list */
EasyCAT 0:543d6784d4cc 418 ec_PDOdesct *PDOdesc;
EasyCAT 0:543d6784d4cc 419 /** internal, SM list from eeprom */
EasyCAT 0:543d6784d4cc 420 ec_eepromSMt *eepSM;
EasyCAT 0:543d6784d4cc 421 /** internal, FMMU list from eeprom */
EasyCAT 0:543d6784d4cc 422 ec_eepromFMMUt *eepFMMU;
EasyCAT 0:543d6784d4cc 423 /** registered FoE hook */
EasyCAT 0:543d6784d4cc 424 int (*FOEhook)(uint16 slave, int packetnumber, int datasize);
EasyCAT 0:543d6784d4cc 425 /** registered EoE hook */
EasyCAT 0:543d6784d4cc 426 int (*EOEhook)(ecx_contextt * context, uint16 slave, void * eoembx);
EasyCAT 0:543d6784d4cc 427 };
EasyCAT 0:543d6784d4cc 428
EasyCAT 0:543d6784d4cc 429 #ifdef EC_VER1
EasyCAT 0:543d6784d4cc 430 /** global struct to hold default master context */
EasyCAT 0:543d6784d4cc 431 extern ecx_contextt ecx_context;
EasyCAT 0:543d6784d4cc 432 /** main slave data structure array */
EasyCAT 0:543d6784d4cc 433 extern ec_slavet ec_slave[EC_MAXSLAVE];
EasyCAT 0:543d6784d4cc 434 /** number of slaves found by configuration function */
EasyCAT 0:543d6784d4cc 435 extern int ec_slavecount;
EasyCAT 0:543d6784d4cc 436 /** slave group structure */
EasyCAT 0:543d6784d4cc 437 extern ec_groupt ec_group[EC_MAXGROUP];
EasyCAT 0:543d6784d4cc 438 extern boolean EcatError;
EasyCAT 0:543d6784d4cc 439 extern int64 ec_DCtime;
EasyCAT 0:543d6784d4cc 440
EasyCAT 0:543d6784d4cc 441 void ec_pusherror(const ec_errort *Ec);
EasyCAT 0:543d6784d4cc 442 boolean ec_poperror(ec_errort *Ec);
EasyCAT 0:543d6784d4cc 443 boolean ec_iserror(void);
EasyCAT 0:543d6784d4cc 444 void ec_packeterror(uint16 Slave, uint16 Index, uint8 SubIdx, uint16 ErrorCode);
EasyCAT 0:543d6784d4cc 445 int ec_init(const char * ifname);
EasyCAT 0:543d6784d4cc 446 int ec_init_redundant(const char *ifname, char *if2name);
EasyCAT 0:543d6784d4cc 447 void ec_close(void);
EasyCAT 0:543d6784d4cc 448 uint8 ec_siigetbyte(uint16 slave, uint16 address);
EasyCAT 0:543d6784d4cc 449 int16 ec_siifind(uint16 slave, uint16 cat);
EasyCAT 0:543d6784d4cc 450 void ec_siistring(char *str, uint16 slave, uint16 Sn);
EasyCAT 0:543d6784d4cc 451 uint16 ec_siiFMMU(uint16 slave, ec_eepromFMMUt* FMMU);
EasyCAT 0:543d6784d4cc 452 uint16 ec_siiSM(uint16 slave, ec_eepromSMt* SM);
EasyCAT 0:543d6784d4cc 453 uint16 ec_siiSMnext(uint16 slave, ec_eepromSMt* SM, uint16 n);
EasyCAT 0:543d6784d4cc 454 int ec_siiPDO(uint16 slave, ec_eepromPDOt* PDO, uint8 t);
EasyCAT 0:543d6784d4cc 455 int ec_readstate(void);
EasyCAT 0:543d6784d4cc 456 int ec_writestate(uint16 slave);
EasyCAT 0:543d6784d4cc 457 uint16 ec_statecheck(uint16 slave, uint16 reqstate, int timeout);
EasyCAT 0:543d6784d4cc 458 int ec_mbxempty(uint16 slave, int timeout);
EasyCAT 0:543d6784d4cc 459 int ec_mbxsend(uint16 slave,ec_mbxbuft *mbx, int timeout);
EasyCAT 0:543d6784d4cc 460 int ec_mbxreceive(uint16 slave, ec_mbxbuft *mbx, int timeout);
EasyCAT 0:543d6784d4cc 461 void ec_esidump(uint16 slave, uint8 *esibuf);
EasyCAT 0:543d6784d4cc 462 uint32 ec_readeeprom(uint16 slave, uint16 eeproma, int timeout);
EasyCAT 0:543d6784d4cc 463 int ec_writeeeprom(uint16 slave, uint16 eeproma, uint16 data, int timeout);
EasyCAT 0:543d6784d4cc 464 int ec_eeprom2master(uint16 slave);
EasyCAT 0:543d6784d4cc 465 int ec_eeprom2pdi(uint16 slave);
EasyCAT 0:543d6784d4cc 466 uint64 ec_readeepromAP(uint16 aiadr, uint16 eeproma, int timeout);
EasyCAT 0:543d6784d4cc 467 int ec_writeeepromAP(uint16 aiadr, uint16 eeproma, uint16 data, int timeout);
EasyCAT 0:543d6784d4cc 468 uint64 ec_readeepromFP(uint16 configadr, uint16 eeproma, int timeout);
EasyCAT 0:543d6784d4cc 469 int ec_writeeepromFP(uint16 configadr, uint16 eeproma, uint16 data, int timeout);
EasyCAT 0:543d6784d4cc 470 void ec_readeeprom1(uint16 slave, uint16 eeproma);
EasyCAT 0:543d6784d4cc 471 uint32 ec_readeeprom2(uint16 slave, int timeout);
EasyCAT 0:543d6784d4cc 472 int ec_send_processdata_group(uint8 group);
EasyCAT 0:543d6784d4cc 473 int ec_send_overlap_processdata_group(uint8 group);
EasyCAT 0:543d6784d4cc 474 int ec_receive_processdata_group(uint8 group, int timeout);
EasyCAT 0:543d6784d4cc 475 int ec_send_processdata(void);
EasyCAT 0:543d6784d4cc 476 int ec_send_overlap_processdata(void);
EasyCAT 0:543d6784d4cc 477 int ec_receive_processdata(int timeout);
EasyCAT 0:543d6784d4cc 478 #endif
EasyCAT 0:543d6784d4cc 479
EasyCAT 0:543d6784d4cc 480 ec_adaptert * ec_find_adapters(void);
EasyCAT 0:543d6784d4cc 481 void ec_free_adapters(ec_adaptert * adapter);
EasyCAT 0:543d6784d4cc 482 uint8 ec_nextmbxcnt(uint8 cnt);
EasyCAT 0:543d6784d4cc 483 void ec_clearmbx(ec_mbxbuft *Mbx);
EasyCAT 0:543d6784d4cc 484 void ecx_pusherror(ecx_contextt *context, const ec_errort *Ec);
EasyCAT 0:543d6784d4cc 485 boolean ecx_poperror(ecx_contextt *context, ec_errort *Ec);
EasyCAT 0:543d6784d4cc 486 boolean ecx_iserror(ecx_contextt *context);
EasyCAT 0:543d6784d4cc 487 void ecx_packeterror(ecx_contextt *context, uint16 Slave, uint16 Index, uint8 SubIdx, uint16 ErrorCode);
EasyCAT 0:543d6784d4cc 488 int ecx_init(ecx_contextt *context, const char * ifname);
EasyCAT 0:543d6784d4cc 489 int ecx_init_redundant(ecx_contextt *context, ecx_redportt *redport, const char *ifname, char *if2name);
EasyCAT 0:543d6784d4cc 490 void ecx_close(ecx_contextt *context);
EasyCAT 0:543d6784d4cc 491 uint8 ecx_siigetbyte(ecx_contextt *context, uint16 slave, uint16 address);
EasyCAT 0:543d6784d4cc 492 int16 ecx_siifind(ecx_contextt *context, uint16 slave, uint16 cat);
EasyCAT 0:543d6784d4cc 493 void ecx_siistring(ecx_contextt *context, char *str, uint16 slave, uint16 Sn);
EasyCAT 0:543d6784d4cc 494 uint16 ecx_siiFMMU(ecx_contextt *context, uint16 slave, ec_eepromFMMUt* FMMU);
EasyCAT 0:543d6784d4cc 495 uint16 ecx_siiSM(ecx_contextt *context, uint16 slave, ec_eepromSMt* SM);
EasyCAT 0:543d6784d4cc 496 uint16 ecx_siiSMnext(ecx_contextt *context, uint16 slave, ec_eepromSMt* SM, uint16 n);
EasyCAT 0:543d6784d4cc 497 int ecx_siiPDO(ecx_contextt *context, uint16 slave, ec_eepromPDOt* PDO, uint8 t);
EasyCAT 0:543d6784d4cc 498 int ecx_readstate(ecx_contextt *context);
EasyCAT 0:543d6784d4cc 499 int ecx_writestate(ecx_contextt *context, uint16 slave);
EasyCAT 0:543d6784d4cc 500 uint16 ecx_statecheck(ecx_contextt *context, uint16 slave, uint16 reqstate, int timeout);
EasyCAT 0:543d6784d4cc 501 int ecx_mbxempty(ecx_contextt *context, uint16 slave, int timeout);
EasyCAT 0:543d6784d4cc 502 int ecx_mbxsend(ecx_contextt *context, uint16 slave,ec_mbxbuft *mbx, int timeout);
EasyCAT 0:543d6784d4cc 503 int ecx_mbxreceive(ecx_contextt *context, uint16 slave, ec_mbxbuft *mbx, int timeout);
EasyCAT 0:543d6784d4cc 504 void ecx_esidump(ecx_contextt *context, uint16 slave, uint8 *esibuf);
EasyCAT 0:543d6784d4cc 505 uint32 ecx_readeeprom(ecx_contextt *context, uint16 slave, uint16 eeproma, int timeout);
EasyCAT 0:543d6784d4cc 506 int ecx_writeeeprom(ecx_contextt *context, uint16 slave, uint16 eeproma, uint16 data, int timeout);
EasyCAT 0:543d6784d4cc 507 int ecx_eeprom2master(ecx_contextt *context, uint16 slave);
EasyCAT 0:543d6784d4cc 508 int ecx_eeprom2pdi(ecx_contextt *context, uint16 slave);
EasyCAT 0:543d6784d4cc 509 uint64 ecx_readeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, int timeout);
EasyCAT 0:543d6784d4cc 510 int ecx_writeeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, uint16 data, int timeout);
EasyCAT 0:543d6784d4cc 511 uint64 ecx_readeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma, int timeout);
EasyCAT 0:543d6784d4cc 512 int ecx_writeeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma, uint16 data, int timeout);
EasyCAT 0:543d6784d4cc 513 void ecx_readeeprom1(ecx_contextt *context, uint16 slave, uint16 eeproma);
EasyCAT 0:543d6784d4cc 514 uint32 ecx_readeeprom2(ecx_contextt *context, uint16 slave, int timeout);
EasyCAT 0:543d6784d4cc 515 int ecx_send_overlap_processdata_group(ecx_contextt *context, uint8 group);
EasyCAT 0:543d6784d4cc 516 int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeout);
EasyCAT 0:543d6784d4cc 517 int ecx_send_processdata(ecx_contextt *context);
EasyCAT 0:543d6784d4cc 518 int ecx_send_overlap_processdata(ecx_contextt *context);
EasyCAT 0:543d6784d4cc 519 int ecx_receive_processdata(ecx_contextt *context, int timeout);
EasyCAT 0:543d6784d4cc 520 int ecx_send_processdata_group(ecx_contextt *context, uint8 group);
EasyCAT 0:543d6784d4cc 521
EasyCAT 0:543d6784d4cc 522 #ifdef __cplusplus
EasyCAT 0:543d6784d4cc 523 }
EasyCAT 0:543d6784d4cc 524 #endif
EasyCAT 0:543d6784d4cc 525
EasyCAT 0:543d6784d4cc 526 #endif