Main Content

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.

Flowchart displaying steps to create and use 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.

  1. Open the plcdemo_simple_subsystem example. To open the example, enter:

    openExample('plcdemo_simple_subsystem');

  2. Open the SimpleSubsystem block. Change the input variable name from U to Controller.

  3. 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

  4. 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.

  5. Open the generated code file. Verify that Controller is changed to b_Controller.

Limitations

The output of the plc_custom_keyword.m file must be of the data type cell array of character vectors.