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

SOES:软实现EtherCAT从站协议栈项目介绍及从站开发案例

在现代工业自动化领域,EtherCAT(Ethernet for Control Automation Technology)以其高速、实时和开放的特性,成为现场总线通信的主流协议之一。EtherCAT网络中,主站(Master)负责调度和管理,而从站(Slave)则连接各类传感器、执行器等设备。如何高效、低成本地实现EtherCAT从站,是嵌入式开发者关注的重点。SOES(Simple Open EtherCAT Slave)正是为此而生的开源协议栈解决方案。


目录

    • 一、SOES开源项目简介
    • 二、SOES源码结构详解
    • 三、SOES项目与核心知识点的对应关系
    • 四、SOES与EtherCAT从站芯片的关系
    • 五、编译与使用流程(参考 soes/doc/tutorial.txt)
    • 六、典型开发流程
    • 七、 SOES 从站开发案例
      • 1、开发概述
      • 2、启动代码示例
      • 3、配置流程
        • 3.1. 硬件初始化
        • 3.2. 软件初始化
        • 3.3. 应用循环
      • 4、应用层处理(DIG_process)
        • 4.1. 输出处理
        • 4.2. 输入处理
      • 5、应用数据与过程数据映射
        • SII-EEPROM
        • ESI 文件
        • 对象字典(Object Dictionary)
      • 6、SDO 参数与对象处理
      • 7、开发案例总结
    • 八、总结
    • 其他资源
      • 1. 直接使用EtherCAT协议开发从站的难点
      • 2. SOES的作用和优势
      • (1)协议栈封装
      • (2)兼容性和可靠性
      • (3)移植性和扩展性
      • (4)开发效率高
      • 3. 总结
    • 1. **开源协议栈**
      • (1)**EtherLab IgH EtherCAT Slave Stack**
      • (2)**OpenEtherCAT Slave**
    • 2. **商业协议栈**
      • (1)**Beckhoff EtherCAT Slave Stack Code (SSC)**
      • (2)**acontis EC-Master/EC-Slave**
      • (3)**Port GmbH EtherCAT Slave Stack**
    • 3. **芯片厂商自带协议栈**
    • 4. **FPGA/软核实现**
    • 5. **对比与选择建议**

一、SOES开源项目简介

SOES(Simple Open EtherCAT Slave)是一个面向嵌入式系统的开源EtherCAT从站协议栈。它以C语言实现,代码精简、结构清晰,适合资源受限的MCU/SoC平台。SOES的目标是为开发者提供一个易于移植、易于理解的EtherCAT从站实现,支持工业现场的高实时性和高可靠性需求。

开源项目地址:https://github.com/OpenEtherCATsociety/SOES

主要特性:

  • 支持EtherCAT协议的核心功能,包括COE(CANopen over EtherCAT)、PDO、SDO、状态机管理、同步机制等。
  • 代码高度模块化,便于在不同硬件平台上移植和扩展。
  • 提供多种硬件平台的参考实现(如树莓派、XMC4300、TI AM335x等)。
  • 适合学习、教学、产品开发和二次定制。

二、SOES源码结构详解

SOES项目结构清晰,主要目录和文件说明如下:

SOES-master/
├── applications/         # 各硬件平台的示例工程
│   ├── linux_lan9252demo/
│   ├── raspberry_lan9252demo/
│   ├── rtl_lwip_eoe/
│   ├── rtl_slavedemo/
│   ├── rtl_xmc4_dynpdo/
│   ├── tiesc_am335x/
│   ├── tiesc_k2gice/
│   └── xmc4300_slavedemo/
├── cmake/                # CMake构建脚本及工具链
├── drivers/              # EtherCAT芯片驱动(如LAN9252)
├── soes/                 # 协议栈核心代码
│   ├── hal/              # 硬件抽象层(不同平台适配)
│   ├── doc/              # 文档(含tutorial.txt)
│   ├── ecat_slv.c/h      # 协议栈主控与状态机
│   ├── esc.c/h           # EtherCAT核心功能
│   ├── esc_coe.c/h       # COE协议支持
│   ├── esc_eep.c/h       # EEPROM支持
│   ├── esc_eoe.c/h       # EOE协议支持
│   ├── esc_foe.c/h       # FOE协议支持
│   └── ...               # 其他协议与工具
├── README.md             # 项目说明
└── version.h.in

