exponenta event banner

Создание пользовательской целевой среды IDE для создания кода

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

Рабочий процесс создания кода на основе плагинов

Чтобы создать код для пользовательских целевых IDE на основе плагинов:

Flowchart displaying steps to generate code for plugin based custom target IDEs

Следуйте блок-схеме для создания 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 не поддерживает двойные типы данных.

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

Значения в сгенерированном коде могут отличаться от значений моделирования.

Сгенерированный код с отключенным подключаемым модулем:

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 не поддерживает двойные типы данных и требуется сохранить значения после преобразования.

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

Значения в сгенерированном коде соответствуют значениям моделирования, если они не превышают REALMAX границы.

Сгенерированный код с отключенным подключаемым модулем:

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 не поддерживает FUN нотация, но поддерживает FB нотация.

 
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 не поддерживает имена с конечным подчеркиванием.

Ошибка создания кода с этим сообщением $name$ has a trailing '_'. 'IDE name' names must not end with '_'.

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

Определяет внешние переменные в VAR_GLOBAL CONSTANT.

Целевая IDE требует объявления внешних постоянных переменных в VAR_GLOBAL CONSTANT.

Сгенерированный код с отключенным подключаемым модулем:

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

Определяет внешние константы в VAR_EXTERNAL.

Целевая IDE требует объявления внешних констант в VAR_EXTERNAL.

Сгенерированный код с отключенным подключаемым модулем:

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));
Созданный код использует целевую среду IDE 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_FUNCTION
Созданный код содержит функцию PLC_SHL, который реплицирует блок сдвига Simulink в целевой среде IDE.

Подключаемые модули для функций внутреннего преобразования

Имя подключаемого модуляНазначение подключаемого модуляКогда использовать подключаемый модульВлияние подключаемого модуля на сгенерированный код
fSimplifyAllIntrinsicFcn

Упрощает ввод всех собственных функций.

Целевая среда IDE не допускает составные выражения как часть аргументов собственных функций.

Сгенерированный код с отключенным подключаемым модулем:

a := SQRT(x*y);

Созданный код с включенным подключаемым модулем:

t1 := x*y;
a := SQRT(t1);

fSimplifyIntrinsicFcn

Упрощает внутренние функции, которые являются аргументами fSimplifyIntrinsicFcnNameList.

Целевая среда IDE не допускает составные выражения как часть аргументов собственных функций.

Сгенерированный код с отключенным подключаемым модулем:

a := SQRT(x*y);

Созданный код с включенным подключаемым модулем:

cfg.fSimplifyIntrinsicFcnNameList = { 'SQRT' \}
cfg.fSimplifyIntrinsicFcn = true;
t1 := x*y;
a := SQRT(t1);

fSimplifyIntrinsicFcnNameList

Создает список собственных функций. Вводы в эти внутренние функции упрощаются с помощью fSimplifyIntrinsicFcn.

Целевая среда IDE не допускает составные выражения как часть аргументов собственных функций.

Сгенерированный код с отключенным подключаемым модулем:

a := SQRT(x*y);

Созданный код с включенным подключаемым модулем:

cfg.fSimplifyIntrinsicFcnNameList = { 'SQRT' \}
cfg.fSimplifyIntrinsicFcn = true;
t1 := x*y;
a := SQRT(t1);

fSimplifyOperator

Упрощает ввод перечисленных функций оператора с помощью fSimplifyOperatorNameList.

Целевая среда IDE не допускает составные выражения как часть аргументов функции оператора.

Сгенерированный код с отключенным подключаемым модулем:

a := SHL(x*y);

Созданный код с включенным подключаемым модулем:

cfg.fSimplifyOperatorNameList = { 'SHL' \}
cfg.fSimplifyOperator = true;
t1 := x*y;
a := SHL(t1);

fSimplifyOperatorNameList

Создает список функций оператора. Вводы в эти функции оператора упрощаются с помощью fSimplifyOperator.

Целевая среда IDE не допускает составные выражения как часть аргументов функции оператора.

Сгенерированный код с отключенным подключаемым модулем:

a := SHL(x*y);

Созданный код с включенным подключаемым модулем:

cfg.fSimplifyOperatorNameList = { 'SHL' \}
cfg.fSimplifyOperator = true;
t1 := x*y;
a := SHL(t1);

fSimplifyTrunc

Упрощает ввод TRUNC функция.

Целевая среда IDE не допускает составные выражения в качестве аргументов для TRUNC функция.

Сгенерированный код с отключенным подключаемым модулем:

a := TRUNC(x*y);

Созданный код с включенным подключаемым модулем:

cfg.fSimplifyTrunc = true;
t1 := x*y;
a := SHL(t1);

Создание кода с помощью целевой среды IDE на основе подключаемых модулей

В этом примере показано, как создать код для пользовательской целевой среды IDE с именем my PLCopen XMLс помощью подключаемых модулей.

  1. Создать папку с именем 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.

  2. Создать 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
    
    

  3. Создать 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 копирует информацию заголовка в начале сгенерированного кодового файла в каждый экземпляр функционального блока.

  4. Добавьте новую папку и файлы в путь MATLAB.

    • Щелкните папку правой кнопкой мыши и выберите «Добавить к пути» > «Выбранные папки и вложенные папки».

    • Используйте addpath функция. Например, addpath(genpath('path to your folder')).

  5. Выполните следующую команду:

    plccoderpref('plctargetidepaths','default')

    Перезапустите сеанс MATLAB.

  6. Откройте модель и выберите компонент модели для создания кода. Откройте приложение «Кодер ПЛК» и нажмите «Параметры». На панели «Создание кода ПЛК» в целевой среде IDE выберите My PLCopen XML. Нажмите кнопку ОК.

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

Связанные темы