☰
TwinCAT 3 AdsGitServer版本管理与协同踩坑指南
2026/10/28 3:54:55 网站建设 项目流程

简介:《TwinCAT 3 AdsGitServer的使用.pdf》面向使用Beckhoff TwinCAT 3开展PLC开发的自动化工程师及协同开发团队,聚焦3.1.4024版本起集成于开发环境的Git功能,帮助读者理解如何将控制器作为Git Server,在不依赖外部Git客户端的情况下完成PLC程序版本管理。文档围绕Multiuser启用、Git Server初始化、提交与拉取、版本差异比较、历史版本回退等操作展开,并覆盖第二台PC从控制器装载不同版本PLC程序、上传源程序以及初始化失败、双版本提交冲突等排错场景,兼顾基础配置与团队协作实践。资源包共1个PDF文件,大小约1.77MB,篇幅紧凑,便于对照实验环境逐节查阅。已有373人学习下载,可作为TwinCAT版本控制入门、协同开发流程梳理和现场问题排查的参考资料。

1. 先别急着装 Git:TwinCAT 3.1.4024.15 的 AdsGitServer 是个版本坑

TwinCAT 3 AdsGitServer 这个名字很容易让人误以为要在开发机上另装一套 Git,我第一次按外部 Git 的思路准备环境时,就在版本上翻了车。它其实是 TwinCAT 3.1.4024 集成的 Mini Git Server,控制器就是仓库端,开发环境里直接提交、取版本、看差异。版本不对时,服务列表里根本看不到 TwinCAT3 AdsGitServer,Multiuser Explorer 也连不上仓库。这个场景在单机改 PLC 程序时感知不强,一旦第二台 PC 要同步、要回退,装错版本就会把项目拖进“代码到底哪版对”的黑匣子。适合正在用 TwinCAT 3.1.4024.15 做 PLC 协同开发、又不想额外维护一套 Git 服务的自动化工程师。

2. 准备与安装:TC31-FULL-Setup 与 XAR 端的服务检查

这套环境最容易出问题的地方不是点“安装”,而是版本、硬件和安装端三件事没有对齐。开发 PC 装的是 XAE,控制器装的是 XAR,两个安装包名字只差几个字母,装反了或者只装一边,后面 Multiuser Explorer 里的 ADS Route 能看见控制器,但 Git 仓库就是起不来。我一般会先把控制器切到 Config 模式,备份当前 PLC 项目,再动安装包,这样即使服务起不来也有后悔药。

2.1 版本和硬件先对齐,别拿第三方 PC 硬上

输入资料里给的实测环境是控制器 Windows 7 Embedded、TwinCAT 3.1.4024.15,开发 PC1 和 PC2 都是 Windows 10、TwinCAT 3.1 Build 4024.15。手册没有把硬件卡得很死,但实测结论很直接:控制器尽量用与 TwinCAT 配套的 IPC/EPC,第三方 PC 上总会出现驱动、路由或服务方面的问题。开发端和控制器端最好保持 XAE 与 XAR 同版本,Build 越高越好,不要一个 4024.15、一个 4024.10 硬凑。

角色操作系统TwinCAT 版本安装包说明
控制器Windows 7 / 10XAR 3.1.4024.15 或以上TC31-XAR-Setup.3.1.4024.15.exe提供 AdsGitServer 仓库端
开发 PC1Windows 10XAE 3.1.4024.15TC31-FULL-Setup.3.1.4024.15.exe编程、提交、比较
开发 PC2Windows 10XAE 3.1.4024.15TC31-FULL-Setup.3.1.4024.15.exe协同测试、装载远程版本

TwinCAT 3 AdsGitServer 和标准 Git 的差别也要提前认清:它包含在 TC3.1.4024 安装包里,不需要单独下载 Git 安装包;控制器要求 XAR 4024.15、Windows 7/10;开发环境要求 XAE 4024.15、Windows 7/10;版本追踪支持,PLC 代码对比能集成 TwinCAT Project Compare,以 TC3 PLC 编程环境方式比较。标准 Git 做不到 PLC 代码的 XML 级比较,这一点在选型时别抱错期待。

