您當(dāng)前所在的位置:首頁(yè)>新聞中心

FLEXSCHE版本17的新功能

發(fā)布時(shí)間:2020-9-3發(fā)布人:admin

整體提速

再一次擠出了干抹布中的水。

大量數(shù)據(jù)的排程處理、繪圖處理、輸入輸出處理等、會(huì)給CPU帶來(lái)莫大的負(fù)擔(dān)。所以、從統(tǒng)計(jì)學(xué)的角度特定處理實(shí)際數(shù)據(jù)后反復(fù)運(yùn)行的記錄、綜合去除對(duì)該部分的負(fù)荷、加上對(duì)細(xì)節(jié)的仔細(xì)調(diào)整、從而實(shí)現(xiàn)了進(jìn)一步的提速。很多數(shù)據(jù)都觀測(cè)到有1~2成程度以上的改善。

例如、標(biāo)準(zhǔn)示例數(shù)據(jù)“10萬(wàn)工作的重排程處理的平均時(shí)間從版本16時(shí)4.0秒縮短為版本172.8秒(30%提速)。另外、其他的更大的數(shù)據(jù)從62秒縮短到53秒(15%提速)。排程以外的處理也進(jìn)行了提速。

上述測(cè)試值以CPUIntel Core i7-6700KPC進(jìn)行的測(cè)試。

另外、縮放甘特圖表對(duì)龐大數(shù)量的工作進(jìn)行繪圖時(shí)、進(jìn)行了簡(jiǎn)化顯示繪圖內(nèi)容提高反應(yīng)速度的細(xì)心處理。甘特圖表的放大·縮小·滾動(dòng)等反應(yīng)速度有了體感上的提高。

用戶界面

對(duì)顯示部分進(jìn)行了多數(shù)改良,變得更為靈活更為便利。

豐富了甘特圖表的圖棒和文本的繪圖方法

甘特圖表的最佳顯示方式根據(jù)人的喜好應(yīng)該有很多種方式。

版本17對(duì)資源甘特圖表和訂單甘特圖表的工作棒以及字符串的顯示方式進(jìn)行了整理,大幅度增加了各種變化。另外添加了為了在有限的空間內(nèi)高效顯示更多的字符信息的邏輯。

里程碑的強(qiáng)化

自定義符號(hào)

可以自由添加里程碑的符號(hào)圖了??梢詫⑷我獾膱D文件作為里程碑的標(biāo)志。

在訂單甘特圖表顯示

在訂單甘特圖表內(nèi)也可以顯示里程碑了。

高速繪圖和從訂單指定方式的擴(kuò)展

例如對(duì)特定的作業(yè)圖表行的特定的時(shí)間等、可以更為自由的顯示里程碑了。另外修改了繪圖處理從而提高了性能。能夠比之前更快繪制大量里程碑。

看板行的強(qiáng)化

豐富了可用看板行。

增加了可作為看板行使用的類型。添加了工作、工作圖、工序圖、工序?qū)哟?、?guī)格看板行。能夠比之前更為靈活的構(gòu)件圖表并直接顯示各種所需信息。

在各段顯示訂單甘特圖表行左部分

一般來(lái)講一個(gè)訂單的甘特圖表行有時(shí)由多段構(gòu)成。這種情況下可以切換每段的圖表行左部分的顯示內(nèi)容了。運(yùn)用此機(jī)制例如可以和實(shí)現(xiàn)下圖品目工序別甘特圖表。

僅在多縱列時(shí)可用。

FLEXSCHE Editor的功能擴(kuò)展

字段內(nèi)的復(fù)選框

復(fù)選框化比單純字符串顯示更為直觀、操作時(shí)也只要鉤選所以更為簡(jiǎn)單。

從表格窗口參照快照

在表格窗口可以顯示只讀的快照數(shù)據(jù)了。對(duì)某時(shí)刻的計(jì)劃數(shù)據(jù)除了以甘特圖表方式以外能夠以數(shù)據(jù)形式進(jìn)行對(duì)比了。

在選擇候選中顯示正式名稱

在指定規(guī)格和品目、資源等字段可以顯示其正式名稱了。指定非機(jī)械式?jīng)Q定的代碼而是命名的正式名稱可以更為便于各種數(shù)據(jù)的確認(rèn)。

FLEXSCHE d-MPS(供需平衡調(diào)整選項(xiàng))的功能擴(kuò)展

MPS編輯器的用戶定義行

