아두이노 - 모드버스 | Arduino - Modbus

이 튜토리얼에서 우리는 다음을 배우게 될 것입니다:

모드버스란 무엇인가요?

Modbus는 장치와 장치, 장치와 소프트웨어/앱, 그리고 장치들과 HMI 사이의 통신에 사용되는 프로토콜입니다. 산업 분야에서 장치를 제어/모니터링하는 데 널리 사용됩니다.

간단한 말로, Modbus는 장치가 다른 장치, 소프트웨어/앱, 그리고 HMI 장치와 통신하기 위해 사용하는 언어입니다.

이 튜토리얼은 아두이노에 관한 것이므로, 아두이노장치를 나타냅니다. 모드버스를 사용하여, 우리는 만들 수 있습니다:

  • 두 개의 아두이노가 출력/입력을 제어/모니터하기 위해 서로 대화합니다.
  • 아두이노가 PC상의 소프트웨어나 스마트폰 앱과 대화합니다.
  • 아두이노가 HMI 장치와 대화합니다.

예를 들어, 4개의 스위치를 가진 아두이노 #1은 장거리를 통해 4개의 전구를 가진 아두이노 #2를 제어합니다.

모드버스가 필요한 이유는 무엇인가?

모드버스(Modbus)의 대안이 있습니까? 있다면, 모드버스를 언제 사용해야 하나요? 대안을 언제 사용해야 하나요?

이 질문들에 답하기 위해, 한 사례를 고려해 봅시다: 장거리에 걸쳐 아두이노 #1에 연결된 스위치가 아두이노 #2에 연결된 LED를 제어합니다.

button control led over long distance

가장 간단한 Modbus의 대안 방법은 직접 간단한 프로토콜을 정의하는 것입니다:

  • 아두이노 #1:
    • 스위치가 켜질 때, 아두이노 #1은 값이 1인 바이트(명령어)를 아두이노 #2로 보냅니다.
    • 스위치가 꺼질 때, 아두이노 #1은 값이 0인 바이트(명령어)를 아두이노 #2로 보냅니다.
  • 아두이노 #2:
    • 받은 바이트가 1이면, LED를 켭니다
    • 받은 바이트가 0이면, LED를 끕니다

    위의 프로토콜은 표준 프로토콜이 아니라 우리 자신이 정의한 것입니다. 다음과 같은 경우에 더 정의해야 합니다:

    • 아두이노 #1아두이노 #2가 명령을 성공적으로 수행했는지 알고 싶어합니다.
    • 아두이노 #1아두이노 #2의 LED 상태를 확인하고 싶어합니다.
    • 아두이노 #1은 여러 스위치로 아두이노 #2의 여러 LED를 제어하고 싶어합니다.
    • 아두이노 #1은 스위치 하나로 아두이노 #2의 LED를 제어하고 싶고, 아두이노 #2아두이노 #1의 LED를 제어하기 위해 스위치를 사용하고 싶어합니다.
    • 그리고 더 많은 사용 사례.

    우리 스스로 모든 명령어를 정의하는 것은 쉽지 않습니다. 위의 요구 사항들을 혼합하면 문제가 더 복잡해집니다. 그리고 우리는 오류가 없다는 것을 보장할 수도 없습니다.

    우리 스스로 프로토콜을 정의할 때 또 다른 문제가 발생합니다. 다른 사람이 정의한 프로토콜을 사용한 다른 아두이노와 우리의 아두이노가 작동하기를 원한다면, 우리가 함께 협력하고 자체 정의된 프로토콜을 공유하지 않는 한 불가능합니다.

    그것들이 우리가 Modbus 프로토콜이 필요한 이유입니다. 만약 우리가 Modbus 프로토콜을 사용한다면:

    • 우리는 명령어를 정의할 필요가 없습니다. 모드버스가 모든 경우에 대해 정의되어 있습니다. 우리는 단지 그것을 구현하기만 하면 됩니다.
    • 우리의 장치는 모드버스를 지원하는 다른 장치/소프트웨어와 장치/소프트웨어의 제작자와 협업하지 않고도 작업할 수 있습니다.

    Modbus 프로토콜을 Arduino에 사용한다면, 우리 Arduino를 제어/모니터링하기 위해 많은 무료 소프트웨어/앱을 사용할 수 있습니다.