提示:控制器硬件和开发 PC 的版本表先抄下来,后面加路由、查服务、看仓库路径都要用。版本不一致时,先升到同一 Build,再排查其它问题。

2.2 安装包落地:开发 PC 装 FULL,控制器装 XAR

安装动作本身不复杂,关键是端别装错。开发 PC 上运行TC31-FULL-Setup.3.1.4024.15.exe,控制器上运行TC31-XAR-Setup.3.1.4024.15.exe。FULL 包带开发环境,XAR 包带运行端,AdsGitServer 随对应安装包自动安装,不需要再找单独的 Git Server 安装程序。安装完成后重启,服务列表里应该能看到 TwinCAT 3 System Service 和 TwinCAT3 AdsGitServer。

# 开发 PC 和控制器上都可执行,确认两个服务处于 Running Get-Service | Where-Object { $_.Name -match 'TwinCAT 3 System Service|TwinCAT3 AdsGitServer' } | Select-Object Name, Status, StartType

这段命令只做一件事:把名字里带 TwinCAT 系统服务和 AdsGitServer 的条目筛出来,看Status是不是Running,StartType是不是自动。如果服务名匹配不到,先用Get-Service *TwinCAT*看完整服务名,再按实际名字启动。控制器上如果只有系统服务、没有 AdsGitServer,优先回看 XAR 安装包版本是不是 3.1.4024.15 或以上,而不是急着去改防火墙。

安装完成后不要直接进 PLC 项目提交。先在控制器上确认服务状态,再在开发 PC 上打开 TwinCAT XAE,看工具菜单里能不能正常进入选项设置。服务没起来时,后面的 Init local and Remote 会表现为无响应、报错或者仓库 URL 空白,很容易被误判成项目属性问题。

2.3 加路由和确认两个服务

路由是 AdsGitServer 的通信入口。控制器和开发 PC 要在可互通网段,开发 PC 的 TwinCAT 路由编辑器里添加控制器 IP 和 AMS NetId,添加时再次确认控制器操作系统是 Windows 7 或 Windows 10、TwinCAT 版本是 3.1.4024.15 或以上。路由加好后,Multiuser Explorer 的 ADS Route 下拉框里应该能选到目标控制器;选不到时,先回路由编辑器看状态,不要直接去点 Init。

服务存在但没运行时,可以在管理员 PowerShell 里手动拉起:

# 服务存在但未运行时,先启动再观察是否自动停止 Start-Service -Name "TwinCAT3 AdsGitServer" Start-Service -Name "TwinCAT 3 System Service" Get-Service -Name "TwinCAT3 AdsGitServer", "TwinCAT 3 System Service" | Select-Object Name, Status, StartType

Start-Service只是把当前服务拉起来,Get-Service用来确认启动后没有立刻退出。如果启动后几秒又变成Stopped,常见原因是安装包端不对、控制器系统版本不满足,或者安装后没有重启。我一般会把StartType设成自动,避免下次重启控制器后还要手动补一次。

路由和服务都正常后,再做一次小验证:在开发 PC 上打开 TwinCAT XAE,从视图菜单进入 Multiuser Explorer,看 ADS Route 能不能列出控制器。能列出但仓库下拉框为空,属于仓库名还没填;完全列不出控制器,才是路由或服务问题。这个顺序能少走很多弯路。

3. TwinCAT 环境配置:源码管理选 Git 与 Project Compare 插件

安装只解决“服务在不在”,环境配置才决定“版本比较能不能看”。TwinCAT 里有两个设置特别容易被跳过:一是源代码管理插件要选 Git,二是 TwinCAT Project Compare 要导出 Git 插件配置。少做一步,History 里能看到版本号,但双击红色 POU 时打不开分屏代码,或者比较时打开的不是 Git Server 上存的源代码。

3.1 工具选项里把源代码管理切到 Git

从主菜单进入 Tools -> Options,找到 Source Code Control 设置界面,把源代码管理使用的插件选为 Git。这个选项不是装饰项:只有选 Git,后续版本比较时才会打开 Git Server 上存的源代码,并用集成的 TwinCAT 3.1 Project Compare Tool 界面显示和比较。选成 None 或其它插件,History 界面可能仍然能列出提交记录,但 Compare 的行为会不对。

