我想通过编程使得两个并行工位同步进出MU
两个并行工位的容量都是2,但是物料源的出料速度不一样。
我希望可以使得较快物流线的并行工位处理完成后等待较慢物流线的并行工位处理完成同时经过出口。
我初步思考的是通过判断当前工位的MU数量来使得工位的暂停还是工作
这个方法被我设置在出口控件上,但是出现了一个问题
这个语句在判断的时候只进行了一次,当程序作出了对工位stopped的赋值了之后就不会再次对于这个条件进行判断。
所以这个工位就一直处于暂停的状态。
还有一个问题,这样的方法设置在出口控件上时会使得
当前工位已经处理完成时去判断另外一个工位MU数量是否为1,但是另外一个工位只有在数量为2的时候才会进行处理。
这样会导致在另外一个工位MU数量为2的时候刚开始处理,但当前工位的MU已经处理完成并经过出口。
我想求各位帮我想一下有什么办法可以使这个判断语句可以一直循环以及时间不同步的问题怎么解决。
// 定义两个并行工位的容量 int capacity1 = 2; int capacity2 = 2;
// 定义两个物料源的出料速度 int speed1 = 10; int speed2 = 5;
// 定义一个变量来记录两个并行工位的处理情况 int count1 = 0; int count2 = 0;
// 定义一个变量来记录两个并行工位的处理完成情况 bool isFinished1 = false; bool isFinished2 = false;
// 定义一个变量来记录两个并行工位的处理完成情况 bool isReadyToGo = false;
// 定义一个函数来检查两个并行工位的处理情况 void checkStatus(){ if(count1 == capacity1){ isFinished1 = true; } if(count2 == capacity2){ isFinished2 = true; } if(isFinished1 && isFinished2){ isReadyToGo = true; } }
// 定义一个函数来处理物料源1 void processSource1(){ while(count1 < capacity1){ count1++; checkStatus(); sleep(speed1); } }
// 定义一个函数来处理物料源2 void processSource2(){ while(count2 < capacity2){ count2++; checkStatus(); sleep(speed2); } }
// 定义一个函数来控制两个并行工位的同步进出 void syncProcess(){ while(!isReadyToGo){ processSource1(); processSource2(); } // 两个并行工位处理完成,可以经过出口 cout << "Both parallel stations are finished, ready to go!" << endl; }
针对你的问题,可以尝试以下思路:
- 使用Timer控件,定时检查两个并行工位的MU数量,以便实现同步进出MU。
- 在判断当前工位MU数量时,可以使用流程控制语句,例如if语句或while语句,以便在满足条件时执行相应的操作,比如暂停或继续工作。
- 为了解决时间不同步的问题,可以使用Delay控件,在处理完成后加入适当的延时,以便等待另一个工位的处理完成。
基于以上思路,你可以尝试以下步骤:
- 创建两个Timer控件,分别用于检查两个并行工位的MU数量。例如,将第一个Timer控件设置为每0.1秒检查一次第一个工位的MU数量,将第二个Timer控件设置为每0.1秒检查一次第二个工位的MU数量。
- 在每个Timer的OnTimer事件中,使用if语句或while语句来判断当前工位MU数量。例如,如果第一个工位MU数量为0,则暂停第一个工位的工作;如果第二个工位MU数量为2,则暂停第二个工位的工作。
- 当一个工位处理完成后,使用Delay控件添加适当的延时,以便等待另一个工位的处理完成。例如,如果第一个工位处理完成,等待500毫秒后再开始检查第二个工位的MU数量。
需要注意的是,在使用Timer和Delay控件时,应该避免出现死循环或死锁等问题。为了保证程序的可靠性,可以进行多次测试和调试,以便发现和解决潜在的问题。
'Global variables
Global stop_line1 As Boolean
Global stop_line2 As Boolean
'Initialize stop flags to false
Sub OnModelStart()
stop_line1 = False
stop_line2 = False
End Sub
'Line1 and Line2's Process Material flowchart
Sub Line_ProcessMU(flow As Object)
Dim mu As Object
Set mu = flow.Object
'Process MU in line1
If mu.Properties("line") = 1 Then
WaitUntil Not stop_line1
flow.Continue
'Process MU in line2
ElseIf mu.Properties("line") = 2 Then
WaitUntil Not stop_line2
flow.Continue
End If
End Sub
'Out1 and Out2's Control flowchart
Sub Out_Control(flow As Object)
Dim station As Object
Set station = flow.Object
'Get outgoing MU from the station
Dim mu As Object
Set mu = station.MUs(1)
'If outgoing MU is from line1
If mu.Properties("line") = 1 Then
'Check if line2's MU count is less than 2
Do While Model.MUCount("line2") < 2
If Model.MUCount("line1") = 0 Then
Exit Sub
End If
'If stop flag is true, wait for it to be false
If stop_line1 Then
WaitUntil Not stop_line1
End If
'Set stop flag for line1
stop_line1 = True
'Pause line1
Model.Delay 1, TimeUnit.Current
'Resume line1
stop_line1 = False
Loop
'MU from line1 can exit now
flow.Continue
'If outgoing MU is from line2
ElseIf mu.Properties("line") = 2 Then
'Check if line1's MU count is less than 2
Do While Model.MUCount("line1") < 2
If Model.MUCount("line2") = 0 Then
Exit Sub
End If
'If stop flag is true, wait for it to be false
If stop_line2 Then
WaitUntil Not stop_line2
End If
'Set stop flag for line2
stop_line2 = True
'Pause line2
Model.Delay 1, TimeUnit.Current
'Resume line2
stop_line2 = False
Loop
'MU from line2 can exit now
flow.Continue
End If
End Sub
您可以通过以下几个步骤实现两个并行工位同步进出物料单元(MU):
为两个并行工位分别设置一个计数器来记录当前MU的数量。
设置一个变量来存储最小的MU数量,即两个计数器中的最小值。
当任意一个工位有MU出去时,将对应的计数器减一,并将最小值更新为两个计数器中的最小值。
当任意一个工位完成处理一个MU时,将对应的计数器加一,并将最小值更新为两个计数器中的最小值。
检查两个计数器是否都等于容量,如果都等于容量,那么两个工位都已经处理了足够数量的MU,可以将MU出口设置为开放状态,允许MU离开。
如果某个计数器小于容量,那么需要暂停处理MU的工位,直到另一个工位的计数器也小于容量。
如果两个计数器都小于容量,那么两个工位都已经暂停,等待MU进入。
当一个MU进入时,需要检查哪个工位的计数器小于容量,将MU移动到相应的工位。
重复步骤 3 至步骤 8,直到所有MU都被处理完毕。
通过以上的方法,可以实现两个并行工位同步进出物料单元的需求。需要注意的是,需要在工位之间移动MU时加上等待时间,以便模拟MU在移动过程中的时间消耗