可以添加以計(jì)算表達(dá)式方式計(jì)算出的每月·每日值的行。例如可以保存某時(shí)刻的MPS計(jì)劃在快照、從而能夠?qū)Ρ阮A(yù)計(jì)生產(chǎn)量和當(dāng)前生產(chǎn)量。

排程和建模

適應(yīng)時(shí)間制約

對(duì)于從定義在工序間的緩沖吸收工作延遲能夠簡(jiǎn)單建模了

工廠中有瓶頸工序時(shí)、為了最大化工廠全體的產(chǎn)出、必須最大限度運(yùn)轉(zhuǎn)瓶頸工序。那時(shí)為了不使由于前工序突發(fā)的故障(設(shè)備故障等)或統(tǒng)計(jì)變化(周期時(shí)間的變化)發(fā)生停止和降速、在瓶頸工序前設(shè)計(jì)時(shí)間余裕這種手法已經(jīng)廣為人知了。這個(gè)余裕時(shí)間稱為緩沖時(shí)間。

使用適應(yīng)制約的機(jī)制可以對(duì)應(yīng)這種計(jì)劃手法、可以簡(jiǎn)單實(shí)現(xiàn)在計(jì)劃時(shí)包含緩沖時(shí)間計(jì)劃、并在進(jìn)入運(yùn)行階段時(shí)以緩沖吸收延遲這種建模和排程。

原材料候選

有替代原料時(shí)、可以根據(jù)排程時(shí)的狀況進(jìn)行選擇了

有多個(gè)原料候選時(shí)、之前是這個(gè)訂單用這個(gè)需要這種人為決定(使用選擇器的方式)。

雖然也可以讓FLEXSCHE決定并動(dòng)態(tài)選擇、但限定于類似用這個(gè)設(shè)備的話用這個(gè)原料這種方式(使用品目許方式)。

版本17開始可以對(duì)候選資源和品目的所有組合、在排程規(guī)則中判斷如何選擇最好。例如可以在規(guī)則中制訂優(yōu)選選擇原料A,如果不足的話也可以使用原料B”,對(duì)于各個(gè)訂單如何選擇資源、品目可以根據(jù)排程的狀況進(jìn)行判斷了。

對(duì)被選方指定多個(gè)選擇器

更為簡(jiǎn)單的表現(xiàn)工序的變化

選擇器是之前FLEXSCHE就有的機(jī)制、對(duì)所需原料或前工序設(shè)置名稱(="選擇器")、各個(gè)訂單可以進(jìn)行選擇。此例中最多需要2個(gè)工序制造產(chǎn)品。需要4種原料("A1"、"A2""B1"、"B2")、需要進(jìn)行"工序1""L1")可自由選擇并列舉在訂單中。此例如此制作了3種工作方式。

這種方法可以自由進(jìn)行組合(上例中有數(shù)十個(gè)組合方式)但同時(shí)也存在

*???????????????? 為了表現(xiàn)組合不得不逐個(gè)列舉煩雜

*???????????????? 實(shí)際上不允許的組合也沒有排除

這樣的不足點(diǎn)。

因此版本17可以對(duì)被許可的組合命名、在定義工序時(shí)對(duì)工序設(shè)置該名稱(如有必要可以列舉)。此例中對(duì)3個(gè)組合命名為"T1"、"T2"、"T3"、在其所需位置設(shè)置選擇器。方式"T2""T3"都需要"工序1"、將其列舉的選擇器字符串"T2|T3"設(shè)置在工序。這樣在訂單只需要單純指定組合方式的名稱,這樣也就不會(huì)誤指定不被允許的組合了。

自動(dòng)批次關(guān)聯(lián)方法強(qiáng)化

強(qiáng)化了自動(dòng)批次關(guān)聯(lián)方法(高級(jí)選項(xiàng)訂單自動(dòng)關(guān)聯(lián)功能)。

數(shù)量限制

可以用計(jì)算表達(dá)式指定批次間關(guān)聯(lián)數(shù)量的上限值了。例如、從數(shù)量上看供給方和需求方就算能夠以1:1進(jìn)行關(guān)聯(lián)時(shí)、卻特意以1:N進(jìn)行關(guān)聯(lián)并行制造從而可縮短提前期、這種需求可以將實(shí)現(xiàn)了。

動(dòng)態(tài)選擇對(duì)方批次

可以更靈活的選擇關(guān)聯(lián)方了。例如可以實(shí)現(xiàn)盡量找到與殘留數(shù)量一直的對(duì)方進(jìn)行關(guān)聯(lián)

