主要内容

创建自定义IDE为目标代码生成

金宝app®PLC编码器™目前支持基于插件目标金宝appide,比如选数管CAP1131,欧姆龙Sysmac工作室,等等。为您的基于插件不支持自定义目标ide,生成PLCOpen xml或ASCII-compliant结构化文本代金宝app码。自定义IDE生成的代码来满足您的目标要求,通过利用内置插件选项金宝app仿真软件PLC编码器

基于插件的代码生成工作流

为定制基于插件目标ide生成代码:

流程图显示步骤生成代码基于插件自定义目标的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通过使用这个模板:

函数plc_ide_list = plc_custom_ide% 2012 - 2021版权MathWorks公司。plc_ide_list (1) = get_ide_info_myplcopen;结束函数ide_info = get_ide_info_myplcopen ide_info.name =“myplcopen”;ide_info.description =“我的PLCopen XML”;ide_info.path=;%的IDE路径ide_info。格式=“xml”;%的通用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;结束函数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;结束

  • 设定你的目标IDE的名字,通过使用ide_info.name。的目标IDE配置设置中设置显示的名字ide_info.description

  • 如果你的目标的IDE是符合通用的圣标准,集ide_info。格式='generic'。如果你的目标IDE符合PLCOpen XML,集ide_info。格式=“xml”

  • 设置放置使用生成的代码文件的位置ide_info.path

  • 设置扩展你的目标通过使用IDE文件ide_info.fileExtension

function_cfg部分文件,设置你的插件选项。要启用插件,插件选项真正的。例如,cfg。fArrayInitialValueBrackets = true;支持插件。禁用插件,插件选项。你需要决定哪些插件选项plc_custom_ide.m文件的更多信息,请参考插件选项

创建回调的文件

如果您的自定义IDE需要预处理和邮编代加工、创造plc_precg_callback_IDEname.mplc_postcg_callback_IDEname.m文件。

预处理调文件。plc_precg_callback_IDEname.m文件提供生成的中间代码表示。存储在中间代码控制器结构体数据类型,它包含子系统块的信息,如名称,输入,输出,生成的代码,等等。这个回调执行前有针对性的发射器函数被调用。创建一个plc_precg_callback_IDEname.m文件时,使用该模板:

函数控制器=plc_precg_callback_myplcopen(控制器)% 2012 - 2020版权MathWorks公司。%做修改控制器结构,f.ex。i = 1:长度(controller.components) controller.components (i) .body = sprintf (' < < header_placeholder > > \ r \ n % s’controller.components(我).body);结束结束

后处理文件回调。plc_postcg_callback_IDEname.m文件提供生成的代码文件。使用这个文件来定制生成的代码符合语法要求目标IDE。这个文件读入并使修改生成的代码文件,这是作为字符串读入文件。创建一个plc_postcg_callback_IDEname.m文件时,使用该模板:

函数generatedFiles = plc_postcg_callback_myplcopen(文件名)% 2012 - 2020版权MathWorks公司。文件名={1}文件名;str = fileread(文件名);%做修改str, 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,“\ \ * . * ? \ * \)”);头= str (sHeader: eHeader);str = regexprep (str,“< < header_placeholder > >”,头);sfprivate (“str2file”str,文件名);generatedFiles ={文件名};结束

插件选项

为定制目标IDE生成自定义代码,通过选择从表中列出的插件选项。

数据类型转换插件

插件名称 插件的目的 何时使用插件 效果的插件生成的代码
fConvertBooleanCast

布尔类型转换函数转换为一个if - else任务。

如果你的目标IDE不支持布尔类型转换函数或运算符。金宝app

生成的代码和插件禁用:

着干活:= DINT_TO_INT (BOOL_TO_DINT (in) +…BOOL_TO_DINT (In2));

生成的代码启用了插件:

如果In1 temp1: =力# 1;其他temp1: =力# 0;END_IF;如果In2 temp2: =力# 1;其他temp2: =力# 0;END_IF;着干活:= DINT_TO_INT (temp1 + temp2);