三、SOES项目与核心知识点的对应关系

  1. EtherCAT协议栈实现

    • 协议栈的核心代码主要在 soes/ 目录下,如 ecat_slv.cesc.cesc_coe.c 等文件,分别实现了EtherCAT协议的各个层级和COE(CANopen over EtherCAT)等扩展协议。
  2. 从站设备初始化

    • 各平台的初始化代码在 applications/ 下的不同子目录(如 main.c),以及 soes/hal/ 目录下的硬件抽象层(HAL)代码(如 esc_hw.c),负责初始化硬件和协议栈。
  3. 数据处理

    • 数据的收发和处理主要在 ecat_slv.c 和各平台的 main.c 文件中实现,负责与主站的数据交互。
  4. PDO映射

    • PDO的定义和映射通常在 objectlist.cslave_objectlist.c 等文件中实现,这些文件定义了从站的过程数据对象结构。
  5. SDO通信

    • SDO相关的处理在 esc_coe.c 文件中实现,支持主站对从站参数的读写和配置。
  6. 同步机制

    • 同步相关的代码分布在 ecat_slv.cesc.c,支持分布式时钟(DC)和主站同步命令的响应。
  7. 状态机管理

    • 从站状态机的实现主要在 ecat_slv.c,负责从站的各个状态(如INIT、PRE-OP、SAFE-OP、OP)的切换和管理。
  8. 错误处理机制

    • 错误检测和处理逻辑分布在协议栈各层代码中,如 esc.cecat_slv.c,并通过EtherCAT标准的错误寄存器和报警机制上报主站。
  9. 配置与诊断功能

    • 相关功能在 esc_coe.cesc_eep.c 等文件中实现,支持主站对从站的配置和诊断。
  10. 代码的可移植性和模块化

    • SOES项目结构清晰,协议栈与硬件平台解耦,便于在不同MCU/SoC平台上移植。hal/ 目录下为不同平台提供了硬件适配层。

知识点SOES源码位置/实现说明
EtherCAT协议栈soes/ecat_slv.c, soes/esc.c, soes/esc_coe.c
从站设备初始化applications/xxx/main.csoes/hal/下各平台代码
数据处理soes/ecat_slv.c,各平台main.c
PDO映射applications/xxx/objectlist.cslave_objectlist.c
SDO通信soes/esc_coe.c
同步机制soes/ecat_slv.c, soes/esc.c
状态机管理soes/ecat_slv.c
错误处理机制soes/esc.c, soes/ecat_slv.c
配置与诊断功能soes/esc_coe.c, soes/esc_eep.c
可移植性和模块化soes/hal/,各平台applications/

四、SOES与EtherCAT从站芯片的关系

虽然SOES是软实现的协议栈,但在实际应用中,通常仍需配合专用的EtherCAT从站芯片(如LAN9252、ET1100等)或具备EtherCAT功能的硬件外设

  • 物理层与MAC层的实时性要求:EtherCAT对以太网帧的转发延迟和时序有极高要求,专用芯片可在硬件层面实现帧的级联转发,保证网络的实时性和确定性。
  • SOES的定位:SOES主要实现协议栈的上层逻辑(如对象字典、数据处理、状态机等),而底层的帧收发、转发、同步等高实时性操作,依赖硬件实现。SOES通过硬件抽象层(HAL)与这些芯片对接。
  • 软实现的局限性:理论上可以用MCU的以太网外设+软件模拟EtherCAT底层,但很难达到工业级的实时性和兼容性。只有极少数高性能MCU/FPGA能做到全软实现,但通常也会有专门的EtherCAT硬件模块辅助。

五、编译与使用流程(参考 soes/doc/tutorial.txt)

SOES项目的编译和使用流程大致如下:

  1. 准备开发环境

    • 安装CMake、GCC/ARM-GCC等交叉编译工具链。
    • 准备目标硬件开发板(如树莓派、XMC4300、AM335x等)。
  2. 选择目标平台

    • 进入applications/目录,选择对应硬件平台的子目录(如linux_lan9252demo)。
  3. 配置与编译

    • 使用CMake生成Makefile或工程文件。例如:
      cd applications/linux_lan9252demo
      mkdir build && cd build
      cmake ..
      make
      
    • 具体编译参数和平台相关配置可参考CMakeLists.txtREADME.md
  4. 烧录与运行

    • 将编译生成的二进制文件烧录到目标硬件。
    • 连接EtherCAT主站(如TwinCAT、EtherLab等)进行网络测试。
  5. 调试与扩展

    • 可根据实际需求修改objectlist.c等文件,调整PDO/SDO映射和对象字典。
    • 如需适配新硬件,需在soes/hal/下添加对应的硬件抽象层代码。

