找回密码
 注册
Simdroid-非首页
查看: 3299|回复: 30

[用户自编子程序] 使用adams用户子程序的总结及一些问题

[复制链接]
发表于 2006-3-27 14:52:31 | 显示全部楼层 |阅读模式 来自 重庆大学
关于使用adams用户子程序(用户自定义函数)的总结及若干问题

最近一直在学习adams用户子程序的使用,从各论坛上搜集了很多资料,自己也试着调试了两个例子,但是一直没有完全成功过。总结了一下其间遇到的问题,请大家一起讨论讨论。
由于学习adams时间很短,基础知识还不够牢固,而且对于VC也是雾里看花……还请大家不吝赐教,版砖尽管砸来,俺该补习的自己去补习。

当前使用环境:
Windows XP sp2
MS Visual C++ v6 + sp6
MSC Adams2005

===========================

流程总结(PROCESS):

P1. 使用vc_init_usr.c作模板,编写程序代码user.c;
P2. 在VC中编译user.c,生成user.obj;
P3. 使用adams命令行,由user.obj生成user.dll;
P4. 将user.dll加入到adams库中;
P5. 在Function Builder中即可使用自定义的函数。

===========================

需要注意的问题(TIPS):

T.1.1 源代码user.c中要包含头文件mdi_c.h,userPortName.h,utilCcallable.h(在adams目录中有);
T.1.2 BOOL vc_function_add(char *Name,FUNCTION Func,ArgType ArgTp,int ArgCnt,int Units);
void vc_initialize_user();
对于二者的理解……
T.2.1 编译时需要fortran的两个库文件dformd.lib,dfport.lib;
T.3.1 提示“'link.exe'不是内部或外部命令,也不是可运行的程序或批处理文件。”,将C:\Program Files\Microsoft Visual Studio\VC98\Bin;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin加入到系统环境变量path中问题解决;
T.3.2 提示“LINK:fatal error LNK1181:connot open input file "msvcrt.lib"”,仔细查看命令行提示发现"-libpath:C:\MSC~1.SOF\MSC~1.ADA\2005\WIN32",说明link.exe只搜索..\2005\WIN32文件夹查找lib文件,将需要的lib(包括VC提供的)全部复制到C:\MSC~1.SOF\MSC~1.ADA\2005\WIN32后问题解决;
T.3.3 输入obj文件名后提示找不到obj文件,使用adams-settings,修改MSCA-Shared-Preferences-workingDirectory为user.obj所在路径后问题解决;(然后发现用户变量中增加了MSC_ADAMS_STARTIN_DIR='user.obj所在路径')

===========================

疑问点(QUESTIONS):

Q.3.1 编译命令"cl /c /G6 /Ox /MD user.c"在adams命令行中执行吗?是否必要(如果按照命令行提示进行的话似乎只需要指明user.obj和dll的名称就可以了,没有用到cl...命令)?
Q.3.2 由T.3.1,T.3.2猜想P3虽然是在adams命令行的环境下,是否依然依赖VC来生成dll?libpath在哪里进行设置?
Q.3.3 有文章提到直接用VC来生成dll文件的办法:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VC环境中设置,
1. PROJECT->SETTING->LINK CATEGORY->GENERAL->Output file name: ebug/vc_init_usr.dll

2. Object/library modules:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib DFORMD.LIB DFPORT.LIB MSVCRT.LIB WS2_32.LIB asutility_imp.lib mdiloader_imp.lib abgtire_imp.lib vpgutility_imp.lib tire_imp.lib ipgdriver_imp.lib vpgdriver_imp.lib amd_imp.lib moasmain.obj solver_load.obj

3. Category->Input Object/library modules:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib DFORMD.LIB DFPORT.LIB MSVCRT.LIB WS2_32.LIB asutility_imp.lib mdiloader_imp.lib abgtire_imp.lib vpgutility_imp.lib tire_imp.lib ipgdriver_imp.lib vpgdriver_imp.lib amd_imp.lib moasmain.obj solver_load.obj

