So, why does this set up work? Let’s look at the Employees first as that is the simple one.
The operation has 2 scheduling blocks, which means that the total operation time of 16 can be split into 2 8 hour blocks. Since we used a Capability for the Employees, the scheduling engine will review every Resource in the Capability and try to find 2 employees that are available at the same time so the operation can be done in 8 hours.
Now the Bays. First thing to note, you CANNOT look at the Job Scheduling Board or the Multi Resource Scheduling Board for the bays. Here is why:
If you look at the boards, it appears that the operation was scheduled on 2 bays! It is a false flag. In the system, it is only scheduled on bay4. To see this, you have to look at the ResourceTimeUsedSub table, this is where the load for Concurrent Capacity is held. Here is a BAQ I ran that shows this.
You can see that F10000082 is scheduled on Bay4 and F10000084 is scheduled on Bay3. But what are all those other columns and why are there 8 rows for each job?
Let’s start by explaining how the ResourceTimeUsedSub table works. If you remember from above, I set the Concurrent Capacity of the Resources to 8. When the engine is calculating load on a CC Resource, it adds together the CC on the job operation and once the sum of the CC goes over 1, it adds a row to RTUSub and considers 1 of X capacity to be filled. Since I made the CC on the Resource 8, there are 8 slots that need to be filled before the engine considers the Resource full. Your next question might be, why not just make the CC on the Resource 1. Well, the CC calculation is not that robust with decimals. I have tested it out using 1 as the Resource CC and you get unexpected results. You don’t have to use 8, but using a larger number makes it work better with less unintended consequences.
The AllocNum column is the scheduling block that the engine placed the load against. When you capture the individual Job Scheduling logs, you can see better what is happening. When you use a non-time constraint, the engine runs the same for the resource in regards to time, but it does not actually use the time for the load. Let’s look at an example.
Backward Scheduling - F10000082 0 10 20 - P time of 16.00. --- operationBackward
22:31:57 Backward Scheduling - Job F10000082 Asm 0 Opr 10 OpDtl 20 AllocationBlock - 1 For: Enddate - 4/25/2025 EndHour - 7 Endtime 1 Setup/Prod/Both P. tmpendtime 626647. --- OpDtlBkProduction
22:31:57 Processing Capability : Bays --- getResourceList
22:31:57 Processing Resource Bay1 --- processCapability
22:31:57 ***Scheduling resource Bay1 for 8.00 hours --- processResourceID
22:31:57 Making production calendar for Resource Bay1 from production calendar 90382. --- MakeConResCal
22:31:57 Backward Scheduling Bay1 for 8.00 hours on 4/25/2025 with a EndTime of 7 IP-ProcTime 7. --- processResourceID
22:31:57 Checking IP-ProcTime 54000 to be sure valid time - C --- GetNextGap
22:31:57 Checking IP-ProcTime 42480 to be sure valid time - C --- GetPrevGap
22:31:57 Finitely scheduling Bay1 FiniteHorizonDate 4/3/2026 ScheduleDate 4/25/2025 --- GetBackwardDateTime
22:31:57 Found 4/25/2025 as a valid working date IP-ProcTime = 25200 --- GetBackwardDateTime
22:31:57 Found 4/25/2025 as a valid working date --- GetBackwardDateTime
22:31:57 Scheduling resource Bay1 starting at time: 4/25/2025 7 (getBackwardDateTime) --- GetBackwardDateTime
22:31:57 Scheduling resource Bay1 for : ScheduleDate 4/25/2025 FirstProdHour 7 LastProdHour 7 (getBackwardDateTime) --- GetBackwardDateTime
22:31:57 Our Requested current Capacity is 8.00 Total Resource Capacity is 8.00 --- getBWConCapDateTime
22:31:57 Current Capacity is 8.00 requested capacity is 8.00 Total Resource Capacity is 8.00 --- getBWConCapDateTime
22:31:57 Looking to Schedule 8 Hours Ending on 4/25/2025 and an end hour of 7 (getPrevTotalAvailProdTime) --- GetPrevTotalAvailProdTime
22:31:57 Found that resource Bay1 has 8 working hours on 4/25/2025. --- GetPrevTotalAvailProdTime
22:31:57 Looking to Schedule 8 Hours Ending on 4/25/2025 and an end hour of 7 (getPrevTotalAvailProdTime) --- GetPrevTotalAvailProdTime
22:31:57 Total hours Found 0 on 4/25/2025 (getPrevTotalAvailProdTime) --- GetPrevTotalAvailProdTime
22:31:57 Found that resource Bay1 has 8 working hours on 4/24/2025. --- GetPrevTotalAvailProdTime
22:31:57 Looking to Schedule 8 Hours Ending on 4/24/2025 and an end hour of 7 (getPrevTotalAvailProdTime) --- GetPrevTotalAvailProdTime
22:31:57 Start times obtained: Start Date = 4/24/2025, Start Time = 7 --- getBWConCapDateTime
22:31:57 Scheduling Resource Bay1 for job F10000082 Operation 10 Priority 100 StartDate 4/24/2025 EndDate 4/25/2025. --- processResourceID
22:31:57 ***Done Scheduling Resource Bay1 for job F10000082 Operation 10 Priority 100 StartDate 4/24/2025 EndDate 4/25/2025 Move Date 4/25/2025. --- processResourceID
22:31:57 *First available time for Resource Bay1 is 4/24/2025 at 25200 (7) ending on 4/25/2025 at 7 for 8 hours. Move Date 4/25/2025 Move Hour 7. --- processResourceID
If you look through this, there are a couple of things to notice. First is the second line. See the Allocation Block - 1? That is the engine saying there are 2 SBs and I am trying to fill the first SB. You will also see that the engine is trying to schedule time. This is another false flag as it really is not, but it is helpful because that determines the StartTime in the BAQ above. The next thing to look at is the CC lines (15 & 16). It shows you what the Operation is requesting (8) and what the Total Resource has (8). Then it says, if I put this 8 on the Resource, this is the total CC that will be on the Resource and this request is 8 so can it fit on the total CC for the resource (8)? Here is an example of it being overloaded.
22:31:57 Our Requested current Capacity is 8.00 Total Resource Capacity is 8.00 --- getBWConCapDateTime
22:31:57 Current Capacity is 16.00 requested capacity is 8.00 Total Resource Capacity is 8.00 --- getBWConCapDateTime
22:31:57 ** Not enough capacity. Try again starting at time 4/23/2025 - 23. Time 1 --- getBWConCapDateTime
You can see that there is not enough capacity, so the engine moves on.
The other part to look at in the log is near the very end.
22:31:58 Rough cut scheduling F10000082 False. Job start date 4/24/2025 Rough cut date 4/3/2026. --- CommitJob
22:31:58 Create RTU for Job F10000082 Asmbl 0 Sequence 10 OpDtl 20 Whatif True. Resource Bay3 Start date: 4/24/2025, Start time: 54000, End Date: 4/24/2025, End time: 82800 --- CommitJob
22:31:58 about apply whatif load : False --- CommitJob
22:31:58 Rough cut scheduling F10000082 False. Job start date 4/24/2025 Rough cut date 4/3/2026. --- CommitJob
22:31:58 Create RTU for Job F10000082 Asmbl 0 Sequence 10 OpDtl 10 Whatif True. Resource Emp3 Start date: 4/24/2025, Start time: 54000, End Date: 4/24/2025, End time: 82800 --- CommitJob
22:31:58 about apply whatif load : False --- CommitJob
22:31:58 Rough cut scheduling F10000082 False. Job start date 4/24/2025 Rough cut date 4/3/2026. --- CommitJob
22:31:58 Create RTU for Job F10000082 Asmbl 0 Sequence 10 OpDtl 20 Whatif True. Resource Bay4 Start date: 4/24/2025, Start time: 54000, End Date: 4/24/2025, End time: 82800 --- CommitJob
22:31:58 about apply whatif load : False --- CommitJob
22:31:58 Rough cut scheduling F10000082 False. Job start date 4/24/2025 Rough cut date 4/3/2026. --- CommitJob
22:31:58 Create RTU for Job F10000082 Asmbl 0 Sequence 10 OpDtl 10 Whatif True. Resource Emp4 Start date: 4/24/2025, Start time: 54000, End Date: 4/24/2025, End time: 82800 --- CommitJob
This is where you see what was actually scheduled and also where the log is not really telling you the truth. You’ll see that 2 Bays and 2 Employees were scheduled. This is another false flag. You can see that Bay3 and Bay4 were both scheduled (which is why you see that on the board). It does not say it, but the first 2 resources scheduled is for SB 1 and the second 2 resources are for SB 2. That is why the AllocNum is 2 in my BAQ, because it was the number of the SB that the load was applied against. That is why Bay4 is the only bay resource scheduled against the job.
The ResourceNumber column can be thought of as the trays in my oven example earlier. This oven (bay) can hold 8 trays. Each ResourceNumber line is load being applied to that tray. You can also take the StartDate, EndDate, StartTime, and EndTime and compare that to the employee resources to see that the blocks line up.
Let’s look at the job with 4 SBs, remember the 4 represents 4 employees.
You can see that this only created 4 lines in RTUSub. This is because each SB consumes 4 of the resources SBs. Here is a clip from the log.
22:32:05 Our Requested current Capacity is 4.00 Total Resource Capacity is 8.00 --- getBWConCapDateTime
22:32:05 Current Capacity is 4.00 requested capacity is 4.00 Total Resource Capacity is 8.00 --- getBWConCapDateTime
Each SB appears to be consuming half of the CC, but it is actually consuming double the ResourceNumber. Which is why there are only 4 rows in the query. This is very confusing, but it works.
This is the reason why you need to create your own report/dashboard to track the bay resources. If you look at the boards/RTU table, that does not show reality. I have not created anything for this yet, but it would be very dependent on your individual set up.