You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何为TwinCAT3 PLC项目编写CI脚本实现构建、激活与运行?

TwinCAT3 PLC项目CI环境程序化操作方案

要实现TwinCAT3 PLC项目的CI流程,可通过Python调用Beckhoff官方命令行工具(TcCmd或TcXaeShell)完成构建、激活、模式切换操作,再结合pytest执行外部测试。以下是具体实现步骤:

依赖准备

CI环境需提前安装:

  • TwinCAT3 Runtime(或完整开发环境)
  • TcCmd(独立命令行工具,推荐用于CI场景)
  • Python及依赖库:subprocess(内置)、pytestpyads(用于PLC变量交互测试)

1. 构建解决方案

使用TcCmd的build命令编译TwinCAT解决方案,Python通过subprocess调用该命令并校验执行结果:

import subprocess
import sys

def build_twincat_solution(solution_path):
    # 执行解决方案构建,可指定配置(Release/Debug)
    cmd = ["TcCmd", "build", solution_path, "--configuration", "Release"]
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print("构建日志:\n", result.stdout)
    except subprocess.CalledProcessError as e:
        print("构建失败:\n", e.stderr)
        sys.exit(1)

2. 激活配置并上传PLC程序

通过TcCmd的activate命令完成配置激活与程序上传,支持本地或远程PLC:

def activate_plc_config(plc_ip="localhost"):
    # --upload 参数强制上传程序,--force 跳过确认提示
    cmd = ["TcCmd", "activate", "--target", plc_ip, "--upload", "--force"]
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print("激活日志:\n", result.stdout)
    except subprocess.CalledProcessError as e:
        print("激活失败:\n", e.stderr)
        sys.exit(1)

3. 切换TwinCAT至运行模式

使用TcCmd的mode命令将TwinCAT Runtime切换为运行模式:

def set_twincat_run_mode(plc_ip="localhost"):
    cmd = ["TcCmd", "mode", "Run", "--target", plc_ip]
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print("模式切换日志:\n", result.stdout)
    except subprocess.CalledProcessError as e:
        print("模式切换失败:\n", e.stderr)
        sys.exit(1)

整合CI流程与pytest测试

通过pytest的全局fixture在测试前自动完成环境准备,随后执行PLC外部测试:

import pytest
import pyads

@pytest.fixture(scope="session", autouse=True)
def setup_twincat_env():
    # 替换为你的TwinCAT解决方案路径
    solution_path = r"C:\CI_Projects\MyTcProject\MyTcProject.sln"
    build_twincat_solution(solution_path)
    activate_plc_config()
    set_twincat_run_mode()
    print("=== TwinCAT环境准备完成,开始执行测试 ===")

def test_plc_variable_initial_state():
    # 示例:通过ADS协议读取PLC变量,验证初始状态
    plc_conn = pyads.Connection("127.0.0.1", pyads.PORT_TC3PLC1)
    plc_conn.open()
    try:
        var_value = plc_conn.read_by_name("MAIN.InitialValue", pyads.PLCTYPE_INT)
        assert var_value == 0, "PLC初始变量值不符合预期"
    finally:
        plc_conn.close()

关键注意事项

  • CI环境需以管理员权限运行,因为TwinCAT模式切换、配置激活需要系统权限
  • 远程PLC需确保网络连通,且已配置ADS通信权限
  • 可通过环境变量传递解决方案路径、PLC IP等参数,提升脚本通用性
  • 建议添加超时处理与日志捕获,便于CI流程故障排查

内容的提问来源于stack exchange,提问作者Roberto

火山引擎 最新活动