Simulink ® PLC Coder™ в настоящее время поддерживает целевые IDE на основе плагинов, такие как Selectron CAP1131, Omron Sysmac Studio и так далее. Для пользовательских целевых IDE на основе плагина, которые не поддерживаются, создайте структурированный текстовый код, совместимый с PLCOpen XML или ASCII. Настройте созданный код в соответствии с целевыми требованиями среды IDE, используя возможности встроенного плагина в кодере Simulink PLC.
Чтобы создать код для пользовательских целевых IDE на основе плагинов:

Следуйте блок-схеме для создания plc_custom_ide.m и при необходимости plc_precg_callback_IDEname.m, и plc_postcg_callback_IDEname.m файлы. Сведения об использовании этих файлов для создания и создания кода пользовательской целевой среды IDE см. в разделе Создание кода с помощью подключаемой целевой среды IDE.
plc_custom_ide.m файлСоздать plc_custom_ide.m с помощью этого шаблона:
function plc_ide_list = plc_custom_ide % Copyright 2012-2021 The MathWorks, Inc. plc_ide_list(1) = get_ide_info_myplcopen; end function ide_info = get_ide_info_myplcopen ide_info.name = 'myplcopen'; ide_info.description = 'My PLCopen XML'; ide_info.path = ''; % IDE path ide_info.format = 'xml'; % generic|xml ide_info.fileExtension = 'xml'; ide_info.cfg = get_ide_cfg_myplcopen; ide_info.precg_callback = 'plc_precg_callback_myplcopen'; ide_info.postcg_callback = 'plc_postcg_callback_myplcopen'; ide_info.xmltree_callback = PLCCoder.PLCCGMgr.PLC_PLUGIN_CG_CALLBACK_EMPTY; ide_info.pluginVersion = 2.2; ide_info.compatibleBuildVersion = 1.6; end function cfg = get_ide_cfg_myplcopen cfg.fConvertDoubleToSingle = true; cfg.fConvertNamedConstantToInteger = true; cfg.fConvertEnumToInteger = true; cfg.fConvertOutputInitValueToAssignment = true; cfg.fConvertTunableParamToInputVariable = true; cfg.fSimplifyFunctionCallExpr = true; cfg.fConvertOutputInitValueToAssignment = true; end
Задайте имя целевой среды IDE с помощью ide_info.name. В параметре конфигурации целевой среды IDE отображается имя, установленное в ide_info.description.
Если целевая среда IDE соответствует общим стандартам ST, установите ide_info.format = 'generic'. Если целевая среда IDE совместима с XML PLCOpen, установите ide_info.format = 'xml'.
Укажите, где размещаются созданные файлы кода с помощью ide_info.path.
Задайте расширение для целевых файлов IDE с помощью ide_info.fileExtension.
В function_cfg в разделе файла задайте параметры плагина. Чтобы включить подключаемый модуль, установите параметр подключаемого модуля в значение true. Например, cfg.fArrayInitialValueBrackets = true; включает подключаемый модуль. Чтобы отключить подключаемый модуль, установите для параметра plugin значение false. Чтобы решить, какие варианты плагина вам нужны в plc_custom_ide.m см. раздел Параметры подключаемого модуля.
Если пользовательская среда IDE требует обработки до и после создания кода, создайте plc_precg_callback_IDEname.m и plc_postcg_callback_IDEname.m файлы.
Предварительная обработка файла обратного вызова. plc_precg_callback_IDEname.m обеспечивает доступ к промежуточному сформированному кодовому представлению. Промежуточный код хранится в controller тип данных struct, который содержит такую информацию, как имя блока подсистемы, входы, выходы, сгенерированное тело кода и так далее. Этот обратный вызов выполняется перед вызовом целевой функции эмиттера. Создание plc_precg_callback_IDEname.m используйте этот шаблон:
function controller = plc_precg_callback_myplcopen(controller) % Copyright 2012-2020 The MathWorks, Inc. % do modifications to the controller struct here, f.ex.: for i = 1:length(controller.components) controller.components(i).body = sprintf('<<header_placeholder>>\r\n%s',controller.components(i).body); end end
Постобработка файла обратного вызова. plc_postcg_callback_IDEname.m обеспечивает доступ к сгенерированному файлу кода. Используйте этот файл, чтобы сгенерированный код соответствовал требованиям синтаксиса для пользовательской целевой среды IDE. Этот файл читает и вносит изменения в созданный файл кода, который считывается в виде строкового файла. Создание plc_postcg_callback_IDEname.m используйте этот шаблон:
function generatedFiles = plc_postcg_callback_myplcopen(fileNames) % Copyright 2012-2020 The MathWorks, Inc. fileName = fileNames{1}; str = fileread(fileName); % do modifications to str here, f.ex.: % str = regexprep(str,'BOOL_TO_LREAL','BOOL_TO_INT'); % str = regexprep(str,'<USINT/>','<INT/>'); % str = regexprep(str, 'END_STRUCT','END_STRUCT;'); [sHeader,eHeader] = regexp(str,'\(\*.*?\*\)'); header = str(sHeader:eHeader); str = regexprep(str,'<<header_placeholder>>',header); sfprivate ('str2file', str, fileName); generatedFiles = {fileName}; end
Создайте пользовательский код для пользовательской целевой среды IDE, выбрав параметры подключаемого модуля, перечисленные в таблице.
| Имя подключаемого модуля | Назначение подключаемого модуля | Когда использовать подключаемый модуль | Влияние подключаемого модуля на сгенерированный код |
fConvertBooleanCast | Преобразование функции приведения логического типа в назначение if-else. | Если целевая среда IDE не поддерживает логическую функцию или оператор приведения типа. | Сгенерированный код с отключенным подключаемым модулем: Out1 := DINT_TO_INT(BOOL_TO_DINT(In1) +... BOOL_TO_DINT(In2)); Созданный код с включенным подключаемым модулем: IF In1 THEN
temp1 := DINT#1;
ELSE
temp1 := DINT#0;
END_IF;
IF In2 THEN
temp2 := DINT#1;
ELSE
temp2 := DINT#0;
END_IF;
Out1 := DINT_TO_INT(temp1 + temp2); |
fConvertDoubleToSingle | Преобразование двойного типа данных в один тип данных. | Если целевая среда IDE не поддерживает двойные типы данных. Сгенерированные переменные двойного типа данных кода преобразуются в отдельные типы данных. Во время создания кода генерируется предупреждающее сообщение о том, что типы данных, которые не поддерживаются, были найдены и преобразованы. Значения в сгенерированном коде могут отличаться от значений моделирования. | Сгенерированный код с отключенным подключаемым модулем: VAR_INPUT
ssMethodType: SINT;
U: LREAL;
END_VAR
VAR_OUTPUT
Y: LREAL;
END_VARСозданный код с включенным подключаемым модулем: VAR_INPUT
ssMethodType: SINT;
U: REAL;
END_VAR
VAR_OUTPUT
Y: REAL;
END_VAR |
fConvertDoubleToSingleEmitter | Преобразование двойных типов данных в одиночные. | Если целевая среда IDE не поддерживает двойные типы данных и требуется сохранить значения после преобразования. Сгенерированные переменные двойного типа данных кода преобразуются в отдельные типы данных. Во время создания кода генерируется предупреждающее сообщение о том, что типы данных, которые не поддерживаются, были найдены и преобразованы. Значения в сгенерированном коде соответствуют значениям моделирования, если они не превышают | Сгенерированный код с отключенным подключаемым модулем: VAR_INPUT
ssMethodType: SINT;
U: LREAL;
END_VAR
VAR_OUTPUT
Y: LREAL;
END_VARСозданный код с включенным подключаемым модулем: VAR_INPUT
ssMethodType: SINT;
U: REAL;
END_VAR
VAR_OUTPUT
Y: REAL;
END_VAR |
fConvertEnumToInteger | Преобразование типов данных перечисления в целочисленные типы данных. | Если целевая среда IDE не поддерживает типы данных перечисления. | Созданный код с отключенным подключаемым модулем для целевой среды IDE, поддерживающей тип данных перечисления: VAR_TEMP
rtb_Switch: myEnum;
in: myEnum;
END_VARСозданный код с включенным подключаемым модулем: VAR_TEMP
rtb_Switch: DINT;
in: DINT;
END_VAR |
fConvertUnsignedIntToSignedInt | Преобразует целое число без знака в целое число со знаком. | Если конечный объект не поддерживает неподписанный тип целочисленных данных. | Сгенерированный код с отключенным подключаемым модулем: FUNCTION_BLOCK Subsystem
VAR_INPUT
In1: UDINT;
In2: UDINT;
END_VAR
VAR_OUTPUT
Out1: UDINT;
END_VARСозданный код с включенным подключаемым модулем: FUNCTION_BLOCK Subsystem
VAR_INPUT
In1: DINT;
In2: DINT;
END_VAR
VAR_OUTPUT
Out1: DINT;
END_VAR |
fInt32AsBaseInt | Задает тип данных int32 в качестве целочисленного типа данных по умолчанию. | Установка int32 в качестве внутреннего целочисленного типа данных по умолчанию может уменьшить количество операций приведения типа в создаваемом коде. | Сгенерированный код с отключенным подключаемым модулем: FUNCTION_BLOCK Subsystem
VAR_INPUT
In1: SINT;
In2: SINT;
END_VAR
VAR_OUTPUT
Out1: SINT;
END_VAR
Out1 := DINT_TO_SINT(SINT_TO_DINT(In1) +...
SINT_TO_DINT(In2));
END_FUNCTION_BLOCKСозданный код с включенным подключаемым модулем: FUNCTION_BLOCK Subsystem
VAR_INPUT
In1: DINT;
In2: DINT;
END_VAR
VAR_OUTPUT
Out1: DINT;
END_VAR
Out1 := In1 + In2));
END_FUNCTION_BLOCK |
fEmitEnumTypeIntegerValue | Отображает значение перечисления и соответствующее целое значение в созданном коде. | Отображение значений перечисления и соответствующих им целых значений в созданном коде. | Сгенерированный код с отключенным подключаемым модулем: TYPE PLCCommandState:
(FILL, HOLD, EMPTY, ACTIVATE);
END_TYPE
TYPE PLCVesselState:
(EMPTIED, NOT_FULL, FULL);
END_TYPE
TYPE PLCValveState:
(SHUT, OPEN);
END_TYPEСозданный код с включенным подключаемым модулем: TYPE PLCCommandState:
(FILL:=0, HOLD:=1, EMPTY:=2, ACTIVATE:=3);
END_TYPE
TYPE PLCVesselState:
(EMPTIED:=0, NOT_FULL:=1, FULL:=2);
END_TYPE
TYPE PLCValveState:
(SHUT:=0, OPEN:=1);
END_TYPE |
| Имя подключаемого модуля | Назначение подключаемого модуля | Когда использовать подключаемый модуль | Влияние подключаемого модуля на сгенерированный код |
fArrayInitialValueBrackets | Заключает инициализацию массива в область объявления в скобки. | Если целевая среда IDE требует включения инициализации массива в область объявления в скобках. | Сгенерированный код с отключенным подключаемым модулем: EnableSetpoint_ZCE: ARRAY [0..2] OF USINT:=3,3,3 Созданный код с включенным подключаемым модулем: EnableSetpoint_ZCE: ARRAY [0..2] OF USINT:=[3,3,3] |
fConvertAggregateInitValueToAssignment | Преобразует начальные значения для агрегированных типов данных в инструкцию назначения. | Целевая среда IDE не поддерживает инициализацию массива в области объявления. | Сгенерированный код с отключенным подключаемым модулем: ARRAY [0..1] OF LREAL := LREAL#0.0,LREAL#0.0998 Созданный код с включенным подключаемым модулем: tb_U[0] := 0.0;
tb_U[1] := 0.0998;
|
fConvertAggregateTypeFunctionToFB | Преобразует функции с агрегатными типами данных в функциональный блок (FB). | Целевая среда IDE поддерживает агрегированные типы данных только для функциональных блоков. | Сгенерированный код с отключенным подключаемым модулем: function foo(...):ARRAY [0..10] OF LREAL Созданный код с включенным подключаемым модулем: FUNCTION_BLOCK foo VAR_OUTPUT out1: ARRAY [0..10] OF LREAL; END_VAR |
fConvertFunctionToFB | Преобразование функции в функциональный блок (FB). | Целевая среда IDE не поддерживает | |
fConvertOutputInitValueToAssignment | Преобразование инициализации выходной переменной в назначение. | Целевая среда IDE не допускает определения начального значения и требует оператора назначения. | Сгенерированный код с отключенным подключаемым модулем: FUNCTION_BLOCK foo VAR_OUTPUT somevalue: DINT := 100; END_VAR Созданный код с включенным подключаемым модулем: FUNCTION_BLOCK foo VAR_OUTPUT somevalue: DINT; END_VAR somevalue := 100; |
fEmitVarDeclarationBeforeDescription | Переключает отображение описания переменной до или после объявления переменной. | Для целевой среды IDE перед описанием переменной требуется объявление переменной. | Сгенерированный код с отключенным подключаемым модулем: VAR_GLOBAL CONSTANT K3: REAL := 0.3; END_VAR Созданный код с включенным подключаемым модулем: VAR_GLOBAL CONSTANT K3: REAL := 0.3; END_VAR |
fErrorOnTrailingUS | При создании кода происходит сбой при обнаружении имен переменных с завершающим подчеркиванием. | Целевая среда IDE не поддерживает имена с конечным подчеркиванием. | Ошибка создания кода с этим сообщением |
fHoistArrayIndexExprs | Перемещает выражения из индексов массива и создает временную переменную для выражения. | Целевая среда IDE не поддерживает выражения для индексов массива. | Сгенерированный код с отключенным подключаемым модулем: EnvCur[TRUNC(j) - 1] Созданный код с включенным подключаемым модулем: temp1 := TRUNC(j) - 1; EnvCur[temp1] |
fSimplifyFunctionCallExpr | Упрощает вызов функции для простых функций. | Целевая среда IDE не допускает выражения назначения в вызовах функций. | Сгенерированный код с отключенным подключаемым модулем: y := simplefunction(u_0 := u); Созданный код с включенным подключаемым модулем: y := simplefunction(u); |
fUseQualifiedTypeConstant | Добавляет тип данных к объявлению константы. | Для целевой среды IDE требуется тип данных для констант. | Сгенерированный код с отключенным подключаемым модулем: a := 11; Созданный код с включенным подключаемым модулем: a := DINT#11; |
| Имя подключаемого модуля | Назначение подключаемого модуля | Когда использовать подключаемый модуль | Влияние подключаемого модуля на сгенерированный код |
fConvertTunableParamToInputVariable | Преобразует настраиваемые параметры во входные переменные функционального блока (FB). | Требуется преобразовать настраиваемые параметры во входы функциональных блоков. Это позволяет вызывать POU с различными наборами параметров. | Сгенерированный код с отключенным подключаемым модулем: FUNCTION_BLOCK Tunable_Param_to_Input
24 VAR_INPUT
25 ssMethodType: SINT;
26 Input1: REAL;
27 END_VAR
28 VAR_OUTPUT
29 Output1: REAL;
30 END_VAR
31 VAR
32 DSTATE: REAL;
33 END_VAR
34 'ST'
35 BODY
36 CASE ssMethodType OF
37 0:
40 UnitDelay_DSTATE := 0.0;
41
42 1:
43 Output1 := (Input1 - DSTATE) *
TunableParam;
48 DSTATE := Output1;
50 END_CASE;
52 END_BODY
53 END_FUNCTION_BLOCK
54 TunableParam переменная не объявляется как вход в функциональный блок.Созданный код с включенным подключаемым модулем: FUNCTION_BLOCK Tunable_Param_to_Input
24 VAR_INPUT
25 TunableParam: LREAL;
26 ssMethodType: SINT;
27 Input1: REAL;
28 END_VAR
29 VAR_OUTPUT
30 Output1: REAL;
31 END_VAR
32 VAR
33 DSTATE: REAL;
34 END_VAR
35 'ST'
36 BODY
37 CASE ssMethodType OF
38 0:
39 DSTATE := 0.0;
42
43 1:
44 Output1 := (Input1 - DSTATE) *
TunableParam;
49 DSTATE := Output1;
51
52 END_CASE;
53 END_BODY
54 END_FUNCTION_BLOCK
55 TunableParam переменная объявляется как вход в функциональный блок. |
fDefineFBExternalConstVariable | Определяет внешние переменные в | Целевая IDE требует объявления внешних постоянных переменных в | Сгенерированный код с отключенным подключаемым модулем: VAR_GLOBAL CONSTANT
SS_INITIALIZE: SINT := 0;
K3: LREAL := 0.3;
SS_STEP: SINT := 1;
END_VARСозданный код с включенным подключаемым модулем: VAR_GLOBAL CONSTANT
K3: REAL := 0.3; |
fDefineFBExternalVariable | Определяет внешние константы в | Целевая IDE требует объявления внешних констант в | Сгенерированный код с отключенным подключаемым модулем: VAR
UnitDelay_DSTATE: LREAL;
i0_ExternallyDefinedBlock: ExternallyDefinedBlock;
END_VARСозданный код с включенным подключаемым модулем: VAR_EXTERNAL
K1: REAL;
END_VAR |
fReplaceShiftFunctions | Замена целевых функций смены IDE на функции, соответствующие поведению функции смены Simulink. | Когда количество сдвигов превышает длину типа данных, существует несоответствие между выходом блока сдвига Simulink и целевым блоком сдвига IDE. Используйте этот подключаемый модуль для замены целевых блоков сдвига IDE блоками сдвига Simulink в сгенерированном коде. | Сгенерированный код с отключенным подключаемым модулем: Out10 := WORD_TO_INT(SHL(IN:=INT_TO_WORD(In1),... N:=Out2_tmp)); SHL функция смены.Созданный код с включенным подключаемым модулем: Out10 := WORD_TO_INT(PLC_SHL(INT_TO_WORD(In1),...
DINT_TO_USINT(Out2_tmp)));
FUNCTION PLC_SHL: WORD
VAR_INPUT
in1: WORD;
in2: USINT;
END_VAR
'ST'
BODY
IF in2 > 16 THEN
PLC_SHL := 16#0;
ELSE
PLC_SHL := SHL(in1, in2);
END_IF;
END_BODY
END_FUNCTIONPLC_SHL, который реплицирует блок сдвига Simulink в целевой среде IDE. |
| Имя подключаемого модуля | Назначение подключаемого модуля | Когда использовать подключаемый модуль | Влияние подключаемого модуля на сгенерированный код |
fSimplifyAllIntrinsicFcn | Упрощает ввод всех собственных функций. | Целевая среда IDE не допускает составные выражения как часть аргументов собственных функций. | Сгенерированный код с отключенным подключаемым модулем: a := SQRT(x*y); Созданный код с включенным подключаемым модулем: t1 := x*y; a := SQRT(t1); |
fSimplifyIntrinsicFcn | Упрощает внутренние функции, которые являются аргументами | Целевая среда IDE не допускает составные выражения как часть аргументов собственных функций. | Сгенерированный код с отключенным подключаемым модулем: a := SQRT(x*y); Созданный код с включенным подключаемым модулем: cfg.fSimplifyIntrinsicFcnNameList = { 'SQRT' \}
cfg.fSimplifyIntrinsicFcn = true;
t1 := x*y;
a := SQRT(t1); |
fSimplifyIntrinsicFcnNameList | Создает список собственных функций. Вводы в эти внутренние функции упрощаются с помощью | Целевая среда IDE не допускает составные выражения как часть аргументов собственных функций. | Сгенерированный код с отключенным подключаемым модулем: a := SQRT(x*y); Созданный код с включенным подключаемым модулем: cfg.fSimplifyIntrinsicFcnNameList = { 'SQRT' \}
cfg.fSimplifyIntrinsicFcn = true;
t1 := x*y;
a := SQRT(t1); |
fSimplifyOperator | Упрощает ввод перечисленных функций оператора с помощью | Целевая среда IDE не допускает составные выражения как часть аргументов функции оператора. | Сгенерированный код с отключенным подключаемым модулем: a := SHL(x*y); Созданный код с включенным подключаемым модулем: cfg.fSimplifyOperatorNameList = { 'SHL' \}
cfg.fSimplifyOperator = true;
t1 := x*y;
a := SHL(t1); |
fSimplifyOperatorNameList | Создает список функций оператора. Вводы в эти функции оператора упрощаются с помощью | Целевая среда IDE не допускает составные выражения как часть аргументов функции оператора. | Сгенерированный код с отключенным подключаемым модулем: a := SHL(x*y); Созданный код с включенным подключаемым модулем: cfg.fSimplifyOperatorNameList = { 'SHL' \}
cfg.fSimplifyOperator = true;
t1 := x*y;
a := SHL(t1); |
fSimplifyTrunc | Упрощает ввод | Целевая среда IDE не допускает составные выражения в качестве аргументов для | Сгенерированный код с отключенным подключаемым модулем: a := TRUNC(x*y); Созданный код с включенным подключаемым модулем: cfg.fSimplifyTrunc = true; t1 := x*y; a := SHL(t1); |
В этом примере показано, как создать код для пользовательской целевой среды IDE с именем my PLCopen XMLс помощью подключаемых модулей.
Создать папку с именем myplcopen. Создать plc_custom_ide.m файл в папке с использованием этого шаблона:
function plc_ide_list = plc_custom_ide % Copyright 2012-2021 The MathWorks, Inc. plc_ide_list(1) = get_ide_info_myplcopen; end function ide_info = get_ide_info_myplcopen ide_info.name = 'myplcopen'; ide_info.description = 'My PLCopen XML'; ide_info.path = ''; % IDE path ide_info.format = 'xml'; % generic|xml ide_info.fileExtension = 'xml'; ide_info.cfg = get_ide_cfg_myplcopen; ide_info.precg_callback = 'plc_precg_callback_myplcopen'; ide_info.postcg_callback = 'plc_postcg_callback_myplcopen'; ide_info.xmltree_callback = PLCCoder.PLCCGMgr.PLC_PLUGIN_CG_CALLBACK_EMPTY; ide_info.pluginVersion = 2.2; ide_info.compatibleBuildVersion = 1.6; end function cfg = get_ide_cfg_myplcopen cfg.fConvertDoubleToSingle = true; cfg.fConvertNamedConstantToInteger = true; cfg.fConvertEnumToInteger = true; cfg.fConvertOutputInitValueToAssignment = true; cfg.fConvertTunableParamToInputVariable = true; cfg.fSimplifyFunctionCallExpr = true; cfg.fConvertOutputInitValueToAssignment = true; end
Установите параметры подключаемого модуля в function_cfg раздел файла. Чтобы включить подключаемый модуль, установите параметр подключаемого модуля в значение true. Например,cfg.fArrayInitialValueBrackets = true; включает подключаемый модуль. Чтобы отключить подключаемый модуль, установите для параметра plugin значение false.
Создать plc_precg_callback_IDEname.m и plc_postcg_callback_IDEname.m с помощью следующих шаблонов:
function controller = plc_precg_callback_myplcopen(controller) % Copyright 2012-2020 The MathWorks, Inc. % do modifications to the controller struct here, f.ex.: for i = 1:length(controller.components) controller.components(i).body = sprintf('<<header_placeholder>>\r\n%s',controller.components(i).body); end end
function generatedFiles = plc_postcg_callback_myplcopen(fileNames) % Copyright 2012-2020 The MathWorks, Inc. fileName = fileNames{1}; str = fileread(fileName); % do modifications to str here, f.ex.: % str = regexprep(str,'BOOL_TO_LREAL','BOOL_TO_INT'); % str = regexprep(str,'<USINT/>','<INT/>'); % str = regexprep(str, 'END_STRUCT','END_STRUCT;'); [sHeader,eHeader] = regexp(str,'\(\*.*?\*\)'); header = str(sHeader:eHeader); str = regexprep(str,'<<header_placeholder>>',header); sfprivate ('str2file', str, fileName); generatedFiles = {fileName}; end
Создать plc_header_hook.m с помощью этого шаблона:
function headerCommentText = plc_header_hook(filePath, blockH, headerCommentText) headerCommentText = [headerCommentText(1:end-7) ... sprintf([' * Plugin Header Copy : Yes \n']) ... headerCommentText(end-6:end)]; end
plc_header_hook.m копирует информацию заголовка в начале сгенерированного кодового файла в каждый экземпляр функционального блока.
Добавьте новую папку и файлы в путь MATLAB.
Щелкните папку правой кнопкой мыши и выберите «Добавить к пути» > «Выбранные папки и вложенные папки».
Используйте addpath функция. Например, addpath(genpath('path to your folder')).
Выполните следующую команду:
plccoderpref('plctargetidepaths','default')
Перезапустите сеанс MATLAB.
Откройте модель и выберите компонент модели для создания кода. Откройте приложение «Кодер ПЛК» и нажмите «Параметры». На панели «Создание кода ПЛК» в целевой среде IDE выберите My PLCopen XML. Нажмите кнопку ОК.

В приложении «Кодер ПЛК» на вкладке «Код ПЛК» нажмите «Создать код ПЛК», чтобы создать код для пользовательской целевой среды IDE. Созданные файлы кода помещаются по пути, указанному в ide_info.path = ''; % IDE path.