본문 바로가기
QMachineStudio

QMachineStudio Modbus TCP 통신 완전 가이드 (실제 샘플 코드 기반)

by ictlab 2026. 3. 30.

 

 

 

QMachineStudio에서 Modbus TCP 통신을 구현하려면
👉 COM 객체 + UI 이벤트 + 데이터 변수 구조
이 3가지를 이해하면 됩니다.

이번 글에서는 실제 제공된 샘플 소스를 기반으로
👉 연결 → 읽기 → 쓰기 → UI 연동까지 전체 흐름을 설명합니다.


🖥️ 1. 전체 구조 이해 (샘플 기준)

샘플 코드에서 핵심 변수는 다음과 같습니다:

 
bool IsClientConnected

int Slave = 1
int Address = 0

bool BitData
bool InputBitDat

int WordInputDataRead
int WordData

array BitDataArray[8] = {OFF}
 
 
 
 

👉 핵심 포인트:

  • Slave → Modbus Slave ID
  • Address → 시작 주소
  • BitData / WordData → 실제 통신 데이터
  • BitDataArray → 여러 Bit 읽기

📌 즉, UI와 1:1 매핑되는 구조입니다.


🔌 2. Modbus 연결 / 해제

✔ 연결 버튼

 
FUNCTION OnConnectClick(string sender, int tag , array params)
{
COM["ModBus"].Close()
COM["ModBus"].Address = SS.Address
COM["ModBus"].Port = SS.Port
COM["ModBus"].Open()

SYS.SaveSetupParam()
}
 
 
 
 

🔍 설명

  • 기존 연결 종료 후 재연결
  • UI 입력값 → Address / Port 적용
  • 설정값 저장

👉 실무 핵심:

연결 전에 반드시 Close() 호출


✔ 연결 해제

FUNCTION OnDisConnectClick(string sender, int tag , array params)
{
COM["ModBus"].Close()
}
 
 
 
 
 
 

✔ 연결 상태 체크

FUNCTION OnTimer(string sender, int tag , array params)
{
	IsClientConnected = COM["ModBus"].IsOpen()
}
 
 
 

👉 UI 상태 표시용


🔘 3. Coil (Bit) 제어

✔ Bit Read

FUNCTION OnReadBit(string sender, int tag , array params)
{
    if( COM["ModBus"].ReadDataBit(Slave, Address, BitData) == false )
    {
   		LogError($"ReadDataBit Error")
    }
}
 
 

👉 Coil Read (Function Code 01)


✔ Bit Toggle (Write)

 
FUNCTION OnToggleBit(string sender, int tag , array params)
{
    BitData = !BitData

    if( COM["ModBus"].WriteDataBit(Slave, Address, BitData) == false )
    {
    LogError($"WriteDataBit Error")
    }
}
 

👉 Coil Write (Function Code 05)

📌 포인트:

  • UI Toggle 버튼과 1:1 매칭
  • 내부 변수 먼저 변경 후 Write

📥 4. Discrete Input Read

FUNCTION OnReadDiscreteInputBit(string sender, int tag , array params)
{
    if( COM["ModBus"].ReadInputDataBit(Slave, Address, InputBitDat) == false )
    {
    LogError($"ReadInputDataBit Error")
    }
}
 

👉 Read Only Bit


🔢 5. Register 데이터 처리

✔ Input Register (Read Only)

 
FUNCTION OnReadInputWord(string sender, int tag , array params)
{
    if( COM["ModBus"].ReadInputDataWord(Slave, Address, WordInputDataRead) == false )
    {
    LogError($"ReadInputDataWordError")
    }
}
 

✔ Holding Register Read

 
FUNCTION OnReadHoldingWord(string sender, int tag , array params)
{
    if( COM["ModBus"].ReadDataWord(Slave, Address, WordData) == false )
    {
    	LogError($"ReadDataWord Error")
    }
}

✔ Holding Register Write

 
FUNCTION OnWriteWord(string sender, int tag , array params)
{
    if( COM["ModBus"].WriteDataWord(Slave, Address, WordData) == false )
    {
    	LogError($"WriteDataWord Error")
    }
    }

👉 PLC 데이터 제어 핵심


🔢 6. Bit Array 읽기 (실무에서 많이 씀)

 
FUNCTION OnTest1(string sender, int tag , array params)
{
    if( COM["ModBus"].ReadDataBitArray(Slave, Address, 8, BitDataArray) == false )
    {
    	LogError($"ReadDataBitArray Error")
    }
}
 

👉 여러 Coil 한번에 읽기

📌 활용 예:

  • 상태 비트 묶음 읽기
  • 설비 상태 Monitoring

🧠 7. 전체 흐름 정리

Modbus 통신 흐름은 매우 단순합니다:

[1] Connect
[2] Address / Slave 설정
[3] Read or Write 함수 호출
[4] 결과 → 변수 저장 → UI 표시
 

⚠️ 8. 실무에서 꼭 알아야 할 포인트

✔ 1. COM 객체가 모든 통신 담당

 
COM["ModBus"]
 

✔ 2. 함수 이름으로 Modbus 기능 구분

함수의미
ReadDataBit Coil Read
WriteDataBit Coil Write
ReadInputDataBit DI Read
ReadInputDataWord Input Register
ReadDataWord Holding Read
WriteDataWord Holding Write

✔ 3. 실패 시 반드시 로그 처리

 
LogError($"ReadDataWord Error")
 

👉 현장에서 매우 중요


✔ 4. UI ↔ 변수 ↔ 통신 구조

UI 버튼 → Function 호출 → COM 통신 → 변수 저장 → UI 표시
 

🚀 9. 실전 활용 예

✔ PLC ON/OFF 제어

 
WriteDataBit 장비 Start / Stop
 

✔ 상태 확인

 
ReadDataBitArray 설비 상태 모니터링
 

✔ 데이터 전달

 
WriteDataWord 생산 수량 전달
 

💡 10. 개발 팁

  • Timer에서 Polling 구현 가능
  • Bit Array로 성능 최적화
  • Address는 반드시 PLC와 매칭

✅ 결론

QMachineStudio에서 Modbus 통신은 생각보다 단순합니다.

👉 핵심 3가지:

  1. COM 객체 사용
  2. 함수 기반 Modbus API 활용
  3. UI 이벤트와 연결

 

 

📡 Modbus Function 간단 설명 (Function Code 포함)

🔘 1. Coil (출력 Bit)

  • Function Code: 01 (Read), 05 (Write)
  • 설명: ON/OFF 제어용 Bit
  • 사용: 장비 시작, 밸브, 모터 ON/OFF
  • 👉 읽기 + 쓰기 가능

📥 2. Discrete Input (입력 Bit)

  • Function Code: 02
  • 설명: 센서 입력 상태
  • 사용: 리미트 센서, 버튼 상태 확인
  • 👉 읽기만 가능

🔢 3. Input Register (입력 Word)

  • Function Code: 04
  • 설명: 아날로그 값 (숫자 데이터)
  • 사용: 온도, 압력, 무게 등
  • 👉 읽기만 가능

🧠 4. Holding Register (출력 Word)

  • Function Code: 03 (Read), 06 (Write)
  • 설명: PLC 내부 데이터
  • 사용: 설정값, 속도, 카운트 값
  • 👉 읽기 + 쓰기 가능 (가장 많이 사용)

🎯 핵심 정리

  • 01 / 05 → Bit 제어 (Coil)
  • 02 → 입력 Bit (센서)
  • 04 → 입력 Word (센서 값)
  • 03 / 06 → Word 데이터 제어 (PLC 값)