From Simulink to C-Code and back to Simulink
10 views (last 30 days)
Show older comments
Juan Lopez on 5 Mar 2021
Answered: Mark McBroom on 6 Mar 2021
I am trying to generate a C code for a controller in a Simulink Model, that I want to replace in the original Simulink model for the C code in order to test it.
This are the steps I followed:
C code creation:
- Check "treat as atomic unit" in the controller subsystem and then convert to "Referenced Model". Opened the control as top Model.
- Opened Simulink coder app and went to "C code generation settings", used grt.tlc (I am using Simulink coder and it doesnt let me change to ert.tlc even though I have embedded coder installed)
- Build the model and get all the .c and .h codes (no main.c is created!)
C Code insertion in Simulink.
- On the comlpete model, I go to simulation target settings, include the header file "control.h" and the source file "control.c" that were generated by the simulink coder. I also include the directories were all the h and c files are.
- Since the step function is void in the definition and the inputs and outputs were declared as external, I check on the "Enable custom code globals as function interface".
- I call "C caller" in simulink and try to get the functions, which dont appear. I click on the refresh custom code and find that "rt_logging.h" cannot be found but it was declared in "control.h". Since this "rt_logging.h" was not generated (MAT file Logging was checked), I comment it out from the "control.h" and now I can see all the functions that were created in "control.c". Remember that this "control.c" is the generated file from the simulink coder.
- Once I can see all the functions, I decide to select the step one, which is the main one, and the external inputs and outpus are now accesible in the c caller block.
- I create the signal bus and connect the c caller in place in the Simulink model and run it.
- I find varios erros corresponding to "undifined reference" that I have identified to be other functions in the "control.c" but outside the "control_Step.c". One of them however is linked to a function defined in "rt_logging.c" which was actually created but in the html folder, but again no "rt_logging.h" was found.
So my question is what I am doing wrong? I guess it should be in step 4 of the second part, where I only insert the "control_Step.c".
How can I insert in the C caller something that runs all that I created with simulink coder?
Included are some pictures of the model with the C caller already implemented and also the simulink model of what is included in the control.
NOTE: I also tried code generation with Embedded Coder App using ert.tlc but the problem that appears is that the code generation uses some types definitions that generate error: byte_T, creal32_T and creal64_T. I found out that these are "Reserved Keywords for Code Generation" and even though I tried copying this keywords in the identifiers section in code generation settings, the code still appears with this words and keep throwing the error.
Mark McBroom on 6 Mar 2021
"SIL" mode addresses this use case and eliminates all of the uncessary steps you are trying to follow. SIL mode allows you to replace a top model or referenced model with the generated code and then run your simulation using the generated code.
More Answers (0)
Find more on Simulink Coder in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!