C#으로 HMI와 SCADA를 직접 개발하는 것은 충분히 가능하다. 특히 중소 제조업용 설비 모니터링, 생산실적 수집, 알람 관리, FEMS·MES 연동 시스템에 적합하다.
다만 HMI 화면 프로그램 하나에 PLC 통신, 데이터 저장, 알람, 관제 기능을 모두 넣어서는 안 된다. 통신 수집 서비스와 사용자 화면을 분리해야 안정적으로 운영할 수 있다.
1. 개발 목표
C# 기반 HMI·SCADA는 다음과 같이 정의할 수 있다.
- HMI: 개별 설비 운전과 상태 확인
- SCADA: 여러 설비의 통합 감시
- 데이터 수집: PLC·센서 값 실시간 수집
- Historian: 수집 데이터 장기 저장
- 알람: 이상 발생·확인·복구 관리
- 연동: MES·FEMS·ERP에 데이터 제공
초기에는 소규모 시스템으로 시작하고 설비와 기능을 단계적으로 확장하는 방식이 좋다.
2. 권장 시스템 구조
핵심은 PLC 통신을 HMI 화면에서 직접 수행하지 않는 것이다.
HMI 화면을 종료하거나 다시 실행하더라도 데이터 수집 서비스는 계속 작동해야 한다.
3. 권장 C# 기술 구성
| 개발언어 | C# |
| 런타임 | 지원 중인 .NET LTS |
| 현장 HMI | WPF 또는 WinForms |
| 중앙 SCADA | WPF 또는 ASP.NET Core |
| 모바일 조회 | .NET MAUI 또는 반응형 웹 |
| 수집 서비스 | .NET Worker Service |
| 실시간 전송 | SignalR |
| API | ASP.NET Core Web API |
| 데이터베이스 | MariaDB·PostgreSQL |
| 고속 이력 | TimescaleDB·InfluxDB 검토 |
| PLC 표준통신 | OPC UA |
| 범용통신 | Modbus TCP·Modbus RTU |
| IoT 통신 | MQTT |
| 로그 | Serilog·NLog |
| 차트 | Syncfusion·ScottPlot·LiveCharts |
| 설정관리 | JSON·데이터베이스 |
.NET Worker Service는 화면 없이 장시간 실행되는 수집 프로그램에 적합하며 Windows Service로 운영할 수 있다. Microsoft Worker Service 안내
SignalR를 사용하면 서버가 변경된 설비 데이터를 HMI와 웹 관제화면으로 즉시 전달할 수 있다. Microsoft SignalR 안내
4. WinForms와 WPF 선택
사용자가 현재 C# WinForms와 Syncfusion을 사용하고 있다면 초기 제품은 WinForms로 만들어도 충분하다.
WinForms가 적합한 경우
- 기존 공통 프로그램을 재사용할 때
- 중소형 제조설비에 적용할 때
- 개발기간을 단축해야 할 때
- 화면 디자인보다 업무 기능이 중요할 때
- 기존 MES Lite와 통합할 때
WPF가 적합한 경우
- 배관·공정 흐름을 그래픽으로 표현할 때
- 화면 확대와 해상도 대응이 필요할 때
- 애니메이션이 많은 관제화면
- 사용자 정의 HMI 편집기를 개발할 때
- 여러 종류의 화면 크기를 지원할 때
첫 제품은 WinForms로 개발하고, 그래픽 편집기나 대형 관제화면이 필요해질 때 WPF 또는 웹으로 확장하는 방법이 현실적이다.
5. 핵심 모듈 구성
통신 수집 서비스
PLC, 계측기, 센서로부터 데이터를 읽고 명령을 전달한다.
주요 기능은 다음과 같다.
- PLC 연결과 재연결
- 주기적인 데이터 읽기
- 값 쓰기
- 통신시간 초과 처리
- 장비별 통신상태 감시
- 통신 장애 기록
- 데이터 품질 관리
- 수집주기 관리
- 프로그램 자동 시작
수집 서비스에는 다음 인터페이스를 정의할 수 있다.
public interface IDeviceDriver
{
bool IsConnected { get; }
Task ConnectAsync(CancellationToken token);
Task DisconnectAsync();
Task<TagValue> ReadAsync(TagDefinition tag);
Task WriteAsync(TagDefinition tag, object value);
}
PLC 제조사마다 IDeviceDriver를 구현하면 상위 HMI와 SCADA는 PLC 종류를 몰라도 동일한 방식으로 데이터를 사용할 수 있다.
태그 엔진
SCADA에서 태그는 설비 데이터를 식별하는 기본 단위다.
예를 들면 다음과 같다.
- LINE01.MOTOR01.RUN
- LINE01.MOTOR01.ALARM
- LINE01.TEMP01.VALUE
- LINE01.PRODUCTION.COUNT
- LINE01.ENERGY.KWH
태그에는 다음 정보가 필요하다.
| 태그명 | 시스템 내부 고유 이름 |
| 장비 | 연결할 PLC 또는 계측기 |
| 주소 | PLC 메모리 주소 |
| 데이터형 | Bool·Int·Float·String |
| 수집주기 | 100ms·1초·10초 등 |
| 배율 | 원시값 변환계수 |
| 단위 | ℃·bar·kWh·rpm |
| 저장 여부 | 이력 저장 대상 |
| 읽기·쓰기 | 조작 가능 여부 |
| 알람 기준 | 상한·하한·상태 조건 |
태그는 프로그램 코드에 고정하지 않고 데이터베이스나 설정파일에서 관리해야 한다.
실시간 캐시
PLC에서 읽은 최신 값은 메모리 캐시에 보관한다.
화면마다 PLC를 직접 읽게 하면 다음 문제가 발생한다.
- PLC 통신 부하 증가
- 화면별 값 불일치
- 통신 장애 처리 중복
- 다수 클라이언트 연결 곤란
따라서 수집 서비스가 PLC를 한 번 읽고 HMI·SCADA·MES가 캐시된 값을 공유해야 한다.
알람 엔진
알람은 단순 메시지가 아니라 하나의 상태 흐름으로 관리해야 한다.
알람 정보에는 다음 항목을 저장한다.
- 알람 코드와 명칭
- 설비와 태그
- 중요도
- 발생시간
- 확인시간과 확인자
- 복구시간
- 지속시간
- 발생 당시 측정값
- 원인과 조치내용
- 반복 발생 횟수
Historian
Historian은 온도, 압력, 전력량 등의 시계열 데이터를 저장하는 기능이다.
모든 값을 매 순간 저장하면 데이터가 지나치게 증가한다. 다음 저장 조건을 조합해야 한다.
- 일정 주기 저장
- 값이 변경됐을 때 저장
- 설정 범위 이상 변할 때 저장
- 알람 발생 전후 집중 저장
- 최소·최대·평균값으로 집계
예를 들어 100개 태그를 1초마다 저장하면 하루에 약 864만 건이 발생한다. 수집주기와 보관정책 설계가 중요하다.
6. HMI 화면 구성
현장 HMI는 다음 화면으로 구성할 수 있다.
메인 운전화면
- 설비 운전·정지
- 자동·수동 전환
- 현재 생산품
- 생산수량
- 설비 상태
- 주요 설정값
- 현재 알람
- PLC 통신상태
설비 상세화면
- 모터·센서·밸브 상태
- 온도·압력·속도
- 수동조작
- 인터록 상태
- 장비별 알람
알람 화면
- 현재 알람
- 미확인 알람
- 알람 이력
- 발생 원인
- 조치방법
- 작업자 확인
트렌드 화면
- 실시간 그래프
- 기간별 조회
- 태그 비교
- 확대·축소
- CSV·Excel 내보내기
레시피 화면
- 제품별 설정값
- 레시피 등록·변경
- PLC 전송
- 변경 전후 비교
- 변경 이력
유지보수 화면
- PLC 연결상태
- 태그별 현재값
- 통신 응답시간
- 강제 쓰기
- 설비 가동시간
- 부품 교환주기
강제 쓰기 기능은 관리자에게만 허용하고 모든 조작을 기록해야 한다.
7. SCADA 관제화면 구성
SCADA에서는 여러 설비를 통합해 보여준다.
- 전체 공장 배치도
- 라인별 운전현황
- 설비 가동률
- 생산량과 불량률
- 현재 알람 현황
- 비가동 설비 목록
- 전력과 에너지 사용량
- 통신 장애 현황
- 기간별 추세
- 운전일보와 월보
대형 모니터에 표시할 관제화면과 관리자가 사용하는 조회화면을 분리하는 것이 좋다.
8. PLC 통신 방법
OPC UA
여러 제조사의 PLC와 표준화된 방식으로 연결할 때 적합하다.
- 데이터 읽기·쓰기
- 이벤트와 구독
- 인증서 기반 보안
- 제조사 독립적인 태그 구성
- 암호화 통신
OPC Foundation은 C#에서 사용할 수 있는 UA .NET Standard 구현을 제공한다. OPC UA .NET 안내
Modbus TCP·RTU
전력계, 온도조절기, 인버터, 계측기 연결에 많이 사용한다.
- 구현이 비교적 단순함
- 여러 장비에서 지원
- TCP와 RS-485 방식 사용
- 주소와 데이터 변환 관리 필요
Modbus 자체에는 강력한 인증과 암호화가 없으므로 외부망에 직접 노출해서는 안 된다.
제조사 전용 프로토콜
- Siemens S7
- Mitsubishi MC Protocol
- LS XGT
- Omron FINS
- Allen-Bradley EtherNet/IP
직접 구현할 수도 있지만, 실제 납품 제품이라면 검증된 상용 드라이버 또는 OPC 서버 사용도 검토해야 한다.
MQTT
공장 간 데이터 전송, 원격설비, 클라우드 연동에 적합하다. MQTTnet은 C#용 MQTT 클라이언트와 서버 기능을 제공한다. MQTTnet 프로젝트
9. 프로젝트 구조 예시
eScada.sln
├─ eScada.Domain
│ ├─ Devices
│ ├─ Tags
│ ├─ Alarms
│ └─ Historian
├─ eScada.Drivers
│ ├─ Modbus
│ ├─ OpcUa
│ ├─ Mitsubishi
│ └─ LsElectric
├─ eScada.Collector
│ └─ Windows Service
├─ eScada.Application
│ ├─ TagEngine
│ ├─ AlarmEngine
│ └─ RecipeEngine
├─ eScada.Infrastructure
│ ├─ MariaDb
│ ├─ Logging
│ └─ Security
├─ eScada.Api
│ ├─ Web API
│ └─ SignalR
├─ eScada.Hmi
│ └─ WinForms
├─ eScada.Monitor
│ └─ Web or WPF
└─ eScada.Tests
이렇게 구성하면 통신 드라이버, 수집 서비스, HMI, SCADA 관제를 각각 독립적으로 시험하고 교체할 수 있다.
10. 데이터베이스 구성
최소한 다음 테이블이 필요하다.
| Device | PLC·계측기 정보 |
| DeviceChannel | IP·포트·통신 설정 |
| Tag | 태그와 주소 |
| TagGroup | 태그 그룹 |
| TagHistory | 측정값 이력 |
| AlarmRule | 알람 발생 조건 |
| AlarmHistory | 알람 이력 |
| Recipe | 레시피 기본정보 |
| RecipeValue | 제품별 설정값 |
| User | 사용자 |
| Role | 권한 |
| OperationLog | 조작 이력 |
| SystemLog | 시스템 장애 이력 |
기존 MES Lite의 유연한 데이터 구조를 일부 활용할 수 있지만, 초당 대량으로 발생하는 태그 이력은 업무용 eData와 분리하는 것을 권장한다.
11. 반드시 적용해야 할 안전 원칙
HMI와 SCADA는 설비 제어에 영향을 주므로 일반 업무 프로그램보다 엄격하게 설계해야 한다.
- 비상정지는 하드웨어 회로로 구성
- 안전 인터록은 PLC에서 처리
- HMI 장애 시에도 PLC 운전 유지
- 잘못된 값 입력 범위 제한
- 중요 명령은 재확인
- 현장·원격 운전모드 구분
- 사용자별 제어 권한 설정
- 모든 값 변경과 조작 기록
- 통신 장애 시 임의값 생성 금지
- 현재값의 품질과 수집시간 표시
- 재연결 후 명령 자동 재전송 금지
- 제어망과 업무망 분리
- 데이터베이스 장애 시 로컬 임시저장
화면에 마지막 정상값이 남아 있으면 작업자가 현재값으로 오해할 수 있다. 통신이 끊어진 값에는 반드시 Bad, Disconnected, 마지막 수집시간 등을 표시해야 한다.
12. 개발 단계
1단계: HMI MVP
- PLC 1종 연결
- 태그 등록
- 실시간 값 조회
- 운전·정지 명령
- 통신상태 표시
- 현재 알람
- 조작 이력
2단계: 소형 SCADA
- 여러 PLC 연결
- 수집 Windows Service
- 태그 이력 저장
- 알람 확인·복구
- 실시간·과거 트렌드
- 사용자 권한
- 설비 통합현황
3단계: 관리 기능
- 레시피 관리
- 보고서
- 설비 가동률
- 비가동 분석
- 웹 관제
- 문자·이메일 알림
4단계: MES·FEMS 연동
- 작업지시 수신
- 생산실적 전송
- LOT 연결
- 전력량 수집
- 제품별 에너지 원단위
- 설비 예방보전
- AI 이상징후 분석
13. 예상 개발기간
| PLC 1종 HMI 시제품 | 1~2개월 |
| 소형 HMI 제품 | 3~5개월 |
| 기본 SCADA | 5~8개월 |
| 화면 편집기 포함 제품 | 10~18개월 |
| 상용 범용 SCADA | 2년 이상 |
기존 WinForms 공통기능과 MES Lite의 사용자·권한·메뉴·로그 기능을 재사용하면 개발기간을 줄일 수 있다.
14. 현실적인 개발 방향
처음부터 Siemens WinCC나 Ignition 같은 범용 SCADA를 만드는 것은 범위가 너무 크다.
현재 기술환경에서는 다음과 같은 제품이 현실적이다.
중소 제조업용 C# 기반 경량 HMI·SCADA
PLC와 계측기 데이터를 수집하고 설비상태, 알람, 트렌드, 생산량, 에너지 정보를 통합 관리하며 MES Lite와 연동하는 시스템
초기 지원 범위도 제한하는 것이 좋다.
- LS PLC
- Mitsubishi PLC
- Modbus TCP·RTU
- OPC UA
- MariaDB
- WinForms 현장 HMI
- 웹 기반 통합관제
- MES Lite·FEMS 연동
결론
C#으로 HMI와 SCADA를 개발한다면 화면보다 먼저 통신 수집 서비스, 태그 엔진, 알람 엔진과 데이터 저장구조를 설계해야 한다.
사용자의 기존 C# WinForms, MariaDB, Syncfusion, MES Lite 개발환경을 고려하면 WinForms HMI + Worker Service 수집기 + ASP.NET Core 관제 + MariaDB 구성이 가장 현실적이다.
제품명은 기존 브랜드와 연결해 다음과 같이 구성할 수 있다.
- eHMI: 현장 설비 조작
- eSCADA: 공장 통합관제
- eHMI SCADA Lite: 중소 제조업 통합제품
- eFactory Monitor: 생산·설비 통합감시
- MES Lite Equipment: MES 연동 설비수집 모듈
'디지털 전환 솔루션 > HMI & SCADA' 카테고리의 다른 글
| eHMI 전문 HMI 시스템 개괄 설계 (0) | 2026.08.03 |
|---|---|
| 전문적인 산업용 HMI를 개발한다면 (0) | 2026.08.03 |
| MES Lite 설비관리를 기반으로 유연한 HMI 개발하기 (0) | 2026.08.03 |
| SCADA란? (0) | 2026.08.03 |
| HMI란 무엇인가? 주요 기능·제품·가격 정리 (0) | 2026.08.03 |