|
|
楼主 |
发表于 2026-6-4 10:48:15
|
显示全部楼层
# 一、变量声明区(来自文件第 411~435 行 + 906~914 行)
#----- 进给率计算相关(原有变量,加工时间模块复用)-----
frdelta : 0 # 计算 deg/min 的差值
frinv : 0 # 逆时进给率
frdeg : 0 # 实际 deg/min 进给率
prvfrdeg : 0 # 上一次的 deg/min 进给率
ldelta : 0 # deg/min 线性分量计算值
cldelta : 0 # deg/min 线性+旋转合成计算值
circum : 0 # deg/min 弧长计算值
ipr_type : 0 # 旋转轴进给类型:0=UPM, 1=DPM, 2=逆时进给
#----- 加工时间核心变量 -----
op_cycle_sec : 0 # 单工序加工时间(秒),从参数15240捕获(预留,当前未使用)
total_cycle_sec : 0 # 总加工时间累加(秒,预留)
total_cyc_min : 0 # 总加工时间(分钟,预留)
grp_total_sec : 0 # 工具路径组总时间(秒,预留)
mv_time : 0 # 【主累加器】手动计算的加工时间(单位:分钟),每段运动后累加
atc_time : 0.083 # 换刀固定补偿时间(分钟),默认0.083≈5秒,按实际机床填写
#----- 位置跟踪变量(用于计算每段移动的距离)-----
last_xa : 0 # 前一个 X 绝对坐标(mm)
last_ya : 0 # 前一个 Y 绝对坐标(mm)
last_za : 0 # 前一个 Z 绝对坐标(mm)
#----- 时间结果拆分变量 -----
total_sec : 0 # 总加工时间(秒,由 mv_time 转换而来)
time_hr : 0 # 加工时间 - 小时部分
time_min : 0 # 加工时间 - 分钟部分
time_sec : 0 # 加工时间 - 秒部分
#----- 当前进给率(时间计算用)-----
cur_feed : 0 # 当前进给率(mm/min),主要用于钻孔时间计算
#----- 钻孔时间计算辅助变量 -----
drill_d : 0 # 钻孔深度(绝对值,mm)
pck_num : 0 # 啄钻次数
# 二、格式定义(来自文件第 906~914 行)
# fmt 语句为各时间变量定义输出格式
fmt " " 9 total_cycle_sec # 总加工时间(秒)累加——格式9: 1位小数,绝对值
fmt " " 9 op_cycle_sec # 单工序加工时间(秒)——格式9
fmt " " 9 total_cyc_min # 总加工时间(分钟)——格式9
fmt " " 9 grp_total_sec # 工具路径组总时间(秒)——格式9
fmt " " 9 mv_time # 手动计算加工时间(分钟)——格式9
fmt " " 2 total_sec # 总加工时间(秒)——格式2: 2位小数,绝对值
fmt " " 4 time_hr # 加工时间-小时(格式4: 整数,无小数)
fmt " " 4 time_min # 加工时间-分钟——格式4
fmt " " 4 time_sec # 加工时间-秒——格式4
# 三、机床参数表(来自文件第 2924~2928 行)
# 预留通过参数表读取 Mastercam 报告的理论加工时间
# 工具路径组参数表(fprmtbl 19000)
fprmtbl 19000 2 # 表号 19000,共 2 个参数条目
# 参数码 写入变量
19201 grp_total_sec # 组总加工时间(秒)——从 Mastercam 参数 19201 读取
19202 grp_total_sec # 组总加工时间(秒)备选参数码
# 说明:上述 fprmtbl 需配合 pmachineinfo$ 中的 fprm(19000) 调用生效,
# 实际测试发现 Mastercam 不一定输出 19201/19202,故以 mv_time 手动计算为主
# 四、程序开始(psof$)—— 坐标跟踪初始化(来自文件第 1121~1127 行)
# 在程序第一把刀开始时,将位置跟踪变量归零
psof$ # 程序开始(首刀)
# ... 其他非时间代码省略 ...
last_xa = 0
last_ya = 0
last_za = 0 # 初始化坐标跟踪(加工时间计算用)
# 五、换刀(ptlchg$)—— 换刀时间累加 + 坐标重置(来自文件第 1215~1221 行)
# 每次换刀时:① 累加固定换刀时间;② 重置坐标跟踪(避免换刀后距离跨刀累加)
ptlchg$ # 换刀
# ... 其他非时间代码省略 ...
mv_time = mv_time + atc_time # 累加换刀固定时间(分钟,默认 atc_time = 0.083 约5秒)
last_xa = 0
last_ya = 0
last_za = 0 # 换刀时重置坐标跟踪,避免跨刀计算距离
# ... 后续代码 ...
# 六、快速移动(prapidout)—— G00 时间累加(来自文件第 1466~1478 行)
# 快速进给速度固定取 15000 mm/min(可根据机床实际修改)
# 使用三维欧氏距离公式计算移动距离,再除以速度得到时间
#
prapidout # 输出快速移动(G00)NC 代码
pcan1, pbld, n$, [if gcode$, `sgfeed], sgplane, `sgcode, sgabsinc, pccdia,
pxout, pyout, pzout, pcout, [if gcode$, `feed], strcantext, pscool, e$
if force_feed, result = force(feed) # 下一行强制输出进给率
if rpd_typ$ = 7, ptool_insp # 刀具检测点处理
# ------ 加工时间累加(G00 快速移动)------
if t$ > 0, # 确认当前有刀号(排除空运行)
[
# 三维欧氏距离 / 快速进给速度 = 移动时间(分钟)
# 快速速度假定为 15000 mm/min,如机床不同请修改此常数
mv_time = mv_time + (sqrt((xabs - last_xa)^2 + (yabs - last_ya)^2 + (zabs - last_za)^2) / 15000)
last_xa = xabs # 更新 X 坐标记录
last_ya = yabs # 更新 Y 坐标记录
last_za = zabs # 更新 Z 坐标记录
]
# 七、切削进给(plinout)—— G01 时间累加(来自文件第 1480~1491 行)
# 使用实际进给率 feed(mm/min),计算切削时间
plinout # 输出线性切削(G01)NC 代码
pcan1, pbld, n$, sgfeed, sgplane, `sgcode, sgabsinc, pccdia,
pxout, pyout, pzout, pcout, [if motst$, feed], strcantext, pscool, e$
if rpd_typ$ = 7, ptool_insp # 刀具检测点处理
# ------ 加工时间累加(G01 切削进给)------
if t$ > 0 & feed > 0, # 有刀号且进给率大于零
[
# 三维欧氏距离 / 实际进给率 = 切削时间(分钟)
mv_time = mv_time + (sqrt((xabs - last_xa)^2 + (yabs - last_ya)^2 + (zabs - last_za)^2) / feed)
last_xa = xabs # 更新 X 坐标记录
last_ya = yabs # 更新 Y 坐标记录
last_za = zabs # 更新 Z 坐标记录
]
# 八、圆弧插补(pcirout)—— G02/G03 时间累加(来自文件第 1493~1503 行)
# 圆弧长度以弦长近似(起终点直线距离),精度约 95% ~ 99%
# 如需精确,可改用弧长公式:arc_len = abs(sweep$) / 360 * 2 * 3.14159 * arcrad$
pcirout # 输出圆弧插补(G02/G03)NC 代码
pcan1, pbld, n$, `sgfeed, sgplane, sgcode, sgabsinc, pccdia,
pxout, pyout, pzout, pcout, parc, feed, strcantext, pscool, e$
# ------ 加工时间累加(G02/G03 圆弧,弦长近似)------
if t$ > 0 & feed > 0, # 有刀号且进给率大于零
[
# 弦长近似:起终点距离 / 进给率 = 圆弧时间(分钟)
# 注意:弦长 < 弧长,大圆弧时误差稍大(< 5%)
mv_time = mv_time + (sqrt((xabs - last_xa)^2 + (yabs - last_ya)^2 + (zabs - last_za)^2) / feed)
last_xa = xabs # 更新 X 坐标记录
last_ya = yabs # 更新 Y 坐标记录
last_za = zabs # 更新 Z 坐标记录
]
|
|