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);