image





MODBUS-TCP 통신으로 코노텍 온도제어기 제어하기

정보처리기사 시험접수





개요

  • 고객사에서 냉동창고 온도제어기를 실시간으로 조회, 제어 할 수 있는 솔루션을 요청하였음
  • 시중에 판매되고있는 온도제어기 가운데, 성능과 가격을 비교하여 코노텍 온도제어기를 선택하였음



구성

image

  • 코노텍 온도제어기 DXFOX-XR10는 RS485, Modbus RTU를 지원함
  • 통신컨버터 HF2211A가 Modbus RTU를 Modbus TCP로 변환하여 무선와이파이 통신을 가능하게 함
  • 온도제어기와 통신컨버터는 유선연결하고, 통신컨버터와 UI는 와이파이로 무선연결 함

image



준비

  • 인터넷 구매로 온도제어기와 통신컨버터 구입
  • 각각 매뉴얼 다운로드
  • 각각 전원 연결





통신

RS485 결선

  • 시리얼 통신에서 자주 사용하는 통신 방식에는 RS232, RS422, RS485 등이 있음
  • RS232는 1:1통신을 지원하지만, RS485는 N:N통신을 지원하여 약32개의 장치를 연결할 수 있음
  • RS485의 연결방식은 전이중방식(4개 선 연결)과 반이중방식(2개 선 연결)이 있음
  • 통신컨버터(HF2211A)는 전이중방식, 반이중방식을 지원하고, 온도제어기(DXFOX-XR10)는 반이중방식만 지원함
  • 통신컨버터와 온도제어기의 RS485의 +, - 를 잘 보고, 반이중방식으로 연결



온도제어기 프로토콜

  • 온도제어기 통신 매뉴얼 참조하여 통신 프로토콜 분석
  • 필요한 기능은 두가지임

    기능 1. 현재 온도 읽어오기
    기능 2. 온도 설정 하기

  • 매뉴얼을 찾아보면 “현재온도”의 “읽기” 기능은 “Func 0x04 : Read Input Registers”기능의 “레지스터 30101”, “주소 0064”라고 되어있음
  • 매뉴얼을 찾아보면 “설정온도”의 “쓰기” 기능은 “Func 0x06 : Write Single Register”기능의 “레지스터 40003”, “주소 0002”라고 되어있음
  • EasyModbusTCP.NET을 활용하여 테스트

이슈 1. “주소 0064”는 16진수

  • “ILLEGAL DATA ADDRESS” 오류가 발생하는 경우 시작주소, 데이터 개수 범위가 맞지 않는 경우임
  • 매뉴얼에 주소 0064라고 나온 것은 16진수로 표현된 것이어서, 10진수로 변환하면 100이 됨
  • 데이터 요청시 10진수 100으로 요청하니 해결됨

이슈 2. “레지스터 30101”는 시작주소

  • “레지스터 30101”는 시작주소를 나타나내는데, 사용시 시작주소가 0부터 시작이면 100으로, 1부터 시작이면 101로 기입해야 함
  • 나의 경우에는 시작주소가 0부터 시작되도록 코딩을 하였기 때문에 시작주소를 100으로 요청하였음



현재 온도 가져오기

요청 프레임

Function Code Start Address High Start Address Low Data Length High Data Length Low
0X04 0X00 0X64 0X00 0X01
  • 현재온도를 읽어오는 것은 “Func 0x04 : Read Input Registers” 기능의 “주소 0064”에서 1byte의 데이터를 읽어오면 됨


응답 프레임

Function Code Data Length Data High Data Low
0X04 0X02 0X01 0X12
  • 응답프레임에서 0X01 0X12 이라는 16진수 값을 10진수로 변환하면 274임
  • 온도조절기 설정이 Int로 되어있어서 정수로 나오는 것인데, 실재 현재온도는 27.4℃ 임



온도 설정하기

요청 프레임 : 설정 온도를 1.2℃로 설정하기

Function Code Start Address High Start Address Low Data Length High Data Length Low
0X06 0X00 0X02 0X00 0X0C
  • 16진수 0X0C 는 10진수로 12임


응답 프레임

Function Code Start Address High Start Address Low Data Length High Data Length Low
0X06 0X00 0X02 0X00 0X0C
  • 요청에 성공하면 요청프레임을 그대로 돌려받음

요청 프레임 : 설정 온도를 -11.5℃로 설정하기

Function Code Start Address High Start Address Low Data Length High Data Length Low
0X06 0X00 0X02 0XFF 0X8D
  • 16진수 0XFF 0X8D는 10진수로 65421임
  • 최대값 65536에서 -115이기 때문에 이렇게 표시하는 것 같음


응답 프레임

Function Code Start Address High Start Address Low Data Length High Data Length Low
0X06 0X00 0X02 0XFF 0X8D
  • 요청에 성공하면 요청프레임을 그대로 돌려받음





후기

  • 아직은 낯설지만, Modbus 프로토콜은 전세계 표준이기 때문에 익숙해지면 도움이 많이 될 것 같음
  • ModbusRTU를 ModbusTCP로 바꿔주는 컨버터가 무선와이파이를 지원해서 매우 유용함
  • 메모리 주소를 참조할 때 16진수와 10진수를 잘 변환해야하고, 메모리 주소가 0부터 시작인지 1부터 시작인지도 잘 확인해야 함





참고자료





끝까지 읽어주셔서 감사합니다😉





댓글남기기