十二、激光切割工艺(nrc_craft_laser_cutting.h)
激光切割工艺接口提供切割全局参数、切割工艺参数、模拟量匹配参数和 IO 参数等配置与查询功能。支持单机器人和多机器人(_robot 后缀)两种调用方式。
数据结构
LaserCuttingGlobalParam —— 切割全局参数
struct LaserCuttingGlobalParam {
LaserCuttingEquipment equipment; // 设备参数
};LaserCuttingEquipment 子结构体:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| RetreatDistance | double | 0.0 | 回退距离(mm) |
| arrivalOutLightMode | int | 0 | 到位出光模式 |
| collisionDistance | double | 10.0 | 碰撞检测距离(mm) |
| delAspiratedMode | int | 1 | 延时吸气模式 |
| delAspiratedTime | double | 0.0 | 延时吸气时间(S) |
| focusCompensation | bool | false | 焦点补偿使能 |
| focusCompensationConstant | double | 0.0 | 焦点补偿常数 |
| focusCompensationPower | double | 0.0 | 焦点补偿功率 |
| focusCompensationTime | double | 0.0 | 焦点补偿时间(S) |
| focusFormula | int | 0 | 焦点计算公式 |
| follow | int | 0 | 随动模式 |
| preAspiratedTime | double | 0.0 | 预吸气时间(S) |
| rePerforate | int | 1 | 重穿孔模式 |
| waitFollowTime | double | 1.0 | 等待随动时间(S) |
| waitLiftUpTime | double | 1.0 | 等待抬起时间(S) |
LaserCuttingCraftParam —— 切割工艺参数
struct LaserCuttingCraftParam {
int num; // 工艺号
LaserCuttingParam cut; // 切割参数
};LaserCuttingParam 子结构体:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| dutyRatio | int | 0 | 占空比(%) |
| focusPosition | double | 0.0 | 焦点位置(mm) |
| followHeight | double | 0.10 | 随动高度(mm) |
| freq | int | 1 | 频率(Hz) |
| power | int | 1 | 激光功率(%) |
| pressure | double | 0.0 | 气压(bar) |
| note | string | "" | 备注信息 |
LaserCuttingAnalogParam —— 模拟量匹配参数
struct LaserCuttingAnalogParam {
LaserCuttingAnalogMatch analogMatch; // 模拟量匹配曲线
};LaserCuttingAnalogMatch 子结构体:
| 字段 | 类型 | 说明 |
|---|---|---|
| laserPower | Curve | 激光功率匹配曲线(含level和x/y向量) |
| pressure | Curve | 气压匹配曲线(含level和x/y向量) |
Curve 结构体:
| 字段 | 类型 | 说明 |
|---|---|---|
| level | int | 曲线等级/层数 |
| x | vector<double> | X轴数据(输入值) |
| y | vector<double> | Y轴数据(输出值) |
LaserCuttingIOParam —— IO 参数配置
struct LaserCuttingIOParam {
IO io; // IO端口配置
Fault laser_fault; // 激光器故障输入端口
Fault pressure_fault; // 气压故障输入端口
Fault regulator_fault; // 调压器故障输入端口
Fault water_cooler_fault; // 水冷机故障输入端口
};IO 子结构体:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| AO_laserPower | int | - | 激光功率模拟量输出端口 |
| AO_pressure | int | - | 气压模拟量输出端口 |
| DI_backMiddleArrival | int | - | 回中到位数字量输入端口 |
| DI_capacitance_ | int | - | 电容传感器数字量输入端口 |
| DI_followArrival | int | - | 随动到位数字量输入端口 |
| DI_liftUpArrival | int | - | 抬起到位数字量输入端口 |
| DI_perforateArrival | int | - | 穿孔到位数字量输入端口 |
| DO_aspiration | int | - | 吸气数字量输出端口 |
| DO_backMiddle | int | - | 回中数字量输出端口 |
| DO_capacitance_ | int | - | 电容传感器数字量输出端口 |
| DO_follow | int | - | 随动数字量输出端口 |
| DO_highPressgas | int | - | 高压气数字量输出端口 |
| DO_liftUp | int | - | 抬起数字量输出端口 |
| DO_lightGate | int | - | 光闸数字量输出端口 |
| DO_lowPressgas | int | - | 低压气数字量输出端口 |
| DO_redLight | int | - | 红光数字量输出端口 |
| pwm_port_ | int | - | PWM输出端口 |
Fault 结构体:
| 字段 | 类型 | 说明 |
|---|---|---|
| input_port | int | 故障信号输入端口号 |
12.1 全局参数
laser_cutting_set_global_parameter / laser_cutting_set_global_parameter_robot
设置激光切割的全局参数,包括回退距离、碰撞检测、随动模式、穿孔模式等设备级配置。
函数签名:
Result laser_cutting_set_global_parameter(SOCKETFD socketFd, LaserCuttingGlobalParam param);
Result laser_cutting_set_global_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingGlobalParam param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingGlobalParam | 输入 | 切割全局参数 |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
使用示例:
// 配置激光切割全局参数
LaserCuttingGlobalParam globalParam;
globalParam.equipment.RetreatDistance = 5.0; // 回退距离 5mm
globalParam.equipment.collisionDistance = 10.0; // 碰撞检测距离 10mm
globalParam.equipment.follow = 1; // 随动模式 1
globalParam.equipment.rePerforate = 1; // 重穿孔模式
globalParam.equipment.waitFollowTime = 1.0; // 等待随动 1秒
globalParam.equipment.waitLiftUpTime = 1.0; // 等待抬起 1秒
globalParam.equipment.focusCompensation = true; // 使能焦点补偿
globalParam.equipment.focusCompensationConstant = 0.5;
globalParam.equipment.focusCompensationPower = 80.0;
globalParam.equipment.focusCompensationTime = 0.3;
globalParam.equipment.delAspiratedMode = 1; // 延时吸气模式
globalParam.equipment.delAspiratedTime = 0.5; // 延时吸气 0.5秒
globalParam.equipment.preAspiratedTime = 1.0; // 预吸气 1秒
Result result = laser_cutting_set_global_parameter(fd, globalParam);
if (result == 0) {
printf("激光切割全局参数设置成功\n");
}laser_cutting_get_global_parameter / laser_cutting_get_global_parameter_robot
查询激光切割当前的全局参数配置。
函数签名:
Result laser_cutting_get_global_parameter(SOCKETFD socketFd, LaserCuttingGlobalParam& param);
Result laser_cutting_get_global_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingGlobalParam& param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingGlobalParam& | 输出 | 接收全局参数 |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
使用示例:
LaserCuttingGlobalParam globalParam;
Result result = laser_cutting_get_global_parameter(fd, globalParam);
if (result == 0) {
printf("激光切割全局参数:\n");
printf(" 回退距离: %.2f mm\n", globalParam.equipment.RetreatDistance);
printf(" 碰撞检测距离: %.2f mm\n", globalParam.equipment.collisionDistance);
printf(" 随动模式: %d\n", globalParam.equipment.follow);
printf(" 焦点补偿: %s\n", globalParam.equipment.focusCompensation ? "使能" : "未使能");
printf(" 预吸气时间: %.2f S\n", globalParam.equipment.preAspiratedTime);
}12.2 工艺参数
laser_cutting_set_craft_parameter / laser_cutting_set_craft_parameter_robot
设置激光切割的工艺参数,包括指定工艺号的功率、频率、占空比、焦点位置、随动高度和气压等。
函数签名:
Result laser_cutting_set_craft_parameter(SOCKETFD socketFd, LaserCuttingCraftParam param);
Result laser_cutting_set_craft_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingCraftParam param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingCraftParam | 输入 | 切割工艺参数,含工艺号和切割参数 |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
使用示例:
// 配置工艺号1的切割参数
LaserCuttingCraftParam craftParam;
craftParam.num = 1; // 工艺号1
craftParam.cut.power = 80; // 激光功率 80%
craftParam.cut.freq = 5000; // 频率 5000Hz
craftParam.cut.dutyRatio = 100; // 占空比 100%
craftParam.cut.focusPosition = -0.5; // 焦点位置 -0.5mm(板面下方)
craftParam.cut.followHeight = 1.0; // 随动高度 1.0mm
craftParam.cut.pressure = 8.0; // 气压 8.0bar
craftParam.cut.note = "3mm碳钢板切割"; // 备注
Result result = laser_cutting_set_craft_parameter(fd, craftParam);
if (result == 0) {
printf("工艺号%d切割参数设置成功\n", craftParam.num);
}laser_cutting_get_craft_parameter / laser_cutting_get_craft_parameter_robot
查询激光切割的工艺参数。
函数签名:
Result laser_cutting_get_craft_parameter(SOCKETFD socketFd, LaserCuttingCraftParam& param);
Result laser_cutting_get_craft_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingCraftParam& param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingCraftParam& | 输出 | 接收工艺参数(需先设置 param.num 指定要查询的工艺号) |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
使用示例:
// 查询工艺号1的切割参数
LaserCuttingCraftParam craftParam;
craftParam.num = 1; // 需先指定要查询的工艺号
Result result = laser_cutting_get_craft_parameter(fd, craftParam);
if (result == 0) {
printf("工艺号%d切割参数:\n", craftParam.num);
printf(" 功率: %d%%\n", craftParam.cut.power);
printf(" 频率: %d Hz\n", craftParam.cut.freq);
printf(" 占空比: %d%%\n", craftParam.cut.dutyRatio);
printf(" 焦点位置: %.2f mm\n", craftParam.cut.focusPosition);
printf(" 随动高度: %.2f mm\n", craftParam.cut.followHeight);
printf(" 气压: %.2f bar\n", craftParam.cut.pressure);
if (!craftParam.cut.note.empty()) {
printf(" 备注: %s\n", craftParam.cut.note.c_str());
}
}12.3 模拟量匹配参数
laser_cutting_set_analog_parameter / laser_cutting_set_analog_parameter_robot
设置激光切割的模拟量匹配曲线参数,用于将激光功率百分比和气压值映射到实际的模拟量输出电压。
函数签名:
Result laser_cutting_set_analog_parameter(SOCKETFD socketFd, LaserCuttingAnalogParam param);
Result laser_cutting_set_analog_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingAnalogParam param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingAnalogParam | 输入 | 模拟量匹配参数 |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
注意事项: 模拟量匹配曲线用于校准不同激光器和比例阀的电压-输出特性。通常由设备供应商提供匹配曲线数据,需根据实际硬件特性进行配置。
使用示例:
LaserCuttingAnalogParam analogParam;
// 配置激光功率匹配曲线(示例:线性映射 0-100% -> 0-10V)
analogParam.analogMatch.laserPower.level = 2; // 2点线性
analogParam.analogMatch.laserPower.x = {0.0, 100.0}; // 输入:功率百分比
analogParam.analogMatch.laserPower.y = {0.0, 10.0}; // 输出:电压值(V)
// 配置气压匹配曲线(示例:线性映射 0-16bar -> 0-10V)
analogParam.analogMatch.pressure.level = 2;
analogParam.analogMatch.pressure.x = {0.0, 16.0}; // 输入:气压值(bar)
analogParam.analogMatch.pressure.y = {0.0, 10.0}; // 输出:电压值(V)
Result result = laser_cutting_set_analog_parameter(fd, analogParam);
if (result == 0) {
printf("模拟量匹配参数设置成功\n");
}laser_cutting_get_analog_parameter / laser_cutting_get_analog_parameter_robot
查询激光切割当前的模拟量匹配曲线参数。
函数签名:
Result laser_cutting_get_analog_parameter(SOCKETFD socketFd, LaserCuttingAnalogParam& param);
Result laser_cutting_get_analog_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingAnalogParam& param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingAnalogParam& | 输出 | 接收模拟量匹配参数 |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
使用示例:
LaserCuttingAnalogParam analogParam;
Result result = laser_cutting_get_analog_parameter(fd, analogParam);
if (result == 0) {
printf("激光功率匹配曲线点数: %d\n", analogParam.analogMatch.laserPower.level);
printf("气压匹配曲线点数: %d\n", analogParam.analogMatch.pressure.level);
}12.4 IO 参数
laser_cutting_set_io_parameter / laser_cutting_set_io_parameter_robot
设置激光切割的 IO 端口配置,包括模拟量输出、数字量输入输出以及各类故障检测端口。
函数签名:
Result laser_cutting_set_io_parameter(SOCKETFD socketFd, LaserCuttingIOParam param);
Result laser_cutting_set_io_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingIOParam param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingIOParam | 输入 | IO参数配置(含IO端口和故障检测端口) |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
注意事项: IO 端口配置需与实际的硬件接线一致。错误的端口配置会导致激光器无法正常控制或故障检测失效。
使用示例:
LaserCuttingIOParam ioParam;
// 配置IO端口
ioParam.io.AO_laserPower = 1; // 激光功率模拟量输出端口1
ioParam.io.AO_pressure = 2; // 气压模拟量输出端口2
ioParam.io.DO_lightGate = 3; // 光闸输出端口3
ioParam.io.DO_redLight = 4; // 红光输出端口4
ioParam.io.DO_highPressgas = 5; // 高压气输出端口5
ioParam.io.DO_lowPressgas = 6; // 低压气输出端口6
ioParam.io.DO_aspiration = 7; // 吸气输出端口7
ioParam.io.DO_follow = 8; // 随动输出端口8
ioParam.io.DO_liftUp = 9; // 抬起输出端口9
ioParam.io.DO_backMiddle = 10; // 回中输出端口10
ioParam.io.DI_perforateArrival = 11; // 穿孔到位输入端口11
ioParam.io.DI_followArrival = 12; // 随动到位输入端口12
ioParam.io.DI_liftUpArrival = 13; // 抬起到位输入端口13
ioParam.io.DI_backMiddleArrival = 14;// 回中到位输入端口14
ioParam.io.pwm_port_ = 15; // PWM输出端口15
// 配置故障检测端口
ioParam.laser_fault.input_port = 20; // 激光器故障输入端口20
ioParam.pressure_fault.input_port = 21; // 气压故障输入端口21
ioParam.regulator_fault.input_port = 22; // 调压器故障输入端口22
ioParam.water_cooler_fault.input_port = 23;// 水冷机故障输入端口23
Result result = laser_cutting_set_io_parameter(fd, ioParam);
if (result == 0) {
printf("激光切割IO参数设置成功\n");
}laser_cutting_get_io_parameter / laser_cutting_get_io_parameter_robot
查询激光切割当前的 IO 端口配置。
函数签名:
Result laser_cutting_get_io_parameter(SOCKETFD socketFd, LaserCuttingIOParam& param);
Result laser_cutting_get_io_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingIOParam& param);参数说明:
| 参数 | 类型 | 输入/输出 | 说明 |
|---|---|---|---|
| socketFd | SOCKETFD | 输入 | 连接句柄 |
| robotNum | int | 输入 | 机器人编号(仅 _robot 版本) |
| param | LaserCuttingIOParam& | 输出 | 接收IO参数配置 |
返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。
使用示例:
LaserCuttingIOParam ioParam;
Result result = laser_cutting_get_io_parameter(fd, ioParam);
if (result == 0) {
printf("激光切割IO配置:\n");
printf(" 激光功率AO: 端口%d\n", ioParam.io.AO_laserPower);
printf(" 气压AO: 端口%d\n", ioParam.io.AO_pressure);
printf(" 光闸DO: 端口%d\n", ioParam.io.DO_lightGate);
printf(" 高压气DO: 端口%d\n", ioParam.io.DO_highPressgas);
printf(" 激光器故障DI: 端口%d\n", ioParam.laser_fault.input_port);
printf(" 水冷机故障DI: 端口%d\n", ioParam.water_cooler_fault.input_port);
}12.5 完整激光切割配置流程示例
#include "nrc_craft_laser_cutting.h"
#include "nrc_interface.h"
#include <stdio.h>
int main() {
SOCKETFD fd = connect_robot("192.168.1.15", "6001");
if (fd <= 0) {
printf("连接失败\n");
return -1;
}
// 1. 配置全局参数
LaserCuttingGlobalParam globalParam;
globalParam.equipment.RetreatDistance = 5.0;
globalParam.equipment.collisionDistance = 10.0;
globalParam.equipment.follow = 1;
globalParam.equipment.waitFollowTime = 1.0;
globalParam.equipment.focusCompensation = true;
globalParam.equipment.focusCompensationConstant = 0.5;
globalParam.equipment.focusCompensationPower = 80.0;
globalParam.equipment.preAspiratedTime = 1.0;
globalParam.equipment.delAspiratedTime = 0.5;
Result ret = laser_cutting_set_global_parameter(fd, globalParam);
if (ret != 0) {
printf("全局参数设置失败\n");
return -1;
}
printf("全局参数配置完成\n");
// 2. 配置工艺号1的切割参数(3mm碳钢板)
LaserCuttingCraftParam craftParam;
craftParam.num = 1;
craftParam.cut.power = 80;
craftParam.cut.freq = 5000;
craftParam.cut.dutyRatio = 100;
craftParam.cut.focusPosition = -0.5;
craftParam.cut.followHeight = 1.0;
craftParam.cut.pressure = 8.0;
craftParam.cut.note = "3mm碳钢板";
ret = laser_cutting_set_craft_parameter(fd, craftParam);
if (ret != 0) {
printf("工艺参数设置失败\n");
return -1;
}
printf("工艺参数配置完成\n");
// 3. 配置模拟量匹配参数
LaserCuttingAnalogParam analogParam;
analogParam.analogMatch.laserPower.level = 2;
analogParam.analogMatch.laserPower.x = {0.0, 100.0};
analogParam.analogMatch.laserPower.y = {0.0, 10.0};
analogParam.analogMatch.pressure.level = 2;
analogParam.analogMatch.pressure.x = {0.0, 16.0};
analogParam.analogMatch.pressure.y = {0.0, 10.0};
laser_cutting_set_analog_parameter(fd, analogParam);
printf("模拟量匹配参数配置完成\n");
// 4. 配置IO参数
LaserCuttingIOParam ioParam;
ioParam.io.AO_laserPower = 1;
ioParam.io.AO_pressure = 2;
ioParam.io.DO_lightGate = 3;
ioParam.io.DO_redLight = 4;
ioParam.io.DO_highPressgas = 5;
ioParam.io.DO_aspiration = 7;
ioParam.io.DI_perforateArrival = 11;
ioParam.io.DI_followArrival = 12;
ioParam.laser_fault.input_port = 20;
ioParam.water_cooler_fault.input_port = 23;
ret = laser_cutting_set_io_parameter(fd, ioParam);
if (ret != 0) {
printf("IO参数设置失败\n");
return -1;
}
printf("IO参数配置完成\n");
// 5. 验证配置:读取所有参数
printf("\n========== 配置验证 ==========\n");
LaserCuttingGlobalParam readGlobal;
laser_cutting_get_global_parameter(fd, readGlobal);
printf("全局参数 - 回退距离: %.1fmm, 随动模式: %d\n",
readGlobal.equipment.RetreatDistance, readGlobal.equipment.follow);
LaserCuttingCraftParam readCraft;
readCraft.num = 1;
laser_cutting_get_craft_parameter(fd, readCraft);
printf("工艺参数 - 功率: %d%%, 频率: %dHz, 气压: %.1fbar\n",
readCraft.cut.power, readCraft.cut.freq, readCraft.cut.pressure);
printf("激光切割系统配置完成,准备开始切割作业\n");
return 0;
}