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

EtherCAT主站SOEM -- 4 -- SOEM之ethercatprint.h/c文件解析

EtherCAT主站SOEM -- 4 -- SOEM之ethercatprint.h/c文件解析

  • 一 ethercatprint.h/c文件功能预览:
  • 二 ethercatprint.h/c 文件的主要函数的作用:
    • 2.1.1 `char* ec_sdoerror2string(uint32 sdoerrorcode)`
    • 2.1.2 `char* ec_ALstatuscode2string(uint16 ALstatuscode)`
    • 2.1.3 `char* ec_soeerror2string(uint16 errorcode)`
    • 2.1.4 `char* ec_mbxerror2string(uint16 errorcode)`
    • 2.1.5 `char* ecx_err2string(const ec_errort Ec)`
    • 2.1.6 `char* ecx_elist2string(ecx_contextt *context)`
    • 2.1.7 `char* ec_elist2string(void)`
  • 三 ethercatprint.c 原文件的中文注释
    • 3.1 ethercatprint.c
    • 3.2 ethercatprint.h
  • 该文档修改记录:
  • 总结

一 ethercatprint.h/c文件功能预览:

函数功能和用途使用场景
ec_sdoerror2string将SDO(Service Data Object)错误代码转换为可读的字符串。用于诊断和记录EtherCAT SDO通信中的错误。
ec_ALstatuscode2string将AL(Application Layer)状态代码转换为可读的字符串。用于解释EtherCAT从站的AL状态信息。
ec_soeerror2string将SOE(Servo Drive Object Error)错误代码转换为可读的字符串。用于诊断和记录伺服驱动器中的错误。
ec_mbxerror2string将邮箱(Mailbox)错误代码转换为可读的字符串。用于处理EtherCAT邮箱通信中的错误。
ecx_err2string将EtherCAT通信错误结构体ec_errort转换为可读的字符串。用于诊断和记录SOEM库中的通信错误。
ecx_elist2string将EtherCAT上下文结构体ecx_contextt中的从站错误信息转换为可读的字符串。用于获取从站错误信息的字符串表示。
ec_elist2string (仅在EC_VER1下可用)将从站错误信息转换为可读的字符串。同上,但在早期的SOEM版本中使用此函数。

二 ethercatprint.h/c 文件的主要函数的作用:

ethercatprint.hethercatprint.c 文件是 SOEM(Simple Open EtherCAT Master)库的一部分,用于提供对 EtherCAT 网络中通信错误和状态的处理和打印输出功能。以下是这两个文件的主要功能和作用:

  1. 错误信息转换

    • 这些文件包含一组函数,用于将 EtherCAT 网络中的错误代码和状态信息转换为可读的字符串,以便于故障诊断和记录。这对于理解通信问题和解决网络故障非常有用。
  2. 通信错误分析

    • 提供了将通信错误结构体和错误信息转换为详细、易于理解的字符串的功能。这有助于工程师更深入地了解通信问题的性质和原因。
  3. 状态信息输出

    • 可以输出从站的状态信息,包括 EtherCAT 应用层状态(PRE-OP、SAFE-OP、OP 等)。这对于监视网络中从站的状态非常有用。
  4. 适用于故障排除

    • 这些函数通常用于开发和维护 EtherCAT 网络,以帮助工程师快速识别问题并采取适当的措施。能够更好地理解和记录通信错误和状态。
  5. 提供用户友好的错误信息

    • 通过这些函数,SOEM 允许用户获取有关 EtherCAT 网络中发生的问题的更多信息。这可以加快故障排除过程,减少停机时间。

总的来说,ethercatprint.hethercatprint.c 文件的主要功能和作用是为 EtherCAT 网络提供详细的错误诊断和状态报告,以帮助用户更好地理解网络问题并采取适当的行动。这对于在 EtherCAT 应用中确保可靠性和稳定性非常重要。

2.1.1 char* ec_sdoerror2string(uint32 sdoerrorcode)

  • 功能:将 EtherCAT SDO 错误代码转换为字符串形式的错误消息。
  • 参数
    • sdoerrorcode:一个表示 EtherCAT SDO 错误代码的 32 位整数。
  • 返回值:指向错误消息字符串的指针。

