Files
cadSet/docs/build_cnc_client_rfi.py
T

320 lines
20 KiB
Python

from pathlib import Path
from docx import Document
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor
from build_cnc_first_integration_checklist import (
AMBER,
BLACK,
BLUE,
GRAY,
GREEN,
LIGHT_BLUE,
PALE_BLUE,
WHITE,
add_callout,
add_text,
keep_row_together,
set_cell_margins,
set_cell_shading,
set_repeat_table_header,
set_table_fixed_width,
)
OUT = Path("/Users/jerry/linkhand/CadSet/docs/CNC机床系统对接资料与技术支持需求函.docx")
def setup_document():
doc = Document()
section = doc.sections[0]
section.page_width = Inches(8.5)
section.page_height = Inches(11)
section.top_margin = Inches(0.7)
section.bottom_margin = Inches(0.7)
section.left_margin = Inches(0.72)
section.right_margin = Inches(0.72)
section.header_distance = Inches(0.3)
section.footer_distance = Inches(0.3)
normal = doc.styles["Normal"]
normal.font.name = "Arial"
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Arial")
normal.font.size = Pt(10.5)
normal.font.color.rgb = RGBColor.from_string(BLACK)
normal.paragraph_format.space_after = Pt(5)
normal.paragraph_format.line_spacing = 1.12
for name, size, before, after in (
("Heading 1", 16, 14, 7),
("Heading 2", 12.5, 10, 5),
("Heading 3", 11, 7, 3),
):
style = doc.styles[name]
style.font.name = "Arial"
style._element.rPr.rFonts.set(qn("w:eastAsia"), "Arial")
style.font.size = Pt(size)
style.font.bold = True
style.font.color.rgb = RGBColor.from_string(BLUE)
style.paragraph_format.space_before = Pt(before)
style.paragraph_format.space_after = Pt(after)
style.paragraph_format.keep_with_next = True
for name in ("List Bullet", "List Number"):
style = doc.styles[name]
style.font.name = "Arial"
style._element.rPr.rFonts.set(qn("w:eastAsia"), "Arial")
style.font.size = Pt(10.5)
hp = section.header.paragraphs[0]
hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
add_text(hp, "CNC 机床系统对接|资料与技术支持需求函", size=8.5, color=GRAY)
fp = section.footer.paragraphs[0]
fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
add_text(fp, "请按实际设备型号填写;不适用项目请标注“不适用”", size=8, color=GRAY)
return doc
def formal_matrix(doc, headers, widths, rows, first_col_fill=None, sizes=None):
table = doc.add_table(rows=1, cols=len(headers))
table.style = "Table Grid"
set_table_fixed_width(table, widths)
for idx, text in enumerate(headers):
cell = table.rows[0].cells[idx]
set_cell_shading(cell, BLUE)
set_cell_margins(cell)
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
p = cell.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
add_text(p, text, size=9.2, bold=True, color=WHITE)
set_repeat_table_header(table.rows[0])
for ridx, values in enumerate(rows):
row = table.add_row()
keep_row_together(row)
for idx, value in enumerate(values):
cell = row.cells[idx]
set_cell_margins(cell, top=100, bottom=100)
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
if idx == 0 and first_col_fill:
set_cell_shading(cell, first_col_fill)
p = cell.paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER if idx == 0 else WD_ALIGN_PARAGRAPH.LEFT
size = sizes[idx] if sizes else 9.2
add_text(p, value, size=size, bold=(idx == 0))
return table
def add_form_lines(doc, pairs):
table = doc.add_table(rows=0, cols=2)
table.style = "Table Grid"
set_table_fixed_width(table, [3.25, 3.25])
for left, right in pairs:
row = table.add_row()
keep_row_together(row)
for idx, value in enumerate((left, right)):
cell = row.cells[idx]
set_cell_margins(cell, top=120, bottom=120)
add_text(cell.paragraphs[0], value, size=9.5)
return table
def build():
doc = setup_document()
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(12)
p.paragraph_format.space_after = Pt(4)
add_text(p, "CNC 机床系统对接", size=23, bold=True, color=BLUE)
p = doc.add_paragraph()
p.paragraph_format.space_after = Pt(12)
add_text(p, "资料与技术支持需求函", size=20, bold=True, color=BLUE)
doc.add_heading("一、需求目的", level=1)
p = doc.add_paragraph()
add_text(
p,
"为开展数字零件模型至 CNC 加工程序生成、程序传输、试切验证及加工状态采集等工作,"
"现请贵方协助确认实际机床和 CNC 控制系统配置,并提供本函所列技术资料、接口信息、"
"验证样例及联合调试支持。",
)
p = doc.add_paragraph()
add_text(
p,
"本函中的通信产品和接口名称均为候选项,最终以实际机床型号、CNC 系统版本、已购选件、"
"机床制造商配置及贵方书面确认为准。",
color=GRAY,
)
add_callout(
doc,
"回复方式",
"请在对应表格中填写、勾选或标注“不支持/不适用/待确认”,并随回复附相关手册、"
"安装包、许可证说明、样例文件和技术联系人信息。",
PALE_BLUE,
)
doc.add_heading("二、建议参与对接的技术人员", level=1)
role_rows = [
("机床制造商/集成商", "机械配置、轴与主轴、刀库/夹具、专用 M 代码、PLC/联锁、机床安全和现场调试。", "姓名:________ 电话:________"),
("三菱 CNC/代理商", "CNC 型号与版本、已购选件、通信软件、SDK、许可证、标准接口和版本兼容。", "姓名:________ 电话:________"),
("现场工艺/设备人员", "现用 CAM、后处理器、刀具、材料、装夹、坐标、切削参数和已验证程序。", "姓名:________ 电话:________"),
("网络/信息化人员", "工业网络、IP/端口、账号、证书、远程访问、日志和数据合规。", "姓名:________ 电话:________"),
]
formal_matrix(doc, ["参与角色", "确认范围", "联系人"], [1.45, 3.70, 1.35], role_rows, first_col_fill=LIGHT_BLUE)
doc.add_heading("三、设备与 CNC 基础信息", level=1)
equipment_rows = [
("机床身份", "制造商、完整型号、序列号、出厂年份、设备编号", "____________________________", "铭牌及整机照片"),
("CNC 控制系统", "三菱 CNC 系列、完整型号、系统软件版本", "____________________________", "系统信息页面照片"),
("已安装选件", "高速加工、五轴、刀尖点控制、宏程序、通信等选件", "____________________________", "选件清单/参数页面"),
("机床类型", "车床/铣床/加工中心/车铣复合/磨床/专机", "____________________________", "设备规格书"),
("轴配置", "轴名称、正方向、行程、零点、软限位、旋转轴结构", "____________________________", "轴配置图"),
("主轴配置", "数量、方向、最高转速、功率/扭矩、锥度", "____________________________", "主轴规格"),
("刀库/刀塔", "类型、容量、刀位规则、刀具尺寸重量限制", "____________________________", "刀库规格"),
("辅助装置", "探针、自动对刀、第四/第五轴、尾座、卡盘、托盘等", "____________________________", "配置说明"),
]
formal_matrix(
doc,
["项目", "请确认内容", "贵方填写", "建议附件"],
[1.15, 2.65, 1.55, 1.15],
equipment_rows,
first_col_fill=LIGHT_BLUE,
sizes=[9.0, 8.8, 8.8, 8.5],
)
doc.add_heading("四、请提供的技术资料", level=1)
material_rows = [
("P0", "CNC 与机床手册", "CNC 规格/编程/操作/连接设置手册;机床厂操作、维护及专用功能手册。", "□已附 □后补 □不适用"),
("P0", "代码和程序规则", "实际支持的 G/M/T/S/F 代码、自定义 M 代码、宏变量、固定循环、坐标系、刀补、换刀规则、程序格式限制。", "□已附 □后补 □不适用"),
("P0", "程序模板", "机床厂认可的程序开头、换刀段、工序切换、异常退出和结束模板。", "□已附 □后补 □不适用"),
("P0", "验证样例包", "至少 3~10 套已加工成功样例,每套对应 STEP/图纸、毛坯、材料、刀具、装夹、CAM、NC 和检测结果。", "数量:____套"),
("P0", "现用 CAM/后处理", "CAM 名称和版本、后处理器、后处理配置、程序头尾模板和典型仿真项目。", "□已附 □后补 □无"),
("P1", "刀具与刀柄", "真实刀具/刀柄清单、刀位号、刀补号、主要尺寸、寿命规则及 STEP/尺寸模型。", "□已附 □后补"),
("P1", "夹具与工作区", "工作台、卡盘、虎钳、软爪、尾座、旋转轴、探针和防护区域的模型或关键尺寸。", "□已附 □后补"),
("P1", "材料与工艺", "常用材料牌号、毛坯规格、余量、硬度/热处理、切削参数、冷却方式、公差和粗糙度。", "□已附 □后补"),
("P2", "数字机床", "机床三维模型、运动学、回转中心、碰撞体、软限位、CAM 机床仿真工程。", "□已附 □后补 □无"),
]
formal_matrix(doc, ["优先级", "资料名称", "交付内容", "回复"], [0.70, 1.45, 3.30, 1.05], material_rows, first_col_fill=GREEN)
doc.add_heading("五、程序传输与通信能力确认", level=1)
interface_rows = [
("加工程序传输", "NC Explorer", "□已安装 □可新增 □不支持 □待确认", "版本/许可证/手册/网络配置"),
("加工程序传输", "FTP、共享目录或机床厂文件服务", "□支持 □不支持 □待确认", "IP/端口/目录/账号/文件规则"),
("加工程序传输", "DNC/MDC/MES 平台", "□已有 □无 □待确认", "产品名称、版本、第三方接口"),
("加工程序传输", "RS-232C 或 USB", "□支持 □不支持", "传输设置与文件限制"),
("CNC 通信 SDK", "FCSB1224W000 开发包", "□已授权 □可采购 □不支持 □待确认", "SDK、手册、样例、兼容矩阵"),
("CNC 通信运行库", "FCSB1224W100", "□已授权 □可采购 □不支持 □待确认", "安装包、版本和部署许可"),
("只读数据采集", "MTConnect", "□已配置 □可新增 □不支持 □待确认", "适配器/Agent、数据项和端点"),
("只读数据采集", "OPC UA / NC Machine Tool Connector", "□已配置 □可新增 □不支持 □待确认", "服务器、节点表、证书、许可"),
("运行监控", "NC Monitor2 或现有监控平台", "□已有 □无 □待确认", "产品版本与开放接口"),
("PLC/设备访问", "SLMP 或机床厂专用接口", "□开放只读 □开放读写 □不开放 □待确认", "设备地址表、权限和联锁说明"),
("机床厂专用 API", "机床厂二次开发接口", "□有 □无 □待确认", "API 文档、SDK、样例和授权"),
]
formal_matrix(
doc,
["用途", "候选通道", "贵方确认", "请附资料"],
[1.15, 1.80, 1.95, 1.60],
interface_rows,
first_col_fill=LIGHT_BLUE,
sizes=[8.6, 8.6, 8.3, 8.3],
)
doc.add_heading("六、接口交付要求", level=1)
interface_delivery_rows = [
("兼容性", "适用 CNC 型号、系统版本、所需硬件/选件、安装状态、许可证数量和有效期。", "____________________________"),
("开发资料", "API/协议手册、数据字典、错误码、示例程序、SDK/运行库安装包及版本说明。", "____________________________"),
("连接参数", "协议、IP、端口、账号/证书、读写权限、超时、并发、频率和文件大小限制。", "____________________________"),
("可靠性", "断线检测、重连、续传、重复提交处理、任务 ID、校验、回执和错误处理机制。", "____________________________"),
("时间与单位", "时区、时间同步、时间戳精度、字段单位、缩放系数和枚举值说明。", "____________________________"),
("版本支持", "SDK/协议与 CNC 兼容矩阵、升级策略、补丁和技术支持期限。", "____________________________"),
("日志审计", "连接、文件传输、调用方、操作时间、结果、配置修改及远程访问日志。", "____________________________"),
]
formal_matrix(doc, ["项目", "交付要求", "贵方回复/附件"], [1.25, 3.85, 1.40], interface_delivery_rows, first_col_fill=LIGHT_BLUE)
doc.add_heading("七、状态数据项确认", level=1)
p = doc.add_paragraph()
add_text(
p,
"请针对可提供的数据项另附数据字典,并至少标明:接口来源、字段/节点地址、数据类型、单位、"
"刷新周期、时间戳、枚举含义、无效值及报警条件。",
color=GRAY,
)
data_rows = [
("设备状态", "设备 ID、型号/版本、在线/离线、采集状态、最后更新时间", "□可提供 □部分 □不支持"),
("运行状态", "自动/手动/MDI、运行/暂停/停止/报警/急停、循环启动、门和关键联锁", "□可提供 □部分 □不支持"),
("程序执行", "当前程序、子程序、行号/序列号、开始结束时间、循环时间、加工计数", "□可提供 □部分 □不支持"),
("轴与坐标", "机床/工件坐标、剩余移动、进给、倍率、轴负载、旋转轴角度", "□可提供 □部分 □不支持"),
("主轴", "实际/指令转速、倍率、负载、扭矩/功率、方向、状态、温度", "□可提供 □部分 □不支持"),
("刀具", "当前刀号、刀位、刀补、寿命、使用次数、刀具报警及刀具表更新", "□可提供 □部分 □不支持"),
("报警诊断", "报警号、等级、文本、发生/解除时间、历史、CNC 与机床 PLC 报警", "□可提供 □部分 □不支持"),
("加工质量", "完工状态、实际周期、测头/尺寸结果、报废返工原因", "□可提供 □部分 □不支持"),
("维护能耗", "运行时长、润滑/冷却、维护计数、能耗等设备已有数据", "□可提供 □部分 □不支持"),
]
formal_matrix(doc, ["数据类别", "期望数据项", "贵方确认"], [1.20, 4.05, 1.25], data_rows, first_col_fill=LIGHT_BLUE)
doc.add_heading("八、网络与安全配合", level=1)
security_rows = [
("网络拓扑", "机床网段、工业交换机、防火墙/隔离区、可否新增工控机及跨网访问方式。", "□可提供 □待确认"),
("端口白名单", "协议、源/目的 IP、TCP/UDP 端口、连接方向和网络变更流程。", "□可提供 □待确认"),
("账号与证书", "角色权限、密码策略、证书签发/更新、密钥保存和账号停用流程。", "□可提供 □待确认"),
("远程支持", "VPN/堡垒机/厂商远程服务、审批、开放时间、审计和紧急断开。", "□允许 □不允许 □待确认"),
("备份恢复", "CNC 参数、PLC、刀补、宏变量和接口配置的备份、回退及恢复负责人。", "□可配合 □待确认"),
("数据合规", "可采集范围、保存期限、图纸/NC 程序保密等级、外发和云端限制。", "□可提供 □待确认"),
]
formal_matrix(doc, ["项目", "请确认内容", "贵方回复"], [1.25, 4.00, 1.25], security_rows, first_col_fill=LIGHT_BLUE)
doc.add_heading("九、联合调试与验收支持", level=1)
acceptance_rows = [
("资料审查", "型号、手册、代码表、样例、接口和许可证资料齐全;共同确认未知项和责任人。", "□可配合"),
("离线验证", "使用验证样例生成 NC,完成 CAM/CNC 仿真和现场程序对比。", "□可配合 仿真环境:________"),
("程序传输", "验证上传、下载、覆盖保护、文件名、校验、断线重试和回执,不启动机床。", "□可配合"),
("空运行", "在机床锁定/抬刀/单段/低倍率条件下核对坐标、刀具、换刀、行程和安全位置。", "□可配合"),
("试切", "使用约定毛坯、刀具和装夹加工样件,记录周期、报警、刀具和检测结果。", "□可配合"),
("状态采集", "验证约定数据项、时间戳、连续采集、断线恢复和报警记录。", "□可配合"),
("试运行", "限定设备和零件范围运行,统计成功率、人工干预、报警和返工。", "□可配合"),
]
formal_matrix(doc, ["阶段", "配合与验收内容", "贵方确认"], [1.10, 4.20, 1.20], acceptance_rows, first_col_fill=LIGHT_BLUE)
doc.add_heading("十、首批交付成果", level=1)
deliverable_rows = [
("P0", "设备接口基线表", "每台机床的完整型号、CNC 版本、轴/主轴/刀库、选件、程序传输、可用接口、网络和联系人。", "□可提供"),
("P0", "机床编程资料包", "CNC/机床手册、G/M 代码、专用 M 代码、程序模板、坐标/刀补/换刀规则。", "□可提供"),
("P0", "验证样例包", "3~10 套 STEP/图纸、毛坯、刀具、装夹、CAM、NC 和检测结果对应的完整样例。", "□可提供"),
("P1", "通信接口包", "SDK/运行库或协议、许可、样例、数据字典、节点/地址表、错误码和兼容矩阵。", "□可提供"),
("P1", "测试验收环境", "离线仿真或测试机、账号/目录、网络窗口、备份、现场人员及验收样件。", "□可提供"),
("P2", "数字机床资料包", "机床、刀具、刀柄、夹具和毛坯模型;运动学、软限位、碰撞体和 CAM 仿真工程。", "□可提供"),
]
formal_matrix(doc, ["优先级", "成果名称", "内容", "确认"], [0.70, 1.45, 3.30, 1.05], deliverable_rows, first_col_fill=GREEN)
doc.add_heading("十一、商务授权与支持信息", level=1)
commercial_rows = [
("软件与接口授权", "SDK、运行库、OPC UA/MTConnect、仿真软件、后处理器是否收费及授权方式", "____________________________"),
("现场服务", "现场调试服务内容、人员、预计工期及费用", "____________________________"),
("培训", "操作、编程、通信接口、备份恢复和安全联调培训", "____________________________"),
("维护支持", "服务时间、响应时限、升级路径、远程/现场支持和年度维护", "____________________________"),
("交付介质", "安装包、许可证、手册、样例代码、版本号、校验值和下载期限", "____________________________"),
]
formal_matrix(doc, ["项目", "请确认内容", "贵方回复"], [1.35, 3.65, 1.50], commercial_rows, first_col_fill=LIGHT_BLUE)
doc.add_heading("附:建议资料包目录", level=1)
add_callout(
doc,
"建议压缩包结构",
"01_设备铭牌与系统照片;02_机床与CNC手册;03_GM代码与机床专用说明;04_已验证样例;"
"05_CAM与后处理;06_刀具夹具材料工艺;07_通信软件与接口文档;08_网络与测试环境;"
"09_授权商务信息;10_联系人。",
LIGHT_BLUE,
)
OUT.parent.mkdir(parents=True, exist_ok=True)
doc.save(OUT)
print(OUT)
if __name__ == "__main__":
build()