[아두이노#614] Arduino에 W5500을 연결해서 C#윈폼으로 모드버스(modbus) TCP의 프로토콜에 대해서 이해하고 통신하는 방법 알아보기!(녹칸다의 아두이노 시즌2)
프로그래밍/W5500과 modbus tcp 2024. 8. 19. 23:14
https://youtube.com/live/kBNqc-gWM-A
[아두이노#614] Arduino에 W5500을 연결해서 C#윈폼으로 모드버스(modbus) TCP의 프로토콜에 대해서 이해하고 통신하는 방법 알아보기!(녹칸다의 아두이노 시즌2)
녹칸다의 아두이노 시즌2 시리즈이다!
이번편은 본격적으로 예제를 modbus tcp로 구현하도록 한다!
이 내용은 완벽하게 모드버스가 구현되었다기 보다는 원리를 이해할 수 있을 정도로 간단하게 구현하는것을 목표로 한다!
(modbus rtu 설명페이지)
https://www.modbustools.com/modbus.html#Function01
(접근방법)
1.modbus rtu가 어떻게 생겼는지를 이해한다.
2.modbus rtu에서 tcp로 변경될때 CRC16은 제외된다!
3.modbus tcp는 rtu데이터앞에 6바이트의 헤더가 붙는다!
(기본설명)
코일 : 1bit단위
레지스터 : 16bit단위 (1레지스터 = 16bit의 저장공간)
우리가 해야할 펑션코드(FC)의 종류는? 1,2,3,4,5,6,15,16이다!
국번 : 슬레이브의 ID인데, modbus tcp에서는 사실 국번이라는게 필요하지 않는다! tcp커넥션은 마스터와 슬레이브가 ip주소를 기반으로 접속하기 때문에 각 슬레이브는 이미 연결단계에서 부터 고유한 IP주소를 부여받는다! 그러나 modbus rtu데이터를 tcp는 그대로 사용하기 때문에 국번에 대한 데이터가 존재하기는 하지만 사용되지는 않는다!
01 (0x01) Read Coils : R/W코일에서 읽기작업을 하겠다!
02 (0x02) Read Discrete Inputs : R코일에서 읽기작업을 하겠다!
03 (0x03) Read Holding Registers : R/W레지스터 읽기작업을 하겠다!
04 (0x04) Read Input Registers : R레지스터 읽기작업을 하겠다!
05 (0x05) Write Single Coil : R/W코일에서 1bit에 대해서 쓰기작업을 하겠다!
06 (0x06) Write Single Register : R/W레지스터에서 1개의 레지스터에 대해서 쓰기작업을 하겠다!(16bit 쓰기작업)
15 (0x0F) Write Multiple Coils : R/W코일에서 2bit이상의 쓰기작업을 하겠다!
16 (0x10) Write Multiple Registers : R/W레지스터에서 32bit이상 쓰기작업을 할경우
(깨알지식)
1.펑션코드 0x05는 request 데이터 프레임이 항상 8byte로 고정되어있다!
2.펑션코드 0x05는 슬레이브가 마스터에서 request를 받은다음 request를 그대로 response로 전송한다.
3.마스터는 내가보는 request가 에러처리가 안되어서 돌아온것만으로 슬레이브와 통신이 완료된거라고 간주할수있다!
4.만약에 아두이노의 디지털 2번핀에 LED가 연결되어있는데 LED를 켤려면 코일주소 몇번에다가 켜는 명령을 전송해야할까?
5.아두이노의 디지털2번핀이 코일주소로 몇번이다라고 하는 것은 사용자가 정의하는 것이고 그 정의된 개념을 어드레스맵이라고 부른다!
6.아두이노 610~613편까지는 마스터와 슬레이브가 TCP커넥션을 맺으려면 birth massage를 마스터가 슬레이브로 전송해주어야 가능했었다!(아두이노쪽 라이브러리를 만든사람이 그렇게 구현해놓음)
7.어차피 접속이 완료된다음 modbus tcp데이터를 전송할거기때문에 지금부터는 birth msg라는 이상한개념은 삭제하도록한다!
8.그다음할 펑션코드 1번인 read coils는 주고받는 데이터의 길이가 가변적이기 때문에 약간 어려움!
(예제목차)
1.modbus rtu데이터를 참고해서 write single coil기능을 tcp로 구현하시오!(FC = 0x05)
REQ(ON): 0x00 0x01 0x00 0x00 0x00 0x06 0x01 0x05 0x00 0x00 0xFF 0x00
REQ(OFF): 0x00 0x01 0x00 0x00 0x00 0x06 0x01 0x05 0x00 0x00 0x00 0x00
2.예제 1번에서 마스터쪽에서 메시지번호와, 국번과, 코일번호 등을 설정할 수 있는 UI를 구성하고 아두이노의 디지털2번~7번핀에 연결된 LED를 제어하시오!
{코일 0 : 디지털 2번핀}
{코일 1 : 디지털 3번핀}
{코일 2 : 디지털 4번핀}
{코일 3 : 디지털 5번핀}
{코일 4 : 디지털 6번핀}
{코일 5 : 디지털 7번핀}
3.예제2번에서 펑션코드1번인 read coils를 추가해서 6개 연결해놓은 LED의 상태를 읽어오고 LED의 상태를 UI로 표현하시오!