iGH EtherCAT初始化流程分析(三)

接上篇。
在执行完成从站设备SDO及PDO信息upload后,回到fsm_master状态机的scan_slave过程中,执行ec_master_calc_dc()
输出调试信息:

[102716.214019] EtherCAT 0: Bus scanning completed in 1412 ms.
[102716.214024] EtherCAT 0: Using slave 0 as DC reference clock.

执行ec_slave_calc_transmission_delays_rec()后输出调试信息:

[102716.214033] EtherCAT DEBUG 0-0: ec_slave_calc_transmission_delays_rec(delay = 0 ns)
[102716.214038] EtherCAT DEBUG 0-1: ec_slave_calc_transmission_delays_rec(delay = 680 ns)
[102716.214043] EtherCAT DEBUG 0-2: ec_slave_calc_transmission_delays_rec(delay = 1400 ns)
[102716.214047] EtherCAT DEBUG 0-3: ec_slave_calc_transmission_delays_rec(delay = 2100 ns)
[102716.214051] EtherCAT DEBUG 0-4: ec_slave_calc_transmission_delays_rec(delay = 2800 ns)
[102716.214056] EtherCAT DEBUG 0-5: ec_slave_calc_transmission_delays_rec(delay = 3540 ns)

执行完成write_system_times后,由于Master未激活,fsm_master状态机重启,重新进入start->broadcast状态。
此次会进入read_al_status状态 ,本次循环将会引导启动fsm_slave_config状态机(第一次循环是进入fsm_slave_scan),其输出的调试信息如下:

[102716.222122] EtherCAT DEBUG 0-0: Configuring...
[102716.222344] EtherCAT DEBUG 0-0: Now in INIT.
[102716.222350] EtherCAT DEBUG 0-0: Clearing FMMU configurations...
[102716.222398] EtherCAT DEBUG 0-0: Clearing sync manager configurations...
[102716.222448] EtherCAT DEBUG 0-0: Clearing DC assignment...
[102716.222497] EtherCAT DEBUG 0-0: Configuring mailbox sync managers...
[102716.222506] EtherCAT DEBUG 0-0: SM0: Addr 0x1000, Size 128, Ctrl 0x26, En 1
[102716.222511] EtherCAT DEBUG 0-0: SM1: Addr 0x1400, Size 128, Ctrl 0x22, En 1
[102716.223330] EtherCAT DEBUG 0-0: Now in PREOP.
[102716.223335] EtherCAT DEBUG 0-0: Finished configuration.

在执行完成slave_config后,fsm_master进入action_idle状态,调用ec_fsm_slave_set_ready()将从站设备设置为ready状态,同时执行读取CoE字典,启动fsm_coe状态机。
输出调试信息如下:

[102716.250841] EtherCAT DEBUG 0-0: Ready for requests.
[102719.233417] EtherCAT DEBUG 0-0: Fetching SDO dictionary.
[102719.235472] EtherCAT DEBUG 0-0: SDO list fragments left: 4
[102719.237107] EtherCAT DEBUG 0-0: SDO list fragments left: 3
[102719.238380] EtherCAT DEBUG 0-0: SDO list fragments left: 2
[102719.239864] EtherCAT DEBUG 0-0: SDO list fragments left: 1
[102720.427796] EtherCAT DEBUG 0-0: Fetched 259 SDOs and 441 entries.

至此,初始化过程完成。
下一步的工作为用户程序请求Master设备,进入 OPERATION状态。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 EtherCAT 程序示例,用于在 EtherCAT 总线上控制一个电机: ``` #include "ethercat.h" #define EC_TIMEOUTMON 500 #define NUMOFEPOS4_DRIVE 2 #define REFERENCE_POSITION 0x7FFFFFFF #define MAXON_EPOS4_DRIVE 0x00000625 // 定义信号量 static int wkc; static boolean needlf; static boolean inOP; static uint32_t ob; static uint8_t ob_cnt; static uint32_t* obp; static uint32_t al_state; static uint32_t al_code; // 定义从站配置数据 static ec_slave_config_t sc[NUMOFEPOS4_DRIVE] = { {0, 0x0000, 0, 0x0000, {{0,0,0,0}}, 0x00}, {0, 0x0000, 0, 0x0000, {{0,0,0,0}}, 0x00} }; // 初始化从站 void ecat_init(void) { // 初始化 EtherCAT 总线 ec_init("eth0"); // 配置从站 ec_config_init(FALSE); ec_config_map(&IOmap); // 注册错误处理函数 ec_slave_err(&on_slave_error); // 配置 EtherCAT 网络 ec_configdc(); // 请求 EtherCAT 从站进入 OP 模式 ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); inOP = FALSE; ec_slave[0].state = EC_STATE_SAFE_OP; ec_slave[1].state = EC_STATE_SAFE_OP; ec_writestate(0); do { ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE); } while(ec_slave[0].state != EC_STATE_SAFE_OP || ec_slave[1].state != EC_STATE_SAFE_OP); // 配置从站参数 for (int i = 0; i < NUMOFEPOS4_DRIVE; i++) { ec_slave[i+1].PO2SOconfig = (uint16_t)MAXON_EPOS4_DRIVE; ec_slave[i+1].PO2SOconfigx = 0; ec_slave[i+1].SMflags = 0; // 设置从站位置参考 ec_slave[i+1].outputs[0] = REFERENCE_POSITION; } // 使能从站 ec_slave[i+1].state = EC_STATE_OPERATIONAL; ec_writestate(0); ec_statecheck(0, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE * 4); inOP = TRUE; } // 控制电机位置 void set_motor_position(int16_t position) { // 设置电机位置参考 ec_slave[1].outputs[0] = position; ec_slave[2].outputs[0] = position; // 发送 EtherCAT 数据包 ec_send_processdata(); wkc = ec_receive_processdata(EC_TIMEOUTRET); } // 错误处理函数 void on_slave_error(uint16_t slave, uint16_t errorcode, uint8_t errorbit) { printf("EtherCAT error: %d,%d,%d\n", slave, errorcode, errorbit); } ``` 该示例程序使用 EtherCAT 网络控制两个 Maxon EPOS4 电机驱动器。程序初始化 EtherCAT 总线,并使用 `ec_slave_config_t` 结构体配置从站。然后程序将 EtherCAT 从站配置为操作模式,并设置电机的位置参考。最后,程序将电机的位置参考发送到从站,以控制电机的运动。程序还包含一个错误处理函数,用于处理 EtherCAT 错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值