기본 콘텐츠로 건너뛰기

Implement Modbus Master on PC using Modbus RTU RS485

이 글은 PC에서 Modbus Master(Client)를 구현하고 Slave(Server)와 통신하는 방법을 기술하였습니다. Modbus RTU 프로토콜을 사용하고 RS485 시리얼 통신을 이용합니다.

Slave 장비가 없기 때문에 Slave는 Modbus Slave 이라는 시뮬레이션 프로그램을 사용할 것입니다. 우리는 PC가 Master가 되도록 구현할 것이며, libmodbus 라이브러리를 사용하고 VB.Net 을 이용해  Slave와 통신하는 프로그램을 구현하여 PC에서 장비(Slave)의 상태를 실시간으로 모니터링하고 장비(Slave)의 상태를 변경할 수 있도록 할 것입니다.

 

준비물 

Visual studio 2019 community edition

Modbus Slave 프로그램 (Slave simulation software)

https://www.modbustools.com/modbus_slave.html

 

Libmodbus 라이브러리

C로 작성된 함수들로 이루어져 있으며, unix 계열 빌드 툴로 컴파일하도록 되어있어 windows에서 컴파일하기가 다소 번거롭습니다. 컴파일 방법은 따로 포스팅하겠습니다.

https://libmodbus.org/


결선

아래 그림과 같이 RS485 결선을 합니다. Virtual COM Port를 사용해도 되겠지만 RS485 케이블을 물리적으로 연결해 보았습니다. 여기서는 COM3를 Master로 사용하고 COM4를 Slave로 사용하도록 하겠습니다.


RS485 결선도 (From FTDI Manual)

장치관리자에 나타난 COM Port

Modbus Slave 설정


우리의 가상의 Slave 장비를 다음과 같이  상정해 보겠습니다.

1) Slave 장비는 현재의 온도값과 압력값을 표시해 줍니다. 우리는 이 2가지 실수값을 모니터링하여 PC의 UI에 현재 온도, 현재 압력으로 표시해 줄 것입니다. Slave 장비는 input register address (0, 1), (2, 3) 에 이 값을 가지고 있습니다. address 1개당 16bit 크기이므로, 32bit float 실수형 자료형을 표현하기 위해 2개의 address를 사용합니다. address 0, 1 을 조합하여 온도값, address 2, 3 을 조합하여 압력값을 표현합니다.

2) Slave 장비는 사용자가 온도값과 압력값의 상한값을 설정할 수 있도록 하는 옵션을 가지고 있습니다. Slave 장비는 이 2가지 설정값을 현재의 온도값,  압력값과 비교하며 어떤 동작을 수행한다고 가정합니다. 우리는 PC의 UI에 온도 상한값, 압력 상한값을 입력받도록 하여  Slave 장비의 이 2가지 설정값을 변경할 수 있도록 할 것입니다. Slave 장비는 holding register address (0, 1), (2, 3) 에 이 값을 가지고 있습니다. address 1개당 16bit 크기이므로, 32bit float 실수형 자료형을 표현하기 위해 2개의 address를 사용합니다. address 0, 1 을 조합하여 온도값, address 2, 3 을 조합하여 압력값을 표현합니다.

3) Slave 장비는 자신의 10가지의 상태에 대한 On/Off 값을 표시해 줍니다. 예를 들면 1번 센서가 사용되고 있는지 또는 7번째 근접센서가 작동 상태인지 등등. 우리는 Slave 장비의 10가지 상태를 모니터링하여 UI 에 상태 S1 - 상태 S10 으로 표시할 것입니다. Slave 장비는 discretes input address 0, 1, 2, ..., 8, 9 에 이 값을 가지고 있습니다.

4) Slave 장비의 5가지 설정값에 대해 On/Off 설정을 할 수 있습니다. 예를 들면 1번 센서 사용하지 말것, 온도 한계치를 넘어설 경우 알람이 울리도록 할 것 등등. 우리는 이것을 PC의 UI에 설정 C1 - 설정 C5 로 표시하여 Slave 장비의 설정을 변경할 수 있도록 할 것입니다. Slave 장비는 coils address 0, 1, 2, 3, 4 에 이 값을 가지고 있습니다.

위와 같이 Slave 장비를 가정하여 Modbus Slave 소프트웨어를 다음 그림과 같이 설정하여 가상의 Slave 장비 생성을 완료합니다.


데모 프로그램 구현 결과

데모 프로그램은 VB .Net 5.0으로 유저 인터페이스를 작성하고, Slave와 통신하는 부분은 C언어로 작성하였습니다. 작업쓰레드를 따로 두어서 Slave 장비를 모니터링 하도록 하였고, Slave 장비의 변경 사항을 유저 인터페이스에 업데이트 하도록 구성되어 있습니다.

아래 영상은 유저 인터페이스 테스트 영상입니다. 통신 속도만 빠르다면 유저 인터페이스가 응답없음 상태로 빠지지 않고 번득임(flicker) 없이 안정적으로 화면이 업데이트 되고 있는 것을 볼수 있습니다.

 
아래 영상은 모니터링 결과입니다. Slave 장비의 Discrete input address 0부터 9까지의 상태가 변경될 때마다 정확하게 모니터링하는 것을 보실 수 있습니다. 감사합니다.

 



 

댓글

이 블로그의 인기 게시물

칩 다운로더 Win 프로그램 수정