fConvertDoubleToSingle

双数据类型转换为单一数据类型。

如果你的目标IDE不支持双数据类型。金宝app

生成的代码双数据类型变量转换为单一数据类型。在代码生成生成一条警告消息,不支持的数据类型被发现和转换。金宝appLREAL数据类型所取代真正的数据类型。

生成的代码的值可能不同于模拟值。

生成的代码和插件禁用:

VAR_INPUT ssMethodType:它们;U: LREAL;END_VAR VAR_OUTPUT Y: LREAL;END_VAR

生成的代码启用了插件:

VAR_INPUT ssMethodType:它们;你:真正的;END_VAR VAR_OUTPUT Y:真正的;END_VAR

fConvertDoubleToSingleEmitter

双数据类型转换为单一数据类型。

如果你的目标IDE不支持双数据类型和你想保存转换后的值。金宝app

生成的代码双数据类型变量转换为单一数据类型。在代码生成生成一条警告消息,不支持的数据类型被发现和转换。金宝appLREAL数据类型所取代真正的数据类型。

生成的代码中的值匹配仿真值,除非他们超过了最大浮点数范围之内。

生成的代码和插件禁用:

VAR_INPUT ssMethodType:它们;U: LREAL;END_VAR VAR_OUTPUT Y: LREAL;END_VAR

生成的代码启用了插件:

VAR_INPUT ssMethodType:它们;你:真正的;END_VAR VAR_OUTPUT Y:真正的;END_VAR

fConvertEnumToInteger

枚举数据类型转换为整数数据类型。

如果你的目标IDE不支持枚举数据类型。金宝app

生成的代码和插件禁用目标IDE支持枚举数据类型:金宝app

VAR_TEMP rtb_Switch: myEnum;:myEnum;END_VAR

生成的代码启用了插件:

VAR_TEMP rtb_Switch:力;:力;END_VAR

fConvertUnsignedIntToSignedInt

无符号整数转换为整数签署。

如果你的目标不支持无符号整数数据类型。金宝app

生成的代码和插件禁用:

FUNCTION_BLOCK子系统VAR_INPUT In1: UDINT;In2: UDINT;END_VAR VAR_OUTPUT着干活:UDINT;END_VAR

生成的代码启用了插件:

FUNCTION_BLOCK子系统VAR_INPUT In1:力;In2:力;END_VAR VAR_OUTPUT着干活:力;END_VAR

fInt32AsBaseInt

集int32数据类型作为默认整数数据类型。

int32作为默认设置内部整数数据类型的数量可能会减少类型操作在生成的代码中。

生成的代码和插件禁用:

FUNCTION_BLOCK子系统VAR_INPUT In1:它们;In2:它们;END_VAR VAR_OUTPUT着干活:它们;END_VAR着干活:= DINT_TO_SINT (SINT_TO_DINT (in) +…SINT_TO_DINT (In2));END_FUNCTION_BLOCK
生成的代码包含额外的数据类型转换的代码。

生成的代码启用了插件:

FUNCTION_BLOCK子系统VAR_INPUT In1:力;In2:力;END_VAR VAR_OUTPUT着干活:力;END_VAR着干活:= In1 + In2));END_FUNCTION_BLOCK
生成的代码不包含额外的数据类型转换的代码。

fEmitEnumTypeIntegerValue

显示枚举值在生成的代码和相应的整数值。

显示枚举值及其匹配的整数值生成的代码。

生成的代码和插件禁用:

类型PLCCommandState:(填满,空,激活);END_TYPE类型PLCVesselState:(清空,NOT_FULL完整);END_TYPE类型PLCValveState:(关闭,打开);END_TYPE

生成的代码启用了插件:

类型PLCCommandState:(填:= 0,持有:= 1,空:= 2,激活:= 3);END_TYPE类型PLCVesselState:(清空:= 0,NOT_FULL: = 1,全:= 2);END_TYPE类型PLCValveState:(关闭:= 0,开放:= 1);END_TYPE

