Я пытаюсь создать автоматический установщик для ПЛК на базе WinCE7 с очень медленным процессором и картой памяти (CX9020). Установщик будет работать на ПК с Windows Server 2019, подключенном к ПЛК. Чтобы установить новую версию, я хочу скопировать содержимое загрузочной папки поверх существующей, а затем перезапустить TwinCAT.
Я не могу использовать SMB, поскольку Windows Server2019 не полностью поддерживает SMB1, и я не хочу делать его менее безопасным, принудительно используя SMB1. WinCE не поддерживает SMB2 и SMB3. Я не могу использовать встроенный FTP, поскольку он не может копировать большие файлы (тайм-аут) или небольшие пустые файлы.
Я знаю, что Beckhoff использует протокол ADS для активации конфигурации, и он копирует загрузочную папку в ПЛК, когда я использую для этого Visual Studio (VS). На ПК, на котором выполняется обновление ПЛК, не должно быть установлено VS или исходный код ПЛК. Есть ли способ сделать это, как Beckhoff, и скопировать загрузочную папку в ПЛК без использования VS?
Я пытался изменить тайм-аут FTP, но не нашел способа сделать это. Но даже если мне это удастся, у FTP есть и другие ограничения.





Beckhoff включает модуль PowerShell как часть установки TwinCAT. Полную документацию можно найти в этом файле - Модуль Twincat ADS
# 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
}