ESP32 - 모드버스 | ESP32 - Modbus
이 튜토리얼은 ESP32를 Modbus 프로토콜로 사용하는 방법을 안내합니다.
Modbus에 관하여
Modbus는 장치 간, 장치에서 소프트웨어/앱으로, 그리고 장치에서 HMI로의 통신을 가능하게 하는 프로토콜입니다. 이는 산업용 장치에서 널리 사용됩니다.
우리는 Modbus가 장치, 소프트웨어/앱, 그리고 HMI 간의 통신 언어라고 상상할 수 있습니다.
모드버스에는 세 가지 널리 사용되는 유형이 있습니다: 모드버스 RTU, 모드버스 ASCII, 모드버스 TCP:
- Modbus RTU와 Modbus ASCII는 직렬선(RS-232/RS-422/RS-485)을 통해 사용됩니다.
- Modbus TCP는 이더넷이나 WiFi를 통해 사용됩니다.
모드버스를 사용하는 이유는 무엇인가요?
구체적인 예를 들어봅시다:
- 스위치에 연결된 ESP32 #1
- LED에 연결된 ESP32 #2
- ESP32 #1과 ESP32 #2는 서로 멀리 떨어져 있습니다
- 스위치를 ON으로 전환하면 LED를 켭니다.
- 스위치를 OFF로 전환하면 LED를 끕니다.
위 예를 구현하는 가장 쉬운 방법은 우리 스스로 간단한 프로토콜을 정의하는 것입니다:
- ESP32 #1은 스위치의 상태 변화에 대해 ESP32 #1에게 정보를 전달하기 위해 1바이트의 데이터를 보냅니다. 데이터 바이트의 값은 다음과 같습니다:
- 1: 스위치를 켤 때
- 0: 스위치를 끌 때
- ESP32 #2가 ESP32 #1로부터 1바이트의 데이터를 받았을 때, 값이 다음과 같으면:
- 1: LED를 켭니다
- 0: LED를 끕니다
- ESP32 #1은 명령이 ESP32 #2에 의해 성공적으로 수신되고 실행되었는지 확인하고 싶어 합니다.
- ESP32 #1은 ESP32 #2에 있는 여러 개의 LED를 제어하고 싶어 합니다.
- ESP32 #2는 ESP32 #1에 있는 스위치의 상태를 적극적으로 읽고 싶어 합니다.
- ESP32 #2는 스위치를 사용하여 ESP32 #1의 LED를 제어하고 싶어 합니다.
- 그리고 더 많은 경우들도 있습니다.
- 명령을 정의할 필요가 없습니다. Modbus가 모든 사용 사례에 대해 정의했습니다.
- ESP32는 Modbus를 사용하는 모든 장치/소프트웨어와 함께 작동할 수 있습니다.
위의 정의는 ESP32 #1의 스위치로 ESP32 #2의 LED를 제어하게 합니다. 그러나, 몇 가지 경우를 상상해 봅시다:
우리 스스로 모든 사용 사례를 지원하는 것은 쉽지 않습니다.
우리 자신이 프로토콜을 사용할 때 또 다른 문제가 발생합니다. ESP32는 다른 프로토콜을 사용하는 다른 장치와 통신할 수 없습니다.
⇒ 우리는 위의 모든 문제를 해결할 수 있는 표준 프로토콜이 필요합니다 ⇒ Modbus 프로토콜은 사용할 수 있는 표준 프로토콜입니다.
Modbus 프로토콜이 사용자 정의 프로토콜보다 가지는 장점:
Modbus를 사용해야 할 때와 사용해서는 안 될 때
Modbus 프로토콜은 이해하고 구현하기 쉽지 않으며, Modbus 라이브러리가 있더라도 마찬가지입니다. 위에서 설명한 대로 간단한 자체 정의 프로토콜을 사용할 수 있습니다:
- 시스템은 간단합니다. ESP32 #1의 스위치가 ESP32 #2의 LED를 제어합니다.
- ESP32는 다른 장치/소프트웨어와 작동할 필요가 없습니다.
Modbus를 사용해야 할 때:
- 시스템이 복잡합니다.
- 시스템은 높은 신뢰성이 필요합니다.
- ESP32는 다른 장치/소프트웨어와 함께 작동해야 합니다.
Modbus 프로토콜 작동 방식
개념들
Modbus에서 여섯 가지 중요한 개념이 있습니다:
- 마스터와 슬레이브
- 요청과 응답
- 함수 코드 (FC) 와 주소
두 ESP32가 Modbus를 사용하여 서로 통신할 때:
- 한 ESP32는 마스터로 작동합니다.
- 다른 ESP32는 슬레이브로 작동합니다.
마스터가 슬레이브에게 요청을 보내고, 슬레이브는 응답을 마스터에게 보낸다.
마스터가 슬레이브에게 보낸 요청에는 다음 정보가 포함됩니다:
- 기능 코드 (FC): 1바이트로, 슬레이브에게 무엇을 해야 하는지를 명령합니다. 예를 들어, 디지털 입력 핀, 디지털 출력 핀 또는 아날로그 입력 핀의 상태를 읽거나, 디지털 출력 핀을 제어합니다.
- 주소: 2바이트로, 슬레이브에게 어디에서 작업을 해야 하는지를 알려줍니다. 예를 들어, 각각의 디지털 입력/출력 및 아날로그 입력 핀에는 고유한 주소가 부여됩니다.
- 데이터 (예: 제어값)
마스터로부터 요청을 받을 때, 슬레이브는 해당하는 조치를 취하고 응답으로 결과를 되돌려 보냅니다.
함수 코드
모드버스 표준은 많은 기능 코드를 정의합니다. 초보자를 과부하시키지 않기 위해 몇 가지 필수 기능 코드를 살펴봅시다:
- FC 01 (Read Coils): 디지털 출력 핀의 상태를 읽는 명령입니다.
- FC 02 (Read Discrete Inputs): 디지털 입력 핀의 상태를 읽는 명령입니다.
- FC 05 (Write Single Coil): 디지털 출력 핀의 상태를 제어(쓰기)하는 명령입니다.
FC 01은 기능 코드의 값이 0x01임을 나타냅니다.
ESP32 Modbus 라이브러리를 사용할 때, 다음 사항을 결정해야 합니다:
- 사용할 함수 코드
- 사용할 주소
우리가 처음에 언급한 예를 실현해 봅시다:
- ESP32 마스터는 LED #M, SWITCH #M에 연결되어 있습니다
- ESP32 슬레이브는 LED #S, SWITCH #S에 연결되어 있습니다
- SWITCH #M으로 LED #S를 제어하고, SWITCH #S로 LED #M을 제어합시다
방법:
- ESP32 마스터가 스위치 #M의 상태를 읽어 슬레이브로 LED #S를 제어하라는 요청을 보냅니다 → 슬레이브는 LED #S를 제어하고 응답을 보냅니다.
- ESP32 마스터가 스위치 #S의 상태를 읽으라는 요청을 슬레이브에 보냅니다 → 슬레이브는 스위치 #S의 상태를 응답으로 보내고 → 마스터는 LED #M을 제어합니다.
Modbus RTU/ASCII 및 Modbus TCP
앞에서 언급했듯이, 널리 사용되는 Modbus 유형에는 Modbus RTU, Modbus ASCII, Modbus TCP가 있습니다.
시스템 다이어그램
프로토콜 스택
ESP32용 Modbus 라이브러리가 제공됩니다. Modbus 라이브러리 사용법에 대한 자세한 안내는 다른 튜토리얼에서 제공될 예정입니다. 업데이트를 받으려면 페이스북 페이지를 좋아해주세요.