无法编译模型实时仿真软件万博1manbetx

32视图(30天)
我想使用实时仿真软件。万博1manbetx
我的仿万博1manbetx真软件模型包含一个C函数文件。即FAST_SFunc。接下来的代码(1)。
功能可以用于模拟,但是当它用于实时仿真软件,一个错误报告后单击“构建模式”按钮如下(2)。万博1manbetx
这个问题可以通过附件中的压缩包复制。我r2018b vs2017 15.0。
我没有相应的TLC文件。这是为什么我不能编译吗?有好的解决方案吗?
谢谢
(1)FAST_SFunc↓
/ *
*模板文件:sfuntmpl_gate_fortran.c
*模板著作权1990 - 2013年MathWorks公司。
*
*修改b . Jonkman、国家可再生能源实验室
*使用快v8
* 20 - 1月- 2015
* /
/ *
*您必须指定S_FUNCTION_NAME s函数的名称
*(即sfungate换成你的S -的名字函数,这
*匹配最后一个墨西哥人文件的名称,例如,如果的S_FUNCTION_NAME
* my_sfuntmpl_gate_fortran,墨西哥人文件名必须
* my_sfuntmpl_gate_fortran。mexXXX哪里XXX是3封信
*墨西哥人扩展代码为您的平台)。
* /
#定义S_FUNCTION_LEVEL2
#定义S_FUNCTION_NAMEFAST_SFunc
/ *
*需要包括simstruc。SimStruct和h的定义
*相关宏定义。
* /
#包括“simstruc.h”
#包括“mex.h”/ /mexPutVariable
#包括“matrix.h”/ /mxCreateDoubleScalar
#包括“FAST_Library.h”
#定义PARAM_FILENAME0
#定义PARAM_TMAX1
#定义PARAM_ADDINPUTS2
#定义NUM_PARAM3
/ /两个DWork数组:
#定义WORKARY_OUTPUT0
#定义WORKARY_INPUT1
静态双dt = 0;
静态双达峰时间= 0;
静态int NumInputs = NumFixedInputs;
静态int NumAddInputs = 0;/ /数量额外的输入
静态int NumOutputs = 1;
静态int ErrStat = 0;
静态char ErrMsg [INTERFACE_STRING_LENGTH];/ /确定这是相同的大小IntfStrLen FAST_Library.f90
静态char InputFileName [INTERFACE_STRING_LENGTH];/ /确定这是相同的大小IntfStrLen FAST_Library.f90
静态int n_t_global = 2;/ /计数器目前我们在确定哪些固定步仿真时间(从2开始初始化)
/ /函数定义
静态int checkError (SimStruct * S);
静态空白mdlTerminate (SimStruct *年代);/ /这里定义所以我从checkError可以调用它
静态空白getInputs (SimStruct * S,双* InputAry);
静态空白setOutputs (SimStruct * S,双* OutputAry);
/ *错误处理
* - - - - - - - - - - - - - - -
*
*你应该使用以下技术报告中遇到的错误
*一个S -函数:
*
* ssSetErrorStatus(年代,“由于遇到错误……”);
*返回;
*
*请注意,第二个参数ssSetErrorStatus必须是持久的记忆。
*它不能是一个局部变量。
* /
静态int
checkError (SimStruct * S) {
如果(ErrStat > = AbortErrLev) {
ssPrintf (“\ n”);
ssSetErrorStatus(年代,ErrMsg);
mdlTerminate(年代);/ /终止错误(以防仿真软件本身并不这么万博1manbetx做)
返回1;
}
其他的如果(ErrStat > = ErrID_Warn) {
ssPrintf (“\ n”);
ssWarning(年代,ErrMsg);
}
其他的如果(ErrStat ! = ErrID_None) {
ssPrintf (“\ n % s \ n”,ErrMsg);
}
返回0;
}
静态无效
getInputs (SimStruct * S,双* InputAry) {
intk;
InputRealPtrsTypeuPtrs = ssGetInputPortRealSignalPtrs(年代,0);
(k = 0;k < ssGetDWorkWidth(年代,WORKARY_INPUT);k + +) {
InputAry [k] =(双)(* uPtrs [k]);
}
}
静态无效
setOutputs (SimStruct * S,双* OutputAry) {
intk;
* y = ssGetOutputPortRealSignal(年代,0);
(k = 0;k < ssGetOutputPortWidth(年代,WORKARY_OUTPUT);k + +) {
y [k] = OutputAry [k];
}
}
/ * = = = = = = = = = = = = = = = = = = = = *
* S -函数方法*
* = = = = = = = = = = = = = = = = = = = = * /
/ *功能:mdlInitializeSizes = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*文摘:
*大小信息使用仿真软件来确定功能万博1manbetx
*块的特征(数量的输入、输出、状态等)。
* /
静态空白mdlInitializeSizes (SimStruct *年代)
{
int i = 0;
int j = 0;
int k = 0;
静态字符ChannelNames [CHANNEL_LENGTH * MAXIMUM_OUTPUTS + 1];
静态双InitInputAry [MAXInitINPUTS];
/ /静态字符OutList [MAXIMUM_OUTPUTS] [CHANNEL_LENGTH + 1];
静态字符OutList [CHANNEL_LENGTH + 1];
双* AdditionalInitInputs;
mxArray *点,* chrAry;
mwSize m, n;
mwIndex indx;
如果(n_t_global = = 2) {
/ *预期功能的输入参数(s) * /
ssSetNumSFcnParams(年代,NUM_PARAM);/ *数量预计参数* /
如果(ssGetNumSFcnParams ! = ssGetSFcnParamsCount (S)) {
/ *返回如果的数量预期! =数量的实际参数* /
返回;
}
/ /参数不应该改变一个模拟过程中
ssSetSFcnParamTunable (S PARAM_FILENAME SS_PRM_NOT_TUNABLE);
PARAM_FILENAME mxGetString (ssGetSFcnParam (S), InputFileName, INTERFACE_STRING_LENGTH);
ssSetSFcnParamTunable (S PARAM_TMAX SS_PRM_NOT_TUNABLE);
达峰时间= mxGetScalar (ssGetSFcnParam(年代,PARAM_TMAX));
ssSetSFcnParamTunable (S PARAM_ADDINPUTS SS_PRM_NOT_TUNABLE);
NumAddInputs = (int) (mxGetScalar (ssGetSFcnParam(年代,PARAM_ADDINPUTS)) + 0.5);/ /添加0.5舍入的
如果(NumAddInputs < 0) {
ErrStat = ErrID_Fatal;
strcpy (ErrMsg,”参数指定数量的额外输入快速SFunc不得消极。\ n”);
checkError(年代);
返回;
}
NumInputs = NumFixedInputs + NumAddInputs;
/ /现在看到如果有其他需要处理的输入
如果(NumAddInputs > 0) {
k = (int) mxGetNumberOfElements (ssGetSFcnParam(年代,PARAM_ADDINPUTS));
k = min (k, MAXInitINPUTS);
AdditionalInitInputs =(双*)mxGetData (ssGetSFcnParam(年代,PARAM_ADDINPUTS));
(i = 0;我< k;我+ +){
InitInputAry[我]= AdditionalInitInputs (i + 1);
}
}
其他的{
InitInputAry [0] = SensorType_None;/ /告诉它不使用激光雷达(不应该是必要的,但我们将讨论我们的基地)
}
/ /设置这个之前错误的可能性在Fortran库:
ssSetOptions(年代,
SS_OPTION_CALL_TERMINATE_ON_EXIT);
/ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * /
/ /拷贝字符串(InputFileName“. . / . . /证书/ Test01.fst”);
FAST_Sizes(达峰时间、InitInputAry InputFileName、&AbortErrLev &NumOutputs, dt, &ErrStat, ErrMsg, ChannelNames);
n_t_global = 1;
如果(checkError (S))返回;
/ /设置DT在Matlab工作区(模型块解算器所必需的选项)万博1manbetx
点= mxCreateDoubleScalar (dt);
ErrStat = mexPutVariable (“基地”,“DT”、点);
mxDestroyArray (pm);
如果(ErrStat ! = 0) {
ErrStat = ErrID_Fatal;
strcpy (ErrMsg,“错误字符串数组复制到DT基Matlab工作区中的变量。”);
checkError(年代);
返回;
}
/ /把输出通道在一个单元阵列变量的名字叫做“OutList”基地matlab工作区
m = NumOutputs;
n = 1;
点= mxCreateCellMatrix (m, n);
(i = 0;我< NumOutputs;我+ +){
j = CHANNEL_LENGTH - 1;
(ChannelNames [i * CHANNEL_LENGTH + j] = =' '){
j——;
}
strncpy (&OutList [0], &ChannelNames(我* CHANNEL_LENGTH), j + 1);
OutList [j + 1) =' \ 0;
chrAry = mxCreateString (OutList);
indx =我;
mxSetCell (pm, indx chrAry);
/ / mxDestroyArray (chrAry);
}
ErrStat = mexPutVariable (“基地”,“OutList”、点);
mxDestroyArray (pm);
如果(ErrStat ! = 0) {
ErrStat = ErrID_Fatal;
strcpy (ErrMsg,“错误复制字符串数组OutList基Matlab工作区中的变量。”);
checkError(年代);
返回;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ssSetNumContStates (S, 0);/ *多少连续状态?* /
ssSetNumDiscStates (S, 0);/ *多少离散状态? * /
/ *设置输入港口特点* /
如果(! ssSetNumInputPorts(年代,1))返回;
ssSetInputPortWidth(年代,0,NumInputs);/ /宽第一个输入端口
/ *
*设置直接直通的国旗(1 =是的,0 = no)。
*一个港口直接引线如果输入中使用
* mdlOutputs或mdlGetTimeOfNextVarHit功能。
* /
ssSetInputPortDirectFeedThrough (0, 0);/ /没有直接直通的,因为我们只是把一切都放在一个更新程序(像一个离散系统)
如果(! ssSetNumOutputPorts(年代,1))返回;
ssSetOutputPortWidth(年代,0,NumOutputs);
ssSetNumSampleTimes (S, 1);/ /调用- >设置> 0mdlInitializeSampleTimes ()
/ *
*如果你Fortran代码使用真实的状态、输入和/或输出
*数据类型,可以使用这些dwork低垂的连续的工作区域
*州从双前真正的调用代码。你可以
*还工作在硬编码的本地(栈)变量向量。
*
*固定步代码,保持变量的副本是输出
*在所以mdlOutputs DWork向量()函数可以提供输出
*数据时需要的。您可以使用尽可能多的DWork向量
*两个输入和输出(或硬编码局部变量)。
* /
如果(! ssSetNumDWork(年代,2))返回;
ssSetDWorkWidth (S WORKARY_OUTPUT ssGetOutputPortWidth(年代,0));
ssSetDWorkDataType (S WORKARY_OUTPUT SS_DOUBLE);/ *使用SS_DOUBLE如果需要* /
ssSetDWorkWidth (S WORKARY_INPUT ssGetInputPortWidth(年代,0));
ssSetDWorkDataType (S WORKARY_INPUT SS_DOUBLE);
ssSetNumNonsampledZCs (S, 0);
/ *指定sim状态合规与一个内置块* /
/ *看到sfun_simstate.c的例子其他可能的设置* /
ssSetSimStateCompliance(年代,USE_DEFAULT_SIM_STATE);
/ / ssSetOptions (S, 0);/ /巴西柔术:什么这个做什么?(不确定0意味着什么:没有选项?)设置选项调用之前终止
}
}
/ *功能:mdlInitializeSampleTimes = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*文摘:
*这函数使用指定样品时间(s)
* S -函数。你必须注册相同数量的样本倍
*中指定ssSetNumSampleTimes。
* /
静态空白mdlInitializeSampleTimes (SimStruct *年代)
{
/ *
*如果Fortran代码含蓄的步骤
*在一个固定利率,你不想改变
*代码,您需要使用一个离散的(固定
*步骤)样本时间,1秒下面的选择。
* /
ssSetSampleTime(年代,0,dt);/ *选择样品时间如果离散* /
ssSetOffsetTime(年代,0,0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(年代);
}
#undef MDL_INITIALIZE_CONDITIONS/ *改变# undef去除函数* /
#定义MDL_START/ *改变# undef去除函数* /
#如果定义(MDL_START)
/ *功能:mdlStart = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*文摘:
*这函数被称为一旦在开始执行模型。如果你
*有状态这应该被初始化一次,这是这个地方
*做它。
* /
静态空白mdlStart (SimStruct *年代)
{
/ *巴西柔术:这真的是初始输出;我真的想从模型的输入万博1manbetx。如果我们把它放在mdlOutputs吗?
但是我们需要说我们有直接通孔吗?
* /
双* InputAry =(双*)ssGetDWork(年代,WORKARY_INPUT);/ / malloc (NumInputs * sizeof(双));
双* OutputAry =(双*)ssGetDWork(年代,WORKARY_OUTPUT);
/ / n_t_global 1;也许在mdlOutputs使用这一事实
如果(n_t_global = = 1){/ /第一次来计算输出:
/ / getInputs(年代,InputAry);
FAST_Start (&NumInputs、&NumOutputs InputAry、OutputAry &ErrStat, ErrMsg);
n_t_global = 0;
如果(checkError (S))返回;
}
}
#endif / * MDL_START * /
/ *功能:mdlOutputs = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*文摘:
*在这函数,你计算函数的输出
*块。默认的数据类型信号的仿真软件是双重的万博1manbetx,
*但是你可以使用其他内在C数据类型甚至是定制的吗
*数据类型如果你的愿望。看到仿真万博1manbetx软件文档写作S-functions
*细节数据类型的话题。
* /
静态空白mdlOutputs (SimStruct * S, int_T tid)
{
/ *
*固定步骤的代码
* - - - - - - - - - - - - - - - - - - -
*如果Fortran(隐式或代码实现离散状态
*注册万博1manbetx,它并不重要),调用代码
*从mdlUpdates()和把输出的值保存在DWork向量。
*变量几个步骤解算器可以叫mdlOutputs ()
* *在调用mdlUpdate之间,你必须提取
*值DWork向量,并将其复制到输出
*变量。
*
*一定ssSetDWorkDataType(年代,0)声明
* mdlInitializeSizes()使用SS_DOUBLE数据类型时
*此代码是活跃的。
* /
* InputAry=(双*)ssGetDWork(年代,WORKARY_INPUT);
* OutputAry =(双*)ssGetDWork(年代,WORKARY_OUTPUT);
如果(n_t_global = = 1){/ /第一次来计算输出:
getInputs(年代,InputAry);
FAST_Start (&NumInputs、&NumOutputs InputAry、OutputAry &ErrStat, ErrMsg);
n_t_global = 0;
如果(checkError (S))返回;
}
setOutputs(年代,OutputAry);
}
#定义MDL_UPDATE/ *改变# undef去除函数* /
#如果定义(MDL_UPDATE)
/ *功能:mdlUpdate = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*文摘:
*这函数被称为一次每一个主要的集成时间步。
*离散状态通常更新这里,但这个函数是非常有用的
*执行任何每个任务应该只发生一次
*集成的步骤。
* /
静态空白mdlUpdate (SimStruct * S, int_T tid)
{
/ *
*仅供固定步骤的代码
* - - - - - - - - - - - - - - - - - - - - - - - -
*如果你Fortran代码运行在一个固定的时间步,进步
*每次叫它,最好是在这里,而不是打电话
*在mdlOutputs ()。美国在Fortran代码不需要
*连续如果你叫你的代码。
* /
* InputAry=(双*)ssGetDWork(年代,WORKARY_INPUT);
* OutputAry =(双*)ssGetDWork(年代,WORKARY_OUTPUT);
/ / time_T t = ssGetSampleTime (S, 0);
getInputs(年代,InputAry);
/ * = = = =调用Fortran程序引用传递(args) * /
FAST_Update (&NumInputs、&NumOutputs InputAry、OutputAry &ErrStat, ErrMsg);
n_t_global = n_t_global + 1;
如果(checkError (S))返回;
setOutputs(年代,OutputAry);
}
#endif / * MDL_UPDATE * /
#undef MDL_DERIVATIVES/ *改变# undef去除函数* /
/ *功能:mdlTerminate = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*文摘:
*在这函数,你应该执行任何行动是必要的吗
*在终止一个模拟世界中。例如,如果内存是
*中分配mdlStart,这是自由的地方。
* /
静态空白mdlTerminate (SimStruct *年代)
{
如果(n_t_global > 2){/ /只情况下我们从来没有初始化,请检查这一次步
FAST_End ();
n_t_global = 2;
}
}
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = *
*需要S -函数预告片*
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * /
#如果定义了MATLAB_MEX_FILE/ *这是文件被编译为一个MEX-file吗?* /
#包括“万博1manbetxsimulink.c”/ * MEX-file接口机制* /
#其他的
#包括“cg_sfun.h”/ *代码生成注册函数* /
#endif
(2)↓错误信息
链接:致命错误LNK1104:无法打开文件“FAST_SFunc.obj”
NMAKE:致命错误U1077:“H: \程序文件(x86)社区\ Microsoft Visual Studio \ 2017 \ \ VC工具\ \ MSVC \ 14.10.25017 \ bin \ HostX86 \ x86 \链接。EXE”:返回代码“0 x450”
停止。
2使命令返回一个错误
“An_error_occurred_during_the_call_to_make”不是内部或外部命令,也不是可运行的程序
或批处理文件。
# # # CFDLMFAC_codegen_rpt.html创建HTML报告文件
b: \ matlab \ rtw \ \ rtwtags \ rtwtags:内部错误打开' G: \ A2_Doctor \ 1 FASTv8 \仿真万博1manbetx软件\ Samples \ CFDL_MFAC_weifen_real_time \ CFDLMFAC_slrt_rtw \ FAST_SFunc.c”
5个评论

登录置评。

答案(0)


翻译的