Jebens 发表于 2026-6-2 20:15:16

这个里面带中文注释的都是加工时间的代码吗

xx249509690 发表于 2026-6-4 10:48:15

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 坐标记录
      ]

xx249509690 发表于 2026-6-4 10:48:39

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# 若有有效累计时间,输出加工时间注释

Jebens 发表于 2026-6-5 11:06:19

xx249509690 发表于 2026-6-4 10:48
# 九、钻孔时间补偿(pdrltime)—— 单孔时间计算(来自文件第 1776~1806 行)
#   钻孔循环 G81~G89...

哥,量有点大 ,转换成笔记本呗{:3_49:}

a0966150160a 发表于 2026-6-6 07:35:31

感谢分享

Jebens 发表于 2026-6-8 16:12:38

回转中心编程,这个Z后面跟着角度,可以在这之间加一个Z轴回零吗

xx249509690 发表于 2026-6-9 09:22:17

Jebens 发表于 2026-6-8 16:12
回转中心编程,这个Z后面跟着角度,可以在这之间加一个Z轴回零吗

四轴钻孔吗? 旋转角度时Z轴回零?

Jebens 发表于 2026-6-9 10:00:51

xx249509690 发表于 2026-6-9 09:22
四轴钻孔吗? 旋转角度时Z轴回零?

对的,现在改好了 ,定州还是联动都回Z零。但是这样改的话是不是做不了真联动

xx249509690 发表于 2026-6-9 10:42:00

Jebens 发表于 2026-6-9 10:00
对的,现在改好了 ,定州还是联动都回Z零。但是这样改的话是不是做不了真联动 ...

钻孔不需要联动 设定成钻孔时含A轴旋转时回零 就行 不影响联动铣削的

末世丶 发表于 2026-6-15 03:32:59

感谢分享
页: 1 2 3 [4] 5
查看完整版本: MC2022通用后处理刚刚学的改动需要的拿去用