Flexsim第一周--代码部分学习
Flexsim編寫自定義邏輯的方式有兩種:
Flexsim腳本
C++
C++的所有能力在此均可應用。
FIexsim腳本編寫完成,即刻生效,不需要進行編譯。
如果非常關注速度問題,可以使用C++,因為它的運行速度比Flexsim腳本更快,但是必須進行編譯。
基礎語法規則:
Current and Item:
Current-當前變量是對當前資源對象的引用。它通常是選擇列表中的訪問變量。
item-item變量是對觸發器或函數的相關項的引用。它通常是選擇列表中的訪問變量。
引用對象
數學符號:
下列給出了用于數值計算的各種數學運算符。
?注意,FIexsim中默認數值為雙精度浮點數,所以編寫邏輯的時候通常要把運算符當作是適
用于浮點數運算的。
例如,如果兩個操作員都是整數,/將返回整數,如果需要讓C++將它詮釋為浮點類型,可以輸入5.0而非5。
比較運算符:
?注意:使用==時,浮點數必須保持64比特的完全一致,因此建議比較浮點數時使用自定義函數如equal對==進行重寫
關系變量:
下表給出了連接幾個變量比較的不同運算符號。
設置和改變變量
下表給出了設定和修改變量的方式。
變量類型
Flexsim中,只需要使用四種類型的變量,四種類型中的每一種都應用于數組結構中。
一元變量:
數組變量:
示例:
執行命令
 在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代表剛剛創建的流動實體;
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.currentTaskTaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];int curTaskType = ts.currentTask.type;...TaskSequence.preemptTaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];int preempt = ts.preempt;...TaskSequence.priorityTaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];double priority = ts.priority;...TaskSequence.rankTaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];int tsRank = ts.rank; // should be 1...TaskSequence.tasksTaskExecuter 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.involved1TaskExecuter?op?=?Model.find("Operator1");TaskSequence?ts?=?op.taskSequences[1];treenode?involved1?=?ts.currentTask.involved1;...TaskSequence.Task.rankTaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];int rank = ts.currentTask.rank;...TaskSequence.Task.stateTASKSTATE_UNFINISHED TASKSTATE_ACTIVE TASKSTATE_COORDINATED TASKSTATE_FINISHED TaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];int state = ts.currentTask.state;...TaskSequence.Task.typeTaskExecuter op = Model.find("Operator1");TaskSequence ts = op.taskSequences[1];int curTaskType = ts.currentTask.type;...TaskSequence.Task.var1TaskExecuter 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);
總結
以上是生活随笔為你收集整理的Flexsim第一周--代码部分学习的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: foxtable水晶报表操作
- 下一篇: ecstore删除流程分析
