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

FLEXSCHE版本17的新功能

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

整體提速

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

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

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

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

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

用戶界面

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

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

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

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

里程碑的強化

自定義符號

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

在訂單甘特圖表顯示

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

高速繪圖和從訂單指定方式的擴展

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

看板行的強化

豐富了可用看板行。

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

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

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

僅在多縱列時可用。

FLEXSCHE Editor的功能擴展

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

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

從表格窗口參照快照

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

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

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

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

MPS編輯器的用戶定義行

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

排程和建模

適應(yīng)時間制約

對于從定義在工序間的緩沖吸收工作延遲能夠簡單建模了

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

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

原材料候選

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

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

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

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

對被選方指定多個選擇器

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

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

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

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

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

這樣的不足點。

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

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

強化了自動批次關(guān)聯(lián)方法(高級選項訂單自動關(guān)聯(lián)功能)。

數(shù)量限制

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

動態(tài)選擇對方批次

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

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

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

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

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

版本17強化了FLEXSCHE EDIF的功能。

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

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

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

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

添加表映射工作(更新)

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

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

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

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

添加了EDIF、Excel報表的入門向?qū)А0凑障驅(qū)Р僮骺梢泽w驗EDIFExcel報表的功能。

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

帶名稱參數(shù)

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

之前的記述方法:

 .NeighborOperations( LinkType.In, , , true )

新的記述方法:

 .NeighborOperations( LinkType.In, overConnection:true )

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

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

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

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

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

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

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

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

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

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

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

// External method

// Class name : @optimize

// Entry name : optimize

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

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

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

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

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

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

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

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

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

//  明確賦值。

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

function _optimize( gpManager, settings )

{

/*?

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

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

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

? // clear flag 'operToMove' for opers / 對象標(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;

?【后略】

對表格窗口的子鍵添加EditingEdited

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

?

返回

展開