如何调整Simulink模型使Embedded Coder生成数组形式的外部输入输出?
实现Simulink Embedded Coder生成数组形式的外部输入输出结构体
问题背景
当前使用Simulink Embedded Coder生成子系统C代码时,外部输入输出结构体为单个变量形式:
/* External inputs (root inport signals with default storage) */ typedef struct { real_T V_dc_abs_B; /* '<Root>/V_dc_abs_B' */ real_T CM_B; /* '<Root>/CM_B' */ real_T GMEAS_A; /* '<Root>/GMEAS_A' */ real_T GMEAS_B; /* '<Root>/GMEAS_B' */ real_T V_dc_abs_A; /* '<Root>/V_dc_abs_A' */ real_T CM_A; /* '<Root>/CM_A' */ } ExtU_Regelung_T; /* External outputs (root outports fed by signals with default storage) */ typedef struct { real_T AO_A; /* '<Root>/AO_A' */ real_T AO_B; /* '<Root>/AO_B' */ } ExtY_Regelung_T;
希望调整模型,生成类似参考示例的数组形式结构体:
/* External inputs (root inport signals with default storage) */ typedef struct { real_T INPUTS[24]; /* '<Root>/INPUTS' */ } ExtU_WindExample_T; /* External outputs (root outports fed by signals with default storage) */ typedef struct { real_T OUTPUTS[21]; /* '<Root>/OUTPUTS' */ } ExtY_WindExample_T;
尝试过Bus Creator和Selector模块未得到预期结果,需可行解决方法。
解决步骤
1. 替换根输入/输出端口为数组端口
- 删除原有的6个根输入端口,添加单个根输入端口,将其信号维度设置为
[6 1](对应原6个输入),命名为INPUTS - 同理,删除原有的2个根输出端口,添加单个根输出端口,信号维度设置为
[2 1],命名为OUTPUTS - 使用Selector模块拆分数组输入:将
INPUTS端口连接到Selector模块,设置每个Selector模块的索引对应原输入的位置(比如第1个原输入对应索引1,第2个对应索引2,以此类推),拆分后分别连接到子系统的各个输入 - 使用Concatenate模块合并子系统输出:将子系统的2个输出连接到Concatenate模块,设置输出维度为
[2 1],再连接到根输出端口OUTPUTS
2. 配置代码生成的存储类
- 打开Model Configuration Parameters,进入Code Generation > Interface页面
- 在Code interface packaging中选择
C-struct - 找到External inputs和External outputs的设置:
- 确保
External inputs的存储类设置为Default,结构体名称可自定义(比如ExtU_Regelung_T) - 确保
External outputs的存储类设置为Default,结构体名称自定义(比如ExtY_Regelung_T)
- 确保
- 进入Code Generation > Code Style页面,在Identifier format中可设置数组变量名(直接用根端口的名称
INPUTS/OUTPUTS即可)
3. 验证代码生成
- 重新生成代码,检查头文件中的外部输入输出结构体,确认是否为数组形式
- 如果数组名称不符合预期,直接修改根端口的名称为
INPUTS/OUTPUTS,代码生成时会自动沿用端口名作为数组变量名
注:Bus Creator模块用于生成总线结构体,而非数组形式,因此之前使用Bus Creator无法得到预期结果,改用数组端口+Selector/Concatenate的方式即可实现需求。
内容的提问来源于stack exchange,提问作者WamboRambo
相关产品推荐
相关产品推荐