4. Ignore libraries:
libc.lib,libcmt.lib,libcd.lib,libcmtd.lib,msvcrtd.lib

5. Tools->Options->Directiories Show directories for: Library files
增加两项:
....\ADAMS 12.0\COMMON
....\ADAMS 12.0\solver
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
是否可行?(当然此文中针对adams12.0,对于adams2005可能还需部分改动)
Q.4.1 P4的操作(1)在adams->system command中执行’adams05 aview ru-u i –n user.dll ’;
(2)Settings->Solver->Solver Executable->Solver Settings中,Executable=External,Solver Library=…..\user.dll,Choice=C++;
二者的效果是否一样?
Q.4.2 按照Q.4.1(2)操作后,在Function Builder中还是没有自定义的函数,可能是哪个环节出现问题了?

评分

1

查看全部评分

 楼主| 发表于 2006-3-27 15:31:36 | 显示全部楼层 来自 重庆大学

Re:使用adams用户子程序的总结及一些问题

Simdroid开发平台
附两个图……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2006-3-27 18:49:39 | 显示全部楼层 来自 湖北武汉

Re:使用adams用户子程序的总结及一些问题

从你的流程(process)看,你所写的是用户自定义函数,也就是设计阶段函数,这种函数在建模的时候能用到,在运行阶段没有作用的。

对于Q3.1,命令"cl /c /G6 /Ox /MD user.c"可以在dos环境下执行,如果你还没有在vc下生成obj文件的话是必要的。
对于Q3.2,dll文件不是依赖vc生成的,但是vc编译环境可以帮助你检查子程序是否有错误。
对于Q3.3,没见到过这样的方法,欢迎高手指点
对于Q4.1,两者 的效果不一样,(1)是对设计阶段函数起作用,也就是说你将这个命令输入之后会重新弹出一个新的adams/aview的窗口,在这里你的自定义函数已经加入function builder了;(2)就不一样了,这是对于运行阶段函数而言的,模型在仿真的时候会从你指定的dll文件里调用用户子程序。

欢迎高手拍砖!~~~

下面我给个设计阶段函数的例子,可以在function builder中看到。

评分

1

查看全部评分

发表于 2006-3-27 18:54:12 | 显示全部楼层 来自 湖北武汉

Re:使用adams用户子程序的总结及一些问题

这个是产生随机数的一个自定义函数,以前用人用过的。
将myvcfun.dll文件放在当前工作目录,然后将dos工作目录设为当前目录,看下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2006-3-27 19:16:09 | 显示全部楼层 来自 湖北武汉

Re:使用adams用户子程序的总结及一些问题

将mdi_c.h和myvcfun.c拷贝到同一个文件夹,然后用vc打开myvcfun.c文件,编译成功之后产生.obj文件,然后利用生成。dll文件
我的dll文件和.c源文件在附件中

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2006-3-27 19:19:08 | 显示全部楼层 来自 湖北武汉

Re:使用adams用户子程序的总结及一些问题

在function builder下的随机函数rand()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2006-3-27 19:25:38 | 显示全部楼层 来自 湖北武汉

Re:使用adams用户子程序的总结及一些问题

具体如何生成dll文件可以参考以下:
http://www.simwe.com/forum/viewthread.php?tid=668227
 楼主| 发表于 2006-3-29 14:44:04 | 显示全部楼层 来自 重庆大学

Re:使用adams用户子程序的总结及一些问题

duanxc314 wrote:
从你的流程(process)看,你所写的是用户自定义函数,也就是设计阶段函数,这种函数在建模的时候能用到,在运行阶段没有作用的。

