-반도체 장비 제어, 자동화 장비 제어의 꽃인 시퀀스 짜기-
내일 직원에게 시퀀스 짜는 방법을 알려주기 위해서 우선 글로 써보기로 하였습니다. 원래 퇴근하고 바로 쓰려했는데 밥먹고 유튜브 좀 보고 방청소 하다보니 어느새 11시... 자기 전 졸음을 참고 적어봅니다.
아래 예제 소스는 c#이지만 원리를 알면 어느 언어에든 적용이 가능하다고 생각합니다.
(프로젝트를 만드는 과정은 생략합니다.)
스레드 타이머를 사용할 것이기 때문에
1) using namespace로써 System.Threading.Tasks를 정의해줍니다.
2) 전역 변수로 오늘의 주인공 timer와 switch-case문에서 event id로 사용될 변수를 선언해줍니다.
3) 타이머 초기화 함수를 작성한다. (Init_Timer)
4) 타이머를 초기화해주기 위하여 클래스 생성자에서 타이머 초기화 함수를 호출한다. (원하는 타이밍이 있음 그 곳에서 호출해도 되며, 굳이 함수형식으로 만들지 않고 바로 3)의 내용을 넣어줘도 됩니다.)
(아래 소스 참고)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; // 필수, 스레드 타이머를 사용하기 위해
namespace NanoConnectProgram
{
class Preprocessing_Catridge
{
System.Threading.Timer timer;
int mn_eventID = 0;
public Preprocessing_Catridge()
{
Init_Timer(); // 타이머 초기화 함수
}
private void Init_Timer()
{
// OnTimer는 아래에서 실제 사용될 타이머 함수 이름입니다.
timer = new System.Threading.Timer(OnTimer);
}
1) SetTimer함수로 타이머를 시작시킬 예정이므로, 타이머(시퀀스)가 시작되면 어느 case로 진입할지 결정할 event id와 얼마의 주기로 실행시킬지를 결정할 period 변수를 인자로 받도록 함수를 작성합니다.
2) 인자로 받은 event id는 전역변수로 선언된 mn_eventID에 넣어주고, period 인자는 timer.Change(0, period)에 넣어서 사용합니다.
3) KillTimer는 Timer를 종료시킬때 호출될 함수입니다. 시작시킬때와 동일하게 Change메서드를 사용하며, 인자로 무한대를 뜻하는 상수를 넣어줍니다.)
public void SetTimer(int event_id, int period)
{
mn_eventID = event_id;
timer.Change(0, period);
}
public void KillTimer()
{
timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
}
1) 이제 위에서 SetTimer가 실행되면 설정된 주기에 맞춰 OnTimer가 호출됩니다.
private void OnTimer(Object state)
{
switch(mn_eventID)
{
case 10:
// 동작시킬 함수 작성
IO_PC_FUNCTION(ID, PC_FUNCTION.VALVE1_OPEN);
mn_eventID = 20;
break;
case 20:
if(동작 완료 체크 또는 센서의 상태 확인)
{
if(비정상 동작 또는 비정상 상태 확인)
{
// 에러 로그 작성
Console.WriteLine("case 20 stop");
mn_eventID = 1000; // 타이머 종료
break;
}
// 동작시킬 함수 작성
IO_PC_FUNCTION(ID, PC_FUNCTION.REACTION_CHMABER_NP);
mn_eventID = 30;
}
break;
.
.
.
case 1000:
KillTimer();
break;
간단하죠?
이상으로 시퀀스 짜는 기법 중 하나인 [스레드 타이머 + switch-case문] 방식을 소개해드렸습니다.
장비 PC제어와 관련한 서적 추천 부탁드려도 될까요?