|
注:本文由Flexsim官方论坛提供。
8 [! W6 r& M, B b* u: o0 L9 z
7 v" b3 U' t( D/ \本文介绍如何在Flexsim执行一个dll' y. A8 J2 c. \5 y) L: N. j
, W! y" {7 h. c+ _. R; E要建立一个Flexsim的DLL,你首先需要启动与Visual Studio DLL项目。下面链接到最新版本的DLL Maker项目。5 i' k( E8 R0 X3 _4 R
% A2 j& o, @: r5 J8 L! ]3 N
https://bitbucket.org/flexsim/flexsi...er/get/tip.zip
8 C: ^, @7 R) U5 N r0 N
. p- U* l9 h0 M' j8 Y n7 F上文介绍的DLL项目中包含两个基本的C++头文件,即flexsimfuncs.h和flexsimdefs.h。随着时间的推移和Flexsim的新版本的发布,这些文件可能需要变更以便适应Flexsim在新版本的功能(以及更好的访问)。
% e5 W4 o; m+ V& |2 g9 m E& D6 t
[url=hg clone https://bitbucket.org/flexsim/flexsim-dll-maker]hg clone https://bitbucket.org/flexsim/flexsim-dll-maker[/url]5 `& y; N1 \, L7 a
! V( q5 z* E3 C2 J+ A O$ `2 \最新版本的flexsimfuncs.h和flexsimdefs.h可在下面得到:" Q0 [' @ P I" C7 N0 i
. T1 `6 o$ ] V' N' E; A; W2 @
https://bitbucket.org/flexsim/flexsi...FlexsimFuncs.h.& Y- e) n7 ^, o5 ]
https://bitbucket.org/flexsim/flexsi.../FlexsimDefs.h.
$ t1 ?+ o5 k$ f' r- B0 w+ o" `: i* Y$ d7 E2 x7 ~% ]" }! m, ~
实施DLL与Flexsim链接' g: a* M0 K" l+ g+ j1 P2 t2 d. g
. m% g+ N) D& l. J! w2 p
实施DLL与Flexsim的正确链接包含几个步骤。DLL的目的是为了取代在模型中点通常被称为flexscript/ C++的节点的功能(使DLL功能取代原有节点的功能)。这样做有两个好处:首先,可能最重要的是它为您提供了C ++的优势,包括速度和最大的灵活性,而不需要每次打开模型的建模工具来编译。其次,如果你想保护某些知识产权,它允许您隐藏代码。7 {( _) G6 S) w4 N8 g) J3 Y9 o
& t. K) L; @+ m3 z" x1 v8 y6 K
首先,你要在dll中实现相应功能,下面提供一个DLL Maker项目的案例:
, U# c# a# r( w
2 v2 G" V( g8 A! }" ]) ^7 ZCode:, M# j8 e$ R% j7 W& g( z/ b
#include "FlexsimDefs.h") B! j: {( J1 x6 g6 h' v2 i
6 T6 E& [/ C8 G3 u5 t, }
visible double mydllfunction1(FLEXSIMINTERFACE): d( H% r+ V4 J) \$ K# K1 U+ S1 I, i
{
" d! I7 W0 N$ |% q2 T; X pt("This will print to the Output Console");pr();
+ [+ S9 g: C0 Z% z Y2 T( M return 0;
) b0 e7 \ N7 X4 p/ [}+ L3 j8 G+ q1 H* m# H/ i+ B# N
- G& d2 }$ A! J: u8 b为了与一个Flexsim节点链接,该函数必须有相应的声明。首先,函数应该包括flexsimdefs.h:一些宏定义以及被声明的Flexsim命令,这样你就可以访问这些命令。这些声明如下:
# ^7 D( ^# i/ x! @/ W+ N/ o0 [+ |! {6 U' C* j( M" o
visible double the_function_name(FLEXSIMINTERFACE)( B8 F7 J: }0 y' p% I6 d
6 a' c" U; s$ X一旦声明适当的函数,您就可以访问参数,并编写代码,就像你在Flexsim触发器或其他代码块中写的代码一样。例如,您可以在消息触发器重使用parnode,parval,msgsendingobject和msgparam等命令。对于的大多数部分你只需从一个Ç++/ flexscript代码域中复制代码直进入的(dll)函数(其中一些注意事项在后文解释)。
8 d. `4 d. m* ?/ F4 z. ^$ @, I) t$ i) k" s5 h5 m* p, `
一旦你在dll中定义了函数,你需要在Flexsim中定义‘节点如何链接dll’。例如,假设你(Flexsim)的一个消息触发器需要调用一个dll函数,打开消息触发器代码域,在代码域的底部点击“DLL”单选按钮。你会得到一条提示:“你需要为DLL链接格式化代码吗?”,点击OK,此时触发器将切换至dll链接(状态),且代码变成了默认格式。这可以让你在/ **/ ** /语法中定义模板代码,使模板窗口将提供有用的信息,同时还可以让你正确定义dll的链接信息。
+ O( b3 x) B* S0 b Q6 w+ d; @& g" F% z& n/ S
第一个引号中的文本应该是dll的路径。可以是一个绝对路径,例如"C:\Documents and Settings\Anthony Johnson\My Documents\dllname.dll",也可以是一个相对路径。如果是一个相对路径,则有两种选择。你可以将使用程序目录,假如你这么将dll文件放在\libraries的目录下,这个路径应该是"..\libraries\dllname.dll",你也可以使用模型的刘静,例如,假设dll文件和模型在同一个目录下,则路径非常简单:"dllname.dll"。% ?% P0 o/ D# C$ ^
8 z! A3 L# x3 M' b
第二个引号的文本应该是这次触发器所调用的函数的名称,在DLL Maker中所提供的例子,这个名字应该是"mydllfunction1"。. N! V2 d3 k$ r( W
" T2 x2 @; D9 \7 R3 f
一旦你创建了dll文件,同时在Flexsim触发器中切换了“DLL”状态并指定正确的信息, 你应该能够运行模型,在Flexsim中,只要您的DLL触发触发器被触发时,将调用相应的函数的DLL。
) C- [" Q' n2 c, T1 T4 Z
$ M [ B$ O5 r; m配置Visual Studio,将DLL放置在适当的位置
V4 b; [( {5 @ u: w放置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”,因为它已经在你的模型相同的目录中。0 |: U( _) M/ z5 D* C# n3 l
: U/ p8 j' N2 B$ r- g
在打开Flexsim时候Rebuilding你的DLL
2 c7 W3 k& z7 k6 w' {) \4 P/ W' U1 j通常情况下,你可能需要要重新生成的DLL但Flexsim已经链接到它。如果你明确地断开Flexsim的链接,Visual Studio会告诉你编译错误,说不能写的DLL文件。为了断开链接,选择Flexsim的菜单:文件/系统/断开/DLL。如果你有一个draw code(图形用户代码)链接dll,你需要将所有的‘映射/透视’窗口最小化,然后选择:文件/系统/断开/DLL。
" S% G$ f% o, s K) \0 { D
7 t( t- Z& K7 o/ O# ^) C7 Q移动模型的代码至dll中实现“多合一”(的效果)5 z7 s2 G0 Z$ O Y, @
有一个脚本可以通过你的模型,并移动所有的东西到一个cpp文件的dll的,并切换所有节点的为DLL。您只需将其粘贴到一个脚本控制台,并执行它。你需要配置正确的道路,cpp文件和dll文件(前两个语句的代码)。请注意,如果你的模型中的对象具有相同的名称,这可能会导致DLL编译错误。
" P, O) p8 l. c0 }2 @" F; H1 H' B该代码可以在Flexsim的DLL项目中下载:/ w6 c1 S, R% m3 ^8 i9 F6 I' E
http://code.google.com/p/flexsim-dll...scriptToDLL.fs
6 n( W1 q0 A0 W$ t9 s' E# F
1 v, t* W- u, x这一切是如何工作的
: U7 Y- w8 m- D$ n7 N$ H/ G/ X; {一个关于dll机制是如何工作的说明,是从flexsimfuncs.h的文件内复制的。如果你只是想要得到一个简单的DLL,这个信息是没有必要了解的。(后面的就先不翻译了,有时间再说) |
|