代码之家  ›  专栏  ›  技术社区  ›  Ilya Dan

如何成功地将文件复制到运行WinCE7的Beckhoff PLC?

  •  1
  • Ilya Dan  · 技术社区  · 2 年前

    我试图创建一个基于WinCE7的PLC的自动安装程序,该软件具有非常慢的处理器和存储卡(CX9020)。安装程序将在连接到PLC的Windows Server 2019 PC上运行。要安装新版本,我想将启动文件夹内容复制到现有版本上,然后重新启动TwinCAT。

    我不能使用SMB,因为Windows Server2019不完全支持SMB1,我不想通过强制使用SMB1来降低它的安全性。WinCE不支持SMB2或SMB3。 我不能使用内置的FTP,因为它无法复制大文件(超时)或小的空文件。

    我知道Beckhoff使用ADS协议来激活配置,当我使用visual studio(VS)来激活配置时,它确实会将引导文件夹复制到PLC。升级PLC的PC不应具有VS或PLC的源代码。 有没有办法像Beckhoff一样,在不使用VS的情况下将引导文件夹复制到PLC?

    我试图更改FTP的超时,但没有找到任何方法。但即使我成功了,FTP也有其他限制。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Josh Hyde    2 年前

    Beckhoff将PowerShell模块作为TwinCAT安装的一部分。完整的文档可在此文件中找到- Twincat ADS Module

    # Import the TwinCAT ADS module
    $originalpaths = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PSModulePath).PSModulePath
    $newPath = $originalpaths + ';C:\TwinCAT\AdsApi\Powershell'
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PSModulePath -Value $newPath
    $env:PSModulePath = [System.Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
    
    # Check if the module was imported
    if (-not (Get-Module TcXaeMgmt -listavailable)) { Throw 'The Twincat ADS module was not found!' }
    

    然后必须生成一个要复制的文件列表。

    $variant = 'Put your variant here'
    $source = '$PSScriptRoot + "\$variant"'
    $plcFiles = Get-ChildItem -Path $source -Recurse -Force -File
    

    设置目标路径。

    # Windows 10
    $destination = '\TwinCAT\3.1\Boot'
    # Windows CE
    $destination = '\Hard Disk\TwinCAT\3.1\Boot'
    

    遍历列表并复制每个文件。

     # Upload the files
        foreach ($file in $plcFiles) {
            Copy-AdsFile -Path $file.FullName -SessionId $session.Id -Destination   $file.FullName.Replace($source, $destination) -Force -Upload
        }
    
    推荐文章