详细的编译和移植说明可参考 soes/doc/tutorial.txt 文件。


六、典型开发流程

  • 选择目标硬件平台,适配HAL层代码。
  • 配置对象字典(PDO/SDO)。
  • 编译并烧录到目标设备。
  • 使用EtherCAT主站软件进行测试和调试。

七、 SOES 从站开发案例

1、开发概述

SOES 是一个库,为微控制器用户应用提供访问 EtherCAT 现场总线通信环境的能力,包括:

  • EtherCAT 状态机
  • 邮箱接口
  • 协议支持
    • CoE(CANopen over EtherCAT)
    • FoE(File over EtherCAT)及引导模板

邮箱和协议的支持是典型的应用场景,通常需要从站协议栈来控制 EtherCAT 的应用层。PDI(Process Data Interface,过程数据接口)通常是 SPI 或其他微控制器接口。

本教程将展示如何快速上手 SOES,并设计一个简单的从站应用。所有代码均为本地应用或全局变量,便于根据实际需求进行优化和调整。

目标应用示例:

  • 输入 40bit
    • 一个按钮(8bit)
    • 一个编码器值(32bit)
  • 输出 8bit
    • LED(8bit)
  • 参数
    • 编码器设置
  • 从站命令
    • 复位计数器

2、启动代码示例

main 函数的作用是启动两个任务:一个执行 SOES 协议栈,一个控制错误 LED。部分 ESC(EtherCAT Slave Controller)芯片自带 RUN/ERROR LED 引脚,否则可由微控制器控制。

int main (void)
{rprintp ("SOES (Simple Open EtherCAT Slave)\nsoes test\n");// 启动 led_error 任务task_spawn ("led_error", led_error, 15, 512, NULL);// 启动 soes 任务task_spawn ("soes", soes, 9, 1024, NULL);return (0);
}

3、配置流程

soes 函数是 EtherCAT 从站的主入口,可分为三部分:硬件初始化、软件初始化、应用循环。

3.1. 硬件初始化
  • esc_reset:如无物理 EEPROM,用于 ESC 复位(应用层本地实现)。
  • ESC_init:初始化 SPI 通信或类似接口。
  • 等待 ESC 启动,检测 SPI 是否正常,查询 ESC 寄存器 DL 状态,确认 EEPROM 加载和 PDI 正常。
void soes (void *arg)
{TXPDOsize = SM3_sml = sizeTXPDO ();RXPDOsize = SM2_sml = sizeRXPDO ();esc_reset ();ESC_init ((void *)spi_name);task_delay (tick_from_ms (200));// 等待 ESC 启动while ((ESCvar.DLstatus & 0x0001) == 0){ESC_read (ESCREG_DLSTATUS, (void *) &ESCvar.DLstatus,sizeof (ESCvar.DLstatus));ESCvar.DLstatus = etohs (ESCvar.DLstatus);}// 复位 ESC 到初始化状态ESC_ALstatus (ESCinit);...
}
3.2. 软件初始化
  • 复位从站到 Init 状态,清除错误,停止应用层(禁用 SyncManager,阻止数据交换)。
void soes (void *arg)
{
...while ((ESCvar.DLstatus & 0x0001) == 0){ESC_read (ESCREG_DLSTATUS, (void *) &ESCvar.DLstatus,sizeof (ESCvar.DLstatus));ESCvar.DLstatus = etohs (ESCvar.DLstatus);}// 复位 ESC 到初始化状态ESC_ALstatus (ESCinit);ESC_ALerror (ALERR_NONE);ESC_stopmbx ();ESC_stopinput ();ESC_stopoutput ();// 应用主循环while (1)...
}
3.3. 应用循环
  • 处理 ALevent(状态变化、SyncManager 变化等)
  • 处理 ESC 状态机
  • 处理邮箱及协议(如 CoE、FoE)
  • 调用应用层处理函数(如 DIG_process)
