[아두이노#604] Arduino에 흐름제어가 자동으로되는 RS485모듈로 간단하게 modbus rtu프로토콜 구현해보기!(녹칸다의 아두이노 시즌2)
프로그래밍/RS485모드버스(modbus) 2024. 7. 8. 23:28
https://youtube.com/live/_q3RaOxNNZg
[아두이노#604] Arduino에 흐름제어가 자동으로되는 RS485모듈로 간단하게 modbus rtu프로토콜 구현해보기!(녹칸다의 아두이노 시즌2)
녹칸다의 아두이노 시즌2 시리즈이다!
이번편에서는 603편에서 처음 활용했던 auto flow rs485모듈에 데이터송수신 프로토콜을 입혀보도록 한다!
흔히 rs485에서 등장하는 modbus rtu프로토콜을 적용해보도록 하자!
아두이노 우노보드 2대를 이용해서 하나는 modbus master, 다른하나는 modbus slave로 작동시킨다!
마스터에서 슬레이브에 달린 LED나 모터를 제어하거나, 슬레이브에 있는 센서값을 읽어오는 예제등을 간단하게 구현해보도록 하자!
(참고자료)
1.MODBUS프로토콜
https://www.modbustools.com/modbus.html
2.CRC16계산기
https://crccalc.com/
3.CRC16설정
uint16_t result = crc16(데이터, 길이, 0x8005, 0xFFFF, 0, true, true);
(깨알지식)
1.modbus 프로토콜에서는 여러대의 슬레이브를 구분하기 위해서 각 슬레이브마다 고유한 아이디를 부여하는데 슬레이브ID혹은 국번이라고 부른다!
2.모드버스 프로토콜은 다양한 기능을 제공하기 위해서 펑션코드(FC)로 기능을 분리해놓았다!
(사용라이브러리)
CRC
(RS485모듈 연결방식)
VCC - 5V
GDN - GDN
RXD - 2번핀
TXD - 3번핀
(녹칸다의 코멘트)
1.코일의 경우 single coil만 진행했고 멀티플코일은 하지 않았는데 멀티플코일의 경우 주고받는 데이터의 길이가 가변적이기 때문에 이에 대비해야한다!
2.예를들어 멀티플코일쓰기의 경우 7바이트를 읽어들이고 제일 마지막 바이트가 앞으로 더 읽어들일 데이터의 갯수를 의미하므로 추가적으로 버퍼에서 데이터를 빼면된다!
3.아두이노로 구현한 마스터의 경우 녹칸다의 예시처럼 delay함수를 사용하면서 전송하는것은 부적합하다!
4.아두이노가 모드버스 데이터를 가지고오는 단일작업만 하는 경우에는 delay함수를 사용해도 무방하나 2개이상의 작업이 공존하는 경우 부적합하다!
5.마스터에서 슬레이브를 제어하기위한 컨트롤러가있고 컨트롤러로 부터 입력을받아서 슬레이브를 제어하는경우 2가지 작업이 공존한다!
6.마스터가 슬레이브에게 modbus명령을 전송할때 큐에다가 삽입을하고 RS485통신라인이 busy하지 않을경우 request를 전송하고 슬레이브가 response를 보냈을 경우에 큐에서 다음 데이터를 뺴서 다시 request를 전송한다!
7.글로써 설명이 상당히 어려우니 말로 떼우겠음!
(예제목차)
1.마스터에서 데이터를 request하기위해서 CRC16을 계산하는 원리를 알아내시오!
2.마스터에서 write single coil을 위한 8바이트 데이터프레임을 구성해서 슬레이브에 전송한다음 슬레이브의 시리얼 모니터에서 출력하시오!
3.슬레이브에서 마스터가보낸 데이터를 해석하고 자신의 ID가 아니면 작동하지말고 CRC16을 체크하도록 하시오!
4.슬레이브가 마스터쪽으로 응답하도록 하시오!(write single coil은 마스터가 보낸 데이터를 슬레이브가 그대로 응답한다!)
5.슬레이브의 4번핀과 5번핀에 LED가 연결되어있을때 마스터에서 write single coil기능을 이용해서 LED를 On/Off하시오!(4번핀이 코일번호0번 5번핀이 코일번호1번으로 지정하시오)
6.마스터가 아두이노가 아니라 PC일때 현재 구현된 슬레이브가 제어되는지 확인하시오!(PC쪽프로그램은 C#윈폼으로 구현하시오!)
(C#프로젝트, 6번예제와 8번예제 공통예제)
7.슬레이브에 A0핀에 가변저항이 연결되어있고 측정값의 범위가 0~1023일때 슬레이브의 읽기레지스터 0번지에 값이 저장된다! 이때 마스터에서 값을 읽어올수있도록하시오!
8.예제6번에서 했던것처럼 예제7번에서 슬레이브에 있는 가변저항값을 C#윈폼으로 읽어오는 예시를 보이시오!