Генерация кода reusable
Добрый день.
Тут пробовал в домашнем проекте генрацию кода С из модели, в целом все работает замечательно, но есть один вопрос, на который не могу найти ответ, а вопрос связан с принципом по которому Embedded Coder решает создать копию данных или нет.
Собственно есть ПИд регулятор которой оформлен как Reference Subsystem.
Генерирую из него код с настройками Reusable получается вызов PID к коде следующего вида
/* Outputs for Atomic SubSystem: '<S121>/Pid_Vq' */
PidReg(&Pid_Vq, &Pid_Vq);
Понятна форма, так как идея Simulink от входа к выходу не желает использовать работу по указателю на прямую( Для встроенной системы типовое же поведение).
В теле же самой функции я вижу следующее
void PidReg(const PID_st *IN, PID_st *OUT)
{
real32_T local_Product_nj;
real32_T local_Sum_d;
PID_st local_BusAssignment_l;
real32_T local_Merge_a_tmp;
/* Outputs for Atomic SubSystem: '<S24>/PidReg' */
/* Sum: '<S27>/Sum' */
local_Product_nj = IN->Ref - IN->Fdb;
/* Sum: '<S35>/Satt+' incorporates:
* Product: '<S35>/Product1'
* Product: '<S35>/err*Ki'
* Sum: '<S35>/Ui+'
*/
local_Sum_d = (local_Product_nj * IN->Ki + IN->Ui) + IN->SatErr * IN->Kc;
/* Product: '<S36>/Product' */
local_Product_nj *= IN->Kp;
/* Sum: '<S29>/OutPreSat' */
local_Merge_a_tmp = local_Product_nj + local_Sum_d;
/* BusAssignment: '<S29>/Bus Assignment' */
local_BusAssignment_l = *IN;
local_BusAssignment_l.Up = local_Product_nj;
local_BusAssignment_l.OutPreSat = local_Merge_a_tmp;
local_BusAssignment_l.Ui = local_Sum_d;
/* If: '<S26>/If' incorporates:
* Inport: '<S30>/In1'
* Inport: '<S31>/In1'
* Inport: '<S32>/In1'
* RelationalOperator: '<S26>/OutPreSat > OutMax'
* RelationalOperator: '<S26>/OutPreSat<OutMin'
* SignalConversion generated from: '<S26>/Bus Selector'
* Sum: '<S29>/OutPreSat'
*/
if (local_Merge_a_tmp > local_BusAssignment_l.OutMax) {
/* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
* ActionPort: '<S30>/Action Port'
*/
local_Product_nj = local_BusAssignment_l.OutMax;
/* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
} else if (local_Merge_a_tmp < local_BusAssignment_l.OutMin) {
/* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem2' incorporates:
* ActionPort: '<S32>/Action Port'
*/
local_Product_nj = local_BusAssignment_l.OutMin;
/* End of Outputs for SubSystem: '<S26>/If Action Subsystem2' */
} else {
/* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem1' incorporates:
* ActionPort: '<S31>/Action Port'
*/
local_Product_nj = local_Merge_a_tmp;
/* End of Outputs for SubSystem: '<S26>/If Action Subsystem1' */
}
/* End of If: '<S26>/If' */
/* BusAssignment: '<S26>/Bus Assignment' incorporates:
* Sum: '<S26>/Sum'
*/
local_BusAssignment_l.Out = local_Product_nj;
local_BusAssignment_l.SatErr = local_Product_nj - local_Merge_a_tmp;
/* BusAssignment: '<S28>/Bus Assignment' */
*OUT = local_BusAssignment_l;
/* If: '<S28>/If' incorporates:
* RelationalOperator: '<S28>/Relational Operator'
*/
if (local_BusAssignment_l.defaultBit > 0U) {
/* Outputs for IfAction SubSystem: '<S28>/Ui=0' incorporates:
* ActionPort: '<S33>/Action Port'
*/
/* BusAssignment: '<S28>/Bus Assignment' incorporates:
* Constant: '<S28>/Constant'
* Inport: '<S33>/In1'
*/
OUT->Ui = 0.0F;
/* End of Outputs for SubSystem: '<S28>/Ui=0' */
} else {
/* BusAssignment: '<S28>/Bus Assignment' incorporates:
* BusAssignment: '<S29>/Bus Assignment'
*/
OUT->Ui = local_Sum_d;
}
/* End of If: '<S28>/If' */
/* End of Outputs for SubSystem: '<S24>/PidReg' */
}
Вот создание буферной переменной PID_st local_BusAssignment_l; не совсем понятно.
Ведь можно было просто сделать обмен указателями.
Буду признателен если кто то прокомментирует и возможно укажет, где почитать про правила при кодгенерации)
Комментарии
Богато живете - "Тут пробовал в домашнем проекте генрацию кода С из модели".
К сожалению единственное где могу попробовать) На работе про такое слыхом не слыхивали.
По существу то есть чего?
Вы и без меня всё знаете, мне приходила ссылка на Ваш вебинар.