지식 보관소
▣ 전문지식, 저작권 관련 자료들 중 일부만 공유하고 싶을때 사용할 수 있는 게시판 입니다.
▣ 정회원 이상만 다운로드가 가능하니 참고하시기 바랍니다.
작성일자 | 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 검증의 간단에 감탄 ! 이제 함수 사용하고 작업자 속도 고려한 모델로 ㄱㄱㄱㄱㄱㄱㄱㄱㄱ