Project/BEMS 찍먹

[Python][Modbus][DB] pyModSlave를 이용한 시뮬레이터 값 DB에 저장

오누! 2022. 1. 19. 17:01
728x90
반응형

pyModSlave라고 modbus 통신을 할 수 있는 랜덤 시뮬레이터 이다.

특정 시간동안 데이터 값을 랜덤으로 추출하는 프로그램인데

이 데이터를 DB에 10분 단위로 담고 싶다.

 

우선 pyModSlave를 사용하는 방법부터 확인하자

왼쪽 빨간 상자를 보면 connect라고 된 플러그 모양이 있다.

on/off를 할 수 있다. 

처음에 아무것도 몰랐을때 connect를 on 해도 아무런 반응이 없길래 뭐지 싶었는데

오른쪽 빨간 박스에 Sim을 누르면 특정 시간마다 랜덤으로 숫자를 표시한다.

Sim 체크박스가 시뮬레이터인듯 하다.

 

modbus mode에는 TCP와 RTU가 있다. 

TCP는 IP통신을 통해서 데이터를 주고 받는거 같고, RTU는 원격단말장치라는데 TCP와는 다른 통신 방식을 사용한 통신 방식인것 같다.

각각의 세팅을 보면 RTU는 씨리얼 통신을 할때 사용되는 세팅값들이 있다...

TCP는 익숙하게 IP주소와 포트 번호가 있다.

우리는 TCP 통신을 통해서 값을 받을 것이다.

 

쥬피터로 코드를 한번 짜보자

사용할 라이브러리들이다.

주석의 설명을 참고하자.

 

그리고 modbus 통신으로 값을 가져오기 위한 코드다.

너무 간단하다.

regs = c.read_holding_registers(0,8)

이부분을 보면 'holding_registers' 값을 읽어온다고 되어 있다.

프로그램을 보면 4개의 항목이 있는 것을 알 수 있다.

그중에서 우리는 'holding_registers' 값을 가져오겠다고 코드에 나와있다.

 

비어있는 dataframe을 만들어준다.

칼럼명은 8개의 값들과 'created_date'를 적어준다.

'created_date'는 데이터가 언제 DB에 들어갔는지 날짜와 시간을 알기 위해서 넣어준다.

 

그럼 현재 날짜를 알아야겠지?

datetime 라이브러리를 이용해서

현재 날짜를 알아낸다.

그리고 날짜 값을 modbus 통신을 통해 가져온 regs변수에 추가로 넣어준다.

 

결과값을 보자

처음 modbus를 통해 값을 가져왔을때는 값만 가져왔다.

이후 regs.append(now) 를 통해 현재 날짜와 시간을 추가해주면

값이 추가된게 확인된다.

 

그리고 dataframe에 값을 넣어준다.

DB 연동을 하기위해 DB properties 값을 넣어준다.

engine = create_engine("postgresql://"DB User명":"PW"@"DB주소":"포트번호"/"테이블명"")

 

dataframe의 값을 DB에 넣어주기 위해 to_sql을 사용한다.

각각의 변수에는 필요한 정보들을 입력한다.

if_exists는 DB에 새로 값이 추가될때 어떻게 insert할지를 옵션을 적는다.

append는 기존 값에 추가로 붙이기 위해서 넣는다.

 

PGadmin에서 값이 잘 들어왔는지 확인해본다.

728x90
반응형