全球FlexSim系统仿真中文论坛

标题: 创建DLLs链接Flexsim [打印本页]

作者: domcylai    时间: 2012-10-14 16:35
标题: 创建DLLs链接Flexsim
注:本文由Flexsim官方论坛提供。
0 K0 G, [2 D+ K5 p4 a  F. T  D
9 m+ v& i& L: O$ y- R6 ?本文介绍如何在Flexsim执行一个dll% C. X' V: O1 O) d2 v1 v
6 s4 {) }8 i! i; e* ?0 L7 Q) g
要建立一个Flexsim的DLL,你首先需要启动与Visual Studio DLL项目。下面链接到最新版本的DLL Maker项目。3 B7 j' ~8 l2 s8 c! v
. B5 N  _+ G& e5 ]: V
https://bitbucket.org/flexsim/flexsi...er/get/tip.zip
3 d4 f( E- a0 J
' Z1 X. B3 o+ s上文介绍的DLL项目中包含两个基本的C++头文件,即flexsimfuncs.h和flexsimdefs.h。随着时间的推移和Flexsim的新版本的发布,这些文件可能需要变更以便适应Flexsim在新版本的功能(以及更好的访问)。7 ?* O9 w, q: h7 }4 ~" Z- r

, u$ `" ]% {( a6 D+ Q8 o[url=hg clone https://bitbucket.org/flexsim/flexsim-dll-maker]hg clone https://bitbucket.org/flexsim/flexsim-dll-maker[/url]) E( r2 \: _$ w4 T: [
3 y. ^% i' f3 u. B& G
最新版本的flexsimfuncs.h和flexsimdefs.h可在下面得到:# O- P# @  l/ V, c% O

+ S8 L6 _* Y+ X, v& p/ Ahttps://bitbucket.org/flexsim/flexsi...FlexsimFuncs.h., |! j: B" C' i& E: @8 r
https://bitbucket.org/flexsim/flexsi.../FlexsimDefs.h., ]! [* z0 {3 m& L8 B2 f6 a7 S
. z  j9 x" Y2 g8 d) b" {
实施DLL与Flexsim链接
$ q% W. B. ~4 w0 g- J3 l9 k
* t8 p* r  R6 `( N5 {4 l9 u% h实施DLL与Flexsim的正确链接包含几个步骤。DLL的目的是为了取代在模型中点通常被称为flexscript/ C++的节点的功能(使DLL功能取代原有节点的功能)。这样做有两个好处:首先,可能最重要的是它为您提供了C ++的优势,包括速度和最大的灵活性,而不需要每次打开模型的建模工具来编译。其次,如果你想保护某些知识产权,它允许您隐藏代码。
7 F$ I) T  E9 S/ C9 x) C! W$ x9 |+ f- G; [  U( I! a0 G' g  l
首先,你要在dll中实现相应功能,下面提供一个DLL Maker项目的案例:
# U/ |1 b+ F+ {
! E! |" @/ t% {) _Code:
* I9 _: p% U7 P6 G#include "FlexsimDefs.h"
1 P& z0 e: ]0 m3 S7 s7 w4 q! `' [ ' S" D9 S! a! j- {' S
visible double mydllfunction1(FLEXSIMINTERFACE), A8 ^* p5 U6 H/ e! l/ Z. p
{
2 A3 Z% ^' \+ {5 K' @% X2 |    pt("This will print to the Output Console");pr();
' x* f: G8 M" G8 K    return 0;, S  @' A2 C: x/ R9 R9 v7 ]- f3 s( R
}6 l9 }9 ~* y" N( O# R' e
# W4 t" \& h! U1 }) ~
为了与一个Flexsim节点链接,该函数必须有相应的声明。首先,函数应该包括flexsimdefs.h:一些宏定义以及被声明的Flexsim命令,这样你就可以访问这些命令。这些声明如下:
- v. b% {. n6 l+ r+ l1 G) g% z& Y0 r" X7 T; `
visible double the_function_name(FLEXSIMINTERFACE)
% T/ B$ L5 N& @/ l  ]9 Q$ t# {
- Y0 B* O' J7 R一旦声明适当的函数,您就可以访问参数,并编写代码,就像你在Flexsim触发器或其他代码块中写的代码一样。例如,您可以在消息触发器重使用parnode,parval,msgsendingobject和msgparam等命令。对于的大多数部分你只需从一个Ç++/ flexscript代码域中复制代码直进入的(dll)函数(其中一些注意事项在后文解释)。
  a( w( j- R3 _& e/ z! S  |9 H& R8 Y1 c4 K2 s! w
一旦你在dll中定义了函数,你需要在Flexsim中定义‘节点如何链接dll’。例如,假设你(Flexsim)的一个消息触发器需要调用一个dll函数,打开消息触发器代码域,在代码域的底部点击“DLL”单选按钮。你会得到一条提示:“你需要为DLL链接格式化代码吗?”,点击OK,此时触发器将切换至dll链接(状态),且代码变成了默认格式。这可以让你在/ **/ ** /语法中定义模板代码,使模板窗口将提供有用的信息,同时还可以让你正确定义dll的链接信息。) p1 X3 a8 A% q* F5 i/ @
& m' n. x) f7 Q: `5 ]5 [
第一个引号中的文本应该是dll的路径。可以是一个绝对路径,例如"C:\Documents and Settings\Anthony Johnson\My Documents\dllname.dll",也可以是一个相对路径。如果是一个相对路径,则有两种选择。你可以将使用程序目录,假如你这么将dll文件放在\libraries的目录下,这个路径应该是"..\libraries\dllname.dll",你也可以使用模型的刘静,例如,假设dll文件和模型在同一个目录下,则路径非常简单:"dllname.dll"。% d2 U7 r; s6 V% G
! k- ~% `( a  h' k1 j
第二个引号的文本应该是这次触发器所调用的函数的名称,在DLL Maker中所提供的例子,这个名字应该是"mydllfunction1"。
0 ^7 h% w: U! X/ N6 o! K7 W0 ]  Q* j4 X$ S8 v& u# b
一旦你创建了dll文件,同时在Flexsim触发器中切换了“DLL”状态并指定正确的信息, 你应该能够运行模型,在Flexsim中,只要您的DLL触发触发器被触发时,将调用相应的函数的DLL。
5 Q6 q3 k, p  q. E( b  n
$ I- X- e; Y3 D. U) J7 w  ]+ I5 m配置Visual Studio,将DLL放置在适当的位置7 j3 [- G! L. \  ]; Z6 ~$ s$ `9 ?- @
放置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”,因为它已经在你的模型相同的目录中。
# R  t& h7 j  F/ n6 H7 {4 N: I' W( q/ a0 ?8 d, j4 G" U0 Z
在打开Flexsim时候Rebuilding你的DLL* x% c( i3 P+ {* ^8 _
通常情况下,你可能需要要重新生成的DLL但Flexsim已经链接到它。如果你明确地断开Flexsim的链接,Visual Studio会告诉你编译错误,说不能写的DLL文件。为了断开链接,选择Flexsim的菜单:文件/系统/断开/DLL。如果你有一个draw code(图形用户代码)链接dll,你需要将所有的‘映射/透视’窗口最小化,然后选择:文件/系统/断开/DLL。1 Z, |* t" G$ c: e& l
/ w2 a" {5 n" |  b5 i7 T: a1 ^
移动模型的代码至dll中实现“多合一”(的效果): @" @# i: e# u: `( \* n
有一个脚本可以通过你的模型,并移动所有的东西到一个cpp文件的dll的,并切换所有节点的为DLL。您只需将其粘贴到一个脚本控制台,并执行它。你需要配置正确的道路,cpp文件和dll文件(前两个语句的代码)。请注意,如果你的模型中的对象具有相同的名称,这可能会导致DLL编译错误。
. a! ?/ _, n. e2 N( y. q该代码可以在Flexsim的DLL项目中下载:4 k# h. \1 x2 k& S
http://code.google.com/p/flexsim-dll...scriptToDLL.fs
$ _% \$ |! ~  W( G
; r( _# ^; w: b1 R% L6 ~/ ]这一切是如何工作的/ K% x7 Z7 n; W
一个关于dll机制是如何工作的说明,是从flexsimfuncs.h的文件内复制的。如果你只是想要得到一个简单的DLL,这个信息是没有必要了解的。(后面的就先不翻译了,有时间再说)
作者: domcylai    时间: 2012-10-14 16:42
附件:[attach]839[/attach]
作者: shadowwind    时间: 2012-10-14 22:34
1# domcylai 7 \& L/ m9 K# U! L3 W% f9 S  `5 X# R5 i

% W! `5 s0 i3 `6 y7 A; Z. {, f+ U5 e- n1 v7 v! F7 J
不错不错,又在努力钻研了啊
作者: domcylai    时间: 2012-10-16 22:43
只是官方论坛上安东尼的一个帖子,我译了一部分。还得闭关修炼修炼才行啊……
作者: missman    时间: 2013-1-23 12:45
太给力了!我最近正需要用这个相关的知识。- f3 k$ Q- V: j( R# ~8 s
0 h4 x4 T, a) }! o5 B& V9 _
如果其他软件需要通过dll调用flexsim,应该如何操作啊?
作者: missman    时间: 2013-1-23 12:50
老大,能不能搞个教程啊?一步一步的指导一下我们菜鸟制作一个flexsim的dll啊?我目前的一个调度系统继续这样的功能啊。
作者: 1010265352    时间: 2015-11-6 16:14
学习一下
作者: yuzhu    时间: 2015-12-25 13:35
虽然看不太懂,但是感觉还是很有用的




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3