CAM350 脚本开发实战:第一个弹窗宏
CAM350 脚本开发实战:v12.1 第一个弹窗宏与 Macro → Play 无反应排查
在 PCB / FPC 制造资料处理里,加板边、拼板、层命名、批量出报告这些动作每天都在重复。CAM350 的宏(Macro)是把重复劳动固化下来最轻量的入口。本文以使用最广的 v12.1 为例,从一行 Hello World 弹窗开始,讲清 .scr 脚本的写法、文件规范与运行方式,并记录一次「点 Macro → Play 完全没反应」的真实排错过程 —— 最后原因不在代码,而在软件安装本身。
一、先分清版本:CAM350 有两套互不兼容的脚本体系
这是入门最容易踩的坑。网上不少「CAM350 脚本教程」把两套语法混着写,照抄必然跑不起来。版本决定路线:
| 项目 | .scr 宏(BASIC) | .vbs(VB Automation API) |
|---|---|---|
| 可用版本 | 10.x ~ 14.5,几乎全版本 | 14.6 起新增(2023,Build 1834+) |
| 引擎 | 内置类 BASIC 解释器,变量带后缀 | WinWrap Basic,#Language "WWW-COM" |
| 入口 | Macro → Record / Play,脚本存安装目录 Scripts | Home ribbon → Script Editor / Record Script |
| 能力 | 窗体交互、字符串与文件操作、调用带 @ 后缀的 CAM 底层命令 | 90+ 对象、1000+ 属性方法,可挂接外部 COM |
| 文档 | 老版 camnt95.chm → Macro Menu / Basic 章节 | Script Editor → Help → CAM350 Automation API;示例在安装目录 Scripts |
本文的 v12.1 只能走 .scr 路线,14.6 的 VB API 在这里完全用不上。顺带一提,14.6 的 VB 接口也没有覆盖 View / Query、Cross-probe、Test 检查、Analyze 里的 DRC / DFF 规则检查、StackUp Visualizer 与 3D View;但 Stream Editor 是完整启用的,所以批量 DFM 的正确做法是让脚本调用 DFM Stream,而不是去找检查命令的对象。
二、.scr 文件的三条硬性规范
宏解释器很老,对文件格式比一般脚本敏感。写第一个脚本之前先固定这三条:
CRLF 换行。LF-only 的文件在部分版本会整段静默失效 —— 不报错、不弹窗、什么都没有。
纯 ASCII / ANSI,无 BOM。老版对中文注释容易乱码,路径也尽量别带中文;用记事本另存时选 ANSI,别选 UTF-8 带 BOM。
扩展名真的是 .scr。Windows 默认隐藏扩展名,「另存为」很容易得到
hello_world.scr.txt,这类文件在 Play 对话框里根本不会被当作宏。
语法上记住几个特征即可:变量后缀 % 整型、# 实型、$ 字符串;注释用单引号 ';CAM 底层命令以 @ 结尾(如 view_all@、setlayer@);流程用 if...then、goto 900 数字行标、select case、for..next。

三、Hello World:三种弹窗写法
写法 A:最简 PRINT
print "Hello world !" end
手册里 PRINT 会打开一个带 OK 按钮的消息窗口并暂停宏等待点击,确实就是弹窗。但在部分汉化 / 修改版里,这类消息会被送进界面底部的 System Messages 面板(默认折叠),看起来就像「没反应」。
写法 B:标准消息框 MESSAGE_BOX
message_box "Hello world !", "CAM350 v12.1", INFORMATION, N% if N% = 1 then end
按钮与图标常量:INFORMATION(OK + i 图标)、WARNING、ERROR、OKCANCEL、YESNO、YESNOCANCEL、RETRYCANCEL。返回值 1=OK、2=Cancel、3=Abort、4=Retry、5=Ignore、6=Yes、7=No。注意不同手册里该命令也写作 MessageBox,若报未知命令就换回写法 A 或 C。
写法 C:自定义窗体(最稳,推荐)
OpenForm #1, 34, 6, "CAM350 v12.1", character, OK AddForm #1, 2, 2, "Hello world !", PRINT DisplayForm #1 DeleteForm #1 end
OpenForm 建窗体(编号、宽、高、标题、单位 character / pixel、按钮),AddForm 加标签或控件,DisplayForm 显示并等待用户点击,DeleteForm 卸载。这是实打实的模态窗口,不受 System Messages 面板影响,也是后续做参数输入界面的基础。
补充:PRINT_MSG 与 PRINT 不同 —— 它显示消息但不暂停宏,消息会一直留在屏幕上直到 CLOSE_MSG,做进度提示时通常配 DELAY 1000 使用。
四、怎么运行
把
.scr拷到 CAM350 安装目录的Scripts文件夹(Play 对话框默认就指向这里)。菜单
Macro → Play选中文件;部分 v12.1 版本入口是Tools → Macro → Play,选中后还需点一次「打开」。更推荐
Macro → Assign → Function Keys,把脚本绑到 F2 一键触发。F1~F12 加上 Shift / Ctrl 组合共 34 个可分配键位,比每次选文件快得多。
五、进阶:带参数窗体的冒烟测试脚本
环境刚装好、或者刚换版本时,用一个脚本把宏引擎的主要能力全过一遍,比只跑 Hello World 更有价值。下面这份覆盖 INPUT 输入框、CHOICE 单选、CHECK 复选、formcancel(1) 取消跳转、字符串拼接与连续两个窗体:
pcbno$ = "" mode% = 1 gold% = 0 OpenForm #1, 50, 9, "CAM350 v12.1 smoke test", character, OKCANCEL AddForm #1, 0, 0, "Hello world !", PRINT AddForm #1, 0, 2, "Job no:", INPUT, pcbno$, 20 AddForm #1, 0, 4, "Mode:", CHOICE, mode%, "Route", "V-cut" AddForm #1, 0, 6, "Gold finger", CHECK, gold% DisplayForm #1 if formcancel(1) then goto 900 DeleteForm #1 msg$ = "Hello world ! " + pcbno$ OpenForm #2, 40, 5, "Result", character, OK AddForm #2, 2, 1, msg$, PRINT DisplayForm #2 DeleteForm #2 900 end
能弹出第一个参数窗体、填完点 OK 再弹出带板号的结果窗体,就说明窗体、交互与流程控制都正常,后面写业务宏不必再怀疑环境。

