안녕하세요 Dibrary입니다.
파이썬으로 온갖걸 다 할 수 있다는건 많이들 알고 계실겁니다. 그 중에 Plant 산업 현장에 많이 쓰이는 Modbus도 파이썬으로 가능한거 알고 계세요?
만능이죠 만능. 간단하게 Modbus 통신을 이용해서 Client로 값을 쓰고 읽는 것을 해 보겠습니다.
저는 Jupyter를 사용해서 결과를 보여드릴거고, Device는 modSim이라는 시뮬레이터로 확인해 보았습니다. (물론, 실제 PLC, MCU보드, 인버터 등등을 제어하는 것도 했습니다.)
시뮬레이터는 아래에서 받으실 수 있습니다.
먼저 시뮬레이터를 설명해 드리자면, 키시면 아래와 같은 화면이 나옵니다.
아주 심플하죠? 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의 값을 바꾼거 아니냐구요? 궁금하시다면 직접 꼬고~~ 꼬고~~
굉장히 재밌다는 것을 아실 수 있게 될겁니다.
'프로그래밍 > Python' 카테고리의 다른 글
[혼공머신러닝] 7장 인공신경망 기본 정리 (0) | 2022.08.20 |
---|---|
[혼공머신러닝] 6장 k평균 알고리즘 정리 (0) | 2022.08.12 |
REST 테스트를 하기 위한 json-server 실행하기 (0) | 2022.08.01 |
[혼공머신러닝] 5장 트리 알고리즘 정리 (0) | 2022.07.28 |
[혼공머신러닝] 4장 로지스틱회귀 정리 (0) | 2022.07.23 |