Modbus 기초 Modbus

Modbus는 대부분의 건물 자동화 기술보다 오래되었습니다. Modicon은 프로그래머블 컨트롤러와 호스트가 직렬 회선을 통해 몇 가지 값을 주고받도록 1979년에 Modbus를 공개했습니다. 거의 변하지 않은 같은 프로토콜이 이제 현장의 수많은 BMS 연계 장비 사이에서 측정값을 전달합니다. 가변 주파수 드라이브(VFD), 전력량계, BTU 계량기, 자체 컨트롤러가 있는 패키지 장비, 다른 시스템에서 통합하지 않는 여러 소형 특수 장비가 Modbus를 사용할 수 있습니다. 장비를 통합한다면 반드시 접하게 됩니다. 이 페이지는 Modbus 레지스터 뷰어 각주에서 안내하는 기초 설명입니다.

Modbus인 것과 아닌 것

Modbus의 핵심은 두 가지입니다. "이 위치들을 읽어라" 또는 "이 위치에 써라"라고 지정하는 소수의 기능 코드와, 읽고 쓸 위치로 구성된 작은 데이터 모델입니다. 메시지가 직렬 회선(Modbus RTU)을 통과하는지 Ethernet TCP 연결(Modbus TCP)을 통과하는지에 따라 전송 방식과 메시지 주변의 프레이밍이 바뀝니다. 기능 코드와 데이터 모델은 바뀌지 않습니다. 어느 방식이든 같은 아홉 개 또는 열 개의 기능 코드가 동작합니다.

Modbus는 자기 기술형 프로토콜이 아닙니다. BACnet 객체는 자신의 유형, 단위, 스케일, 이름을 알고 있지만 Modbus 레지스터는 단지 16비트입니다. 통신망에는 홀딩 레지스터 12가 화씨 온도의 십분의 일 단위인지, 값 524가 52.4 °F를 뜻하는지 알려 주는 정보가 없습니다. 이 매핑은 제조사 문서에만 있습니다. Modbus는 의도적으로 단순합니다. 프로토콜은 간단하게 유지하고 장치 매뉴얼이 의미 정보를 담당합니다. 매뉴얼을 잃으면 의미 없는 데이터만 남습니다.

Modbus는 하나의 클라이언트가 하나 이상의 서버와 통신한다고 가정합니다. 기존 문서에서는 마스터/슬레이브라고 부르지만 명칭만 바뀌었을 뿐 기능 코드와 배선은 같습니다. 모든 통신은 클라이언트가 특정 서버 주소로 요청을 보내면서 시작됩니다. 서버는 응답을 반환한 뒤 다음 요청이 올 때까지 조용히 기다립니다. 서버는 통신을 개시하지 않으므로 "방금 값이 바뀌었다"라는 비동기 알림이 없습니다. 제어 시퀀스에서 새 값을 빠르게 확인해야 한다면 클라이언트가 변경을 포착할 만큼 자주 폴링해야 합니다.

Modbus 클라이언트-서버 메시지 흐름 두 상자가 나란히 있습니다. 왼쪽 상자는 클라이언트, 오른쪽 상자는 서버로 표시됩니다. 위쪽 요청 화살표는 클라이언트에서 서버로 이어지며, 예시로 기능 코드 03을 사용해 주소 0부터 홀딩 레지스터 열 개를 읽습니다. 아래쪽 응답 화살표는 서버에서 클라이언트로 돌아오며 레지스터 값 열 개를 전달합니다. 서버는 스스로 송신하지 않고 클라이언트가 폴링하면 응답합니다. 클라이언트 (마스터) 서버 (슬레이브) 요청 "FC03: 레지스터 10개를 0부터 읽기" 응답 "레지스터 값 10개" 클라이언트가 폴링하고 서버는 응답만 합니다

네 가지 데이터 테이블

데이터 모델에는 네 가지 테이블이 있으며 두 기준으로 나뉩니다. 각 항목이 무엇인지(단일 비트 또는 16비트 워드), 그리고 클라이언트가 값을 쓸 수 있는지 읽기만 가능한지입니다. 단일 비트 테이블인 코일과 이산 입력은 레지스터보다 먼저 생겼습니다. 릴레이 방식 컨트롤러에서 "코일"은 마스터가 쓸 수 있는 제어 릴레이의 여자 코일을, "이산 입력"은 읽기만 가능한 접점 입력을 뜻했습니다. 16비트 테이블인 입력 레지스터와 홀딩 레지스터에는 아날로그 값이 들어갑니다.

코일 · 1비트 · 읽기/쓰기

쓰기가 가능한 비트입니다. 활성화, 강제 조작, 명령 상태에 사용합니다. FC01로 읽고 FC05(하나) 또는 FC15(여러 개)로 씁니다. 현대 BMS 장비에서는 드물지만 기존 산업용 컨트롤러에서는 흔합니다.

