This is an old revision of the document!


HMI Programming: Modular Pi + CFNET I/O

본 장에서는 Modular PiCFNET I/O 모듈(CFDI, CFDO 등)을 활용하여 PyQt 기반의 HMI(Human-Machine Interface) 프로그램을 구현하는 표준 방법을 설명합니다.

1. 시스템 아키텍처 및 동작 방식

HMI 시스템은 사용자 인터페이스(UI)와 실제 하드웨어 제어 로직이 상호작용하는 구조로 동작합니다.

  • 프론트엔드 (UI): Qt Designer로 제작한 .ui 파일이 화면 레이아웃을 결정합니다.
  • 백엔드 (Logic): main.py가 UI 위젯의 이벤트(버튼 클릭 등)와 하드웨어 제어 로직을 연결합니다.
  • 드라이버 (Library): CFRASP.py 라이브러리를 통해 CFNET I/O 모듈의 데이터를 읽고 씁니다.
동작 흐름: UI 위젯 동작 ↔ Python 프로그램(main.py) 로직 ↔ CFNET I/O 제어(CFRASP.py)

2. 프로젝트 필수 구성 요소

HMI 프로젝트를 실행하기 위해서는 Modular Pi의 동일한 프로젝트 폴더 내에 아래 3가지 필수 파일이 포함되어야 합니다.

파일명 역할 상세 설명
main.py 제어 로직 UI 로드, 이벤트 처리, 하드웨어 I/O 통신 실행
.ui 파일 화면 설계 Qt Designer에서 제작된 위젯 배치 및 객체 이름 정의
CFRASP.py 라이브러리 CFNET I/O(DI/DO/AD/DA) 제어를 위한 전용 함수 제공

3. 주요 구현 내용

1) UI 위젯 객체 연결 (Front-end)

* UI Form 구성: Qt Designer에서 각종 위젯을 드래그 앤 드롭 방식으로 배치하여 디자인합니다. * 객체 이름 정의: 버튼(Button), 라벨(Label) 등 각 요소에 고유한 Object Name을 부여하여 Python 코드에서 호출할 수 있도록 합니다.

2) Python 프로그램 로직 (Back-end)

main.py는 전체 시스템의 컨트롤러 역할을 수행합니다.

* 실시간 모니터링: QTimer를 사용하여 300ms 주기로 CFDI 입력 값을 읽어 UI에 실시간 반영합니다. * 하드웨어 제어: 사용자가 UI 버튼을 누르면 CFDO의 특정 포트로 ON/OFF 출력 신호를 전송합니다. * 클래스 구조: MyWindow 클래스가 QMainWindow를 상속받아 버튼 클릭 이벤트, 입출력 모니터링, UI 갱신 로직을 통합 관리합니다.

4. 관련 리소스

HMI(UI + CFNET I/O) Programming

본 장에서는 Modular Pi + CFNET I/O 모듈(CFDI, CFDO 등)을 활용하여 PyQt 기반 HMI(UI)프로그램을 구현하는 방법을 설명합니다.

  • Qt Designer에서 제작한 .ui 파일을 Python(main.py)에서 로드하여 .ui 파일의 위젯 객체 연결 방법
  • CFNET I/O 모듈을 제어하기 위한 CFRASP.py 라이브러리 함수 사용 방법
  • UI 이벤트(버튼 클릭 등)와 실제 하드웨어 동작(CFDI 입력 확인, CFDO 출력 제어)을 연결 방법

(다운로드) HMI 패키지 (CFRASP.py, main.py, .ui, .img)

HMI 동작 방식 및 구성

HMI 프로젝트는 기본 main.py, UI 파일(.ui), CFRASP.py 3가지 파일로 구성됩니다.

  • main.py : UI 로드 및 제어 로직 실행
  • .ui 파일 : Qt Designer에서 제작한 화면 레이아웃
  • CFRASP.py : CFNET I/O 제어 라이브러리

