350 likes | 746 Views
제 9 장 Arena 통합 및 Customization. 주요 내용. 각 개체의 도착시각을 외부 파일로 부터 읽어 개체 생성 ( 텍스트 파일 ) ActiveX 자동화와 VBA 를 이용한 다른 응용 프로그램과 통합 고객 사용자 인터페이스 생성 예제 콜센터 모델 개선 – 개별 통화 데이터 기록을 Excel 에 차트로 표현 자체 모듈 설계 – 표준 모델링 구조의 확장. 모델 9-1: 기록된 데이터로부터 개체 도착 생성. 콜 센터 모델에서 통화 도착 데이터 읽어 통화 생성
E N D
주요 내용 • 각 개체의 도착시각을 외부 파일로 부터 읽어 개체 생성(텍스트 파일) • ActiveX 자동화와 VBA 를 이용한 다른 응용 프로그램과 통합 • 고객 사용자 인터페이스 생성 예제 • 콜센터 모델 개선 – 개별 통화 데이터 기록을 Excel에 차트로 표현 • 자체 모듈 설계 – 표준 모델링 구조의 확장 추가 모델링 사항
모델 9-1: 기록된 데이터로부터 개체 도착 생성 • 콜 센터 모델에서 통화 도착 데이터 읽어 통화 생성 • model 09-01.txt: ASCII 텍스트 파일 추가 모델링 사항
모델 9-1: 기록된 데이터로부터 개체 도착 생성 • Create 모듈 수정 • ReadWrite 모듈 (데이터 입력) 추가 모델링 사항
모델 9-1: 기록된 데이터로부터 개체 도착 생성 • Delay 모듈: 다음 통화 간격 지연 • 다음 도착 생성을 위한 개체 생성: Separate 모듈 추가 모델링 사항
모델 9-1: 기록된 데이터로부터 개체 도착 생성 • File 데이터 모듈 추가 모델링 사항
VBA in ARENA • Visual Basic for Applications(VBA) • Arena에 내장됨 • Arena 모델 로직 확장을 위한 개별 코드 작성 • ActiveX 자동화 및 VBA 개요 • ActiveX: 응용프로그램들이 프로그래밍 인터페이스를 통해 서로 제어할 수 있도록 함. • Excel 에서 Macro 생성 : ActiveX 인터페이스를 통해 셀 포맷 지정, 수식 변경, 차트 생성 등을 가능케하는 VBA 코드 • 객체 모델(Object Model) 사용 • 애플리케이션 객체 목록: 엑셀 워크시트, 차트, 셀 등 • 프로퍼티: 워크시슽 이름, 차트 제목 등 • 메소드: 워크시트 삭제, 차트 생성, 셍 병합 등 추가 모델링 사항
VBA in ARENA • VBA: 프로그래밍 언어 • Visual Basic 엔진과 동일 • Microsoft Office, AutoCAD, Arena 등에 내장됨 • 주요 기능 • 비주얼베이직 프로그래밍 구조체: Sub, Function, Class, If, Elseif, Endif, While, Wend, Do, On Error, Select Case • 사용자 폼: 토글 버튼, 스크롤 바, 입력 박스, 명령 버튼, 스핀 버튼 • 코드 디버깅 도구: Watches, Breakpoint, Step 옵션 • 온라인 도움말 • Visual Basic Editor 추가 모델링 사항
VBA in ARENA • VB Editor 추가 모델링 사항
VBA in ARENA • 내장형 Arena VBA Events • ThisDocument: Arena 모델내의 다양한 Event 에 Access할 수 있는 객체 • ModelLogic 객체를 선택하여 이벤트를 선택하여 코딩 • 3가지 이벤트 유형 • 실행 전 이벤트: DocumentOpen, DocumentSave • Arena 기동 실행 이벤트: RunBegin, RunBeginSimulation, RunEndReplication • 모델/사용자 기동 실행 이벤트: UserFunction, VBA_Block_Fire, OnKeyStroke 추가 모델링 사항
VBA in ARENA • 시뮬레이션 실행 VBA 이벤트 1. RunBegin 2. Arena Checks Initiaialize Model 3. RunBeginSimulation 4. RunBeginReplication 5. Arena Runs Replication OnKeyStroke UserFunction 등 6. RunEndReplication 7. RunEndSimulation 8. Arena 시뮬레이션 종료 9. RunEnd 추가 모델링 사항
VBA in ARENA • ModelLogic_RunBegin 호출 • VBA 코드는 모델의 구조적인 데이터 수정 가능 – 모듈 오퍼랜드 값 • 실행 중 값들은 수정 불가 • Arena 는 모델을 체크하고 실행상태로 초기화 • 변수값 초기화 • 자원상태 초기화: Idle, 초기 용량 • ModelLogic_RunBeginSimulation 호출 • 시뮬레이션 실행 초기에 1회 실행할 VBA 코드 삽입 • Excel, Access, Oracle 등 외부로부터 데이터 로드 • UserForm 디스플레이 • Arena 모델의 변수에 값 지정가능 추가 모델링 사항
VBA in ARENA • ModelLogic_RunBeginReplication 호출 • 각 반복실험 실행시 마다 호출 • RunBeginSimulation에서 실행할 수 있는 것과 유사 • Arena 시뮬레이션 수행 • VBA 코드 활성화 가능 • ModelLogic_UserFunction : Arena 에서 UF 변수참조 , 복잡한 수식 및 의사결정 기준 정의 • ModelLogic_VBA_Block_Fire : 개체가 VBA 모듈(Blocks 패널)을 지나갈 때 호출, 예: 개체가 모델을 떠날 때 엑셀에 상세 정보 기록 • ModelLogic_OnKeyStroke: 시뮬레이션 도중 사용자가 지정 키를 누르면 호출, 예: 1 키를 누르면 모델 요약상태를 보여주는 폼 디스플레이 • ModelLogic_OnClearStatistics: 통계치를 비워야 하는 경우(시뮬레이션 시간이 웝업 기간에 도달) 호출, 표준적인 통계치 초기화를 보강해야 하는 경우 VBA 코드 사용 추가 모델링 사항
VBA in ARENA • ModelLogic_RunEndReplication 호출 • 반복실험 종료시 마다 호출 • 요약정보를 외부파일에 저장, 전역 변수 증가 등에 사용 • 중간에 종료되는 경우에는 실행되지 않음 • ModelLogic_RunEndSimulation 호출 • 시뮬레이션 종료시 호출 • 실행 중 데이터 활용 가능: 통계치, 자원 상태 등 엑세스 가능 • 파일, 스프레드 시트, DB 에 통계치 쓰기, 파일 닫기, 종료 메시지 디스플레이 등 포함 • 시뮬레이션 종료 • ModelLogic_RunEnd 호출 • 실행 중 데이터 접근 불가하나 다른 VBA 기능은 가능 • 예: 계속 실행 여부를 묻는 폼 디스플레이 추가 모델링 사항
VBA in ARENA • Arena의 객체 모델 • 객체(Objects) 또는 개체: 보기/개체 찾아 보기 • 프로퍼티(Property) • 메소드(Method) • Collections of Objects • 객체 종류 • 모델 윈도우 객체: Arena 모델 창에 나타날 수 있는 모든 항목 – 모듈, 연결선, 선, 다각형, 문자, 애니메이션 객체, named Views • SIMAN 객체: 시뮬레이션 실행과 관련된 정보 접근 객체 – 변수 값, 자원 용량, 대기열의 길이, 현재 시각 등 • 구조 객체: 일반 Arena 기능에 접근하기 위한 객체 – 애플리케이션, 모듈 정의, 패널 객체 등 추가 모델링 사항
VBA in ARENA • 모델 창 예: 10 개의 상태변수 값을 위치를 바꾸어 모델 창에 디스플레이 Dim oModel As Arena.Model Dim i As Integer Dim nX As Long ‘ Add the status variables to this Arena model Set oModel = ThisDocument.Model nX = 0 ‘Start at x position 0 For i=1 To 10 ‘ Add a status variable to the model window oModel.StatusVariables.Create nX, 0, _ nX + 400, 150, “WIP(“ & i & “)”, “**.*”, False, _ RGV(0,0,255), RGV(0,255,255), RGV(0,0,0), “Arial” ‘ Move over 500 world units for next position nX = nX + 500 Next i 추가 모델링 사항
VBA in ARENA • SIMAN 객체 예: 변수값을 사용자에게 질의하는 메시지 창 디스플레이 Dim oSIMAN As Arena.SIMAN Dim nVarIndex As Long Dim sNewValue As String ‘ Prompt for a new value sNewValue = InputBox(“Enter the new average cycle time:”) ‘ Assign their answer to the Mean Cycle Time variable Set oSIMAN = ThisDocument.Model.SIMAN nVarIndex = oSIMAN.SymbolNumber(“Mean Cycle Time”) oSIMAN.VariableArrayValue(nVarIndex) = sNewValue 변수명을 내부 인덱스로 변환하는 함수 InputBox에 입력된 변수값으로 수정하는 프로퍼티 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • 고객 도착 정보를 사용자가 상호대화형으로 선택 • Random Interarrival-time process • Arrival time from a file 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • 도착 로직 수정 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • Create 모듈의 Max Arrivals에 의한 선택 • Random Process Craete 모듈의 Max Arrivals 0 & 파일 로직 Create 모듈의 Max Arrivals 1 : 파일 로직 선택 • Random Process Craete 모듈의 Max Arrivals infinite & 파일 로직 Create 모듈의 Max Arrivals 0 : 랜덤 도착 로직 선택 • Create 모듈: model 5-2와 동일 & Max Arrivals = 0 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • Properties 대화상자를 이용한 모듈 Tag 참조/수정 • Object.nnn Create from random process or Create from file 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • VBA 사용자 폼 설계 • Visual Basic Editor 삽입 사용자 정의 폼 메뉴 • 도구 상자 이용 폼 설계 • 프로퍼티 상자의 이름 필드 정의: frmArrivalTypeSelection optFromRandomProcess optFromFile cmdOK 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • 폼 디스플레이 및 모델 데이터 설정 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • 버튼 클릭 시 동작 코딩 • Create 모듈에 접근하기 위해 Create and Direct Arrivals 서브 모델을 연다. • Create 모듈의 Max Arrivals 난의 값을 설정한다. • 실행 준비를 위해 Top-level의 모델 애니메이션 뷰로 이동한다. • 재미를 위해 음악 들려주는 코드를 추가한다. • 사용자 정의 폼을 닫는다. • 서브 모델 열기 코드 Dim nArrivalsSubmodelIndex As Long Dim oArrivalsModel As Arena.Model With ThisDocument.Model.Submodels nArrivalsSubmodelIndex = _ .Find(smFindName, "Create and Direct Arrivals") Set oArrivalsModel = _ .Item(nArrivalsSubmodelIndex).Model End With oArrivalsModel.Show 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • Create 모듈 접근 코드 Dim nCreateRandomProcessIndex As Long Dim oCreateRandomProcessModule As Arena.Module Dim nCreateFileIndex As Long Dim oCreateFileModule As Arena.Module ' Find the two Create modules nCreateRandomProcessIndex = _ oArrivalsModel.Modules.Find(smFindTag, _ "Create from random process") If nCreateRandomProcessIndex = 0 Then MsgBox "No module with tag 'Create from random process'" frmArrivalTypeSelection.Hide Exit Sub End If Set oCreateRandomProcessModule = _ oArrivalsModel.Modules(nCreateRandomProcessIndex) nCreateFileIndex = _ oArrivalsModel.Modules.Find(smFindTag, "Create from file") If nCreateFileIndex = 0 Then MsgBox "No module with tag 'Create from file'" frmArrivalTypeSelection.Hide Exit Sub End If Set oCreateFileModule = oArrivalsModel.Modules(nCreateFileIndex) 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • Tag를 이용한 Create 모듈의 Max Arrivals 값 지정 • Top –level 뷰로 이동 ' Set the Max Arrivals fields If optFromRandomProcess.value = True Then oCreateRandomProcessModule.Data("Max Batches") = "Infinite" oCreateFileModule.Data("Max Batches") = "0" Else oCreateRandomProcessModule.Data("Max Batches") = "0" oCreateFileModule.Data("Max Batches") = "1" End If Dim oModel As Arena.Model Dim nAnimViewIndex As Long ' Return to the top-level model and show the Animation named view Set oModel = ThisDocument.Model oModel.Show nAnimViewIndex = oModel.NamedViews.Find(smFindName, "Animation") If nAnimViewIndex > 0 Then _ oModel.ActiveView.ZoomView oModel.NamedViews(nAnimViewIndex) 추가 모델링 사항
Model 9-2: 사용자에 의한 도착 선택 • 음악 들려주기 코드 • 사용자 정의 폼 닫기 Dim nSoundFileIndex As Long ' Play the sound file nSoundFileIndex = _ oModel.Embeddeds.Find(smFindTag, "Mission Possible") If nSoundFileIndex > 0 Then _ oModel.Embeddeds.Item(nSoundFileIndex).Do ' Hide the UserForm to allow the run to begin frmArrivalTypeSelection.Hide Exit Sub 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 • 주요 내용 • 판매 통화 종료 시 통화 시작시간, 종료시간, 통화지속기간 데이터를 엑셀 시트에 기록 • 통화지속기간의 추세를 파악하기 위해 차트로 나타냄 • 실행 초기 엑셀 초기화 • 엑셀을 기동하여 새파일 만든다. • 전역 변수 선언 Option Explicit ' Global variables Dim oSIMAN As Arena.SIMAN, nArrivalTimeAttrIndex As Long Dim nNextRow As Long, nColumnA As Long, nColumnB As Long, nColumnC As Long ' Global Excel variables Dim oExcelApp As Excel.Application, oWorkbook As Excel.Workbook, _ oWorksheet As Excel.Worksheet 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 • 엑셀 객체 라이브러리 참조: 도구/참조 MicroSoft Excel 9.0 Object Library 선택 • RunBeginSimulation 코드 Private Sub ModelLogic_RunBeginSimulation() ' Set the global SIMAN variable Set oSIMAN = ThisDocument.Model.SIMAN ' Set global variable to store Arrival Time attribute index nArrivalTimeAttrIndex = oSIMAN.SymbolNumber("Arrival Time") ' Start Excel and create a new spreadsheet Set oExcelApp = CreateObject("Excel.Application") oExcelApp.Visible = True oExcelApp.SheetsInNewWorkbook = 1 Set oWorkbook = oExcelApp.Workbooks.Add Set oWorksheet = oWorkbook.ActiveSheet (뒷면에 계속) 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 With oWorksheet .Name = "Call Data" .Rows(1).Select oExcelApp.Selection.Font.Bold = True oExcelApp.Selection.Font.Color = RGB(255, 0, 0) .Rows(2).Select oExcelApp.Selection.Font.Bold = True oExcelApp.Selection.Font.Color = RGB(0, 0, 255) End With End Sub • RunBeginReplication 코드 Private Sub ModelLogic_RunBeginReplication() Dim nReplicationNum As Long, i As Integer ' Set variables for the columns to which data is to be written nReplicationNum = oSIMAN.RunCurrentReplication nColumnA = (4 * (nReplicationNum - 1)) + 1 nColumnB = nColumnA + 1 nColumnC = nColumnA + 2 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 ' Write header row for this day's call data and ' set nNextRow to 3 to start writing data in third row With oWorksheet .Activate .Cells(1, nColumnA).value = "Day " & nReplicationNum .Cells(2, nColumnA).value = "Start Time" .Cells(2, nColumnB).value = "End Time" .Cells(2, nColumnC).value = "Duration" For i = 0 To 2 .Columns(nColumnA + i).Select oExcelApp.Selection.Columns.AutoFit oExcelApp.Selection.NumberFormat = "0.00" Next i End With nNextRow = 3 End Sub 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 • 각 통화 데이터 저장 • 모델 수정 • VBA 코드 Private Sub VBA_Block_1_Fire() ' Retrieve create time and current time from SIMAN object data Dim dCreateTime As Double, dCurrentTime As Double dCreateTime = oSIMAN.EntityAttribute(oSIMAN.ActiveEntity, _ nArrivalTimeAttrIndex) dCurrentTime = oSIMAN.RunCurrentTime ' Write the values to the spreadsheet With oWorksheet .Cells(nNextRow, nColumnA).value = dCreateTime .Cells(nNextRow, nColumnB).value = dCurrentTime .Cells(nNextRow, nColumnC).value = dCurrentTime - dCreateTime End With ' Increment the row variable nNextRow = nNextRow + 1 End Sub 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 • 차트 작성 및 실행 종료 마무리 • 차트 작성 코드: RunEndReplication Private Sub ModelLogic_RunEndReplication() ' Chart today's sales call data on a separate chart sheet oWorkbook.Sheets("Call Data").Select oWorksheet.Range(oWorksheet.Cells(3, nColumnC), _ oWorksheet.Cells(nNextRow, nColumnC)).Select oExcelApp.Charts.Add ' Format the chart With oExcelApp.ActiveChart .ChartType = xlLineMarkers .SetSourceData Source:=oWorksheet.Range(oWorksheet.Cells(3, _ nColumnC), oWorksheet.Cells(nNextRow, nColumnC)), _ PlotBy:=xlColumns .SeriesCollection(1).XValues = "" .Location Where:=xlLocationAsNewSheet, _ Name:="Day " & oSIMAN.RunCurrentReplication & " Sales Calls" .HasTitle = True ' Title and Y axis .HasAxis(xlValue) = True 추가 모델링 사항
Model 9-3: 실행 결과를 엑셀에 기록하고 차트 만들기 .HasAxis(xlValue) = True .HasAxis(xlCategory) = False ' No X axis or Legend .HasLegend = False .ChartTitle.Characters.Text = "Sales Call Times" .Axes(xlValue).MaximumScale = 60 .Axes(xlValue).HasTitle = True .Axes(xlValue).AxisTitle.Characters.Text = "minutes" End With End Sub • 실행 종료 코드: RunEndSimulation Private Sub ModelLogic_RunEndSimulation() ' Save the spreadsheet and close Excel oExcelApp.DisplayAlerts = False ' Don't prompt to overwrite oWorkbook.SaveAs ThisDocument.Model.Path & "Model 09-03.xls" End Sub 추가 모델링 사항