Flexsim第一周--代码部分学习

Flexsim编写自定义逻辑的方式有两种:

Flexsim脚本

C++

C++的所有能力在此均可应用。

FIexsim脚本编写完成,即刻生效,不需要进行编译。

如果非常关注速度问题,可以使用C++,因为它的运行速度比Flexsim脚本更快,但是必须进行编译。

基础语法规则:

  1. 语言对大小写敏感(A不同于a)
  2. 不需要特殊的格式(鼓励灵活运用空格、制表位以及语句换行)
  3. 如果不明确说明,数值都是双精度的浮点值
  4. 文本字符串通常用双引号引起来,如"mytext”
  5. 函数之后有圆括号,用逗号分隔函数的参数,如moveobject(objectl,object2)。
  6. 函数或命令总是以分号结尾
  7. 圆括号可以在数学或逻辑表达式中自由应用生成组合
  8. 花括号用来定义复合语句模块
  9. 用//将一行的其余部分注释掉
  10. 在命名时不要使用空格或特殊字符(_可以)。
  11. 名称变量和明确的值可以在表达式中互换使用

Current and Item:

Current-当前变量是对当前资源对象的引用。它通常是选择列表中的访问变量。

item-item变量是对触发器或函数的相关项的引用。它通常是选择列表中的访问变量。

引用对象

数学符号:

下列给出了用于数值计算的各种数学运算符。

 注意,FIexsim中默认数值为双精度浮点数,所以编写逻辑的时候通常要把运算符当作是适

用于浮点数运算的。

  1. 当运算符用于浮点数时,可能会发生精度不够的情况。
  2. 当整数类型与浮点数类型相混合或者仅使用整数类型时,使用这些运算符需要注意。

例如,如果两个操作员都是整数,/将返回整数,如果需要让C++将它诠释为浮点类型,可以输入5.0而非5。

比较运算符:

 注意:使用==时,浮点数必须保持64比特的完全一致,因此建议比较浮点数时使用自定义函数如equal对==进行重写

关系变量:

下表给出了连接几个变量比较的不同运算符号。

设置和改变变量

下表给出了设定和修改变量的方式。

变量类型

Flexsim中,只需要使用四种类型的变量,四种类型中的每一种都应用于数组结构中。

一元变量:

  1. lnt
  2. DoubIe
  3. String
  4. Treenode

数组变量:

  1. lntarray
  2. doublearray
  3. Stringarray
  4. 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.Taskhttps://link.zhihu.com/?target=https://docs.flexsim.com/en/19.1/Reference/CodingInFlexSim/FlexScriptAPIReference/TaskExecuter/TaskSequence.Task.html%23top

​
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);

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值