Skip to content

12Lf ModbusRTU Manaual

1 개요

MODBUS 프로토콜은 산업용 프로토콜로 PLC통신 등에 주로 사용되는 표준이 되는 프로토콜입니다. 주로 사용하는 방식은 RTU방식과 ASCII방식이 주로 사용되고, 요즘에는 TCP방식도 나와있습니다.

1979년부터 업계의 사실상 직렬 표준인 MODBUS는 수 백만 개의 자동화 장치가 지속적으로 통신할 수 있도록 지원하고 있습니다. MODBUS는 요청/응답 프로토콜이며 기능 코드별로 지정된 서비스를 제공합니다. 프레임의 구성은 Application Data Unit인 ADU와 Protocol Data Unit인 PDU로 구성되어 있습니다.

2 프레임 구조

2.1 Packet Discription

mightyZAP은 MODBUS-RTU 프로토콜 내용을 준수합니다.
본 매뉴얼에 나오지 않은 사항들은 아래의 관련 표준 문서를 참조하여 주시기 바랍니다.

2.1.1 Packet Structure

MODBUS-RTU 프로토콜의 최대 송수신 패킷 길이는 256 Byte 입니다. 따라서 송수신 패킷의 총 길이가 256Byte 를 넘기지 않도록 주의하여 주십시오.
MODBUS-RTU 통신 Mode 는 Packet 을 구분하기 위해서 아래 그림과 같이 시작과 끝 사이에 최소 3.5 Char 이상의 이 필요합니다.

packet Description

  • 송신 패킷 구조
Additional AddressFucntion codeDataError Check
byte012n-1n
mightyZAP IDFunctionDataCRC(MSB)CRC(LSB)
  • 수신 패킷 구조
    [정상 응답]
Additional AddressFucntion codeDataError Check
byte012n-1n
mightyZAP IDFunctionDataCRC(MSB)CRC(LSB)
[비 정상 응답답]
Additional AddressFucntion codeDataError Check
byte01234
mightyZAP IDFunction
+ 0x80
Exception codeCRC(MSB)CRC(LSB)

1.1.2 Packet Element 설명

  • mightyZAP의 IDF로 다중 연결 방식으로 Daisy Chain 연결 지원을 위한 식별자 입니다.
  • ID가 '0'일 경우 Broadcasting ID로 동작합니다.
  • mightyZAP에서 지원하는 Modbus-RTU 표준 Function code는 다음과 같습니다.
FunctionCodeDescription
Read Holding Register0x03mightyZAP의 Data를 읽어오기
Write Single Register0x06mightyZAP의 특정 주소에 Data값을 Setting 하기
Write Multiple Register0x10mightyZAP의 연속된 주소에 Data값을 Setting 하기
SP Function code0xxx해당 모델 사용자 매뉴얼을 참조하여주시기 바랍니다.
  • Data 송신 : Read Register 명령의 경우 Modbus 주소, 레지스터 개수, Byte 개수 등을 지정하게 되며, Write Register 명령의 경우 Modbus 주소, Byte 개수, 설정 할 값 등을 지정하게 됩니다.
  • Data 수신: Read Register 명령의 경우, 정상응답은 Node ID 와 Function Code 가 송신 때와 동일한 값으로 수신되며, Data 는 송신 때 보낸 Register 순서에 따라 각 Register 의 값이 수신됩니다.

Write Single Register 명령의 경우, 송신 때와 동일한 데이터가 수신됩니다. Write Multi Register 의 경우에는 Write Multi Register 명령으로 데이터를 쓰고자 한 Register 의 시작 주소와 Register 개수가 수신됩니다.

이상응답의 경우에는 Node ID, Error Code, Exception Code 로 구성되며, 이상응답의 패킷 구조는 Function Code 와 관계없이 모두 동일합니다.

  • CRC 16 비트 CRC 값을 입력합니다. 구성은 MSB/LSB 로 나누어 각각 1Byte 씩 전송합니다.

  • Exception Code mightyZAP에서 지원하는 모든 Function Code 의 이상 응답에 대한 Exception Code 는 아래와 같이 정의되어 있습니다.

Exception CodeDescription
0x01Illegal Function지원하지 않는 Function Code
0x02Illegal Data Address잘못된 레지스터 주소
0x03Illegal Data Value잘못된 데이터 값
0x04Slave Device Failure장치 고장, 파라미터 설정값 이상(ready)
0x05Acknowledge데이터가 준비되지 않은 상태(ready)
0x06Slave Device Busy파라미터 잠금 상태

프로토콜 Function Code 설명

Read Holding Register

단일 레지스터(16bit 데이터) 및 연속된 레지스터 블록(16bit 데이터 단위)의 값을 읽습니다.

  • Request
byteData
Function Code1 byte0x03
Starting Addresse2 byte0x0000 to 0xffff
Quatity of Register2 bytes1 to 125(0x7d)
  • Request OK
byteData
Function Code1 byte0x03
Starting Addresse2 byte2 x N*
Quatity of RegisterN* x 2 bytes
*N = Quantity of Registers
  • Request not OK
byteData
Error Code1 byte0x83
Exception Code1 byte0x01 ~ 0x06
  • example

Write Sing Register

단일레지스터(16bit 데이터)에 값을 씁니다.

  • Request
byteData
Function Code1 byte0x06
Starting Addresse2 bytes0x0000 to 0xffff
Quatity of Register2 bytes0x0000 to 0xffff
  • Request OK
byteData
Function Code1 byte0x03
Starting Addresse2 bytes0x0000 to 0xffff
Quatity of Register2 bytes0x0000 to 0xffff
*N = Quantity of Registers
  • Request not OK
byteData
Error Code1 byte0x86
Exception Code1 byte0x01 ~ 0x06
  • example

Write Multi Register(0x10)

연속된 레지스터 블록(16bit 데이터 단위)에 값을 씁니다.

  • Request
byteData
Function Code1 byte0x06
Starting Addresse2 bytes0x0000 to 0xffff
Quatity of Register2 bytes0x0000 to 0xffff
Bytes Count1Byte2 x N*
Registers ValueN* x 2 Bytesvalue
  • Request OK
byteData
Function Code1 byte0x10
Starting Addresse2 bytes0x0000 to 0xffff
Quatity of Register2 bytes1 to 123(0x7b)
*N = Quantity of Registers
  • Request not OK
byteData
Error Code1 byte0x90
Exception Code1 byte0x01 ~ 0x06
  • example

Packet Test