这个里面带中文注释的都是加工时间的代码吗
Jebens 发表于 2026-6-2 20: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 " "9total_cycle_sec# 总加工时间(秒)累加——格式9: 1位小数,绝对值
fmt " "9op_cycle_sec # 单工序加工时间(秒)——格式9
fmt " "9total_cyc_min # 总加工时间(分钟)——格式9
fmt " "9grp_total_sec # 工具路径组总时间(秒)——格式9
fmt " "9mv_time # 手动计算加工时间(分钟)——格式9
fmt " "2total_sec # 总加工时间(秒)——格式2: 2位小数,绝对值
fmt " "4time_hr # 加工时间-小时(格式4: 整数,无小数)
fmt " "4time_min # 加工时间-分钟——格式4
fmt " "4time_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$, , sgplane, `sgcode, sgabsinc, pccdia,
pxout, pyout, pzout, pcout, , 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, , 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 坐标记录
]
Jebens 发表于 2026-6-2 20:15
这个里面带中文注释的都是加工时间的代码吗
# 九、钻孔时间补偿(pdrltime)—— 单孔时间计算(来自文件第 1776~1806 行)
# 钻孔循环 G81~G89 的 XY 移动不经过 prapidout/plinout,需单独补偿:
# 步骤 0:孔间 XY 快速移动(G00)
# 步骤 1:从初始面到 R 平面的 Z 轴快速下行
# 步骤 2:切削进给(R 平面到孔底)
# 步骤 3:快速退刀(G98 返初始面 / G99 返 R 平面)
# 步骤 4:G83 啄钻额外往返时间(内部快进+退刀)
# ==============================================================================
#region 钻孔时间补偿(单孔)
pdrltime # 计算单个孔的加工时间(往返 + 啄钻)
drill_d = 0
if depth$ < refht$, drill_d = refht$ - depth$# 孔深 = R平面高度 - 孔底高度
if drill_d <= 0, drill_d = 0.1# 安全兜底:防止深度为0导致除零
# 步骤 0:孔间 XY 快速移动(钻孔循环内部 G00,不经过 prapidout)
if t$ > 0,
[
# XY 距离 / 快速速度(15000 mm/min)= 移动时间
mv_time = mv_time + (sqrt((xabs - last_xa)^2 + (yabs - last_ya)^2) / 15000)
last_xa = xabs # 更新 X 坐标
last_ya = yabs # 更新 Y 坐标
]
# 步骤 1:从初始面(initht$)到 R 平面(refht$)的快速下行(Z 轴 G00)
mv_time = mv_time + (initht$ - refht$) / 15000
# 步骤 2:切削进给下行(R 平面到孔底)
if feed > 0, mv_time = mv_time + drill_d / feed # 正常情况:孔深 / 进给率
else, mv_time = mv_time + drill_d / 10 # 兜底:进给率未知时按 10 mm/min 估算
# 步骤 3:快速退刀
# G98(返回初始面):退刀距离 = 初始面高度 - 孔底高度
# G99(返回 R 平面):退刀距离 = 孔深
if drillref = 0, mv_time = mv_time + (initht$ - depth$) / 15000# G98 返初始面
else, mv_time = mv_time + drill_d / 15000 # G99 返 R 平面
# 步骤 4:G83 深孔啄钻额外时间
# 每次啄入 peck1$,合计 n 刀,每刀退到 R 平面再快进
# 时间 = peck1$ × n × (n+1) / 2 / 15000(等差求和)
# 减去步骤 3 已计算的最终退刀时间(避免重复累加)
if drillcyc$ = 1 & peck1$ > 0 & drill_d > peck1$,
[
pck_num = int(drill_d / peck1$) + 1 # 啄钻次数
mv_time = mv_time + peck1$ * pck_num * (pck_num + 1) / 15000 - drill_d / 15000
]
# 更新 Z 坐标跟踪(钻孔后刀具停在 R 平面)
last_za = refht$
# 调试输出(需要时去掉 # 号取消注释):
# sopen_prn, "DBG: init=", *initht$, " ref=", *refht$, " dep=", *depth$,
# " d=", *drill_d, " F=", *feed, " Q=", *peck1$, " cyc=", *drillcyc$, sclose_prn, e$
#endregion
# 十、钻孔循环调用(来自文件第 1855~1995 行,只保留与时间有关的部分)
# 每个钻孔循环结束后,统一调用 pdrltime 补偿时间
pdrill$ # G81 标准钻孔循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间(快速移动 + 切削 + 退刀)
ppeck$ # G83 啄钻循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间(含啄钻内部往返)
pchpbrk$ # G73 断屑钻循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间(含断屑往返)
ptap$ # G84 攻丝循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间
pbore1$ # G85 镗孔循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间
pbore2$ # G86 镗孔 2 循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间
pmisc1$ # G76 精镗循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间
pmisc2$ # G84.2 刚性攻丝循环(首孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间
pdrill_2$ # 标准钻孔循环(后续孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间(后续孔)
pmisc2_2$ # 刚性攻丝循环(后续孔)
# ... NC 输出代码省略 ...
pcom_movea
pdrltime# 补偿时间(后续孔刚性攻丝)
# 说明:ppeck_2$、pchpbrk_2$、ptap_2$、pbore1_2$、pbore2_2$、pmisc1_2$
# 内部直接调用 pdrill_2$,pdrltime 在 pdrill_2$ 中被统一调用
# ==============================================================================
# 十一、加工时间汇总输出(pcycletime)(来自文件第 1311~1319 行)
# 在程序结尾输出总加工时间,格式:X 时 X 分 X 秒
#region 加工时间输出
pcycletime # 计算并输出总加工时间(分隔线 + 时:分:秒)
# 将 mv_time(分钟)转换为总秒数
total_sec = mv_time * 60
# 拆分为时、分、秒
time_hr= int(total_sec / 3600) # 小时数(整数部分)
time_min = int((total_sec - time_hr * 3600) / 60) # 分钟数(去掉整小时后的整分钟)
time_sec = total_sec - time_hr * 3600 - time_min * 60 # 剩余秒数
# 输出到 NC 文件注释
sopen_prn, "-------------- 加工时间 --------------", sclose_prn, e$
sopen_prn, *time_hr, " 时 ", *time_min, " 分 ", *time_sec, " 秒", sclose_prn, e$
#endregion
# 十二、程序结尾(peof$)—— 触发时间输出(来自文件第 1325~1328 行)
# mv_time > 0 时才输出加工时间,避免空程序输出无意义的"0时0分0秒"
peof$ # 程序结尾(有刀号)
pretract # 执行退刀
if mv_time > 0, pcycletime# 若有有效累计时间,输出加工时间注释
xx249509690 发表于 2026-6-4 10:48
# 九、钻孔时间补偿(pdrltime)—— 单孔时间计算(来自文件第 1776~1806 行)
# 钻孔循环 G81~G89...
哥,量有点大 ,转换成笔记本呗{:3_49:}
感谢分享
回转中心编程,这个Z后面跟着角度,可以在这之间加一个Z轴回零吗
Jebens 发表于 2026-6-8 16:12
回转中心编程,这个Z后面跟着角度,可以在这之间加一个Z轴回零吗
四轴钻孔吗? 旋转角度时Z轴回零?
xx249509690 发表于 2026-6-9 09:22
四轴钻孔吗? 旋转角度时Z轴回零?
对的,现在改好了 ,定州还是联动都回Z零。但是这样改的话是不是做不了真联动
Jebens 发表于 2026-6-9 10:00
对的,现在改好了 ,定州还是联动都回Z零。但是这样改的话是不是做不了真联动 ...
钻孔不需要联动 设定成钻孔时含A轴旋转时回零 就行 不影响联动铣削的
感谢分享