Modbus 사용 시기 및 사용하지 않아야 할 시기

Modbus 프로토콜은 초보자들이 이해하고 구현하기 쉽지 않으며, Modbus 라이브러리가 제공되더라도 마찬가지입니다. 따라서 위에서 설명한 것처럼, 단순한 자체 정의 프로토콜을 사용하는 것이 괜찮습니다. 만약:

  • 시스템은 간단합니다. 예를 들어, 아두이노 #1에 있는 몇 개의 스위치가 아두이노 #2에 있는 몇 개의 LED를 제어합니다.
  • 아두이노는 다른 제작자의 다른 장치/소프트웨어와 작동할 필요가 없습니다.

Modbus를 사용해야 할 때는:

  • 시스템이 복잡하다
  • 시스템은 고신뢰성이 요구된다
  • 아두이노는 다른 제작자의 다른 장치/소프트웨어와 함께 작동해야 한다

※ NOTE THAT:

Modbus를 대체할 수 있는 표준 프로토콜과 비표준 프로토콜이 몇 가지 더 있습니다. 이들은 이 튜토리얼의 범위를 벗어납니다.

Modbus 프로토콜이 어떻게 작동하는가

앞서 설명한 바와 같이, Arduino는 Modbus 프로토콜을 통해 소프트웨어/앱, HMI 장치 혹은 다른 Arduino와 통신할 수 있습니다. 이 튜토리얼은 Modbus 통신의 예로서 두 Arduino 간의 통신을 다룹니다. 다른 것들도 마찬가지입니다.

개념들

Modbus에서는 몇 가지 개념들이 있습니다:

  • 마스터슬레이브
  • 요청응답
  • 함수 코드(FC)와 주소

Modbus 프로토콜은 마스터-슬레이브 모델에서 작동합니다. 두 개의 아두이노 중 하나는 반드시 마스터로 작동해야 하며, 다른 하나는 슬레이브로 작동합니다.

마스터요청을 보내고, 슬레이브응답을 보냅니다.

modbus Master Slave

Master가 보낸 요청에는 기본적으로 다음 정보가 포함됩니다:

  • 기능 코드(FC): 1바이트, 명령어로, 슬레이브가 무엇을 해야 하는지를 알려줍니다. 예를 들어, 디지털 입력 핀, 디지털 출력 핀 또는 아날로그 입력 핀의 상태를 읽거나, 디지털 출력 핀을 제어합니다.
  • 주소: 2바이트, 핀을 식별하는 데 사용됩니다. 각 디지털 입력 핀, 디지털 출력 핀, 아날로그 입력 핀에는 주소가 주어집니다.
  • 데이터 (예, 제어 값)

요청을 받은 후, 슬레이브는 해당하는 조치를 취하고 조치의 결과 또는 마스터가 요청한 정보를 포함하는 응답을 돌려보냅니다.

함수 코드

기능 코드는 Modbus 표준에 의해 정의되었습니다. 많은 기능 코드가 있습니다. 아래에 몇 가지 기본 기능 코드를 살펴보겠습니다:

  • FC 01 (코일 읽기): 하나 또는 여러 디지털 출력 핀의 상태를 읽는 데 사용되는 명령입니다.
  • FC 05 (단일 코일 쓰기): 하나 또는 여러 디지털 출력 핀의 상태를 제어(쓰기)하기 위해 사용되는 명령입니다.
  • FC 02 (이산 입력 읽기): 하나 또는 여러 디지털 입력 핀의 상태를 읽는 데 사용되는 명령입니다.

"FC 01"은 함수 코드의 값이 0x01임을 의미합니다.

함수 코드가 더 있습니다. 초보자들이 과부하에 시달리지 않도록, 이 튜토리얼에서는 일부 필수 함수 코드만을 소개합니다.

