EP01 · 讲义

Genesis2000 Python 脚本实战 · 第1集 为什么用 Python 驱动 Genesis

这个系列怎么学(面向零基础)

开始之前先说清楚这个系列怎么学。即使你从没写过 Python,也能听懂——每集只讲一个模块,先讲它解决什么问题,再看它怎么用。 所有代码都来自我们生产环境里真正在跑的封装包,每一行都有出处。你看的不是教学玩具,是实战武器。

CAM 工程师的重复劳动

CAM 工程师每天要做大量重复操作:打开料号、查询资料、生成输出。这些操作在 Genesis 里点几下鼠标就能完成,但每天重复几十遍,就成了负担。 更麻烦的是,很多操作还要配合外部系统的数据,比如 ERP 里的板边参数。手动查询、手动录入,既慢又容易出错。 这正是我们写脚本的原因:把这些流程交给程序自动完成。

Genesis 为自动化提供的基础设施

open_job,job=xxx  # 行命令:界面操作的背后
Genesis 本身为自动化提供了完整的基础设施。图形界面里的每一个操作,背后都对应一条行命令。 它还提供脚本录制、脚本调试器,以及 hooks 钩子机制——在特定命令执行的前后,自动运行你的脚本。 所以问题不是能不能自动化,而是用什么语言来写。

语言的选择题

用什么语言,这道题我们认真答过。答案综合考虑了四个方面的原因:运行环境、生态、可维护性、人。 下面逐条展开。听完这四条,你就明白 py3_package 为什么长在 Python 上。

理由一:Genesis 的通讯协议是开放的

第一条理由是通讯机制。Genesis 对外提供的是一套开放的命令协议——通过标准输入输出传递命令和应答,这个协议不挑语言。 任何语言,只要实现了与 Genesis 的通讯代码,就能自由驱动它。C-Shell 可以,Perl 可以,Python 当然也可以。 语言不是 Genesis 限定的,而是我们自己选的。这给了我们按需选语言的自由——后面三条理由,就是我们为什么选 Python。

理由二:生态齐全,要什么有什么

第二条理由是生态。自动化任务不是只跟 Genesis 打交道:要查 ERP 数据库,要弹界面给操作员确认,要调用公司接口,要发邮件通知。 这些东西,Python 生态里全有成熟方案——数据库驱动、图形界面框架、网络请求库,装个包就能用。我们封装包里的数据库模块、界面模块、接口模块,底层用的都是这些库。

理由三:可读、可维护、可调试

第三条理由是工程上的:脚本不只是写一次就跑,它会活很多年——改需求、修 bug、交接给别人。 这就要求代码可读、可维护、可调试。Python 的语法结构清晰,调试工具成熟,几百行的业务逻辑也能理得清。脚本是代码,代码就需要认真维护。

理由四:团队上手快

第四条是人。工程语言不只是给机器看的,也是给同事看的。 Python 学习成本低,新同事上手快——能读懂脚本,才能维护脚本。一个工具的价值,取决于有多少人用得起它。

四个理由的落地:py3_package

# 顶层 · 统一入口
Main
# 命令封装
MainLCM — 约 120 个操作命令
# info 查询 / 底层通信
MainInfo  InCAM — 与 Genesis 对话
正是这四条综合原因,我们选择了 Python,并封装出 py3_package 这套开发包。 它分四层:底层 InCAM 类负责与 Genesis 通信,往上 MainInfo 封装查询,再往上 MainLCM 封装约一百二十个操作命令,顶层 Main 是所有脚本的入口。周边还有料号信息、界面、数据库、外部接口等模块。

最小可运行示例

from MainClasses import Main
Do = Main()
Do.isjobopened('job')  # → True / False
先看一个最小例子,三行代码。第一行导入 Main 类;第二行创建 Do 对象;第三行调用封装好的方法,检查料号是否打开。 注意,创建 Do 对象本身并不会和 Genesis 通信——真正的通信,发生在每次调用方法的时候。

一条命令的一生(完整源码)

def isjobopened(self, job):
  if self.do.COM('is_job_open,job={0}'.format(job)) == 'yes':
    return True
  return False
第三行代码背后是什么?看 isjobopened 的完整源码:它把命令名和参数拼成字符串,发给底层 COM 通道。 底层再把命令加上特殊前缀写进标准输出,Genesis 执行后把结果写回标准输入,脚本读取状态码和应答文本。应答是 yes,就返回真。三层接力,一行调用,就是封装的全貌。

真实使用案例巡览

Do.openjob('job')                 # 打开料号
joblist = Do.JobList()           # 获取料号清单
Do.openstep('job', 'step')       # 打开料号的 step
最后感受一下封装后的日常写法。这三个例子都摘自封装包文档里的「使用例子」,是生产环境天天在用的调用方式。 打开料号、列料号清单、打开步骤——每个都是一行。后面九集,我们逐个模块拆开讲,把每一条这样的调用都看懂。

十集路线图

本系列共十集:从通信底层、info 查询、命令封装,到料号业务、图形界面、数据库、外部接口,最后用一个实战整合收尾。 下一集,我们走进最底层的 InCAM 类,看懂这条通信链路是怎么建起来的。
零壹AI工作室出品 · 《用 Python 驱动 Genesis2000》免费公开课 · www.binwindai.com