원본 사이트 : https://en.wikipedia.org/wiki/Modbus
소개
MODBUS는 Modicon(현재는 Schneider Electric)에서 PLC(Programmable Logic Controllers)와 함께 사용하기 위해 1979년에 발표한 데이터 통신 프로토콜이다. MODBUS는 사실상 표준 통신 프로토콜이 되었으며, 이제는 산업용 전자 장치를 연결하는 일반적인 사용 가능한 방법이다.
MODBUS는 공개적으로 배포되고 로열티가 없기 때문에 산업 환경에서 인기가 많다. 산업용으로 개발되어서 다른 표준에 비해 배포 및 유지 관리가 비교적 쉽고 전송할 데이터 형식에 대한 제한도 거의 없다.
MODBUS 프로토콜은 전송 계층으로 character serial communication lines(시리얼 라인), Ethernet이나 Internet protocol suit(인터넷 프로토콜을 사용하는 제품군)을 사용한다. MODBUS는 여러 장치와 동일한 케이블이나 이더넷 네트워크와 연결된 통신을 지원한다. 예를 들어 온도를 측정하는 장치와 습도를 측정하는 다른 장치가 동일한 케이블에 연결될 수 있고 둘 다 MODBUS를 통해 동일한 컴퓨터에 측정값을 전달할 수 있다.
MODBUS는 SCADA(supervisory control and data acquisition) 시스템에서 RTU(remote terminal unit)와 plant/system supervisory 컴퓨터를 연결하는 데 자주 사용된다. 많은 데이터 유형이 릴레이 구동에 사용되기 때문에 ladder logic과 같은 공장 장치의 산업 제어에서 이름이 지정된다. 단일 비트의 물리적 출력을 코일(coil)이라고 하고, 단일 비트의 물리적 입력을 discrete input이나 contact 입력이라고 한다.
MODBUS 프로토콜의 개발 및 업데이트는 Schneider Electric이 Modbus Organization에 권한을 양도하여, 2004년 4월부터 Modbus Organization에 의해 관리되고 있다. Modbus Organization은 기술의 지속적인 사용을 장려하는 MODBUS 호환 장치 사용자와 공급 업체를 위한 협회이다. Modbus Organization, Inc.는 MODBUS 프로토콜의 홍보와 개발을 위한 무역 협회이다.
목 차
- 제한 사항
- MODBUS 객체 유형
- 프로토콜 버전
- 통신 및 장치
- 명령(Command)
- 프레임 형식
- MODBUS RTU 프레임 형식
- MODBUS ASCII 프레임 형식
- MODBUS TCP 프레임 형식
- 기능과 명령(Functions and Commands)
- 요청 및 응답 형식
- Function codes 1 (read coils) and 2 (read descete inputs)
- Function codes 5 (force/write single coil)
- Function codes 15 (force/write multiple coils)
- Function codes 4 (read input registers) and 3 (read holding registers)
- Function codes 6 (preset/write single holding register)
- Function codes 16 (preset/write multiple holding registers)
- 예외 응답
- 엔티티(entity) 번호와 주소
- 구현
- MODBUS Plus
1. 제한 사항
MODBUS는 1970년대 후반에 PLC와 통신하도록 설계되어서 데이터 유형의 수는 당시 PLC에서 해석 가능한 유형으로 제한된다. 큰 바이너리 개체는 지원되지 않는다.
노드가 데이터 개체에 대한 설명을 찾는 표준 방법이 없다. 예를 들어 30도와 175도 사이의 온도를 나타내는 레지스터 값을 학습하는 경우이다.
MODBUS는 클라이언트/서버 (이전에는 마스터/슬레이브) 프로토콜이므로, 각 필드 장치를 폴링하고 데이터의 변경 사항을 찾는 클라이언트 노드처럼 필드 장치가 이벤트 핸들러 메커니즘에 의해 데이터를 얻을 수 있는 방법이 없다(이더넷 TCP/IP 제외, open-mbus라고 함). 이는 낮은 전송률의 무선 링크와 같이 대역폭이 비쌀 수 있는 응용 프로그램에서 대역폭과 시간을 소비한다.
MODBUS는 하나의 데이터 링크에서 최대 247개의 장치를 지정하도록 제한되어 있어, 상위 스테이션에 연결할 수 있는 필드 장치의 수를 제한한다(이더넷 TCP/IP 제외).
MODBUS 프로토콜 자체는 무단 명령이나 데이터 가로 채기에 대한 보안을 제공하지 않는다.
2. MODBUS 객체 유형
다음 객체 유형은 MODBUS 서버에서 MODBUS 클라이언트 장치에 제공할 수 있다.
객체 유형 | 접근 | 크기 | 주소 공간 |
Coil | Read-Write | 1 bit | 00001 - 09999 |
Discrete input | Read-only | 1 bit | 10001 - 19999 |
Input register | Read-only | 16 bits | 30001 - 39999 |
Holding register | Read-Write | 16 bits | 40001 - 49999 |
3. 프로토콜 버전
MODBUS 프로토콜 버전은 serial port, Ethernet 그리고 internet protocol suite을 지원하는 기타 프로토콜이 존재한다. MODBUS 프로토콜의 다양한 변형이 있다.
MODBUS RTU(Remote Terminal Unit) - serial communication에서 사용되며, MODBUS에서 사용할 수 있는 가장 일반적인 구현이다. MODBUS RTU는 프로토콜 통신을 위해 데이터의 컴팩트한 바이너리 표현을 사용한다. RTU 형식은 데이터의 신뢰성을 보장하기 위한 오류 검사 메커니즘으로 CRC(cyclic redundancy check) 체크섬과 함께 commands/data로 되어 있다. MODBUS RTU 메세지는 주저 없이 문자간 연속적으로 전송되어야 한다. MODBUS 메세지는 idle(silent) 동안에 프레임(분리)되어 있다.
MODBUS ASCII - serial communication에 사용되며 프로토콜 통신에 ASCII 문자를 사용한다. ASCII 형식은 LRC(longitudinal redundancy check) 체크섬을 사용한다. MODBUS ASCII 메세지는 콜론(":")으로 시작하고 개행(CR/LF)으로 끝나도록 구성된다.
MODBUS TCP/IP or MODBUS TCP - TCP/IP 네트워크를 통신에 사용하는 MODBUS 변형으로 포트 502로 접속한다. 하위 계층에서 이미 체크섬 보호를 제공하므로 체크섬 계산이 필요하지 않다.
MODBUS over TCP/IP or MODBUS over TCP or MODBUS RTU/IP - MODBUS RTU와 마찬가지로 체크섬이 페이로드에 포함된다는 점에서 MODBUS TCP의 다른 변형이다.
MODBUS over UDP - TCP의 오버헤드를 제거하는 IP 네트워크에서 UDP를 통한 MODBUS를 사용하는 실험을 일부 진행 되었다.
MODBUS Plus (MODBUS+, MB+ or MBP) - MODBUS Plus는 Schneider Electric에 소유권이 있고, 다른 변형과 다르게 여러 클라이언트 간의 P2P 통신을 지원한다. 빠른 HDLC와 같은 토큰 회전을 처리하려면 전용 보조 프로세서가 필요하다. 1Mbit/s의 트위스트 페어를 사용하고 전압/레벨 트리거 대신 전환/에지 트리거로 각 노드에 transformer isolation을 포함한다. MODBUS Plus를 컴퓨터에 연결하려면, 일반적으로 ISA, PCI나 PCMCIA 버스용으로 만들어진 카드와 같은 특수 하드웨어가 필요하다.
Pemex MODBUS - 기록과 데이터 흐름을 지원하는 표준 MODBUS의 확장이다. 이것은 공정 제어에 사용하기 위해 Pemex 석유 및 가스 회사를 위해 설계되었으나 널리 사용되지 않았다.
Enron MODBUS - 32비트 정수와 부동 소수점 변수, 기록과 데이터 흐름을 지원하는 Enron Corporation에서 개발한 표준 MODBUS의 또 다른 확장이다. 데이터 유형은 표준 주소를 사용하여 매핑된다. 기록 데이터는 데이터 저장 방법에 대한 API(American Petroleum Institute) 산업 표준을 충족한다.
데이터 모델과 함수 호출은 위에 나열된 처음 네 가지 변형에 대해 동일하다. 캡슐화만 다르다. 그러나 변형은 프레임 형식과 만찬가지로 상호 운용할 수 없다.
4. 통신 및 장치
MODBUS에서 통신(즉 데이터 전송)하는 각 장치에는 고유한 주소가 지정된다.
MODBUS RTU, MODBUS ASCII, MODBUS Plus(모두 RS-485 단일 케이블 멀티 드롭 네트워크임)에서 클라이언트로 지정된 노드만 명령을 시작할 수 있다. 다른 모든 장치는 서버이며 요청과 명령에 응답한다.
MODBUS TCP와 같은 Ethernet을 사용하는 프로토콜의 경우, 일반적으로 하나의 장치에만 해당 역할이 있지만 모든 장치가 MODBUS 명령을 보낼 수 있으므로 모두 클라이언트로 동작할 수 있다.
간단하고 자주 복사되는 프로토콜인 MODBUS는 많은 모뎀과 게이트웨이에서 지원한다. 그 중 일부는 이 프로토콜을 위해 설계되어 있다. 다른 구현에서는 ISM band, 심지어 SMS(Short Message Service)나 GPRS(General Packet Radio Service)와 같은 유선이나 무선 통신을 사용한다. 무선 네트워크의 일반적인 설계 중 하나는 mesh network을 사용하는 것이다. 설계자가 극복해야 하는 일반적인 문제에는 높은 대기 시간과 타이밍 문제가 포함된다.
5. 명령 (Command)
MODBUS 명령은 MODBUS 장치에 다음을 지시할 수 있다 :
- Coil과 Holding 레지스터에 저장되는 하나의 값을 변경.
- I/O 포트 읽기 : Discrete Input이나 Coil에서 데이터 읽기.
- Coil과 Holding 레지스터에 포함된 하나 또는 그 이상의 값을 다시 보내도록 장치에 명령.
MODBUS 명령에는 해당 장치의 MODBUS 주소(1 ~ 247)가 포함된다. 다른 장치가 명령(예외로 노드 0에 보내는 특수 브로드캐스트가 가능한 명령이 있다. 이는 동작은 되지만 응답하지 않는다.)을 수신하더라도 주소가 지정된 장치만 명령에 응답하고 작동한다.
모든 MODBUS 명령에는 수신자가 전송 오류를 감지할 수 있도록 하는 체크섬 정보가 포함되어 있다.
6. 프레임 형식
MODBUS 프레임은 PDU(Protocol Data Unit)을 캡슐화하는 ADU(Application Data Unit)으로 구성된다.
- ADU = Address + PDU + Error check
- PDU = Function code + Data
MODBUS 데이터 프레임에서 멀티 바이트 값의 최상위 바이트가 다른 바이트보다 먼저 전송된다.
모든 MODBUS 변형은 다음 프레임 형식 중 하나를 사용한다.
6.1 MODBUS RTU 프레임 형식
이 형식은 주로 RS-485/EIA-485와 같은 asynchronous serial data lines에서 사용된다. 그 이름은 remote terminal unit을 나타낸다.
이름 | 길이(비트) | 기능 |
Start | 3.5 x 8 | 최소 3 * 1/2 문자 시간(28비트)의 침묵 (주의 조건) |
Address | 8 | 위치 주소 |
Function | 8 | "read coil"와 같은 기능 코드를 나타냄 |
Data | n * 8 | Data + length는 메세지 유형에 따라 채워짐 |
CRC | 16 | Cyclic redundancy check |
End | 3.5 x 8 | 프레임 사이 최소 3 * 1/2 문자 시간(28비트)의 침묵 (주의 조건) |
CRC 계산 :
- 다항식 : \[x^{16} + x^{15} + x^{2} + 1\]
CRC-16-ANSI는 CRC-16-IBM이라고도 하고, 일반 16진 대수 다항식은 8005이고 역순 A001 - 초기 값 : 65535
- 16진수 프레임 예제 : 01 04 02 FF FF B8 80 (01 ~ FF까지 5 바이트에 대한 CRC-16-ANSI 계산은 최하위 바이트부터 먼저 전송된 80B8 이다.)
6.2 MODBUS ASCII 프레임 형식
주로 7비트나 8비트 asynchronous serial lines에서 사용된다.
이름 | 길이(바이트) | 기능 |
Start | 1 | 콜론 : (ASCII 값으로 0x3A) |
Address | 2 | 위치 주소 |
Function | 2 | "read coil"와 같은 기능 코드를 나타냄 |
Data | n * 2 | Data + length는 메세지 유형에 따라 채워짐 |
LRC | 2 | Checksum (longitudinal redundancy check) |
End | 2 | carriage return + line feed (CR/LF) 쌍 (ASCII 값으로 0x0D, 0x0A) |
Address, Function, Data, LRC는 ASCII 16진수로 인코딩된 값으로, 8비트 값(0~255)은 0~9와 A-F 범위에서 사람이 읽을 수 있는 두 개의 ASCII 문자로 인코딩된다. 예를 들어, 값 122(0x7A)는 두 개의 ASCII 문자 '7'과 'A'로 인코딩되어 55(0x37, ASCII 값으로 '7')와 65(0x41, ASCII 값으로 'A' ) 2바이트 전송된다.
LRC는 8비트 값(Start와 End 문자 제외)의 합으로 계산되고, negated(2의 보수)되어 8비트 값으로 인코딩된다. 예를 들어, Address, Function, Data가 247, 3, 19, 137, 0, 10이면 합(416)의 2의 보수는 -416이다. 8비트로 트리밍된(trimmed) 이 값은 96(256 * 2 - 416 = 0x60)이며 다음 17 ASCII 문자 프레임(F7031389000A60CRLF)을 제공한다. LRC는 체크섬으로만 사용하도록 지정된다. LRC는 전송된 문자가 아닌 인코딩된 데이터에서 계산되기 때문에 '종방향(longitudinal)' 특성은 단일 비트 오류를 찾는 패리티 비트와 함께 사용할 수 없다.
6.3 MODBUS TCP 프레임 형식
주로 Ethernet 네트워크에서 사용된다.
이름 | 길이(바이트) | 기능 |
Transaction Identifier | 2 | 서버와 클라이언트의 메세지 동기화를 위해 |
Protocol identifier | 2 | MODBUS/TCP의 경우 0 |
Length field | 2 | 이 프레임의 남은 바이트 수 |
Unit identifier | 1 | 서버 주소 (사용하지 않으면 255) |
Function code | 1 | 다른 변형과 같은 기능 코드 |
Data bytes | n | 응답이나 명령 데이터 |
Unit identifier는 여러 MODBUS 장치의 합성인 MODBUS/TCP와 함께 사용된다(예 : MODBUS/TCP에서 MODBUS RTU 게이트웨이로). 이 경우 Unit identifier는 게이트웨이 뒤에 있는 장치의 서버 주소이다. 기본적으로 MODBUS/TCP 지원 장치는 보통 Unit identifier를 무시한다.
6.4 기능과 명령(Functions and Commands)
MODBUS 서버에서 눈에 띄는 개념적 엔터티는 다음과 같다 :
- Coils : 읽기, 쓰기 가능, 1 비트 (off/on)
- Discrete Inputs : 읽기 전용, 1 비트 (off/on)
- Input Registers : 측정과 상태 읽기 전용, 16 비트 (0 ~ 65535)
- Holding Registers : 읽기, 쓰기 가능한 구성(configuration) 값, 16 비트 (0 ~ 65535)
이러한 엔터티를 읽고 쓰는 명령은 다음 표에 요약되어 있다. 가장 기본적인 읽기, 쓰기는 굵게 표시된다.
일부 출처는 표준과 다른 용어를 사용한다. 예를 들어 Write Single Coil 대신 Force Single Coil을 사용한다.
MODBUS function codes
Function type | Function name | Function code | Comment | ||
Data 액세스 | 비트 액세스 |
물리적 Discrete Inputs | Discrete Inputs 읽기 | 2 | |
내부 비트나 물리적인 Coils |
Coils 읽기 | 1 | |||
Single Coil 쓰기 | 5 | ||||
Multiple Coil 쓰기 | 15 | ||||
16 비트 액세스 |
물리적인 Input Registers | Input Registers 읽기 | 4 | ||
내부 Registers나 물리적인 출력 Registers |
Multiple Holding Registers 읽기 | 3 | |||
Single Holding Registers 쓰기 | 6 | ||||
Multiple Holding Registers 쓰기 | 16 | ||||
Multiple Register 읽기/쓰기 | 23 | ||||
Mask Write Register | 22 | ||||
FIFO Queue 읽기 | 24 | ||||
File Record 액세스 | File Record 읽기 | 20 | |||
File Record 쓰기 | 21 | ||||
Diagnostics | Exception Status 읽기 | 7 | serial only | ||
Diagnostic | 8 | serial only | |||
Com Event Counter 얻기 | 11 | serial only | |||
Com Event Log 얻기 | 12 | serial only | |||
Server ID 리포트 | 17 | serial only | |||
Device Identification 읽기 | 43 | ||||
Other | 캡슐화된 인터페이스 전송 | 43 |
7. 요청 및 응답 형식
요청 및 응답은 위에서 설명한 프레임 형식을 따른다. 이 섹션에서는 가장 자주 사용되는 기능 코드의 데이터 형식에 대해 자세히 설명한다.
7.1 Function code 1 (read coils) and 2 (read discrete inputs)
요청 :
- 읽을 첫 번재 coil/discrete input의 주소
- 읽을 coils/discrete inputs의 수
정상 응답 :
- 뒤따르는 coil/discrete input 값의 바이트 수 (8 비트)
- coil/discrete input 값 (바이트당 8개의 coils/discrete inputs)
각 coil/discrete input의 값은 바이너리이다(off면 0, on이면 1). 첫 번째 요청된 coil/discrete input은 응답에서 첫 번재 바이트의 최하위 비트에 저장된다. coils/discrete inputs의 수가 8의 배수가 아닌 경우 마지막 바이트의 최상위 비트는 0으로 채워진다.
예를 들어, 11개의 coils이 요청되면 2바이트의 값이 필요하다. 이러한 연속적인 코일의 상태가 on, off, on, off, off, on, on, on, off, on, on 이라고 가정하면 응답은 16진수로 02 E5 06 이다.
응답 메세지에서 반환된 바이트 수는 8비트(256)이고 프로토콜 오버헤드는 5바이트(256-1)이므로 최대 2008(251 * 8)개의 discrete inputs이나 coils을 한 번에 읽을 수 있다.
7.2 Function code 5 (force/write single coil)
요청 :
- Coil 주소 (16비트)
- force/write 값 : off의 경우 0이고 on의 경우 65,280 (16진수로 FF00)
정상 응답 : 요청과 동일
7.3 Function code 15 (force/write multiple coils)
요청 :
- force/write할 첫 번재 coil의 주소 (16비트)
- force/write할 coils의 수 (16비트)
- 뒤 따르는 coil 값의 바이트 수 (8비트)
- coil 값 (바이트당 8개의 coil 값)
각 coil의 값은 이진수이다(off는 0, on은 1). 요청에서 첫 번째 요청된 coil은 첫 번째 바이트의 최하위 비트에 저장된다. coil 수가 8의 배수가 아니면, 마지막 바이트의 최상위 비트를 0으로 채워야 한다. Funcode code 1 and 2의 예를 참조한다.
정상 응답 :
- 첫 번째 coil의 주소 (16비트)
- coils의 수 (16비트)
7.4 Function code 4 (read input registers) and 3 (read holding registers)
요청 :
- 읽을 첫 번재 register의 주소 (16비트)
- 읽을 registers의 수 (16비트)
정상 응답 :
- 뒤 따르는 register 값의 바이트 수 (8비트)
- register 값 (register당 16비트)
MODBUS PDU의 최대 길이는 253(RS485의 최대 MODBUS APU 길이 256에서 유추)이므로, RTU 형식을 사용할 때는 한번에 최대 125개의 register를 요청할 수 있고 TCP를 사용하면 최대 123개의 register를 요청할 수 있다.
7.5 Function code 6 (preset/write single holding register)
요청 :
- preset/write할 holding register의 주소 (16비트)
- holding register의 새로운 값 (16비트)
정상 응답 : 요청과 동일
7.6 Function code 16 (preset/write multiple holding registers)
요청 :
- preset/write할 첫 번째 holding register의 주소 (16비트)
- preset/write할 holding register의 수 (16비트)
- 뒤 따르는 holding register 값의 수 (8비트)
- holding registers의 새로운 값 (holding register당 16비트)
MODBUS PDU의 최대 길이는 253(RS485의 최대 MODBUS APU 길이 256에서 유추)이므로, 한번에 123개의 registers에 기록할 수 있다.
정상 응답 :
- preset/written한 holding register의 첫 번째 주소 (16비트)
- preset/written한 holding registers의 수 (16비트)
8. 예외 응답
정상 응답이라는 의미로 서버는 function code를 다시 보낸다. 서버가 오류를 보고하려는 경우에는 요청된 function code에 128(16진수 0x80)을 더한 값(3은 131로 = 16진수 0x83)으로 응답하고, 예외 코드(exception code)로 알려진 한 바이트의 데이터만 포함한다.
주요 MODBUS 예외 코드
Code | Text | 설명 |
1 | Illegal Function | 쿼리에 있는 function code가 인식되지 않거나 허용되지 않는다. |
2 | Illegal Data Address | 일부 또는 모든 요청된 엔티티(entities)의 데이터 주소가 허용되지 않거나 서버에 존재하지 않는다. |
3 | Illegal Data Value | 서버에서 허용되는 값이 아니다. |
4 | Server Device Failure | 서버에서 요청된 작업을 수행하는 동안 복구할 수 없는 오류가 발생했다. |
5 | Acknowledge | 서버에서 요청을 수락하고 처리 중이지만, 오랜 시간이 필요하다. 이 응답은 클라이언트에서 timeout 오류가 발생하는 것을 방지하려고 반환된다. 클라이언트는 처리가 완료된 것을 확인하기 위해 다음 번에 Poll Program Complete 메세지를 요청할 수 있다. |
6 | Server Device Busy | 서버에서 오랜 시간이 걸리는 명령을 처리하고 있다. 클라이언트는 나중에 다시 시도해야 한다. |
7 | Negative Acknowledge | 서버에서 프로그래밍 기능을 수행할 수 없다. 클라이언트는 서버에 diagnostic이나 오류 정보를 요청해야 한다. |
8 | Memory Parity Error | 서버의 메모리에서 패리티 오류를 감지했다. 클라이언트는 요청을 다시 시도할 수 있지만, 서버 장치에서 서비스가 필요할 수 있다. |
10 | Gateway Path Unavailable | MODBUS 게이트웨이에 특화되어 있다. 잘 못 구성된 게이트웨이를 나타낸다. |
11 | Gateway Target Device Failed to Respond | MODBUS 게이트웨이에 특화되어 있다. 서버가 응답에 실패할 때 보낸다. |
9. 엔티티(entity) 번호와 주소
MODBUS Organization은 Modbus Application Protocol v1.1b에서 다음을 언급한다 :
- MODBUS 애플리케이션 프로토콜은 PDU 주소 지정 규칙을 정의한다. PDU에서 각 데이터 항목은 0에서 65535까지 주소가 지정된다.
- 또한 4개 블록(1에서 n까지 번호가 부여되어 여러 요소로 구성된)으로 구성되는 MODBUS 데이터 모델을 정의한다.
- MODBUS 데이터 모델에서 데이터 블록 내의 각 요소는 1에서 n까지 번호가 지정된다.
일부 규칙은 MODBUS 엔티티(coils, discrete inputs, input registers, holding registers)가 참조되는 방식을 제어한다.
엔티티 번호(number)와 주소(address)를 구별하는 것이 중요하다 :
- 엔티티 번호는 설명 테이블 내에서 엔티티 유형과 엔티티 위치를 결합한다.
- 엔티티 주소는 MODBUS 프레임의 데이터 부분에서 16비트 값으로 0~65535(패킷에서 0000~FFFF) 범위의 시작주소이다.
기존 규칙에서 엔티티 번호는 엔티티 유형을 타나내는 숫자로 시작하고 엔티티 위치를 나타내는 4자리 숫자가 뒤따른다 :
- coil 번호는 0으로 시작하고 범위는 00001 ~ 09999
- discrete input 번호는 1로 시작하고 범위는 10001 ~ 19999
- holding register 번호는 4로 시작하고 범위는 40001 ~ 49999
데이터 통신의 경우 엔티티 위치(1 ~ 9999)는 1을 빼서 0 부터 시작하는 엔티티 주소(0 ~ 9998)로 변환된다. 예를 들어, 40001에서 시작하는 holding registers를 읽으려면 데이터 프레임에 function code 3과 주소 0이 포함된다. 40100에서 시작하는 holding registers는 주소는 99가 된다.
이는 각 엔티티에 대한 주소를 9999개로 제한된다. 사실상 표준은 이전 목록에 한 자리를 추가하여 이를 65536 확장한다 :
- coil 범위는 000001 ~ 065536
- discrete input 범위는 100001 ~ 165536
- input register 범위는 300001 ~ 365536
- holding register 범위는 400001 ~ 465536
확장 참조를 사용할 때, 모든 번호 참조는 coil과 다른 엔티티 간의 혼동을 피하기 위해 정확히 6자리 숫자를 가져야 한다. 예를 들어, coil #40001이 타켓이라면 holding register #40001과 coil #40001을 구분하기 위해서는 반드시 #040001로 나타나야 한다.
데이터 주소를 기록하는 또 다른 방법은 16진수 값을 사용하는 것이다. 이 값은 앞에서 언급한 전통적인 규칙에서 4자리 숫자의 사용을 명확하게 한다 :
- coil 범위는 0x0000 ~ 0xFFFF
- discrete input 범위는 1x0000 ~ 1xFFFF
- input register 범위는 3x0000 ~ 3xFFFF
- holding register 범위는 4x0000 ~ 4xFFFF
이 표기법의 장점은 MODBUS 패킷을 디코딩할 때 동일한 숫자가 발견된다는 것이다.
JBUS mapping
MODBUS와 밀접하게 관련된 또 다른 사실상의 프로토콜이 나중에 나타났고, PLC 제조업체인 April Automates가 1985년 프랑스 회사인 Renault Automation과 Merlin Gerin et Cie 사이의 협업의 결과로 정의한 JBUS 이다. MODBUS와 JBUS의 차이점(엔티티 수, 서버 스테이션)은 이제 관련이 없다. 이 프로토콜이 1994년에 AEG Schneider Automation이 구입한 후 폐기되어 April PLC 시리즈와 함께 거의 사라졌기 때문이다. 그러나 JBUS라는 이름은 어느 정도 남아있다.
JBUS는 다른 번호 부여를 통해 function code 1, 2, 3, 4, 5 ,6 15, 16와 위에서 설명한 모든 엔티티를 지원한다 :
- 번호와 주소가 일치한다 : 데이터 프레임에서 엔티티 #x는 주소 x 를 가진다.
- 따라서 엔티티 번호에는 엔티티 유형이 포함되지 않는다. 예를 들어 MODBUS의 holding register #40010은 holding register #9이고 JBUS에서는 주소 9이다.
- 숫자 0(따라서 주소 0)은 지원되지 않는다. 서버는 이 번호와 주소에서 실제 데이터를 구현해서는 안되며 요청 시 null 값을 반환하거나 오류를 throw할 수 있다.
10. 구현
거의 모든 구현은 공식 표준에서 변형되었다. 다른 종류는 다른 공급자의 장비와 올바르게 통신하지 않을 수 있다. 가장 일반적인 변형은 다음과 같다 :
- 데이터 유형
- IEEE floating-point 수
- 32-bit 정수
- 8-bit 데이터
- 혼합된 데이터 유형
- 정수 bit fields
- 데이터를 정수 to/from 변경하는 승수. 10, 100, 1000, 256 ...
- 프로토콜 확장
- 16-bit 서버 주소
- 32-bit 데이터 크기 (1 주소 = 32 bits 데이터 반환)
- word-swapped 데이터
11. MODBUS Plus
이름에도 불구하고 MODBUS Plus는 MODBUS 변형이 아니다. 토큰 전달을 포함하는 다른 프로토콜이다. 이것은 Schneider Electric의 독점 사양이지만 특허가 아니라 미공개이다. 일반적으로 Schneider 파트너에게만 제공되는 맞춤형 chipset을 사용하여 구현된다.