全球FlexSim系统仿真中文论坛

搜索
查看: 9468|回复: 7
打印 上一主题 下一主题

创建DLLs链接Flexsim

[复制链接]
跳转到指定楼层
1#
domcylai 发表于 2012-10-14 16:35:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注:本文由Flexsim官方论坛提供。( A7 f8 c2 u5 Z$ |; n4 k

7 P" d+ S3 h. E7 o+ y本文介绍如何在Flexsim执行一个dll
2 G+ T7 E  V; ]5 x( \) C8 i* E; b5 [& D/ k; Z/ @( j
要建立一个Flexsim的DLL,你首先需要启动与Visual Studio DLL项目。下面链接到最新版本的DLL Maker项目。
" T$ p" g6 n# [, u9 u! W! }7 h; O- Q* P% ?/ ]" c; I* q, W
https://bitbucket.org/flexsim/flexsi...er/get/tip.zip/ M$ I' T! j; S" e. W! `+ ~& |4 J

6 I0 |& c+ a: W9 E' t( Y! ~& h8 r上文介绍的DLL项目中包含两个基本的C++头文件,即flexsimfuncs.h和flexsimdefs.h。随着时间的推移和Flexsim的新版本的发布,这些文件可能需要变更以便适应Flexsim在新版本的功能(以及更好的访问)。
2 B7 y9 X* m' [- W. `
4 S' [& ]/ o6 w4 _[url=hg clone https://bitbucket.org/flexsim/flexsim-dll-maker]hg clone https://bitbucket.org/flexsim/flexsim-dll-maker[/url]
# }& q) x; _, y0 J
: F% z8 f3 B7 V0 |5 b: }3 ~# }" Z" l最新版本的flexsimfuncs.h和flexsimdefs.h可在下面得到:
4 f+ H1 P# U6 o7 C4 V
: L& W$ o* a% m: P9 Q( Rhttps://bitbucket.org/flexsim/flexsi...FlexsimFuncs.h.) ]( n- N+ Q$ ]/ W% u/ p* s
https://bitbucket.org/flexsim/flexsi.../FlexsimDefs.h.
5 t/ F1 t& s( e$ l4 s! `/ O- p0 t9 L8 K
实施DLL与Flexsim链接& y$ x% X8 k2 s+ o7 {  [- s; c

7 m' ~% j. `* f0 K7 e# l5 w$ k实施DLL与Flexsim的正确链接包含几个步骤。DLL的目的是为了取代在模型中点通常被称为flexscript/ C++的节点的功能(使DLL功能取代原有节点的功能)。这样做有两个好处:首先,可能最重要的是它为您提供了C ++的优势,包括速度和最大的灵活性,而不需要每次打开模型的建模工具来编译。其次,如果你想保护某些知识产权,它允许您隐藏代码。
* X7 h# r! L+ k4 u# c2 J# A
# Y$ N2 J+ [  s首先,你要在dll中实现相应功能,下面提供一个DLL Maker项目的案例:
# o) ^. `4 n* {4 _) b+ P4 A0 q0 ^, }% B# u" A. Z% i
Code:+ Z1 i  K) O# R2 {
#include "FlexsimDefs.h"
4 @" o3 @) N$ g8 i % l0 e  r, `) }& Q' [8 Z
visible double mydllfunction1(FLEXSIMINTERFACE)  E. f: P/ F% P9 H3 h
{3 b; q% p, m/ a3 }1 L
    pt("This will print to the Output Console");pr();6 C1 ?0 L6 N* S9 x- x5 N0 f  L
    return 0;
1 I2 R8 ~% J8 e1 b* U& P}  ?6 F* ^& d0 n" P
3 e6 I" S: S% L7 V0 k
为了与一个Flexsim节点链接,该函数必须有相应的声明。首先,函数应该包括flexsimdefs.h:一些宏定义以及被声明的Flexsim命令,这样你就可以访问这些命令。这些声明如下:. V* T) w0 A' O( C$ s8 G8 h) F$ T

