『7x24小时有问必答』
在欧姆龙 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,          // 例如读取状态字
      SubIndex := 1600,
      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 且超时时间设置足够长 。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码