Create Custom Target-Based Keyword List
During code generation, Simulink® PLC Coder™ uses a hook file to modify the target IDE default keyword list. Simulink PLC Coder uses keywords from the modified keyword list to check for and modify model component names that match any keywords. To create a callback hook file that contains a target IDE-specific custom keyword list, use MATLAB®.
Custom Keyword File Template
The name of the custom keyword file must be plc_custom_keyword.m
. To
create a custom keyword file for a single target IDE, use this
template:
function [add_list,delete_list] = plc_custom_keyword() % % Copyright 2020 The MathWorks, Inc. add_list = {}; delete_list = { 'Word'}; end
To create a custom keyword file for multiple target IDEs, use this template:
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 end
The input argument keyword_list
is the default keyword list for the
selected target. Modify the target IDE specific keyword list, by using the template to
create add_list
and delete_list
lists to modify the
default keyword_list
. The keywords from the output
keyword_list
are used to match and rename model components during code
generation. Refer to these default keyword lists to decide which keywords to add or remove
to your custom keyword list.
These lists are the target IDE-specific default keyword_list
lists.
Generic and PLCOpen ST 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 Keyword List
omron_list = { ... 'np', ... 'up',... };
Rockwell Keyword List
rockwell_list = { ... 'control',... };
Selectron Keyword List
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' ... };
Siemens STEP7 Keyword List
step7_keyword_list = { ... 'fb', ... 'db', ... 'ob', ... 'fc', ... 'ib', ... 'mb', ... 'udt', ... 'di', ... 'scale', ... 'B', ... 'ref', ... 'switch', ... 'norm', ... 'set', ... 'ss' };
Siemens TIA Portal Keyword List
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', ... };
Custom Keyword File Usage Workflow
This flowchart displays the process of using the custom keyword file.
You must add the plc_custom_keyword.m
file to the MATLAB path for custom keyword checks to work.
Verify Custom Keyword Name Changes in Generated Code
This example shows how to create a custom keyword file and verify that the generated code contains variables with names that have changed because they matched names in the keyword list.
Open the
plcdemo_simple_subsystem
example. To open the example, enter:openExample('plcdemo_simple_subsystem');
Open the
SimpleSubsystem
block. Change the input variable name fromU
toController
.Create the
plc_custom_keyword.m
file by using this code:function [add_list,delete_list] = plc_custom_keyword() % % Copyright 2020 The MathWorks, Inc. add_list = {'Controller'}; delete_list = { 'Word'}; end
Add the
plc_custom_keyword.m
file to the MATLAB path. Open the PLC Coder app. On the PLC Code tab, click Generate PLC Code.Open the generated code file. Verify that
Controller
is changed tob_Controller
.
Limitations
The output of the plc_custom_keyword.m
file must be of the data type
cell array of character vectors.