4. PLC程序版本控制入门

PLC 程序从“单机工程文件”走向“可协作、可追溯、可回滚”的工程资产,第一步就是引入版本控制。Git 是目前最主流、最适合与 CI 流水线衔接的分布式版本控制工具。本节围绕 Git 基础、PLC 仓库结构、分支策略、提交规范以及 PLC 项目文件管理五个要点展开,帮助你把一个 TIA Portal 或 CODESYS 工程真正纳入持续集成体系。

一、核心原理:Git 如何管理 PLC 工程

Git 的核心是“快照 + 内容寻址”。每次提交(commit)都会对当前工作区生成一份快照,并用 SHA-1 哈希值标识。PLC 工程与普通代码工程最大的差异在于:它包含大量二进制文件(如 .ap*、.zap*、.project、.library),这些文件无法像文本源码那样逐行 diff。因此,PLC 版本控制的关键不是“让 Git 理解二进制”,而是“把可读的源文件导出为文本,再交给 Git 管理”。

核心思路:将 PLC 工程导出为可读的源文件(如 TIA 的 .scl、.db、.awl,CODESYS 的 .exp、.xml),让 Git 管理文本,二进制工程文件仅作为构建产物或备份。

二、PLC 仓库结构:分层组织,职责清晰

一个规范的 PLC 仓库不应把所有文件堆在根目录。推荐按“工程源文件 / 硬件配置 / 库 / 文档 / 脚本 / 构建产物”分层组织。下图展示了一个典型的 PLC Git 仓库结构及其与 CI 流水线的衔接关系。

PLC 项目 Git 仓库结构与 CI 衔接 plc-project.git main(稳定发布) develop(集成开发) feature/*(功能分支) 仓库目录结构 📁 src/ — PLC 源文件(SCL/ST/LD) 📁 hw/ — 硬件组态与网络配置 📁 libs/ — 可复用库与 FB/FC 📁 docs/ — 设计文档与接口说明 📁 scripts/ — 导出/构建/校验脚本 📁 build/ — 构建产物(.gitignore) 📄 .gitignore — 忽略二进制与临时文件 📄 .gitattributes — 文本/二进制标记 📄 README.md — 项目说明与构建指引 CI 流水线触发 push / PR → 导出源文件 → 静态检查 → 编译验证 → 单元测试 → 生成构建产物 合并请求 发布合并

三、分支策略:让并行开发不打架

PLC 项目通常由电气工程师、自动化工程师和调试人员共同参与,分支策略必须简单、可执行。推荐采用“主干 + 开发 + 功能”三线模型:

  • main:只存放经过验证、可下装到现场设备的稳定版本,每次合并打 tag(如 v1.2.0)。
  • develop:日常集成分支,所有功能分支先合并到这里,触发 CI 做编译与静态检查。
  • feature/*:每个功能或修复独立分支,命名如 feature/conveyor-interlock、fix/pid-overshoot,完成后通过 Pull Request 合并。
对于小型 PLC 项目,可以简化为 main + feature 两条线;但只要有两人以上协作,就应保留 develop 作为集成缓冲,避免未验证代码直接进入 main。

四、提交规范:让历史可读、可追溯

PLC 程序的提交信息应说明“改了什么、为什么改、影响哪些设备”。推荐使用 Conventional Commits 风格,并结合 PLC 场景扩展类型:

feat(conveyor): 增加急停连锁逻辑
fix(pid): 修正温度回路积分饱和问题
hw(io): 更新 ET200SP 模块地址分配
docs(interface): 补充与 MES 的握手信号表
refactor(fb): 重构电机控制功能块为可复用库
test(safety): 增加安全门监控测试用例

每次提交应尽量小且聚焦。避免把“硬件组态修改 + 逻辑重写 + 注释调整”混在一个提交里,否则回滚时无法精准定位。

五、PLC 项目文件管理:哪些进 Git,哪些不进

这是 PLC 版本控制最容易踩坑的地方。二进制工程文件体积大、无法 diff、频繁变动,如果直接提交,仓库会迅速膨胀且冲突无法解决。正确做法是:文本源文件进 Git,二进制工程文件不进 Git。

文件类型 示例 是否纳入 Git 说明
PLC 源文件 .scl、.st、.awl、.exp ✅ 是 可读文本,支持 diff 与合并
硬件组态导出 .xml、.cfg ✅ 是 文本格式,便于审查变更
库文件 .library、.lib ⚠️ 视情况 若为二进制,建议导出为源文件后再提交
完整工程归档 .zap*、.ap*、.project ❌ 否 二进制、体积大,放入 .gitignore
编译产物 build/、*.hex、*.bin ❌ 否 由 CI 生成,不纳入版本控制
临时文件 *.tmp、*.bak、~$* ❌ 否 编辑器/工程软件自动生成

配套的 .gitignore 示例:

# 二进制工程归档
*.zap*
*.ap*
*.project
*.library

# 编译产物
build/
*.hex
*.bin

# 临时文件
*.tmp
*.bak
~$*

六、常见误区与复盘

  • 误区一:把整个工程文件夹直接 git add . 结果仓库里混入大量二进制和临时文件,首次提交就超过几百 MB。应先用 .gitignore 排除,再只添加源文件目录。
  • 误区二:认为“二进制也能合并”。 Git 对二进制文件只能选择“保留一方”,无法自动合并。必须通过导出文本源文件来获得可合并能力。
  • 误区三:提交信息写“修改”“更新”。 三个月后无人能看懂。应强制使用规范前缀,并在 CI 中增加提交信息格式检查。
  • 误区四:所有人在 main 上直接开发。 一旦有人提交了未验证逻辑,现场下装就会出问题。必须用分支隔离,并通过 PR 审查。
PLC 程序涉及现场设备安全,任何进入 main 的提交都必须经过编译验证和至少一人审查。建议在 CI 中增加“禁止直接 push main”的分支保护规则。

把 Git 用对,PLC 程序才真正具备持续集成的基础。仓库结构决定协作效率,分支策略决定并行能力,提交规范决定追溯质量,而文件管理决定仓库能否长期健康运行。这四者缺一不可。