對(duì)應(yīng)了安全庫(kù)存量水準(zhǔn)推移

以前也能夠?qū)榱藢?duì)應(yīng)將來(lái)有可能突然發(fā)生的需求將安全庫(kù)存量部分留下不進(jìn)行關(guān)聯(lián)、現(xiàn)在在安全庫(kù)存量根據(jù)時(shí)期不同發(fā)生變化的情況下也可以根據(jù)時(shí)期留下庫(kù)存了。

FLEXSCHE EDIF(數(shù)據(jù)接口)

FLEXSCHE EDIF是為了外部數(shù)據(jù)源(數(shù)據(jù)庫(kù)或CSV文件)和FLEXSCHE間靈活進(jìn)行數(shù)據(jù)交換的機(jī)制。同時(shí)具備可以自由定義布局的Excel報(bào)表輸出功能。

版本17強(qiáng)化了FLEXSCHE EDIF的功能。

對(duì)應(yīng)ADO.NET、擴(kuò)大高速化對(duì)象數(shù)據(jù)庫(kù)的范圍

對(duì)應(yīng)ADO.NET提供商從而使EDIF差異導(dǎo)出實(shí)現(xiàn)了最大提速60倍(Oracle 20萬(wàn)工作的差異導(dǎo)出時(shí))。另外EDIF增加了可進(jìn)行MySQL、DB2PostgreSQL這樣的ADO.NET提供商支持的數(shù)據(jù)庫(kù)了。

指定記錄導(dǎo)出的順序(排序)

可以通過(guò)計(jì)算表達(dá)式指定記錄的導(dǎo)出順序了。之前是FLEXSCHE內(nèi)部固定的記錄順序、現(xiàn)在可以按交貨期順序、數(shù)量順序等任意順序進(jìn)行輸出了。

添加表映射工作(更新)

限于注釋等一部分特有項(xiàng)、可以對(duì)工作進(jìn)行差異導(dǎo)入了。可以將外部數(shù)據(jù)的信息向現(xiàn)有工作匯總更新了。

Excel報(bào)表的工作表名可以通過(guò)表達(dá)式指定了

之前Excel報(bào)表的工作表名是固定的、現(xiàn)在可以動(dòng)態(tài)指定了。

添加入門向?qū)?/SPAN>

添加了EDIFExcel報(bào)表的入門向?qū)?。按照向?qū)Р僮骺梢泽w驗(yàn)EDIFExcel報(bào)表的功能。

計(jì)算表達(dá)式相關(guān)

帶名稱參數(shù)

調(diào)用函數(shù)時(shí)的參數(shù)、不按照原來(lái)的位置順序、能以參數(shù)名和值的組合進(jìn)行指定了。特別是在函數(shù)中有多個(gè)可省略參數(shù)時(shí)便于使用。

之前的記述方法:

 .NeighborOperations( LinkType.In, , , true )

新的記述方法:

 .NeighborOperations( LinkType.In, overConnection:true )

解決背包問題的函數(shù)

可以使用解決組合問題的其中一個(gè)背包問題的函數(shù)List.SolveKnapsack了。例如在自動(dòng)批次關(guān)聯(lián)方法中使用時(shí)、不能用多個(gè)供給批次進(jìn)行關(guān)聯(lián)時(shí)可以選擇盡量減少浪費(fèi)的組合。

 {600,300,150,220,450,500}.SolveKnapsack(1000)

 ? 結(jié)果=> {600,150,220}

程序相關(guān)(面向開發(fā)人員)

可以通過(guò)Add-in更新或關(guān)閉FSF非模態(tài)窗體

FLEXSCHE Scripting Form能夠通過(guò)僅僅記述腳本(JavaScript/VBScript)就可以輕松制作窗體(對(duì)話框、面板、視圖)。但是之前關(guān)閉面板或視圖或更新顯示內(nèi)容等契機(jī)、只能通過(guò)對(duì)面板或視圖直接進(jìn)行鼠標(biāo)操作時(shí)才能獲取。

版本17在窗體之外的Add-in也可以進(jìn)行操作了,從而大幅度擴(kuò)展了其活用范圍。

從結(jié)構(gòu)化記述方法生成調(diào)用外部方法的腳本

