Попытка заставить Codesys запустить пакетный файл из HMI

Итак, в настоящее время я пытаюсь подобрать этот код, который стажер оставил для этого проекта. У меня есть пакетный файл, который запускается при нажатии и выполняет сценарий powershell, который преобразует сгенерированный файл CSV из собранных данных в файл Excel. Я пытаюсь заставить этот процесс происходить автоматически при нажатии кнопки в HMI, но не знаю, как вызвать пакетный файл в Codesys.

Я пробовал вызывать пакетный файл в разных местах моего кода. Ничто не запустит его при нажатии кнопки.

FUNCTION ScriptExecute 
VAR
    szStdOout : STRING(100);    
    dutResult : sysfile.RTS_IEC_RESULT;
    szCommand: STRING;
END_VAR
szCommand := '/home/cds-apps/PlcLogic/data/ psExecuter.bat';
SysProcess.SysProcessExecuteCommand2(pszCommand:=szCommand, pszStdOut:=szStdOout, udiStdOutLen:= SIZEOF(szStdOout), pResult := ADR(dutResult));

С этим кодом не возникает никаких ошибок, я просто хочу найти способ автоматического запуска командного файла, когда пользователь нажимает определенную кнопку. В настоящее время пользователю придется вручную зайти в проводник и запустить пакетный файл самостоятельно.


person QueenLexi13    schedule 29.08.2019    source источник
comment
FUNCTION ScriptExecute должен вернуть ошибку. Должно быть FUNCTION ScriptExecute : BOOL или что-то в этом роде. На самом деле это должно создать ошибку во время компиляции.   -  person Sergey Romanov    schedule 01.09.2019
comment
Попробуйте добавить свой bat-файл в папку c:\windows\system32 или, что гораздо лучше, добавьте /home/cds-apps/PlcLogic/data/ в PATH, а затем используйте только szCommand := 'psExecuter.bat';, также попробуйте запустить эту команду в терминале и убедитесь, что она работает в терминале.   -  person Sergey Romanov    schedule 01.09.2019


Ответы (1)


Это мой протестированный код с codesys V3 на компьютере с Windows 10:

Часть декларации:

PROGRAM PLC_PRG
VAR
    pRtsIecResult   : POINTER TO SysProcess.RTS_IEC_RESULT;
    bStart          : BOOL;
END_VAR

Часть реализации:

IF bStart 
THEN

    bStart := FALSE;

    SysProcess.SysProcessCreate2(
        pszApplication  := 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe',
        pszCommandLine  := '-executionpolicy remotesigned -File C:\Users\fboid\Desktop\HelloWorld.ps1',
        ulFlags         := SysProcess.SYSPROCESS_CREATEFLAG_INTERACTIVE,
        pResult         := pRtsIecResult
    );

END_IF

Как видите, я использовал функцию SysProcessCreate2 библиотеки SysProcess. Поскольку функции библиотеки SysProcess зависят от операционной системы, они могут работать не на всех платформах.

Сценарий powershell, который я выполнил, был очень простым:

Write-Host 'Hello World!'
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
person Filippo Boido    schedule 30.08.2019
comment
Разноса не заметил, но он вроде ни на что не влияет. И все это выполняется на окнах. Итак, с помощью SysProcessCreate я смогу запустить этот внешний файл ванны через ЧМИ Codesys при нажатии кнопки? - person QueenLexi13; 30.08.2019
comment
Я думал, что вы используете Linux из-за пути с /home и из-за того, что SysProcessExecuteCommand2 используется в Linux. - person Filippo Boido; 30.08.2019
comment
Благодарю вас! Это код из работы другого стажера, а он большой фанат Linux, может быть поэтому. Я знаком только с окнами. Когда я пробую код, который вы предоставили, я получаю всевозможные ошибки. RTS_HANDLE, кажется, не существует, значит ли это, что мне не хватает библиотеки? - person QueenLexi13; 30.08.2019
comment
Да, вам нужно вставить библиотеку SysProcess в ваш проект. - person Filippo Boido; 31.08.2019
comment
Ваш пример кода на С++, но @QueenLexi13 спросил на ST. Возможно, вам пришлось объяснить, что вы хотите создать библиотеку функциональных блоков на основе C++, которую затем можно использовать в ST, и как все это сделать. - person Sergey Romanov; 01.09.2019
comment
В старой документации это задокументировано так. Новую искать было некогда (Наверное, это еще та же нотация). В библиотеке SysProcess у вас нет, например, char *pszApplication, но есть ссылка на String.. - person Filippo Boido; 02.09.2019
comment
Итак, после написания кода для SysProcessCreate мне также нужен SysProcess Execute? Или SysProcessCreate также должен запускать пакетный файл для сценария? - person QueenLexi13; 06.09.2019
comment
Я обновил ответ и вставил рабочий пример. - person Filippo Boido; 07.09.2019