操作顺序可以按下面走:

  1. 打开 TwinCAT XAE,进入 Tools -> Options。
  2. 找到 Source Code Control,把插件切到 Git。
  3. 点确定后关闭并重新打开 XAE,让插件配置生效。
  4. 新建或打开一个 PLC 项目,确认 Multiuser Explorer 能正常打开。

这一步的原理不复杂:AdsGitServer 把控制器作为 Git Server,开发 PC 通过 ADS 通道读写仓库;TwinCAT 的版本比较工具需要知道“当前用哪个版本控制插件”,才会去 Git 仓库取对应版本的文件。插件选错时,History 里的版本号还在,但比较工具拿不到正确的源文件,表现就像是“历史版本丢了”。

3.2 TwinCAT Project Compare 的用户工具配置

Project Compare 的配置入口不在 XAE 主菜单里,而是从编程 PC 的 TC3 图标点 Tool,选择 TwinCAT Project Compare,打开比较工具后再进主菜单 Tool -> Configure User Tools。这里要做的是 Export Configuration,选择 Git 插件,启用默认的全局 git 配置。输入资料里把这个动作放在环境设置里,实际装的时候很容易漏,漏了之后最典型的症状是:History 能看,Compare 也能弹窗,但红色 POU 双击没有分屏代码。

操作顺序:

  1. 从 TC3 图标进入 Tool -> TwinCAT Project Compare。
  2. 在比较工具主菜单选择 Tool -> Configure User Tools。
  3. 点击 Export Configuration。
  4. 选择 Git 插件,启用默认的全局 git 配置。
  5. 关闭比较工具再重新打开,拿一个已有历史版本的项目试一次 Compare。

这里没有需要手写配置文件的地方,重点是“导出配置”这个动作要把 Git 插件带进去。导出后,比较工具才知道去哪个 Git 上下文里取版本。配置完成后,History 里选中一项或两项,右键 Compare,只选一项表示该项与当前版本比较,选两项表示两项之间比较。差异分新增、删除和逻辑修改,不同处红色标记,双击红色 POU 能看到分屏代码。

3.3 启用 Multiuser 前后的项目属性差异

PLC 项目要进入 AdsGitServer 管理,先在项目属性里启用 Multiuser。新建 TwinCAT 项目、添加 PLC 程序后,打开 PLC 程序属性,找到 Multiuser 相关开关并启用。现有 PLC 项目也可以做版本管理,前提是知道控制器上的版本仓库名称,然后从 Multiuser Explorer 的 Multiuser Repository 下拉菜单里选择已有仓库。这里有一个顺序要求:在激活配置下载之前就进行 Git Server 初始化,不要等程序已经下载运行了再回头补。

启用前后差异可以对照下面这张表:

观察点未启用 Multiuser启用 Multiuser 并初始化后
项目属性普通 PLC 项目带 Multiuser 标记,关联 ADS Route 和仓库
Login 行为直接下载运行每次 Login 可能要求填写 Update Message
本地项目目录普通项目文件增加 Git 相关元数据,含.git目录和配套文件
控制器仓库无对应仓库默认仓库路径下生成以仓库名命名的文件夹
History无版本记录按提交信息生成线性历史

控制器上的默认版本仓库路径位于公共数据目录下,末级文件夹是MultiuserRepository。不同安装环境里公共数据目录名可能不同,实际排查时按安装后的目录定位,不要照抄占位路径。仓库名就是初始化时在 Multiuser Repository 里填的字符串,后面第二台 PC 同步时也要靠这个名称找仓库。

注意:现有项目如果已经知道控制器仓库名,可以从下拉菜单直接选;不知道仓库名时,不要乱建同名仓库,先到控制器公共数据目录下看MultiuserRepository里已有的文件夹名。

4. 初始化与版本提交:Multiuser Explorer 里的 Init 和 History