HMI 시스템은 Modular Pi + CFNET I/O 모듈로 구성되며, UI 화면은 로컬 모니터 또는 원격 접속(VNC 등)을 통해 표시할 수 있습니다.

  • 모듈라 Pi : UI 화면 표시 및 사용자 입력 처리, Python 기반 제어 로직 실행, CFNET 통신을 통한 I/O 제어 명령 전송
  • CFNET I/O : DI/DO/AD/DA 입출력 제어 수행, 센서/스위치 등 외부 장치의 상태 값 전달, 실시간 I/O 동작 및 모니터링

  • 실제 I/O 동작(CFDI 입력 감지, CFDO 출력 On/Off 등)은 CFRASP.py 라이브러리를 통해 제어됩니다.
  • Python(main.py) 코드에서 CFRASP의 함수들을 호출하여 하드웨어 상태를 읽고 쓰게 됩니다.

UI는 Qt Designer로 제작한 .ui 파일을 기반으로 렌더링되며, UI에서 발생하는 모든 값과 상태 변화는 Modular Pi에서 실행되는 Python(main.py) 코드에 의해 처리합니다.
또한, 하드웨어 입·출력 제어는 CFRASP.py 라이브러리를 통해 Python(main.py) 코드에서 처리되며 CFNET I/O 모듈(CFDI, CFDO 등)에 전달됩니다.
즉, UI(.ui 파일) 동작 ↔ Python 프로그램(main.py) 로직 ↔ CFNET I/O 제어(CFRASP.py)로 연결되는 구조로 HMI 시스템이 동작합니다.

UI 위젯 객체 연결(프론트엔드)

1.) UI Form 구성

Qt Designer에서 제공하는 각종 위젯을 드래그 앤 드롭 방식으로 Form에 배치하여 UI를 디자인합니다.

2.) 위젯 객체 이름 정의

버튼(Button), 라벨(Label/램프 이미지), 텍스트(Text) 등 UI 요소는 사용자가 지정한 객체 이름(Object Name) 으로 .ui 파일에 저장됩니다.

Python 프로그램 로직 (백엔드)

HMI 프로젝트를 구성할 때에는 'main.py', 'UI 파일(.ui)', 'CFRASP.py'의 총 3개 파일이 Modular Pi의 프로젝트 폴더에 포함되어 있어야 합니다.
main.py 프로그램 로직은 QTimer를 사용하여 300ms 주기로 CFDI의 0번 포트 입력 값을 읽어 UI에 반영하며, 사용자가 버튼을 눌렀을 때는 CFDO의 0번 포트에 ON/OFF 출력 신호를 전송하는 역할을 합니다.

[main.py 전체 코드 보기]

1.) main.py 코드 구조

HMI 프로그램의 기본 환경을 설정하며, 프로그램의 실행 경로를 기준으로 UI 파일(.ui)과 이미지 파일을 불러오고, PyQt UI 구성을 위한 클래스(form_class)를 생성하는 역할을 합니다.
또한, CFNET I/O 제어 라이브러리를 사용할 수 있도록 준비합니다.

2.) 메인 UI폼 클래스 구조 및 처리로직(MyWindow 클래스)

MyWindow 클래스는 QMainWindowform_class를 상속하여 메인 화면을 구성합니다.
이 클레스에서 로직동작이 처리되며, 버튼 클릭 이벤트, CFDI, DO 입출력 처리및 모니터링이 처리됩니다. 또한 변경된 UI이를 반영합니다.

  • .ui 파일에서 정의된 위젯 객체 이름(버튼, 램프(Label) 등)을 Python 코드에서 불러와, 각 위젯에 해당 기능 로직을 연결하는 방식으로 프로그램이 구성됩니다.
  • 클래스 내부에서 버튼 클릭 이벤트 , CFDI 입력 모니터링, CFDO 출력 제어 로직이 CFNET 객체와 연동되어 실제 장비 제어가 수행됩니다.
  • QTimer를 통해 읽어온 입력 상태에 따라 램프 이미지를 갱신하는 등, 변경된 하드웨어 상태를 UI에 실시간으로 반영하는 역할을 합니다.

Python을 이용한 CFNET I/O 개발