[아두이노#547] 아두이노(arduino) 우노보드를 모드버스(modbus) 마스터(master)로 구현해서 각종 슬레이브(slave) 제어해보기!
프로그래밍/RS485모드버스(modbus) 2023. 2. 9. 23:07
https://youtube.com/live/Lk6JZkv7jnA
아두이노(arduino) 우노보드를 모드버스(modbus) 마스터(master)로 구현해서 각종 슬레이브(slave) 제어해보기!
이번편은 과거의 녹칸다가 rs485 모드버스 예제를 구현할때 내용을 보강하는 것이 주요 목표이다!
과거의 녹칸다는 모드버스 프로토콜에 대해서 잘 모르고 단순히 slave의 데이터시트만 보고 무엇을 보내면 무엇을 응답한다를 기준으로 아두이노 예제를 구현하였다!
그러나 지금은 그게 아니라 모드버스 프로토콜에 대해서 명확히 이해하고 내가 원하는 펑션코드와 내가 원하는 주소의 데이터를 읽거나 쓰는 것을 할 수 있도록 예제를 만들고자 한다!
녹칸다의 산업용 아두이노 편에서 의도하지 않게 rs232버전의 modbus master 코드가 구현되었는데 그 코드를 rs485버전으로 바꾸는 것이 주요 목표이다!
일단 전반부에 rs232버전의 모드버스 마스터를 산업용 아두이노에서 구동시키는 것을 보이고 rs485버전으로 넘어가도록 한다!
(녹칸다가 보유한 모드버스 제품중에 rs232통신을 하는 것은 산업용 아두이노가 유일하기 때문)
현재 녹칸다가 보유한 모드버스 제품은 온습도센서(SHT20), 4채널 릴레이, 비접촉 전력량계(PZEM-016)가 있다!
(modbus protocol)
https://www.modbustools.com/modbus.html
(녹칸다의 산업용 아두이노 편에서 만든 rs232버전의 모드버스 마스터)
https://bota.tistory.com/2101
1.오늘의 주요 주제 : 아두이노 우노가 모드버스 마스터가 된다! RS232통신과 RS485통신을 이용해서 모드버스(MODBUS) RTU를 가능하도록 구현하는 것이 목표이다!(+과거의 녹칸다가 모드버스를 잘 모르던 시절에 했던 과오를 다시 수정/보완하는 시간을 가져보도록 함)
2.기본적으로 모드버스는 request & response방식으로 동작한다!(마스터 장비가 슬레이브에게 뭔가를 요구하고 슬레이브는 마스터가 요구한 타이밍에 응답으로써 뭔가를 전송하는 방식)
3.코일(Coil)과 레지스터(register)에 대해서 알아보기!
-코일은 0또는 1로 제어되는 뭔가(릴레이)
-0또는 1로 입력되는 뭔가(버튼을 눌렀다 안눌렀다)
-코일은 1bit로 표현된다!
-레지스터는 정수, 실수와 같은 숫자를 저장할 수 있는 저장공간
-레지스터는 1개당 16bit로 표현된다!
4.마스터와 슬레이브 장비간에는 어드레드맵이라는 장벽이 있다!
-마스터는 슬레이브의 어드레스맵에 데이터를 기록하고 슬레이브는 어드레스맵에서 마스터가 남긴 데이터를 확인해서 작동된다!
-마스터가 슬레이브가 해야할일을 포스트잇에 쪽지로 적어서 어드레스맵이라는 칠판에 붙혀놓고 도망가면 슬레이브가 발견한 즉시 포스트잇에 있는 내용을 수행하는 방식
01 READ COIL STATUS(read coil)
-마스터가 슬레이브의 코일 입력상태를 체크하는 펑션코드
-request(8bytes)
[국번] [0x01] [어드레스맵주소H] [어드레스맵주소L] [가져올갯수H] [가져올갯수L] [CRC_L] [CRC_H]
-예시) 04 01 00 0A 00 0D DD 98
-해석) 국번이 0x04인 장비에 coil값을 읽는다 시작주소는 10번지부터 시작해서 13개의 코일값을 익어오시오!
-이런느낌으로 해석하는 것이다!
5.녹칸다의 모드버스 rtu라이브러리를 구동시키기 위해서는 CRC라이브러리(0.1.2버전)와 queue라이브러리(1.7.0)가 필요하다!
-write single coil
-nm.nockanda_write_single_coil_queue(국번,코일주소,0xFF00 or 0x0000);
-read coils
-nm.nockanda_read_coils_queue(국번,시작번지,갯수,0x0000);
-read hoding register
-nm.nockanda_read_hoding_register_queue(국번,시작번지,갯수,0x0000);
-write single register
-nm.nockanda_write_single_register_queue(국번,주소,값);
6.rs232버전을 rs485버전으로 변경하기 위한 핵심내용
-아두이노 우노에 연결할 max485모듈은 아두이노와 serial로 연결되는데 데이터가 송신인지 수신인지를 결정하는 핀이 별도로 존재한다!
-rs232통신은 데이터 방향을 결정하는 핀이 없기 때문에 내가 필요하면 그냥 송수신을 하면 된다!
-그러나 rs485통신은 request할때는 송신모드고 response를 받을때는 수신모드로 전환해주어야 모드버스 작동이 가능하다!
(아직 미완성) read coils, write multiple resigister
(예제순서)
1.rs232버전의 아두이노 마스터 코드를 구현하시오!
2.rs485버전의 아두이노 마스터 코드를 구현하시오!
3.rs485버전의 아두이노 마스터로 4채널 릴레이를 제어하시오!
4.rs485버전의 아두이노 마스터로 sht20 산업용 온습도센서의 측정값을 읽어오기!
5.rs485버전의 아두이노 마스터로 CT센서(PZEM-016)의 측정값을 읽어오기!