Example #1
0
        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));
        }
Example #2
0
        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;
            }
        }
Example #7
0
        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;
        }
Example #10
0
 public abstract List <FilledBaseline> Generate(Scenario scenario, Baseline baseline, ProductionParameters prodParams);
Example #11
0
        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;
            }
        }