이산 입력 · 1비트 · 읽기 전용

읽기 전용 비트입니다. 스위치 위치, 상태 플래그, , 경보 비트에 사용합니다. FC02로 읽습니다. 서버가 값을 보고하며 클라이언트는 변경할 수 없습니다.

입력 레지스터 · 16비트 · 읽기 전용

읽기 전용 16비트 값입니다. 센서 측정값, 계측값, 계산된 피드백에 사용합니다. FC04로 읽습니다. VFD에서는 일반적으로 속도 피드백이 여기에 들어갑니다.

홀딩 레지스터 · 16비트 · 읽기/쓰기

읽기와 쓰기가 가능한 16비트 값입니다. 설정값, 명령, 구성에 사용합니다. FC03으로 읽고 FC06(하나) 또는 FC16(여러 개)으로 씁니다. VFD에서는 속도 명령이 여기에 들어갑니다.

오래전에 정해진 이름을 가진 네 테이블은 서로 독립적으로 주소를 지정합니다. 입력 테이블의 레지스터 0과 홀딩 테이블의 레지스터 0은 서로 다른 저장 위치입니다. 주소만으로는 테이블을 알 수 없으며, 어떤 테이블에 동작할지 지정하는 기능 코드가 이를 결정합니다. 다음 절에서 기능 코드를 설명합니다.

기능 코드 — 읽기와 쓰기

각 테이블에는 읽기용 기능 코드와, 쓰기가 가능한 경우 쓰기용 기능 코드가 있습니다. 읽기 기능 코드는 한 번의 요청으로 최대 수백 개 항목을 반환할 수 있습니다. 프로토콜상 한 번에 읽을 수 있는 최대 개수는 코일 2000개, 레지스터 125개이지만 대부분의 장치는 문서에 더 엄격한 제한을 명시합니다. 쓰기에는 단일 쓰기와 다중 쓰기가 있으므로, 레지스터 하나의 설정값을 갱신할 때 전체 블록을 함께 보낼 필요가 없습니다.

건물 제어에서 가장 자주 접하는 조합은 홀딩 레지스터용 FC03 / FC16(설정값이나 명령을 읽고 씀)과 입력 레지스터용 FC04(센서 값을 읽음)입니다. 한 번에 레지스터 하나만 변경할 때는 FC06을 사용합니다. 비트 테이블용 기능 코드인 FC01, FC02, FC05, FC15는 BMS 업무보다 오래된 산업 장비에서 더 자주 보입니다. 전체 목록은 Modbus 레지스터 뷰어 도구의 참조 패널에 있습니다. 이 페이지에서는 목록을 다시 싣지 않고 참조 자료로 안내합니다.

모든 요청의 형태는 같습니다. Modbus RTU에서 바이트 순서는 서버 주소(버스의 어느 장치인지), 기능 코드(무엇을 할지), 기능에 따라 내용이 달라지는 데이터 필드(어느 레지스터인지, 몇 개인지, 어떤 값인지), 그리고 회선 오류 검출을 위한 끝의 2바이트 CRC입니다. Modbus TCP는 같은 기능 코드와 데이터 페이로드를 작은 TCP 헤더로 감싸고 CRC는 생략합니다. TCP가 이미 오류 검출을 처리하기 때문입니다. 두 전송 방식이 사용하는 언어는 같고 봉투만 다릅니다.

Modbus RTU의 FC03 읽기 요청 Modbus RTU의 FC03 읽기 요청을 나타내는 여덟 개의 바이트가 이름표와 함께 한 줄로 배치되어 있습니다. 첫 번째 바이트는 서버 주소이며, 여기서는 버스의 1번 장치를 뜻하는 0x01입니다. 두 번째 바이트는 기능 코드이며, 여기서는 홀딩 레지스터 읽기를 뜻하는 0x03입니다. 세 번째와 네 번째 바이트는 16비트 값으로 표현한 시작 레지스터 주소이며, 여기서는 0입니다. 다섯 번째와 여섯 번째 바이트는 읽을 레지스터 수이며, 여기서는 10개입니다. 일곱 번째와 여덟 번째 바이트는 오류 검출용 CRC입니다. 괄호가 세 번째와 네 번째 바이트를 "시작 주소" 아래에, 다섯 번째와 여섯 번째 바이트를 "수량" 아래에 묶습니다. 0x01 서버 장치 #1 0x03 FC 홀딩 레지스터 읽기 0x00 0x00 0x00 0x0A CRC CRC CRC (2 B) RTU 전용 시작 주소 (0) 수량 (10) "장치 #1에서 홀딩 레지스터 10개를 주소 0부터 읽기"