初始化是这套环境的分水岭。Init 成功之前,项目只是普通 PLC 项目;Init 成功之后,控制器上多一个版本仓库,开发 PC 项目里多一套 Git 元数据,之后每次 Login 时 TwinCAT 3.1/Boot 的内容变化都会引起仓库 Objects 文件夹更新。很多人第一次失败不是命令不会点,而是本地或控制器上残留了上一次的 Git 设置,Init 看着点了,实际没有创建出干净仓库。

4.1 Init local and Remote 到底创建了什么

从主菜单 View -> Other Windows -> Multiuser Explorer 打开 Git 控制面板。先选 ADS Route,再填 Multiuser Repository 名称,点 Init local and Remote。正常情况下会弹出要求输入 Update Message 的窗体,这是第一次向控制器上传程序,填Init即可。初始化成功后,界面上的 ADS Route 和 Multiuser Repository 会变成不可改动状态,这是正常现象,说明当前项目已经绑定到该控制器仓库。

# 在控制器上查看默认版本仓库目录,路径中的公共数据目录按实际安装替换 $repoRoot = "C:\ProgramData\<厂商公共数据目录>\MultiuserRepository" Get-ChildItem -Force $repoRoot | Select-Object Name, Mode, LastWriteTime

这段命令用来确认控制器仓库根目录是否存在、初始化时填的仓库名有没有生成对应文件夹。<厂商公共数据目录>是占位,实际以安装后的公共数据目录为准;Get-ChildItem -Force会连隐藏项一起列出。仓库根目录不必每次清空,之前项目的仓库将来还可能使用;要清理的是当前项目的绑定关系和控制器 Boot 残留。

本地 PLC 项目路径下也会增加 Git 相关的 3 个文件和 1 个文件夹。这个变化可以用来判断 Init 是否真的落到了本地:

# 在 PLC 项目根目录执行,确认本地是否生成 Git 元数据 Get-ChildItem -Force | Where-Object { $_.Name -match '^\.git' } | Select-Object Name, Mode, LastWriteTime

^\.git匹配的是以.git开头的条目,通常能看到.git目录和配套文件。看不到时,先不要反复点 Init,回到 Multiuser Explorer 看 Status 里 Local 和 Remote 的状态。Status 和 Conflict 界面里的 Local 指开发 PC 上的项目文件夹,Remote 指控制器上的版本仓库文件夹,这两个概念后面判断冲突时一直要用。

Multiuser Repository url 空白是常见现象:选择 ADS Route 后,对于新的 PLC 项目,填写仓库名称,url 一般会自动生成;没有自动生成时,删一个字符再重新加上,url 就会刷新。这个名称就是将来控制器上的版本仓库文件夹名称,不要随便改来改去。现有 PLC 项目如果已知仓库名,直接从下拉菜单选,不要新建一个近似名字。

4.2 提交两个版本并看懂 History 比较

控制器上的 Git Server 开始工作后,每次 Login 控制器都会要求提交 Update 信息。Init 本身会产生一次初始提交,后面再提交两个业务版本,History 里就能看到清晰的线性记录。输入资料里的示例是第二次提交填V1.0 First Code,新建变量 x,代码写x:=x+1;;第三次提交填V1.0.1 Change Data,修改递增步长,代码改成x:=x+2;。

// V1.0 First Code:新建变量 x,步长为 1 x := x + 1;
// V1.0.1 Change Data:修改递增步长,步长改为 2 x := x + 2;

这两段 ST 代码只是用来制造可比较的差异,重点不在业务逻辑,而在 Update Message 和代码变化要对应。第一次填Init,第二次填V1.0 First Code,第三次填V1.0.1 Change Data,版本号建议按“主版本.次版本.修订号 + 简短说明”写,后面 History 里一眼能看出哪次改了什么。Update Message 不是备注,它会成为 History 里的版本标题,写“test”“111”后面根本没法回溯。

提交完成后,在 Multiuser Explorer 的 History 界面点 Show History,能看到所有历史版本。选中一项右键 Compare 表示该项与当前版本比较,选中两项表示两项之间比较。差异分新增、删除和逻辑修改,不同处红色标记;双击某个红色 POU,可以显示分屏代码。这个比较界面依赖前面配置的 Git 插件和 Project Compare 用户工具,配置漏了就会出现“能看历史、不能看代码”的半吊子状态。

