1. Modbus 와 SCADA 시스템
Modbus는 Modicon에서 처음 개발한 Protocol로 주로 Serial (RS485/RS232/RS422)와 TCP를 이용하여 사용되어지는 Protcol 이다.
대체적으로 보면 Modbus의 이용은 SCADA(Supervisory control and data acquisition)기반의 Platform 동작되는 것으로 보인다.
물론 유저에 따라 다르게 사용가능 할 것이며, 일단 SCADA의 기본구조부터 알아보자.
Serial (RS485/RS232/RS422)기반으로 Modbus를 처음 사용해보며,
주로 SCADA에서 쓰임새를 보니, PLC를 제어하기 위해서 사용하는 것 같다.
- SCADA의 시스템구조
중앙 컴퓨터에서 명령을 내리고 DATA를 얻어오는 구조이며, 각각의 Level을 부여하여 동작되어진다.
이곳에서는 Modbus이외 MQTT를 비롯하여, TCP/IP기반의 Protocol도 지원이 된다.
Modbus 관점에서 보면, Modbus의 기본구조는 Master / Slave 구조이기 때문에,
상위 Layer가 Master가 되고 하위 Layer가 Slave가 되는 구조인 것 같다.
https://en.wikipedia.org/wiki/SCADA |
중간 Level 2~3의 경우 경우에 따라 생략가능하며, 최종 Center 시스템으로도 Control이 가능할 것 같으며 상위 구조는 대규모 Control를 위한 구조
상위 Level 1이 실제 Modbus RTU로 IoT 혹은 최종 Device로 구성
SCADA
- SCADA의 구성 예제
실제 SCADA의 내부 세부 구성을 비롯하여, 관련부분을 이해하기에 너무 좋은 사이트 인 것 같다.
SCADA 와 PLC 연결 구성
- SCADA 와 각 구성 Index
SCADA 솔루션을 제공하는 것으로 보이며, Modbus ,MQTT 관련 설명 Index
1.1 SCADA의 실제 Modbus 구성
상위 구성처럼 상위 Center Computer가 존재하며, 이를 Modbus TCP로 쉽게 제어를 하려고 한다.
중앙컴퓨터는 Modbus TCP Slave 와 통신하며, 중간 Bridge Device는 이를 Modbus RTU로 변경하여 보내준다.
- SCADA (중앙시스템)
- Modbus RTU Slave (RS485/RS232로 연결)
- Modbus TCP Master
- Modbus TCP Slave
- Modbus RTU Master
- Modbus RTU Slave (각 장비)
http://www.epnc.co.kr/news/articleView.html?idxno=73320 |
- Gateway의 동작 - Modbus TCP와 Modbus RTU의 Portmapping
각 Gateway역할은 Modbus RTU Master 와 Modbus TCP Slave와 Port Map이 되어 동작
http://www.epnc.co.kr/news/articleView.html?idxno=73320 |
- Gateway의 구성 및 문제사항
아래와 같이 직접 Portmapping 후 구현이 되면, Gateway는 각 Message를 Forward만 하면 되지만, 문제가 발생하는데, 바로 Timeout 과 수신여부 일 것 같다.
https://www.epnc.co.kr/news/articleView.html?idxno=73320 |
상위와 다르게 Gateway에 내부 메모리가 존재하며, TCP로 받아서 Gateway에 지속적으로 쿼리하는 방식이라고 한다.
https://www.epnc.co.kr/news/articleView.html?idxno=73320 |
SCADA의 Modbus구조 및 시스템설계방법
상위그림 및 내용은 아래 글에서 가져왔으며, 자세한 설명이 되어있어 너무 감사하다.
2. ESP32 RS485 와 Modbus
ESP32에서 아래와 같이 Modbus RTU의 Master 와 Slave를 지원해주고 있으며, 관련 회로도 구성 및 Example들을 제공해주고 있다.
ESP32 Modbus RTU Slave Example
ESP32 Modbus RTU Master Example
2.1 RS232 와 FlowControl
ESP32에서 RS232만 지원하므로, 일단 RS232에서 기본 동작들을 알아보자.
RS232 RTS 정보와 동작만 알면될 것 같다.
- RS232 RTS/CTS (Flow Control, 수신버퍼)
- RTS (Request to Send): Output, 본인의 수신버퍼의 상태
- CTS (Clear to Send): Input, 상대방의 수신버퍼의 상태
Serial 통신이나보니, Flow Control에서 주요한게 Buffer이며, 본인의 수신버퍼의 상태를 확인한다.
- RS232 DRT/DSR (Flow Control, 송신버퍼)
- DTR (Data Terminal Ready), Output, 나의 통신준비 확인
- DSR (Data Set Ready), Input, 상대방 통신준비 확인
RS232 FlowControl 및 관련자료
RS232의 Flow Control에 대해 너무 잘 설명해주고 있어 감사하다
RS485 diffrential 파형 과 IC의 구조
RS455 Transceiver 구조와 differential 나가는 신호 처리 부분과 Noise 처리부분 (Refection/Terminal Registor)
2.2 RS232 와 RS485 연결구성
ESP32와 RS485로 구성시 RS232와 RS485의 Transeiver를 구성회로도는 아래와 같이 2가지로 제공되며,
기본으로 연결방법-A 기반으로 상위 Example을 제공하고 있다.
그 구성에 대해 간단히 알아보도록 하자.
- RS232-RS485 연결방법-A
출력은 일반적인 Differential 로 나가는것로 확인되며 관련 회로도 및 관련내용 참조
VCC ---------------+ +--------------- VCC | | +-------x-------+ +-------x-------+ RXD <------| RO | DIFFERENTIAL | RO|-----> RXD | B|---------------|B | TXD ------>| DI MAX485 | \ / | MAX485 DI|<----- TXD ESP32 WROVER KIT 1 | | RS-485 side | | Modbus master RTS --+--->| DE | / \ | DE|---+ | | A|---------------|A | | +----| /RE | PAIR | /RE|---+-- RTS +-------x--------+ +-------x-------+ | | --- --- ** UART 와 RS485 Transeiver 연결 RTS(Request To Send) - DE (Driver Enable) (TX 할 경우) /RE (Reciver Enable) (RX 할 경우)
RTS에 신호에 따라 DE 와 /RE 중 하나만 Enable되는 구조이며, CD를 못한다고 한다.
ESP32의 RS485관련 내부설정
RS232 register로 설정하여 동작되는걸로 확인
ESP32의 RS232 와 RS485 Transeiver 충돌감지(CD) 없음
정상적인 RS485의 Half duplex 구조로 TX or RX만 둘 중 하나만 ON되며, RTS는 ESP32의 상위 RS485 설정에서조절 (상위 회로도와 동일)
- RS232->RS485 연결방법-B
VCC ---------------+
|
+-------x-------+
RXD <------| R |
| B|----------<> B
TXD ------>| D ADM483 |
ESP | | RS485 bus side
RTS ------>| DE |
| A|----------<> A
+----| /RE |
| +-------x-------+
| |
GND GND
** UART 와 RS485 Transeiver 연결
RTS(Request To Send) - DE (Driver Enable) (TX 할 경우)
/RE (Reciver Enable) (RX는 항상 on)
ESP32의 RS232 와 RS485 Transeiver 충돌감지(CD) 존재
현재 이방법을 왜 사용하는지 정확히 이해를 못하지만, Receive는 항상 On이 되므로,
Half duplex의 경우 문제 발생요지가 있을지도 모르겠다. (Data가 TX or RX 만되어야 하므로)
하지만 결론적으로 RS485 Transeiver 자체가 Half duplex이므로, TX 와 RX 동시 껴질경우에 Master가 아닌 다른 Device 가 통신 중 일때가 궁금하다.
즉, 각 Device들이 RS485 Transeiver를 통해 CS(Carrier Sense)가 되는지가 궁금하다.
RS485의 충돌감지(CD)에 대해 아래링크에서 간단히 설명해주고 있는데, 원리는 다음과 같다고 한다.
- Device가 TX로 보낸 Data도 RX를 On하여 받아서 DATA 동일하면, 정상동작
- Device가 TX로 보낸 Data도 RX를 On하여 받지 못할 경우는 충돌이라고 생각
가만히 생각해보면, Ethernet의 JAM 과 거의 유사할 것 같으며, Voltage 변화로 인해 충돌을 감지할 걸로 예상하지만, RS485는 이를 SW로 구현해야함
상위 궁금증은 기본적으로 해결되어진 것 같으나, 문제는 이를 Ethernet 처럼 HW가 아닌 SW로 해야한다는 것이다.
이런식이면, Ethernet 처럼 CSMA/CD도 RS485에서 SW로 충분히 구현가능할 것 같기도 하지만 골치아프다.
예를들면, RS232 Reciver가 Data가 들어오면, CS(Carreir Sense)를 기능이 되어 TX를 멈추고,대기, CD는 상위와 같이 SW로 DATA를 비교하면 될 것 같다.
현재 ESP32의 RS485 SW는 충돌감지(CD)의 경우 오직 테스트용만 지원 (주의)
2.3 RS232/RS485 통신속도 와 에러율
일단 RS232 기준으로 Baudrate 와 Bps는 동일하지만 UART에는 Start/Stop Bit가 존재한다.
옵션에 따라 Parity Bit도 존재하지만 잘 사용하지 않는다. (UART Protocol 참조)
좀 더 나아가 RS232 와 RS485는 거의 Async 기반으로 사용하므로 에러율이 좀 더 많아진다.
이유는 내부 Clock과 실제 Data 받은 것과 Timing 오차가 시간이 지나면서 발생하다.
- Baudrate 의 통신속도 차이발생(Actual Speed)
Baudrate 와 Bps(Bit Per Second) 와 일치하지만, 실제 전송속도와는 일치하지 않으므로 주의
아래의 기반으로 Bandwith 점유율(Share Rate)를 본인 직접 만들어서 확인가능하다.
- RS232/RS485 의 통신 에러율(Error rate)
HW 통신에서 항상 나중에 확인해야 할 것이 에러율이라고 봐야할 것 같다.
Ethernet도 통신에러율이 존재하며, 관련부분은 검색하면 알수 있다.
Async 기반의 Serial 통신이므로, 기본적으로 Sync 통신보다 에러율이 높을 수 밖에 없다.
ESP32도 아래와 같이 Baudrate가 딱 떨어지지 않을 것이므로, 간단히 계산가능하다.
각 Baudrate와 Clock 부분관련한 통신에러율 과 Baudrate 설정 부분관련사항이다.