日志
DLL 底层运行日志通过回调推送到应用层。
日志类别
log_category_t (定义在 ethercat_types.h) 是 log_callback_t 回调收到的 int category 取值,与 DLL 内部 LogCategory 一一对应:
typedef enum {
LOG_CATEGORY_ERROR = 0, /* 系统错误和异常 */
LOG_CATEGORY_WARNING = 1, /* 潜在问题 */
LOG_CATEGORY_MESSAGE = 2, /* 一般信息(状态切换等) */
LOG_CATEGORY_MAILBOX = 3, /* CoE/SoE/FoE/EoE 邮箱通信(默认关闭) */
LOG_CATEGORY_PDO = 4, /* PDO 数据变化日志(默认关闭) */
LOG_CATEGORY_DEBUG = 5 /* 详细调试信息(默认关闭) */
} log_category_t;
LOCAL 类别
DLL 经 log_callback_t 推送的类别只到 LOG_CATEGORY_DEBUG (5)。logging/logging.h 另提供扩展枚举 dx_log_category_t,额外含 LOG_LOCAL = 6(仅客户端本地日志使用,不经过 DLL),用于结构化日志条目 log_entry_t。
PDO 日志
PDO 日志只在 PDO 数据发生变化时输出,不会每个周期都产生日志。适合调试 PDO 映射问题。
日志回调
SetLogCallback()
void SetLogCallback(log_callback_t callback);
注册日志回调函数。所有 DLL 内部日志通过此回调输出。
回调类型:
typedef void (*log_callback_t)(int category, const char* message);
回调参数:
category(int) — 日志类别 (log_category_t)message(const char*) — 日志消息文本
崩溃通知
SetCrashCallback()
void SetCrashCallback(crash_callback_t callback);
注册崩溃通知回调,用于捕获运行时库内部异常。运行时库同时会记录崩溃日志。
回调类型:
typedef void (*crash_callback_t)(int exception_code, const char* message);
回调参数:
exception_code(int) — 异常代码message(const char*) — 异常消息
日志开关
SetPDOLogging()
void SetPDOLogging(BOOL enable);
启用/禁用 PDO 数据交换日志(LOG_CATEGORY_PDO)。默认禁用。
SetMailboxLogging()
void SetMailboxLogging(BOOL enable);
启用/禁用邮箱通信日志(LOG_CATEGORY_MAILBOX)。默认禁用。
SetDebugLogging()
void SetDebugLogging(BOOL enable);
启用/禁用调试日志(LOG_CATEGORY_DEBUG)。默认禁用。
日志性能
PDO 日志在高频 PDO 周期中产生大量输出,仅建议在调试时开启。生产环境中保持默认(仅 ERROR/WARNING/MESSAGE)。
调试日志归档
CloseDebugLog()
void CloseDebugLog(void);
关闭并刷新调试日志文件,用于程序退出前归档日志。
完整示例
#define DYNAMIC_LOAD
#include "ethercat.h"
#include <stdio.h>
/* 日志回调 */
static void on_log(int category, const char* message)
{
const char* tags[] = {"错误", "警告", "消息", "邮箱", "PDO", "调试"};
const char* tag = (category >= 0 && category <= 5) ? tags[category] : "未知";
printf("[%s] %s\n", tag, message);
}
/* 崩溃回调 */
static void on_crash(int code, const char* message)
{
printf("[崩溃] 代码=%d: %s\n", code, message);
}
int main(void)
{
dll_t dll;
LOAD_DLL(&dll, "DarraEtherCAT.dll");
/* 注册回调 */
dll.SetLogCallback(on_log);
dll.SetCrashCallback(on_crash);
/* 启用详细日志(调试用) */
dll.SetDebugLogging(TRUE);
dll.SetMailboxLogging(TRUE);
/* dll.SetPDOLogging(TRUE); -- 仅调试时开启 */
uint16_t master = dll.Initialize();
dll.SetNetwork(master, "\\Device\\NPF_{...}", "");
dll.SetStateSequence(master, EC_STATE_OPERATIONAL, 10000);
dll.Start(master);
getchar();
dll.Stop(master);
dll.Dispose(master);
UNLOAD_DLL(&dll);
return 0;
}
UI 集成
日志回调在非 UI 线程中触发,在 GUI 应用中显示日志时需要将消息投递到 UI 线程。