插件语法变化

插件名称 插件的目的 何时使用插件 效果的插件生成的代码
fArrayInitialValueBrackets

括号内包含在声明数组初始化区。

如果你的目标IDE需要封闭在声明数组初始化区域在括号中。

生成的代码和插件禁用:

EnableSetpoint_ZCE: ARRAY [0 . .2]USINT: = 3, 3, 3

生成的代码启用了插件:

EnableSetpoint_ZCE: ARRAY [0 . .2)USINT: = (3, 3, 3)

fConvertAggregateInitValueToAssignment

将聚合数据类型的初始值转换为一个赋值语句。

IDE不支持数组初始化的目标宣言。金宝app

生成的代码和插件禁用:

ARRAY [0 . .1]LREAL: 0.0998 = LREAL # 0.0, LREAL #

生成的代码启用了插件:

tb_U [0]: = 0.0;tb_U [1]: = 0.0998;

fConvertAggregateTypeFunctionToFB

将功能与聚合数据类型转换为功能块(神奇动物)。

目标IDE支持聚合数据金宝app类型函数块。

生成的代码和插件禁用:

函数foo (…): ARRAY [0 . .10]LREAL

生成的代码启用了插件:

FUNCTION_BLOCK foo VAR_OUTPUT着干活:ARRAY [0 . .LREAL 10];END_VAR

fConvertFunctionToFB

转换函数功能块(神奇动物)。

目标IDE不支持金宝app有趣的符号,但支持金宝app神奇动物符号。

fConvertOutputInitValueToAssignment

转换输出变量初始化赋值。

IDE不允许初始值定义和目标需要一个赋值语句。

生成的代码和插件禁用:

FUNCTION_BLOCK foo VAR_OUTPUT somevalue:力:= 100;END_VAR

生成的代码启用了插件:

FUNCTION_BLOCK foo VAR_OUTPUT somevalue:力;END_VAR somevalue: = 100;

fEmitVarDeclarationBeforeDescription

切换是否变量描述出现在变量声明之前或之后。

目标IDE要求变量声明之前的变量描述。

生成的代码和插件禁用:

VAR_GLOBAL(*描述:增益值两个*)K2:真实:= 0.2;END_VAR

生成的代码启用了插件:

VAR_GLOBAL K2:真实:= 0.2;(*描述:增益值两个*)END_VAR

fErrorOnTrailingUS

代码生成失败当遇到变量名称末尾用下划线。

目标IDE不支持名称末尾用下划线。金宝app

代码生成失败与此消息名字有落后于美元“_”。IDE的名字的名字不能用“_”

fHoistArrayIndexExprs

动作表情的数组索引并创建一个临时变量的表达式。

目标IDE不支持数组下标表达式。金宝app

生成的代码和插件禁用:

EnvCur [TRUNC (j) - 1]

生成的代码启用了插件:

temp1: = TRUNC (j) - 1;EnvCur [temp1]

fSimplifyFunctionCallExpr

简化了简单函数的函数调用。

目标IDE不允许在函数调用赋值表达式。

生成的代码和插件禁用:

y: = simplefunction (u_0: = u);

生成的代码启用了插件:

y: = simplefunction (u);

fUseQualifiedTypeConstant

附加数据类型常量声明。

目标IDE需要数据类型常量。

生成的代码和插件禁用:

答:= 11;

生成的代码启用了插件:

答:=力# 11;

插件接口变化

插件名称 插件的目的 何时使用插件 效果的插件生成的代码
fConvertTunableParamToInputVariable

可调参数转换为功能块(FB)输入变量。

你想要可调参数转换为功能块输入。这允许您调用POU不同参数集。

生成的代码和插件禁用:

FUNCTION_BLOCK Tunable_Param_to_Input 24 VAR_INPUT 25 ssMethodType:它们;26 Input1:真正的;27 END_VAR 28 VAR_OUTPUT 29 Output1:真正的;30 END_VAR 31 VAR 32 DSTATE:真正的;34“圣”35身体36例33 END_VAR ssMethodType 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:它们;27 Input1:真正的;28 END_VAR 29 VAR_OUTPUT 30 Output1:真正的;31日END_VAR 32 VAR 33 DSTATE:真正的;34 END_VAR 35个“圣”36身体37例ssMethodType 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常数

目标IDE需要外部常数变量的声明VAR_GLOBAL常数

生成的代码和插件禁用:

VAR_GLOBAL常数SS_INITIALIZE:它们:= 0;K3: LREAL: = 0.3;SS_STEP:它们:= 1;END_VAR

生成的代码启用了插件:

VAR_GLOBAL常数K3:真实:= 0.3;

fDefineFBExternalVariable

定义外部常数VAR_EXTERNAL

目标IDE需要声明的外部常数VAR_EXTERNAL

生成的代码和插件禁用:

VAR UnitDelay_DSTATE: LREAL;i0_ExternallyDefinedBlock: ExternallyDefinedBlock;END_VAR

生成的代码启用了插件:

VAR_EXTERNAL K1:真正的;END_VAR

fReplaceShiftFunctions

替换目标IDE转移函数与函数匹配仿真软件转移函数的行为。金宝app

当变化的数量大于数据类型的长度,之间存在不匹配的输出块和目标IDE转变块模型转变。金宝app使用这个插件替换目标IDE转变阻塞与仿真软件转变生成的代码。金宝app

生成的代码和插件禁用:

Out10: = WORD_TO_INT (SHL (: = INT_TO_WORD (IN),…N: = Out2_tmp));
生成的代码使用目标IDESHL转移函数。

生成的代码启用了插件:

Out10: = WORD_TO_INT (PLC_SHL (INT_TO_WORD (in),…DINT_TO_USINT (Out2_tmp)));VAR_INPUT in1函数PLC_SHL:词:词;in2: USINT;END_VAR‘圣’的身体如果in2 > 16然后PLC_SHL: 16 # = 0;其他PLC_SHL: = SHL (in1, in2);END_IF;END_BODY END_FUNCTION
生成的代码包含了函数PLC_SHL,复制模型转变块在目标IDE。金宝app

插件的内在转换功能

插件名称 插件的目的 何时使用插件 效果的插件生成的代码
fSimplifyAllIntrinsicFcn

简化了输入的内在功能。

IDE不允许复合表达式作为目标本征函数参数的一部分。

生成的代码和插件禁用:

答:=√x * y);

生成的代码启用了插件:

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

fSimplifyIntrinsicFcn

简化了参数的内在功能fSimplifyIntrinsicFcnNameList

IDE不允许复合表达式作为目标本征函数参数的一部分。

生成的代码和插件禁用:

答:=√x * y);

生成的代码启用了插件:

cfg。fSimplifyIntrinsicFcnNameList = {“√”\} cfg。fSimplifyIntrinsicFcn = true;t1: y = x *;答:= SQRT (t1);

fSimplifyIntrinsicFcnNameList

创建一个列表的内在功能。输入这些内在功能简化使用fSimplifyIntrinsicFcn

IDE不允许复合表达式作为目标本征函数参数的一部分。

生成的代码和插件禁用:

答:=√x * y);

生成的代码启用了插件:

cfg。fSimplifyIntrinsicFcnNameList = {“√”\} cfg。fSimplifyIntrinsicFcn = true;t1: y = x *;答:= SQRT (t1);

fSimplifyOperator

简化了运算符函数的输入通过上市fSimplifyOperatorNameList

复合表达式作为目标IDE不允许操作符函数参数的一部分。

生成的代码和插件禁用:

答:= SHL (x * y);

生成的代码启用了插件:

cfg。fSimplifyOperatorNameList ={的SHL \} cfg。fSimplifyOperator = true;t1: y = x *;答:= SHL (t1);

fSimplifyOperatorNameList

创建一个运算符函数的列表。输入这些运算符函数简化使用fSimplifyOperator

复合表达式作为目标IDE不允许操作符函数参数的一部分。