六、实战排错:Macro → Play 完全没反应
本次真实遇到的是:脚本选中后点 Play,界面毫无变化,也没有任何报错。按下面顺序排查,成本从低到高:
最小对照:先跑只有
print+end的两行脚本。两行版也没反应,100% 是文件没被加载,与代码无关。扩展名:在资源管理器看「类型」列,确认不是
.scr.txt。路径与菜单:确认文件在 Scripts 目录、菜单入口正确、选中后点了「打开」;也可以用 Function Keys 绑定绕开菜单差异。
金标准:让软件自己生成一份。
Macro → Record随便录几步再 Stop,用记事本打开 CAM350 生成的 .scr,对照它的换行、编码和首行格式,把自己的代码按同样格式粘进去。这一步能一次判定是加载问题还是语法兼容问题。格式与环境:检查 CRLF / ANSI / 无 BOM;确认有打开的 CAM 文档;查看 System Messages 面板是否被折叠;必要时用
Macro → Debug单步执行。用日志区分「宏没跑」和「窗口没显示」,在脚本最前面加三行:
open "C:\cam_macro_test.txt" for output as #2 print #2, "macro ran" close #2
日志文件出现 ⇒ 宏已执行,只是窗口没显示;没出现 ⇒ 宏根本没被加载,回到第 2、3、4 步。
本次最终结论:以上都排除后,问题出在软件安装本身。连录制的宏都无法正常回放、任何 .scr 都是静默无反应,属于典型的安装损坏。重装 CAM350 v12.1 后宏引擎恢复正常,脚本一行未改即可弹出窗口。所以「宏完全无反应」这件事,除了查脚本格式,也要把安装完整性列进检查项 —— 判断依据很简单:Record 能否正常生成 .scr。
重装会重置安装目录,Scripts 里的脚本会被清空,务必把自写宏单独备份一份。
七、上生产前还要注意
宏回放强依赖层序、板框尺寸、单位、D 码表一致;拼板宏尤其要求工艺边尺寸完全相同,否则整批跑偏。
Gerber / Excellon 的 English / Metric 与 leading / trailing zero suppression 口径不统一,坐标会整体偏移,脚本里先固定单位再操作。
宏里加日志与
FILEEXISTS校验,批量跑之前先用单板验证一遍。若将来升到 14.6:它是 64 位程序,装了 BluePrint-PCB 6.x 后 32 位 Office 会失效,脚本若通过 COM 写 Excel 报表要注意位数。
八、资料排雷:这些「教程」是错的
搜索 CAM350 脚本资料时会遇到大量 AI 生成的拼凑内容,下面几种说法都跑不起来:
| 网传说法 | 判定 |
|---|---|
var / let / const、console.log、function main()、// 注释 | 套了 JavaScript 模板,CAM350 .scr 无此语法 |
用 TCL 脚本 get_polygons 做残铜检测 | CAM350 不提供 TCL 接口 |
M97 宏命令调用 .vbs 做语义比对 | 杜撰 |
ActiveDocument.Layer(...)、支持 JScript、录制产物写成 LAYER:Visible(TOP,1) | 通用 VBScript 模板套壳,非 CAM350 对象模型 |
可信来源只有四个:官方 Release Notes(DownStream Technologies 官网)、安装目录 Scripts 里的示例、Script Editor / camnt95.chm 的帮助文档,以及自己录一段宏 —— 最后这条最可靠。
九、小结
v12.1 的脚本开发起点很低:一个 CRLF、纯 ASCII 的 .scr 文件,五行 OpenForm 就能弹出第一个窗口。真正的门槛不在语法,而在三件事:认清版本对应的脚本体系、守住老解释器的文件格式规范、以及遇到「完全没反应」时有一套从最小对照到安装完整性的排查顺序。跑通弹窗之后,加板边与流程字、按板号选工艺流程、拼板、Gerber 批量导入与层命名、DFM 报告导出,都可以沿着「录制 → 抽参数 → 加日志 → 批量回放」这条链路逐步固化下来。
原创技术稿 · 适用 CAM350 v12.1 · 转载请注明出处



