|
在欧姆龙 NJ/NX 系列 PLC 中,读取 EtherCAT 从站的 SDO(服务数据对象)数据需使用 EC_CoESDORead 功能块,该操作基于 CANopen over EtherCAT (CoE) 协议,适用于非实时参数配置或状态查询 。 核心步骤:硬件与工程准备 确保从站设备支持 CoE 协议,并在 Sysmac Studio 中正确导入 ESI/EDS 文件,使从站状态达到 SafeOP 或 OP 模式。 若从站处于 OP 模式且 PDO 已映射,建议暂时禁用相关 PDO 映射以避免通信冲突,或确保 SDO 请求不会干扰实时周期 。 调用指令 在 ST 或梯形图程序中调用 EC_CoESDORead 功能块(位于工具箱 Communication 分类下)。 关键参数配置: Node:设置从站的节点地址(整数,如 1, 2...)。 Index:指定对象字典的主索引(UINT,如 166041)。 SubIndex:指定子索引(BYTE,如 1600)。 IsCompleteAccess:设为 FALSE(仅访问指定子索引)或 TRUE(访问整个索引,较少用)。 Timeout:设置超时时间(单位 0.1s,如 20 代表 2 秒)。 Data:输出缓冲区变量(ARRAY 类型,用于接收读取的数据)。 执行逻辑 SDO 读写为单次触发机制,需在 Rising Edge(上升沿)触发执行。 若需持续监控数据,必须配合定时器或任务循环进行轮询,因为指令执行完毕后不会自动更新数据 。 检查输出引脚 Done 为 TRUE 且 Error 为 FALSE 表示读取成功,数据存在于 Data 数组中。 示例代码 (ST 语言) pascal // 定义变量 VAR fbRead : EC_CoESDORead; arrData : ARRAY[0..3] OF UINT; // 接收4字节数据缓冲 bTrigger : BOOL; tTimer : TON; END_VAR // 周期性触发 (例如每100ms尝试读取一次) tTimer(IN:=TRUE, PT:=T100ms); IF tTimer.Q THEN bTrigger := NOT bTrigger; // 产生脉冲 END_IF // 执行读取指令 fbRead( Node := 1, // 从站节点号 Index := 166041, // 例如读取状态字 IsCompleteAccess := FALSE, Timeout := 20, // 2秒超时 Data := arrData, Execute := bTrigger // 上升沿触发 ); // 错误处理 IF fbRead.Error THEN // 处理错误,检查 ErrorID END_IF 注意事项 数据格式:读取到的数据在 Data 数组中为小端序(Little-Endian),需根据实际数据类型进行转换 。 并发限制:同一时刻对同一从站只能执行一个 SDO 操作(读或写),多轴或多参数读取需分时轮询,否则指令会报错 。 状态依赖:若从站未进入 SafeOP/OP 状态,SDO 通信将失败,需先检查 EtherCAT 状态机 。 大数据传输:若读取数据超过 4 字节,协议会自动分段传输,但需确保从站支持分段 SDO 且超时时间设置足够长 。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |