EP01 · 讲义
Genesis2000 Python 脚本实战 · 第1集 为什么用 Python 驱动 Genesis
这个系列怎么学(面向零基础)
- 不需要 Python 基础
- 每集一个模块
- 讲为什么 → 讲怎么用 → 看真实代码
- 代码来自生产环境真实封装包
- 不是教学玩具,是实战武器
开始之前先说清楚这个系列怎么学。即使你从没写过 Python,也能听懂——每集只讲一个模块,先讲它解决什么问题,再看它怎么用。 所有代码都来自我们生产环境里真正在跑的封装包,每一行都有出处。你看的不是教学玩具,是实战武器。
CAM 工程师的重复劳动
- 外部数据 · ERP 板边参数
- 每天重复几十遍 · 人工查询易出错 → 交给程序自动完成
CAM 工程师每天要做大量重复操作:打开料号、查询资料、生成输出。这些操作在 Genesis 里点几下鼠标就能完成,但每天重复几十遍,就成了负担。 更麻烦的是,很多操作还要配合外部系统的数据,比如 ERP 里的板边参数。手动查询、手动录入,既慢又容易出错。 这正是我们写脚本的原因:把这些流程交给程序自动完成。
Genesis 为自动化提供的基础设施
open_job,job=xxx # 行命令:界面操作的背后
- 脚本录制
- 脚本调试器
- hooks 钩子
- 问题不是能不能自动化,而是用什么语言写
Genesis 本身为自动化提供了完整的基础设施。图形界面里的每一个操作,背后都对应一条行命令。 它还提供脚本录制、脚本调试器,以及 hooks 钩子机制——在特定命令执行的前后,自动运行你的脚本。 所以问题不是能不能自动化,而是用什么语言来写。
语言的选择题
用什么语言,这道题我们认真答过。答案综合考虑了四个方面的原因:运行环境、生态、可维护性、人。 下面逐条展开。听完这四条,你就明白 py3_package 为什么长在 Python 上。
理由一:Genesis 的通讯协议是开放的
- C-Shell
- Perl
- Python
- ↓ 各自编写通讯代码 ↓
- Genesis 开放命令协议
- 标准输入输出传命令和应答,协议不挑语言
- 语言不是 Genesis 限定的,是我们自己选的
第一条理由是通讯机制。Genesis 对外提供的是一套开放的命令协议——通过标准输入输出传递命令和应答,这个协议不挑语言。 任何语言,只要实现了与 Genesis 的通讯代码,就能自由驱动它。C-Shell 可以,Perl 可以,Python 当然也可以。 语言不是 Genesis 限定的,而是我们自己选的。这给了我们按需选语言的自由——后面三条理由,就是我们为什么选 Python。
理由二:生态齐全,要什么有什么
- pymssql / pymysql 数据库驱动
- PyQt5 界面框架
- requests HTTP 接口
- SMTP 邮件
- 查数据库 · 弹界面 · 调接口 · 发邮件,全有成熟方案
- 我们包里这些模块,底层用的都是它们
第二条理由是生态。自动化任务不是只跟 Genesis 打交道:要查 ERP 数据库,要弹界面给操作员确认,要调用公司接口,要发邮件通知。 这些东西,Python 生态里全有成熟方案——数据库驱动、图形界面框架、网络请求库,装个包就能用。我们封装包里的数据库模块、界面模块、接口模块,底层用的都是这些库。
理由三:可读、可维护、可调试
- 脚本会活很多年:改需求、修 bug、交接
- 脚本是代码,代码就需要认真维护
第三条理由是工程上的:脚本不只是写一次就跑,它会活很多年——改需求、修 bug、交接给别人。 这就要求代码可读、可维护、可调试。Python 的语法结构清晰,调试工具成熟,几百行的业务逻辑也能理得清。脚本是代码,代码就需要认真维护。
理由四:团队上手快
- 工程语言是给机器看的,也是给同事看的
- 工具的价值,取决于有多少人用得起它
第四条是人。工程语言不只是给机器看的,也是给同事看的。 Python 学习成本低,新同事上手快——能读懂脚本,才能维护脚本。一个工具的价值,取决于有多少人用得起它。
四个理由的落地:py3_package
# 顶层 · 统一入口
Main
# 命令封装
MainLCM — 约 120 个操作命令
# info 查询 / 底层通信
MainInfo → InCAM — 与 Genesis 对话
- JobClasses 料号信息
- GuiClasses 界面
- SqlClasses 数据库
- ApiClasses 外部接口
正是这四条综合原因,我们选择了 Python,并封装出 py3_package 这套开发包。 它分四层:底层 InCAM 类负责与 Genesis 通信,往上 MainInfo 封装查询,再往上 MainLCM 封装约一百二十个操作命令,顶层 Main 是所有脚本的入口。周边还有料号信息、界面、数据库、外部接口等模块。
最小可运行示例
from MainClasses import Main
Do = Main()
Do.isjobopened('job') # → True / False- 创建 Do 对象本身不发起通信
- 通信发生在每次调用方法时
先看一个最小例子,三行代码。第一行导入 Main 类;第二行创建 Do 对象;第三行调用封装好的方法,检查料号是否打开。 注意,创建 Do 对象本身并不会和 Genesis 通信——真正的通信,发生在每次调用方法的时候。
一条命令的一生(完整源码)
def isjobopened(self, job):
if self.do.COM('is_job_open,job={0}'.format(job)) == 'yes': return True
return False
- 拼命令 → COM 通道 → 前缀写 stdout → stdin 读应答
- 三层接力,一行调用,就是封装的全貌
第三行代码背后是什么?看 isjobopened 的完整源码:它把命令名和参数拼成字符串,发给底层 COM 通道。 底层再把命令加上特殊前缀写进标准输出,Genesis 执行后把结果写回标准输入,脚本读取状态码和应答文本。应答是 yes,就返回真。三层接力,一行调用,就是封装的全貌。
真实使用案例巡览
Do.openjob('job') # 打开料号joblist = Do.JobList() # 获取料号清单
Do.openstep('job', 'step') # 打开料号的 step- 摘自封装包 docstring 的「使用例子」原文
- 生产环境天天在用,每个都是一行
最后感受一下封装后的日常写法。这三个例子都摘自封装包文档里的「使用例子」,是生产环境天天在用的调用方式。 打开料号、列料号清单、打开步骤——每个都是一行。后面九集,我们逐个模块拆开讲,把每一条这样的调用都看懂。
十集路线图
- 通信底层 → info 查询 → 命令封装 → 主类入口 → 料号业务 → GUI 交互 → 数据库 → 外部接口 → 辅助模块 → 实战整合
本系列共十集:从通信底层、info 查询、命令封装,到料号业务、图形界面、数据库、外部接口,最后用一个实战整合收尾。 下一集,我们走进最底层的 InCAM 类,看懂这条通信链路是怎么建起来的。
零壹AI工作室出品 · 《用 Python 驱动 Genesis2000》免费公开课 · www.binwindai.com