2.1.2 char* ec_ALstatuscode2string(uint16 ALstatuscode)

  • 功能:将 EtherCAT AL 状态代码转换为字符串形式的状态消息。
  • 参数
    • ALstatuscode:一个表示 EtherCAT AL 状态代码的 16 位整数。
  • 返回值:指向状态消息字符串的指针。

2.1.3 char* ec_soeerror2string(uint16 errorcode)

  • 功能:将 EtherCAT SOE 错误代码转换为字符串形式的错误消息。
  • 参数
    • errorcode:一个表示 EtherCAT SOE 错误代码的 16 位整数。
  • 返回值:指向错误消息字符串的指针。

2.1.4 char* ec_mbxerror2string(uint16 errorcode)

  • 功能:将 EtherCAT 邮箱通信错误代码转换为字符串形式的错误消息。
  • 参数
    • errorcode:一个表示 EtherCAT 邮箱通信错误代码的 16 位整数。
  • 返回值:指向错误消息字符串的指针。

2.1.5 char* ecx_err2string(const ec_errort Ec)

  • 功能:将 EtherCAT 主站错误对象转换为字符串形式的错误消息。
  • 参数
    • Ec:一个表示 EtherCAT 主站错误的 ec_errort 结构体。
  • 返回值:指向错误消息字符串的指针。

2.1.6 char* ecx_elist2string(ecx_contextt *context)

  • 功能:将 EtherCAT 主站错误列表转换为字符串形式的错误消息。
  • 参数
    • context:一个指向 ecx_contextt 结构体的指针,表示 EtherCAT 主站上下文。
  • 返回值:指向错误消息字符串的指针。

2.1.7 char* ec_elist2string(void)

  • 功能:将 EtherCAT 主站错误列表转换为字符串形式的错误消息(用于 EC_VER1)。
  • 返回值:指向错误消息字符串的指针。

三 ethercatprint.c 原文件的中文注释

3.1 ethercatprint.c