void soes (void *arg)
{
...while (1){if((ESCvar.ALstatus & 0x0f) == ESCinit){txpdomap = DEFAULTTXPDOMAP;rxpdomap = DEFAULTRXPDOMAP;txpdoitems = DEFAULTTXPDOITEMS;rxpdoitems = DEFAULTTXPDOITEMS;}ESC_read (ESCREG_LOCALTIME, (void *) &ESCvar.Time, sizeof (ESCvar.Time));ESCvar.Time = etohl (ESCvar.Time);ESC_state ();if (ESC_mbxprocess ()){ESC_coeprocess ();ESC_foeprocess ();ESC_xoeprocess ();}DIG_process ();};
}

4、应用层处理(DIG_process)

4.1. 输出处理
  • 判断当前是否处于支持输出的状态(如 OP 状态)。
  • 若在 OP 状态,从 SyncManager2 读取输出 PDO 数据,刷新本地变量(如 LED 状态),并写入实际硬件(如 GPIO)。
  • 包含看门狗机制,超时则关闭输出并切换到安全状态。
void RXPDO_update (void)
{ESC_read (SM2_sma, &Wb.LED, RXPDOsize);
}void DIG_process (void)
{if (App.state & APPSTATE_OUTPUT){if (ESCvar.ALevent & ESCREG_ALEVENT_SM2)  // SM2 触发{RXPDO_update ();reset_wd ();gpio_set(GPIO_LED, Wb.LED & BIT(0));}if (!wd_cnt){ESC_stopoutput ();// 看门狗,输出无效ESC_ALerror (ALERR_WATCHDOG);// 切换到安全操作状态并设置错误位ESC_ALstatus (ESCsafeop | ESCerror);wd_trigger = 1;}}else{reset_wd ();}
...
}
4.2. 输入处理
  • 在安全操作状态下持续更新输入。
  • 读取用户应用数据(如 GPIO),写入本地 PDO 变量,再通过 SyncManager3 写入 ESC RAM,供主站读取。
void TXPDO_update (void)
{ESC_write (SM3_sma, &Rb.button, TXPDOsize);
}void DIG_process (void)
{
...Rb.button = gpio_get(GPIO_WAKEUP);Cb.reset_counter++;Rb.encoder =  Cb.reset_counter;TXPDO_update ();
}

5、应用数据与过程数据映射

要通过 EtherCAT 过程数据传递应用数据,需要用三种对象来描述数据:

  • ESI 文件(EtherCAT Slave Information,XML)
  • SII-EEPROM(Slave Information Interface,硬件存储)
  • CoE 对象字典(Object Dictionary)

ESI 和 SII-EEPROM 是必需的,CoE 对象字典用于描述复杂从站。

SII-EEPROM
  • 存储设备标识、组、设备描述、SyncManager、Mailbox、DC(分布式时钟)、EEPROM 配置等信息。
ESI 文件
  • XML 格式,描述从站的厂商、设备、组、SyncManager、Mailbox、CoE 支持、DC 支持等。
对象字典(Object Dictionary)
  • 遵循 CANopen DS301 范围,分区明确(如输入区、输出区、配置区等)。
  • RxPDO、TxPDO 分别映射到 0x1600-0x17FF、0x1A00-0x1BFF。
  • 通过对象字典将本地变量与 EtherCAT PDO/SDO 映射关联。

示例:

// objectlist.h
FLASHSTORE _objd SDO7000[] =
{ {0x00, DTYPE_UNSIGNED8, 8, ATYPE_R, &acNameNOE[0], 0x01, nil},{0x01, DTYPE_UNSIGNED8, 8, ATYPE_RW, &acName7000_01[0], 0, &(Wb.LED)}
};typedef struct
{uint8 LED;
} _Wbuffer;

6、SDO 参数与对象处理

  • SDO 参数可异步读写,支持参数镜像、写入钩子等功能。
  • 通过 ESC_objecthandler 钩子函数可在 SDO 下载时执行自定义逻辑。
void ESC_objecthandler (uint16 index, uint8 subindex)
{switch (index){case 0x7100:{switch (subindex){case 0x01:{encoder_scale_mirror = encoder_scale;break;}}break;}}
}

7、开发案例总结

本案例详细介绍了 SOES 的初始化、主循环、输入输出处理、对象字典与过程数据映射、SDO 参数处理等关键流程。开发者可根据实际需求,灵活调整和扩展应用层逻辑,实现自定义的 EtherCAT 从站设备。

建议:

  • 结合本教程和源码,快速上手 SOES 项目。
  • 参考 ETG 官方文档,深入理解 EtherCAT 协议和对象字典设计。
  • 根据硬件平台适配 HAL 层,完善 ESI/SII/OD 配置,实现高效可靠的工业现场通信。

八、总结

SOES作为软实现的EtherCAT从站协议栈,极大降低了嵌入式设备接入EtherCAT网络的门槛。它专注于协议和应用层的实现,配合专用的EtherCAT从站芯片或具备EtherCAT功能的硬件外设,能够满足工业现场对实时性和可靠性的严苛要求。

对于开发者而言,SOES不仅是学习EtherCAT协议的绝佳范例,也是开发自定义EtherCAT从站设备的有力工具。

建议开发者结合官方文档、项目源码和soes/doc/tutorial.txt,快速上手并根据实际需求进行二次开发。


如需进一步了解SOES的移植、与具体芯片的对接方法,或协议栈的详细实现,欢迎留言交流!

其他资源

你的问题非常好,很多初学者在接触EtherCAT从站开发时都会有类似疑问。下面我用通俗的语言详细解答:


1. 直接使用EtherCAT协议开发从站的难点

EtherCAT协议本身是一套非常复杂且严格的工业以太网协议,它不仅仅是普通的以太网通信,还包括了:

  • 实时性极高的帧转发机制(帧级联、极低延迟)
  • 多种同步机制(分布式时钟、同步管理器等)
  • 多层协议支持(如CoE、FoE、SDO、PDO、状态机等)
  • 严格的状态机和错误处理
  • 邮箱机制、对象字典、EEPROM/SII、ESI文件等

如果你“直接”开发EtherCAT从站协议栈,意味着你要从零实现上述所有功能,这对个人开发者或小团队来说,几乎是不现实的,主要原因有:

  • 协议复杂度高:EtherCAT协议文档庞大,细节繁多,容易出错。
  • 兼容性要求高:工业主站(如TwinCAT、Codesys等)对从站的兼容性要求极高,自己写的代码很难一次通过主站和官方一致性测试(CTT)。
  • 实时性和可靠性要求高:工业现场对实时性和稳定性要求极高,自己开发难以保证。
  • 开发周期长、维护难度大:从零开发协议栈,周期长,后续维护和升级也很困难。

2. SOES的作用和优势

SOES(Simple Open EtherCAT Slave)就是为了解决上述难题而诞生的。它的作用和优势体现在:

(1)协议栈封装

  • SOES已经实现了EtherCAT从站协议的核心功能,包括状态机、邮箱、CoE/SDO/PDO、同步、错误处理等。
  • 你只需要关注应用层的数据处理和硬件适配,不用关心底层复杂的协议细节。

(2)兼容性和可靠性

  • SOES经过大量实际项目和主站测试,兼容性和稳定性有保障。
  • 只要按照SOES的接口和流程开发,基本可以顺利通过主站的识别和一致性测试。

(3)移植性和扩展性

  • SOES结构清晰,模块化设计,便于在不同MCU/SoC/平台上移植。
  • 你可以很方便地扩展自己的对象字典、PDO/SDO、应用逻辑等。

(4)开发效率高

  • 你只需专注于“我的设备有哪些输入输出、参数、命令”,而不用关心EtherCAT协议的底层实现。
  • 大大缩短开发周期,降低开发和维护成本。

3. 总结

  • 直接开发EtherCAT从站协议栈,难度极高、风险极大、周期极长,且很难保证兼容性和稳定性。
  • SOES等开源协议栈,为开发者屏蔽了底层复杂性,让你专注于应用和硬件,极大提升开发效率和产品质量。

所以,SOES不是可有可无的“工具”,而是开发EtherCAT从站设备的“基础设施”!


当然,除了SOES(Simple Open EtherCAT Slave)之外,市面上还有多种EtherCAT从站协议栈可供选择,涵盖开源、闭源、商业授权等多种类型。下面为你详细介绍几种常见的替代方案:


1. 开源协议栈

(1)EtherLab IgH EtherCAT Slave Stack

  • 简介:由德国汉诺威工业大学(IgH)主导开发,原本以主站(Master)协议栈著称,也有从站(Slave)实现。
  • 特点:支持Linux平台,代码结构较为复杂,适合有一定底层开发经验的用户。
  • 网址:EtherLab EtherCAT

(2)OpenEtherCAT Slave

  • 简介:由Beckhoff等公司推动的开源项目,部分代码可用,但功能和文档不如SOES完善。
  • 特点:适合学习和实验,工业应用需谨慎。

2. 商业协议栈

(1)Beckhoff EtherCAT Slave Stack Code (SSC)

  • 简介:由EtherCAT协议的发明者Beckhoff官方提供,功能最全、兼容性最好。
  • 特点:支持所有EtherCAT协议特性,文档齐全,广泛应用于工业产品。
  • 授权:需向Beckhoff申请授权(免费/付费视具体用途)。
  • 网址:Beckhoff EtherCAT SSC

(2)acontis EC-Master/EC-Slave

  • 简介:德国acontis公司出品,全球知名的EtherCAT协议栈供应商。
  • 特点:支持多平台,性能优异,技术支持完善。
  • 授权:商业授权,适合企业级产品。
  • 网址:acontis EC-Slave

(3)Port GmbH EtherCAT Slave Stack

  • 简介:德国Port公司出品,专注于工业通信协议栈。
  • 特点:支持多种MCU/FPGA,提供定制服务。
  • 授权:商业授权。
  • 网址:Port EtherCAT

3. 芯片厂商自带协议栈

许多EtherCAT从站芯片或SoC厂商会提供官方协议栈或参考实现,例如:

  • Microchip LAN9252/9253:自带参考固件和协议栈。
  • TI(德州仪器)PRU-ICSS EtherCAT Slave:TI官方提供完整的协议栈和例程。
  • Infineon/XMC4300/4800:自带EtherCAT从站固件和协议栈。

这些协议栈通常针对自家硬件高度优化,适合特定芯片平台。


4. FPGA/软核实现

  • Altera/Intel、Xilinx等FPGA厂商:提供EtherCAT从站IP核,配合软硬件协议栈使用,适合高性能、定制化场景。

5. 对比与选择建议

  • 学习/实验/轻量级应用:SOES、EtherLab等开源协议栈。
  • 工业产品/高可靠性/全功能需求:Beckhoff SSC、acontis、Port等商业协议栈。
  • 特定芯片平台:优先考虑芯片厂商官方协议栈。
  • 高性能/定制化:FPGA+IP核+协议栈。

http://www.dtcms.com/a/285693.html

相关文章:

  • 【Python】SQLAlchemy实现upsert
  • 【Linux网络编程】应用层协议 - HTTP
  • uniapp 动态控制横屏(APP 端)
  • Bitbucket平台的HTTP Access Tokens操作手册
  • 开发避坑短篇(2):uni-app微信小程序开发‘createIndependentPlugin‘模块缺失问题分析与解决方案
  • 创蓝闪验SDK适配uniappx版本UTS插件集成文档
  • Redis缓存双写的学习(五)
  • Python暑期学习笔记5
  • 平板可以用来办公吗?从文档处理到创意创作的全面测评
  • JavaScript 的垃圾回收机制
  • 第 14 章 线性回归预测策略----SPL量化编程课
  • CUPED (Controlled-experiment using Pre-Experiment Data) 论文学习笔记
  • 软删除设计:为什么使用 deleted_at = ‘1970-01-01 00:00:00‘ 表示未删除?
  • 1-大语言模型—理论基础:详解Transformer架构的实现(1)
  • 零信任产品联合宁盾泛终端网络准入,打造随需而变、精准贴合业务的网络安全访问体系
  • python爬虫获取PDF
  • pdf格式怎么提取其中一部分张页?
  • PDF 拆分合并PDFSam:开源免费 多文件合并 + 按页码拆分 本地处理
  • Elasticsearch 和 solr 的区别
  • 【Docker#2】容器历史发展 | 虚拟化实现方式
  • C# 转换(引用转换)
  • uni-app 跳转页面传参
  • Docker --privileged 命令详解
  • Diffusion-VLA 中的 Reasoning Token 注入机制解析:语言推理如何控制扩散模型?
  • 2.3 前端-ts的接口以及自定义类型
  • k8s:手动创建PV,解决postgis数据库本地永久存储
  • 【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形
  • 搜索引擎优化全攻略:提升百度排名优化
  • 解决Flutter运行android提示Deprecated imperative apply of Flutter‘s Gradle plugins
  • 武汉江滩某码头变形及应力自动化监测