EtherCAT FoE简介

FoE(File Access over EtherCAT)可实现EtherCAT节点之间的文件传输,本文介绍FoE的基本原理,以及FoE在开源EtherCAT主站Etherlab中的实现过程。

一、软件更新方式

在嵌入式产品开发调试过程中,我们一般使用仿真器更新程序。当产品发布后,我们通常使用串口、CAN或者蓝牙等端口更新程序。如果是EtherCAT从站设备,使用FoE在bootstrap模式也可以实现更新程序的功能。
这里写图片描述
如上图所示,应用程序通常为.bin格式的文件,也有的使用.hex或者.s19格式的。将应用程序bin文件更新到从站的Flash,涉及到3部分:
(1) EtherCAT主站,负责读取bin文件的内容,并按FoE的格式发送到从站,如Twincat在从站的online界面使用download和upload按钮操作即可,本文使用的主站为Etherlab。
(2) 从站协议栈,包含FoE功能,负责接收和解析主站发送的FoE帧。
(3) 烧录功能,将接收到的bin文件内容烧录到Flash,这部分功能与芯片类型密切相关,不同的芯片烧录Flash的步骤,提供的API都不尽相同,通常还需要将Flash分片,分别存储bootloader代码和应用层代码。

二、FoE帧格式

FoE帧格式如下图所示:
这里写图片描述
其中OpCode的取值范围为1-6,不同的值代表不同的功能,data中数据的含义也不同。

当OpCode =1 时,表示读文件请求:
这里写图片描述
其中Password为0时表示不需要密码。

当OpCode=2时,表示写文件请求:
这里写图片描述

当OpCode=3时,表示写入数据:
这里写图片描述
其中Packet Number表示数据包计数,每发送一次数据包加1,通信双方使用该值保证数据包按顺序收发。

当OpCode=4时,表示对接收数据的应答:
这里写图片描述

当OpCode=5时,表示发生错误,包含错误代码和描述:
这里写图片描述

当OpCode=6时,表示传输百分比等内容:
这里写图片描述

三、FoE实例

作为示例,使用Ubuntu中安装的Etherlab主站,将bin文件TestFoE.bin下载到从站。
TestFoE.bin文件的部分内容如下:
这里写图片描述
将TestFoE.bin拷贝到/opt/FoE目录下,并在终端输入命令:

 #ethercat foe_write -p 0 TestFoE.bin

等待文件传输完成:
这里写图片描述
在总线上可监测到FoE相关的数据。
这里写图片描述

四、Etherlab FoE源码简析

执行FoE命令时,Etherlab的执行流程大致如下图所示:
这里写图片描述
1、读取文件内容
在终端输入foe_write命令后,首先执行的是CommandFoeWrite::execute(),主要完成:
(1)打开文件,并拷贝文件内容。
(2)调用对应从站的foe写功能。

void CommandFoeWrite::execute(const StringVector &args)
{
    ...
    file.open(args[0].c_str(), ifstream::in | ifstream::binary);
    ...
    loadFoeData(&data, file); //将文件内容拷贝到data
    ...
    try {
        m.writeFoe(&data);
    } catch (MasterDeviceException &e) {
    ...
}

其中,m.writeFoe(&data)将调用ec_ioctl_slave_foe_write(),将foe写请求挂载到从站的foe请求队列中:

static ATTRIBUTES int ec_ioctl_slave_foe_write(
        ec_master_t *master, /**< EtherCAT master. */
        void *arg /**< ioctl() argument. */
        )
{
    ...
    // schedule FoE write request.
    list_add_tail(&request.list, &slave->foe_requests);
    ...
}

在ec_fsm_slave_action_process_foe()中检测到foe队列中有写请求,则开始foe写状态机:

int ec_fsm_slave_action_process_foe(
        ec_fsm_slave_t *fsm, /**< Slave state machine. */
        ec_datagram_t *datagram /**< Datagram to use. */
        )
{
    ...
    // take the first request to be processed
    request = list_entry(slave->foe_requests.next, ec_foe_request_t, list); 
    ...
    fsm->state = ec_fsm_slave_state_foe_request;
    ec_fsm_foe_transfer(&fsm->fsm_foe, slave, request);//调用ec_fsm_foe_write_start
    ec_fsm_foe_exec(&fsm->fsm_foe, datagram);
    return 1;      
}

2、发送写请求
foe写状态机开始执行的是ec_fsm_foe_write_start(),在其中将调用ec_foe_prepare_wrq_send()发送OpCode=2的写请求:

int ec_foe_prepare_wrq_send(
        ec_fsm_foe_t *fsm, /**< Finite state machine. */
        ec_datagram_t *datagram /**< Datagram to use. */
        )
{
    ...
    current_size = fsm->tx_filename_len;

    data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
            EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE);
    ...
    EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request
    EC_WRITE_U32( data + 2, fsm->tx_packet_no );

    memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_filename, current_size);
    return 0;
}

通过wireshark监控到对应的帧如下:
这里写图片描述

3、等待从站ACK

发送完写请求后,将等待从站返回的ACK,若收到ACK,则开始发送数据:

void ec_fsm_foe_state_ack_read(
        ec_fsm_foe_t *fsm, /**< FoE statemachine. */
        ec_datagram_t *datagram /**< Datagram to use. */
        )
{
     ...
    if (opCode == EC_FOE_OPCODE_ACK) {
        fsm->tx_packet_no++;
        fsm->tx_buffer_offset += fsm->tx_current_size;
        if (fsm->tx_last_packet) {       
            fsm->state = ec_fsm_foe_end;//如果最后一帧已经发送,则结束真个FoE状态机
            return;
        }

        if (ec_foe_prepare_data_send(fsm, datagram)) {
            ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
            return;
        }
        fsm->state = ec_fsm_foe_state_data_sent;
        return;
    }   
}