生成的代码和插件禁用:

答:= SHL (x * y);

生成的代码启用了插件:

cfg。fSimplifyOperatorNameList ={的SHL \} cfg。fSimplifyOperator = true;t1: y = x *;答:= SHL (t1);

fSimplifyTrunc

简化了输入的TRUNC函数。

IDE不允许目标化合物的表达式作为参数TRUNC函数。

生成的代码和插件禁用:

答:= TRUNC (x * y);

生成的代码启用了插件:

cfg。fSimplifyTrunc = true;t1: y = x *;答:= SHL (t1);

插件为XSD模式修改

插件名称 插件的目的 何时使用插件 效果的插件生成的代码
fEmitXsdSchema

生成XSD模式版本相关信息1.0

目标IDE需要XSD模式信息作为PLCOpen生成XML文件的一部分。

生成模式设置fEmitXsdSchema“v1”

将生成的代码和插件“没有”:

< ?xml version = " 1.0 " encoding = " utf - 8 " ? >

将生成的代码和插件“v1”:

< ?xml version = " 1.0 " encoding = " utf - 8 " ? >

通过使用基于插件目标IDE生成代码

这个例子展示了如何为自定义目标IDE生成代码我PLCopen XML通过使用插件。

  1. 创建一个文件夹叫myplcopen。创建一个plc_custom_ide.m使用这个模板文件的文件夹:

    函数plc_ide_list = plc_custom_ide% 2012 - 2021版权MathWorks公司。plc_ide_list (1) = get_ide_info_myplcopen;结束函数ide_info = get_ide_info_myplcopen ide_info.name =“myplcopen”;ide_info.description =“我的PLCopen XML”;ide_info.path=;%的IDE路径ide_info。格式=“xml”;%的通用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;结束函数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;结束

    设置你的插件选项function_cfg文件的部分。要启用插件设置插件选项真正的。例如,cfg。fArrayInitialValueBrackets = true;支持插件。禁用插件,插件选项

  2. 创建plc_precg_callback_IDEname.mplc_postcg_callback_IDEname.m通过使用这些文件模板:

    函数控制器= plc_precg_callback_myplcopen(控制器)% 2012 - 2020版权MathWorks公司。%做修改控制器结构,f.ex。i = 1:长度(controller.components) controller.components (i) .body = sprintf (' < < header_placeholder > > \ r \ n % s’controller.components(我).body);结束结束
    函数generatedFiles = plc_postcg_callback_myplcopen(文件名)% 2012 - 2020版权MathWorks公司。文件名={1}文件名;str = fileread(文件名);%做修改str, 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,“\ \ * . * ? \ * \)”);头= str (sHeader: eHeader);str = regexprep (str,“< < header_placeholder > >”,头);sfprivate (“str2file”str,文件名);generatedFiles ={文件名};结束

  3. 创建一个plc_header_hook.m使用这个模板文件:

    函数headerCommentText = plc_header_hook (filePath blockH headerCommentText) headerCommentText = [headerCommentText (1: end-7)sprintf ([“*插件头复制:是的\ n”])headerCommentText (end-6:结束)];结束

    plc_header_hook.m文件副本开始的头信息生成的代码文件的每个功能块实例。

  4. 添加新文件夹和文件到MATLAB路径。

    • 右键单击该文件夹并选择添加到路径>所选文件夹和子文件夹

    • 使用目录函数。例如,目录genpath(“路径文件夹”))

  5. 运行这个命令:

    plccoderpref (“plctargetidepaths”,“默认”)

    重新启动会话MATLAB。

  6. 打开你的代码生成模型和选择模型组件。打开PLC编码器应用程序,点击设置。在PLC的代码生成窗格中,在目标IDE中,选择我PLCopen XML。点击好吧

  7. PLC编码器应用程序,公司代码选项卡上,单击生成PLC代码为定制目标IDE生成代码。生成的代码文件中指定的路径ide_info.path= ''; % IDE path

相关的话题

外部网站