IgH EtherCAT主站API参考具体有哪些用法?

摘要:API 参考 9.1 — ecrt.h 函数签名与使用说明 概览 ecrt.h — EtherCAT 实时接口 ecrt.h 是 IgH EtherCAT Master 的实时应用接口(EtherCAT Realtime Interface
API 参考 9.1 — ecrt.h 函数签名与使用说明 概览 ecrt.h — EtherCAT 实时接口 ecrt.h 是 IgH EtherCAT Master 的实时应用接口(EtherCAT Realtime Interface),为应用程序提供完整的 EtherCAT 主站控制能力。该接口同时支持内核空间(内核模块)和用户空间(通过字符设备/RTDM)两种运行环境。 接口版本 当前版本: ECRT_VER_MAJOR.ECRT_VER_MINOR.ECRT_VER_PATCH = 1.5.10(本文档基于 1.5.2 接口规范编写) 函数分组总览 分组 函数数量 用途 头文件位置 Master API 14 主站生命周期管理、激活/去激活、收发数据报、DC 同步、冗余链路状态 ecrt.h:605–1247 Domain API 7 域创建、PDO 注册、过程数据访问、域状态查询 ecrt.h:2030–2129 Slave Config API 6 从站配置:PDO 映射、DC 参数、看门狗、配置状态 ecrt.h:1456–1997 SDO Request API 7 SDO 请求创建、超时设置、读写触发、数据访问、状态查询 ecrt.h:2130–2260 VoE Handler API 9 Vendor-over-EtherCAT 处理器:创建、收发头部、数据访问、执行 ecrt.h:2500–2629 辅助宏 16+ EC_READ_* / EC_WRITE_* 过程数据读写宏 ecrt.h:2700–2951 典型调用顺序 [图示内容 - 请参考原文档查看完整图表] 技术详情 一、Master API Master API 负责主站的完整生命周期:从请求、配置、激活,到运行时数据报收发和分布式时钟同步。 ecrt_request_master() 签名 ec_master_t *ecrt_request_master(unsigned int master_index) 参数 master_index — 主站索引号,第一个主站为 0 返回值 成功时返回主站指针,失败返回 NULL 说明 请求一个 EtherCAT 主站用于实时操作。在用户空间中,此函数等价于依次调用 ecrt_open_master() 和 ecrt_master_reserve()。这是应用程序使用 EtherCAT 时必须调用的第一个函数。分配内存,不要在实时上下文中调用。 ecrt_release_master() 签名 void ecrt_release_master(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 无 说明 释放之前请求的主站。如果主站已激活,内部会自动调用 ecrt_master_deactivate()。释放所有已创建的数据结构。不要在实时上下文中调用。 ecrt_master_create_domain() 签名 ec_domain_t *ecrt_master_create_domain(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 成功时返回新域指针,失败返回 NULL 说明 创建一个新的过程数据域。至少需要一个域来进行过程数据交换。分配内存,必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_master_activate() 签名 int ecrt_master_activate(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 成功返回 0,失败返回负值错误码 说明 结束配置阶段,准备进入循环操作。为主站域分配内部内存,计算 FMMU 逻辑地址,通知主站状态机应用总线配置。调用后,应用程序需自行循环调用 ecrt_master_send() 和 ecrt_master_receive() 来维持总线通信。不要在实时上下文中调用。 ecrt_master_deactivate() 签名 void ecrt_master_deactivate(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 无 说明 去激活主站,移除总线配置。所有通过 ecrt_master_create_domain()、ecrt_master_slave_config()、ecrt_slave_config_create_sdo_request()、ecrt_slave_config_create_voe_handler() 创建的对象都会被释放,指向它们的指针将失效。不要在实时上下文中调用。 ecrt_master_slave_config() 签名 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code) 参数 master — EtherCAT 主站指针 alias — 从站别名地址(0 表示使用位置寻址) position — 从站环位置(或相对于别名的偏移) vendor_id — 期望的厂商 ID product_code — 期望的产品代码 返回值 成功返回从站配置指针,错误返回 NULL 说明 获取(或创建)从站配置对象。如果相同 alias/position 的配置已存在则复用,但会比对 vendor_id 和 product_code,不匹配时返回 NULL。分配内存,必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_master_callbacks() 签名 void ecrt_master_callbacks(ec_master_t *master, void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data) 参数 master — EtherCAT 主站指针 send_cb — 数据报发送回调函数 receive_cb — 数据报接收回调函数 cb_data — 传递给回调函数的任意指针 返回值 无 说明 注册发送/接收回调函数(仅内核空间)。用于并发主站访问(如 EoE 处理),允许非应用层实例收发数据报。必须在 ecrt_master_activate() 之前调用。 ecrt_master_send() 签名 size_t ecrt_master_send(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 发送的字节数 说明 将队列中所有数据报组装成以太网帧并发送到网络设备。在 ecrt_master_activate() 之后必须由应用程序循环调用。 ecrt_master_receive() 签名 void ecrt_master_receive(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 无 说明 从网络设备获取已接收的帧,提取数据报并分发结果。已接收和超时的数据报将被标记并移出队列。在 ecrt_master_activate() 之后必须由应用程序循环调用。 ecrt_master_state() 签名 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) 参数 master — EtherCAT 主站指针 state — 输出:用于存储状态信息的结构体 返回值 无(通过 state 输出参数返回) 说明 读取当前主站的全局状态,包括响应从站数量、AL 状态位图、链路状态和扫描状态。对于冗余拓扑中各链路的独立状态,请使用 ecrt_master_link_state()。 ecrt_master_application_time() 签名 void ecrt_master_application_time(ec_master_t *master, uint64_t app_time) 参数 master — EtherCAT 主站指针 app_time — 应用程序时间(纳秒,从 2000-01-01 00:00 起) 返回值 无 说明 设置应用程序时间,用于分布式时钟 (DC) 操作。主站不自行递增时间,因此必须在每个实时周期中循环调用。该时间用于计算从站 SYNC0/1 中断相位,建议在实时周期计算的起始点调用。可使用 EC_TIMEVAL2NANO() 宏进行 epoch 时间转换。 ecrt_master_sync_reference_clock_to() 签名 void ecrt_master_sync_reference_clock_to(ec_master_t *master, uint64_t app_time) 参数 master — EtherCAT 主站指针 app_time — 同步目标时间(纳秒) 返回值 无 说明 将 DC 参考时钟同步到指定时间。将参考时钟漂移补偿数据报加入发送队列。参考时钟将被同步到传入的 app_time 参数值。 ecrt_master_sync_slave_clocks() 签名 void ecrt_master_sync_slave_clocks(ec_master_t *master) 参数 master — EtherCAT 主站指针 返回值 无 说明 将 DC 时钟漂移补偿数据报加入发送队列。所有从站时钟将被同步到参考时钟。 ecrt_master_link_state() 签名 int ecrt_master_link(ec_master_t *master, unsigned int dev_idx, ec_master_link_state_t *state) 参数 master — EtherCAT 主站指针 dev_idx — 设备索引(0 = 主设备,1 = 第一个备份设备) state — 输出:用于存储链路状态的结构体 返回值 成功返回 0,失败返回负值错误码 说明 读取指定冗余链路的当前状态,包括该链路上的响应从站数量、AL 状态和链路连接状态。用于监测冗余拓扑中各独立链路的健康情况。 二、Domain API Domain(域)是过程数据交换的逻辑容器。每个域包含一组 FMMU 配置,对应一段连续的过程数据映像。 ecrt_domain_reg_pdo_entry_list() 签名 int ecrt_domain_reg_pdo_entry_list(ec_domain_t *domain, const ec_pdo_entry_reg_t *regs) 参数 domain — 域指针 regs — PDO 条目注册数组,以空结构体或 index 为 0 的结构体结尾 返回值 成功返回 0,失败返回非零值 说明 批量注册 PDO 条目到域中。每个注册项包含从站地址、厂商 ID、产品代码、PDO 索引/子索引,以及用于接收偏移量和位位置的输出指针。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_domain_process() 签名 void ecrt_domain_process(ec_domain_t *domain) 参数 domain — 域指针 返回值 无 说明 处理域数据报的状态,评估接收数据报的工作计数器 (Working Counter) 并输出统计信息。必须在 ecrt_master_receive() 之后调用,以便 ecrt_domain_state() 返回最新的过程数据交换结果。 ecrt_domain_queue() 签名 void ecrt_domain_queue(ec_domain_t *domain) 参数 domain — 域指针 返回值 无 说明 将域的所有数据报重新加入主站发送队列,标记为在下一次 ecrt_master_send() 时交换。在每个实时周期中调用。 ecrt_domain_state() 签名 void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) 参数 domain — 域指针 state — 输出:用于存储域状态的结构体 返回值 无(通过 state 输出参数返回) 说明 读取域的当前状态,包括工作计数器值、工作计数器解释(ZERO/INCOMPLETE/COMPLETE)以及冗余链路是否活跃。用于在实时环境中监控过程数据交换质量。 ecrt_domain_data() 签名 uint8_t *ecrt_domain_data(ec_domain_t *domain) 参数 domain — 域指针 返回值 指向过程数据内存的指针 说明 获取域的过程数据指针。内核空间中,如果提供了外部内存则返回其地址,否则返回内部分配的内存地址。用户空间中,必须在 ecrt_master_activate() 之后调用以获取映射后的域过程数据内存。 ecrt_domain_size() 签名 size_t ecrt_domain_size(const ec_domain_t *domain) 参数 domain — 域指针 返回值 过程数据映像的字节大小 说明 返回域的当前过程数据大小。在所有 PDO 条目注册完成后即可调用。 ecrt_domain_external_memory() 签名 void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *memory) 参数 domain — 域指针 memory — 外部内存地址,大小须至少为 ecrt_domain_size() 返回值 返回值 无 说明 为域提供外部内存来存储过程数据(仅内核空间)。在所有 PDO 条目注册完成后、ecrt_master_activate() 之前的非实时上下文中调用。调用后 ecrt_domain_data() 将返回该外部内存地址。 三、Slave Config API Slave Config API 用于配置从站的 PDO 映射、DC 同步参数、看门狗等,均在配置阶段(激活前)调用。 ecrt_slave_config_pdos() 签名 int ecrt_slave_config_pdos(ec_slave_config_t *sc, unsigned int n_syncs, const ec_sync_info_t syncs[]) 参数 sc — 从站配置指针 n_syncs — syncs 数组中的配置项数量(可用 EC_END 标记结尾) syncs — 同步管理器配置数组 返回值 成功返回 0,失败返回非零值 说明 一次性完成 PDO 配置的便捷封装,内部依次调用同步管理器配置、PDO 分配清除/添加、PDO 映射清除/添加。支持自动代码生成场景。使用 ec_sync_info_t、ec_pdo_info_t、ec_pdo_entry_info_t 结构体描述完整映射。数组以 index 为 0xff 的项结尾。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_slave_config_dc() 签名 void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle, int32_t sync0_shift, uint32_t sync1_cycle, int32_t sync1_shift) 参数 sc — 从站配置指针 assign_activate — AssignActivate 字(厂商特定,来自 XML 设备描述文件) sync0_cycle — SYNC0 周期时间 [ns] sync0_shift — SYNC0 偏移时间 [ns](支持负值) sync1_cycle — SYNC1 周期时间 [ns] sync1_shift — SYNC1 偏移时间 [ns](支持负值,当前版本被忽略) 返回值 无 说明 配置从站的分布式时钟 (DC)。设置 AssignActivate 字和 SYNC0/1 的周期与偏移时间。assign_activate 为 0 表示不使用 DC。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_slave_config_reg_pdo_entry() 签名 int ecrt_slave_config_reg_pdo_entry(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, ec_domain_t *domain, unsigned int *bit_position) 参数 sc — 从站配置指针 index — PDO 条目索引 subindex — PDO 条目子索引 domain — 要注册到的域 bit_position — 输出:位位置 (0-7),可为 NULL(此时非字节对齐会报错) 返回值 成功时返回 PDO 条目在过程数据中的字节偏移(>=0),失败返回负值错误码 说明 注册单个 PDO 条目到域中用于过程数据交换。搜索已分配的 PDO 中的给定条目,配置对应的同步管理器和 FMMU。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_slave_config_state() 签名 void ecrt_slave_config_state(const ec_slave_config_t *sc, ec_slave_config_state_t *state) 参数 sc — 从站配置指针 state — 输出:用于存储配置状态的结构体 返回值 无(通过 state 输出参数返回) 说明 读取从站配置的当前状态,包括是否在线、是否已操作 (OP)、AL 状态码、错误标志、就绪标志和环位置。状态由主站状态机更新,可能有数个周期的延迟。若要监控实时过程数据交换状态,建议使用 ecrt_domain_state()。 ecrt_slave_config_watchdog() 签名 void ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals) 参数 sc — 从站配置指针 divider — 看门狗基准单位(40 ns 间隔数),0 表示不写入(使用默认值) intervals — 过程数据看门狗的基准间隔数,0 表示不写入(使用默认值) 返回值 无 说明 配置从站的看门狗定时器参数。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_slave_config_complete_mapping() 签名 void ecrt_slave_config_complete_mapping(ec_slave_config_t *sc, ec_direction_t dir) 参数 sc — 从站配置指针 dir — 方向(EC_DIR_OUTPUT 或 EC_DIR_INPUT) 返回值 无 说明 使用从站 EEPROM 中存储的完整 PDO 映射。适用于不需要自定义 PDO 映射的场景,直接采用从站出厂默认配置。 四、SDO Request API SDO Request API 用于在实时运行期间与从站交换 SDO 数据。SDO 请求对象在配置阶段创建,运行期间通过状态机驱动完成读写。 ecrt_slave_config_create_sdo_request() 签名 ec_sdo_request_t *ecrt_slave_config_create_sdo_request(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, size_t size) 参数 sc — 从站配置指针 index — SDO 索引 subindex — SDO 子索引 size — 预留的数据内存大小 返回值 新的 SDO 请求指针,失败返回 NULL 说明 创建一个 SDO 请求对象,用于在实时运行期间交换 SDO 数据。请求对象在主站释放时自动释放。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_sdo_request_timeout() 签名 void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout_ms) 参数 req — SDO 请求指针 timeout_ms — 超时时间(毫秒),0 表示无超时 返回值 无 说明 设置 SDO 请求的超时时间。如果请求在指定时间内未能处理完成,将被标记为失败。超时值永久存储在请求对象中,直到下次调用此方法更新。 ecrt_sdo_request_state() 签名 ec_request_state_t ecrt_sdo_request_state(const ec_sdo_request_t *req) 参数 req — SDO 请求指针 返回值 请求状态枚举:EC_REQUEST_UNUSED、EC_REQUEST_BUSY、EC_REQUEST_SUCCESS 或 EC_REQUEST_ERROR 说明 查询 SDO 请求的当前状态。在实时循环中轮询此值以判断读/写操作是否完成。 ecrt_sdo_request_read() 签名 void ecrt_sdo_request_read(ec_sdo_request_t *req) 参数 req — SDO 请求指针 返回值 无 说明 触发一次 SDO 读取操作。调用后 ecrt_sdo_request_data() 的返回值在 EC_REQUEST_BUSY 期间无效。不得在 ecrt_sdo_request_state() 返回 EC_REQUEST_BUSY 时调用。 ecrt_sdo_request_write() 签名 void ecrt_sdo_request_write(ec_sdo_request_t *req) 参数 req — SDO 请求指针 返回值 无 说明 触发一次 SDO 写入操作。写入前需通过 ecrt_sdo_request_data() 获取数据指针并使用 EC_WRITE_* 宏写入数据。不得在 ecrt_sdo_request_state() 返回 EC_REQUEST_BUSY 时调用。 ecrt_sdo_request_data() 签名 uint8_t *ecrt_sdo_request_data(ec_sdo_request_t *req) 参数 req — SDO 请求指针 返回值 指向 SDO 数据内存的指针 说明 获取 SDO 请求的内部数据指针。读取成功后,可使用 EC_READ_*() 宏提取数据;写入前,可使用 EC_WRITE_*() 宏填入数据。注意在读取操作期间返回值可能无效(内部内存可能被重新分配)。 ecrt_sdo_request_data_size() 签名 size_t ecrt_sdo_request_data_size(const ec_sdo_request_t *req) 参数 req — SDO 请求指针 返回值 SDO 数据大小(字节) 说明 返回当前 SDO 数据大小。创建时设置为预留内存大小,读取操作完成后更新为实际读取的数据大小。 五、VoE Handler API VoE (Vendor-over-EtherCAT) Handler API 用于在实时运行期间交换厂商特定的邮箱数据。每个从站配置可创建多个 VoE 处理器。 ecrt_slave_config_create_voe_handler() 签名 ec_voe_handler_t *ecrt_slave_config_create_voe_handler(ec_slave_config_t *sc, size_t size) 参数 sc — 从站配置指针 size — 预留的数据内存大小 返回值 新的 VoE 处理器指针,失败返回 NULL 说明 创建一个 VoE 处理器对象。每个从站配置的 VoE 处理器数量不限,通常一个用于发送、一个用于接收。处理器对象在主站释放时自动释放。必须在 ecrt_master_activate() 之前的非实时上下文中调用。 ecrt_voe_handler_send_header() 签名 void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type) 参数 voe — VoE 处理器指针 vendor_id — 厂商 ID(4 字节) vendor_type — 厂商特定类型(2 字节) 返回值 无 说明 设置后续发送操作的 VoE 消息头部。VoE 消息以 4 字节 Vendor ID + 2 字节 Vendor Type 作为头部。设置的值在下次调用此方法前持续有效。 ecrt_voe_handler_received_header() 签名 void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type) 参数 voe — VoE 处理器指针 vendor_id — 输出:接收到的 Vendor ID vendor_type — 输出:接收到的 Vendor Type 返回值 无 说明 读取最近接收到的 VoE 消息的头部信息。在读取操作成功完成后调用。 ecrt_voe_handler_data() 签名 uint8_t *ecrt_voe_handler_data(ec_voe_handler_t *voe) 参数 voe — VoE 处理器指针 返回值 指向 VoE 数据内存的指针(位于 VoE 头部之后) 说明 获取 VoE 处理器的内部数据指针,指向 VoE 头部之后的实际数据区域。读取成功后可从中读取接收数据;写入前可向其填入待发送数据。注意读取操作后内部内存可能被重新分配。 ecrt_voe_handler_data_size() 签名 size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe) 参数 voe — VoE 处理器指针 返回值 VoE 数据大小(字节,不含头部) 说明 返回当前 VoE 数据大小(不含 6 字节 VoE 头部)。创建时为预留内存大小,写入时设为待写入字节数,读取完成后设为实际接收数据大小。 ecrt_voe_handler_data_size() (写入设置) 签名 void ecrt_voe_handler_data_size(ec_voe_handler_t *voe, size_t size) 参数 voe — VoE 处理器指针 size — 要发送的数据字节数(不含 VoE 头部) 返回值 无 说明 设置 VoE 发送操作的数据大小。在调用 ecrt_voe_handler_write() 之前使用此方法指定要发送的实际数据量。 ecrt_voe_handler_execute() 签名 ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe) 参数 voe — VoE 处理器指针 返回值 处理器状态:EC_REQUEST_UNUSED、EC_REQUEST_BUSY、EC_REQUEST_SUCCESS 或 EC_REQUEST_ERROR 说明 执行 VoE 处理器的状态机。在发起读/写操作后,必须在每个总线周期调用此方法,直到返回值不再是 EC_REQUEST_BUSY。处理器忙碌时不得启动其他操作。 ecrt_voe_handler_read() 签名 void ecrt_voe_handler_read(ec_voe_handler_t *voe) 参数 voe — VoE 处理器指针 返回值 无 说明 触发一次 VoE 读取操作。状态机将查询从站的发送邮箱以获取新数据。如果在超时时间内(EC_VOE_RESPONSE_TIMEOUT)没有数据出现,操作将失败。调用后必须在每个总线周期调用 ecrt_voe_handler_execute() 直到不再返回 EC_REQUEST_BUSY。 ecrt_voe_handler_write() 签名 void ecrt_voe_handler_write(ec_voe_handler_t *voe) 参数 voe — VoE 处理器指针 返回值 无 说明 触发一次 VoE 写入操作。写入前需通过 ecrt_voe_handler_data() 获取数据指针并填入待发送数据,通过 ecrt_voe_handler_data_size() 设置数据大小。调用后必须在每个总线周期调用 ecrt_voe_handler_execute() 直到不再返回 EC_REQUEST_BUSY。 六、过程数据读写宏 以下宏用于直接读写域过程数据映像中的整型值。所有宏均处理 EtherCAT 小端字节序,自动进行必要的字节交换。 读取宏 (EC_READ_*) 宏 功能 返回类型 EC_READ_U8(DATA) 从过程数据读取 8 位无符号值 uint8_t EC_READ_S8(DATA) 从过程数据读取 8 位有符号值 int8_t EC_READ_U16(DATA) 从过程数据读取 16 位无符号值(字节交换) uint16_t EC_READ_S16(DATA) 从过程数据读取 16 位有符号值(字节交换) int16_t EC_READ_U32(DATA) 从过程数据读取 32 位无符号值(字节交换) uint32_t EC_READ_S32(DATA) 从过程数据读取 32 位有符号值(字节交换) int32_t EC_READ_U64(DATA) 从过程数据读取 64 位无符号值(字节交换) uint64_t EC_READ_S64(DATA) 从过程数据读取 64 位有符号值(字节交换) int64_t 写入宏 (EC_WRITE_*) 宏 功能 参数 EC_WRITE_U8(DATA, VAL) 向过程数据写入 8 位无符号值 DATA: 数据指针, VAL: 写入值 EC_WRITE_S8(DATA, VAL) 向过程数据写入 8 位有符号值 DATA: 数据指针, VAL: 写入值 EC_WRITE_U16(DATA, VAL) 向过程数据写入 16 位无符号值(字节交换) DATA: 数据指针, VAL: 写入值 EC_WRITE_S16(DATA, VAL) 向过程数据写入 16 位有符号值(字节交换) DATA: 数据指针, VAL: 写入值 EC_WRITE_U32(DATA, VAL) 向过程数据写入 32 位无符号值(字节交换) DATA: 数据指针, VAL: 写入值 EC_WRITE_S32(DATA, VAL) 向过程数据写入 32 位有符号值(字节交换) DATA: 数据指针, VAL: 写入值 EC_WRITE_U64(DATA, VAL) 向过程数据写入 64 位无符号值(字节交换) DATA: 数据指针, VAL: 写入值 EC_WRITE_S64(DATA, VAL) 向过程数据写入 64 位有符号值(字节交换) DATA: 数据指针, VAL: 写入值 位操作宏 宏 功能 EC_READ_BIT(DATA, POS) 读取 EtherCAT 数据字节中的指定位 EC_WRITE_BIT(DATA, POS, VAL) 写入 EtherCAT 数据字节中的指定位 使用示例 从过程数据读取从站输出: uint8_t *pd = ecrt_domain_data(domain); uint16_t status = EC_READ_U16(pd + offset_status); int32_t value = EC_READ_S32(pd + offset_value); 向过程数据写入从站输入: EC_WRITE_U16(pd + offset_control, 0x0001); EC_WRITE_S32(pd + output_value, target_position);