條件分歧和循環(huán)反復(fù)等、復(fù)雜的管理結(jié)構(gòu)在排程規(guī)則中記述可以通過(guò)結(jié)構(gòu)化記述方法通過(guò)對(duì)話框方式進(jìn)行進(jìn)行處理流程的設(shè)置。規(guī)模小的時(shí)候非常方便,但大規(guī)模的情況下對(duì)于習(xí)慣了編程的開發(fā)人員更傾向于使用文本編輯器進(jìn)行編碼。特別是制作需要驗(yàn)證的規(guī)則時(shí)使用腳本可能更為高效。但是將現(xiàn)有的結(jié)構(gòu)化記述方法定義以腳本(外部方法)代碼方式從零開始編寫比較麻煩。

所以版本17可以自動(dòng)生成與現(xiàn)有結(jié)構(gòu)化記述方法對(duì)等的JavaScript代碼模板添加了能調(diào)用它的新的外部方法調(diào)用方法。雖然不是直接生成可動(dòng)作的代碼、但也可以大幅度縮短變換作業(yè)、從而實(shí)現(xiàn)添加簡(jiǎn)單的處理就可驅(qū)動(dòng)了。

// External method

// Class name : @optimize

// Entry name : optimize

// 此模板代碼我法直接執(zhí)行。請(qǐng)恰當(dāng)替換代碼中出現(xiàn)的計(jì)算表達(dá)式和變量。

// ·代入文的左邊值無(wú)法從takt表達(dá)式變換為JavaScript的計(jì)算表達(dá)式時(shí)、

//  請(qǐng)使用SDSpace.Calculate()方式進(jìn)行替換。

//  在計(jì)算表達(dá)式中參照變量時(shí)、用CreateTypedExpression制作ISDExpression

//  例、可以用ISDExpression.AddVariable()賦值。

// ·在管理結(jié)構(gòu)內(nèi)使用相同表達(dá)式反復(fù)評(píng)價(jià)時(shí)、活用ISDExpression

//  可以節(jié)省無(wú)用的表達(dá)式解析處理。

// ·從排程方法參照結(jié)構(gòu)化記述方法內(nèi)聲明的變量時(shí)

//  作為方法的參數(shù)聲明、請(qǐng)改寫為用IGPExecutableEntity.ParameterValue()

//  明確賦值。

// ·改寫代碼后、運(yùn)行[工具]-[外界程序重新登記]后外部方法即可使用

function _optimize( gpManager, settings )