对于Q3.1,命令"cl /c /G6 /Ox /MD user.c"可以在dos环境下执行,如果你还没有在vc下生成obj文件的话是必要的。
对于Q3.2,dll文件不是依赖vc生成的,但是vc编译环境可以帮助你检查子程序是否有错误。
对于Q3.3,没见到过这样的方法,欢迎高手指点
对于Q4.1,两者 的效果不一样,(1)是对设计阶段函数起作用,也就是说你将这个命令输入之后会重新弹出一个新的adams/aview的窗口,在这里你的自定义函数已经加入function builder了;(2)就不一样了,这是对于运行阶段函数而言的,模型在仿真的时候会从你指定的dll文件里调用用户子程序。

欢迎高手拍砖!~~~

下面我给个设计阶段函数的例子,可以在function builder中看到。

谢谢duanxc314,原来我就是按照你的帖子中提供的那个DOC文档练习的,给了我很大帮助。刚刚又试了一下,myvcfun.c这个终于成功了,function builder中也有MYRAND( REAL )了。

再谈一谈这两天新的认识:
关于Q.3.1,在DOS下执行"cl /c /G6 /Ox /MD user.c"和在VC中编译生成user.obj效果应该是一样的,因为"cl.exe"是由VC提供的,在....\Microsoft Visual Studio\VC98\Bin目录下。
关于Q.3.2和Q.3.3,我觉得dll文件应该是依赖VC生成的,这里应该涉及到了dll(动态连接库)和VC的知识的一些概念性知识,值得继续探讨,也请高手们指点。我的依据是——生成dll的过程中要用到VC提供的一些lib文件(msvcrt.lib等,位于....\Microsoft Visual Studio\VC98\Lib目录下),如T.3.2及二楼图所示。因此直接用VC生成dll的方法
(原文http://www.simwe.com/forum/viewthread.php?tid=90041
我觉得应该是可行的,值得试一试。
关于Q.4.1,很惭愧学习adams才没多久,对设计函数和运行函数的概念区分都不太清楚,但是目前我做的题目中遇到的问题是要用到运行函数,但愿能找到讲解自定义运行函数的实例。

评分

1

查看全部评分

发表于 2006-3-29 15:05:58 | 显示全部楼层 来自 湖北武汉

Re:使用adams用户子程序的总结及一些问题

你所说的直接在vc环境下编译生成dll文件,其实还是用到了adams/solver和conmmon中的库文件的,效果与在dos环境下用adams命令生成效果一样的。至于你说要运行函数,在solver的samples下就有很多现成的,不错用c写的不多。我在附件里面放了几个用c写的子程序,希望多你有用!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2006-6-30 16:58:42 | 显示全部楼层 来自 河北廊坊

请问,子程序写成*。cpp格式然后编译成*。dll,是否可以?

请问,子程序写成*。cpp格式然后编译成*。dll,是否可以?
看来这么多贴,总感觉在使用子程序(编写,编译,adams设置等)还是不清楚。
那位能否帮忙整理一下详细流程(包括fortran,c,vc格式)。谢谢
发表于 2006-7-3 23:22:47 | 显示全部楼层 来自 河北廊坊
这个rand()函数只有一个输入变量,如果要做一个函数有7个实变量
,其中一个是时间,其他是关节角,请问应该如何建立这个函数子程序。

在函数注册void vc_initialize_user()里有个枚举变量fn_R_R,如果是七个实变量,fn_R_RRRRRRR,这好象在头文件mdi-c.h里没有哦,
还有这个时间变量在调用时应该怎么输入呢?


原帖由 duanxc314 于 2006-3-27 19:19 发表
在function builder下的随机函数rand()
发表于 2006-9-29 10:14:11 | 显示全部楼层 来自 湖北武汉
duanxc314  你好:
   我按照你提供的例子和步骤编译MYRAND()函数,但出现如下的错误提示,

Linking...
   Creating library Debug/myvcfun.lib and object Debug/myvcfun.exp
myvcfun.obj : error LNK2001: unresolved external symbol _vc_function_add
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/myvcfun.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

myvcfun.exe - 3 error(s), 0 warning(s)
我在网上找相关错误的解决办法,但都没有用,不知什么原因,你能够指点我一下吗??
谢谢拉!!
发表于 2006-9-30 09:06:46 | 显示全部楼层 来自 湖北武汉
duanxc314  你好:
   我按照你提供的例子和步骤编译MYRAND()函数,但出现如下的错误提示,

Linking...
   Creating library Debug/myvcfun.lib and object Debug/myvcfun.exp
myvcfun.obj : error LNK2001: unresolved external symbol _vc_function_add
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/myvcfun.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

myvcfun.exe - 3 error(s), 0 warning(s)
我在网上找相关错误的解决办法,但都没有用,不知什么原因,你能够指点我一下吗??
谢谢拉!!
发表于 2006-10-3 09:31:29 | 显示全部楼层 来自 湖北武汉
duanxc314  你好:
   我按照你提供的例子和步骤编译MYRAND()函数,但出现如下的错误提示,

Linking...
   Creating library Debug/myvcfun.lib and object Debug/myvcfun.exp
myvcfun.obj : error LNK2001: unresolved external symbol _vc_function_add
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/myvcfun.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

myvcfun.exe - 3 error(s), 0 warning(s)
我在网上找相关错误的解决办法,但都没有用,不知什么原因,你能够指点我一下吗??
谢谢拉!!
发表于 2006-11-10 18:46:19 | 显示全部楼层 来自 黑龙江哈尔滨
我用的是ADAMS12  这里面没有上面所说的头文件
我还不知道那两个库文件在哪可以找到
怎么办
发表于 2007-9-30 22:52:00 | 显示全部楼层 来自 陕西西安
原帖由 duanxc314 于 2006-3-29 15:05 发表
你所说的直接在vc环境下编译生成dll文件,其实还是用到了adams/solver和conmmon中的库文件的,效果与在dos环境下用adams命令生成效果一样的。至于你说要运行函数,在solver的samples下就有很多现成的,不错用c写 ...



你好!我用您附件里的myvcfun.dll复制到dos工作目录下,然后用命令adams05 aview ru-user i myvcfun.dll,可以在Settings\Solver\Solver Executable中看到myvcfun.dll,但是不能在Function Builder中看到MYRAND(real),请问是什么原因?


PS:我用的是adams2005,我开始以为是adams版本问题,后来看到搂主也用2005版而且用您的例子可以看到MYRAND(real)。

另外,帖子
http://www.simwe.com/forum/viewthread.php?tid=475167&highlight=%D3%C3%BB%A7%D7%D3%B3%CC%D0%F2提到
"许多人能成功生成dll文件,可以看下中山狼的帖子,但在运行后却找不到自定义的函数。我发现要生成aview中的设计过程函数,在选择生成dll文件时不要选择adams/aview下的cr-user,而应直接选择adams cr-user,好像生成的是solver的动态连接库,但却可应用于aview中。生成动态连接库后,运行adams12 av ru-user,在询问aview的动态连接库时敲入生成的dll文件,在function builder的misc函数集中就可找到自定义函数了。"

会不会是这个原因?

[ 本帖最后由 yss 于 2007-9-30 23:06 编辑 ]
回复 不支持

使用道具 举报

发表于 2011-1-5 16:01:20 | 显示全部楼层 来自 山东济南
顶一下,我刚入门
回复 不支持

使用道具 举报

发表于 2011-1-23 15:56:07 | 显示全部楼层 来自 湖北武汉
请问出现error:无法定位程序输入点_ms part lib_d_fseek_i8于动态链接库DFORMD.DLL上。这是怎么回事?如何解决。
回复 不支持

使用道具 举报

发表于 2011-2-19 22:50:30 | 显示全部楼层 来自 四川乐山
定下,正要用这个东东
回复 不支持

使用道具 举报

发表于 2012-3-30 23:28:28 | 显示全部楼层 来自 北京
科普了一下,好贴!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-24 20:44 , Processed in 0.061449 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表