Python endura-sdk 完整使用手册
一、包基础概述
1. 包定义与核心定位
endura-sdk是应用材料(Applied Materials)Endura 半导体沉积设备专用Python开发套件,面向晶圆镀膜、PVD物理气相沉积设备上位机二次开发,用于对接Endura系列真空镀膜机的工控通讯、工艺参数读写、设备状态采集、故障报警、Recipe配方下发、生产数据采集等场景。
- 适用设备:Endura 5500、Endura 300mm、Endura II 溅射平台
- 通讯底层:封装SECS/GEM、OPC UA、设备私有TCP协议,屏蔽底层工控报文复杂度
- 开发场景:半导体产线MES对接、设备自动化、数据采集平台、工艺仿真、设备故障预警系统
2. 核心功能总览
- 设备通讯连接:TCP/SECS/OPCUA多协议自动适配,单/多Endura设备并发连接
- 实时数据采集:腔室温度、溅射功率、真空压力、气体流量、晶圆计数、电机参数实时读取
- Recipe工艺管理:本地配方上传、设备配方下载、参数校验、配方批量下发、版本比对
- 设备控制指令:腔室启停、真空抽气、溅射启停、晶圆传送、设备复位、手动/自动模式切换
- 报警与事件订阅:实时故障告警、工艺异常、设备停机事件订阅、历史告警查询
- 生产数据交互:晶圆Lot批次数据、加工时长、良率数据、设备OEE指标读取
- 参数读写权限控制:区分只读工艺参数、可修改配置参数、管理员权限接口
- 日志与持久化:通讯日志、工艺运行日志自动落地,支持CSV/数据库批量导出
- 批量并发接口:多腔室批量读取、多设备轮询采集、异步非阻塞IO采集
- 数据校验工具:工艺参数阈值校验、配方格式校验、通讯报文完整性校验
二、完整安装教程
1. 前置依赖环境要求
| 环境项 | 最低要求 | 推荐配置 |
|---|---|---|
| Python | 3.7+ | 3.9/3.10 |
| 操作系统 | Windows Server/Linux CentOS/Ubuntu | Windows10工控机、Ubuntu20.04 |
| 底层依赖库 | pysecs、opcua、pyserial、asyncio、pandas、sqlalchemy | 全量依赖自动安装 |
| 网络条件 | 设备工控网互通,开放50001、7001端口(SECS+OPCUA) | 固定内网IP,防火墙放行设备端口 |
2. 安装方式
方式1:pip在线标准安装(推荐)
# 稳定正式版pipinstallendura-sdk--upgrade# 指定版本安装pipinstallendura-sdk==2.4.1# 国内镜像加速pipinstallendura-sdk-ihttps://pypi.tuna.tsinghua.edu.cn/simple方式2:离线安装(工控机无外网)
- 外网机器下载离线包
pip download endura-sdk-d./endura_offline- 拷贝至工控机执行离线安装
pipinstall--no-index --find-links=./endura_offline endura-sdk方式3:源码编译安装(定制修改底层协议)
gitclone https://gitlab.appliedmaterials.com/endura/python-endura-sdk.gitcdpython-endura-sdk python setup.pyinstall3. 依赖修复安装失败
# 手动补全缺失底层依赖pipinstallpysecs opc-ua pyserial pandas python-dotenv aiohttp三、核心语法、类、接口与参数详解
1. 顶层核心类结构
# 核心导入importendura_sdkfromendura_sdkimportEnduraClient,RecipeManager,AlarmMonitor,AsyncDeviceCollector四大核心类:
EnduraClient:单设备主连接客户端(同步接口,入门首选)AsyncDeviceCollector:异步多设备并发采集客户端(高并发产线)RecipeManager:配方全生命周期管理模块AlarmMonitor:设备告警订阅、历史查询模块
2. EnduraClient 连接类关键参数(最常用)
client=EnduraClient(host="192.168.1.100",# 必填:Endura设备工控IPport=50001,# 必填:SECS通讯端口,默认50001protocol="secs",# 通讯协议:secs / opcua / tcp_rawdevice_name="ENDURA_300_01",# 自定义设备标识名timeout=10,# 通讯超时,单位秒username="operator",# 设备登录账号password="Mat#2026",# 设备操作密码auto_reconnect=True,# 断连自动重连开关reconnect_interval=3,# 重连间隔秒log_level="INFO",# 日志等级:DEBUG/INFO/WARN/ERRORlog_save_path="./device_log/"# 本地日志存储路径)关键参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| host | str | 是 | 镀膜设备内网IP |
| port | int | 是 | SECS=50001,OPCUA=7001 |
| protocol | str | 否 | secs标准半导体协议(默认),opcua适合第三方MES对接 |
| auto_reconnect | bool | 否 | 生产环境必须开启,避免断采 |
| username/password | str | 否 | 修改工艺参数、下发配方需要管理员账号 |
3. 基础通用语法流程(标准四步模板)
- 实例化客户端
- 建立设备连接
client.connect() - 调用读写/采集/控制接口执行业务
- 程序结束释放连接
client.close()
完整基础模板:
fromendura_sdkimportEnduraClient# 1. 初始化客户端client=EnduraClient(host="192.168.1.100",port=50001,protocol="secs")try:# 2. 连接设备connect_status=client.connect()ifconnect_status["code"]!=0:print("设备连接失败:",connect_status["msg"])else:print("设备连接成功")# 3. 业务操作:读取设备基础状态dev_status=client.get_device_status()print("设备运行状态:",dev_status)finally:# 4. 释放连接client.close()4. 高频通用接口与入参、返回值
(1)设备状态读取 get_device_status()
无入参,返回字典:设备模式(自动/手动)、真空状态、是否加工晶圆、腔室故障标记、OEE实时值
res=client.get_device_status()# 返回示例{"mode":"auto","vacuum_ok":True,"running":True,"oee":89.2,"chamber_fault":[]}(2)腔室实时工艺参数 get_chamber_data(chamber_id)
入参:chamber_id int,腔室编号1~6
返回:温度、DC功率、氩气流量、氮气分压、溅射时间、靶材损耗
chamber1_data=client.get_chamber_data(chamber_id=1)(3)参数写入 set_process_param(chamber_id, param_name, value)
入参:腔室ID、参数名称字符串、目标数值
限制:仅管理员账号可调用,超出阈值会返回报错
# 修改1号腔溅射功率为3000Wclient.set_process_param(1,"sputter_power_dc",3000)(4)Recipe配方接口 RecipeManager
recipe_mgr=RecipeManager(client=client)# 下载设备端指定配方recipe=recipe_mgr.download_recipe(recipe_name="AL_DEP_100A")# 上传本地配方至设备recipe_mgr.upload_recipe(local_path="./recipe/al_recipe.json",overwrite=True)# 下发配方至1号腔执行recipe_mgr.run_recipe(chamber_id=1,recipe_name="AL_DEP_100A")(5)告警订阅 AlarmMonitor
alarm=AlarmMonitor(client)# 实时监听告警,回调函数处理异常alarm.subscribe(callback=lambdaalert:print("设备告警:",alert))# 查询近24小时历史故障history_alarm=alarm.get_history(start_time="2026-06-19 00:00",end_time="2026-06-20 00:00")(6)异步并发采集 AsyncDeviceCollector
适用于产线多台Endura同时采集,不阻塞主线程
collector=AsyncDeviceCollector()# 批量添加多台设备collector.add_device(host="192.168.1.100",port=50001,name="E1")collector.add_device(host="192.168.1.101",port=50001,name="E2")# 异步批量读取所有设备状态all_data=collector.async_get_all_status()四、8个完整可运行实际应用案例
案例1:单台Endura设备实时状态轮询采集(基础监控)
场景:工控机定时采集设备启停、真空、运行状态,打印日志
fromendura_sdkimportEnduraClientimporttime client=EnduraClient(host="192.168.1.100",port=50001,auto_reconnect=True)try:client.connect()# 每2秒轮询一次设备状态whileTrue:status=client.get_device_status()print(f"【{time.strftime('%Y-%m-%d %H:%M:%S')}】设备状态:{status}")# 检测设备停机告警ifnotstatus["running"]:print("警告:设备已停止加工晶圆!")time.sleep(2)exceptKeyboardInterrupt:print("程序手动终止")finally:client.close()案例2:多腔室工艺参数批量采集存储CSV
场景:采集1-4号溅射腔温度、功率、气体流量,落地本地CSV用于工艺分析
fromendura_sdkimportEnduraClientimportpandasaspdimporttime client=EnduraClient("192.168.1.100",50001)client.connect()data_list=[]# 采集10组数据foriinrange(10):row={"timestamp":time.strftime("%Y-%m-%d %H:%M:%S")}forchamberin[1,2,3,4]:chamber_data=client.get_chamber_data(chamber)row[f"ch{chamber}_temp"]=chamber_data["temperature"]row[f"ch{chamber}_power"]=chamber_data["sputter_power"]row[f"ch{chamber}_gas_flow"]=chamber_data["ar_flow"]data_list.append(row)time.sleep(1)# 写入CSVdf=pd.DataFrame(data_list)df.to_csv("./chamber_process_data.csv",index=False,encoding="utf-8-sig")print("工艺数据保存完成")client.close()案例3:配方上传、参数校验、自动下发执行
场景:本地新镀膜配方上传设备,校验参数阈值无误后自动在2号腔运行
fromendura_sdkimportEnduraClient,RecipeManager# 带管理员账号,支持修改/下发配方client=EnduraClient(host="192.168.1.100",port=50001,username="admin",password="Admin#2026")client.connect()recipe_mgr=RecipeManager(client)# 1. 本地配方上传,覆盖同名旧配方upload_res=recipe_mgr.upload_recipe("./recipe/cu_sputter.json",overwrite=True)ifupload_res["code"]!=0:print("配方上传失败:",upload_res["msg"])else:# 2. 参数合法性校验(功率、温度阈值检查)check=recipe_mgr.check_recipe_param("cu_sputter")ifcheck["pass"]:# 3. 下发2号腔自动执行recipe_mgr.run_recipe(chamber_id=2,recipe_name="cu_sputter")print("配方下发执行成功")else:print("配方参数超标:",check["error_params"])client.close()案例4:设备故障告警实时监听+异常弹窗记录
场景:实时捕获真空泄漏、靶材耗尽、气体中断告警,保存告警日志
fromendura_sdkimportEnduraClient,AlarmMonitorimportjson client=EnduraClient("192.168.1.100",50001)client.connect()alarm_monitor=AlarmMonitor(client)# 告警回调处理函数defalert_handler(alert_info):print("="*50)print("触发设备告警:",json.dumps(alert_info,ensure_ascii=False,indent=2))# 追加写入告警日志文件withopen("./alarm_log.txt","a",encoding="utf-8")asf:f.write(json.dumps(alert_info)+"\n")# 订阅实时告警流alarm_monitor.subscribe(callback=alert_handler)print("告警监听已启动,等待故障信号...")# 持续监听try:whileTrue:passexceptKeyboardInterrupt:alarm_monitor.unsubscribe()client.close()案例5:异步并发多台Endura设备集群采集(产线MES对接)
场景:工厂5台镀膜设备同时异步采集,无阻塞,汇总全部设备实时数据
fromendura_sdkimportAsyncDeviceCollectorimportasyncioasyncdefcollect_all_device():collector=AsyncDeviceCollector()# 批量添加产线5台设备device_ips=[("192.168.1.100","E01"),("192.168.1.101","E02"),("192.168.1.102","E03"),("192.168.1.103","E04"),("192.168.1.104","E05")]forip,nameindevice_ips:collector.add_device(host=ip,port=50001,name=name)# 异步批量读取所有设备腔室数据result=awaitcollector.async_get_all_chamber_data()print("集群设备采集汇总数据:",result)# 执行异步采集asyncio.run(collect_all_device())案例6:远程修改腔室工艺参数+阈值保护校验
场景:远程调整溅射功率,内置参数上下限校验,防止超温超功率损坏靶材
fromendura_sdkimportEnduraClient client=EnduraClient("192.168.1.100",50001,username="admin",password="Admin#2026")client.connect()chamber_id=1target_power=3500# 先读取参数阈值范围param_limit=client.get_param_limit(chamber_id,"sputter_power_dc")min_p,max_p=param_limit["min"],param_limit["max"]# 阈值校验ifmin_p<=target_power<=max_p:res=client.set_process_param(chamber_id,"sputter_power_dc",target_power)ifres["code"]==0:print(f"功率修改成功,当前功率:{target_power}W")else:print("参数写入失败:",res["msg"])else:print(f"参数越界!允许范围{min_p}~{max_p}W")client.close()案例7:读取晶圆Lot批次生产数据写入MySQL数据库
场景:对接MES系统,自动抓取每批次晶圆加工时长、良率、腔室号存入数据库
fromendura_sdkimportEnduraClientfromsqlalchemyimportcreate_engineimportpandasaspd# 数据库连接engine=create_engine("mysql+pymysql://user:pass@127.0.0.1:3306/semiconductor_db")client=EnduraClient("192.168.1.100",50001)client.connect()# 获取最新加工批次数据lot_data=client.get_lot_production_data()df=pd.DataFrame(lot_data)# 写入生产数据表df.to_sql(name="endura_lot_record",con=engine,if_exists="append",index=False)print(f"成功写入{len(df)}条批次生产记录至数据库")client.close()案例8:设备自动运维脚本(故障复位+停机自检)
场景:检测轻微告警后自动执行设备复位、真空自检,减少人工介入
fromendura_sdkimportEnduraClient,AlarmMonitor client=EnduraClient("192.168.1.100",50001,username="admin",password="Admin#2026")client.connect()alarm=AlarmMonitor(client)defauto_repair_alert(alert):# 轻微气体波动告警自动复位ifalert["alarm_code"]in["GAS_LOW","VACUUM_FLUCT"]:print("检测到轻微故障,执行自动复位")client.device_reset()# 执行真空自检check_res=client.vacuum_self_check()ifcheck_res["vacuum_normal"]:print("自检通过,设备恢复正常运行")else:print("真空自检异常,需人工检修")alarm.subscribe(callback=auto_repair_alert)print("自动运维程序启动,监控轻微故障自动复位")try:whileTrue:passexceptKeyboardInterrupt:client.close()五、常见错误、报错原因与解决方案
1. 连接类报错
报错1:ConnectionRefusedError: [Errno 61] Connection refused
- 原因:①设备IP/端口错误;②工控机防火墙拦截50001端口;③设备SECS服务未启动;④网线断开
- 解决:核对IP端口;机房运维放行端口;重启Endura设备SECS后台服务;ping设备IP测试网络
报错2:auto_reconnect失效,频繁断连
- 原因:reconnect_interval设置过大;工控网网络波动;设备最大连接数已满
- 解决:调整reconnect_interval=2;优化交换机网络;设备后台释放闲置连接
2. 权限与参数读写报错
报错3:Code 403 Permission Denied 无权修改参数
- 原因:客户端未传入admin管理员账号,普通operator仅可读不可写
- 解决:实例化EnduraClient时传入username/password管理员凭证
报错4:ParamValueOutOfRange 参数超出阈值
- 原因:set_process_param写入数值超过设备预设上下限,保护靶材/腔室
- 解决:调用get_param_limit查询合法区间,修改数值至范围内
3. Recipe配方相关报错
报错5:RecipeParseError 配方文件解析失败
- 原因:本地配方JSON格式错误;配方参数字段与设备不兼容;版本不匹配
- 解决:格式化JSON校验;使用设备导出标准模板修改;升级endura-sdk至匹配设备版本
报错6:RecipeRunFailed 配方下发执行失败
- 原因:腔室处于手动锁定模式;真空未达标;靶材损耗超限;配方依赖气体未开启
- 解决:切换设备至auto自动模式;等待真空达标;更换靶材;检查供气系统
4. 异步采集并发报错
报错7:AsyncTaskTimeoutError 异步采集超时
- 原因:同时并发设备过多,工控网络带宽不足;timeout参数过小
- 解决:分批采集设备;调高timeout至15s;优化产线内网带宽
5. 安装与依赖报错
报错8:ModuleNotFoundError: No module named ‘endura_sdk’
- 原因:未正确安装包;多Python环境混淆;离线安装缺失依赖
- 解决:重新执行pip安装;确认使用当前环境pip;离线包补全依赖库
报错9:ImportError: cannot import name ‘AsyncDeviceCollector’
- 原因:sdk版本过低,异步采集类为2.2.0后新增
- 解决:
pip install endura-sdk --upgrade升级最新稳定版
6. 告警监听报错
报错10:AlarmSubscribeFailed 告警订阅通道占用
- 原因:已有上位机MES连接设备告警通道,单设备仅支持1路告警订阅
- 解决:断开其他MES客户端;使用OPCUA协议多路订阅模式
六、使用注意事项与生产环境规范
1. 网络与工控安全规范
- 禁止公网直接访问Endura工控设备,必须隔离产线内网,增加网闸
- 所有通讯账号密码禁止硬编码在代码,使用
.env环境文件加密存储 - 生产环境必须开启
auto_reconnect=True,防止断采丢失工艺数据
2. 工艺操作风险规范
- 远程修改溅射功率、温度、气体流量前必须调用
get_param_limit做阈值校验,避免烧毁靶材、损坏真空腔室 - 配方下发仅允许非生产时段或空晶圆腔室测试,量产中下发会中断镀膜流程造成晶圆报废
- 设备复位、真空自检等高风险指令增加人工确认逻辑,禁止无限制自动执行
3. 性能与并发优化
- 单线程同步客户端最多控制3台以内设备,5台以上必须使用
AsyncDeviceCollector异步采集 - 轮询采集间隔最低设置1s,禁止毫秒级高频轮询,会占用设备工控CPU导致卡顿
- 长期采集程序增加日志滚动分割,避免日志文件无限膨胀占用硬盘
4. 版本兼容规范
- Endura老款5500设备适配sdk 1.x版本;300mm新款平台使用2.4+版本
- 升级sdk前必须在测试机验证配方、接口兼容性,避免产线程序崩溃
- 协议选择:MES对接优先opcua,单纯工艺采集使用secs协议,速度更快
5. 日志与数据存储规范
- 生产程序强制配置log_save_path,完整留存通讯日志用于故障追溯
- 批量工艺数据建议分小时分片存储CSV/数据库,单表避免千万级数据堆积
- 告警日志永久留存,满足半导体工厂生产追溯合规要求
6. 程序健壮性规范
- 所有设备操作必须使用try-finally包裹,确保程序异常退出时执行client.close()释放连接
- 增加心跳检测逻辑,定时读取设备状态判断通讯存活
- 增加异常捕获兜底,单个设备故障不影响其他产线设备采集流程
《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。