아두이노 Modbus 라이브러리를 사용할 때, 다음을 해야 합니다:

  • 사용할 함수 코드를 결정하세요
  • 각 아두이노 핀에 대한 주소를 지정하세요 (사용하는 핀에만 해당)

다음 튜토리얼에서 Modbus 라이브러리 사용에 대한 자세한 지침이 제공될 예정입니다. 새로운 튜토리얼 알림을 받으려면 우리의 Facebook 페이지를 좋아해주세요.

Arduino 마스터는 자신의 디지털 입력 핀의 상태를 읽고, 그런 다음 Arduino 슬레이브의 디지털 출력 상태를 제어할 수 있으며, 반대의 경우도 마찬가지입니다.

예를 들면:

  • 아두이노 마스터는 LED #M, SWITCH #M에 연결되어 있습니다.
  • 아두이노 슬레이브는 LED #S, SWITCH #S에 연결되어 있습니다.
  • SWITCH #M이 LED #S를 제어하게 하고, SWITCH #S가 LED #M을 제어하게 합시다.
arduino modbus led switch

해결책:

  • 마스터가 스위치 #M의 상태를 읽고 → 슬레이브에게 LED #S를 스위치 #M의 상태에 따라 제어하도록 요청을 보냄 → 슬레이브가 LED #S를 제어하고 응답을 보냄
  • 마스터가 스위치 #S의 상태를 읽도록 슬레이브에게 요청을 보냄 → 슬레이브가 스위치 #S의 상태로 응답함 → 마스터가 스위치 #S의 상태에 따라 LED #M을 제어함

※ NOTE THAT:

위에서, 우리는 초보자를 위해 "디지털 입력 핀", "디지털 출력 핀" 용어를 사용합니다. 사실, "디지털 입력 핀"은 오직 읽기만 가능한 장치의 상태를 나타내며, "디지털 출력 핀"은 읽기/쓰기가 가능한 장치의 상태를 나타냅니다.

Modbus는 여러 마스터와 여러 슬레이브를 지원할 수 있습니다.

Modbus는 디지털 입력/출력뿐만 아니라 아날로그 입력/출력에도 사용할 수 있습니다.

Modbus RTU/ASCII와 Modbus TCP

Modbus에는 Modbus RTU, Modbus ASCII, Modbus TCP 세 가지 인기 있는 유형이 있습니다. 모든 Modbus 유형에 대한 작동 원리는 위에서 설명한 대로 동일합니다. 각 Modbus 유형은 네트워크 환경에 맞게 설계되었습니다: 직렬 또는 TCP.

시스템 다이어그램

modbus tcp vs modbus rtu/ascii

프로토콜 스택

modbus tcp vs modbus rtu/ascii

Modbus RTU/ASCII와 Modbus TCP의 차이점

Modbus RTU/ASCII Modbus TCP
Over serial (RS-232/RS-422/RS-485) Over TCP
Support single transaction(*) Support multiple transactions(**)
  • (*): Modbus RTU/ASCII는 단일 트랜잭션만을 지원합니다. 즉, 마스터가 Modbus 요청을 보낼 때, 다른 요청을 보내기 전에 Modbus 응답이나 타임아웃을 기다려야 합니다.
  • (**): Modbus TCP는 다중 트랜잭션을 지원합니다. 즉, 마스터가 Modbus 요청을 보낼 때, Modbus 응답을 기다릴 필요가 없습니다. 연속적으로 여러 요청을 보낼 수 있습니다. 응답요청과 일치시키기 위해 Modbus TCP는 "트랜잭션 ID"라고 하는 추가 필드를 가지고 있습니다. 요청과 해당 응답은 같은 트랜잭션 ID를 가집니다.

아두이노 Modbus 라이브러리 사용 방법

Modbus 라이브러리 덕분에 아두이노에서 Modbus를 사용하는 것이 간소화되었습니다.

우리는 Modbus 라이브러리 사용 방법에 대한 튜토리얼을 만들 예정입니다. 새 튜토리얼 알림을 받으려면 우리의 Facebook 페이지를 좋아해주세요.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!