4.3 回退与用历史版本改当前代码

历史版本不只是用来看。项目比较界面里选中某处不同,点感叹号上方的 Accept Single、Accept Block 或 Accept All,可以把历史版本中的部分内容接回当前 PLC 程序。Accept Single 接单处,Accept Block 接一块,Accept All 接全部。这个动作适合“旧版本里有一段逻辑是对的,但当前版本不能整体回退”的场景,比重写代码稳。

整体恢复则用 Get this version。在项目比较界面右键选择 Get this version,开发 PC 的当前 PLC 项目会恢复至该版本。系统会提示File has been changed outside the enviroment. Reload the new file?,这里的 outside 指 Compare Tool 从 Git Server 获取了旧版本代码并修改了项目的 POU 文件。Reload 只是装载回来看看,无论是否点 Reload,代码都已经改变。

提示:Get this version 之前先把当前项目复制一份,尤其是控制器还在运行、现场还在调试的时候。回退动作改的是开发 PC 项目文件,不是控制器里的运行程序,但项目文件被覆盖后同样需要时间恢复。

4.4 非 TwinCAT 文件的版本管理边界

非 TwinCAT 文件的版本管理不是 AdsGitServer 能处理的问题,非代码类文件管理甚至也不是 Git 技术最擅长的部分。PLC 项目文件夹里除了代码,还可能有程序说明、设备操作说明等文档,这些文件 TwinCAT 没办法管理,需要标准 Git 工具。对单个工程师的基本工作存档,如果对 Git 命令不熟,也没有在远程代码托管平台建账号,可以借助常规 IDE 的团队资源管理器可视化界面做本地存储操作。

# 在需要做本地版本管理的文档文件夹中执行,不要对 PLC 项目文件夹执行 git init git add . git commit -m "V1.0.1 2021.06.07" git log --oneline git reset --hard HEAD^

git init只用于非 PLC 项目文件夹,git add .把文档加入暂存区,git commit生成本地版本,git log --oneline看版本列表,git reset --hard HEAD^回退到上一个版本。最后这条会覆盖工作区,执行前先备份。非代码类文件在标准 Git 里可以看版本、可以回退,但无法像 TwinCAT PLC 那样做代码级比较、合并和回退;在 TwinCAT 3 XAE 里也看不到非 TwinCAT 文件的历史版本。这个边界要提前说清,别把文档版本管理硬塞进 Multiuser 仓库。

5. 多机协同与排查:第二台 PC 装载、冲突状态和五条踩坑记录

两台 PC 先后向同一个控制器提交版本,才是 AdsGitServer 真正要解决的场景,也是翻车最集中的地方。第一台 PC 本地有项目、控制器上有仓库;第二台 PC 如果直接拿一份旧项目去 Login,Status 里就会出现 Local 和 Remote 不一致。搞不清红色、绿色和LocalsBehindRemote的含义,就容易把远程新版本覆盖掉。这一章把第二台 PC 的同步流程和五条踩坑记录放在一起。

5.1 第二台 PC 如何从控制器同步仓库

第二台笔记本同样安装 TC3.1.4024.15,启动 TwinCAT XAE,并添加到控制器的路由。第一步是拿到与 PLC 中正在运行的程序名一致的项目:可以从第一台 PC 复制项目文件过来,也可以从控制器读取 TwinCAT 项目。能不能读取 PLC 源代码不要紧,因为第一台 PC 可能并没有下载源代码;这一步的主要目的是让项目名对得上。

接下来打开 Multiuser Explorer,从 ADS Routes 里选择控制器,从 Multiuser Repository 下拉菜单中选择目标仓库。点 Init Local and Remote,系统会提示 Remote 中已经存在数据仓库,要不要读取,回复 Yes。这个过程会把控制器上的版本仓库同步到第二台笔记本,然后就可以按第一台 PC 的步骤继续编程和调试。注意这里不是新建仓库,而是“绑定已有远程仓库并同步”。

