데이터/Modbus

Modbus란

쿠와와 2021. 2. 2. 10:12

사물 A와 B가 존재할 때 이 두개가 통신을 하기 위해서는 먼저 물리적 경로가 필요하다. 이 물리적 경로는 유선일수도 있고 무선일 수도 있는데 이 경로에서는 Bit 단위의 통신이 이루어진다. 이것을 시리얼통신이라고 한다. 

이러한 시리얼통신은 여러가지가 존재하는데 대표적으로 RS232, RS422, RS485 등이 있다. 

https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=220886156177&proxyReferer=https:%2F%2Fwww.google.com%2F

병렬(Parallel) 통신의 모식도

https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=220886156177&proxyReferer=https:%2F%2Fwww.google.com%2F

직렬(Serial) 통신의 모식도



간단하게 RS232, RS422, RS485를 살펴보자

RS232 - 1:1 통신으로 외부의 영향을 많이 받아 안좋다. 기계끼리 바로 옆에 있는 것이 아니면 사용하지말자

RS422 - 아주 좋다. 보냄과 동시에 받을 수 있다(전이중 구조). 통신 할 때 선이 4개닥 사용. 비용, 공간이 많이든다. 

RS485 - 가장 많이 사용한다. 반이중(보낸 후 쉬고 받음) 구조로 선을 2, 4 중 골라서 사용 가능하다. 보당 2가닥 쓴다.

 

가장 많이 사용하는 RS485의 구성을 살펴보자 
1. BPS (1초당 몇개의 비트를 보낼지) : 보통 9600, 너무 빠르면 오류가 발생할 수도 있다.
2. 데이터의 길이 : 보통 8
3. 패리티 : 에러 검출할 때 사용, 하지만 대부분 사용하지 않음 N, E- 짝수 , O- 홀수가 있다.
4. 정지 비트 : 1 or 2 bit로써 대부분 1bit를 사용한다. 
5. 흐름제어 : 거의 사용하지 않는다. 


Modbus-RTU는 RS485 위에 동작하는 프로토콜(약속이라고 생각하면 편함)이다. 문론 RS232, RS422 위에서도 동작하지만 실제로 RS485가 가장 많이 사용되기 때문에 RS485에 맞게 설계되었다고 생각한다. 

 

Modbus-TCP는 이터넷 네트워크, 인터넷 연결하여 전송하는 것으로 server에서 Slave_ID대신 IP를 사용한다. 

 

Modbus는 멀티 드롭이 되기 때문에 처음 보낼때 받는 이가 누구인지 꼭 명시해줘야한다. 그렇지 않으면 여러 대와 통신이 한꺼번에 대서 오류가 발생한다. 그렇기 때문에 Master-Slave 구조가 형성되어 있다. 발언권은 Master 에게만 있고 Slave는 응답만 해주는 구조이다. 

 

규격만 같으면 상관 없기 때문에 우리가 소스코드를 짜야할 때 큰 흐름만 알아두면 된다.

OPEN, READ, WRITE 

 

Buffer 에 들어가는 것을 알아보자 (buffer은 통신할때 주고받는 데이터 하나를 말하는 것)

buff[0] : ID
buff[1] : function code
buff[2] : 보내는 패킷의 길이 
buff[3] : 1번째 주소의 데이터 1
buff[4] : 1번째 주소의 데이터 2
buff[5] : 2번째 주소의 데이터 1
buff[6] : 2번째 주소의 데이터 2
.

.

.

마지막 CRC
이런 구조로 데이터 하나가 왔다갔다 한다. 

 

function code를 좀 알아보자면 
0xOO 은 0~9999 번째 주소를 말하는 것이다 - 0x32 = 31번째 주소 
1xOO 은 10000~19999 번째 주소를 말하는 것 - 1x32 = 10031번째 주소 
2xOO 은 20000~29999
3xOO 은 30000~39999



왜 이렇게 말하는 것인가 Slave 즉 센서에는 메모리 map이 논리적으로 4개로 나눠져있다.  그게 각각 0x, 1x, 2x, 3x 이기 때문에 알아둘 필요가 있다. 

 

modbus 패킷의 기본 형태

modebus의 Data type

error가 뜨면 func code 가장 앞자리에 1로 보낸다. 

 

하지만 설계자가 약간의 오류를 범한 것이 데이터 개수가 2Byte 인데 응답에서 길이를 나타내는 bit가 1Byte밖에 되지 않아 데이터 개수를 온전하게 다 표현하지 못한다. 

 

더 자세한 내용 -영문 youtube

www.youtube.com/watch?v=JBGaInI-TG4

 

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

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