Program/Design

장비/설비 모듈 설계 (1)

사막여유 2024. 12. 21. 12:44
728x90

 

FA(Factory Automation) 장비와 설비 개발에서는 모듈 구성설계 방식이 작업 효율성과 유지보수성에 중요한 영향을 미칩니다.

이번 글에서는 제가 경험한 설계 방법과 더 나아가 이를 개선하기 위한 아이디어를 공유하려 합니다.

특히, 많은 장비 개발자들이 사용하는 시퀀스 기반 설계와 이를 더욱 유연하고 확장 가능한 방식으로 발전시키는 방법에 대해 작성해 보겠습니다.

 

1. FA 장비의 모듈 구성

FA 장비는 기본적으로 다양한 기능별로 구분된 모듈로 구성됩니다.
제가 경험한 대부분의 설비들은 아래와 같은 주요 모듈로 나뉘었습니다.

  • VISION 모듈: 카메라와 검사 라이브러리 및 딥러닝등을 이용해 제품이나 공정을 검사.
  • MOTOR 모듈: 모터 제어 (이동, 보간, 축 상태 수집) 등의 작업 수행.
  • DIO 모듈: 디지털 입출력을 관리하여 센서 데이터 수집 및 장비 제어.
  • NETWORK 모듈: 데이터 송수신 및 외부 시스템(PC,센서)과 통신.
  • 이 외 기타 모듈 ( Log, File ... )

모듈화는 기능별 책임을 분리하여 유지보수성을 높이고, 새로운 기능을 추가할 때 기존 시스템에 미치는 영향을
최소화하여 독립성, 재사용성을 높이는데 핵심적인 역할을 합니다.

 

2. 시퀀스 기반 설계란?

제가 다녔던 두 곳의 회사 모두에서 사용했던 방식이 시퀀스 기반 설계입니다.

시퀀스 기반 설계는 작업을 단계적으로 정의하고, 각 단계가 완료되면 다음 단계로 넘어가는 방식으로 동작합니다.

시퀀스 기반 설계의 특징

  1. 순차적 진행:
    • 예: START 버튼 클릭 → HOME 동작 → VISION 검사 → 작업 완료.
  2. 단순한 흐름:
    • 작업 순서가 고정적이기 때문에 구현과 디버깅이 간단.
  3. 직관적 설계:
    • 작업 순서가 명확하게 드러나 누구나 쉽게 이해 가능.

실제 코드 예시

// 1. 모터를 홈 위치로 이동
await MotorMoveHome();
Console.WriteLine("Motor homing initiated...");

// 2. 홈 위치 확인
bool bIsHomeComplete = await CheckHomeComplete();
if (bIsHomeComplete)
{
    // 3. 비전 검사를 시작
    Console.WriteLine("Home complete. Starting vision inspection...");
    await VisionInspection();

    // 4. 목표 위치로 이동
    Console.WriteLine("Moving motor to target position...");
    await MotorMoveToTarget();
}
else
{
    // 오류 발생 시 처리
    Console.WriteLine("Error: Home not complete.");
}

이 방식은 대부분의 장비에서 효과적으로 사용될 만큼 직관적이고 간단합니다.
다만, 시퀀스를 큰 틀 안에서 체계적으로 관리하고 전환 상태를 명시적으로 표현하기 위해 상태 머신(State Machine)을 도입할 수도 있습니다.

 

3. 상태 머신(State Machine) 도입

시퀀스 기반 설계를 조금 더 유연하게 만들고 싶다면, 상태 머신(State Machine) 방식을 도입해볼 수 있습니다.

상태 머신은 시스템을 여러 "상태(State)"로 정의하고, 각 상태에서 수행할 작업과 상태 간 전환 조건을 명시적으로 관리합니다.

 

상태 머신의 구조

  • 상태(State): Idle(대기상태), Ready(준비완료상태), Processing(작업상태), Error(에러상태) 등.
  • 전환(Transition): 한 상태에서 다른 상태로 넘어가는 규칙.
  • 이벤트(Event): 상태 전환을 유발하는 트리거.

 

상태 머신 적용 방식

시퀀스 기반 설계를 상태 머신의 틀 안에 넣어, 각 상태에서 기존의 시퀀스를 실행하도록 변경할 수 있습니다.

상태 머신 코드 예시

private async Task HomeState()
{
    var homeHandler = new HomeStateHandler();
    try
    {
        await homeHandler.ExecuteAsync(); // Home 관련 작업 실행
        _currentState = State.Processing; // 다음 상태로 전환
    }
    catch
    {
        _currentState = State.Error; // 오류 발생 시 Error 상태로 전환
    }
}

private async Task ProcessingState()
{
    var processingHandler = new ProcessingStateHandler();
    try
    {
        await processingHandler.ExecuteAsync(); // Processing 작업 실행
        _currentState = State.Idle; // 완료 후 Idle 상태로 전환
    }
    catch
    {
        _currentState = State.Error;
    }
}

 

시퀀스와 상태 머신의 조합

  • 기존 시퀀스 로직은 각 상태(HomeState, ProcessingState)의 작업으로 캡슐화.
  • 상태 머신은 상태 전환과 전체 흐름을 관리.

 

4. 상태 머신 도입의 장점

  1. 유연성:
    • 작업 순서가 고정되지 않아, 상황에 따라 다른 흐름으로 전환 가능.
    • 예: 오류 발생 시 Error 상태로 전환 후 복구.
  2. 확장성:
    • 새로운 상태나 작업 추가 시 기존 구조를 크게 변경할 필요 없음.
  3. 가독성:
    • 전체 상태와 흐름이 명확히 드러나, 새로운 개발자도 쉽게 이해 가능.

 

5. 결론

지금까지 FA 장비/설비 개발에서 시퀀스 기반 설계의 효과적인 사용 방법과 이를 상태 머신으로 발전시키는 간략한 방법을 살펴봤습니다. 상태 머신은 시퀀스의 효율성을 유지하면서도 더 큰 유연성과 확장성을 제공하는 설계 방식이라고 생각해서 한번 작성해봤습니다.

다음 글에서는 상태 머신 설계를 실제 프로젝트에 적용할 때의 구체적인 사례와 코드 구조를 소개하겠습니다.
FA 장비 개발자로서 시스템을 더 유연하고 확장 가능하게 만드는 데 이 글이 도움이 되었길 바랍니다.

감사합니다.

728x90