6강 / 20강

연동펌프 일곱 — 한 줄에 주소 일곱

RS485 Modbus RTU · 그리고 레지스터 표가 없다는 문제

연동펌프 일곱 — 한 줄에 주소 일곱
선 두 가닥에 펌프 일곱을 매답니다. 대신 주소가 생깁니다.

연동펌프가 일곱 대입니다. 일곱 대에 선을 각각 끌면 배선이 감당이 안 됩니다. 그래서 RS485 를 씁니다 — 선 두 가닥에 일곱 대를 전부 매답니다.

대신 “누구에게 하는 말인지” 를 밝혀야 합니다. 그것이 슬레이브 번호(1~247)이고, 그 위에서 도는 약속이 Modbus RTU 입니다.

import minimalmodbus, serial pump = minimalmodbus.Instrument('/dev/pump-bus', 3) # 3번 펌프 pump.serial.baudrate = 9600 pump.serial.timeout = 0.3 pump.write_register(REG_RPM, 1500, 0)
펌프 수와 통신 설정을 바꿔 보세요. 한 바퀴 도는 데 걸리는 시간이 예산을 넘는지 보입니다.
불러오는 중…
한 줄을 여럿이 나눠 쓰면 시간이 예산이 됩니다. 이 계산을 스케줄러 설계 전에 해 둡니다.
Python 브라우저에서 실행

리눅스 쪽에서 해 둘 일 넷

할 일까닭
sudo usermod -aG dialout $USER포트를 열 권한. sudo python 으로 때우지 말 것
udev 규칙으로 /dev/pump-bus 고정ttyUSB0 번호는 다시 켤 때마다 바뀐다
systemctl disable --now ModemManager이것이 포트를 먼저 잡아 첫 통신을 망친다
양 끝에만 120 Ω 종단중간에 달거나 별 모양으로 배선하면 간헐적 CRC 오류

그리고 코드 쪽에서 하나 — 버스는 하나이므로 접근을 하나로 묶어야 합니다. 일곱 개 객체가 제각기 포트를 열면 서로를 밟습니다. 자물쇠(lock) 하나 뒤에 모든 통신을 세워 두십시오.

레지스터 표를 코드가 아니라 파일에 둡니다. 펌프를 바꿔도 코드는 그대로입니다.
Python 브라우저에서 실행
🤔 확인 문제
펌프 일곱 대를 RS485 한 줄에 매달 때 코드에서 반드시 해야 하는 것은?
🤔 확인 문제
이 강의가 펌프 레지스터 주소를 적어 주지 않는 까닭은?