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 * Base EtherCAT functions.
EasyCAT 0:543d6784d4cc 9 *
EasyCAT 0:543d6784d4cc 10 * Setting up a datagram in an ethernet frame.
EasyCAT 0:543d6784d4cc 11 * EtherCAT datagram primitives, broadcast, auto increment, configured and
EasyCAT 0:543d6784d4cc 12 * logical addressed data transfers. All base transfers are blocking, so
EasyCAT 0:543d6784d4cc 13 * wait for the frame to be returned to the master or timeout. If this is
EasyCAT 0:543d6784d4cc 14 * not acceptable build your own datagrams and use the functions from nicdrv.c.
EasyCAT 0:543d6784d4cc 15 */
EasyCAT 0:543d6784d4cc 16
EasyCAT 0:543d6784d4cc 17 #include <stdio.h>
EasyCAT 0:543d6784d4cc 18 #include <string.h>
EasyCAT 0:543d6784d4cc 19 #include "oshw.h"
EasyCAT 0:543d6784d4cc 20 #include "osal.h"
EasyCAT 0:543d6784d4cc 21 #include "ethercattype.h"
EasyCAT 0:543d6784d4cc 22 #include "ethercatbase.h"
EasyCAT 0:543d6784d4cc 23
EasyCAT 0:543d6784d4cc 24 /** Write data to EtherCAT datagram.
EasyCAT 0:543d6784d4cc 25 *
EasyCAT 0:543d6784d4cc 26 * @param[out] datagramdata = data part of datagram
EasyCAT 0:543d6784d4cc 27 * @param[in] com = command
EasyCAT 0:543d6784d4cc 28 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 29 * @param[in] data = databuffer to be copied into datagram
EasyCAT 0:543d6784d4cc 30 */
EasyCAT 0:543d6784d4cc 31 static void ecx_writedatagramdata(void *datagramdata, ec_cmdtype com, uint16 length, const void * data)
EasyCAT 0:543d6784d4cc 32 {
EasyCAT 0:543d6784d4cc 33 if (length > 0)
EasyCAT 0:543d6784d4cc 34 {
EasyCAT 0:543d6784d4cc 35 switch (com)
EasyCAT 0:543d6784d4cc 36 {
EasyCAT 0:543d6784d4cc 37 case EC_CMD_NOP:
EasyCAT 0:543d6784d4cc 38 /* Fall-through */
EasyCAT 0:543d6784d4cc 39 case EC_CMD_APRD:
EasyCAT 0:543d6784d4cc 40 /* Fall-through */
EasyCAT 0:543d6784d4cc 41 case EC_CMD_FPRD:
EasyCAT 0:543d6784d4cc 42 /* Fall-through */
EasyCAT 0:543d6784d4cc 43 case EC_CMD_BRD:
EasyCAT 0:543d6784d4cc 44 /* Fall-through */
EasyCAT 0:543d6784d4cc 45 case EC_CMD_LRD:
EasyCAT 0:543d6784d4cc 46 /* no data to write. initialise data so frame is in a known state */
EasyCAT 0:543d6784d4cc 47 memset(datagramdata, 0, length);
EasyCAT 0:543d6784d4cc 48 break;
EasyCAT 0:543d6784d4cc 49 default:
EasyCAT 0:543d6784d4cc 50 memcpy(datagramdata, data, length);
EasyCAT 0:543d6784d4cc 51 break;
EasyCAT 0:543d6784d4cc 52 }
EasyCAT 0:543d6784d4cc 53 }
EasyCAT 0:543d6784d4cc 54 }
EasyCAT 0:543d6784d4cc 55
EasyCAT 0:543d6784d4cc 56 /** Generate and set EtherCAT datagram in a standard ethernet frame.
EasyCAT 0:543d6784d4cc 57 *
EasyCAT 0:543d6784d4cc 58 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 59 * @param[out] frame = framebuffer
EasyCAT 0:543d6784d4cc 60 * @param[in] com = command
EasyCAT 0:543d6784d4cc 61 * @param[in] idx = index used for TX and RX buffers
EasyCAT 0:543d6784d4cc 62 * @param[in] ADP = Address Position
EasyCAT 0:543d6784d4cc 63 * @param[in] ADO = Address Offset
EasyCAT 0:543d6784d4cc 64 * @param[in] length = length of datagram excluding EtherCAT header
EasyCAT 0:543d6784d4cc 65 * @param[in] data = databuffer to be copied in datagram
EasyCAT 0:543d6784d4cc 66 * @return always 0
EasyCAT 0:543d6784d4cc 67 */
EasyCAT 0:543d6784d4cc 68 int ecx_setupdatagram(ecx_portt *port, void *frame, uint8 com, uint8 idx, uint16 ADP, uint16 ADO, uint16 length, void *data)
EasyCAT 0:543d6784d4cc 69 {
EasyCAT 0:543d6784d4cc 70 ec_comt *datagramP;
EasyCAT 0:543d6784d4cc 71 uint8 *frameP;
EasyCAT 0:543d6784d4cc 72
EasyCAT 0:543d6784d4cc 73 frameP = frame;
EasyCAT 0:543d6784d4cc 74 /* Ethernet header is preset and fixed in frame buffers
EasyCAT 0:543d6784d4cc 75 EtherCAT header needs to be added after that */
EasyCAT 0:543d6784d4cc 76 datagramP = (ec_comt*)&frameP[ETH_HEADERSIZE];
EasyCAT 0:543d6784d4cc 77 datagramP->elength = htoes(EC_ECATTYPE + EC_HEADERSIZE + length);
EasyCAT 0:543d6784d4cc 78 datagramP->command = com;
EasyCAT 0:543d6784d4cc 79 datagramP->index = idx;
EasyCAT 0:543d6784d4cc 80 datagramP->ADP = htoes(ADP);
EasyCAT 0:543d6784d4cc 81 datagramP->ADO = htoes(ADO);
EasyCAT 0:543d6784d4cc 82 datagramP->dlength = htoes(length);
EasyCAT 0:543d6784d4cc 83 ecx_writedatagramdata(&frameP[ETH_HEADERSIZE + EC_HEADERSIZE], com, length, data);
EasyCAT 0:543d6784d4cc 84 /* set WKC to zero */
EasyCAT 0:543d6784d4cc 85 frameP[ETH_HEADERSIZE + EC_HEADERSIZE + length] = 0x00;
EasyCAT 0:543d6784d4cc 86 frameP[ETH_HEADERSIZE + EC_HEADERSIZE + length + 1] = 0x00;
EasyCAT 0:543d6784d4cc 87 /* set size of frame in buffer array */
EasyCAT 0:543d6784d4cc 88 port->txbuflength[idx] = ETH_HEADERSIZE + EC_HEADERSIZE + EC_WKCSIZE + length;
EasyCAT 0:543d6784d4cc 89
EasyCAT 0:543d6784d4cc 90 return 0;
EasyCAT 0:543d6784d4cc 91 }
EasyCAT 0:543d6784d4cc 92
EasyCAT 0:543d6784d4cc 93 /** Add EtherCAT datagram to a standard ethernet frame with existing datagram(s).
EasyCAT 0:543d6784d4cc 94 *
EasyCAT 0:543d6784d4cc 95 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 96 * @param[out] frame = framebuffer
EasyCAT 0:543d6784d4cc 97 * @param[in] com = command
EasyCAT 0:543d6784d4cc 98 * @param[in] idx = index used for TX and RX buffers
EasyCAT 0:543d6784d4cc 99 * @param[in] more = TRUE if still more datagrams to follow
EasyCAT 0:543d6784d4cc 100 * @param[in] ADP = Address Position
EasyCAT 0:543d6784d4cc 101 * @param[in] ADO = Address Offset
EasyCAT 0:543d6784d4cc 102 * @param[in] length = length of datagram excluding EtherCAT header
EasyCAT 0:543d6784d4cc 103 * @param[in] data = databuffer to be copied in datagram
EasyCAT 0:543d6784d4cc 104 * @return Offset to data in rx frame, usefull to retrieve data after RX.
EasyCAT 0:543d6784d4cc 105 */
EasyCAT 0:543d6784d4cc 106 int ecx_adddatagram(ecx_portt *port, void *frame, uint8 com, uint8 idx, boolean more, uint16 ADP, uint16 ADO, uint16 length, void *data)
EasyCAT 0:543d6784d4cc 107 {
EasyCAT 0:543d6784d4cc 108 ec_comt *datagramP;
EasyCAT 0:543d6784d4cc 109 uint8 *frameP;
EasyCAT 0:543d6784d4cc 110 uint16 prevlength;
EasyCAT 0:543d6784d4cc 111
EasyCAT 0:543d6784d4cc 112 frameP = frame;
EasyCAT 0:543d6784d4cc 113 /* copy previous frame size */
EasyCAT 0:543d6784d4cc 114 prevlength = port->txbuflength[idx];
EasyCAT 0:543d6784d4cc 115 datagramP = (ec_comt*)&frameP[ETH_HEADERSIZE];
EasyCAT 0:543d6784d4cc 116 /* add new datagram to ethernet frame size */
EasyCAT 0:543d6784d4cc 117 datagramP->elength = htoes( etohs(datagramP->elength) + EC_HEADERSIZE + length );
EasyCAT 0:543d6784d4cc 118 /* add "datagram follows" flag to previous subframe dlength */
EasyCAT 0:543d6784d4cc 119 datagramP->dlength = htoes( etohs(datagramP->dlength) | EC_DATAGRAMFOLLOWS );
EasyCAT 0:543d6784d4cc 120 /* set new EtherCAT header position */
EasyCAT 0:543d6784d4cc 121 datagramP = (ec_comt*)&frameP[prevlength - EC_ELENGTHSIZE];
EasyCAT 0:543d6784d4cc 122 datagramP->command = com;
EasyCAT 0:543d6784d4cc 123 datagramP->index = idx;
EasyCAT 0:543d6784d4cc 124 datagramP->ADP = htoes(ADP);
EasyCAT 0:543d6784d4cc 125 datagramP->ADO = htoes(ADO);
EasyCAT 0:543d6784d4cc 126 if (more)
EasyCAT 0:543d6784d4cc 127 {
EasyCAT 0:543d6784d4cc 128 /* this is not the last datagram to add */
EasyCAT 0:543d6784d4cc 129 datagramP->dlength = htoes(length | EC_DATAGRAMFOLLOWS);
EasyCAT 0:543d6784d4cc 130 }
EasyCAT 0:543d6784d4cc 131 else
EasyCAT 0:543d6784d4cc 132 {
EasyCAT 0:543d6784d4cc 133 /* this is the last datagram in the frame */
EasyCAT 0:543d6784d4cc 134 datagramP->dlength = htoes(length);
EasyCAT 0:543d6784d4cc 135 }
EasyCAT 0:543d6784d4cc 136 ecx_writedatagramdata(&frameP[prevlength + EC_HEADERSIZE - EC_ELENGTHSIZE], com, length, data);
EasyCAT 0:543d6784d4cc 137 /* set WKC to zero */
EasyCAT 0:543d6784d4cc 138 frameP[prevlength + EC_HEADERSIZE - EC_ELENGTHSIZE + length] = 0x00;
EasyCAT 0:543d6784d4cc 139 frameP[prevlength + EC_HEADERSIZE - EC_ELENGTHSIZE + length + 1] = 0x00;
EasyCAT 0:543d6784d4cc 140 /* set size of frame in buffer array */
EasyCAT 0:543d6784d4cc 141 port->txbuflength[idx] = prevlength + EC_HEADERSIZE - EC_ELENGTHSIZE + EC_WKCSIZE + length;
EasyCAT 0:543d6784d4cc 142
EasyCAT 0:543d6784d4cc 143 /* return offset to data in rx frame
EasyCAT 0:543d6784d4cc 144 14 bytes smaller than tx frame due to stripping of ethernet header */
EasyCAT 0:543d6784d4cc 145 return prevlength + EC_HEADERSIZE - EC_ELENGTHSIZE - ETH_HEADERSIZE;
EasyCAT 0:543d6784d4cc 146 }
EasyCAT 0:543d6784d4cc 147
EasyCAT 0:543d6784d4cc 148 /** BRW "broadcast write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 149 *
EasyCAT 0:543d6784d4cc 150 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 151 * @param[in] ADP = Address Position, normally 0
EasyCAT 0:543d6784d4cc 152 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 153 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 154 * @param[in] data = databuffer to be written to slaves
EasyCAT 0:543d6784d4cc 155 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 156 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 157 */
EasyCAT 0:543d6784d4cc 158 int ecx_BWR (ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 159 {
EasyCAT 0:543d6784d4cc 160 uint8 idx;
EasyCAT 0:543d6784d4cc 161 int wkc;
EasyCAT 0:543d6784d4cc 162
EasyCAT 0:543d6784d4cc 163 /* get fresh index */
EasyCAT 0:543d6784d4cc 164 idx = ecx_getindex (port);
EasyCAT 0:543d6784d4cc 165 /* setup datagram */
EasyCAT 0:543d6784d4cc 166 ecx_setupdatagram (port, &(port->txbuf[idx]), EC_CMD_BWR, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 167 /* send data and wait for answer */
EasyCAT 0:543d6784d4cc 168 wkc = ecx_srconfirm (port, idx, timeout);
EasyCAT 0:543d6784d4cc 169 /* clear buffer status */
EasyCAT 0:543d6784d4cc 170 ecx_setbufstat (port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 171
EasyCAT 0:543d6784d4cc 172 return wkc;
EasyCAT 0:543d6784d4cc 173 }
EasyCAT 0:543d6784d4cc 174
EasyCAT 0:543d6784d4cc 175 /** BRD "broadcast read" primitive. Blocking.
EasyCAT 0:543d6784d4cc 176 *
EasyCAT 0:543d6784d4cc 177 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 178 * @param[in] ADP = Address Position, normally 0
EasyCAT 0:543d6784d4cc 179 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 180 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 181 * @param[out] data = databuffer to put slave data in
EasyCAT 0:543d6784d4cc 182 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 183 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 184 */
EasyCAT 0:543d6784d4cc 185 int ecx_BRD(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 186 {
EasyCAT 0:543d6784d4cc 187 uint8 idx;
EasyCAT 0:543d6784d4cc 188 int wkc;
EasyCAT 0:543d6784d4cc 189
EasyCAT 0:543d6784d4cc 190 /* get fresh index */
EasyCAT 0:543d6784d4cc 191 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 192 /* setup datagram */
EasyCAT 0:543d6784d4cc 193 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_BRD, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 194 /* send data and wait for answer */
EasyCAT 0:543d6784d4cc 195 wkc = ecx_srconfirm (port, idx, timeout);
EasyCAT 0:543d6784d4cc 196 if (wkc > 0)
EasyCAT 0:543d6784d4cc 197 {
EasyCAT 0:543d6784d4cc 198 /* copy datagram to data buffer */
EasyCAT 0:543d6784d4cc 199 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 200 }
EasyCAT 0:543d6784d4cc 201 /* clear buffer status */
EasyCAT 0:543d6784d4cc 202 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 203
EasyCAT 0:543d6784d4cc 204 return wkc;
EasyCAT 0:543d6784d4cc 205 }
EasyCAT 0:543d6784d4cc 206
EasyCAT 0:543d6784d4cc 207 /** APRD "auto increment address read" primitive. Blocking.
EasyCAT 0:543d6784d4cc 208 *
EasyCAT 0:543d6784d4cc 209 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 210 * @param[in] ADP = Address Position, each slave ++, slave that has 0 executes
EasyCAT 0:543d6784d4cc 211 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 212 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 213 * @param[out] data = databuffer to put slave data in
EasyCAT 0:543d6784d4cc 214 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 215 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 216 */
EasyCAT 0:543d6784d4cc 217 int ecx_APRD(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 218 {
EasyCAT 0:543d6784d4cc 219 int wkc;
EasyCAT 0:543d6784d4cc 220 uint8 idx;
EasyCAT 0:543d6784d4cc 221
EasyCAT 0:543d6784d4cc 222 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 223 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_APRD, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 224 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 225 if (wkc > 0)
EasyCAT 0:543d6784d4cc 226 {
EasyCAT 0:543d6784d4cc 227 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 228 }
EasyCAT 0:543d6784d4cc 229 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 230
EasyCAT 0:543d6784d4cc 231 return wkc;
EasyCAT 0:543d6784d4cc 232 }
EasyCAT 0:543d6784d4cc 233
EasyCAT 0:543d6784d4cc 234 /** APRMW "auto increment address read, multiple write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 235 *
EasyCAT 0:543d6784d4cc 236 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 237 * @param[in] ADP = Address Position, each slave ++, slave that has 0 reads,
EasyCAT 0:543d6784d4cc 238 * following slaves write.
EasyCAT 0:543d6784d4cc 239 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 240 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 241 * @param[out] data = databuffer to put slave data in
EasyCAT 0:543d6784d4cc 242 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 243 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 244 */
EasyCAT 0:543d6784d4cc 245 int ecx_ARMW(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 246 {
EasyCAT 0:543d6784d4cc 247 int wkc;
EasyCAT 0:543d6784d4cc 248 uint8 idx;
EasyCAT 0:543d6784d4cc 249
EasyCAT 0:543d6784d4cc 250 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 251 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_ARMW, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 252 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 253 if (wkc > 0)
EasyCAT 0:543d6784d4cc 254 {
EasyCAT 0:543d6784d4cc 255 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 256 }
EasyCAT 0:543d6784d4cc 257 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 258
EasyCAT 0:543d6784d4cc 259 return wkc;
EasyCAT 0:543d6784d4cc 260 }
EasyCAT 0:543d6784d4cc 261
EasyCAT 0:543d6784d4cc 262 /** FPRMW "configured address read, multiple write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 263 *
EasyCAT 0:543d6784d4cc 264 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 265 * @param[in] ADP = Address Position, slave that has address reads,
EasyCAT 0:543d6784d4cc 266 * following slaves write.
EasyCAT 0:543d6784d4cc 267 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 268 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 269 * @param[out] data = databuffer to put slave data in
EasyCAT 0:543d6784d4cc 270 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 271 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 272 */
EasyCAT 0:543d6784d4cc 273 int ecx_FRMW(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 274 {
EasyCAT 0:543d6784d4cc 275 int wkc;
EasyCAT 0:543d6784d4cc 276 uint8 idx;
EasyCAT 0:543d6784d4cc 277
EasyCAT 0:543d6784d4cc 278 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 279 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_FRMW, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 280 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 281 if (wkc > 0)
EasyCAT 0:543d6784d4cc 282 {
EasyCAT 0:543d6784d4cc 283 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 284 }
EasyCAT 0:543d6784d4cc 285 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 286
EasyCAT 0:543d6784d4cc 287 return wkc;
EasyCAT 0:543d6784d4cc 288 }
EasyCAT 0:543d6784d4cc 289
EasyCAT 0:543d6784d4cc 290 /** APRDw "auto increment address read" word return primitive. Blocking.
EasyCAT 0:543d6784d4cc 291 *
EasyCAT 0:543d6784d4cc 292 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 293 * @param[in] ADP = Address Position, each slave ++, slave that has 0 reads.
EasyCAT 0:543d6784d4cc 294 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 295 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 296 * @return word data from slave
EasyCAT 0:543d6784d4cc 297 */
EasyCAT 0:543d6784d4cc 298 uint16 ecx_APRDw(ecx_portt *port, uint16 ADP, uint16 ADO, int timeout)
EasyCAT 0:543d6784d4cc 299 {
EasyCAT 0:543d6784d4cc 300 uint16 w;
EasyCAT 0:543d6784d4cc 301
EasyCAT 0:543d6784d4cc 302 w = 0;
EasyCAT 0:543d6784d4cc 303 ecx_APRD(port, ADP, ADO, sizeof(w), &w, timeout);
EasyCAT 0:543d6784d4cc 304
EasyCAT 0:543d6784d4cc 305 return w;
EasyCAT 0:543d6784d4cc 306 }
EasyCAT 0:543d6784d4cc 307
EasyCAT 0:543d6784d4cc 308 /** FPRD "configured address read" primitive. Blocking.
EasyCAT 0:543d6784d4cc 309 *
EasyCAT 0:543d6784d4cc 310 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 311 * @param[in] ADP = Address Position, slave that has address reads.
EasyCAT 0:543d6784d4cc 312 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 313 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 314 * @param[out] data = databuffer to put slave data in
EasyCAT 0:543d6784d4cc 315 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 316 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 317 */
EasyCAT 0:543d6784d4cc 318 int ecx_FPRD(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 319 {
EasyCAT 0:543d6784d4cc 320 int wkc;
EasyCAT 0:543d6784d4cc 321 uint8 idx;
EasyCAT 0:543d6784d4cc 322
EasyCAT 0:543d6784d4cc 323 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 324 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_FPRD, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 325 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 326 if (wkc > 0)
EasyCAT 0:543d6784d4cc 327 {
EasyCAT 0:543d6784d4cc 328 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 329 }
EasyCAT 0:543d6784d4cc 330 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 331
EasyCAT 0:543d6784d4cc 332 return wkc;
EasyCAT 0:543d6784d4cc 333 }
EasyCAT 0:543d6784d4cc 334
EasyCAT 0:543d6784d4cc 335 /** FPRDw "configured address read" word return primitive. Blocking.
EasyCAT 0:543d6784d4cc 336 *
EasyCAT 0:543d6784d4cc 337 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 338 * @param[in] ADP = Address Position, slave that has address reads.
EasyCAT 0:543d6784d4cc 339 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 340 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 341 * @return word data from slave
EasyCAT 0:543d6784d4cc 342 */
EasyCAT 0:543d6784d4cc 343 uint16 ecx_FPRDw(ecx_portt *port, uint16 ADP, uint16 ADO, int timeout)
EasyCAT 0:543d6784d4cc 344 {
EasyCAT 0:543d6784d4cc 345 uint16 w;
EasyCAT 0:543d6784d4cc 346
EasyCAT 0:543d6784d4cc 347 w = 0;
EasyCAT 0:543d6784d4cc 348 ecx_FPRD(port, ADP, ADO, sizeof(w), &w, timeout);
EasyCAT 0:543d6784d4cc 349 return w;
EasyCAT 0:543d6784d4cc 350 }
EasyCAT 0:543d6784d4cc 351
EasyCAT 0:543d6784d4cc 352 /** APWR "auto increment address write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 353 *
EasyCAT 0:543d6784d4cc 354 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 355 * @param[in] ADP = Address Position, each slave ++, slave that has 0 writes.
EasyCAT 0:543d6784d4cc 356 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 357 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 358 * @param[in] data = databuffer to write to slave.
EasyCAT 0:543d6784d4cc 359 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 360 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 361 */
EasyCAT 0:543d6784d4cc 362 int ecx_APWR(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 363 {
EasyCAT 0:543d6784d4cc 364 uint8 idx;
EasyCAT 0:543d6784d4cc 365 int wkc;
EasyCAT 0:543d6784d4cc 366
EasyCAT 0:543d6784d4cc 367 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 368 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_APWR, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 369 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 370 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 371
EasyCAT 0:543d6784d4cc 372 return wkc;
EasyCAT 0:543d6784d4cc 373 }
EasyCAT 0:543d6784d4cc 374
EasyCAT 0:543d6784d4cc 375 /** APWRw "auto increment address write" word primitive. Blocking.
EasyCAT 0:543d6784d4cc 376 *
EasyCAT 0:543d6784d4cc 377 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 378 * @param[in] ADP = Address Position, each slave ++, slave that has 0 writes.
EasyCAT 0:543d6784d4cc 379 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 380 * @param[in] data = word data to write to slave.
EasyCAT 0:543d6784d4cc 381 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 382 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 383 */
EasyCAT 0:543d6784d4cc 384 int ecx_APWRw(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 data, int timeout)
EasyCAT 0:543d6784d4cc 385 {
EasyCAT 0:543d6784d4cc 386 return ecx_APWR(port, ADP, ADO, sizeof(data), &data, timeout);
EasyCAT 0:543d6784d4cc 387 }
EasyCAT 0:543d6784d4cc 388
EasyCAT 0:543d6784d4cc 389 /** FPWR "configured address write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 390 *
EasyCAT 0:543d6784d4cc 391 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 392 * @param[in] ADP = Address Position, slave that has address writes.
EasyCAT 0:543d6784d4cc 393 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 394 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 395 * @param[in] data = databuffer to write to slave.
EasyCAT 0:543d6784d4cc 396 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 397 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 398 */
EasyCAT 0:543d6784d4cc 399 int ecx_FPWR(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 400 {
EasyCAT 0:543d6784d4cc 401 int wkc;
EasyCAT 0:543d6784d4cc 402 uint8 idx;
EasyCAT 0:543d6784d4cc 403
EasyCAT 0:543d6784d4cc 404 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 405 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_FPWR, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 406 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 407 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 408
EasyCAT 0:543d6784d4cc 409 return wkc;
EasyCAT 0:543d6784d4cc 410 }
EasyCAT 0:543d6784d4cc 411
EasyCAT 0:543d6784d4cc 412 /** FPWR "configured address write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 413 *
EasyCAT 0:543d6784d4cc 414 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 415 * @param[in] ADP = Address Position, slave that has address writes.
EasyCAT 0:543d6784d4cc 416 * @param[in] ADO = Address Offset, slave memory address
EasyCAT 0:543d6784d4cc 417 * @param[in] data = word to write to slave.
EasyCAT 0:543d6784d4cc 418 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 419 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 420 */
EasyCAT 0:543d6784d4cc 421 int ecx_FPWRw(ecx_portt *port, uint16 ADP, uint16 ADO, uint16 data, int timeout)
EasyCAT 0:543d6784d4cc 422 {
EasyCAT 0:543d6784d4cc 423 return ecx_FPWR(port, ADP, ADO, sizeof(data), &data, timeout);
EasyCAT 0:543d6784d4cc 424 }
EasyCAT 0:543d6784d4cc 425
EasyCAT 0:543d6784d4cc 426 /** LRW "logical memory read / write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 427 *
EasyCAT 0:543d6784d4cc 428 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 429 * @param[in] LogAdr = Logical memory address
EasyCAT 0:543d6784d4cc 430 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 431 * @param[in,out] data = databuffer to write to and read from slave.
EasyCAT 0:543d6784d4cc 432 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 433 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 434 */
EasyCAT 0:543d6784d4cc 435 int ecx_LRW(ecx_portt *port, uint32 LogAdr, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 436 {
EasyCAT 0:543d6784d4cc 437 uint8 idx;
EasyCAT 0:543d6784d4cc 438 int wkc;
EasyCAT 0:543d6784d4cc 439
EasyCAT 0:543d6784d4cc 440 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 441 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_LRW, idx, LO_WORD(LogAdr), HI_WORD(LogAdr), length, data);
EasyCAT 0:543d6784d4cc 442 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 443 if ((wkc > 0) && (port->rxbuf[idx][EC_CMDOFFSET] == EC_CMD_LRW))
EasyCAT 0:543d6784d4cc 444 {
EasyCAT 0:543d6784d4cc 445 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 446 }
EasyCAT 0:543d6784d4cc 447 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 448
EasyCAT 0:543d6784d4cc 449 return wkc;
EasyCAT 0:543d6784d4cc 450 }
EasyCAT 0:543d6784d4cc 451
EasyCAT 0:543d6784d4cc 452 /** LRD "logical memory read" primitive. Blocking.
EasyCAT 0:543d6784d4cc 453 *
EasyCAT 0:543d6784d4cc 454 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 455 * @param[in] LogAdr = Logical memory address
EasyCAT 0:543d6784d4cc 456 * @param[in] length = length of bytes to read from slave.
EasyCAT 0:543d6784d4cc 457 * @param[out] data = databuffer to read from slave.
EasyCAT 0:543d6784d4cc 458 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 459 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 460 */
EasyCAT 0:543d6784d4cc 461 int ecx_LRD(ecx_portt *port, uint32 LogAdr, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 462 {
EasyCAT 0:543d6784d4cc 463 uint8 idx;
EasyCAT 0:543d6784d4cc 464 int wkc;
EasyCAT 0:543d6784d4cc 465
EasyCAT 0:543d6784d4cc 466 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 467 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_LRD, idx, LO_WORD(LogAdr), HI_WORD(LogAdr), length, data);
EasyCAT 0:543d6784d4cc 468 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 469 if ((wkc > 0) && (port->rxbuf[idx][EC_CMDOFFSET]==EC_CMD_LRD))
EasyCAT 0:543d6784d4cc 470 {
EasyCAT 0:543d6784d4cc 471 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 472 }
EasyCAT 0:543d6784d4cc 473 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 474
EasyCAT 0:543d6784d4cc 475 return wkc;
EasyCAT 0:543d6784d4cc 476 }
EasyCAT 0:543d6784d4cc 477
EasyCAT 0:543d6784d4cc 478 /** LWR "logical memory write" primitive. Blocking.
EasyCAT 0:543d6784d4cc 479 *
EasyCAT 0:543d6784d4cc 480 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 481 * @param[in] LogAdr = Logical memory address
EasyCAT 0:543d6784d4cc 482 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 483 * @param[in] data = databuffer to write to slave.
EasyCAT 0:543d6784d4cc 484 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 485 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 486 */
EasyCAT 0:543d6784d4cc 487 int ecx_LWR(ecx_portt *port, uint32 LogAdr, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 488 {
EasyCAT 0:543d6784d4cc 489 uint8 idx;
EasyCAT 0:543d6784d4cc 490 int wkc;
EasyCAT 0:543d6784d4cc 491
EasyCAT 0:543d6784d4cc 492 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 493 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_LWR, idx, LO_WORD(LogAdr), HI_WORD(LogAdr), length, data);
EasyCAT 0:543d6784d4cc 494 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 495 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 496
EasyCAT 0:543d6784d4cc 497 return wkc;
EasyCAT 0:543d6784d4cc 498 }
EasyCAT 0:543d6784d4cc 499
EasyCAT 0:543d6784d4cc 500 /** LRW "logical memory read / write" primitive plus Clock Distribution. Blocking.
EasyCAT 0:543d6784d4cc 501 * Frame consists of two datagrams, one LRW and one FPRMW.
EasyCAT 0:543d6784d4cc 502 *
EasyCAT 0:543d6784d4cc 503 * @param[in] port = port context struct
EasyCAT 0:543d6784d4cc 504 * @param[in] LogAdr = Logical memory address
EasyCAT 0:543d6784d4cc 505 * @param[in] length = length of databuffer
EasyCAT 0:543d6784d4cc 506 * @param[in,out] data = databuffer to write to and read from slave.
EasyCAT 0:543d6784d4cc 507 * @param[in] DCrs = Distributed Clock reference slave address.
EasyCAT 0:543d6784d4cc 508 * @param[out] DCtime = DC time read from reference slave.
EasyCAT 0:543d6784d4cc 509 * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
EasyCAT 0:543d6784d4cc 510 * @return Workcounter or EC_NOFRAME
EasyCAT 0:543d6784d4cc 511 */
EasyCAT 0:543d6784d4cc 512 int ecx_LRWDC(ecx_portt *port, uint32 LogAdr, uint16 length, void *data, uint16 DCrs, int64 *DCtime, int timeout)
EasyCAT 0:543d6784d4cc 513 {
EasyCAT 0:543d6784d4cc 514 uint16 DCtO;
EasyCAT 0:543d6784d4cc 515 uint8 idx;
EasyCAT 0:543d6784d4cc 516 int wkc;
EasyCAT 0:543d6784d4cc 517 uint64 DCtE;
EasyCAT 0:543d6784d4cc 518
EasyCAT 0:543d6784d4cc 519 idx = ecx_getindex(port);
EasyCAT 0:543d6784d4cc 520 /* LRW in first datagram */
EasyCAT 0:543d6784d4cc 521 ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_LRW, idx, LO_WORD(LogAdr), HI_WORD(LogAdr), length, data);
EasyCAT 0:543d6784d4cc 522 /* FPRMW in second datagram */
EasyCAT 0:543d6784d4cc 523 DCtE = htoell(*DCtime);
EasyCAT 0:543d6784d4cc 524 DCtO = ecx_adddatagram(port, &(port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE, DCrs, ECT_REG_DCSYSTIME, sizeof(DCtime), &DCtE);
EasyCAT 0:543d6784d4cc 525 wkc = ecx_srconfirm(port, idx, timeout);
EasyCAT 0:543d6784d4cc 526 if ((wkc > 0) && (port->rxbuf[idx][EC_CMDOFFSET] == EC_CMD_LRW))
EasyCAT 0:543d6784d4cc 527 {
EasyCAT 0:543d6784d4cc 528 memcpy(data, &(port->rxbuf[idx][EC_HEADERSIZE]), length);
EasyCAT 0:543d6784d4cc 529 memcpy(&wkc, &(port->rxbuf[idx][EC_HEADERSIZE + length]), EC_WKCSIZE);
EasyCAT 0:543d6784d4cc 530 memcpy(&DCtE, &(port->rxbuf[idx][DCtO]), sizeof(*DCtime));
EasyCAT 0:543d6784d4cc 531 *DCtime = etohll(DCtE);
EasyCAT 0:543d6784d4cc 532 }
EasyCAT 0:543d6784d4cc 533 ecx_setbufstat(port, idx, EC_BUF_EMPTY);
EasyCAT 0:543d6784d4cc 534
EasyCAT 0:543d6784d4cc 535 return wkc;
EasyCAT 0:543d6784d4cc 536 }
EasyCAT 0:543d6784d4cc 537
EasyCAT 0:543d6784d4cc 538 #ifdef EC_VER1
EasyCAT 0:543d6784d4cc 539 int ec_setupdatagram(void *frame, uint8 com, uint8 idx, uint16 ADP, uint16 ADO, uint16 length, void *data)
EasyCAT 0:543d6784d4cc 540 {
EasyCAT 0:543d6784d4cc 541 return ecx_setupdatagram (&ecx_port, frame, com, idx, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 542 }
EasyCAT 0:543d6784d4cc 543
EasyCAT 0:543d6784d4cc 544 int ec_adddatagram (void *frame, uint8 com, uint8 idx, boolean more, uint16 ADP, uint16 ADO, uint16 length, void *data)
EasyCAT 0:543d6784d4cc 545 {
EasyCAT 0:543d6784d4cc 546 return ecx_adddatagram (&ecx_port, frame, com, idx, more, ADP, ADO, length, data);
EasyCAT 0:543d6784d4cc 547 }
EasyCAT 0:543d6784d4cc 548
EasyCAT 0:543d6784d4cc 549 int ec_BWR(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 550 {
EasyCAT 0:543d6784d4cc 551 return ecx_BWR (&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 552 }
EasyCAT 0:543d6784d4cc 553
EasyCAT 0:543d6784d4cc 554 int ec_BRD(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 555 {
EasyCAT 0:543d6784d4cc 556 return ecx_BRD(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 557 }
EasyCAT 0:543d6784d4cc 558
EasyCAT 0:543d6784d4cc 559 int ec_APRD(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 560 {
EasyCAT 0:543d6784d4cc 561 return ecx_APRD(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 562 }
EasyCAT 0:543d6784d4cc 563
EasyCAT 0:543d6784d4cc 564 int ec_ARMW(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 565 {
EasyCAT 0:543d6784d4cc 566 return ecx_ARMW(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 567 }
EasyCAT 0:543d6784d4cc 568
EasyCAT 0:543d6784d4cc 569 int ec_FRMW(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 570 {
EasyCAT 0:543d6784d4cc 571 return ecx_FRMW(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 572 }
EasyCAT 0:543d6784d4cc 573
EasyCAT 0:543d6784d4cc 574 uint16 ec_APRDw(uint16 ADP, uint16 ADO, int timeout)
EasyCAT 0:543d6784d4cc 575 {
EasyCAT 0:543d6784d4cc 576 uint16 w;
EasyCAT 0:543d6784d4cc 577
EasyCAT 0:543d6784d4cc 578 w = 0;
EasyCAT 0:543d6784d4cc 579 ec_APRD(ADP, ADO, sizeof(w), &w, timeout);
EasyCAT 0:543d6784d4cc 580
EasyCAT 0:543d6784d4cc 581 return w;
EasyCAT 0:543d6784d4cc 582 }
EasyCAT 0:543d6784d4cc 583
EasyCAT 0:543d6784d4cc 584 int ec_FPRD(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 585 {
EasyCAT 0:543d6784d4cc 586 return ecx_FPRD(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 587 }
EasyCAT 0:543d6784d4cc 588
EasyCAT 0:543d6784d4cc 589 uint16 ec_FPRDw(uint16 ADP, uint16 ADO, int timeout)
EasyCAT 0:543d6784d4cc 590 {
EasyCAT 0:543d6784d4cc 591 uint16 w;
EasyCAT 0:543d6784d4cc 592
EasyCAT 0:543d6784d4cc 593 w = 0;
EasyCAT 0:543d6784d4cc 594 ec_FPRD(ADP, ADO, sizeof(w), &w, timeout);
EasyCAT 0:543d6784d4cc 595 return w;
EasyCAT 0:543d6784d4cc 596 }
EasyCAT 0:543d6784d4cc 597
EasyCAT 0:543d6784d4cc 598 int ec_APWR(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 599 {
EasyCAT 0:543d6784d4cc 600 return ecx_APWR(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 601 }
EasyCAT 0:543d6784d4cc 602
EasyCAT 0:543d6784d4cc 603 int ec_APWRw(uint16 ADP, uint16 ADO, uint16 data, int timeout)
EasyCAT 0:543d6784d4cc 604 {
EasyCAT 0:543d6784d4cc 605 return ec_APWR(ADP, ADO, sizeof(data), &data, timeout);
EasyCAT 0:543d6784d4cc 606 }
EasyCAT 0:543d6784d4cc 607
EasyCAT 0:543d6784d4cc 608 int ec_FPWR(uint16 ADP, uint16 ADO, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 609 {
EasyCAT 0:543d6784d4cc 610 return ecx_FPWR(&ecx_port, ADP, ADO, length, data, timeout);
EasyCAT 0:543d6784d4cc 611 }
EasyCAT 0:543d6784d4cc 612
EasyCAT 0:543d6784d4cc 613 int ec_FPWRw(uint16 ADP, uint16 ADO, uint16 data, int timeout)
EasyCAT 0:543d6784d4cc 614 {
EasyCAT 0:543d6784d4cc 615 return ec_FPWR(ADP, ADO, sizeof(data), &data, timeout);
EasyCAT 0:543d6784d4cc 616 }
EasyCAT 0:543d6784d4cc 617
EasyCAT 0:543d6784d4cc 618 int ec_LRW(uint32 LogAdr, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 619 {
EasyCAT 0:543d6784d4cc 620 return ecx_LRW(&ecx_port, LogAdr, length, data, timeout);
EasyCAT 0:543d6784d4cc 621 }
EasyCAT 0:543d6784d4cc 622
EasyCAT 0:543d6784d4cc 623 int ec_LRD(uint32 LogAdr, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 624 {
EasyCAT 0:543d6784d4cc 625 return ecx_LRD(&ecx_port, LogAdr, length, data, timeout);
EasyCAT 0:543d6784d4cc 626 }
EasyCAT 0:543d6784d4cc 627
EasyCAT 0:543d6784d4cc 628 int ec_LWR(uint32 LogAdr, uint16 length, void *data, int timeout)
EasyCAT 0:543d6784d4cc 629 {
EasyCAT 0:543d6784d4cc 630 return ecx_LWR(&ecx_port, LogAdr, length, data, timeout);
EasyCAT 0:543d6784d4cc 631 }
EasyCAT 0:543d6784d4cc 632
EasyCAT 0:543d6784d4cc 633 int ec_LRWDC(uint32 LogAdr, uint16 length, void *data, uint16 DCrs, int64 *DCtime, int timeout)
EasyCAT 0:543d6784d4cc 634 {
EasyCAT 0:543d6784d4cc 635 return ecx_LRWDC(&ecx_port, LogAdr, length, data, DCrs, DCtime, timeout);
EasyCAT 0:543d6784d4cc 636 }
EasyCAT 0:543d6784d4cc 637 #endif