산업공학과 관련된 지식들을 공유하는 게시판입니다.
관리자의 승인을 받은 회원만이 자료를 다운로드 할 수 있음을 양해 바랍니다.
| 작성일자 : | 2010-06-22 |
|---|---|
| 수정일자 : | 2010-06-23 |
This model is an example of a workcell which is calling second worker when first worker is working.
원잇님이 ARENA로 만드신 작업도중 다른 작업자 호출하기를 QUEST를 이용하여 모델링을 해보았습니다.
원잇님과 같은방법으로 signal을 이용하여 모델링을 하려고 하였으나, 여의치 않아서 글로벌 변수로 컨트롤을 하였습니다.
그리고... "wait until"을 연구한다고 거의 2주 만든 듯 하네요. (각 function을 조금만 이해한다면 실제로는 한 시간 안에 끝날 듯;;;)
아무튼 100% 검증을 하지는 못했고, 또한 작업자의 이동시간 미고려... 등 부족한 부분이 많지만 이것을 응용한다면
멋진 모델링을 할 수 있지 않을까 생각되어 집니다.
윗 쪽이 작업을 계속해서 진행되는 작업장이며, 아랫쪽에 있는 작업자2는 Idle일 경우 윗쪽 작업장으로 가서 작업자1을 도와주로 이동을하게 됩니다.
즉 윗 쪽 작업장에서는 작업이 진행되는 case가 3가지가 생기게 됩니다.
case 1 : part가 들어옴과 동시에 작업자 1, 작업자 2가 같이 작업을 시작함
case 2 : 작업자 1이 작업 중에 작업자 2가 와서 도와줌
case 3 : 작업자 1이 혼자서 작업을 완료함...
이러한 간단한 SCL을 작성하는데 무려 1.5주가 걸렸네요..ㅡㅠㅡ// 역시 끊임없이...열심히...지속적으로 공부해야 겠다는 생각이 드는군요..
(20줄도 안되는......로직인데;;;;)
QUEST Model이 너무 없어보여서 죄송합니다....(걍 SCL 만 테스트 하기 위한 거라...)
후반부를 보시면 줌인을 하여서 작업자 움직임 (00:35) , pop widows의 내용 (01:12) 을 자세히 보여주는데....유심히 보시기 바랍니다.
(현 모델에서는 작업자의 이동속도를 0으로 해놨습니다.)

결과를 보시면...Machine 1과 Labor1의 가동률은 같으며, Labor2의 가동률은 높음을 알 수 있습니다.
이 모델을 기초로 멋진 모델(?)을 만들 수도 있을 것 같습니다....
아래는 위에 영상을 labor point를 다르게하여 작업자의 작업 모습을 좀 더 확실히 구분가게 표현 한 애니메이션입니다.
아직 완벽하지 않아서 SCL을 공개하지 않으려고 했으나, 좀 더 발전된 로직을 기대하며 공개 해봅니다. ^^
추가해야 될 내용으로는
1. 두명의 작업자가 작업을 할 경우 작업시간을 다시 계산
2. 작업자2를 호출할 경우 작업자의 이동시간 고려하여 부를지 말지를 최종 결정
"Wait Until ((sim_time - (celem->in_parts[1]-> Single_EndTime) >=0) OR (Calling_Second_worker==1001)) IN STATE BUSY_PROCESSING"
특히 위의 Logic 다음에 새로운 로직을 추가해야지만 정상적으로 작동이 가능할 듯합니다.
3. 기타, 생각하지 못한 오류 등... ^^; 이상입니다.
혹시 문제점, 개선안 등 좋은 아이디어가 있으시면 많은 조언 부탁드립니다.....
-- the example of SCL
#include <part.inc>
#include <agv.inc>
#include <part.inc>
#include <events.inc>
user_attrib
Single_JobTime : real
Single_EndTime : real
Dual_JobTime : real
Dual_EndTime : real
Var
Calling_Second_worker : real
-----------------------------------------------------------------------------------------------------
procedure First_Workcell_logic()
Var
calculated_Single_JobTime : real
calculated_Dual_JobTime : real
the_process_logic : Logic
the_labor01_state : element
the_labor02_state : element
begin
wait until out part_count 0
require part any
require labor Labor1
-- when a part enters the machine, the machine starts working with the labor1
the_labor01_state= get_element('Labor1_1')
the_process_logic = get_logic( the_labor01_state , PROCESS )
CHANGE STATE OF the_process_logic LOGIC TO BUSY_PROCESSING
-- To make the state of Labor1 is busy during a jobtime.
calculated_Single_JobTime = Uniform(40,90,4)
celem->in_parts[1]-> Single_JobTime = calculated_Single_JobTime
celem->in_parts[1]-> Single_EndTime = sim_time+ (celem->in_parts[1]-> Single_JobTime)
--to generate JobTime with a single worker.
the_labor02_state= get_element('Labor2_1')
-- To check the state of Labor2
if((the_labor02_state->status == IDLE) AND (Calling_Second_worker==1001)) then
-- Re-generate Jobtime when Labor2 is idle.
require labor Labor2 IN STATE BUSY_PROCESSING
calculated_Dual_JobTime = Uniform(20,60,2)
celem->in_parts[1]-> Dual_JobTime = calculated_Dual_JobTime
Work (celem->in_parts[1]-> Dual_JobTime) IN STATE BUSY_PROCESSING
-- This is a "Case#01": Two workers are starting works together when a part arrival
else
Wait Until ((sim_time - (celem->in_parts[1]-> Single_EndTime) >=0) OR (Calling_Second_worker==1001)) IN STATE BUSY_PROCESSING
--In this case, the machine will be wait (work) two types of JobTime.
--First, to get jobtime with only one worker.
--Second, to call second worker during first worker is working.
the_labor02_state= get_element('Labor2_1')
if((the_labor02_state->status == IDLE) AND (Calling_Second_worker==1001)) then
-- Re-generate Jobtime when Labor2 is idle.
require labor Labor2 IN STATE BUSY_PROCESSING
calculated_Dual_JobTime = Uniform(10,20,2)
celem->in_parts[1]-> Dual_JobTime = calculated_Dual_JobTime
Work (celem->in_parts[1]-> Dual_JobTime) IN STATE BUSY_PROCESSING
-- This is a "Case#02": To call second worker when the single JobTime is not finished
else
-- This is a "Case#03": The single JobTime is finished. It means only one worker is working without helping second worker.
endif
endif
Pass()
end
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
procedure Second_Workcell_logic()
begin
wait until out part_count 0
require part any
Calling_Second_worker = 1003
-- The value of Calling_second_worker == 1003 means the second worker is busy.
require labor Labor2
Work Uniform(50,90,2)IN STATE BUSY_PROCESSING
Calling_Second_worker = 1001
-- The value of Calling_second_worker == 1001 means the second worker is idle.
end
------------------------------------------------------------------------------------------------------

GOOD 검증의 간단에 감탄 ! 이제 함수 사용하고 작업자 속도 고려한 모델로 ㄱㄱㄱㄱㄱㄱㄱㄱㄱ