/** 在GNU通用公共许可证版本2下获得许可,附带例外情况。请参阅* 项目根目录中的LICENSE文件以获取完整的许可信息*//** \file* \brief* 用于将EtherCAT错误转换为可读消息的模块。** 使用SDO中止消息和AL状态代码来传达从站错误给用户应用程序。此模块将二进制代码转换为可读文本。有关定义的错误代码,请参阅EtherCAT协议文档。*/#include <stdio.h>
#include "oshw.h"
#include "ethercattype.h"
#include "ethercatmain.h"#define EC_MAXERRORNAME 127/** SDO错误列表类型定义 */
typedef struct
{/** 从SDO返回的错误代码 */uint32        errorcode;/** 可读的错误描述 */char          errordescription[EC_MAXERRORNAME + 1];
} ec_sdoerrorlist_t;/** AL状态代码列表类型定义 */
typedef struct
{/** AL状态代码 */uint16        ALstatuscode;/** 可读描述 */char          ALstatuscodedescription[EC_MAXERRORNAME + 1];
} ec_ALstatuscodelist_t;/** SoE错误列表类型定义 */
typedef struct
{/** SoE错误代码 */uint16        errorcode;/** 可读描述 */char          errordescription[EC_MAXERRORNAME + 1];
} ec_soeerrorlist_t;/** MBX错误列表类型定义 */
typedef struct
{/** MBX错误代码 */uint16              errorcode;/** 可读描述 */char                errordescription[EC_MAXERRORNAME + 1];
} ec_mbxerrorlist_t;char estring[EC_MAXERRORNAME];/** SDO错误列表定义 */
const ec_sdoerrorlist_t ec_sdoerrorlist[] = {{0x00000000, "无错误" },{0x05030000, "切换位未更改" },{0x05040000, "SDO协议超时" },{0x05040001, "客户端/服务器命令规范不合法或未知" },{0x05040005, "内存不足" },{0x06010000, "不支持对对象的访问" },{0x06010001, "尝试读取只写对象" },{0x06010002, "尝试写入只读对象" },{0x06010003, "子索引无法写入,对于写访问,SI0必须为0" },{0x06010004, "不支持可变长度对象的SDO完全访问" },{0x06010005, "对象长度超过邮箱大小" },{0x06010006, "对象映射到RxPDO,SDO下载被阻止" },{0x06020000, "对象在对象目录中不存在" },{0x06040041, "对象无法映射到PDO" },{0x06040042, "要映射的对象数量和长度将超过PDO长度" },{0x06040043, "一般参数不兼容原因" },{0x06040047, "设备内部不兼容性通用" },{0x06060000, "由于硬件错误而访问失败" },{0x06070010, "数据类型不匹配,服务参数的长度不匹配" },{0x06070012, "数据类型不匹配,服务参数的长度太高" },{0x06070013, "数据类型不匹配,服务参数的长度太低" },{0x06090011, "子索引不存在" },{0x06090030, "参数值范围超出(仅适用于写访问)" },{0x06090031, "参数值太高" },{0x06090032, "参数值太低" },{0x06090036, "最大值小于最小值" },{0x08000000, "一般错误" },{0x08000020, "数据无法传输或存储到应用程序" },{0x08000021, "由于本地控制,数据无法传输或存储到应用程序" },{0x08000022, "由于当前设备状态,数据无法传输或存储到应用程序" },{0x08000023, "对象字典动态生成失败或不存在对象字典" },{0xffffffff, "未知" }
};/** AL状态代码列表定义 */
const ec_ALstatuscodelist_t ec_ALstatuscodelist[] = {{0x0000 , "无错误" },{0x0001 , "未指定的错误" },{0x0002 , "没有内存" },{0x0011 , "无效的请求状态更改" },{0x0012 , "未知的请求状态" },{0x0013 , "不支持引导" },{0x0014 , "没有有效的固件" },{0x0015 , "无效的邮箱配置" },{0x0016 , "无效的邮箱配置" },{0x0017 , "无效的同步管理器配置" },{0x0018 , "没有有效的输入" },{0x0019 , "没有有效的输出" },{0x001A , "同步错误" },{0x001B , "同步管理器看门狗" },{0x001C , "无效的同步管理器类型" },{0x001D , "无效的输出配置" },{0x001E , "无效的输入配置" },{0x001F , "无效的看门狗配置" },{0x0020 , "从站需要冷启动" },{0x0021 , "从站需要INIT" },{0x0022 , "从站需要PREOP" },{0x0023 , "从站需要SAFEOP" },{0x0024 , "无效的输入映射" },{0x0025 , "无效的输出映射" },{0x0026 , "设置不一致" },{0x0027 , "不支持Freerun" },{0x0028 , "不支持同步" },{0x0029 , "Freerun需要3缓冲模式" },{0x002A , "背景看门狗" },{0x002B , "没有有效的输入和输出" },{0x002C , "严重的同步错误" },{0x002D , "没有同步错误" }, // 曾经是“无效的输出FMMU配置”{0x002E , "无效的输入FMMU配置" },{0x0030 , "无效的DC SYNC配置" },{0x0031 , "无效的DC锁存配置" },{0x0032 , "PLL错误" },{0x0033 , "DC同步IO错误" },{0x0034 , "DC同步超时错误" },{0x0035 , "DC无效的同步周期时间" },{0x0036 , "DC无效的sync0周期时间" },{0x0037 , "DC无效的sync1周期时间" },{0x0041 , "MBX_AOE" },{0x0042 , "MBX_EOE" },{0x0043 , "MBX_COE" },{0x0044 , "MBX_FOE" },{0x0045 , "MBX_SOE" },{0x004F , "MBX_VOE" },{0x0050 , "EEPROM无法访问" },{0x0051 , "EEPROM错误" },{0x0060 , "从站本地重新启动" },{0x0061 , "设备识别值已更新" },{0x00f0 , "应用程序控制器可用" },{0xffff , "未知" }
};/** SoE错误列表定义 */
const ec_soeerrorlist_t ec_soeerrorlist[] = {{0x0000, "无错误" },{0x1001, "没有IDN" },{0x1009, "对元素1的无效访问" },{0x2001, "没有名称" },{0x2002, "名称传输太短" },{0x2003, "名称传输太长" },{0x2004, "名称无法更改(只读)" },{0x2005, "此时名称受写保护" },{0x3002, "属性传输太短" },{0x3003, "属性传输太长" },{0x3004, "属性无法更改(只读)" },{0x3005, "此时属性受写保护" },{0x4001, "没有单位" },{0x4002, "单位传输太短" },{0x4003, "单位传输太长" },{0x4004, "单位无法更改(只读)" },{0x4005, "此时单位受写保护" },{0x5001, "没有最小输入值" },{0x5002, "最小输入值传输太短" },{0x5003, "最小输入值传输太长" },{0x5004, "最小输入值无法更改(只读)" },{0x5005, "此时最小输入值受写保护" },{0x6001, "没有最大输入值" },{0x6002, "最大输入值传输太短" },{0x6003, "最大输入值传输太长" },{0x6004, "最大输入值无法更改(只读)" },{0x6005, "此时最大输入值受写保护" },{0x7002, "操作数据传输太短" },{0x7003, "操作数据传输太长" },{0x7004, "操作数据无法更改(只读)" },{0x7005, "此时操作数据受写保护(状态)" },{0x7006, "操作数据小于最小输入值" },{0x7007, "操作数据小于最大输入值" },{0x7008, "无效操作数据:不支持配置的IDN" },{0x7009, "操作数据受密码保护" },{0x700A, "操作数据受写保护,已配置为周期性" },{0x700B, "无效的间接寻址:(例如,数据容器,列表处理)" },{0x700C, "操作数据受其他设置的写保护" },{0x700D, "保留" },{0x7010, "过程命令已激活" },{0x7011, "过程命令不可中断" },{0x7012, "此时无法执行过程命令(状态)" },{0x7013, "无法执行过程命令(无效或错误的参数)" },{0x7014, "无数据状态" },{0x8001, "没有默认值" },{0x8002, "默认值传输太长" },{0x8004, "默认值无法更改,只读" },{0x800A, "无效的驱动号" },{0x800A, "一般错误" },{0x800A, "没有元素被寻址" },{0xffff, "未知" }
};/** MBX错误列表定义 */
const ec_mbxerrorlist_t ec_mbxerrorlist[] = {{0x0000, "无错误" },{0x0001, "6字节邮箱头的语法错误" },{0x0002, "不支持邮箱协议" },{0x0003, "通道字段包含错误的值" },{0x0004, "不支持该服务" },{0x0005, "无效的邮箱头" },{0x0006, "接收的邮箱数据长度太短" },{0x0007, "从站内存不足" },{0x0008, "数据长度不一致" },{0xffff, "未知" }
};/** 查找与SDO错误代码相关的文本字符串。** @param[in] sdoerrorcode   = 根据EtherCAT协议定义的SDO错误代码* @return 可读字符串*/
const char* ec_sdoerror2string( uint32 sdoerrorcode)
{int i = 0;while ( (ec_sdoerrorlist[i].errorcode != 0xffffffffUL) &&(ec_sdoerrorlist[i].errorcode != sdoerrorcode) ){i++;}return ec_sdoerrorlist[i].errordescription;
}/** 查找与AL状态代码相关的文本字符串。** @param[in] ALstatuscode   = 根据EtherCAT协议定义的AL状态代码* @return 可读字符串*/
char* ec_ALstatuscode2string( uint16 ALstatuscode)
{int i = 0;while ( (ec_ALstatuscodelist[i].ALstatuscode != 0xffff) &&(ec_ALstatuscodelist[i].ALstatuscode != ALstatuscode) ){i++;}return (char *) ec_ALstatuscodelist[i].ALstatuscodedescription;
}/** 查找与SoE错误代码相关的文本字符串。** @param[in] errorcode   = 根据EtherCAT协议定义的SoE错误代码* @return 可读字符串*/
char* ec_soeerror2string( uint16 errorcode)
{int i = 0;while ( (ec_soeerrorlist[i].errorcode != 0xffff) &&(ec_soeerrorlist[i].errorcode != errorcode) ){i++;}return (char *) ec_soeerrorlist[i].errordescription;
}/** 查找与MBX错误代码相关的文本字符串。** @param[in] errorcode   = 根据EtherCAT协议定义的MBX错误代码* @return 可读字符串*/
char* ec_mbxerror2string( uint16 errorcode)
{int i = 0;while ( (ec_mbxerrorlist[i].errorcode != 0xffff) &&(ec_mbxerrorlist[i].errorcode != errorcode) ){i++;}return (char *) ec_mbxerrorlist[i].errordescription;
}/** 将错误转换为文本字符串。** @param[in] Ec = 描述错误的结构体。* @return 可读字符串*/
char* ecx_err2string(const ec_errort Ec)
{char timestr[20];sprintf(timestr, "时间:%12.3f", Ec.Time.sec + (Ec.Time.usec / 1000000.0) );switch (Ec.Etype){case EC_ERR_TYPE_SDO_ERROR:{sprintf(estring, "%s SDO 错误:从站:%d 索引:%4.4x.%2.2x 错误:%8.8x %s\n",timestr, Ec.Slave, Ec.Index, Ec.SubIdx, (unsigned)Ec.AbortCode, ec_sdoerror2string(Ec.AbortCode));break;}case EC_ERR_TYPE_EMERGENCY:{sprintf(estring, "%s 紧急错误:从站:%d 错误:%4.4x\n",timestr, Ec.Slave, Ec.ErrorCode);break;}case EC_ERR_TYPE_PACKET_ERROR:{sprintf(estring, "%s 数据包错误:从站:%d 索引:%4.4x.%2.2x 错误:%d\n",timestr, Ec.Slave, Ec.Index, Ec.SubIdx, Ec.ErrorCode);break;}case EC_ERR_TYPE_SDOINFO_ERROR:{sprintf(estring, "%s SDO 信息错误:从站:%d 索引:%4.4x.%2.2x 错误:%8.8x %s\n",timestr, Ec.Slave, Ec.Index, Ec.SubIdx, (unsigned)Ec.AbortCode, ec_sdoerror2string(Ec.AbortCode));break;}case EC_ERR_TYPE_SOE_ERROR:{sprintf(estring, "%s SoE 错误:从站:%d IDN:%4.4x 错误:%4.4x %s\n",timestr, Ec.Slave, Ec.Index, (unsigned)Ec.AbortCode, ec_soeerror2string(Ec.ErrorCode));break;}case EC_ERR_TYPE_MBX_ERROR:{sprintf(estring, "%s MBX 错误:从站:%d 错误:%4.4x %s\n",timestr, Ec.Slave, Ec.ErrorCode, ec_mbxerror2string(Ec.ErrorCode));break;}default:{sprintf(estring, "%s 错误:%8.8x\n",timestr, (unsigned)Ec.AbortCode);break;}}return (char*) estring;
}/** 在 ec_errorlist 中查找错误并转换为文本字符串。** @param[in]  context        = 上下文结构* @return 可读字符串*/
char* ecx_elist2string(ecx_contextt *context)
{ec_errort Ec;if (ecx_poperror(context, &Ec)){return ecx_err2string(Ec);}else{return "";}
}#ifdef EC_VER1
char* ec_elist2string(void)
{return ecx_elist2string(&ecx_context);
}
#endif

