Flexsim编写自定义逻辑的方式有两种:
Flexsim脚本
C++
C++的所有能力在此均可应用。
FIexsim脚本编写完成,即刻生效,不需要进行编译。
如果非常关注速度问题,可以使用C++,因为它的运行速度比Flexsim脚本更快,但是必须进行编译。
基础语法规则:
- 语言对大小写敏感(A不同于a)
- 不需要特殊的格式(鼓励灵活运用空格、制表位以及语句换行)
- 如果不明确说明,数值都是双精度的浮点值
- 文本字符串通常用双引号引起来,如"mytext”
- 函数之后有圆括号,用逗号分隔函数的参数,如moveobject(objectl,object2)。
- 函数或命令总是以分号结尾
- 圆括号可以在数学或逻辑表达式中自由应用生成组合
- 花括号用来定义复合语句模块
- 用//将一行的其余部分注释掉
- 在命名时不要使用空格或特殊字符(_可以)。
- 名称变量和明确的值可以在表达式中互换使用
Current and Item:
Current-当前变量是对当前资源对象的引用。它通常是选择列表中的访问变量。
item-item变量是对触发器或函数的相关项的引用。它通常是选择列表中的访问变量。
引用对象
数学符号:
下列给出了用于数值计算的各种数学运算符。
注意,FIexsim中默认数值为双精度浮点数,所以编写逻辑的时候通常要把运算符当作是适
用于浮点数运算的。
- 当运算符用于浮点数时,可能会发生精度不够的情况。
- 当整数类型与浮点数类型相混合或者仅使用整数类型时,使用这些运算符需要注意。
例如,如果两个操作员都是整数,/将返回整数,如果需要让C++将它诠释为浮点类型,可以输入5.0而非5。
比较运算符:
注意:使用==时,浮点数必须保持64比特的完全一致,因此建议比较浮点数时使用自定义函数如equal对==进行重写
关系变量:
下表给出了连接几个变量比较的不同运算符号。
设置和改变变量
下表给出了设定和修改变量的方式。
变量类型
Flexsim中,只需要使用四种类型的变量,四种类型中的每一种都应用于数组结构中。
一元变量:
- lnt
- DoubIe
- String
- Treenode
数组变量:
- lntarray
- doublearray
- Stringarray
- treenodearray
示例:
执行命令
在FIexsim执行命令分为如下的几步。首先键入命令的名称,后面跟前括号;然后键入命
令的参数,用逗号隔开,每个参数都可以是变量、表达式,或者甚至也可以是另一命令:用
后括号结束命令,并跟分号。在F1exsim的“帮助”主菜单下参考命令集可获取有关命令的
详细信息以及它们的功能和参数列表。参考基本律模甬那一节可快速获取常用命令信息。
基本的循环如下:
基本switch判断:
基本接续语句:
节点命令
通过卷轴按钮可以查看代码,这里以定义流动实体类型和颜色为例。
Object current = ownerobject(c);
Object item = param(1);
int rownumber = param(2); //row number of the schedule/sequence table
{ // ************* PickOption Start ************* //
/***popup:SetTypeAndColor*/
/**Set Item Type and Color*/
Object involved = /** \nFlowitem: *//***tag:involved*//**/item/**/;
double newtype = /** \nItem type: *//***tag:type*//**/duniform(1,3,getstream(current))/**/;
involved.Type = newtype;
involved.color = Color.byNumber(newtype);
} // ******* PickOption End ******* //
{ // ************* PickOption Start ************* //
旧版本中,各种对象都是treenode类型的,现在变为了Object。
这其中,代码表达的是:
current代表对象本身;
item代表刚刚创建的流动实体;
Object involved = item; // 将item的引用赋值给involved变量
double newtype = duniform(1,3,getstream(current)); // 在分布中产生一个数赋给newtype
involved.Type = newtype; // 将item的itemtype设为newtype
involved.color = Color.byNumber(newtype); // 设置item的color
FlexScript类参考
TaskExecuter
Dispatcher(任务分配器)
从Object继承,表示具有任务序列队列的Object的类,并实现接收和分派TaskSequences的逻辑。
属性:taskSequences—访问调度程序任务序列队列中的任务序列。
Dispatcher.taskSequences //任务序列读取Dispatcher disp = Model.find("Dispatcher1");int numTaskSequences = disp.taskSequences.length;for (int i = 1; i <= numTaskSequences; i++) {
TaskSequence ts = disp.taskSequences[i];
...}
1.2、TaskExecuter(任务执行者)
可以执行TaskSequences的Dispatcher的类。
属性:activeTask—访问对象当前正在执行的任务。
TaskExecuter obj = Model.find("Operator1");int taskType = obj.activeTask.type;...
activeTaskSequence—访问对象当前正在执行的任务序列
TaskExecuter obj = Model.find("Operator1");
double tsPriority = obj.activeTaskSequence.priority;
...
1.3、TaskSequence
表示TaskExecuter要执行的任务序列的类。
属性:
方法:
静态方法:
TaskSequence.currentTask
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int curTaskType = ts.currentTask.type;
...
TaskSequence.preempt
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int preempt = ts.preempt;
...
TaskSequence.priority
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
double priority = ts.priority;
...
TaskSequence.rank
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int tsRank = ts.rank; // should be 1
...
TaskSequence.tasks
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int numTasks = ts.tasks.length;
for (int i = 1; i <= numTasks; i++) {
Task task = ts.tasks[i];
}
TaskSequence.addTask()
TaskSequence.Task addTask( int type , treenode involved1 = null , treenode involved2 = null ,
Variant var1 = nullvar , Variant var2 = nullvar , Variant var3 = nullvar , Variant var4 = nullvar )
TaskSequence ts = TaskSequence.create(Model.find("Operator1"));
ts.addTask(TASKTYPE_LOAD, item, current);
...
ts.dispatch();
TaskSequence.dispatch()
TaskSequence ts = TaskSequence.create(Model.find("Operator1"));
ts.addTask(TASKTYPE_LOAD, item, current);
...
ts.dispatch();
1.4、TaskSequence.Task
表示任务序列中的单个任务的类。
属性:
TaskSequence.Task.involved1
TaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];treenode involved1 = ts.currentTask.involved1;...
TaskSequence.Task.rank
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int rank = ts.currentTask.rank;
...
TaskSequence.Task.state
TASKSTATE_UNFINISHED
TASKSTATE_ACTIVE
TASKSTATE_COORDINATED
TASKSTATE_FINISHED
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int state = ts.currentTask.state;
...
TaskSequence.Task.type
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
int curTaskType = ts.currentTask.type;
...
TaskSequence.Task.var1
TaskExecuter op = Model.find("Operator1");
TaskSequence ts = op.taskSequences[1];
Variant var1 = ts.currentTask.var1;
...
2、Token
表示Process Flow令牌的类。
属性:
方法:
Token.activity
获取对令牌当前活动的引用。
treenode curActivity = token.activity;
Token.childRank
获取子令牌的等级
int childRank = token.childRank;
Token.children
访问令牌的子节点。
token.children.length
token.children[1] // first child
token.children[token.children.length] // last child
token.children[i] // i-th child
Array childTokens = token.children.toArray();
Token.entryTime
获取令牌进入其当前活动的模型时间。
double entryTime = token.entryTime;
Token.id
获取令牌的唯一ID。
int id = token.id;
Token.instance
获取令牌的Process Flow实例。
treenode instance = token.instance;
Token.name
string name = token.name;
token.name = "Bottle";
Token.parent
TokenparentToken=token.parent;
Token.processFlow
获取令牌的Process Flow对象。
treenode flow = token.processFlow;
Token.byID()
TokenbyID(intid ,VariantprocessFlow = NULL )
Token token = Token.byID(25);
Token token = Token.byID(4, "ProcessFlow1");
Token.release()
release(Variantconnector )
token.release("Failed");
Token.setColor()
setColor(intred ,intgreen ,intblue ,intalpha )
token.setColor(255, 0, 0);
Token.setShape()
setShape(intshapeIndex )
token.setShape(1);
Token Constructor
static create(treenodeownerNode ,Variantactivity ,intstart = 1 ,Tokenparent = NULL ,intlabelAcess = 1 )
Token aToken = Token.create(NULL, getactivity("ProcessFlow", "Start"), 0); //General Process Flow
Token newToken = Token.create(Model.find("Processor1"), "Start", 0, aToken, TOKEN_LABEL_ACCESS_READ);
newToken.Type = 1;
newToken.release(0);