金宝app仿真软件TRNSYS DLL compatiable

32视图(30天)
萨利赫
萨利赫 2013年2月17日
你好所有的,
我已经能够从仿真软件模型生成一个DLL。金宝app生成DLL使用特殊系统目标文件(TLC文件)基于生物利用。薄层色谱文件以及grt_main。c模板文件(称为trnsys生成的文件。薄层色谱和trnsys_main.c)。此外,添加一个包装器末端的c源代码,trnsys_main。c承认trnsys编码结构(包装器连接)。DLL对一个实例很不错,但当我使用它的多个实例一个模型同时,输入从一个DLL覆盖其他DLL的输入。
有没有一种方法来生成一个DLL可用于多个调用相同的模型(称为同时)?任何帮助非常感激。
这段代码是trnsys_main结束时写的。c(类似于grt_main以上代码结构。c没有区别):
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / / * * *简化MATLAB初始化TRNSYS / / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
char * initMatlab () {
const char * 状态;/ / RT_MODEL * S;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* MathError处理公元前+ + *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
#如果定义了宝蓝
信号(且慢,(fptr) divideByZero);
#endif
{
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*初始化全球内存*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ / rtExtModeParseArgs(命令行参数个数,argv, NULL);
(空白)memset (&GBLbuf 0 sizeof (GBLbuf));
/ * * * * * * * * * * * * * * * * * * * * * * * *
*初始化模型*
* * * * * * * * * * * * * * * * * * * * * * * * /
rt_InitInfAndNaN (sizeof (real_T));
S =模型();
开始时间= getSimulationStartTime ();/ / &&&转换[s] / [h]吗?
stoptime = getSimulationStopTime ();
steptime = getSimulationTimeStep ();
S - > solverInfo。stepSizePtr = &steptime;
S - > solverInfo。solverStopTime = stoptime;
如果(rtmGetErrorStatus ! = NULL) {
(空白)流(stderr,在模型注册“错误:% s \ n”,
rtmGetErrorStatus (S));
退出(EXIT_FAILURE);
sprintf (errorMsg“误差在模型注册:% s”rtmGetErrorStatus (S));
返回(errorMsg);
}
/ / rtmSetTFinal(年代,RUN_FOREVER);
rtmSetTFinal(年代,stoptime);
MdlInitializeSizes ();
MdlInitializeSampleTimes ();
状态= rt_SimInitTimingEngine (rtmGetNumSampleTimes (S),
rtmGetStepSize (S),
rtmGetSampleTimePtr (S),
rtmGetOffsetTimePtr (S),
rtmGetSampleHitPtr (S),
rtmGetSampleTimeTaskIDPtr (S),
rtmGetTStart (S),
&rtmGetSimTimeStep (S),
&rtmGetTimingData (S));
如果(地位! = NULL) {
(空白)流(stderr,
“失败初始化样本时引擎:% s \ n”、地位);
退出(EXIT_FAILURE);
sprintf (errorMsg“失败初始化样本时引擎:% s”、地位);
返回errorMsg;
}
rt_CreateIntegrationData(年代);
GBLbuf。errmsg = rt_StartDataLogging (rtmGetRTWLogInfo (S),
rtmGetTFinal (S),
rtmGetStepSize (S),
&rtmGetErrorStatus (S));
rtExtModeWaitForStartPkt (rtmGetRTWExtModeInfo (S),
rtmGetNumSampleTimes (S),
(boolean_T *) &rtmGetStopRequested (S));
MdlStart ();
如果(rtmGetErrorStatus ! = NULL) {
GBLbuf。stopExecutionFlag = 1;
}
errorMsg [0] = 0;
返回errorMsg;
}
}
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / / * * *执行一个MATLAB步骤/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * char * OneStep (int nbrInputArgs、双* inputArgs, int nbrOutputArgs,双* outputArgs) {real_T tnext;
int;
real_T* pVariableValue;
/ / S =模型();
/ / MdlInitializeSizes ();
/ / Subsystem_U。OutputVar1 = inputArgs [0];
pVariableValue = S - > ModelData.inputs;
(i = 0;我< S - > Sizes.numU;我+ +)
{
* pVariableValue = inputArgs[我];
/ / pVariableValue = pVariableValue + sizeof (real_T);
pVariableValue + +;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*检查和看看基础步骤时间太快
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
如果(GBLbuf.isrOverrun + +)
{
GBLbuf。stopExecutionFlag = 1;
sprintf (errorMsg“GBLbuf.isrOverrun”);
返回errorMsg;
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*检查和看看错误状态设置*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
如果(rtmGetErrorStatus ! = NULL)
{
GBLbuf。stopExecutionFlag = 1;
sprintf (errorMsg“rtmGetErrorStatus ! = null”);
返回errorMsg;
}
/ *启用中断在这里* /
/ *
*在多任务环境,这会从基准利率
*,叫“背景”的任务。
* /
rtExtModeOneStep (rtmGetRTWExtModeInfo (S),
rtmGetNumSampleTimes (S),
(boolean_T *) &rtmGetStopRequested (S));
tnext = rt_SimGetNextSampleHit ();
rtsiSetSolverStopTime (rtmGetRTWSolverInfo (S)、tnext);
MdlOutputs (0);
rtExtModeSingleTaskUpload(年代);
GBLbuf。errmsg = rt_UpdateTXYLogVars (rtmGetRTWLogInfo (S),
rtmGetTPtr (S));
如果(GBLbuf。errmsg ! = NULL)
{
GBLbuf。stopExecutionFlag = 1;
sprintf (errorMsg“GBLbuf。errmsg ! = null”);
返回errorMsg;
}
rt_UpdateSigLogVars (rtmGetRTWLogInfo (S) rtmGetTPtr (S));
MdlUpdate (0);
rt_SimUpdateDiscreteTaskSampleHits (rtmGetNumSampleTimes (S),
rtmGetTimingData (S),
rtmGetSampleHitPtr (S),
rtmGetTPtr (S));
如果(rtmGetSampleTime(年代,0)= = CONTINUOUS_SAMPLE_TIME)
{
rt_UpdateContinuousStates(年代);
}
GBLbuf.isrOverrun——;
rtExtModeCheckEndTrigger ();
/ / outputArgs [0] = Subsystem_Y.InputVariable1;等pVariableValue = S - > ModelData.outputs;(我= 0;我< S - > Sizes.numY;我+ +){outputArgs[我]= * pVariableValue;/ / pVariableValue = pVariableValue + sizeof (real_T);pVariableValue + +;}
返回errorMsg;
}
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / / *开始TRNSYS / / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *增加一倍 inArray;双* outArray;/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / /对象:Matlab模型包装/ / IISiBat模型:Component1 / / / /作者:Werner Keilholz / /编辑:Werner Keilholz / /日期:octobre 03, 2007最后修改:octobre 03 2007 / / / / / / * / / *模型参数:没有(如果需要变换MATLAB参数输入)/ / *
/ / * / / *模型输入:/ /取决于MATLAB模型 *
/ / * / / *模型输出:/ /取决于MATLAB模型 *
/ / * / / *模型衍生品:/ / *
/ /(基于TRNSYS Studio生成的程序接口)/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
静态int nin = 0;/ /数字输入静态int nout = 0;/ /输出/ /走读生的数量 _ _declspec (dllexport int TRNSYS_SUBROUTINE_NAME(双) ptime, / /仿真时间- &操作符在c++中双鑫[],/ /包含组件的数组输入双xout[], / /组件的数组填充适当的输出双* pt, / /数组包含因变量的衍生品评估&运营商在c++中双* pdtdt, / /评估的数组包含T的衍生品——&操作符在c++中双[],/ /数组包含组件的参数int[], / / 3.3.3节中描述的信息数组的手动int icntrl / /手动的控制数组(如第3.3.4部分中所述)){/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / / * * * / / * * *类型实现这个函数将被称为TRNSYS / / * * *——一旦开始模拟的初始化/ / * * *——一旦开始时初始化/ / * * *的每一个步伐——一旦TRNSYS的每个迭代解算器/ / * * *——一旦在每个步伐清理/ / * * * -最后一次模拟的清理/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / / / / * * * / / * * *警告:解释TRNSYS手册中使用FORTRAN约定/ / * * *数组索引。减去1获得基于C或c++约定。/ / * * *的例子:/ / * * * TRNSYS手册:信息(6)=数量的输出/ / * * * - >写没有=信息[5]获得的输出C或c++ / / * * * / / * * *我们还在小写拼写变量根据C的传统,虽然他们/ / * * *在大写字母拼写TRNSYS手册(根据FORTRAN的传统)/ / * * *
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -双时间;双t;双dtdt;
/ / * * *标准TRNSYS声明
intnpar = 0;/ /数量我们预计参数
int雄鹿= 0;/ /数量衍生品
intiunit;/ /单元号(“序列号”的组件,从输入文件(“甲板”)
intitype;/ /型号(组件数量)
int假= 1;
int;
intnMatlabOutputs;/ *数量模型输出* /
intnMatlabInputs;/ *数量模型输入* /
时间= * ptime;t = * pt;dtdt = * pdtdt;
/ /读上下文TRNSYS的信息
/ /(要求取消注释行)
/ /信息[2]= nin;/ /数量输出
/ /信息[5]= nout;/ /数量输出
iunit = info [0];/ /单元号itype =信息[1];/ /型号
/ /信息[2];/ /用户输入指定组件的数量/ /信息[3];/ /参数的数量由用户指定的组件/ /信息[4];/ /衍生品数量由用户指定的组件/ /信息[5];/ /输出的数量由用户指定的组件
/ /信息[6];/ /数量迭代调用单元在当前的步伐
/ / 2 =初始化
/ / 1 =初始调用在这个单元模拟
/ / 0 =第一个电话这个单位的步伐。
/ / 1 =第二个电话这个单位的步伐等。
/ /信息(7);/ /调用单元总数在模拟/ / *告知TRNSYS这种类型的属性信息[8]= 0;/ /显示是否类型取决于时间的流逝:0 =没有信息[9]= 0;/ /使用分配存储TRNSYS手册(见3.5节):0 =没有/ /信息[10];/ /显示数量的离散控制变量(参见3.3.4 TRNSYS手动)/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
iunit = info [0];itype =信息[1];
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / /为TRNSYS如果设置版本信息(信息[6]= = 2){信息[11]= 16;/ /添加额外的初始化代码,如果任何返回1;}/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / /做最后的仿真操作如果(信息[7]= = 1){# ifdef UseMMIDataLogging rt_CleanUpForStateLogWithMMI (rtmGetRTWLogInfo (S));rt_CleanUpForSigLogWithMMI (rtmGetRTWLogInfo (S));# endif rt_StopDataLogging (MATFILE rtmGetRTWLogInfo (S));
rtExtModeShutdown (rtmGetNumSampleTimes (S));
如果(GBLbuf.errmsg)
{
(空白)流(stderr,“% s \ n”,GBLbuf.errmsg);
退出(EXIT_FAILURE);
}
如果(rtmGetErrorStatus ! = NULL) {
(空白)流(stderr,“ErrorStatus组:\”% s \“\ n”, rtmGetErrorStatus (s));
退出(EXIT_FAILURE);
}
如果(GBLbuf.isrOverrun) {
(空白)流(stderr,
“% s: ISR泛滥——基本采样率过快\ n”,
报价(模型));
退出(EXIT_FAILURE);
}
# ifdef一心多用其他{int_T我;(i = 1;我< NUMST;我+ +){如果(GBLbuf.overrunFlags[我]){(void)流(stderr,“% s ISR泛滥——采样率太快,”“样本时间指数% d \ n”,引用(模型),i);退出(EXIT_FAILURE);}}}# endif
MdlTerminate ();
返回1;}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / /执行任何“AFTER-ITERATION”操作,需要在这里/ /如变量保存到存储阵列在接下来的步伐如果(信息[12]> 0){返回1;}/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / /做的第一个电话模拟操作如果(信息[6]= = 1)/ /第一个调用该组件的仿真{/ / S =模型();initMatlab ();/ / MATLAB
MdlInitializeSizes ();
nMatlabOutputs = S - > Sizes.numY;/ /数量MATLAB模型输出
nMatlabInputs = S - > Sizes.numU;/ /数量MATLAB模型输入
nin = nMatlabInputs;
nout = nMatlabOutputs;
/ /设置一些信息数组变量告诉TRNSYS引擎这种类型是如何工作的
信息[2]= nin;
信息[5]= nout;
信息[8]= 1;
信息[9]= 0;/ /存储16版本已经改变了
/ /设置所需数量的输入,参数和衍生品,用户应该在输入文件/ /供应在某些情况下,变量的数量可能取决于参数的值这个模型....npar = 0;雄鹿= 0;/ /调用类型检查子例程来比较这个组件需要什么/ / TRNSYS的输入文件中提供
&npar TYPECK(假信息,外祖母,雄鹿);
inArray =(双*)malloc (nin * sizeof(双));outArray =(双*)malloc (nout * sizeof(双));
/ /初始化输出(i = 0;我< nout;我+ +)xout[我]= 0;
(我= 0;我< nout;我+ +)xout[我]= 0;
返回1;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / /做所有最初的步伐操作,没有迭代的开始时间(时间< (getSimulationStartTime getSimulationTimeStep() +() / 2.0)){/ /单位数量设置为将来调用iunit = info [0];itype =信息[1];
/ /执行任何需要计算的初始值设置输出/ /着干活
/ /初始化matlab
返回1;
}
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / / *其迭代调用该组件 * / / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ /准备输入对MATLAB
(i = 0;我< nin; + +)
inArray[我]=鑫[我];
OneStep (nin inArray、nout outArray);/ /运行,森林!
/ /得到输出从MATLAB,给他们回到TRNSYS
(i = 0;我< nout; + +)
xout[我]= outArray[我];
返回1;
}
/ * EOF: trnsys_main.c * /

答案(1)

标志着联邦调查局
标志着联邦调查局 2022年3月29日
在默认情况下通。tlc生成non-resuable代码。在<模型>。c你会注意到全局变量状态信息。为了避免这种情况,在配置的目的- >代码生成选项卡- >界面,“代码接口包装”改为“可重用函数”。这将产生一个可重用的功能,数据结构,输入,输出,状态和参数传递到所有生成的代码。这将允许您多次重用DLL在同一仿真软件模型。金宝app

类别

找到更多的在金宝app仿真软件编码器帮助中心文件交换

标签

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!