跳到主要内容

日志

DLL 底层运行日志通过回调推送到应用层。

日志类别

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_LOCAL = 6 /* 控制台输出捕获 */
} log_category_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);

注册崩溃通知回调,用于捕获 DLL 内部异常。DLL 会同时写入 crash_log.txt

回调类型:

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, "Darra.Core.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 线程。