版本: 1.0.5
日期: 2026-06-07
1. 概述#
BFYCore 是从 BFYCore 工程核心功能封装的 C++ 动态链接库,提供BFY控制器的完整通信与控制能力。所有导出函数使用 extern "C" 约定,确保 C#、Python 等外部语言可通过 FFI 直接调用。
核心能力#
| 功能 |
说明 |
| 连接管理 |
USB 串口 / TCP 网络连接 |
| 命令收发 |
G 代码命令队列、缓冲区管理、实时指令 |
| 状态解析 |
BFY控制器 状态报告实时解析 |
| 文件处理 |
G 代码文件加载/保存/范围分析/时间预估 |
| 程序执行 |
从头运行、暂停/恢复、中止、循环执行 |
| Jog 控制 |
手动点动(支持6轴X/Y/Z/A/B/C) |
| 绝对位置点动 |
多轴同时绝对/相对位置点动 (bfy_jog_to) |
| 倍率控制 |
进给/快速/功率倍率实时调整 |
| 配置管理 |
$$ 参数读写、版本检测 |
| 自动上报 |
控制板状态自动上报参数配置 ($10/$481) |
| IO 控制 |
数字输出控制、IO端口状态查询、限位开关查询 |
| NGC 宏解析 |
NGC 流程控制解析(IF/WHILE/DO/SUB等),支持参数读写 |
| YMODEM 上传 |
通过 YMODEM 协议上传文件到控制板 w25Q128存储芯片 |
| 六轴关节角度 |
获取机器人关节角度反馈 |
2. 快速开始#
2.1 创建项目#
在 Visual Studio 中创建一个新的 C# 项目,复制"BFYCore.dll"到项目目录。
2.2 C# 调用示例#
using System;
using System.Runtime.InteropServices;
class Program
{
// ---- 导入 DLL 函数 ----
[DllImport("BFYCore.dll")] public static extern IntPtr bfy_create();
[DllImport("BFYCore.dll")] public static extern void bfy_destroy(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern int bfy_configure(IntPtr handle, int type, string param1, int param2);
[DllImport("BFYCore.dll")] public static extern int bfy_open(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern void bfy_close(IntPtr handle, bool user);
[DllImport("BFYCore.dll")] public static extern bool bfy_is_connected(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern int bfy_get_status(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern int bfy_send_command(IntPtr handle, string command);
[DllImport("BFYCore.dll")] public static extern int bfy_load_file(IntPtr handle, string filename, bool append);
[DllImport("BFYCore.dll")] public static extern int bfy_run_program(IntPtr handle, bool homing);
[DllImport("BFYCore.dll")] public static extern void bfy_abort_program(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern void bfy_pause(IntPtr handle, bool cooling);
[DllImport("BFYCore.dll")] public static extern void bfy_resume(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern void bfy_reset(IntPtr handle);
[DllImport("BFYCore.dll")] public static extern void bfy_set_override_feed(IntPtr handle, int percent);
[DllImport("BFYCore.dll")] public static extern int bfy_jog(IntPtr handle, int dir, float speed, float step);
[DllImport("BFYCore.dll")] public static extern void bfy_jog_abort(IntPtr handle);
// 回调委托
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void OnStatusChanged(int newStatus, IntPtr userData);
[DllImport("BFYCore.dll")] public static extern void bfy_on_status_changed(
IntPtr handle, OnStatusChanged callback, IntPtr userData);
static void Main()
{
// 1. 创建实例
IntPtr core = bfy_create();
// 2. 注册状态回调
OnStatusChanged onStatus = (status, _) =>
Console.WriteLine($"状态变化: {status}");
bfy_on_status_changed(core, onStatus, IntPtr.Zero);
// 3. 配置并连接(USB 串口)
bfy_configure(core, 0, "COM3", 115200);
if (bfy_open(core) != 0)
{
Console.WriteLine("连接失败!");
bfy_destroy(core);
return;
}
// 4. 发送 G 代码命令
bfy_send_command(core, "G0 X0 Y0");
bfy_send_command(core, "G1 X100 Y100 F1000");
// 5. 加载并执行文件
bfy_load_file(core, "test.nc", false);
bfy_run_program(core, homing: false);
// 6. 暂停/恢复
bfy_pause(core, false); // 暂停
bfy_resume(core); // 恢复
// 7. 点动控制
bfy_jog(core, 5, 1000f, 10f); // E 方向,1000mm/min,10mm步长
bfy_jog_abort(core); // 中止点动
// 8. 倍率调整
bfy_set_override_feed(core, 150); // 150% 进给倍率
// 9. 断开并销毁
bfy_close(core, true);
bfy_destroy(core);
}
}
2.3 Python 调用示例#
import ctypes
from ctypes import c_int, c_float, c_bool, c_char_p, c_void_p, POINTER
# 加载 DLL
dll = ctypes.CDLL("BFYCore.dll")
# ---- 函数签名声明 ----
dll.bfy_create.restype = c_void_p
dll.bfy_destroy.argtypes = [c_void_p]
dll.bfy_configure.argtypes = [c_void_p, c_int, c_char_p, c_int]
dll.bfy_configure.restype = c_int
dll.bfy_open.argtypes = [c_void_p]
dll.bfy_open.restype = c_int
dll.bfy_close.argtypes = [c_void_p, c_bool]
dll.bfy_is_connected.argtypes = [c_void_p]
dll.bfy_is_connected.restype = c_bool
dll.bfy_get_status.argtypes = [c_void_p]
dll.bfy_get_status.restype = c_int
dll.bfy_send_command.argtypes = [c_void_p, c_char_p]
dll.bfy_send_command.restype = c_int
dll.bfy_load_file.argtypes = [c_void_p, c_char_p, c_bool]
dll.bfy_load_file.restype = c_int
dll.bfy_run_program.argtypes = [c_void_p, c_bool]
dll.bfy_run_program.restype = c_int
dll.bfy_abort_program.argtypes = [c_void_p]
dll.bfy_pause.argtypes = [c_void_p, c_bool]
dll.bfy_resume.argtypes = [c_void_p]
dll.bfy_reset.argtypes = [c_void_p]
dll.bfy_set_override_feed.argtypes = [c_void_p, c_int]
dll.bfy_jog.argtypes = [c_void_p, c_int, c_float, c_float]
dll.bfy_jog.restype = c_int
dll.bfy_jog_abort.argtypes = [c_void_p]
# 状态枚举
STATUS = {
0: "Disconnected", 1: "Connecting", 2: "Idle", 3: "Run",
4: "Hold", 5: "Door", 6: "Home", 7: "Alarm",
8: "Check", 9: "Jog", 10: "Queue", 11: "Cooling",
12: "AutoHold", 13: "Tool"
}
# ---- 使用示例 ----
# 1. 创建实例
core = dll.bfy_create()
# 2. 配置并连接(USB 串口 COM3, 115200)
ret = dll.bfy_configure(core, 0, b"COM3", 115200)
ret = dll.bfy_open(core)
if ret != 0:
print("连接失败!")
dll.bfy_destroy(core)
exit(1)
print(f"已连接,当前状态: {STATUS.get(dll.bfy_get_status(core), 'Unknown')}")
# 3. 发送 G 代码命令
dll.bfy_send_command(core, b"G0 X0 Y0")
dll.bfy_send_command(core, b"G1 X100 Y100 F1000")
# 4. 加载并执行文件
dll.bfy_load_file(core, b"test.nc", False)
dll.bfy_run_program(core, False)
# 5. 暂停/恢复
dll.bfy_pause(core, False) # 暂停
dll.bfy_resume(core) # 恢复
# 6. 点动控制
dll.bfy_jog(core, 5, 1000.0, 10.0) # E 方向
dll.bfy_jog_abort(core)
# 7. 倍率调整
dll.bfy_set_override_feed(core, 150) # 150%
# 8. 断开并销毁
dll.bfy_close(core, True)
dll.bfy_destroy(core)
3. API 参考#
3.1 数据类型#
句柄类型#
| 类型 |
说明 |
BfyCoreHandle |
不透明指针,代表一个 BfyCore 实例 |
BfyFileHandle |
不透明指针,代表一个 G代码文件 实例 |
BfyMacStatus — 机器运行状态
| 值 |
名称 |
说明 |
| 0 |
BFY_MAC_DISCONNECTED |
未连接 |
| 1 |
BFY_MAC_CONNECTING |
正在连接 |
| 2 |
BFY_MAC_IDLE |
空闲 |
| 3 |
BFY_MAC_RUN |
运行中 |
| 4 |
BFY_MAC_PAUSED |
暂停 |
| 5 |
BFY_MAC_DOOR |
电子围栏触发 |
| 6 |
BFY_MAC_HOME |
回零中 |
| 7 |
BFY_MAC_STOPPED |
急停 |
| 8 |
BFY_MAC_ALARM |
报警 |
| 9 |
BFY_MAC_CHECK |
检查模式 |
| 10 |
BFY_MAC_JOG |
手动点动 |
| 13 |
BFY_MAC_AUTOHOLD |
自动保持 |
| 14 |
BFY_MAC_TOOL |
更换执行器 |
BfyWrapperType — 通信后端类型
| 值 |
名称 |
说明 |
| 0 |
BFY_WRAPPER_USB_SERIAL |
USB 串口 |
| 1 |
BFY_WRAPPER_TCP_CLIENT |
TCP 网络客户端 |
BfyJogDirection — 点动方向
| 值 |
名称 |
说明 |
| 0 |
BFY_JOG_ABORT |
急停 |
| 1 |
BFY_JOG_HOME |
回零 |
| 2 |
BFY_JOG_N |
Y+ (北) |
| 3 |
BFY_JOG_S |
Y- (南) |
| 4 |
BFY_JOG_W |
X- (西) |
| 5 |
BFY_JOG_E |
X+ (东) |
| 6 |
BFY_JOG_NW |
X- Y+ (西北) |
| 7 |
BFY_JOG_NE |
X+ Y+ (东北) |
| 8 |
BFY_JOG_SW |
X- Y- (西南) |
| 9 |
BFY_JOG_SE |
X+ Y- (东南) |
| 10 |
BFY_JOG_ZUP |
Z+ |
| 11 |
BFY_JOG_ZDOWN |
Z- |
| 12 |
BFY_JOG_POSITION |
设定位置 |
| 13 |
BFY_JOG_AP |
A+ (第四轴正方向) |
| 14 |
BFY_JOG_AM |
A- (第四轴负方向) |
| 15 |
BFY_JOG_BP |
B+ (第五轴正方向) |
| 16 |
BFY_JOG_BM |
B- (第五轴负方向) |
| 17 |
BFY_JOG_CP |
C+ (第六轴正方向) |
| 18 |
BFY_JOG_CM |
C- (第六轴负方向) |
BfyStreamingMode — 流传输模式
| 值 |
名称 |
说明 |
| 0 |
BFY_STREAM_BUFFERED |
缓冲模式 |
| 1 |
BFY_STREAM_SYNCHRONOUS |
同步模式 |
| 2 |
BFY_STREAM_REPEAT_ON_ERROR |
出错重试模式 |
BfyDetectedIssue — 检测到的问题
| 值 |
名称 |
说明 |
| 0 |
BFY_ISSUE_UNKNOWN |
未知问题 |
| -1 |
BFY_ISSUE_MANUAL_RESET |
用户手动复位 |
| -2 |
BFY_ISSUE_MANUAL_DISCONNECT |
用户手动断开 |
| -3 |
BFY_ISSUE_MANUAL_ABORT |
用户手动急停 |
| 1 |
BFY_ISSUE_STOP_RESPONDING |
设备停止响应 |
| 3 |
BFY_ISSUE_UNEXPECTED_RESET |
意外复位 |
| 4 |
BFY_ISSUE_UNEXPECTED_DISCONNECT |
意外断开连接 |
| 5 |
BFY_ISSUE_MACHINE_ALARM |
机器报警 |
结构体#
BfyGPoint — 三维坐标点
typedef struct {
float x; // X 轴坐标
float y; // Y 轴坐标
float z; // Z 轴坐标
} BfyGPoint;
BfyVersionInfo — 固件版本信息
typedef struct {
char version_info[256]; // 固件版本信息(完整字符串)
} BfyVersionInfo;
BfyIoPinState — IO端口状态
typedef struct {
char type[8]; // 端口类型: "DIN"/"DOUT"/"AIN"/"AOUT"
char name[64]; // 端口描述
int pin; // 端口号
int value; // 当前值(数字0/1,或模拟量)
} BfyIoPinState;
BfyConfigParam — 配置参数项
typedef struct {
int number; // 参数编号
char value[64]; // 参数值字符串
char name[128]; // 参数名称
char unit[32]; // 参数单位
char description[256]; // 参数描述
} BfyConfigParam;
BfyProgramStats — 程序执行统计
typedef struct {
int target; // 总行数目标
int sent; // 已发送行数
int executed; // 已执行行数
double total_time_ms; // 当前作业已用时间(ms)
double global_time_ms; // 全局总时间(ms)
double projected_ms; // 预估剩余时间(ms)
} BfyProgramStats;
BfyFileRange — G代码文件范围信息
typedef struct {
bool valid; // 范围是否有效
float draw_x_min; // 绘制范围 X 最小值
float draw_x_max; // 绘制范围 X 最大值
float draw_y_min; // 绘制范围 Y 最小值
float draw_y_max; // 绘制范围 Y 最大值
float move_x_min; // 移动范围 X 最小值
float move_x_max; // 移动范围 X 最大值
float move_y_min; // 移动范围 Y 最小值
float move_y_max; // 移动范围 Y 最大值
double estimated_time_ms; // 预估执行时间(ms)
} BfyFileRange;
回调函数类型#
// 核心回调
typedef void (*BfyOnStatusChanged)(BfyMacStatus new_status, void* user_data);
typedef void (*BfyOnOverrideChanged)(int feed, int rapid, int spindle, void* user_data);
typedef void (*BfyOnIssueDetected)(BfyDetectedIssue issue, void* user_data);
typedef void (*BfyOnLogMessage)(const char* message, void* user_data);
typedef void (*BfyOnFileLoaded)(long elapsed_ms, const char* filename, void* user_data);
typedef void (*BfyOnProgramEnded)(void* user_data);
typedef void (*BfyOnCommandSent)(const char* command, void* user_data);
// NGC 宏程序解析回调
typedef void (*BfyOnNgcOutput)(const char* line, int line_number, void* user_data);
typedef void (*BfyOnNgcAlarm)(int alarm_code, void* user_data);
typedef void (*BfyOnNgcLog)(const char* message, int type, void* user_data);
// type: 0=Info, 1=Warning, 2=Error, 3=Plain
// YMODEM 文件上传回调
typedef void (*BfyOnYmodemProgress)(int progress, void* user_data); // progress: 0-100
typedef void (*BfyOnYmodemResult)(int success, void* user_data); // success: 1=成功, 0=失败
typedef void (*BfyOnYmodemLog)(const char* message, void* user_data);
3.2 函数参考#
核心生命周期#
| 函数 |
说明 |
返回值 |
bfy_create() |
创建 BfyCore 实例 |
实例句柄,失败返回 NULL |
bfy_destroy(handle) |
销毁实例并释放资源 |
无 |
连接管理#
| 函数 |
说明 |
参数 |
返回值 |
bfy_configure(handle, type, param1, param2) |
配置通信后端 |
type: 0=USB串口, 1=TCP; param1: 串口名或IP:PORT; param2: 波特率或端口 |
0=成功, -1=失败 |
bfy_open(handle) |
打开连接 |
- |
0=成功, -1=失败 |
bfy_close(handle, user) |
关闭连接 |
user: true=主动断开 |
无 |
bfy_is_connected(handle) |
查询连接状态 |
- |
true/false |
配置示例:
// USB 串口连接
bfy_configure(handle, BFY_WRAPPER_USB_SERIAL, "COM3", 115200);
// TCP 网络连接
bfy_configure(handle, BFY_WRAPPER_TCP_CLIENT, "192.168.1.152:12121", 0);
状态查询#
| 函数 |
说明 |
返回值 |
bfy_get_status(handle) |
获取当前机器状态 |
BfyMacStatus 枚举 |
bfy_get_machine_position(handle, &pos) |
获取机器坐标 |
写入 BfyGPoint |
bfy_get_work_position(handle, &pos) |
获取工件坐标 |
写入 BfyGPoint |
bfy_get_working_offset(handle, &offset) |
获取工件坐标系偏移 |
写入 BfyGPoint |
bfy_get_joint_angles(handle, angles) |
获取六关节角度(固定6个元素数组) |
写入 float[6] |
bfy_get_current_feed(handle) |
获取当前进给速率 |
float (mm/min) |
bfy_get_program_stats(handle, &stats) |
获取程序执行统计 |
写入 BfyProgramStats |
bfy_get_version_info(handle, &info) |
获取固件版本信息 |
写入 BfyVersionInfo |
实时指令#
| 函数 |
说明 |
返回值 |
bfy_resume(handle) |
循环启动/恢复 (~),恢复暂停状态 |
无 |
bfy_pause(handle) |
进给暂停 (!) |
无 |
bfy_safe_pause(handle) |
安全暂停 (@),触发安全暂停状态 |
无 |
bfy_reset(handle) |
复位控制器 (Ctrl-X),清空所有队列 |
无 |
bfy_send_immediate(handle, byte) |
发送实时单字节指令(不进入规划缓冲区) |
无 |
命令发送#
| 函数 |
说明 |
返回值 |
bfy_send_command(handle, command) |
发送 G 代码命令 |
0=成功, -1=失败 |
bfy_execute_custom_code(handle, code) |
执行自定义代码 |
0=成功, -1=失败 |
命令示例:
bfy_send_command(handle, "G0 X0 Y0"); // 快速移动
bfy_send_command(handle, "G1 X100 F1000"); // 线性插补
bfy_send_command(handle, "M3 S1000"); // 开启激光
bfy_send_command(handle, "$H"); // 回零
bfy_send_command(handle, "$X"); // 解锁
程序执行#
| 函数 |
说明 |
返回值 |
bfy_run_program(handle, homing) |
从头执行程序 |
0=成功, -1=无法执行 |
bfy_abort_program(handle) |
中止程序 |
无 |
bfy_can_run_program(handle) |
是否可以执行 |
true/false |
bfy_can_abort_program(handle) |
是否可以中止 |
true/false |
bfy_set_loop_count(handle, count) |
设置循环次数 |
无 |
倍率控制#
| 函数 |
说明 |
说明 |
bfy_set_override_feed(handle, percent) |
设置进给倍率 |
如 150 表示 150% |
bfy_set_override_rapid(handle, percent) |
设置快速倍率 |
仅支持 100/50/25 |
bfy_set_override_spindle(handle, percent) |
设置功率倍率 |
如 200 表示 200% |
bfy_get_overrides(handle, &f, &r, &s) |
获取当前倍率 |
输出三个 int |
点动控制#
| 函数 |
说明 |
返回值 |
bfy_jog(handle, dir, speed, step) |
执行单方向点动 |
0=成功, -1=失败 |
bfy_jog_abort(handle) |
中止连续点动 |
无 |
bfy_set_jog_params(handle, speed, step, continuous) |
设置点动默认参数 |
无 |
bfy_jog_to(handle, x, y, z, a, b, c, feed, is_absolute, axis_mask) |
多轴同时绝对/相对位置点动 |
0=成功, -1=失败 |
点动示例:
// X+ 方向,1000mm/min 速度,10mm 步长
bfy_jog(handle, BFY_JOG_E, 1000.0f, 10.0f);
// 中止点动
bfy_jog_abort(handle);
// 多轴绝对位置点动:X=50, Y=30, Z=10,进给 2000mm/min
// axis_mask: bit0=X, bit1=Y, bit2=Z, bit3=A, bit4=B, bit5=C
// 此处 mask=0b000111 = 7,仅 X/Y/Z 轴参与运动
bfy_jog_to(handle, 50.0f, 30.0f, 10.0f, 0, 0, 0, 2000.0f, true, 7);
G代码文件操作#
| 函数 |
说明 |
返回值 |
bfy_load_file(handle, filename, append) |
加载 G 代码文件 |
0=成功, -1=失败 |
bfy_load_gcode_string(handle, gcode, name, append) |
从字符串加载 |
0=成功, -1=失败 |
bfy_save_file(handle, filename, header, footer, between, cycles) |
保存到文件 |
0=成功, -1=失败 |
bfy_get_file_range(handle, &range) |
获取文件范围信息 |
写入 BfyFileRange |
bfy_get_file_command_count(handle) |
获取命令数量 |
int |
bfy_get_file_estimated_time(handle) |
获取预估时间 |
double (ms) |
配置管理#
| 函数 |
说明 |
返回值 |
bfy_refresh_config(handle) |
刷新配置(从设备读取 $$) |
0=成功, -1=失败 |
bfy_get_config_count(handle) |
获取配置参数数量 |
int |
bfy_get_config_params(handle, params, max) |
获取参数列表 |
实际填充数量 |
bfy_get_config_value(handle, number, buf, size) |
获取单个参数值 |
0=成功, -1=不存在 |
bfy_set_config_value(handle, number, value) |
设置参数值(写入设备) |
0=成功, -1=失败 |
bfy_refresh_machine_info(handle) |
刷新机器信息 |
0=成功, -1=失败 |
配置示例:
// 读取 $30 参数
char value[64];
bfy_get_config_value(handle, 30, value, sizeof(value));
// 设置 $32=1 (启用激光模式)
bfy_set_config_value(handle, 32, "1");
自动上报#
| 函数 |
说明 |
bfy_set_auto_report(handle, report_mask, interval_ms) |
设置控制板自动上报参数。report_mask=$10 反馈内容掩码(1=位置,2=缓冲区,3=全部),interval_ms=$481 上报间隔(毫秒) |
线程模式#
| 函数 |
说明 |
bfy_set_threading_mode(handle, mode) |
设置线程模式: 0=Slow, 1=Quiet, 2=Fast(默认), 3=UltraFast, 4=Insane |
回调注册#
| 函数 |
说明 |
bfy_on_status_changed(handle, callback, user_data) |
注册状态变化回调 |
bfy_on_override_changed(handle, callback, user_data) |
注册倍率变化回调 |
bfy_on_issue_detected(handle, callback, user_data) |
注册异常检测回调 |
bfy_on_log_message(handle, callback, user_data) |
注册日志消息回调 |
bfy_on_file_loaded(handle, callback, user_data) |
注册文件加载完成回调 |
bfy_on_program_ended(handle, callback, user_data) |
注册程序执行结束回调 |
bfy_on_command_sent(handle, callback, user_data) |
注册命令发送回调(头文件 typedef,未导出则忽略) |
工具函数#
| 函数 |
说明 |
返回值 |
bfy_status_to_string(status) |
状态枚举转字符串 |
静态字符串指针 |
bfy_get_last_error(handle) |
获取最后错误信息 |
内部缓冲区指针 |
bfy_get_version() |
获取 DLL 版本号 |
版本字符串 |
bfy_notify_program_ended(handle) |
通知程序执行结束(NGC模式专用,C#端检测到所有命令执行完毕后调用) |
无 |
3.3 NGC 流程控制解析#
NGC 宏程序解析器,支持条件判断、循环、子程序、表达式求值等。
| 函数 |
说明 |
返回值 |
bfy_ngc_init() |
初始化 NGC 解析器,重置状态、清空参数和栈 |
0=成功, -1=失败 |
bfy_ngc_set_macro_path(path) |
设置宏文件搜索路径(命名子程序调用时搜索 .macro 文件) |
无 |
bfy_ngc_parse_file(filename, output_cb, alarm_cb, log_cb, user_data) |
解析并执行 NGC 程序文件,G代码行通过 output_cb 输出 |
0=成功, 其他=状态码 |
bfy_ngc_parse_string(gcode, name, output_cb, alarm_cb, log_cb, user_data) |
解析并执行 NGC 宏字符串 |
0=成功, 其他=状态码 |
bfy_ngc_check_file(filename, log_cb, user_data) |
仅语法检查 NGC 文件(不执行、不输出 G代码) |
0=成功, 其他=状态码 |
bfy_ngc_get_param(param_id, &value) |
获取编号式 NGC 参数值 (1-65535) |
0=成功, -1=不存在 |
bfy_ngc_set_param(param_id, value) |
设置编号式 NGC 参数值 |
0=成功, -1=失败 |
bfy_ngc_get_named_param(name, &value) |
获取命名 NGC 参数值(下划线开头为全局参数) |
0=成功, -1=不存在 |
bfy_ngc_set_named_param(name, value) |
设置命名 NGC 参数值 |
0=成功, -1=失败 |
bfy_ngc_status_string(status) |
获取 NGC 状态码的字符串描述 |
静态字符串指针 |
支持的 NGC 语法:
- 条件判断:IF / ELSEIF / ELSE / ENDIF
- 循环结构:WHILE / ENDWHILE, DO / WHILE, REPEAT / ENDREPEAT
- 循环控制:BREAK, CONTINUE
- 子程序:SUB / ENDSUB / CALL / RETURN
- 异常触发:RAISE ALARM / RAISE ERROR
- 表达式求值和参数引用(#1, #<_param>)
3.4 IO 控制#
| 函数 |
说明 |
返回值 |
bfy_set_output(handle, port, state) |
设置数字输出端口状态。port: 0=AUXOUTPUT0, 1=AUXOUTPUT1...; state: true=M64开启, false=M65关闭 |
无 |
bfy_query_pin_states(handle) |
查询所有IO端口状态(发送 $PINSTATE 命令),结果存入内部缓存 |
无 |
bfy_get_io_pin_states(handle, states, max_count) |
获取已缓存的IO端口状态数组,返回实际填充数量 |
int 状态数量 |
bfy_query_limit_states(handle) |
查询限位开关状态(发送 $LIM 命令),结果存入内部缓存 |
无 |
bfy_get_limit_states(handle) |
获取已缓存的限位开关状态字符串,如 "XYZ" 表示X/Y/Z轴限位触发 |
内部缓冲区指针 |
3.5 YMODEM 文件上传#
通过 YMODEM 协议上传文件到 W25Q128 存储芯片。使用独立串口连接,调用前需确保主连接已断开(串口未被占用)。此函数为阻塞调用,建议在后台线程执行。
| 函数 |
说明 |
返回值 |
bfy_ymodem_upload(port_name, baud_rate, file_path, on_progress, on_result, on_log, user_data) |
上传文件。on_progress(0-100), on_result(1=成功,0=失败), on_log 日志回调均可为 NULL |
0=成功, -1=失败 |
4. 典型工作流程#
4.1 基本连接与控制#
创建实例 → 配置通信 → 打开连接 → 发送命令 → 关闭连接 → 销毁实例
4.2 文件执行流程#
创建实例 → 配置通信 → 打开连接
→ 加载G代码文件 → 获取范围/时间预估
→ 执行程序 → (暂停/恢复/倍率调整)
→ 程序结束 → 关闭连接 → 销毁实例
4.3 手动点动流程#
连接后 → 设置点动参数 → 按方向点动 → 释放/中止点动
5. 注意事项#
- 线程安全:所有 API 函数内部使用互斥锁保护,可从多线程调用
- 回调线程:回调函数在内部工作线程中触发,回调内不应执行耗时操作
- 字符串生命周期:
bfy_get_last_error 返回的指针在下次调用前失效
- 多实例:支持创建多个 BfyCore 实例,每个实例独立管理连接
- 资源释放:使用完毕后必须调用
bfy_destroy 释放资源
- 串口独占:同一串口同时只能被一个实例打开
- 协议兼容:部分功能(如 Jog)的行为取决于 BFY控制器固件版本
6. 错误处理#
大多数函数返回 0 表示成功,-1 表示失败。失败时可通过 bfy_get_last_error 获取详细错误信息。
int ret = bfy_open(handle);
if (ret != 0) {
const char* err = bfy_get_last_error(handle);
printf("连接失败: %s\n", err);
}
8. 版本更新记录#
| 版本 |
日期 |
说明 |
| 1.0.5 |
2026-06-07 |
新增:六轴关节角度获取(bfy_get_joint_angles)、绝对位置点动(bfy_jog_to,支持A/B/C轴)、自动上报配置(bfy_set_auto_report)、IO控制(bfy_set_output/bfy_query_pin_states/bfy_query_limit_states)、NGC宏程序完整解析器(11个API)、YMODEM文件上传(bfy_ymodem_upload)、程序结束通知(bfy_notify_program_ended)。修正:BfyMacStatus枚举(增加STOPPED=7,ALARM=8,TOOL=14)、BfyJogDirection增加A/B/C轴方向、bfy_pause参数简化(移除cooling)、bfy_safety_door重命名为bfy_safe_pause、BfyVersionInfo结构体简化为单一version_info字段;新增BfyStreamingMode、BfyIoPinState类型及多个回调类型。 |
| 1.0.0 |
2025-06-16 |
初始版本:通信、文件处理、Jog控制、倍率控制、配置管理 |