데이터/Modbus

Modbus Protocol

쿠와와 2021. 3. 5. 17:29

Modbus Protocol

Modbus protocol은 데이터 전송 수단과 무관하며, 데이터를 구성하고 해석하도록 하기 위 해 정의된 응용 프로토콜이다.

 

Master는 Modbus protocol에서 수립된 포맷에 맞추어 request packet을 slave 장치(단일 혹은 broadcast)의 address에 전송하는데 Function code의 정의에 따라 요청할 데이터와 에러 체크 코드를 전송한다.

 

Slave 장치의 response 또한 Modbus protocol을 사용하여 구성된다. 이는 동작이 수행되었음을 확인하는 기능을 수행하며 요청된 결과에 따른 데이터와 에러 체크 코드를 포함한다. 만약 메시지 수신 시 에 러가 발생하거나 slave 장치에서 요청에 따른 동작을 수행할 수 없을 경우 response에 에러 메시지를 구성한다.

 

 

- Modbus RTU Protocol

Modbus RTU protocol은 RS-485나 RS-232등과 같이 serial 통신 환경에서 동작하기 위한 Modbus protocol의 한 종류이다. 이 protocol은 장치 ID를 통하여 각 장치를 구분하고 CRC를 이용하여 에러를 확인한다. Serial 통신 한 채널을 통한 다중 접속은 허용하지 않는다. (보안이 좋음) 

 

- Modbus TCP Protocol

Modbus TCP protocol은 Modbus RTU protocol과 유사하지만 TCP/IP 계층 하에서 더 효과 적으로 동작하도록 개선되었다. TCP/IP의 주요 기능은 주소와 경로가 완전한 모든 packet에 대하여 완벽히 수신이 되는 것을 보장하는 것이다.

 

Request와 response는 순서가 서로 맞지 않을 수 있다. 또한 packet 사이의 gap이 필요하지 않다. -> 하지만 실무에서는 필요하다고 한다. 

게다가 TCP protocol상에서 동작하기 때문에 다중 접속 또한 가능하다. 최대 접 속 수는 개별 장치에 따라 결정된다.

 

Modbus Packet 구조

 

 

  • Unit ID [1 Byte] : TPC/IP가 아닌 다른 통신선로의 연결되어있는 Slave를 구분하는 정보입니다. Tcpport는 0x01로 고정

- Fuction Code 

Function Code는 Modbus 프로토콜에서 제공하는 명령어 집합코드. Function Code를 이용하여 슬레이브 Memory(Coil, Register )에 값을 읽어오거나 쓸수있는 서비스. 실제로 Function Code코드 1~127사이의 값을 사용하고있지만 TCPPORT에서는 1, 2, 4, 5, 6, 15, 16 값을 지원

위의 버퍼를 보게 되면 처음 수신하는 것이기 때문에
[0~1]은 0
[2~3]은 0으로 고정 
[4~5]는 그 뒤의 버퍼의 길이인 6

[6~11]까지는 데이터인걸 확인할 수 있다. 

 

- Data

Data는 Function Code에 따라 그 구조가 조금식 달라진다. Data는 기본적으로 Start Address, Length, Byte Count, Data의 형태를 가지고 있다.

  • Start Address [2Bytes] : 접근하려는 메모리의 시작번지를 나타냅니다. 2Byte로 표현되면 상위 Byte 우선순이다. (예 0x4001번지 접근 시 0x40 0x01)

  • Length [2Bytes] : 시작번지부터 값을 읽거나 쓸 길이.

  • Byte Count [1Bytes] : Request, Response에따른 메모리 Data의 byte 수를 나타낸다. 즉, 읽어거나 쓸려는 메모리 데이터의 Byte의 개수.

  • DATA [N Byte] : Request, Response에 따른 메모리 Data의 값 나타냅니다. 즉, 읽어거나 쓸려는 메모리 값.

 

www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf

11page부터 func code를 넣었을 때의 request와 response가 잘 나타나 있다. 코딩할 때 참고해보자.

 

TCP Exchanges

TCP/IP에서 MODBUS 서버는 IP 주소를 사용하여 주소가 지정되므로 MODBUS Unit Identifier는 사용할 수 없습니다. 0xFF 값을 사용해야 합니다. 
TCP/IP 네트워크에 직접 연결된 MODBUS 서버에 주소를 지정할 때는 "Unit Identifier" 필드에서 중요한 MODBUS 슬레이브 주소를 사용하지 않는 것이 좋습니다. 자동 시스템 내에서 IP 주소를 재할당할 경우 그리고 이전에 MODBUS 서버에 할당된 IP 주소가 게이트웨이에 할당되는 경우, 중요한 슬레이브 주소를 사용하면 게이트웨이에 의한 잘못된 라우팅으로 인해 문제가 발생할 수 있습니다. 유의하지 않은 슬레이브 주소를 사용하면 게이트웨이에서 MODBUS PDU를 문제 없이 폐기하기만 하면 됩니다. 0xFF는 "단위 식별자"에 유의하지 않은 값으로 권장된다.

'데이터 > Modbus' 카테고리의 다른 글

pymodbus  (2) 2021.03.18
modbus 자주쓰는 function code 정리  (0) 2021.03.08
산전, 미쓰비시 plc IP,Port 설정 후 python 연결 (pymodbus)  (1) 2021.02.28
Modbus란  (0) 2021.02.02