• SOEM 源码解析 ecx_setupdatagram


    1. /* Generate and set EtherCAT datagram in a standard ethernet frame.
    2. * 在标准以太网帧中生成和设置 EtherCAT 数据报
    3. * @param[in] port = port context struct
    4. * 端口(port)结构体
    5. * @param[out] frame = framebuffer
    6. * 帧缓冲区
    7. * @param[in] com = command
    8. * 命令(Ethercat 命令类型)
    9. * @param[in] idx = index used for TX and RX buffers
    10. * 用于 TX buffers(发送缓存区) 和 RX buffers(接收缓冲区) 的索引
    11. * @param[in] ADP = Address Position
    12. * 地址位置
    13. * @param[in] ADO = Address Offset
    14. * 地址偏移
    15. * @param[in] length = length of datagram excluding EtherCAT header
    16. * 不包括 EtherCAT 报头的数据报长度
    17. * @param[in] data = databuffer to be copied in datagram
    18. * 要在数据报中复制的数据缓冲区
    19. * @return always 0
    20. * 返回值 常为0
    21. */
    22. int ecx_setupdatagram(ecx_portt *port, void *frame, uint8 com, uint8 idx, uint16 ADP, uint16 ADO, uint16 length, void *data)
    23. {
    24. ec_comt *datagramP; /* EtherCAT 数据报头 */
    25. uint8 *frameP; /* 帧缓冲区 */
    26. frameP = frame;/* 帧缓冲区 */
    27. /* Ethernet header is preset and fixed in frame buffers
    28. EtherCAT header needs to be added after that */
    29. /* 以太网报头预设并固定在帧缓冲区中 之后需要添加EtherCAT 报头 */
    30. //EtherCAT 数据报头 = 帧缓冲区[以太网报头大小]
    31. datagramP = /* EtherCAT 数据报头 */
    32. (ec_comt*)&frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */];
    33. /* EtherCAT 数据报的长度 = 数据报类型 EtherCAT + EtherCAT 报头大小 + 不包括 EtherCAT 报头的数据报长度 */
    34. datagramP->elength = /* EtherCAT 数据报的长度,数据包长度 */
    35. htoes(/* 大小端转换操作宏 uint16 */
    36. EC_ECATTYPE + /* 数据报类型 EtherCAT=0x1000 */
    37. EC_HEADERSIZE + /* EtherCAT 报头大小=12U */
    38. length); /* 不包括 EtherCAT 报头的数据报长度 */
    39. datagramP->command = com; /* 命令(Ethercat 命令类型) */
    40. datagramP->index = idx;/* IDX 索引 */
    41. datagramP->ADP = /* ADP 地址区 */
    42. htoes(/* 大小端转换操作宏 uint16 */
    43. ADP);/* 地址位置 */
    44. datagramP->ADO =/* ADO 地址区 */
    45. htoes(/* 大小端转换操作宏 uint16 */
    46. ADO); /* 地址偏移 */
    47. datagramP->dlength = /* 数据报中数据部分的长度 */
    48. htoes(/* 大小端转换操作宏 uint16 */
    49. length); /* 不包括 EtherCAT 报头的数据报长度 */
    50. //将数据写入 EtherCAT 数据报
    51. ecx_writedatagramdata(
    52. &frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */
    53. + EC_HEADERSIZE/* EtherCAT 报头大小=12U */],
    54. com, /* 命令(Ethercat 命令类型) */
    55. length,/* 不包括 EtherCAT 报头的数据报长度 */
    56. data); /* 要在数据报中复制的数据缓冲区 */
    57. /* set WKC to zero *//* 将工作计数器设置为零 */
    58. //memset(frameP[ETH_HEADERSIZE + EC_HEADERSIZE + length], (uint16)0x00, EC_WKCSIZE);
    59. frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */
    60. + EC_HEADERSIZE/* EtherCAT 报头大小=12U */
    61. + length/* 不包括 EtherCAT 报头的数据报长度 */] = 0x00;
    62. frameP[ETH_HEADERSIZE/* 以太网报头大小=14U */
    63. + EC_HEADERSIZE/* EtherCAT 报头大小=12U */
    64. + length/* 不包括 EtherCAT 报头的数据报长度 */ + 1] = 0x00;
    65. /* set size of frame in buffer array *//* 设置缓冲区数组中帧的大小 */
    66. port->txbuflength/* 发送缓存区长度 */[idx/* IDX 索引 */]
    67. = ETH_HEADERSIZE/* 以太网报头大小=14U */
    68. + EC_HEADERSIZE/* EtherCAT 报头大小=12U */
    69. + EC_WKCSIZE/* EtherCAT 数据报中工作计数器的大小=2U */
    70. + length;/* 不包括 EtherCAT 报头的数据报长度 */
    71. return 0; /* 返回值 常为0 */
    72. }

  • 相关阅读:
    2年自动化测试经验,连基础的都不会,还是卷王中的测试天花板,就这?
    Redis-压缩列表
    Node详解
    Centos7常用基本命令使用(进程管理类、网络状态类、系统定时类)
    第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)
    Thales安全解决方案:国家网络安全的关键
    UCOSII
    RabbitMQ(四)【Docker安装&AMQP协议】
    uniapp开发小技巧
    安装开源的apache的依赖库apr
  • 原文地址:https://blog.csdn.net/qq_25047389/article/details/127113082