- /* Generate and set EtherCAT datagram in a standard ethernet frame.
- * 在标准以太网帧中生成和设置 EtherCAT 数据报
- * @param[in] port = port context struct
- * 端口(port)结构体
- * @param[out] frame = framebuffer
- * 帧缓冲区
- * @param[in] com = command
- * 命令(Ethercat 命令类型)
- * @param[in] idx = index used for TX and RX buffers
- * 用于 TX buffers(发送缓存区) 和 RX buffers(接收缓冲区) 的索引
- * @param[in] ADP = Address Position
- * 地址位置
- * @param[in] ADO = Address Offset
- * 地址偏移
- * @param[in] length = length of datagram excluding EtherCAT header
- * 不包括 EtherCAT 报头的数据报长度
- * @param[in] data = databuffer to be copied in datagram
- * 要在数据报中复制的数据缓冲区
- * @return always 0
- * 返回值 常为0
- */
- int ecx_setupdatagram(ecx_portt *port, void *frame, uint8 com, uint8 idx, uint16 ADP, uint16 ADO, uint16 length, void *data)
- {
- ec_comt *datagramP; /* EtherCAT 数据报头 */
- uint8 *frameP; /* 帧缓冲区 */
-
- frameP = frame;/* 帧缓冲区 */
- /* Ethernet header is preset and fixed in frame buffers
- EtherCAT header needs to be added after that */
- /* 以太网报头预设并固定在帧缓冲区中 之后需要添加EtherCAT 报头 */
- //EtherCAT 数据报头 = 帧缓冲区[以太网报头大小]
- datagramP = /* EtherCAT 数据报头 */
- (ec_comt*)&frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */];
- /* EtherCAT 数据报的长度 = 数据报类型 EtherCAT + EtherCAT 报头大小 + 不包括 EtherCAT 报头的数据报长度 */
- datagramP->elength = /* EtherCAT 数据报的长度,数据包长度 */
- htoes(/* 大小端转换操作宏 uint16 */
- EC_ECATTYPE + /* 数据报类型 EtherCAT=0x1000 */
- EC_HEADERSIZE + /* EtherCAT 报头大小=12U */
- length); /* 不包括 EtherCAT 报头的数据报长度 */
-
- datagramP->command = com; /* 命令(Ethercat 命令类型) */
- datagramP->index = idx;/* IDX 索引 */
- datagramP->ADP = /* ADP 地址区 */
- htoes(/* 大小端转换操作宏 uint16 */
- ADP);/* 地址位置 */
- datagramP->ADO =/* ADO 地址区 */
- htoes(/* 大小端转换操作宏 uint16 */
- ADO); /* 地址偏移 */
- datagramP->dlength = /* 数据报中数据部分的长度 */
- htoes(/* 大小端转换操作宏 uint16 */
- length); /* 不包括 EtherCAT 报头的数据报长度 */
- //将数据写入 EtherCAT 数据报
- ecx_writedatagramdata(
- &frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */
- + EC_HEADERSIZE/* EtherCAT 报头大小=12U */],
- com, /* 命令(Ethercat 命令类型) */
- length,/* 不包括 EtherCAT 报头的数据报长度 */
- data); /* 要在数据报中复制的数据缓冲区 */
- /* set WKC to zero *//* 将工作计数器设置为零 */
- //memset(frameP[ETH_HEADERSIZE + EC_HEADERSIZE + length], (uint16)0x00, EC_WKCSIZE);
- frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */
- + EC_HEADERSIZE/* EtherCAT 报头大小=12U */
- + length/* 不包括 EtherCAT 报头的数据报长度 */] = 0x00;
- frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */
- + EC_HEADERSIZE/* EtherCAT 报头大小=12U */
- + length/* 不包括 EtherCAT 报头的数据报长度 */ + 1] = 0x00;
- /* set size of frame in buffer array *//* 设置缓冲区数组中帧的大小 */
- port->txbuflength/* 发送缓存区长度 */[idx/* IDX 索引 */]
- = ETH_HEADERSIZE/* 以太网报头大小=14U */
- + EC_HEADERSIZE/* EtherCAT 报头大小=12U */
- + EC_WKCSIZE/* EtherCAT 数据报中工作计数器的大小=2U */
- + length;/* 不包括 EtherCAT 报头的数据报长度 */
-
- return 0; /* 返回值 常为0 */
- }