{

/*?

? // select target, record list as 'opers' / 對(duì)象標(biāo)記

? var method_00 = gpManager.CreateExecutableEntity( Script.Null,

??? 'scheduling-method', '4FFFD14593C84439A4D62E5DB227F36E' );

? // clear flag 'operToMove' for opers / 對(duì)象標(biāo)記

? var method_01 = gpManager.CreateExecutableEntity( Script.Null,

??? 'scheduling-method', 'A8D3706703CE4E8EB6AC0C0A8375B484' );

? // record let, dt on NumSpec / 屬性設(shè)置

? var method_02 = gpManager.CreateExecutableEntity( Script.Null,

??? 'scheduling-method', '634157C095E24B1BB93F689F84C31BE6' );

? // RecordAsBest0-0(Unassign) and unassign pendings / 解除工作分派

? var method_03 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? 'B2527E9FCBD043A1A42219C034CD78C9' );

? // calc LST (1) and record 'lst' and 'mwtH' for each resource / 工作主導(dǎo)調(diào)度

? var method_04 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '98D62C9A03144FA492FEB6C0C570B700' );

? // calc LST (2) / 解除工作分派

? var method_05 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '9D217769F85245EEAE162106294A9E0C' );

? // RecordAsBest0-1(Reassign) / 工作主導(dǎo)調(diào)度

? var method_06 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? 'E5124B4CBBF34A25A012F999664BF18D' );

? // 解除工作分派

? var method_07 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '15629FBD5DEF4A2290111B8E61B8C0BA' );

? // move operToMove to resToMove at timeToMove / 工作主導(dǎo)調(diào)度

? var method_08 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '9E8CD555763143958204A9071AFFA958' );

? // relocate resToMove / 正向重新分派

? var method_09 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '701D79C8FD4C4B1E929C712B13589D57' );

? // record dt on NumSpec for opers on resToMove / 屬性設(shè)置

? var method_10 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '1FAA32D06BA044E59D913B681ED77490' );

? // record as tabu / 屬性設(shè)置

? var method_11 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '948A309CBBF648A59E8C2BBA583C4584' );

? // Record As Best / 正向重新分派

? var method_12 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? 'D2120074768E4DFDA3323B42151E209A' );

? // (debug) record evalBest on Project.Property / 屬性設(shè)置

? var method_13 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? '55B91F351A27429C834E15DD2A5C59F4' );

? // (debug) record eval on Project.Property / 屬性設(shè)置

? var method_14 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? 'CDDADFCCE3054BA588F9E8171CDD1674' );

? // clear tabu / 屬性設(shè)置

? var method_15 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',

??? 'F739DD31ACAF4D12B952438EC9CDEEC2' );

?【中略】

? var cMetaRepeat;

? var cRepeat;

? var debug;

? var evalBest;

? var opersTabu;

? var ress;

? method_00.Execute(); // select target, record list as 'opers'

? cMetaRepeat = 3;

? cRepeat = 500;

? debug = true;

? if( $debug )

??? method_01.Execute(); // clear flag 'operToMove' for opers

? method_02.Execute(); // record let, dt on NumSpec

? ress = $opers.Union([.AssignedResource]);

? evalBest = $opers._Eval01 + $ress.Sum([$opers._EvalForRes($_object)]);

? if( $evalBest > 0 )

? {

??? var iMetaRepeat;

??? var iRepeat;

??? method_03.Execute(); // RecordAsBest0-0(Unassign) and unassign pendings

??? method_04.Execute(); // calc LST (1) and record 'lst' and 'mwtH' for each resource

??? method_05.Execute(); // calc LST (2)

??? method_06.Execute(); // RecordAsBest0-1(Reassign)

??? iMetaRepeat = 0;

??? while( $iMetaRepeat < $cMetaRepeat and $evalBest > 0 )

??? {

????? if( true )

????? {

??????? var cRes;

??????? var eval;

??????? var iRes;

??????? cRes = $ress.Count;

??????? iRes = 0;

??????? while( $iRes < $cRes )

??????? {

????????? var opersOnRes;

????????? var resToMove;

????????? resToMove = $ress.At($iRes);

????????? opersOnRes = $resToMove.AssignedOperations.Select([.Flag('target')]);

????????? while( true )

????????? {

??????????? var operToMove;

??????????? var timeToMove;

??????????? operToMove = $opersOnRes.Select([not .Flag('tabu')

????????????? and ._dEval3_ToJoinLeft <= 0]).MinAt([.ManufactureStartTime]);

??????????? if( not $operToMove.DoesExist )

????????????? break;

??????????? timeToMove = $operToMove._TimeToJoin($resToMove);

??????????? if( $timeToMove.IsNormal and $timeToMove < $operToMove.StartTime )

??????????? {

????????????? method_07.Execute(); // 解除工作分派

????????????? method_08.Execute(); // move operToMove to resToMove at timeToMove

????????????? method_09.Execute(); // relocate resToMove

????????????? method_10.Execute(); // record dt on NumSpec for opers on resToMove

??????????? }

??????????? if( true )

????????????? method_11.Execute(); // record as tabu

????????? }

?????? ???iRes = $iRes + 1;

??????? }

??????? eval = $opers._Eval01 + $ress.Sum([$opers._EvalForRes($_object)]);

??????? if( $eval < $evalBest )

??????? {

????????? method_12.Execute(); // Record As Best

????????? evalBest = $eval;

????????? if( $debug )

??????? ????method_13.Execute(); // (debug) record evalBest on Project.Property

??????? }

??????? if( $debug )

????????? method_14.Execute(); // (debug) record eval on Project.Property

????? }

????? if( true )

????? {

??????? method_15.Execute(); // clear tabu

?? ?????opersTabu = OperationList.Empty;

????? }

????? iRepeat = 0;

????? while( $iRepeat < $cRepeat and $evalBest > 0 )

????? {

??????? var eval;

??????? var operToImprove;

??????? var operToMove;

??????? operToImprove = $opers.Select([.NumSpec('dt')<0 and not .Flag('tabu')])

???????? .MinAt([.ManufactureStartTime]);

??????? if( not $operToImprove.DoesExist )

????????? break;

?【后略】

對(duì)表格窗口的子鍵添加EditingEdited

對(duì)表格窗口的本體部分的Add-in的子鍵添加了EditingEdited??梢栽诰庉嬜侄吻昂筇砑?/SPAN>Add-in了。 例如編輯前通過(guò)Add-in進(jìn)行禁用字符或格式的檢驗(yàn)、對(duì)值進(jìn)行變換或接受輸入、或取消輸入。 也可以在編輯后通過(guò)Add-in對(duì)受到編輯所帶來(lái)的影響的各種表格或視圖進(jìn)行更新。

?

返回

展開