public List <string> CheckValidRoutes(IEnumerable <JobPlan> jobs) { var logMessages = new List <string>(); MazakAllData mazakData; if (!OpenDatabaseKitDB.MazakTransactionLock.WaitOne(TimeSpan.FromMinutes(2), true)) { throw new Exception("Unable to obtain mazak database lock"); } try { mazakData = readDatabase.LoadAllData(); } finally { OpenDatabaseKitDB.MazakTransactionLock.ReleaseMutex(); } try { Log.Debug("Check valid routing info"); //The reason we create the clsPalletPartMapping is to see if it throws any exceptions. We therefore //need to ignore the warning that palletPartMap is not used. #pragma warning disable 168, 219 var mazakJobs = ConvertJobsToMazakParts.JobsToMazak( jobs, 1, mazakData, new HashSet <string>(), writeDb.MazakType, CheckPalletsUsedOnce, fmsSettings, logMessages); #pragma warning restore 168, 219 } catch (Exception ex) { if (ex.Message.StartsWith("Invalid pallet->part mapping")) { logMessages.Add(ex.Message); } else { throw; } } return(logMessages); }
public void ErrorsOnMissingProgram() { //Test when processes have different pallet lists var job1 = new JobPlan("Job1", 2, new int[] { 2, 2 }); job1.PartName = "Part1"; job1.SetPathGroup(1, 1, 1); job1.SetPathGroup(1, 2, 2); job1.SetPathGroup(2, 1, 1); job1.SetPathGroup(2, 2, 2); job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(2, 1, "40"); job1.AddProcessOnPallet(2, 2, "100"); AddBasicStopsWithProg(job1); var dset = CreateReadSet(); var log = new List <string>(); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); log.Should().BeEquivalentTo(new[] { // one for each process "Part Part1 program 1234 does not exist in the cell controller.", "Part Part1 program 1234 does not exist in the cell controller." }); }
public void ErrorsOnLongFixture() { //Test when processes have different pallet lists var job1 = new JobPlan("Job1", 1, new int[] { 1 }); job1.PartName = "Part1"; job1.SetPathGroup(1, 1, 1); job1.AddProcessOnPallet(1, 1, "4"); job1.SetFixtureFace(1, 1, "aaaaaaaaaaaaaaaaa", 1); AddBasicStopsWithProg(job1); var dset = CreateReadSet(); CreateProgram(dset, "1234"); var log = new List <string>(); Action act = () => ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); act .Should() .Throw <BadRequestException>() .WithMessage( "Fixture aaaaaaaaaaaaaaaaa:4 is too long to fit in the mazak databases" ); }
private void AddFixturesPalletsParts(NewJobs newJ) { var mazakData = readDatabase.LoadAllData(); //first allocate a UID to use for this download int UID = 0; while (UID < int.MaxValue) { //check schedule rows for UID foreach (var schRow in mazakData.Schedules) { if (MazakPart.ParseUID(schRow.PartName) == UID) { goto found; } } //check fixture rows for UID foreach (var fixRow in mazakData.Fixtures) { if (MazakPart.ParseUID(fixRow.FixtureName) == UID) { goto found; } } break; found: UID += 1; } if (UID == int.MaxValue) { throw new Exception("Unable to find unused UID"); } Log.Debug("Creating new schedule with UID {uid}", UID); var(transSet, savedParts) = BuildMazakSchedules.RemoveCompletedAndDecrementSchedules( mazakData, UseStartingOffsetForDueDate ); if (transSet.Schedules.Any()) { writeDb.Save(transSet, "Update schedules"); } Log.Debug("Saved Parts: {parts}", savedParts); var jobErrs = new List <string>(); var mazakJobs = ConvertJobsToMazakParts.JobsToMazak( newJ.Jobs, UID, mazakData, savedParts, writeDb.MazakType, CheckPalletsUsedOnce, fmsSettings, LookupProgram, jobErrs); if (jobErrs.Any()) { throw new BlackMaple.MachineFramework.BadRequestException( string.Join(Environment.NewLine, jobErrs) ); } //delete everything transSet = mazakJobs.DeleteOldPartPalletRows(); if (transSet.Parts.Any() || transSet.Pallets.Any()) { try { writeDb.Save(transSet, "Delete Parts Pallets"); } catch (ErrorModifyingParts e) { foreach (var partName in e.PartNames) { if (readDatabase.CheckPartExists(partName)) { throw new Exception("Mazak returned an error when attempting to delete part " + partName); } } } } //have to delete fixtures after schedule, parts, and pallets are already deleted //also, add new fixtures transSet = mazakJobs.CreateDeleteFixtureAndProgramDatabaseRows(jobDB.LoadProgramContent, ProgramDirectory); writeDb.Save(transSet, "Fixtures"); //now save the pallets and parts transSet = mazakJobs.CreatePartPalletDatabaseRows(); writeDb.Save(transSet, "Add Parts"); }
public void DeleteUnusedPartsPals() { //Test when processes have different pallet lists var job1 = new JobPlan("Job1", 2, new int[] { 2, 2 }); job1.PartName = "Part1"; job1.SetPathGroup(1, 1, 1); job1.SetPathGroup(1, 2, 2); job1.SetPathGroup(2, 1, 1); job1.SetPathGroup(2, 2, 2); job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); job1.AddProcessOnPallet(2, 1, "40"); job1.AddProcessOnPallet(2, 1, "50"); job1.AddProcessOnPallet(2, 2, "100"); job1.AddProcessOnPallet(2, 2, "110"); job1.AddProcessOnPallet(2, 2, "120"); AddBasicStopsWithProg(job1); var dset = CreateReadSet(); CreateFixture(dset, "aaaa:1"); CreatePart(dset, "uniq1", "part1:1:1", 1, "aaaa"); CreatePart(dset, "uniq2", "part2:1:1", 1, "Test"); CreatePallet(dset, 5, "aaaa", 1); // this should be deleted since part1:1:1 is being deleted CreatePallet(dset, 6, "Test", 1); // this should be kept because part2:1:1 is being kept CreateProgram(dset, "1234"); var log = new List <string>(); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1 }, 3, dset, new HashSet <string>() { "part2:1:1" }, MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } var del = pMap.DeleteOldPartPalletRows(); del.Pallets.Should().BeEquivalentTo(new[] { new MazakPalletRow() { PalletNumber = 5, Fixture = "aaaa:1", Command = MazakWriteCommand.Delete } }); dset.TestParts[0].Command = MazakWriteCommand.Delete; dset.TestParts[0].TotalProcess = dset.TestParts[0].Processes.Count; dset.TestParts[0].Processes.Clear(); del.Parts.Should().BeEquivalentTo(new[] { dset.TestParts[0] }); del.Fixtures.Should().BeEmpty(); del.Schedules.Should().BeEmpty(); }
public void ManualFixtureAssignment() { var job1 = new JobPlan("Job1", 2, new int[] { 2, 2 }); job1.PartName = "Part1"; job1.SetPathGroup(1, 1, 1); job1.SetPathGroup(1, 2, 2); job1.SetPathGroup(2, 1, 1); job1.SetPathGroup(2, 2, 2); //proc 1 and proc 2 on same pallets job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); job1.AddProcessOnPallet(2, 1, "4"); job1.AddProcessOnPallet(2, 1, "5"); job1.AddProcessOnPallet(2, 2, "10"); job1.AddProcessOnPallet(2, 2, "11"); job1.AddProcessOnPallet(2, 2, "12"); //each process uses different faces job1.SetFixtureFace(1, 1, "fixAA", 1); job1.SetFixtureFace(2, 1, "fixAA", 2); job1.SetFixtureFace(1, 2, "fixBB", 1); job1.SetFixtureFace(2, 2, "fixBB", 2); AddBasicStopsWithProg(job1); var job2 = new JobPlan("Job2", 2, new int[] { 2, 2 }); job2.PartName = "Part2"; //make path groups twisted job2.SetPathGroup(1, 1, 1); job2.SetPathGroup(1, 2, 2); job2.SetPathGroup(2, 1, 2); job2.SetPathGroup(2, 2, 1); //process groups on the same pallet. job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); job2.AddProcessOnPallet(2, 2, "4"); job2.AddProcessOnPallet(2, 2, "5"); job2.AddProcessOnPallet(2, 1, "10"); job2.AddProcessOnPallet(2, 1, "11"); job2.AddProcessOnPallet(2, 1, "12"); //each process uses different faces job2.SetFixtureFace(1, 1, "fixAA", 1); job2.SetFixtureFace(2, 2, "fixAA", 2); job2.SetFixtureFace(1, 2, "fixBB", 1); job2.SetFixtureFace(2, 1, "fixBB", 2); AddBasicStopsWithProg(job2); var job3 = new JobPlan("Job3", 1, new int[] { 2 }); job3.PartName = "Part3"; job3.AddProcessOnPallet(1, 1, "20"); job3.AddProcessOnPallet(1, 1, "21"); job3.AddProcessOnPallet(1, 2, "30"); job3.AddProcessOnPallet(1, 2, "31"); //job3 uses separate fixture than job 4, but same fixture and face for both procs job3.SetFixtureFace(1, 1, "fix3", 1); job3.SetFixtureFace(1, 2, "fix3", 1); AddBasicStopsWithProg(job3); var job4 = new JobPlan("Job4", 1, new int[] { 2 }); job4.PartName = "Part4"; job4.AddProcessOnPallet(1, 1, "20"); job4.AddProcessOnPallet(1, 1, "21"); job4.AddProcessOnPallet(1, 2, "30"); job4.AddProcessOnPallet(1, 2, "31"); //job3 uses separate fixture than job 4 job4.SetFixtureFace(1, 1, "fix4", 1); job4.SetFixtureFace(1, 2, "fix4", 1); AddBasicStopsWithProg(job4); var log = new List <string>(); var dset = CreateReadSet(); CreateProgram(dset, "1234"); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2, job3, job4 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:fixAA:4:1", "F:3:fixAA:4:2", "F:3:fixBB:10:1", "F:3:fixBB:10:2", "F:3:fix3:20:1", "F:3:fix3:30:1", "F:3:fix4:20:1", "F:3:fix4:30:1", }, new[] { "Test" }); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcessFromJob(trans, "Part1:3:1", 1, "F:3:fixAA:4:1"); CheckPartProcessFromJob(trans, "Part1:3:1", 2, "F:3:fixAA:4:2"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcessFromJob(trans, "Part1:3:2", 1, "F:3:fixBB:10:1"); CheckPartProcessFromJob(trans, "Part1:3:2", 2, "F:3:fixBB:10:2"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcessFromJob(trans, "Part2:3:1", 1, "F:3:fixAA:4:1"); CheckPartProcessFromJob(trans, "Part2:3:1", 2, "F:3:fixAA:4:2"); CheckPart(trans, "Part2:3:1", "Job2-Path1-2-0"); CheckPartProcessFromJob(trans, "Part2:3:2", 1, "F:3:fixBB:10:1"); CheckPartProcessFromJob(trans, "Part2:3:2", 2, "F:3:fixBB:10:2"); CheckPart(trans, "Part2:3:2", "Job2-Path2-1-0"); CheckPartProcessFromJob(trans, "Part3:3:1", 1, "F:3:fix3:20:1"); CheckPart(trans, "Part3:3:1", "Job3-Path1-0"); CheckPartProcessFromJob(trans, "Part3:3:2", 1, "F:3:fix3:30:1"); CheckPart(trans, "Part3:3:2", "Job3-Path2-0"); CheckPartProcessFromJob(trans, "Part4:3:1", 1, "F:3:fix4:20:1"); CheckPart(trans, "Part4:3:1", "Job4-Path1-0"); CheckPartProcessFromJob(trans, "Part4:3:2", 1, "F:3:fix4:30:1"); CheckPart(trans, "Part4:3:2", "Job4-Path2-0"); CheckPalletGroup(trans, 31, new[] { "F:3:fixAA:4:1", "F:3:fixAA:4:2" }, new int[] { 4, 5 }); CheckPalletGroup(trans, 32, new[] { "F:3:fixBB:10:1", "F:3:fixBB:10:2" }, new int[] { 10, 11, 12 }); CheckPalletGroup(trans, 33, new[] { "F:3:fix3:20:1" }, new int[] { 20, 21 }); CheckPalletGroup(trans, 34, new[] { "F:3:fix3:30:1" }, new int[] { 30, 31 }); CheckPalletGroup(trans, 35, new[] { "F:3:fix4:20:1" }, new int[] { 20, 21 }); CheckPalletGroup(trans, 36, new[] { "F:3:fix4:30:1" }, new int[] { 30, 31 }); AssertPartsPalletsDeleted(trans); }
public void DifferentPallets() { //Test when processes have different pallet lists var job1 = new JobPlan("Job1", 2, new int[] { 2, 2 }); job1.PartName = "Part1"; job1.SetPathGroup(1, 1, 1); job1.SetPathGroup(1, 2, 2); job1.SetPathGroup(2, 1, 1); job1.SetPathGroup(2, 2, 2); job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); job1.AddProcessOnPallet(2, 1, "40"); job1.AddProcessOnPallet(2, 1, "50"); job1.AddProcessOnPallet(2, 2, "100"); job1.AddProcessOnPallet(2, 2, "110"); job1.AddProcessOnPallet(2, 2, "120"); AddBasicStopsWithProg(job1); var job2 = new JobPlan("Job2", 2, new int[] { 2, 2 }); job2.PartName = "Part2"; //make path groups twisted job2.SetPathGroup(1, 1, 1); job2.SetPathGroup(1, 2, 2); job2.SetPathGroup(2, 1, 2); job2.SetPathGroup(2, 2, 1); //process groups on the same pallet. job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); job2.AddProcessOnPallet(2, 2, "40"); job2.AddProcessOnPallet(2, 2, "50"); job2.AddProcessOnPallet(2, 1, "100"); job2.AddProcessOnPallet(2, 1, "110"); job2.AddProcessOnPallet(2, 1, "120"); AddBasicStopsWithProg(job2); var job3 = new JobPlan("Job3", 2, new int[] { 2, 2 }); job3.PartName = "Part3"; job3.SetPathGroup(1, 1, 1); job3.SetPathGroup(1, 2, 2); job3.SetPathGroup(2, 1, 1); job3.SetPathGroup(2, 2, 2); //These do not all match above (some do, but not all) job3.AddProcessOnPallet(1, 1, "4"); job3.AddProcessOnPallet(1, 1, "5"); job3.AddProcessOnPallet(1, 2, "22"); job3.AddProcessOnPallet(1, 2, "23"); job3.AddProcessOnPallet(1, 2, "24"); job3.AddProcessOnPallet(2, 1, "30"); job3.AddProcessOnPallet(2, 1, "31"); job3.AddProcessOnPallet(2, 2, "100"); job3.AddProcessOnPallet(2, 2, "110"); job3.AddProcessOnPallet(2, 2, "120"); AddBasicStopsWithProg(job3); var log = new List <string>(); var dset = new MazakTestData(); CreateProgram(dset, "1234"); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2, job3 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:0:4:1", "F:3:1:40:2", "F:3:2:10:1", "F:3:3:100:2", "F:3:4:30:2", "F:3:5:22:1" }); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcessFromJob(trans, "Part1:3:1", 1, "F:3:0:4:1"); CheckPartProcessFromJob(trans, "Part1:3:1", 2, "F:3:1:40:2"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcessFromJob(trans, "Part1:3:2", 1, "F:3:2:10:1"); CheckPartProcessFromJob(trans, "Part1:3:2", 2, "F:3:3:100:2"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcessFromJob(trans, "Part2:3:1", 1, "F:3:0:4:1"); CheckPartProcessFromJob(trans, "Part2:3:1", 2, "F:3:1:40:2"); CheckPart(trans, "Part2:3:1", "Job2-Path1-2-0"); CheckPartProcessFromJob(trans, "Part2:3:2", 1, "F:3:2:10:1"); CheckPartProcessFromJob(trans, "Part2:3:2", 2, "F:3:3:100:2"); CheckPart(trans, "Part2:3:2", "Job2-Path2-1-0"); CheckPartProcessFromJob(trans, "Part3:3:1", 1, "F:3:0:4:1"); CheckPartProcessFromJob(trans, "Part3:3:1", 2, "F:3:4:30:2"); CheckPart(trans, "Part3:3:1", "Job3-Path1-1-0"); CheckPartProcessFromJob(trans, "Part3:3:2", 1, "F:3:5:22:1"); CheckPartProcessFromJob(trans, "Part3:3:2", 2, "F:3:3:100:2"); CheckPart(trans, "Part3:3:2", "Job3-Path2-2-0"); CheckSingleProcPalletGroup(trans, 31, "F:3:0:4:1", new int[] { 4, 5 }); CheckSingleProcPalletGroup(trans, 32, "F:3:1:40:2", new int[] { 40, 50 }); CheckSingleProcPalletGroup(trans, 33, "F:3:2:10:1", new int[] { 10, 11, 12 }); CheckSingleProcPalletGroup(trans, 34, "F:3:3:100:2", new int[] { 100, 110, 120 }); CheckSingleProcPalletGroup(trans, 35, "F:3:4:30:2", new int[] { 30, 31 }); CheckSingleProcPalletGroup(trans, 36, "F:3:5:22:1", new int[] { 22, 23, 24 }); AssertPartsPalletsDeleted(trans); }
public void BasicFromJob() { var job1 = new JobPlan("Job1", 2, new int[] { 2, 2 }); job1.PartName = "Part1"; job1.SetPathGroup(1, 1, 1); job1.SetPathGroup(1, 2, 2); job1.SetPathGroup(2, 1, 1); job1.SetPathGroup(2, 2, 2); //proc 1 and proc 2 on same pallets job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); job1.AddProcessOnPallet(2, 1, "4"); job1.AddProcessOnPallet(2, 1, "5"); job1.AddProcessOnPallet(2, 2, "10"); job1.AddProcessOnPallet(2, 2, "11"); job1.AddProcessOnPallet(2, 2, "12"); AddBasicStopsWithProg(job1); var job2 = new JobPlan("Job2", 2, new int[] { 2, 2 }); job2.PartName = "Part2"; //make path groups twisted job2.SetPathGroup(1, 1, 1); job2.SetPathGroup(1, 2, 2); job2.SetPathGroup(2, 1, 2); job2.SetPathGroup(2, 2, 1); //process groups on the same pallet. job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); job2.AddProcessOnPallet(2, 2, "4"); job2.AddProcessOnPallet(2, 2, "5"); job2.AddProcessOnPallet(2, 1, "10"); job2.AddProcessOnPallet(2, 1, "11"); job2.AddProcessOnPallet(2, 1, "12"); AddBasicStopsWithProg(job2); var job3 = new JobPlan("Job3", 1, new int[] { 2 }); job3.PartName = "Part3"; job3.AddProcessOnPallet(1, 1, "20"); job3.AddProcessOnPallet(1, 1, "21"); job3.AddProcessOnPallet(1, 2, "30"); job3.AddProcessOnPallet(1, 2, "31"); AddBasicStopsWithProg(job3); //make Job 4 a template var job4 = new JobPlan("Job4", 1, new int[] { 2 }); job4.PartName = "Part4"; job4.AddProcessOnPallet(1, 1, "20"); job4.AddProcessOnPallet(1, 1, "21"); job4.AddProcessOnPallet(1, 2, "30"); job4.AddProcessOnPallet(1, 2, "31"); var log = new List <string>(); var dset = CreateReadSet(); CreatePart(dset, "Job4", "Part4", 1, "Test"); CreateProgram(dset, "1234"); CreateFixture(dset, "unusedfixture"); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2, job3, job4 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:0:4:1", "F:3:0:4:2", "F:3:1:10:1", "F:3:1:10:2", "F:3:2:20:1", "F:3:3:30:1" }, new[] { "unusedfixture", "Test" } ); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcessFromJob(trans, "Part1:3:1", 1, "F:3:0:4:1"); CheckPartProcessFromJob(trans, "Part1:3:1", 2, "F:3:0:4:2"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcessFromJob(trans, "Part1:3:2", 1, "F:3:1:10:1"); CheckPartProcessFromJob(trans, "Part1:3:2", 2, "F:3:1:10:2"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcessFromJob(trans, "Part2:3:1", 1, "F:3:0:4:1"); CheckPartProcessFromJob(trans, "Part2:3:1", 2, "F:3:0:4:2"); CheckPart(trans, "Part2:3:1", "Job2-Path1-2-0"); CheckPartProcessFromJob(trans, "Part2:3:2", 1, "F:3:1:10:1"); CheckPartProcessFromJob(trans, "Part2:3:2", 2, "F:3:1:10:2"); CheckPart(trans, "Part2:3:2", "Job2-Path2-1-0"); CheckPartProcessFromJob(trans, "Part3:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part3:3:1", "Job3-Path1-0"); CheckPartProcessFromJob(trans, "Part3:3:2", 1, "F:3:3:30:1"); CheckPart(trans, "Part3:3:2", "Job3-Path2-0"); CheckPartProcess(trans, "Part4:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part4:3:1", "Job4-Path1-0"); CheckPartProcess(trans, "Part4:3:2", 1, "F:3:3:30:1"); CheckPart(trans, "Part4:3:2", "Job4-Path2-0"); CheckPalletGroup(trans, 31, "F:3:0:4", 2, new int[] { 4, 5 }); CheckPalletGroup(trans, 32, "F:3:1:10", 2, new int[] { 10, 11, 12 }); CheckPalletGroup(trans, 33, "F:3:2:20", 1, new int[] { 20, 21 }); CheckPalletGroup(trans, 34, "F:3:3:30", 1, new int[] { 30, 31 }); AssertPartsPalletsDeleted(trans); }
public void BasicFromTemplate() { //Test everything copied from the template // The JobPlan's have only 1 process but the template has 2 processes so // the resulting parts should have 2 processes var job1 = new JobPlan("Job1", 1, new int[] { 2 }); job1.PartName = "Part1"; job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); job1.AddLoadStation(1, 1, 1); job1.AddLoadStation(1, 1, 2); job1.AddLoadStation(1, 2, 5); job1.AddUnloadStation(1, 1, 4); job1.AddUnloadStation(1, 2, 3); var stop = new JobMachiningStop("machine"); stop.Stations.Add(1); job1.AddMachiningStop(1, 1, stop); stop = new JobMachiningStop("machine"); stop.Stations.Add(3); stop.Stations.Add(4); job1.AddMachiningStop(1, 2, stop); var job2 = new JobPlan("Job2", 1, new int[] { 2 }); job2.PartName = "Part2"; job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); var job3 = new JobPlan("Job3", 1, new int[] { 1 }); job3.PartName = "Part3"; job3.AddProcessOnPallet(1, 1, "20"); job3.AddProcessOnPallet(1, 1, "21"); var job4 = new JobPlan("Job4", 1, new int[] { 1 }); job4.PartName = "Part4"; job4.AddProcessOnPallet(1, 1, "20"); job4.AddProcessOnPallet(1, 1, "21"); var log = new List <string>(); var dset = CreateReadSet(); CreatePart(dset, "Job1", "Part1", 2, "Test"); CreatePart(dset, "Job2", "Part2", 2, "Test"); CreatePart(dset, "Job3", "Part3", 1, "Test"); CreatePart(dset, "Job4", "Part4", 1, "Test"); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2, job3, job4 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:0:4:1", "F:3:0:4:2", "F:3:1:10:1", "F:3:1:10:2", "F:3:2:20:1" }, new[] { "Test" }); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcess(trans, "Part1:3:1", 1, "F:3:0:4:1", "1200000000", "0004000000", "10000000"); CheckPartProcess(trans, "Part1:3:1", 2, "F:3:0:4:2", "1200000000", "0004000000", "10000000"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcess(trans, "Part1:3:2", 1, "F:3:1:10:1", "0000500000", "0030000000", "00340000"); CheckPartProcess(trans, "Part1:3:2", 2, "F:3:1:10:2", "0000500000", "0030000000", "00340000"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcess(trans, "Part2:3:1", 1, "F:3:0:4:1"); CheckPartProcess(trans, "Part2:3:1", 2, "F:3:0:4:2"); CheckPart(trans, "Part2:3:1", "Job2-Path1-1-0"); CheckPartProcess(trans, "Part2:3:2", 1, "F:3:1:10:1"); CheckPartProcess(trans, "Part2:3:2", 2, "F:3:1:10:2"); CheckPart(trans, "Part2:3:2", "Job2-Path2-2-0"); CheckPartProcess(trans, "Part3:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part3:3:1", "Job3-Path1-0"); CheckPartProcess(trans, "Part4:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part4:3:1", "Job4-Path1-0"); CheckPalletGroup(trans, 31, "F:3:0:4", 2, new int[] { 4, 5 }); CheckPalletGroup(trans, 32, "F:3:1:10", 2, new int[] { 10, 11, 12 }); CheckPalletGroup(trans, 33, "F:3:2:20", 1, new int[] { 20, 21 }); AssertPartsPalletsDeleted(trans); }
private void CheckNonOverlapping(bool checkPalletUsedOnce) { var job1 = new JobPlan("Job1", 1, new int[] { 2 }); job1.PartName = "Part1"; job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); var job2 = new JobPlan("Job2", 1, new int[] { 2 }); job2.PartName = "Part2"; job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 1, "6"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); var log = new List <string>(); var dset = CreateReadSet(); CreatePart(dset, "Job1", "Part1", 2, "Test"); CreatePart(dset, "Job2", "Part2", 2, "Test"); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: checkPalletUsedOnce, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:0:4:1", "F:3:0:4:2", "F:3:1:10:1", "F:3:1:10:2", "F:3:2:4:1", "F:3:2:4:2", }, new[] { "Test" }); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcess(trans, "Part1:3:1", 1, "F:3:0:4:1"); CheckPartProcess(trans, "Part1:3:1", 2, "F:3:0:4:2"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcess(trans, "Part1:3:2", 1, "F:3:1:10:1"); CheckPartProcess(trans, "Part1:3:2", 2, "F:3:1:10:2"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcess(trans, "Part2:3:1", 1, "F:3:2:4:1"); CheckPartProcess(trans, "Part2:3:1", 2, "F:3:2:4:2"); CheckPart(trans, "Part2:3:1", "Job2-Path1-1-0"); CheckPartProcess(trans, "Part2:3:2", 1, "F:3:1:10:1"); CheckPartProcess(trans, "Part2:3:2", 2, "F:3:1:10:2"); CheckPart(trans, "Part2:3:2", "Job2-Path2-2-0"); CheckPalletGroup(trans, 31, "F:3:0:4", 2, new int[] { 4, 5 }); CheckPalletGroup(trans, 32, "F:3:1:10", 2, new int[] { 10, 11, 12 }); CheckPalletGroup(trans, 33, "F:3:2:4", 2, new int[] { 4, 5, 6 }); AssertPartsPalletsDeleted(trans); }
public void MultiProcess() { //A test where Jobs have different number of processes but the same pallet list //again, mazak parts are created from template, not the jobplan var job1 = new JobPlan("Job1", 1, new int[] { 2 }); job1.PartName = "Part1"; job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); var job2 = new JobPlan("Job2", 1, new int[] { 2 }); job2.PartName = "Part2"; job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); var job3 = new JobPlan("Job3", 1, new int[] { 1 }); job3.PartName = "Part3"; job3.AddProcessOnPallet(1, 1, "20"); job3.AddProcessOnPallet(1, 1, "21"); var job4 = new JobPlan("Job4", 1, new int[] { 1 }); job4.PartName = "Part4"; job4.AddProcessOnPallet(1, 1, "20"); job4.AddProcessOnPallet(1, 1, "21"); var log = new List <string>(); var dset = CreateReadSet(); CreatePart(dset, "Job1", "Part1", 2, "Test"); CreatePart(dset, "Job2", "Part2", 3, "Test"); CreatePart(dset, "Job3", "Part3", 1, "Test"); CreatePart(dset, "Job4", "Part4", 1, "Test"); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2, job3, job4 }, 3, dset, new HashSet <string>(), MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:0:4:1", "F:3:0:4:2", "F:3:0:4:3", "F:3:1:10:1", "F:3:1:10:2", "F:3:1:10:3", "F:3:2:20:1" }, new[] { "Test" }); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcess(trans, "Part1:3:1", 1, "F:3:0:4:1"); CheckPartProcess(trans, "Part1:3:1", 2, "F:3:0:4:2"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcess(trans, "Part1:3:2", 1, "F:3:1:10:1"); CheckPartProcess(trans, "Part1:3:2", 2, "F:3:1:10:2"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcess(trans, "Part2:3:1", 1, "F:3:0:4:1"); CheckPartProcess(trans, "Part2:3:1", 2, "F:3:0:4:2"); CheckPartProcess(trans, "Part2:3:1", 3, "F:3:0:4:3"); CheckPart(trans, "Part2:3:1", "Job2-Path1-1-1-0"); CheckPartProcess(trans, "Part2:3:2", 1, "F:3:1:10:1"); CheckPartProcess(trans, "Part2:3:2", 2, "F:3:1:10:2"); CheckPartProcess(trans, "Part2:3:2", 3, "F:3:1:10:3"); CheckPart(trans, "Part2:3:2", "Job2-Path2-2-2-0"); CheckPartProcess(trans, "Part3:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part3:3:1", "Job3-Path1-0"); CheckPartProcess(trans, "Part4:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part4:3:1", "Job4-Path1-0"); CheckPalletGroup(trans, 31, "F:3:0:4", 3, new int[] { 4, 5 }); CheckPalletGroup(trans, 32, "F:3:1:10", 3, new int[] { 10, 11, 12 }); CheckPalletGroup(trans, 33, "F:3:2:20", 1, new int[] { 20, 21 }); AssertPartsPalletsDeleted(trans); }
public void UseExistingFixture() { //again, mazak parts are created from template, not the jobplan var job1 = new JobPlan("Job1", 1, new int[] { 2 }); job1.PartName = "Part1"; job1.AddProcessOnPallet(1, 1, "4"); job1.AddProcessOnPallet(1, 1, "5"); job1.AddProcessOnPallet(1, 2, "10"); job1.AddProcessOnPallet(1, 2, "11"); job1.AddProcessOnPallet(1, 2, "12"); var job2 = new JobPlan("Job2", 1, new int[] { 2 }); job2.PartName = "Part2"; job2.AddProcessOnPallet(1, 1, "4"); job2.AddProcessOnPallet(1, 1, "5"); job2.AddProcessOnPallet(1, 2, "10"); job2.AddProcessOnPallet(1, 2, "11"); job2.AddProcessOnPallet(1, 2, "12"); var job3 = new JobPlan("Job3", 1, new int[] { 1 }); job3.PartName = "Part3"; job3.AddProcessOnPallet(1, 1, "20"); job3.AddProcessOnPallet(1, 1, "21"); var job4 = new JobPlan("Job4", 1, new int[] { 1 }); job4.PartName = "Part4"; job4.AddProcessOnPallet(1, 1, "20"); job4.AddProcessOnPallet(1, 1, "21"); var log = new List <string>(); var dset = CreateReadSet(); CreatePart(dset, "Job1", "Part1", 2, "Test"); CreatePart(dset, "Job2", "Part2", 2, "Test"); CreatePart(dset, "Job3", "Part3", 1, "Test"); CreatePart(dset, "Job4", "Part4", 1, "Test"); //Create fixtures which match for Parts 1 and 2. var savedParts = new HashSet <string>(); CreateFixture(dset, "F:2:0:4:1"); CreateFixture(dset, "F:2:0:4:2"); CreateFixture(dset, "F:2:0:10:1"); CreateFixture(dset, "F:2:0:10:2"); CreatePart(dset, "Job1.0", "Part1:2:1", 2, "F:2:0:4"); savedParts.Add("Part1:2:1"); CreatePart(dset, "Job1.0", "Part1:2:2", 2, "F:2:0:10"); savedParts.Add("Part1:2:2"); CreatePallet(dset, 4, "F:2:0:4", 2); CreatePallet(dset, 5, "F:2:0:4", 2); CreatePallet(dset, 10, "F:2:0:10", 2); CreatePallet(dset, 11, "F:2:0:10", 2); CreatePallet(dset, 12, "F:2:0:10", 2); //Create several fixtures which almost but not quite match for parts 3 and 4. //group with an extra pallet CreateFixture(dset, "F:1:0:20:1"); CreatePart(dset, "Job3.0", "Part3:1:1", 1, "F:1:0:20"); savedParts.Add("Part3:1:1"); CreatePallet(dset, 20, "F:1:0:20", 1); CreatePallet(dset, 21, "F:1:0:20", 1); CreatePallet(dset, 22, "F:1:0:20", 1); //group with a missing pallet CreateFixture(dset, "F:7:0:20:1"); CreatePart(dset, "Job3.1", "Part3:7:1", 1, "F:7:0:20"); savedParts.Add("Part3:7:1"); CreatePallet(dset, 20, "F:7:0:20", 1); var pMap = ConvertJobsToMazakParts.JobsToMazak( new JobPlan[] { job1, job2, job3, job4 }, 3, dset, savedParts, MazakDbType.MazakVersionE, checkPalletsUsedOnce: false, fmsSettings: new FMSSettings(), errors: log ); if (log.Count > 0) { Assert.True(false, log[0]); } CheckNewFixtures(pMap, new string[] { "F:3:2:20:1" }, new[] { "Test" }); var trans = pMap.CreatePartPalletDatabaseRows(); CheckPartProcess(trans, "Part1:3:1", 1, "F:2:0:4:1"); CheckPartProcess(trans, "Part1:3:1", 2, "F:2:0:4:2"); CheckPart(trans, "Part1:3:1", "Job1-Path1-1-0"); CheckPartProcess(trans, "Part1:3:2", 1, "F:2:0:10:1"); CheckPartProcess(trans, "Part1:3:2", 2, "F:2:0:10:2"); CheckPart(trans, "Part1:3:2", "Job1-Path2-2-0"); CheckPartProcess(trans, "Part2:3:1", 1, "F:2:0:4:1"); CheckPartProcess(trans, "Part2:3:1", 2, "F:2:0:4:2"); CheckPart(trans, "Part2:3:1", "Job2-Path1-1-0"); CheckPartProcess(trans, "Part2:3:2", 1, "F:2:0:10:1"); CheckPartProcess(trans, "Part2:3:2", 2, "F:2:0:10:2"); CheckPart(trans, "Part2:3:2", "Job2-Path2-2-0"); CheckPartProcess(trans, "Part3:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part3:3:1", "Job3-Path1-0"); CheckPartProcess(trans, "Part4:3:1", 1, "F:3:2:20:1"); CheckPart(trans, "Part4:3:1", "Job4-Path1-0"); CheckPalletGroup(trans, 33, "F:3:2:20", 1, new int[] { 20, 21 }); AssertPartsPalletsDeleted(trans); }