응답에는 같은 서버 주소와 되돌려 보낸 기능 코드, 바이트 수, 요청한 값들이 차례로 들어갑니다. 요청에는 2바이트 시작 주소와 수량이, 응답에는 여러 바이트의 페이로드가 들어갑니다. 이것이 통신 회선에서 볼 수 있는 Modbus 요청 형태의 대부분입니다.

문제가 생겼을 때 — 예외 응답

서버가 요청을 수행할 수 없거나 수행하지 않을 때는 데이터 대신 예외 응답을 반환합니다. 형식은 의도적으로 단순합니다. 최상위 비트를 설정한 기능 코드를 되돌려 보내고(FC 0x03은 0x83으로 돌아옴), 무엇이 잘못되었는지 나타내는 1바이트 예외 코드를 뒤에 붙입니다.

Modbus 예외 응답 Modbus 예외 응답을 나타내는 세 개의 바이트가 이름표와 함께 한 줄로 배치되어 있습니다. 첫 번째 바이트는 서버 주소 0x01입니다. 두 번째 바이트는 최상위 비트를 설정한 원래 기능 코드로, 여기서는 0x83이며 원래 값은 0x03입니다. 최상위 비트 표시는 모든 예외에 공통되는 신호입니다. 세 번째 바이트는 예외 코드이며, 여기서는 잘못된 데이터 주소를 뜻하는 0x02입니다. "최상위 비트 설정"이라는 이름표가 붙은 화살표가 최상위 비트 바이트를 가리킵니다. 0x01 서버 0x83 FC | 0x80 0x02 예외 최상위 비트 설정 FC 0x03 → 0x83 "전송한 FC03 요청 실패 — 잘못된 데이터 주소"

건물 제어에서 가장 자주 접하는 예외 코드는 다음과 같습니다.

  • 0x01 잘못된 기능. 서버가 이 기능 코드를 전혀 구현하지 않았습니다. 쓰기를 지원하지 않는 읽기 전용 센서 서버에 FC06(단일 레지스터 쓰기)을 요청하면 이 코드가 반환됩니다. 기능 자체가 서버의 기능표에 없습니다. 기능은 지원하지만 주소만 잘못된 아래의 0x02와 구분해야 합니다.
  • 0x02 잘못된 데이터 주소. 기능 코드는 올바르지만 주소가 장치 문서에 명시된 범위를 벗어났습니다. 제조사 매뉴얼에 홀딩 레지스터 0–127만 기재되어 있는데 클라이언트가 레지스터 200을 요청하면 이 코드가 반환됩니다.
  • 0x03 잘못된 데이터 값. 주소는 올바르지만 쓰려는 값이 잘못되었습니다. 범위가 0–100 %인 설정값 레지스터에 200을 쓰는 경우가 대표적인 예입니다.
  • 0x04 서버 실패. 센서 고장, 여러 보드로 구성된 장치 내부의 통신 문제, 보조 프로세서의 무응답 같은 장치 내부 오류입니다. 장치가 의미 있는 응답을 만들 수 없음을 알리는 것입니다.

더 높은 코드(0x05부터 0x0B까지)는 확인 후 재시도, 대상 장치 사용 중, 게이트웨이 라우팅 관련 상태를 나타냅니다. 대부분의 BMS 기술자는 다른 코드보다 0x02와 0x03을 더 자주 접하며, 기능 코드를 잘못 입력하거나 레지스터를 잘못된 테이블에 매핑하면 0x01을 접하게 됩니다.

되돌려 보낸 기능 코드의 최상위 비트가 설정되어 있지 않으면 정상 응답이며, 뒤따르는 바이트가 요청한 데이터입니다. 최상위 비트가 설정된 응답은 공통적으로 "다음 바이트가 오류 코드이므로 확인하라"는 신호입니다.

이 페이지에서 다루지 않은 내용

여기까지가 메시지 형태와 데이터 모델입니다. 제조사의 Modbus 연계 표를 읽고, 요청을 구성하고, 돌아온 예외를 알아보기에 충분한 내용입니다. 다음 질문은 Modbus 레지스터 뷰어 도구가 다루는 핵심입니다. 응답은 정상적으로 돌아왔는데, 이 16비트는 실제로 무엇을 뜻할까요? 5자리 레지스터 번호 규칙(매뉴얼의 40001은 통신상 홀딩 레지스터 0), 부호 있는 값과 부호 없는 값의 해석, 네 가지 바이트 순서가 가능한 두 레지스터 길이의 32비트 값, 원시 정수를 공학 단위로 바꾸는 스케일 계수를 Modbus 디코딩 동반 학습 페이지에서 하나씩 설명합니다.

← 학습 자료로 돌아가기