3.2 ethercatprint.h

/** Licensed under the GNU General Public License version 2 with exceptions. See* LICENSE file in the project root for full license information*//** \file* \brief* Headerfile for ethercatprint.c*/#ifndef _ethercatprint_
#define _ethercatprint_#ifdef __cplusplus
extern "C"
{
#endifchar* ec_sdoerror2string( uint32 sdoerrorcode);
char* ec_ALstatuscode2string( uint16 ALstatuscode);
char* ec_soeerror2string( uint16 errorcode);
char* ec_mbxerror2string( uint16 errorcode);
char* ecx_err2string(const ec_errort Ec);
char* ecx_elist2string(ecx_contextt *context);#ifdef EC_VER1
char* ec_elist2string(void);
#endif#ifdef __cplusplus
}
#endif#endif

该文档修改记录:

修改时间修改说明
2023年11月5日EtherCAT主站SOEM – 4 – SOEM之ethercatprint.h/c文件解析

总结

以上就是EtherCAT主站SOEM – 4 – SOEM之ethercatprint.h/c文件解析的内容。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。

相关文章:

EtherCAT主站SOEM -- 4 -- SOEM之ethercatprint.h/c文件解析

EtherCAT主站SOEM -- 4 -- SOEM之ethercatprint.h/c文件解析 一 ethercatprint.h/c文件功能预览&#xff1a;二 ethercatprint.h/c 文件的主要函数的作用&#xff1a;2.1.1 char* ec_sdoerror2string(uint32 sdoerrorcode)2.1.2 char* ec_ALstatuscode2string(uint16 ALstatusc…...