同步完成后,从 History 中装载当前版本,再提交两个版本。第一次提交填V2.0 Change Para,修改递增步长,代码改为x:=x+10;;第二次提交填V2.0.1 Second Code,新建变量 y,增加代码y:=2*x;。History 里应该能看到第一台 PC 生成的两个版本,以及第二台 PC 生成的两个版本。

// V2.0 Change Para:第二台 PC 修改步长 x := x + 10;
// V2.0.1 Second Code:第二台 PC 新增变量 y x := x + 10; y := 2 * x;

这两段代码的变量名和步长是输入资料里的测试用例,实际项目替换成自己的逻辑即可。关键是提交信息要能区分“谁在哪个版本改了什么”,不要两台 PC 都写“修改”。History 是线性结构,版本标题写清楚,后面第一台 PC 拉取最新版本时才能判断该取哪一个。

5.2 Status 与 Conflict 的状态判断

第一台 PC 再次打开 Multiuser Explorer 查看 History,会发现 Local 和 Remote 不一致。红色项通常是 Remote 新增的版本,绿色项是当前 PC 保存的最新版本。颜色可能因界面主题有差异,最终以文字状态为准。进入 Status 界面,如果提示LocalsBehindRemote,意思是本地程序版本比控制器上旧;进入 Conflict 界面,会提示本地丢失了远程若干次修改。

界面或提示含义建议动作
History 红色项Remote 新增版本先 Compare 看差异,再决定是否 Get This Version
History 绿色项当前 PC 保存的最新版本不要误当成远程最新版
Status: LocalsBehindRemote本地比控制器旧Get Latest 或选目标远程版本
Conflict: 本地丢失远程修改本地未包含远程提交备份项目后 Accept 或 Get This Version
File has been changed outsideCompare Tool 已改 POU确认后 Reload,或拒绝本次装载

点 Get Latest 时,系统会提示程序从外部改动了,并提示与当前代码的区别。这个提示不是故障,而是 Compare Tool 从 Git Server 取版本后修改了本地 POU 文件。可以点 Accept 接受,也可以拒绝;关闭窗口不等于代码没变,之前已经改过的文件仍然要按实际状态处理。要装载最新 Remote 版本V2.0.1,在 History 里选中该版本,右键 Get This Version,系统提示代码从外部改变,选“是”,就能得到第二台 PC 上编辑的最新代码。

注意:Multiuser 文档没有展开讲用户授权,但 ADS 通道本身支持 CA、PSK 和用户名/密码等安全方式。测试环境图省事可以无加密,正式多人协同要把授权访问补上,别把测试配置直接搬到现场。

多人同时开发一个 PLC 程序的不同部分时,所有开发人员对分工、代码编辑、上传、下载要提前约定。否则 History 可能变成一团乱麻,最后还不如人工合并。单人开发时线性历史很清晰,按时间顺序就能回忆起修改理由;多人协同则要把“谁先提交、谁后拉取、冲突谁处理”写成规则。

5.3 五条踩坑记录:现象、原因、解决

坑一:Init 创建失败,界面无反应或直接报错。现象是点 Init local and Remote 后没有生成仓库,或者提示创建失败。原因通常是控制器侧或开发 PC 侧残留了以前的 Git 设置:控制器 TwinCAT/3.1/Boot 里还有旧项目内容,本地 PLC 项目下还留着旧的 Git 元数据,或者仓库名与已有仓库冲突。解决时先把 Local 和 Remote 清掉,控制器 TwinCAT/3.1/Boot 文件清空并重启;本地项目先备份,再手动删除项目下的.git目录和配套 Git 文件,然后重新 Init。控制器上的MultiuserRepository内容不必清空,将来还可以使用。如果要在现有控制器上运行完全另一个 PLC 项目,又要做版本控制,最好提前清空 Boot 文件夹并重启控制器,消除之前版本控制对新项目的影响。

# 先备份整个 PLC 项目,再清理本地 Git 元数据;项目名按实际替换 Copy-Item -Recurse -Force .\MyPlcProject .\MyPlcProject_backup Remove-Item - <p> <a href="https://download.csdn.net/download/tjcu_cc/33160399" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询