public Tuple <int, int> testOverload(int[] schedule, int start, int end, int freeCostsTimeWindow, int scheduledHours) { var response = checkOverload(schedule, start, end, 0, scheduledHours); ProductionParameters parameters = new ProductionParameters(); if (response == true) { var innerResponseUp = true; var innerResponseDown = true; int startUp = start, startDown = start; int endUp = end, endDown = end; double costUp = double.MaxValue, costDown = double.MaxValue; int shift = 0; while (innerResponseDown == true || innerResponseUp == true) { shift += 1; innerResponseUp = checkOverload(schedule, start, end, shift, scheduledHours); innerResponseDown = checkOverload(schedule, start, end, -shift, scheduledHours); if (innerResponseUp == false) { startUp = start + shift; endUp = end + shift; costUp = parameters.WeeklyDelayInterest * (int)((endUp - end) / (24d * 7d)); } if (innerResponseDown == false) { startDown = start - shift; endDown = end - shift; if ((end - endDown) > freeCostsTimeWindow * 24d) { var aux = (end - endDown) - freeCostsTimeWindow; costDown = parameters.WeeklyAdvanceInterest * (int)(aux / (242d * 7d)); } } if (start > shift && end + shift < scheduledHours) { break; } } if (costDown > costUp) { start = startUp; end = endDown; } else { start = startDown; end = endDown; } } return(Tuple.Create(start, end)); }
public TagInformation GetTagInformationFormLocalDatabase(string sTagetUID) { string sQuery = "SELECT * FROM " + LOCAL_REGISTRATION_TABLE + " WHERE UID='" + sTagetUID + "'";; string[] asData = GetItemsFromDatabase(sLocalConnection, sQuery); if (asData != null) { TagInformation tagInfo = new TagInformation(); tagInfo.sWorkOrder = asData[1]; ProductionParameters proParam = GetProductionParamFromServerDatabase(tagInfo.sWorkOrder); if (proParam != null) { tagInfo.sUID = asData[0]; tagInfo.sWorkOrder = asData[1]; tagInfo.sBoxNumber = asData[2]; tagInfo.sQuantityPerBox = proParam.iQuantityPerBox.ToString(); tagInfo.sPartialBox = "0"; tagInfo.sMachineNumber = asData[3]; tagInfo.sTrimFrequency = asData[4]; tagInfo.sTrimValue = asData[5]; tagInfo.sF1 = asData[6]; tagInfo.sF2 = asData[7]; tagInfo.sF1_RST = asData[8]; tagInfo.sF2_RST = asData[9]; tagInfo.sTemperature = asData[10]; tagInfo.sDateTime = asData[11]; proParam = null; } asData = null; return(tagInfo); } return(null); }
public override List <FilledBaseline> Generate(Scenario scenario, Baseline baseline, ProductionParameters prodParams) { this.prodParams = prodParams; var projectsWithSmallBatchSizes = scenario.Projects.Where(p => p.Batches.Any(b => b.UsedWorkHours < 2)).ToArray(); var sizes = scenario.Projects.SelectMany(p => p.Batches.Select(b => b.UsedWorkHours / 24)).OrderBy(d => d).ToArray(); requiredProjects = scenario.Projects.Where(p => p is FixedProject || baseline.Projects.Contains(p)).OrderBy(p => p.DeliveryDate).ToArray(); potentialFillers = scenario.Projects.Except(requiredProjects).OrderBy(p => p.DeliveryDate).ToList(); earliestDate = scenario.Projects.Min(p => p.DeliveryDate); numberOfMonths = prodParams.PlanningHorizon + 1; FilledBaselines = new List <FilledBaseline>(); // calc the monly loads of all fixed project batches and the required opportunities var monthlyOverload = Enumerable.Range(0, numberOfMonths).Select(i => 0f).ToList(); AddToMonthlyOverload(monthlyOverload, requiredProjects); // group the projects by week // create schedules by combining: Fill(requiredProjects.ToArray(), monthlyOverload, 0, 1); // Assign the baseline to the FilledBaselines foreach (var fb in FilledBaselines) { fb.Baseline = baseline; } return(FilledBaselines); }
private List <List <List <Opportunity> > > ComputeFirstSelection(List <Project> projects, DateTime startDate) { ProductionParameters parameter = new ProductionParameters(); var firstSelection = new List <List <List <Opportunity> > >(); var numberMonths = getNumberMonths(projects); for (int currMont = 0; currMont < numberMonths; currMont++) { var lowBound = startDate.AddMonths(currMont); var highBound = startDate.AddMonths(currMont + 1); var monthDays = (float)(highBound - lowBound).TotalDays; var fixProj = projects.Where(p => p.DeliveryDate >= lowBound && p.DeliveryDate < highBound && p is FixedProject). Select(p => (FixedProject)p).ToArray(); var openOff = projects.Where(p => p.Revenue >= parameter.BaselineMinRevenue && p.Revenue <= parameter.BaselineMaxRevenue && p.DeliveryDate >= lowBound && p.DeliveryDate < highBound && p is Opportunity). Select(p => (Opportunity)p).ToArray(); if (openOff.Count() > 0) { firstSelection.Add(GetFirstCombination(fixProj, openOff, monthDays)); } } return(firstSelection); }
public ScheduleViewModel(string basePath) { DataContext = new ScenarioDataContext(basePath); PriorityOpportunities = new List <Opportunity>(); AllBaselines = new List <Baseline>(); SelectedBaselines = new List <Baseline>(); FilledBaselines = new List <FilledBaseline>(); Parameters = new ProductionParameters(); }
private void btnGetWorkOrder_Click(object sender, EventArgs e) { ProductionParameters prodParam = registration.GetProductionParamFromServerDatabase(txtWorkOrder.Text); if (prodParam != null) { txtArticleNumber.Text = prodParam.sArticleNumber; txtLabelName.Text = prodParam.sProductLabel; txtQuantityPerBox.Text = prodParam.iQuantityPerBox.ToString(); txtDate.Text = String.Format("{0:D2}/{1:D2}/{2:D2}", DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year % 100); prodParam = null; } }
private void btnWorkOrder_Click(object sender, EventArgs e) { FormWorkOrder formWorkOrder = new FormWorkOrder(iUserID, this.registration); formWorkOrder.ShowDialog(); if (formWorkOrder.WorkOrderSelected) { prodParam = formWorkOrder.prodParam; prodVar = formWorkOrder.prodVar; if (prodVar.iBoxNumber == 0) { switch (prodParam.iLabelLayout) { case 0: prodVar.iBoxNumber = iMachineNumber * BOX_NUMBER_MULTIPLIER + 1; //Fist box number initial break; case 1: prodVar.iBoxNumber = 1; break; } } switch (prodParam.iLabelLayout) { case 0: labelBoxNumber.Text = String.Format("{0}", prodVar.iBoxNumber); break; case 1: labelBoxNumber.Text = String.Format("{0:D5}", prodVar.iBoxNumber); break; } if (prodParam.iPowerLevel < 25) { prodParam.iPowerLevel = 25; } labelArticleNumber.Text = prodParam.sArticleNumber; labelWorkOrder.Text = prodParam.iWorkOrder.ToString(); labelMachineNumber.Text = String.Format("{0}", iMachineNumber); labelProductLabel.Text = prodParam.sProductLabel; labelWorkOrderTarget.Text = prodParam.iWorkOrderTarget.ToString(); labelQuantityWorked.Text = prodVar.iQuantityWorked.ToString(); labelQuantityPerBox.Text = prodParam.iQuantityPerBox.ToString(); labelCustomerName.Text = prodParam.sCustormerName; labelPowerLevel.Text = prodParam.iPowerLevel.ToString(); labelTrimmingFrequency.Text = String.Format("{0}.{1}", prodParam.iTrimmingFrequency / 1000, prodParam.iTrimmingFrequency % 1000); labelGood.Text = prodVar.iQuantityInBox.ToString(); labelTagType.Text = Registration.ParseTagTypeToString(prodParam.iTagType); chkRegister.Checked = prodParam.bRegister; chkTest.Checked = prodParam.bUseTagMeter && prodParam.bTesting; chkProgram.Checked = prodParam.bUserTagProgrammer; chkLock.Checked = prodParam.iProgramOption == 1; chkTrim.Checked = prodParam.iProgramOption == 2 || (prodParam.iTagType == Registration.TAG_TYPE_HDX_PLUSE && prodParam.iTrimmingFrequency > 0); labelBeginningUID.Text = prodParam.sBeginningUID; labelEndingUID.Text = prodParam.sEndingUID; labelUID.Text = prodParam.sUID; ctrlSys.WorkOrderTarget = prodParam.iWorkOrderTarget; ctrlSys.QuantityPerBox = prodParam.iQuantityPerBox; ctrlSys.QuantityWorked = prodVar.iQuantityWorked; ctrlSys.PartInGoodBox = prodVar.iQuantityInBox; ctrlSys.EnRegister = prodParam.bRegister; ctrlSys.EnTagProgrammer = prodParam.bUserTagProgrammer; ctrlSys.EnTagMeter = prodParam.bUseTagMeter; ctrlSys.SktipTagMeter = !prodParam.bTesting; dataGridViewRegistration.Visible = chkRegister.Checked; dataGridViewTesting.Visible = !chkRegister.Checked; dataGridViewRegistration.Rows.Clear(); dataGridViewTesting.Rows.Clear(); if (chkRegister.Checked) { int iReject1 = registration.CountBadUIDinLocalDatabase(labelWorkOrder.Text); ctrlSys.PartInRejectBox[0] = iReject1; ctrlSys.PartInRejectBox[1] = 0; ctrlSys.PartInRejectBox[2] = 0; ctrlSys.PartInRejectBox[3] = 0; labelReject1.Text = iReject1.ToString(); labelReject2.Text = "0"; labelReject3.Text = "0"; labelReject4.Text = "0"; grpBoxMain.Text = "Registratoin data"; registration.RetrieveRegistrationDataFromLocalDatabase(dataGridViewRegistration, labelWorkOrder.Text, labelBoxNumber.Text); } else { int iReject1 = registration.CountReject1TestingTagInLocalDatabase(labelWorkOrder.Text); int iReject2 = registration.CountReject2TestingTagInLocalDatabase(labelWorkOrder.Text); int iReject3 = registration.CountReject3TestingTagInLocalDatabase(labelWorkOrder.Text); int iReject4 = registration.CountReject4TestingTagInLocalDatabase(labelWorkOrder.Text); ctrlSys.PartInRejectBox[0] = iReject1; ctrlSys.PartInRejectBox[1] = iReject2; ctrlSys.PartInRejectBox[2] = iReject3; ctrlSys.PartInRejectBox[3] = iReject4; labelReject1.Text = iReject1.ToString(); labelReject2.Text = iReject2.ToString(); labelReject3.Text = iReject3.ToString(); labelReject4.Text = iReject4.ToString(); grpBoxMain.Text = "Testing data"; registration.RetrieveTestingDataFromLocalDatabase(dataGridViewTesting, labelWorkOrder.Text, labelBoxNumber.Text); } if (chkTest.Checked) { bInitialTagMeter = false; btnStart.Enabled = false; this.Cursor = Cursors.WaitCursor; bgwInitTagMeter.RunWorkerAsync(); } else { btnStart.Enabled = true; } } }
public async Task<UnsignedParam> ReadParameter(UnsignedParam param) { if (param.ObisCode == VendorSpecificRegisterIds.MeasurementMode.AsLong()) { var pp = new ProductionParameters(this.baseMeterDevice); MeasurmentMode mm = await pp.GetMeasurementMode().ConfigureAwait(false); ulong mmNumber = 0; switch (mm) { case MeasurmentMode.MM1_ImportReverseLocking: mmNumber = 1; break; case MeasurmentMode.MM2_ImportExport: mmNumber = 2; break; case MeasurmentMode.MM3_ExportLocking: mmNumber = 3; break; case MeasurmentMode.MM4_Export: mmNumber = 4; break; default: throw new ArgumentOutOfRangeException(); } return new UnsignedParam() { ObisCode = param.ObisCode, Data = mmNumber }; } var obis = new ObisId((ulong)param.ObisCode); var result = await this.baseMeterDevice.ReadRegisterAsync(obis).ConfigureAwait(false); if (result == null) { throw new NullReferenceException(); } return new UnsignedParam() { ObisCode = param.ObisCode, Data = result.GetAsULong() }; }
private async Task<bool> Connect() { if (this.endpoint == null) { await this.communication.StartRs485(this.portName, this.baudRate, false).ConfigureAwait(false); this.logger.Info("Serial communication started..."); } else { await this.communication.StartEthMod(this.endpoint.Address.ToString(), (ushort) this.endpoint.Port).ConfigureAwait(false); this.logger.Info("Tcp communication started..."); } // wait for device discovered event to come... this.logger.Info("Waiting for meter to appear on bus..."); var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(this.cts.Token, timeoutCts.Token); while (this.baseMeterDevice == null) { await Task.Delay(600, linkedCts.Token).ConfigureAwait(false); if (timeoutCts.IsCancellationRequested) { throw new TimeoutException("Meter discovery timed out"); } if (linkedCts.IsCancellationRequested) { throw new TaskCanceledException(); } } this.logger.Info($"Meter {this.baseMeterDevice.Ident} found"); this.productionParameters = new ProductionParameters(this.baseMeterDevice); // connect to the meter if (!await this.baseMeterDevice.ConnectSmlAsync(this.cts.Token).ConfigureAwait(false)) { this.logger.Error("Connect to meter failed"); return false; } this.port.BaseMeterDevice = new BasemeterDevice() { ServerId = this.baseMeterDevice.ServerId }; this.logger.Info($"Meter {this.baseMeterDevice.Ident} connected"); return true; }
public abstract List <FilledBaseline> Generate(Scenario scenario, Baseline baseline, ProductionParameters prodParams);
private bool GetWorkOrderData(string sWorkOrder) { bool bSuccess = false; _prodParam = registration.GetProductionParamFromServerDatabase(sWorkOrder); if (_prodParam != null) { if (!_prodParam.bPartialBoxClosed) //&& Convert.ToInt32(asDataForProduction[3]) > Convert.ToInt32(asDataForProduction[4])) { if (_prodParam.bRegister) // Register UID { string sLastUID = FindLastUID(_prodParam.sBeginningUID, _prodParam.sEndingUID); if (sLastUID != null) { string sUID = FindNextUID(_prodParam.sBeginningUID, sLastUID); if (sUID != null) { int iTagInServer = registration.CountTagInServerDatabase(sWorkOrder); if (iTagInServer >= 0) { int iTagInBox = registration.CountTagInLocalDatabase(sWorkOrder); if (iTagInBox >= 0) { _prodVar.iQuantityWorked = iTagInServer + iTagInBox; if (IsUID_Enough(sWorkOrder, sUID, _prodParam.sEndingUID, _prodParam.iWorkOrderTarget - _prodVar.iQuantityWorked)) { int iBoxNumber; if (iTagInBox > 0) { iBoxNumber = registration.GetLastBoxNumberFromLocalDatabase(); } else { iBoxNumber = registration.GetLastBoxNumberFromServerDatabase(); if (iBoxNumber > 0) { iBoxNumber += 1; } } if (iBoxNumber >= 0) { _prodVar.iQuantityInBox = iTagInBox; _prodVar.iBoxNumber = iBoxNumber; _prodParam.sUID = sUID; bSuccess = true; } else { MessageBox.Show("Cannot get last box nuber form database.\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("Tag UID is not enough", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("Cannot check current box in local database.\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } } else { int iTagInBox = registration.CountTestingTagInLocalDatabase(sWorkOrder); if (iTagInBox >= 0) { int iBoxNumber; if (iTagInBox > 0) { iBoxNumber = registration.GetLastBoxNumberFromLocalDatabse(sWorkOrder); } else { iBoxNumber = registration.GetLastBoxNumberFromServerDatabase(sWorkOrder); if (iBoxNumber > 0) { iBoxNumber += 1; } } if (iBoxNumber >= 0) { int iTagInServer = registration.CountTestingTagInServerDatabase(sWorkOrder); if (iTagInServer >= 0) { _prodVar.iQuantityWorked = iTagInServer + iTagInBox; _prodVar.iQuantityInBox = iTagInBox; _prodVar.iBoxNumber = iBoxNumber; bSuccess = true; } } else { MessageBox.Show("Cannot get last box nuber form database.\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("Cannot check current box in local database.\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } else { MessageBox.Show(String.Format("Work order {0} closed.\nTarget {1} >= {2}.", sWorkOrder, _prodParam.iWorkOrderTarget, _prodVar.iQuantityWorked, "Stop", MessageBoxButtons.OK, MessageBoxIcon.Stop)); } } else if (registration.ErrorMessage != null) { MessageBox.Show("Cannot find workorder " + sWorkOrder + ".\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return(bSuccess); }
private void FormChangeUID_FormClosing(object sender, FormClosingEventArgs e) { timerDoWork.Enabled = false; tagInfo = null; prodParam = null; }
private void GetTagInformation() { switch (iStep) { case STEP_START: ClearInformation(); iDatabase = 0; bDone = false; sTargetUID = null; iStep = STEP101; break; case STEP101: labelMessage.Text = "Reading tag UID..."; iStep = STEP102; break; case STEP102: sHexUID1st = tagProgrammer.ReadHDX(); if (sHexUID1st != null) { sHexUID2nd = tagProgrammer.ReadHDX(); if (sHexUID1st == sHexUID2nd) { sTargetUID = Utility.ConvertUID_HexadecimalToDecimal(sHexUID1st); labelMessage.Text = "UID = " + sTargetUID; iStep = STEP103; } } else { labelMessage.Text = "Cannot read tag UID!"; iStep = STEP201; } break; case STEP103: tagInfo = registration.GetTagInformationFormServerDatabase(sTargetUID); if (tagInfo != null) { DisplayTagInformation(); iDatabase = SERVER_DTABASE; iStep = STEP104; } else { if (registration.ErrorMessage == null) { tagInfo = registration.GetTagInformationFormLocalDatabase(sTargetUID); if (tagInfo != null) { DisplayTagInformation(); iDatabase = LOCAL_DTABASE; iStep = STEP104; } else { if (registration.ErrorMessage == null) { MessageBox.Show("No tag information in database.", "No data", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("Cannot get tag information from server database.\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } iStep = STEP201; } } else { MessageBox.Show("Cannot get tag information from server database.\n" + registration.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); iStep = STEP201; } } break; case STEP104: prodParam = registration.GetProductionParamFromServerDatabase(txtWorkOrder.Text); if (prodParam != null) { iStep = STEP105; } else { iStep = STEP201; } break; case STEP105: DisplayWorkOrderAndArticleInformation(); try { if (Convert.ToInt32(txtBoxNumber.Text) > 0) { btnCancelTagUID.Enabled = true; } else { txtBoxNumber.BackColor = Color.Orange; } } catch (Exception e) { MessageBox.Show("Exception error\n" + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } iStep = STEP201; break; case STEP201: iFunction = 0; btnReadtTagUID.Enabled = true; bDone = true; break; } }