Redis01-缓存击穿、穿透和雪崩

目录 开场白-追命3连 使用场景 01缓存穿透场景与方案 02布隆过滤器 03缓存击穿场景与方案 04缓存雪崩场景与方案 开场白-追命3连 看你项目中有说用到Redis&#xff0c;都是哪些场景使用了Redis呢&#xff1f; 如果发生了缓存穿透、击穿、雪崩如何应对呢&#xff1f;缓存…...

multiple kernel learning(MKL)多核学习

历史上之所以会出现多核学习&#xff08;MKL&#xff09;这个词&#xff0c;是因为在深度学习流行起来以前&#xff0c;kernel是处理非线性的默认方法&#xff0c;那个年代优化一个非线性函数不容易&#xff0c;每加一层复杂性可能就需要多设计一个优化算法&#xff0c;MKL就是…...

JS匿名函数之函数表达式与立即执行函数

匿名函数是什么&#xff1f;和具名函数有什么区别&#xff1f;让我为大家介绍一下吧&#xff01; 没有名字的函数&#xff0c;无法直接使用 一.函数表达式 将匿名函数赋值给一个变量&#xff0c;并且通过变量名去调用&#xff0c;我们将这个称为函数表达式 语法&#xff1a; …...

WebGL:基础练习 / 简单学习 / demo / canvas3D

