반응형

https://youtube.com/live/DPL3s3Cpyhw

[아두이노#615] Arduino에 W5500을 연결해서 C#윈폼으로 모드버스(modbus) TCP의 프로토콜에 대해서 이해하고 통신하는 방법 알아보기!(녹칸다의 아두이노 시즌2)

녹칸다의 아두이노 시즌2 시리즈이다!

614편에서 했던 fc01과 fc05에 이어서 다른것들도 해보도록 하자!

(modbus protocol)
https://www.modbustools.com/modbus.html#function15

(write multiple coil 예시)
        국번   FC   시작주소    코일갯수   길이   데이터(bin)
req : 0x11 0x0F 0x00 0x13 0x00 0x0A 0x02 0xCD 0x01
1.현재 슬레이브의 국번은 0x11인데 modbus tcp에서는 완전 의미가 없음!
2.펑션코드가 0x0F인것은 10진수로하면 15이고 write multiple coil임을 의미한다!
3.시작주소는 16bit로 표현(=1word)되고 0x0013은 10진수로하면 19이고 코일주소 19번지부터 시작해서 연속적으로 쓰기작업을 하겠음을 의미한다!
4.코일 갯수도 16bit로 표현되고 0x000A는 10진수로하면 10이기 때문에 19번지부터 시작해서 연속적으로 10개의 코일을 쓰기작업하겠다라는 의미이다!
5.길이부분은 코일1개당 1bit로 표현되기 때문에 10개의 코일을 제어하고자 한다면 10bit를 의미하고, 통신의 최소단위는 byte단위인데, 1byte는 8bit이기때문에 10bit는 1byte로 표현할 수가 없으므로 최소 2byte가 필요하다!
6.데이터는 제어하고자 하는 코일읠 바이너리로 표현하고 bit의 order가 하위비트에서 상위비트 순으로 배치한다!
   1호차(26 ~ 19) : 11001101 
        -ON되는 번호 : 19, 21, 22, 25, 26
        -OFF되는 번호 : 20, 23, 24
   2호차(x,x,x,x,x,x,28,27) :  00000001
        -ON되는 번호 : 27
        -OFF되는 번호 : 28

(write single register)
1.아두이노를 포함한 슬레이브의 저장되어있는 변수값을 설정하는 명령!
2.기본 단위는 1word(=16bit)이고 사이즈만 지정되어있을뿐 어떤 자료형으로 활용할지는 마스터와 슬레이브간의 약속에 의해 결정된다!

(참고내용)
1.만약 슬레이브쪽에서 write multiple coil을 구현하는데 마스터쪽에서 전송하는 연속 쓰기 코일의 갯수가 가변적이라면 슬레이브에서 가변적인 갯수에 대한 처리를 해주어야한다!
2.그러나! 녹칸다는 예제의 난이도를 낮추기 위해서 마스터는 항상 미리 고정되어있는 코일의 갯수를 전송하는 것으로 한다!
           //국번 //FC //reg번호  //값
   (예시) 0x11 0x06 0x00 0x01 0x00 0x03
3.국번이 0x11이고 펑션코드는 0x06(write single register)이고 쓰고자하는 레지스터의 번호가 1번이고 쓰려는 값은 0x0003이다!
4.0x0003이 어떤의미를 가지는지는 마스터와 슬레이브쪽에 설정된 자료형에 따라 달라질수있다!
5.modbus tcp에서 16bit로 표현되는 주소라던지 갯수부분은 빅엔디안으로 표현하고 레지스터값은 리틀엔디안으로 표현하도록함!

(read input register)
1.펑션코드가 0x04이고 슬레이브에 센서값같은것을 읽어올때 활용된다!
2.read input register에 multiple이라는 키워드는 없지만 기본적으로 연속읽기 기능으로 동작한다!
                //국번 //FC  //시작주소 //읽어올 레지스터의 갯수
   (REQ예시) 0x01 0x04 0x00 0x00 0x00 0x02
             해석 국번이 0x01인 슬레이브에 input register를 읽는데 시작주소가 0이고 2개의 레지스터값(=32bit)을 읽겠다!
                 //국번 //FC //길이 //reg0      //reg1
   (RES예시) 0x01 0x04 0x04 0x00 0x06 0x00 0x05
             해석 0국번이 0x01인 슬레이브의 input register 0번지의 값은 0x0006이고 1번지의 값은 0x0005이다!



(예제목차)
1.지금 아두이노에 디지털2번핀부터 7번핀까지 LED가 연결되어있는데, 코일주소 0~5까지 번호로 어드레스를 맵핑하고 마스터에서 write multiple coil명령으로 일괄적으로 제어될 수 있도록 하시오!
   (예시) 녹칸다가 0, 3, 5은 켜고, 1,2,3번은 끄고싶은 상황이다!
      req(RTU) : 0x01 0x0F 0x00 0x00 0x00 0x06 0x01 0x29
      req(TCP) : 0x00 0x00 0x00 0x00 0x00 0x08 0x01 0x0F 0x00 0x00 0x00 0x06 0x01 0x29
      res(RTU) : 0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x0F 0x00 0x00 0x00 0x06

615-1(fc15연속코일쓰기).txt
0.01MB
example615_1.zip
0.31MB

 

2.아두이노에 16bit 부호가 없는 정수와 부호가 있는 정수 2개가 있을 경우 마스터쪽에서 쓰기작업을 해서 값을 변경시켜보시오!
     레지스터 0번 : int16_t (16bit)  <- 여기에 -12345대입
     레지스터 1번 : uint16_t (16bit) <- 여기에 56789대입

615-2(fc06레지스터쓰기).txt
0.01MB
example615_2.zip
0.31MB

 

3.아두이노에 저장되어있는 값이 있는데 read Input register를 이용해서 읽어오시오!
     input 레지스터 0번에 -12345가 대입되어있음!
     input 레지스터 1번에 56789가 대입되어있음!

615-3(fc04레지스터읽기).txt
0.01MB
example615_3.zip
0.31MB

 

4.아두이노에 저장된 값이 32bit 실수형 데이터 2개가 있다 이값을 read input register를 이용해서 읽어오시오!(레지스터 4개를 읽어오면 가능함)

615-4(32bit전송하기).txt
0.01MB
example615_4.zip
0.31MB

반응형
Posted by 덕력킹
,