ACK帧:
这里写图片描述

4、发送数据
在ec_foe_prepare_data_send()发送数据:

int ec_foe_prepare_data_send(
        ec_fsm_foe_t *fsm, /**< Finite state machine. */
        ec_datagram_t *datagram /**< Datagram to use. */
        )
{
    size_t remaining_size, current_size;
    uint8_t *data;

    remaining_size = fsm->tx_buffer_size - fsm->tx_buffer_offset;
    //如果等待发送的数据长度小于一个邮箱能装载的最大数据,即本次发送能把剩下的数据一次发送完成
    //本实验从站的邮箱大小设为128字节,减去邮箱头12字节和FoE帧头12字节,即一次最多可传送
    //116个字节的数据
    if (remaining_size < fsm->slave->configured_tx_mailbox_size
            - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE) {
        current_size = remaining_size;
        fsm->tx_last_packet = 1;
    } else {
        current_size = fsm->slave->configured_tx_mailbox_size
            - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE;
    }

    data = ec_slave_mbox_prepare_send(fsm->slave,
            datagram, EC_MBOX_TYPE_FILEACCESS,
            current_size + EC_FOE_HEADER_SIZE);
    if (IS_ERR(data)) {
        return -1;
    }

    EC_WRITE_U16(data, EC_FOE_OPCODE_DATA);    // OpCode = DataBlock req.
    EC_WRITE_U32(data + 2, fsm->tx_packet_no); // PacketNo, Password

    memcpy(data + EC_FOE_HEADER_SIZE,
            fsm->tx_buffer + fsm->tx_buffer_offset, current_size);
    fsm->tx_current_size = current_size;

    return 0;
}

数据帧:
这里写图片描述
从上图可以看出,由于邮箱大小设为128字节,一次最多传送116字节。
传输的第一帧数据中的内容即是TestFoE.bin文件最开始的内容。

发送完数据后,Etherlab将等待从站返回的ACK。

5、发送完成
当tx_last_packet标志为1时,表示所有的数据发送完成,最后一帧数据:
这里写图片描述
从上图可以看出,最后一帧数据的字节数68,小于一帧数据最大装载量116。
TestFoE.bin文件总共经过了411次写数据/应答的传输过程。

五、参考资料

1.ETG100.6 V1.0.3.2

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: EtherCAT(以太网控制自动化技术)是一种实时以太网网络协议,可以用于高速、高精度的控制系统和数据采集应用中。EtherCAT Foe(文件传输过程)是EtherCAT协议的一部分,它允许使用EtherCAT网络进行文件传输。 在EtherCAT Foe中,传输的文件可以是任何类型的文件,例如控制程序、配置文件、日志文件等。传输文件的命令可以通过EtherCAT网络发送到目标设备上的EtherCAT Master,然后Master将文件传输到目标设备上的EtherCAT Slave。传输文件时,数据包通过EtherCAT网络进行传送和接收,并通过EtherCAT Slave与目标设备的文件系统进行交互。 EtherCAT Foe可用于更新控制系统的软件和配置文件,可以更快地传输文件,并降低了系统的故障率和维护时间。另外,EtherCAT Foe还可以用于远程诊断和维护,这对于分布式控制系统和遥控系统非常重要。 总之,EtherCAT Foe提供了一种快速、高效、可靠的文件传输方式,可以用于各种控制系统和数据采集应用中,有助于提高系统的性能和可靠性。 ### 回答2: Ethernet for Control Automation Technology(EtherCAT)是一种先进的实时以太网技术,它可以在任何标准以太网上让大量的从设备同时通讯,从而实现实时控制和传感应用。EtherCAT的主要特点是高速、实时性强、支持多种拓扑结构、可扩展性强,因此被广泛应用于工业自动化、机器人等领域。 EtherCAT通过在每个节点上实现一个连接单元,将各个从设备连接在一个环形或线性布局的总线上,以实现快速、高效的数据传输和实时控制。它的优势在于它具有比常规方法更快的响应时间和更高的数据传输速度,同时也能够在网络拓扑和设备类型发生变化时保持高度的兼容性。 EtherCAT的应用场景广泛,它可以用于所有需要高效实时通讯和控制的领域,例如制造业、物流、航空航天、自动驾驶和医疗设备等。此外,EtherCAT也能够处理工业自动化和机器人应用中需要处理的更复杂和精细的控制任务,包括运动控制、位置控制和力控制等。 总之,从站EtherCAT是一种具有高性能、实时性和可扩展性的实时以太网技术,它被广泛应用于各种需要高效实时通讯和控制的领域,它的发展将推动工业自动化和物联网技术的进一步发展。 ### 回答3: EtherCAT FoeEtherCAT Fieldbus over EtherNet/IP的简称,是一种高性能实时以太网通信协议,它充分利用了以太网的高带宽和广域性,并将其实时能力延伸到了工业自动化领域。 EtherCAT Foe将以太网帧划分为小数据包,使得每个数据包在通过线缆时,可以实现数据的实时传输。这种机制使得控制器能够控制多个从站,并能够同时获取多个从站的信息。同时,EtherCAT Foe具有实时性高、成本低、容错性强、可扩展性好的特点,因此得到了工业自动化领域的广泛应用。 EtherCAT Foe可以实现模块化、分布式的控制,让通信实时性得到充分保障。同时,它可以在多种操作系统上运行,如Windows、Linux等,广泛应用于各种工业自动化应用场景。 总之,EtherCAT Foe是一种高性能、低成本、实时性好、可扩展性强的工业自动化通信协议,通过它,可以轻松地实现现代化的工业自动化控制。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值