一、前置内容 canvas&#xff1a;理解canvas / 基础使用 / 实用demo-CSDN博客 WebGL&#xff1a;开始学习 / 理解 WebGL / WebGL 需要掌握哪些知识 / 应用领域 / 前端值得学WebGL吗_webgl培训-CSDN博客 二、在线运行HTML 用来运行WebGL代码&#xff0c;粘贴--运行&#xff…...

Python基础入门例程44-NP44 判断列表是否为空(条件语句)

最近的博文&#xff1a; Python基础入门例程43-NP43 判断布尔值&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程42-NP42 公式计算器&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客…...

【每日一题Day369】LC187重复的DNA序列 | 字符串哈希

重复的DNA序列【LC187】 DNA序列 由一系列核苷酸组成&#xff0c;缩写为 A, C, G 和 T.。 例如&#xff0c;"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA…...

服务器密码机主要功能及特点 安当加密

服务器密码机的主要功能包括&#xff1a; 数据加密&#xff1a;密码机使用各种加密算法对数据进行加密&#xff0c;确保只有拥有正确密钥的接收者才能解密和查看数据。数据解密&#xff1a;密码机使用相应的解密算法和密钥对已加密的数据进行解密&#xff0c;使其恢复成原始数据…...

RIP路由配置

RIP路由配置步骤与命令&#xff1a; 1.启用RIP路由&#xff1a;router rip 2.通告直连网络&#xff1a;network 直连网络 3.启用RIPv2版本&#xff1a;version 2 4.禁用自动汇总&#xff1a;no auto-summary 注意&#xff1a;静态路由通告远程网络&#xff0c;动态路由通告…...

尚硅谷Docker基础篇和Dockerfile超详细整合笔记

Docker基础篇DockerFile Docker&#xff1a;您要如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f;而这个就是使用容器。Docker解决了运行环境和配置问题…...

JavaScript_Date对象_实例方法_get类

计算这一年还剩多少天&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document&…...

Go语言在区块链开发中的应用

引言 区块链是近年来备受关注的技术领域&#xff0c;它不仅改变了传统的数据交换和存储方式&#xff0c;还为各种应用场景提供了全新的解决方案。而Go语言&#xff08;Golang&#xff09;作为一门简洁、高效的编程语言&#xff0c;正逐渐成为开发区块链应用的首选语言。本文将…...

