[아두이노#616] 모드버스(modbus) TCP에 대해서 마무리하고 마스터쪽에 Nmodbus4 라이브러리 활용해보기!(녹칸다의 아두이노 시즌2)
프로그래밍/W5500과 modbus tcp 2024. 8. 26. 23:00
https://youtube.com/live/jOG4-HUsFh4
[아두이노#616] 모드버스(modbus) TCP에 대해서 마무리하고 마스터쪽에 Nmodbus4 라이브러리 활용해보기!(녹칸다의 아두이노 시즌2)
녹칸다의 아두이노 시즌2 시리즈이다!
이번편은 modbus tcp 프로토콜에서 남아있는 펑션코드에 대해서 간단히 알아보고 마스터에 라이브러리를 적용해보도록 한다!
마스터는 C#윈폼으로 직접 modbus tcp명령을 전송하도록 했는데, 이제부터는 nmodbus4라는 아주 대표적인 라이브러리를 다운로드 받아서 적용해보도록 한다!
지금부터는 modbus tcp에 대해서 이해를 하고 있으면 마스터쪽에서는 라이브러리 함수만 호출하면 바로 작동이 되는 것이다!
우리는 슬레이브쪽 구현에만 신경을 쓰면 된다!
(검증해봐야하는 목차)
614-2(fc5로led제어해보기) : 검증완료됨!
614-3(fc01과fc05를동시에적용하기) : 검증완료됨!
615-1(fc15연속코일쓰기)
615-2(fc06레지스터쓰기)
615-3(fc04레지스터읽기)
615-4(32bit전송하기)
616(fc16)
(write multiple register req 해석하기)
//id //fc //시작주소 //갯수 //len //레지스터1 //레지스터2
0x11 0x10 0x00 0x01 0x00 0x02 0x04 0x00 0x0A 0x01 0x02
슬레이브의 id(국번)가 0x00이고, 펑션코드가 0x10(16)으로 write multiple register이고, 시작주소가 16bit로 0x0001이고, 쓰고자하는 레지스터의 갯수가 0x0002로 2개이고, 앞으로 2개의 레지스터가 나오게 될건데 레지스터 1개당 2byte이니까 len부분은 4가 되어야한다! 이어서 첫번째 레지스터의 값이 0x000A이고 두번째 쓰고자 하는 레지스터의 값이 0x0102이다!
주의사항1.write multiple register는 연속적으로 레지스터를 쓰는것만 가능하다!
주의사항2.write multiple register는 연속으로 쓰려고하는 레지스터에 갯수에 따라서 길이가 가변적이다!
(예시) 레지스터 4개를 쓰려고한다(길이가 길어지거나 짧아질 수 있음)
0x11 0x10 0x00 0x01 0x00 0x04 0x08 0x00 0x0A 0x01 0x02 0xAA 0xBB 0xCC 0xDD
(write multiple register res 해석하기)
//id //rc //시작주소 //갯수
0x11 0x10 0x00 0x01 0x00 0x02
나 슬레이브 0x11인데, 0x10에 대한 명령을 수행했고, 시작번지가 0x0001이였고 쓰려고 하는 레지스터 갯수가 0x0002개 인데 맞지?
(참고자료)
1.지금 w5500으로 구현되어있는 아두이노쪽 코드는 TCP서버의 역할을 수행하는데, 단 1개의 소켓만 생성할 수 있으므로 마스터는 유일하다!
2.만약 2개 이상의 클라이언트가 아두이노쪽에 연결하고자 한다면 매우 어려운일이 될 수 있다!
2.modbus tcp에서 메시지운터값이라던지 레지스터번호 등등을 빅엔디안으로 표현하기 때문에 아두이노쪽에서 바이트를 스왑해서 해석해야하지만, 레지스터에 쓰고자 하는 값은 마스터와 슬레이브끼리 서로 합의만 하면 되므로 리틀엔디안으로 표현해도 상관없다!
3.녹칸다는 레지스터 쓰기작업시 전송하는 값을 리틀엔디안으로 보내는걸로 한다!
4.write multiple register는 16bit단위로된 변수에 값을 업데이트하기 위한 목적보다는 32bit이상의 데이터에 쓰기작업을 하기 위한 용도로 사용된다!
5.nmodbus4 라이브러리는 2.1.0버전을 설치하도록 함!
6.녹칸다가 직접 마스터를 구현할때 슬레이브쪽에서 오는 응답을 받기 위해서 메시지 수신부를 직접구현했는데 nmodbus4라이브러리는 request를 전송하고 response를 수신하는 것까지 폴링방식으로 구현되어있기 때문에 메시지 수신부를 별도로 구현할 필요가 없음!
(예제목차)
1.펑션코드 16번인 write multiple register의 기능을 구현하고 16bit정수 2개를 전송해서 아두이노 내부에 있는 메모리값을 수정하고 1초간격으로 시리얼 모니터에 출력하시오!
2.아두이노에 uint16_t배열이 길이가 10인상태로 있다! 이 말은 레지스터가 0~9의 주소를 가질수있음을 의미한다! 여기서 레지스터 4번지부터 2개의 값을 연속쓰기 작업을 하도록 수정하시오!
3.아두이노에 32bit 실수형이고 길이가 5인 float 배열이 있을때 모드버스 쓰기작업으로 float데이터의 값을 변화시켜보시오!
4.녹칸다가 614-2번예제로 만들었던 write single coil예제에서 아두이노쪽 코드는 그대로 업로드하고 C#쪽을 nmodbus4라이브러리를 적용해서 제어해보시오!
5.이전 614-3번예제에서 fc05와 fc01이 동시에 적용되었던 예제를 라이브러리를 화용해서 제어해보시오!