% J% G2 [$ y1 U+ J2 F* w# O9 \visible double the_function_name(FLEXSIMINTERFACE)/ z' N& @9 i3 @7 U

- V2 I4 V: M% ^' X2 W  A/ a' G一旦声明适当的函数,您就可以访问参数,并编写代码,就像你在Flexsim触发器或其他代码块中写的代码一样。例如,您可以在消息触发器重使用parnode,parval,msgsendingobject和msgparam等命令。对于的大多数部分你只需从一个Ç++/ flexscript代码域中复制代码直进入的(dll)函数(其中一些注意事项在后文解释)。6 M2 w$ b( S5 s1 h; [

% S/ `$ Y) j/ c7 |: i6 S一旦你在dll中定义了函数,你需要在Flexsim中定义‘节点如何链接dll’。例如,假设你(Flexsim)的一个消息触发器需要调用一个dll函数,打开消息触发器代码域,在代码域的底部点击“DLL”单选按钮。你会得到一条提示:“你需要为DLL链接格式化代码吗?”,点击OK,此时触发器将切换至dll链接(状态),且代码变成了默认格式。这可以让你在/ **/ ** /语法中定义模板代码,使模板窗口将提供有用的信息,同时还可以让你正确定义dll的链接信息。
! g7 D& R% v, P* r2 D$ X3 m3 \8 n; g% B: V0 J5 {3 P) T, y
第一个引号中的文本应该是dll的路径。可以是一个绝对路径,例如"C:\Documents and Settings\Anthony Johnson\My Documents\dllname.dll",也可以是一个相对路径。如果是一个相对路径,则有两种选择。你可以将使用程序目录,假如你这么将dll文件放在\libraries的目录下,这个路径应该是"..\libraries\dllname.dll",你也可以使用模型的刘静,例如,假设dll文件和模型在同一个目录下,则路径非常简单:"dllname.dll"。
3 N$ p( r. f) l: V4 O3 C- a% {* q, ?' m! o: |4 k! S! E
第二个引号的文本应该是这次触发器所调用的函数的名称,在DLL Maker中所提供的例子,这个名字应该是"mydllfunction1"。
, b+ V$ r) G0 L( J' Y# ?: U' k6 t& a) g- p* s
一旦你创建了dll文件,同时在Flexsim触发器中切换了“DLL”状态并指定正确的信息, 你应该能够运行模型,在Flexsim中,只要您的DLL触发触发器被触发时,将调用相应的函数的DLL。
' `& w$ a4 v( u3 }4 g! C6 y0 Z  @7 t
配置Visual Studio,将DLL放置在适当的位置: m( P6 A1 _. I/ X8 H
放置dll的位置是非常重要的,正如上面提到的,你要配置您的Visual Studio项目中的DLL放置在适当的位置。这里有一些建议,如果你创建的DLL将用于一个特定的模型,放置DLL Maker文件夹在模型相同的路径下。 .fsm是你保存的文件,通过双击“DLL Maker\DLL Maker.vcproj”打开Visual Studio。在解决方案资源管理器的左侧,右键单击DLL Maker项目(不是解决方案‘DLL Maker’,而是项目下面的图标),选择属性,在“配置”下拉式的顶部,选择“所有配置”。在树左侧配置属性>链接器>常规。在输出文件字段中,键入:.. / dllname.dll(重命名任何你想要的名字),然后单击OK。这将把项目的dll保存到你的模型目录中,所以,当你配置你的dll路径在Flexsim中,你可以直接把它为“dllname.dll”,因为它已经在你的模型相同的目录中。
' ]1 j) }8 V1 H8 l" Z! D9 c
4 `/ N1 I; e8 z! p* b& T在打开Flexsim时候Rebuilding你的DLL
1 I, W# Z+ _1 O) O  L' ?) }; l6 V通常情况下,你可能需要要重新生成的DLL但Flexsim已经链接到它。如果你明确地断开Flexsim的链接,Visual Studio会告诉你编译错误,说不能写的DLL文件。为了断开链接,选择Flexsim的菜单:文件/系统/断开/DLL。如果你有一个draw code(图形用户代码)链接dll,你需要将所有的‘映射/透视’窗口最小化,然后选择:文件/系统/断开/DLL。
& d0 P$ }! G) Z& \/ d8 t2 y' p( h* u0 ~, E1 Z+ e( `
移动模型的代码至dll中实现“多合一”(的效果), \# ^, r" K  z( p' ]
有一个脚本可以通过你的模型,并移动所有的东西到一个cpp文件的dll的,并切换所有节点的为DLL。您只需将其粘贴到一个脚本控制台,并执行它。你需要配置正确的道路,cpp文件和dll文件(前两个语句的代码)。请注意,如果你的模型中的对象具有相同的名称,这可能会导致DLL编译错误。
( l6 x% ^6 q& a* ^3 z该代码可以在Flexsim的DLL项目中下载:
5 z* H: R- R. C5 }( D% `" ~http://code.google.com/p/flexsim-dll...scriptToDLL.fs 7 u* R6 U2 d- ]8 Z
8 N" M# e% [" l2 C; @
这一切是如何工作的- c' C* X1 `; \! @9 C0 l$ p
一个关于dll机制是如何工作的说明,是从flexsimfuncs.h的文件内复制的。如果你只是想要得到一个简单的DLL,这个信息是没有必要了解的。(后面的就先不翻译了,有时间再说)
2#
 楼主| domcylai 发表于 2012-10-14 16:42:56 | 只看该作者
附件:

本帖子中包含更多资源

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

x
3#
shadowwind 发表于 2012-10-14 22:34:38 | 只看该作者
1# domcylai % s7 }! X  c1 w  I/ V. z6 V
$ H: ]# R2 P& t! Z
7 E, w% C  W) a. q
不错不错,又在努力钻研了啊
4#
 楼主| domcylai 发表于 2012-10-16 22:43:48 | 只看该作者
只是官方论坛上安东尼的一个帖子,我译了一部分。还得闭关修炼修炼才行啊……
5#
missman 发表于 2013-1-23 12:45:04 | 只看该作者
太给力了!我最近正需要用这个相关的知识。. `+ M0 b0 m( a
+ r+ y+ O, l0 L
如果其他软件需要通过dll调用flexsim,应该如何操作啊?
6#
missman 发表于 2013-1-23 12:50:26 | 只看该作者
老大,能不能搞个教程啊?一步一步的指导一下我们菜鸟制作一个flexsim的dll啊?我目前的一个调度系统继续这样的功能啊。
7#
1010265352 发表于 2015-11-6 16:14:26 | 只看该作者
学习一下
8#
yuzhu 发表于 2015-12-25 13:35:08 | 只看该作者
虽然看不太懂,但是感觉还是很有用的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-8-31 10:31 , Processed in 0.080800 second(s), 14 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

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