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萬工作”的重排程處理的平均時間從版本16時4.0秒縮短為版本17的2.8秒(30%提速)。另外、其他的更大的數(shù)據(jù)從62秒縮短到53秒(15%提速)。排程以外的處理也進(jìn)行了提速。
※上述測試值以CPU為Intel Core i7-6700K的PC進(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)行MySQL、DB2、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驗EDIF和Excel報表的功能。
計算表達(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;
?【后略】
對表格窗口的子鍵添加Editing和Edited
對表格窗口的本體部分的Add-in的子鍵添加了Editing和Edited??梢栽诰庉嬜侄吻昂筇砑?/SPAN>Add-in了。 例如編輯前通過Add-in進(jìn)行禁用字符或格式的檢驗、對值進(jìn)行變換或接受輸入、或取消輸入。 也可以在編輯后通過Add-in對受到編輯所帶來的影響的各種表格或視圖進(jìn)行更新。
?