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 한 줄에 매달 때 코드에서 반드시 해야 하는 것은?
해설 RS485 는 한 줄을 차례로 씁니다. 일곱 객체가 동시에 말하면 프레임이 깨집니다. 통신을 한 곳으로 모아 순서를 세워야 합니다.
🤔 확인 문제
이 강의가 펌프 레지스터 주소를 적어 주지 않는 까닭은?
해설 대신 장치 프로필 파일을 만드는 법을 배웁니다. 주소를 외우는 것보다 주소를 바깥으로 빼는 구조가 오래갑니다.