使用 s-function 从 simulink 方案中导出 c++ 代码

Export c++ code from simulink scheme with s-function

我有一个 simulink 工作 simulink 模式,其中有一些 s-function,我想用 c++ 导出这段代码并编译它。我已经尝试导出和编译一个简单的模式并且它有效,但是当我尝试编译我的项目的导出代码时,我遇到了很多错误,例如

error: #error Unrecognized use   
error: #error Must define one of RT,nNRT, MATLAB_MEX_FILE, SL_INTERNAL, or FIPXT_SHARED_MODULE     
error: #error Unhandled case  
error: ‘mxArray’ does not name a type  mxArray       **dlgParams; /* The S-function parameters   
error: ‘mxArray’ has not been declared  mxArray **) 
error: ‘mxArray’ does  not name a type mxArray     *propVal;  
error: ‘RTWSfcnInfo’ does not name a type; did you mean ‘RTWLogInfo’? RTWSfcnInfo sfcnInfo

我使用的主要设置是:

Code generation system target file --> grt.tlc
language --> C++
Pack code and artifact --> <name_zip>
Tool chain GNU gcc/g++ | gmake (64-bit Linux)
default parameter behavior --> tuanble
code interface packaging --> nonreusable function
external mode --> chcked
standar math library --> c++ 03(ISO)
single output/update function --> checked
i used a fixed step size solver

我正在使用 Ubuntu 18.

源代码生成成功问题是当我尝试编译代码时。 生成代码后,我会得到一个包含所有源代码的 zip 文件夹,以及我在制作 CMakeLists.txt 时包含的一些外部头文件。我还尝试使用 .mk 文件直接编译代码,但我也遇到了很多错误。问题与 s-function 相关,因为我构建了一个简单的 simulink 模式,其中包含一个源 s-function,它实现了一个动态模型和一个输出,当我生成代码并编译它时,我得到了同样的错误。我还尝试制作一个没有 s-function 的简单模式,这很有效。那么s-function有没有设置可以导出

最后我找到了一个答案post,以防其他人遇到我同样的问题。

我的有效解决方案是:

首先,一旦你有了包含所有源的生成的 zip 文件,headers 打开它并在 Matlab 工作区加载文件 buldinfo.mat 然后在 Matlab shell 运行

packNGo(buildInfo)

通过这种方式,您可以生成一个包含所有源和 headers 的新 .zip,这个 .zip 与之前的不同,因为它是扁平的,没有嵌套文件夹。

在此文件夹中有一个名为 define.txt 的文件,其中包含一个变量列表,所有这些变量都应作为标志传递给编译器。例如,在我的例子中,我使用 CMakelists.txt 来设置我使用的这些标志

set(CMAKE_CXX_FLAGS "-Wall -Wextra -DMODEL=test_sum_gain -DNUMST=2 -DNCSTATES=2 -DRT -DUSE_RTMODEL -DON_TARGET_WAIT_FOR_START=0 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTID01EQ=1 -DEXT_MODE=1 -DMAT_FILE=0 -DONESTEPFCN=1 -DTERMFCN=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0")

这取决于您编译源代码的方式,但无论如何您都应该设置这些变量,我没有错,它们只是预编译器的指令。

这两件事对我有用。