Table of Contents
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 동작 방식 및 구성
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 전체 코드 보기]
☞ [main.py 전체 코드 보기]
1.) main.py 코드 구조
HMI 프로그램의 기본 환경을 설정하며, 프로그램의 실행 경로를 기준으로 UI 파일(.ui)과 이미지 파일을 불러오고, PyQt UI 구성을 위한 클래스(form_class)를 생성하는 역할을 합니다.
또한, CFNET I/O 제어 라이브러리를 사용할 수 있도록 준비합니다.
2.) 메인 UI폼 클래스 구조 및 처리로직(MyWindow 클래스)
MyWindow 클래스는 QMainWindow와 form_class를 상속하여 메인 화면을 구성합니다.
이 클레스에서 로직동작이 처리되며, 버튼 클릭 이벤트, CFDI, DO 입출력 처리및 모니터링이 처리됩니다. 또한 변경된 UI이를 반영합니다.
- .ui 파일에서 정의된 위젯 객체 이름(버튼, 램프(Label) 등)을 Python 코드에서 불러와, 각 위젯에 해당 기능 로직을 연결하는 방식으로 프로그램이 구성됩니다.
- 클래스 내부에서 버튼 클릭 이벤트 , CFDI 입력 모니터링, CFDO 출력 제어 로직이 CFNET 객체와 연동되어 실제 장비 제어가 수행됩니다.
- QTimer를 통해 읽어온 입력 상태에 따라 램프 이미지를 갱신하는 등, 변경된 하드웨어 상태를 UI에 실시간으로 반영하는 역할을 합니다.
