프로그래밍/Python

파이썬으로 구현해 확인하는 MODBUS통신 - Client 편

Dibrary 2022. 8. 5. 09:50
반응형

안녕하세요 Dibrary입니다.

파이썬으로 온갖걸 다 할 수 있다는건 많이들 알고 계실겁니다. 그 중에 Plant 산업 현장에 많이 쓰이는 Modbus도 파이썬으로 가능한거 알고 계세요?

만능이죠 만능. 간단하게 Modbus 통신을 이용해서 Client로 값을 쓰고 읽는 것을 해 보겠습니다.

 

저는 Jupyter를 사용해서 결과를 보여드릴거고, Device는 modSim이라는 시뮬레이터로 확인해 보았습니다. (물론, 실제 PLC, MCU보드, 인버터 등등을 제어하는 것도 했습니다.)

시뮬레이터는 아래에서 받으실 수 있습니다.

 

Modbus simulator

Download Modbus simulator for free. Modbus RTU and TCP/IP slave simulator. For Testing, Training or Learning these protocols - includes an AllenBradley DF1 master and a slave mode.

sourceforge.net

 

먼저 시뮬레이터를 설명해 드리자면, 키시면 아래와 같은 화면이 나옵니다.

아주 심플하죠? address가 다 있으니 쉽게 구분하실 수 있을겁니다. coil은 아래와 같이 나옵니다.

뭐 다 비슷합니다. 실제 PLC나 MCU 등의 부품은 이러한 modbus 주소 공간을 '내부'에 가지고 있는 것이라고 보시면 됩니다.

결국, python으로 시뮬레이터에 값 쓰는 것을 시뮬레이터가 아닌 PLC, MCU로만 바꾸면 되는 것이죠.

 


시뮬레이터를 켜놓은 상태에서, 파이썬에서 pymodbus를 설치합니다. (pip install pymodbus)

그리고 아래와 같이 코드를 작성하고 실행해 보세요.

위 코드는 192.168.0.121이라는 PC의 502포트 (modbus 기본 포트죠)에 접속해서, coil 의 0번부터 2까지 값을 가져오고, 0번 주소를 1로 변경하라는 코드입니다.

(참고) 현재 pymodbus 버전이 업그레이드 되면서, 
from pymodbus.client.sync import ModbusTcpClient 코드는
from pymodbus.client import ModbusTcpClient 로 사용할 수 있습니다. 

 

실행하고 나서 simulator는 아래와 같이 바뀌어 있을 겁니다.

 

그럼 파이썬으로 0번 주소의 값이 1로 읽히는지 볼까요?

네 맨 앞의 값이 True로 바뀐 걸 보실 수 있습니다. 따라서, coil의 값을 이용해서 스위치 처럼 동작시키고자 한다면 bits로 읽은 리스트의 맨 앞 값만 사용하면 됩니다.

이렇게 말이죠.

 


그럼 coil만 쓰고, 읽는게 가능하냐~ 그렇지 않습니다. Simulator 설정을 4번으로 옮겨 Holding Register도 쓰고 읽어보겠습니다.

Holding Register는 자료형에 따라 보이는 모습이 다릅니다.

왼쪽은 decimal, 오른쪽은 float32죠. float32는 사용 할 때 코드가 몇 줄 더 추가 됩니다. (이는 나중에 정리해보겠습니다.)

우선 decimal로 해 놓고, 쓰고, 읽어보겠습니다.

 

읽는건 간단합니다. 아래 코드만 사용하시면 원하는 주소의 값을 읽으실 수 있습니다.

Holding Register 0번째 주소의 값이죠.

제가 0번째 주소 값을 7777로 수정해보았습니다.

그리고 읽으니 값이 7777로 나오는 것을 보실 수 있습니다.

쓰는 것 역시 간단합니다. 아래 코드는 1번째 Holding Register주소에 3456이라는 값을 쓰라는 의미입니다.

정상으로 써지면 위 처럼 아무 에러 메시지는 나오지 않습니다.

만일 정상으로 써지지 않는다면, 아래와 같이 ModbusIOException 이라는 에러 문구를 만나게 됩니다.

 

제대로 써졌는지 simulator를 보면 정상적으로 3456이 들어간 것을 보실 수 있습니다.

 

혹시 제가 코딩과 별개로 simulator의 값을 바꾼거 아니냐구요? 궁금하시다면 직접 꼬고~~ 꼬고~~

굉장히 재밌다는 것을 아실 수 있게 될겁니다.

728x90
반응형