Во время генерации кода Simulink® PLC Coder™ использует файл hook, чтобы изменить целевой список ключевых слов по умолчанию 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
Чтобы создать пользовательский файл ключевых слов для нескольких целевых IDE, используйте следующий шаблон:
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, используя шаблон для создания add_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 Coder. На вкладке PLC Code нажмите Generate PLC Code.
Откройте сгенерированный файл кода. Проверьте, что Controller
изменяется на b_Controller
.