Skip to content

十二、激光切割工艺(nrc_craft_laser_cutting.h)

激光切割工艺接口提供切割全局参数、切割工艺参数、模拟量匹配参数和 IO 参数等配置与查询功能。支持单机器人和多机器人(_robot 后缀)两种调用方式。

数据结构

LaserCuttingGlobalParam —— 切割全局参数

cpp
struct LaserCuttingGlobalParam {
    LaserCuttingEquipment equipment;  // 设备参数
};

LaserCuttingEquipment 子结构体:

字段类型默认值说明
RetreatDistancedouble0.0回退距离(mm)
arrivalOutLightModeint0到位出光模式
collisionDistancedouble10.0碰撞检测距离(mm)
delAspiratedModeint1延时吸气模式
delAspiratedTimedouble0.0延时吸气时间(S)
focusCompensationboolfalse焦点补偿使能
focusCompensationConstantdouble0.0焦点补偿常数
focusCompensationPowerdouble0.0焦点补偿功率
focusCompensationTimedouble0.0焦点补偿时间(S)
focusFormulaint0焦点计算公式
followint0随动模式
preAspiratedTimedouble0.0预吸气时间(S)
rePerforateint1重穿孔模式
waitFollowTimedouble1.0等待随动时间(S)
waitLiftUpTimedouble1.0等待抬起时间(S)

LaserCuttingCraftParam —— 切割工艺参数

cpp
struct LaserCuttingCraftParam {
    int num;                    // 工艺号
    LaserCuttingParam cut;      // 切割参数
};

LaserCuttingParam 子结构体:

字段类型默认值说明
dutyRatioint0占空比(%)
focusPositiondouble0.0焦点位置(mm)
followHeightdouble0.10随动高度(mm)
freqint1频率(Hz)
powerint1激光功率(%)
pressuredouble0.0气压(bar)
notestring""备注信息

LaserCuttingAnalogParam —— 模拟量匹配参数

cpp
struct LaserCuttingAnalogParam {
    LaserCuttingAnalogMatch analogMatch;  // 模拟量匹配曲线
};

LaserCuttingAnalogMatch 子结构体:

字段类型说明
laserPowerCurve激光功率匹配曲线(含level和x/y向量)
pressureCurve气压匹配曲线(含level和x/y向量)

Curve 结构体:

字段类型说明
levelint曲线等级/层数
xvector<double>X轴数据(输入值)
yvector<double>Y轴数据(输出值)

LaserCuttingIOParam —— IO 参数配置

cpp
struct LaserCuttingIOParam {
    IO io;                        // IO端口配置
    Fault laser_fault;            // 激光器故障输入端口
    Fault pressure_fault;         // 气压故障输入端口
    Fault regulator_fault;        // 调压器故障输入端口
    Fault water_cooler_fault;     // 水冷机故障输入端口
};

IO 子结构体:

字段类型默认值说明
AO_laserPowerint-激光功率模拟量输出端口
AO_pressureint-气压模拟量输出端口
DI_backMiddleArrivalint-回中到位数字量输入端口
DI_capacitance_int-电容传感器数字量输入端口
DI_followArrivalint-随动到位数字量输入端口
DI_liftUpArrivalint-抬起到位数字量输入端口
DI_perforateArrivalint-穿孔到位数字量输入端口
DO_aspirationint-吸气数字量输出端口
DO_backMiddleint-回中数字量输出端口
DO_capacitance_int-电容传感器数字量输出端口
DO_followint-随动数字量输出端口
DO_highPressgasint-高压气数字量输出端口
DO_liftUpint-抬起数字量输出端口
DO_lightGateint-光闸数字量输出端口
DO_lowPressgasint-低压气数字量输出端口
DO_redLightint-红光数字量输出端口
pwm_port_int-PWM输出端口

Fault 结构体:

字段类型说明
input_portint故障信号输入端口号

12.1 全局参数

laser_cutting_set_global_parameter / laser_cutting_set_global_parameter_robot

设置激光切割的全局参数,包括回退距离、碰撞检测、随动模式、穿孔模式等设备级配置。

函数签名:

cpp
Result laser_cutting_set_global_parameter(SOCKETFD socketFd, LaserCuttingGlobalParam param);
Result laser_cutting_set_global_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingGlobalParam param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingGlobalParam输入切割全局参数

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

使用示例:

cpp
// 配置激光切割全局参数
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

查询激光切割当前的全局参数配置。

函数签名:

cpp
Result laser_cutting_get_global_parameter(SOCKETFD socketFd, LaserCuttingGlobalParam& param);
Result laser_cutting_get_global_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingGlobalParam& param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingGlobalParam&输出接收全局参数

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

使用示例:

cpp
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

设置激光切割的工艺参数,包括指定工艺号的功率、频率、占空比、焦点位置、随动高度和气压等。

函数签名:

cpp
Result laser_cutting_set_craft_parameter(SOCKETFD socketFd, LaserCuttingCraftParam param);
Result laser_cutting_set_craft_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingCraftParam param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingCraftParam输入切割工艺参数,含工艺号和切割参数

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

使用示例:

cpp
// 配置工艺号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

查询激光切割的工艺参数。

函数签名:

cpp
Result laser_cutting_get_craft_parameter(SOCKETFD socketFd, LaserCuttingCraftParam& param);
Result laser_cutting_get_craft_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingCraftParam& param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingCraftParam&输出接收工艺参数(需先设置 param.num 指定要查询的工艺号)

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

使用示例:

cpp
// 查询工艺号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

设置激光切割的模拟量匹配曲线参数,用于将激光功率百分比和气压值映射到实际的模拟量输出电压。

函数签名:

cpp
Result laser_cutting_set_analog_parameter(SOCKETFD socketFd, LaserCuttingAnalogParam param);
Result laser_cutting_set_analog_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingAnalogParam param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingAnalogParam输入模拟量匹配参数

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

注意事项: 模拟量匹配曲线用于校准不同激光器和比例阀的电压-输出特性。通常由设备供应商提供匹配曲线数据,需根据实际硬件特性进行配置。

使用示例:

cpp
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

查询激光切割当前的模拟量匹配曲线参数。

函数签名:

cpp
Result laser_cutting_get_analog_parameter(SOCKETFD socketFd, LaserCuttingAnalogParam& param);
Result laser_cutting_get_analog_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingAnalogParam& param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingAnalogParam&输出接收模拟量匹配参数

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

使用示例:

cpp
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 端口配置,包括模拟量输出、数字量输入输出以及各类故障检测端口。

函数签名:

cpp
Result laser_cutting_set_io_parameter(SOCKETFD socketFd, LaserCuttingIOParam param);
Result laser_cutting_set_io_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingIOParam param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingIOParam输入IO参数配置(含IO端口和故障检测端口)

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

注意事项: IO 端口配置需与实际的硬件接线一致。错误的端口配置会导致激光器无法正常控制或故障检测失效。

使用示例:

cpp
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 端口配置。

函数签名:

cpp
Result laser_cutting_get_io_parameter(SOCKETFD socketFd, LaserCuttingIOParam& param);
Result laser_cutting_get_io_parameter_robot(SOCKETFD socketFd, int robotNum, LaserCuttingIOParam& param);

参数说明:

参数类型输入/输出说明
socketFdSOCKETFD输入连接句柄
robotNumint输入机器人编号(仅 _robot 版本)
paramLaserCuttingIOParam&输出接收IO参数配置

返回值: Result 枚举,0 表示成功,-1 表示等待消息失败,-2 表示找不到指定的客户端。

使用示例:

cpp
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 完整激光切割配置流程示例

cpp
#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;
}