日志
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 线程。