当前位置: 首页 > news >正文

【原创】IgH EtherCAT主站详解(二十三)--API 参考

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_tec_pdo_info_tec_pdo_entry_info_t 结构体描述完整映射。数组以 index0xff 的项结尾。必须在 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_OUTPUTEC_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_UNUSEDEC_REQUEST_BUSYEC_REQUEST_SUCCESSEC_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_UNUSEDEC_REQUEST_BUSYEC_REQUEST_SUCCESSEC_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);
http://www.jsqmd.com/news/643829/

相关文章:

  • 【GESP】C++五级真题 luogu-P15798, [GESP202603 五级] 有限不循环小数
  • Vue3.0中优雅重置reactive/ref数据的实用方案与封装技巧
  • # 019、AutoSAR CP网络管理(NM)与诊断(UDS/DCM)配置实战笔记
  • 避坑实操:Ollama安装Yi-Coder-1.5B全流程,附常见错误解决方案
  • FID指标避坑指南:当你的生成模型分数突然飙升时该怎么办?
  • 剖析做车身电子PCB打样的厂家,推荐几家好用的靠谱品牌 - 工业品网
  • Blender3mfFormat插件深度解析:3D打印工作流中的关键技术实现与性能优化
  • 【含文档+PPT+源码】4S店车辆保养维护管理系统的设计与实现
  • 三月七小助手:崩坏星穹铁道全自动游戏助手终极指南
  • Hermes Agent 配置大全
  • d3d9.dll文件丢失怎么办?教你免费下载修复方法
  • 二叉树的右透视图
  • 如何用SMUDebugTool彻底解决AMD Ryzen系统故障:终极调试指南
  • 别再只写int main()了!C语言main函数传参的3种实战用法(附VS/PowerShell配置)
  • 2026年靠谱的智能制造伺服电机厂家推荐与采购指南 - 工业品牌热点
  • SQL注入(1)
  • kali 软件源设置为国内站点配置详解
  • 视频内容宝藏挖掘:智能PPT提取工具让知识留存更简单
  • SeqGPT-560M一键部署教程:开箱即用的NLP解决方案
  • 超元力VR大空间:以技术为桥,解锁沉浸式体验新可能
  • JetBrains IDE评估期重置技术解析:跨平台配置清理与插件化实现方案
  • 032.Web端部署:用Flask/FastAPI给YOLO造个API服务,这些坑我替你踩过了
  • Nano-Banana批量处理技巧:高效生成风格一致的产品拆解图
  • WindowsCleaner:高效解决C盘爆红问题的终极系统清理工具
  • 基于 FastAPI + Vue 深度定制的全栈自动化执行引擎设计全解
  • PMO-N8N
  • 改进型Z源逆变器拓扑及其并网研究
  • 【信奥业余科普】04:承载“0和1”的物理躯壳——从30吨的庞然大物到指甲盖大小的微缩奇迹
  • AI智能二维码工坊技术解析:H级容错编码原理与实现
  • ZoteroDuplicatesMerger架构设计与性能优化:学术文献去重插件的技术实现深度解析