S4.2.4.5 Fast Training Sequence (FTS)

一 本章节主讲知识点 1.1 FTS的用途和实现注意 二 本章节原文翻译 Fast Training Sequence (FTS) 主要用于在L0s->L0跳转的过程中&#xff0c;让Receiver 检测到电气空闲退出&#xff0c;以及实现bit 和 symbol lock。 2.1 Gen1 and Gen2 速率 对于Gen1/2 FTS的组成如下…...

Gitlab CICD实用技巧汇总

关于.gitlab-ci.yml的实用配置 1、stage参数 stages: - build - test - deploy 相同stage的作业会并行执行&#xff0c;有一个失败&#xff0c;则认为这个stage失败。 不同stage的作业会按序执行&#xff0c;前面stage有失败&#xff0c;后续stage不会继续执行。 可以使用ne…...

JavaSpringbootMySQL高校实训管理平台01557-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 高校实训管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…...

初阶JavaEE(14)表白墙程序

接上次博客&#xff1a;初阶JavaEE&#xff08;13&#xff09;&#xff08;安装、配置&#xff1a;Smart Tomcat&#xff1b;访问出错怎么办&#xff1f;Servlet初识、调试、运行&#xff1b;HttpServlet&#xff1a;HttpServlet&#xff1b;HttpServletResponse&#xff09;-C…...

算法设计与分析第二章作业

1. 描述最大字段和的分治算法 题目 思路 判断最大子段和&#xff0c;可以用分治的思想&#xff0c;每次将序列一分为二&#xff0c;选择两个序列的最大子段和。 但是这里还有一种可能&#xff0c;就是子段可以横跨两个子序列&#xff0c;所以我们的最大子段和就是&#xff1…...

《视觉SLAM十四讲》-- 三维空间的刚体运动

文章目录 02 三维空间的刚体运动2.0 机器人位姿表述2.1 点和坐标系2.1.1 三维坐标系有关表述2.1.2 坐标系变换 2.2 旋转向量和欧拉角2.2.1 旋转向量2.2.2 欧拉角 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的计算2.3.3 四元数表示旋转2.3.4 四元数与其他旋转表示法的转换 2.4 相…...

关于iOS:如何使用SwiftUI调整图片大小?

How to resize Image with SwiftUI? 我在Assets.xcassets中拥有很大的形象。 如何使用SwiftUI调整图像大小以缩小图像&#xff1f; 我试图设置框架&#xff0c;但不起作用&#xff1a; 1 2 Image(room.thumbnailImage) .frame(width: 32.0, height: 32.0) 在Image上应用…...

【MySQL】数据库MySQL基础知识与操作

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...

LTR-381RGB-01RGB+环境光检测应用场景及客户类型主要有哪些?

RGB环境光检测 功能&#xff0c;在应用场景及客户类型&#xff1a; 1. 可应用的儿童玩具类型 (1) 智能互动玩具 功能&#xff1a;通过检测环境光或物体颜色触发互动&#xff08;如颜色识别积木、光感音乐盒&#xff09;。 客户参考&#xff1a; LEGO&#xff08;乐高&#x…...

AI书签管理工具开发全记录(十八):书签导入导出

文章目录 AI书签管理工具开发全记录&#xff08;十八&#xff09;&#xff1a;书签导入导出1.前言 &#x1f4dd;2.书签结构分析 &#x1f4d6;3.书签示例 &#x1f4d1;4.书签文件结构定义描述 &#x1f523;4.1. ​整体文档结构​​4.2. ​核心元素类型​​4.3. ​层级关系4.…...

第2篇:BLE 广播与扫描机制详解

本文是《BLE 协议从入门到专家》专栏第二篇,专注于解析 BLE 广播(Advertising)与扫描(Scanning)机制。我们将从协议层结构、广播包格式、设备发现流程、控制器行为、开发者 API、广播冲突与多设备调度等方面,全面拆解这一 BLE 最基础也是最关键的通信机制。 一、什么是 B…...

MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程

文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天&#xff0c;您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间&#xff1f;随着影像记录成为日常习惯&…...