Во время генерации кода, Simulink® PLC Coder™ использует файл рычага, чтобы изменить целевой список ключевых слов значения по умолчанию IDE и ключевые слова использования из модифицированного списка ключевых слов, чтобы проверять на и изменить имена компонента модели, которые совпадают с любыми ключевыми словами. Используйте MATLAB® чтобы создать коллбэк сцепляют файл, который содержит целевой специфичный для IDE пользовательский список ключевых слов.
Именем пользовательского файла ключевого слова должен быть plc_custom_keyword.m. Чтобы создать пользовательский файл ключевого слова для IDE единой цели, используйте этот шаблон:
function keyword_list = plc_custom_keyword(keyword_list) % % Copyright 2020 The MathWorks, Inc. add_list = { 'state', ... 'test',... 'control',... }; delete_list = { 'jmp', ... 'method', ... 'transition', ... }; keyword_list = union(keyword_list, add_list); keyword_list = setdiff(keyword_list, delete_list); end
Чтобы создать пользовательский файл ключевого слова для нескольких целевых ИД, используйте этот шаблон:
function keyword_list = plc_custom_keyword(keyword_list) % % Copyright 2020 The MathWorks, Inc. target = get_param(gcs,'PLC_TargetIDE'); switch target case 'codesys23' add_list = {'state'}; delete_list = {'jmp'}; case 'pcworx60' add_list = {'control'}; delete_list = {'method'}; case 'codesys35' add_list = {'mykeyword3'}; delete_list = {'time'}; case 'omron' add_list = {'mykeyword'}; delete_list = {'reset'}; case 'rslogix5000' add_list = {'mykeyword1'}; delete_list = {'retain'}; case 'tiaportal' dd_list = {'mykeyword2'}; delete_list = {'sint'}; otherwise add_list = {'test'}; delete_list = {'transition'}; end keyword_list = union(keyword_list, add_list); keyword_list = setdiff(keyword_list, delete_list); end
Входной параметр keyword_list список ключевых слов по умолчанию для выбранной цели. Измените целевой IDE определенный список ключевых слов, при помощи шаблона к createadd_list и delete_list списки, чтобы изменить keyword_list по умолчанию . Ключевые слова от выхода keyword_list используются, чтобы совпадать и переименовать компоненты модели во время генерации кода. Обратитесь к этим спискам ключевых слов по умолчанию, чтобы решить, который перечисляют ключевые слова добавить или удалить к вашему пользовательскому ключевому слову.
Этими списками является целевой специфичный для IDE keyword_list по умолчанию списки.
keyword_list = { ...
'abs', ...
'acos', ...
'action', ...
'add', ...
'adr', ...
'adrinst', ...
'and', ...
'andn', ...
'any', ...
'array', ...
'asin', ...
'at', ...
'atan', ...
'begin', ...
'bitadr', ...
'bool', ...
'by', ...
'byte', ...
'cal', ...
'calc', ...
'calcn', ...
'case', ...
'configuration', ...
'const', ...
'constant', ...
'continue', ...
'cos', ...
'counter', ...
'date', ...
'data_and_time', ...
'dint', ...
'div', ...
'd', ...
'do', ...
'ds', ...
'dt', ...
'dword', ...
'else', ...
'elsif', ...
'en', ...
'end', ...
'end_action', ...
'end_case', ...
'end_const', ...
'end_for', ...
'end_function', ...
'end_function_block', ...
'end_if', ...
'end_program', ...
'enf_configuration', ...
'end_repeat', ...
'end_step', ...
'end_struct', ...
'end_type', ...
'end_var', ...
'end_while', ...
'eno', ...
'eq', ...
'exit', ...
'exp', ...
'expt', ...
'f_edge', ...
'false', ...
'for', ...
'function', ...
'function_block', ...
'from', ...
'ge', ...
'gt', ...
'if', ...
'indexof', ...
'ini', ...
'initial_step', ...
'int', ...
'jmp', ...
'jmpc', ...
'jmpcn', ...
'l', ...
'ld', ...
'ldn', ...
'le', ...
'lint', ...
'limit', ...
'ln', ...
'log', ...
'lreal', ...
'lt', ...
'lword', ...
'max', ...
'method', ...
'min', ...
'mod', ...
'move', ...
'mul', ...
'mux', ...
'n', ...
'ne', ...
'non_retain', ...
'not', ...
'of', ...
'on', ...
'or', ...
'orn', ...
'p', ...
'persistent', ...
'pointer', ...
'program', ...
'r', ...
'r_edge', ...
'read_only', ...
'read_write', ...
'real', ...
'repeat', ...
'reset', ...
'resource', ...
'ret', ...
'retain', ...
'retc', ...
'retcn', ...
'return', ...
'rol', ...
'ror', ...
's', ...
'sd', ...
'sel', ...
'shl', ...
'shr', ...
'sin', ...
'sint', ...
'sizeof', ...
'sl', ...
'sqrt', ...
'st', ...
'step', ...
'stn', ...
'string', ...
'struct', ...
'sub', ...
'tan', ...
'task', ...
'then', ...
'time', ...
'timer', ...
'time_of_day', ...
'to', ...
'tod', ...
'transition', ...
'true', ...
'trunc', ...
'type', ...
'udint', ...
'uint', ...
'ulint', ...
'until', ...
'usint', ...
'var', ...
'var_access', ...
'var_config', ...
'var_constant', ...
'var_external', ...
'var_global', ...
'var_in_out', ...
'var_input', ...
'var_output', ...
'var_temp', ...
'while', ...
'with', ...
'word', ...
'wstring', ...
'xor', ...
'xorn', ...
}; omron_list = { ...
'np', ...
'up',...
}; rockwell_list = { ...
'control',...
}; selectron_list = { ...
'&' ...
'(' ...
')' ...
'*' ...
'**' ...
'+' ...
'-' ...
'/' ...
'<' ...
'<=' ...
'<>' ...
'=' ...
'>' ...
'>=' ...
'ACTION' ...
'ADD' ...
'AND' ...
'ANDN' ...
'ANY' ...
'ANY_BIT' ...
'ANY_DATE' ...
'ANY_DUT' ...
'ANY_FB' ...
'ANY_INT' ...
'ANY_NUM' ...
'ANY_REAL' ...
'ARRAY' ...
'AT' ...
'BODY' ...
'BOOL' ...
'BY' ...
'BYTE' ...
'CAL' ...
'CALC' ...
'CALCN' ...
'CASE' ...
'CONFIGURATION' ...
'CONSTANT' ...
'DATE' ...
'DATE_AND_TIME' ...
'DINT' ...
'DIV' ...
'DO' ...
'DT' ...
'DWORD' ...
'ELSE' ...
'ELSIF' ...
'EN' ...
'END_ACTION' ...
'END_BODY' ...
'END_CASE' ...
'END_CONFIGURATION' ...
'END_FOR' ...
'END_FUNCTION' ...
'END_FUNCTION_BLOCK' ...
'END_IF' ...
'END_PLC_CONFIG' ...
'END_PROGRAM' ...
'END_REPEAT' ...
'END_RESOURCE' ...
'END_STEP' ...
'END_STRUCT' ...
'END_TRANSITION' ...
'END_TYPE' ...
'END_VAR' ...
'END_WHILE' ...
'ENO' ...
'EQ' ...
'EXIT' ...
'FALSE' ...
'FOR' ...
'FROM' ...
'FUNCTION' ...
'FUNCTION_BLOCK' ...
'F_EDGE' ...
'GE' ...
'GT' ...
'IF' ...
'INITIAL_STEP' ...
'INT' ...
'INTERVAL' ...
'JMP' ...
'JMPC' ...
'JMPCN' ...
'LD' ...
'LDN' ...
'LE' ...
'LINT' ...
'LREAL' ...
'LT' ...
'LWORD' ...
'MOD' ...
'MUL' ...
'NE' ...
'NOT' ...
'OF' ...
'OFFSETOF' ...
'ON' ...
'OR' ...
'ORN' ...
'PLC_CONFIG' ...
'PRIORITY' ...
'PROGRAM' ...
'R' ...
'R1' ...
'READ_ONLY' ...
'READ_WRITE' ...
'REAL' ...
'REPEAT' ...
'RESOURCE' ...
'RET' ...
'RETAIN' ...
'RETC' ...
'RETCN' ...
'RETURN' ...
'R_EDGE' ...
'S' ...
'S1' ...
'SINGLE' ...
'SINT' ...
'SIZEOF' ...
'ST' ...
'STEP' ...
'STN' ...
'STRING' ...
'STRUCT' ...
'SUB' ...
'TASK' ...
'THEN' ...
'TIME' ...
'TIME_OF_DAY' ...
'TO' ...
'TOD' ...
'TRANSITION' ...
'TRUE' ...
'TYPE' ...
'UDINT' ...
'UINT' ...
'ULINT' ...
'UNTIL' ...
'USINT' ...
'VAR' ...
'VAR_ACCESS' ...
'VAR_CONSTANT' ...
'VAR_CONSTANT_RETAIN' ...
'VAR_EXTERNAL' ...
'VAR_EXTERNAL_CONSTANT' ...
'VAR_EXTERNAL_CONSTANT_RETAIN' ...
'VAR_EXTERNAL_RETAIN' ...
'VAR_GLOBAL' ...
'VAR_GLOBAL_CONSTANT' ...
'VAR_GLOBAL_CONSTANT_RETAIN' ...
'VAR_GLOBAL_RETAIN' ...
'VAR_INPUT' ...
'VAR_INPUT_RETAIN' ...
'VAR_IN_EXT' ...
'VAR_IN_OUT' ...
'VAR_IN_OUT_CONSTANT' ...
'VAR_OUTPUT' ...
'VAR_OUTPUT_RETAIN' ...
'VAR_RETAIN' ...
'VAR_TEMP' ...
'WHILE' ...
'WITH' ...
'WORD' ...
'XOR' ...
'XORN' ...
'_ACTION' ...
'_SFC_DEBUG' ...
'_STEP' ...
'auto' ...
'break' ...
'char' ...
'const' ...
'continue' ...
'default' ...
'double' ...
'enum' ...
'extern' ...
'float' ...
'goto' ...
'if' ...
'inline' ...
'long' ...
'register' ...
'restrict' ...
'short' ...
'signed' ...
'static' ...
'switch' ...
'typedef' ...
'union' ...
'unsigned' ...
'void' ...
'volatile' ...
}; step7_keyword_list = { ...
'fb', ...
'db', ...
'ob', ...
'fc', ...
'ib', ...
'mb', ...
'udt', ...
'di', ...
'scale', ...
'B', ...
'ref', ...
'switch', ...
'norm', ...
'set', ...
'ss'
}; tia_portal_keyword_list = { ...
'a_dead_b', ...
'abs_ctrl', ...
'abs_diag', ...
'abs_init', ...
'act_tint', ...
'ag_cntex', ...
'ag_cntrl', ...
'ag_lock', ...
'ag_recv', ...
'ag_send', ...
'ag_unlock', ...
'alarm_d', ...
'alarm_dq', ...
'alarm_s', ...
'alarm_sc', ...
'alarm_sq', ...
'analog', ...
'as_dial', ...
'asi_3422', ...
'asi_ctrl', ...
'asin', ...
'atan', ...
'ath', ...
'att', ...
'attach', ...
'attr_db', ...
'bcdcpl', ...
'bitsum', ...
'blkmov', ...
'brcv', ...
'bsend', ...
'bt_lt', ...
'by', ...
'c_cntrl', ...
'cam_ctrl', ...
'cam_diag', ...
'cam_init', ...
'can_dint', ...
'can_tint', ...
'cdt', ...
'ceil', ...
'ch_diag', ...
'chars_to_strg', ...
'cir', ...
'cj_t_par', ...
'cnt2_ctr', ...
'cnt2rdpn', ...
'cnt2wrpn', ...
'cnt_ctl1', ...
'cnt_ctl2', ...
'cnt_ctrl', ...
'compress', ...
'concat', ...
'concat_date_ltod', ...
'concat_date_tod', ...
'cont_c', ...
'cont_s', ...
'convert', ...
'count', ...
'countofelements', ...
'crea_dbl', ...
'creat_db', ...
'create_db', ...
'crp_in', ...
'crp_out', ...
'ctd', ...
'ctrl_rtm', ...
'ctu', ...
'ctud', ...
'd_act_dp', ...
'datalogclear', ...
'datalogclose', ...
'datalogcreate', ...
'datalogdelete', ...
'datalognewfile', ...
'datalogopen', ...
'datalogwrite', ...
'db', ...
'db_any_to_variant', ...
'dcat', ...
'dead_t', ...
'deadband', ...
'deco', ...
'del_db', ...
'del_si', ...
'delete', ...
'delete_db', ...
'demux', ...
'deserialize', ...
'detach', ...
'dev', ...
'devicestates', ...
'diag_inf', ...
'diag_rd', ...
'dif', ...
'digital', ...
'dis_airt', ...
'dis_irt', ...
'div', ...
'dmsk_flt', ...
'do', ...
'dp_ctrl', ...
'dp_diag', ...
'dp_recv', ...
'dp_send', ...
'dp_topol', ...
'dpnrm_dg', ...
'dprd_dat', ...
'dpsyc_fr', ...
'dpwr_dat', ...
'drum', ...
'drum_x', ...
'eb', ...
'en', ...
'en_airt', ...
'en_irt', ...
'enco', ...
'encoderabssensordp', ...
'encoderet200s1count', ...
'encoderet200s1ssi', ...
'encoderfm350', ...
'encoderim174', ...
'encoderim178', ...
'encodersinamics', ...
'encodersm338', ...
'encoderuniversal', ...
'endis_pw', ...
'eno', ...
'err_mon', ...
'exit', ...
'fb', ...
'f_trig', ...
'failsafe_protect', ...
'fifo', ...
'fill', ...
'fill_blk', ...
'find', ...
'floor', ...
'fmt_cj_t', ...
'fmt_ds1', ...
'fmt_par', ...
'fmt_pid', ...
'fmt_pv', ...
'fmt_tun', ...
'force_355', ...
'frac', ...
'frequenc', ...
'ftp_cmd', ...
'fuz_355', ...
'gb', ...
'gadr_lgc', ...
'gen_diag', ...
'gen_usrmsg', ...
'geo2log', ...
'geo_log', ...
'get', ...
'get_alarmstate', ...
'get_diag', ...
'get_err_id', ...
'get_error', ...
'get_features', ...
'get_im_data', ...
'get_name', ...
'get_s', ...
'getblockname', ...
'getinstancename', ...
'getinstancepath', ...
'getio', ...
'getio_part', ...
'getstationinfo', ...
'getsymbolname', ...
'getsymbolpath', ...
'high_speed_counter', ...
'hta', ...
'i_abort', ...
'i_get', ...
'i_put', ...
'imc', ...
'init_rd', ...
'insert', ...
'integ', ...
'inventory', ...
'io2mod', ...
'ip_config', ...
'is_array', ...
'join', ...
'lag1st', ...
'lag2nd', ...
'lead_lag', ...
'led', ...
'left', ...
'len', ...
'lgc_gadr', ...
'lifo', ...
'limalarm', ...
'limit', ...
'limiter', ...
'ln', ...
'loc_time', ...
'log2geo', ...
'log2mod', ...
'log_geo', ...
'logical_trigger', ...
'lp_sched', ...
'lp_sched_m', ...
'lt_bt', ...
'max', ...
'max_len', ...
'mb_client', ...
'mb_server', ...
'mc_control', ...
'mc_gearin', ...
'mc_halt', ...
'mc_home', ...
'mc_init', ...
'mc_moveabsolute', ...
'mc_movejog', ...
'mc_moverelaive', ...
'mc_moverelative', ...
'mc_movevelocity', ...
'mc_power', ...
'mc_reset', ...
'mc_simulation', ...
'mc_stopmotion', ...
'mcat', ...
'md', ...
'mid', ...
'mn', ...
'mod', ...
'modb_341', ...
'modbus_comm_load', ...
'modbus_master', ...
'modbus_slave', ...
'modulestates', ...
'move_blk', ...
'move_blk_variant', ...
'msk_flt', ...
'mux', ...
'none', ...
'nonlin', ...
'norm', ...
'norm_x', ...
'not', ...
'notify', ...
'null', ...
'ob', ...
'of', ...
'or', ...
'outputet200s2ao', ...
'outputim174', ...
'outputim178', ...
'outputmm4_dp', ...
'outputsinamics', ...
'outputsm332', ...
'outputuniversal', ...
'override', ...
'pb', ...
'p3964_config', ...
'p_print', ...
'p_prt341', ...
'p_rcv', ...
'p_rcv_rk', ...
'p_reset', ...
'p_send', ...
'p_snd_rk', ...
'pack', ...
'para_ctl', ...
'parm_mod', ...
'pe_cmd', ...
'pe_cmd_cp', ...
'pe_ds3_write_et200s', ...
'pe_ds3_write_et200s_cp', ...
'pe_end_rsp', ...
'pe_error_rsp', ...
'pe_get_mode_rsp', ...
'pe_i_dev', ...
'pe_i_dev_cp', ...
'pe_identify_rsp', ...
'pe_list_modes_rsp', ...
'pe_measurement_list_rsp', ...
'pe_measurement_value_rsp', ...
'pe_pem_status_rsp', ...
'pe_start_end', ...
'pe_start_end_cp', ...
'pe_start_rsp', ...
'pe_wol', ...
'peek', ...
'peek_bool', ...
'pg_dial', ...
'pid', ...
'pid_3step', ...
'pid_compact', ...
'pid_cp', ...
'pid_es', ...
'pid_fm', ...
'pid_par', ...
'pid_temp', ...
'pip', ...
'pnio_alarm', ...
'pnio_recv', ...
'pnio_rw_rec', ...
'pnio_send', ...
'poke', ...
'poke_blk', ...
'poke_bool', ...
'port', ...
'port_config', ...
'preset_timer', ...
'program_alarm', ...
'protect', ...
'prvrec', ...
'pulse', ...
'pulsegen', ...
'pulsegen_m', ...
'put', ...
'qry_cint', ...
'qry_dint', ...
'qry_tint', ...
'r_trig', ...
'ralrm', ...
'rcvrec', ...
'rd_addr', ...
'rd_dpar', ...
'rd_dpara', ...
'rd_dparm', ...
'rd_lgadr', ...
'rd_loc_t', ...
'rd_rec', ...
'rd_sinfo', ...
'rd_sys_t', ...
'rdrec', ...
'rdsysst', ...
're_trigr', ...
'read', ...
'read_355', ...
'read_big', ...
'read_dbl', ...
'read_err', ...
'read_little', ...
'read_rtm', ...
'read_si', ...
'readfromarraydb', ...
'readfromarraydbl', ...
'receive_config', ...
'receive_p2p', ...
'receive_reset', ...
'recipeexport', ...
'recipeimport', ...
'reconfigiosystem', ...
'repl_val', ...
'replace', ...
'reset', ...
'reset_timer', ...
'reseti', ...
'return', ...
'right', ...
'rmp_soak', ...
'roc_lim', ...
'rol', ...
'ror', ...
'round', ...
'rt_info', ...
'rtm', ...
'runtime', ...
's_cd', ...
's_conv', ...
's_cu', ...
's_cud', ...
's_ltint', ...
's_modb', ...
's_odt', ...
's_odts', ...
's_offdt', ...
's_pext', ...
's_pulse', ...
's_rcv', ...
's_rts', ...
's_send', ...
's_ussi', ...
's_ussr', ...
's_usst', ...
's_v24', ...
's_vset', ...
's_vstat', ...
's_xon', ...
'scale', ...
'scale_m', ...
'scale_x', ...
'seg', ...
'sel', ...
'send_config', ...
'send_p2p', ...
'serialize', ...
'set', ...
'set_addr', ...
'set_cint', ...
'set_clks', ...
'set_features', ...
'set_param', ...
'set_rtm', ...
'set_sw', ...
'set_sw_s', ...
'set_timezone', ...
'set_tint', ...
'set_tintl', ...
'seti', ...
'setio', ...
'setio_part', ...
'shl', ...
'shr', ...
'shrb', ...
'signal_get', ...
'signal_set', ...
'sin', ...
'smc', ...
'sms_send', ...
'snc_rtcb', ...
'sp_gen', ...
'split', ...
'splt_ran', ...
'sqr', ...
'sqrt', ...
'srt_dint', ...
'stp', ...
'strg_to_chars', ...
'swap', ...
'switch', ...
'sync_pi', ...
'sync_po', ...
't_add', ...
't_combine', ...
't_comp', ...
't_config', ...
't_conv', ...
't_diag', ...
't_diff', ...
't_reset', ...
't_sub', ...
'tbl', ...
'tbl_find', ...
'tbl_tbl', ...
'tbl_wrd', ...
'tcon', ...
'tcont_cp', ...
'tcont_s', ...
'tdiscon', ...
'test_db', ...
'this', ...
'time_tck', ...
'timestmp', ...
'tmail_c', ...
'to', ...
'tof', ...
'ton', ...
'tonr', ...
'tonr_x', ...
'tp', ...
'trcv', ...
'trcv_c', ...
'true', ...
'trunc', ...
'tsend', ...
'tsend_c', ...
'tun_ec', ...
'tun_es', ...
'turcv', ...
'tusend', ...
'typeof', ...
'typeofelements', ...
'ublkmov', ...
'ufill_blk', ...
'umove_blk', ...
'unscale', ...
'until', ...
'updat_pi', ...
'updat_po', ...
'urcv', ...
'urcv_s', ...
'usend', ...
'usend_s', ...
'uss_drive_control', ...
'uss_port_scan', ...
'uss_read_param', ...
'uss_write_param', ...
'v24_set', ...
'v24_set_340', ...
'v24_stat', ...
'v24_stat_340', ...
'variant_to_db_any', ...
'variantget', ...
'variantput', ...
'wait', ...
'wr_dparm', ...
'wr_loc_t', ...
'wr_parm', ...
'wr_rec', ...
'wr_sys_t', ...
'wr_usmsg', ...
'wrd_tbl', ...
'writ_dbl', ...
'write', ...
'write_big', ...
'write_little', ...
'writetoarraydb', ...
'writetoarraydbl', ...
'wrrec', ...
'wsr', ...
'www', ...
'x_abort', ...
'x_get', ...
'x_put', ...
'x_rcv', ...
'x_send', ...
'B', ...
'ref', ...
'ss', ...
}; Эта блок-схема отображает процесс использования пользовательского файла ключевого слова:

Необходимо добавить plc_custom_keyword.m файл к пути MATLAB для пользовательских проверок ключевого слова, чтобы работать.
В этом примере показано, как создать пользовательский файл ключевого слова и проверить, что сгенерированный код содержит переменные с именами, которые изменились, потому что они совпадали с именами в списке ключевых слов.
Откройте plcdemo_simple_subsystem пример.
Откройте SimpleSubsystem блок. Поменяйте имя входной переменной от U к Controller.

Создайте plc_custom_keyword.m файл при помощи этого кода:
function keyword_list = plc_custom_keyword(keyword_list)
%
% Copyright 2020 The MathWorks, Inc.
add_list = { 'state', ...
'test',...
'controller',...
};
delete_list = { 'jmp', ...
'method', ...
'transition', ...
};
keyword_list = union(keyword_list, add_list);
keyword_list = setdiff(keyword_list, delete_list);
endДобавьте custom_plc_keyword.m файл к пути MATLAB. Откройте приложение Кодера PLC. На вкладке PLC Code нажмите Generate PLC Code.
Откройте файл сгенерированного кода. Проверьте тот Controller изменяется на b_Controller.

Выход custom_plc_keyword.m файл должен иметь массив ячеек из символьных векторов типа данных.