我有一个初学者的问题。我是编程新手,我成功地从Simulink生成了我的第一个C代码。但我不明白输入和输出如何传递函数。这个功能如何工作?它没有参数也没有返回值,但提供了计算。主程序如何与此功能交互?
firstTest.c生成初始化,步骤和终止函数。步骤是计算。
// firstTest.c
void firstTest_step(void)
{
Test_Y.Out = 2.0 + Test_U.In;
}
firstTest.h为firstTest.c生成相应的头文件
// firstTest.h
extern void firstTest_step(void);
我的计划是在我自己的c#应用程序中以某种方式使用此功能。该解决方案可能包含pinvoke来处理非托管代码。因为我不理解这个函数,所以我尝试了一下,发现可以自定义步进函数,以便代码生成器以我看到参数的方式从同一模型生成步骤函数,我可以合作! (我甚至不知道这是否必要?)。所以第二个测试看起来像这样:
// secondTest.c
void secondTest_step(real_T In, real_T *Out)
{
*Out = 2.0 + In;
}
生成的头文件:
// secondTest.h
extern void secondTest_step(real_T In, real_T *Out);
现在,Simulink提供了生成C DLL的可能性。所以这就是我成功尝试的,我只需要根据mathworks / simulink文档用__declspec修改标题。现在,我的代码看起来像这样:
// The DLL in which __declspec(dllexport) is a custom modification
__declspec(dllexport) void secondTest(real_T In, real_T *Out)
secondTest是与extern应用程序交换数据的正确方法,它想要使用简单的步骤功能(out = in + 2)?我最大的困惑仍然是虚空无效功能。我可以理解你也可以通过带有指针的函数传递参数,而不是'普通'参数。但是我没看到生成的函数firstTest.c是如何工作的?它没有指针,没有值作为参数,只有没有返回值的计算。
在firstTest的情况下,输入结构Test_U和输出结构Test_Y是全局的,因此可以从包装器/集成代码中设置它们。
默认设置允许生成独立的exe,因此声明和定义了这些全局结构。因此,通常生成的界面是定制的。这就是为什么Simulink提供了定制功能定义的所有选项,以及单个信号在代码中出现的方式。