반응형
예광탄
프로그램 유형: 콘솔 응용 프로그램
RCMachine.cs
using System;
using System.Threading;
namespace 콘솔_예광탄
{
public class RCMachine
{
public event CotingEventHandler OnCoting;
int rarea;
/// <summary>
/// 레코드 단위 면적
/// </summary>
public int RArea
{
get
{
return rarea;
}
set
{
Random rand = new Random();
rarea = value;
cmaxavailcnt = rand.Next(200) + 900;
}
}
/// <summary>
/// 투입구 반경
/// </summary>
public int CRadius
{
get;
set;
}
/// <summary>
/// 회전 속도
/// </summary>
public int SpinSpeed
{
get;
set;
}
/// <summary>
/// 원판 레코드 개수
/// </summary>
public int SourceCnt
{
get;
set;
}
/// <summary>
/// 코팅액 개수(단위:병)
/// </summary>
public int CoatingLiq
{
get;
set;
}
/// <summary>
/// 코팅한 레코드 개수
/// </summary>
public int ProductCnt
{
get;
set;
}
int cavailcnt;//현재 코팅액으로 코팅할 수 있는 레코드 수
int cmaxavailcnt;//한 병의 코팅액으로 코팅할 수 있는 레코드 수
public int MAXACNT
{
get
{
return cmaxavailcnt;
}
}
int tobearea;//코팅해야 할 면적
/// <summary>
/// 가동중인지 여부
/// </summary>
public bool IsStart
{
get;
set;
}
Timer timer;
public void Start()
{
//이미 가동중 일 때
if(IsStart)
{
return;
}
//원판 레코드가 없거나
//코딩액이 하나의 원판을 코팅할 수 없을 때
if(((SourceCnt==0)&&(tobearea==0))|| ((CoatingLiq == 0) && (cavailcnt < RArea)))
{
IsStart = false;
if (OnCoting != null)
{
OnCoting(this, new CotingEventArgs(
ProductCnt, SourceCnt, CoatingLiq, cavailcnt, tobearea));
}
return;
}
if ((CoatingLiq != 0) && (cavailcnt == 0))
{
CoatingLiq--;
cavailcnt = cmaxavailcnt;
}
if (tobearea == 0)
{
SourceCnt--;
tobearea = RArea;
}
IsStart = true;
int speed = 1000 / (SpinSpeed * CRadius * CRadius);
if (speed ==0)
{
speed = 1;
}
timer = new Timer(Coting,null, 0, speed);
}
void Coting(object state)
{
cavailcnt--;
tobearea--;
if ((CoatingLiq == 0) && (cavailcnt < RArea))
{
Stop();
return;
}
if(cavailcnt==0)
{
CoatingLiq--;
cavailcnt = cmaxavailcnt;
}
if (tobearea == 0)
{
ProductCnt++;
if (SourceCnt == 0)
{
Stop();
return;
}
SourceCnt--;
tobearea = RArea;
}
if (OnCoting != null)
{
OnCoting(this, new CotingEventArgs(
ProductCnt, SourceCnt, CoatingLiq, cavailcnt, tobearea));
}
}
public void Stop()
{
timer.Dispose();
IsStart = false;
if (OnCoting != null)
{
OnCoting(this, new CotingEventArgs(
ProductCnt, SourceCnt, CoatingLiq, cavailcnt, tobearea));
}
}
}
}
CotingEventArgs.cs
using System;
namespace 콘솔_예광탄
{
public delegate void CotingEventHandler(object sender, CotingEventArgs e);
public class CotingEventArgs:EventArgs
{
public int ProductCnt
{
get;
private set;
}
public int SourceCnt
{
get;
private set;
}
public int Liqid
{
get;
private set;
}
public int AvailCnt
{
get;
private set;
}
public int Tobe
{
get;
private set;
}
public CotingEventArgs(int pc,int sc,int li,int ac,int tb)
{
ProductCnt = pc;
SourceCnt = sc;
Liqid = li;
AvailCnt = ac;
Tobe = tb;
}
}
}
Program.cs
using System;
namespace 콘솔_예광탄
{
class Program
{
static void Main(string[] args)
{
RCMachine rc = new RCMachine();
rc.OnCoting += Rc_OnCoting;
rc.RArea = 100;
rc.CoatingLiq = 2;
rc.CRadius = 3;
rc.SpinSpeed = 100;
rc.SourceCnt = 10;
rc.Start();
Console.ReadKey();
}
private static void Rc_OnCoting(object sender, CotingEventArgs e)
{
Console.WriteLine("완성 개수:{0}", e.ProductCnt);
Console.WriteLine("현재 코팅 중인 원판에 남은 면적:{0}", e.Tobe);
}
}
}
반응형
'언어 자료구조 알고리즘 > 프로그래밍 실습' 카테고리의 다른 글
[C# 실습, 시나리오] 반도체 증착공정 및 Burn in 테스트 설비 시뮬레이션 (0) | 2020.10.08 |
---|---|
[C# 실습] 레코드 코팅 - 기계(서버)와 제어기(클라이언트) (0) | 2020.10.07 |
[C# 실습] 레코드 코팅 - 기계 구현(Windows Forms) (0) | 2020.10.07 |
[C# 실습, 사용자 정의 컨트롤 제작 예광탄] 레코드 코팅 (0) | 2020.10.06 |
[C# 실습] 레코드 코팅 - 더블 버퍼링 가능한 Panel 정의하기 (0) | 2020.10.06 |
[C# 실습 시나리오] 레코드 코팅 - 반도체 장비 및 제어시스템 개발자 양성 과정 (0) | 2020.10.06 |
[C# 실습] 반도체 장비 관리 프로그램 - 3. 상세 구현 (0) | 2020.09.22 |
[C# 실습] 반도체 장비 관리 프로그램 - 2. 프로토 타이핑 (0) | 2020.09.21 |
[C# 실습] 반도체 장비 관리 프로그램 - 1. 단일체 패턴 표현 (0) | 2020.09.21 |
[C# 실습] 반도체 장비 관리 프로그램 (0) | 2020.09.21 |