RS-485 한 segment에 power meter 다섯 대가 물려 있다. 세 대는 잘 읽히고 두 대는 몇 분마다 bad-quality로 떨어진다. 그런데 integrator는 이미 오후 내내 register offset을 바꾸고 있다. 잘못 쓴 오후다. Modbus RTU는 application layer가 단순하다 — function code 3, start address, quantity, CRC가 전부다. 그러니 링크가 불안정하면 원인은 register map이 아니라 거의 항상 전기 쪽이다. RS-485는 impedance, bias, grounding에 대한 실제 규칙이 있는 differential bus이고, 규칙을 어기면 조용히 벌한다. Frame이 그냥 도착하지 않고 master는 timeout만 기록한다.
그래서 신호가 실제로 지나가는 순서대로 시운전한다. 배선, 그다음 framing, 그다음 register다. Segment가 깨끗한 differential signal을 전달하는지 증명하고, 모든 장비가 baud/parity/stop에 합의했는지 증명하고, 그 다음에야 holding register냐 input register냐를 따진다. 층을 건너뛰면 세 가지를 동시에 붙잡게 되고, 두 시간짜리 일이 이틀이 된다.
먼저 실제 설치 상태를 그린다
Timeout 하나 바꾸기 전에 segment를 따라 걸으며 스케치한다. RS-485는 star가 아니라 daisy-chain bus다 — 장비마다 cable이 들어오고 나가고, 끝은 둘, spur는 없다. TIA/EIA-485-A driver는 낮은 속도에서 32 unit load를 약 1200 m(4000 ft)까지 구동하도록 규정돼 있지만, 그 여유는 깨끗한 chain을 전제로 한다. 내가 불려간 "간헐" segment의 절반은 오래된 4-20 mA 계장 배선이 남긴 star였다. Meter 두 대일 때는 멀쩡하다가, 누군가 중간 junction에서 VFD drop을 딴 날부터 불안정해진다.
Segment마다 적는다.
- Cable 종류와 끝에서 끝까지 run 길이 (제대로 된 run은 drain이 있는 120 Ω twisted pair를 쓴다 — Belden 3106A나 9841, 22 AWG. 남는 온도조절기 선이 아니다).
- Chain을 따라가는 장비 순서와, 물리적 양 끝이 어느 두 장비인지.
- Shield 접지 위치 — 한쪽 끝에만. 아니면 ground loop가 생겨 모든 VFD transient가 pair에 실린다.
- 120 Ω 종단을 켠 두 끝이 어디이고, fail-safe bias가 어디 있는지.
- 어떤 converter나 port가 galvanic isolation인지.
Topology가 star인데 오늘 rechain을 못 하면 묻지 말고 도면에 known risk로 적는다. 안 그러면 다음 사람이 자기 오후를 register offset에 태운다.
극성: 실크스크린 말고 측정으로 확인한다
RS-485 단자 표기는 vendor마다 엉망이다. 어떤 장비는 non-inverting을 A라 부르고, 다음 장비는 같은 선을 B라 부르고, 또 다른 장비는 D+/D-로 찍는다. 믿을 만한 관례가 없다 — 원 표준의 "A/B" 명명이 사실 대부분 칩 vendor의 핀 표기와 반대라서, 현장은 동전 던지기다.
그러니 추론하지 말고 시험한다. Master와 slave 하나로 줄이고, 실제 baud/parity/data/stop을 넣고, 문서에 있는 read 하나를 보낸다 (존재를 아는 register에 FC03). 응답이 없으면 한쪽 끝에서만 pair를 바꿔 다시 해본다. 응답이 오면 현장 기준으로 선을 표시하고 넘어간다.
Pair를 바꿔야만 되는 slave가 있으면 tell이다. 한 장비를 고치니 다른 장비가 깨지면 chain 중간 어딘가에서 극성이 섞여 splice돼 있다. 배선을 고쳐라. Driver 설정에서 한 장비만 invert해서 "해결"하지 마라 — splice를 덮은 것뿐이고, 다음에 추가되는 장비가 거기 걸린다.
종단은 양 끝 두 곳에만, 예외 없다
Pair 양단의 120 Ω 종단은 line 먼 끝에서 오는 reflection을 죽인다. Cable의 characteristic impedance에 맞춘 값이라 정확히 bus의 물리적 양 끝에만 붙는다 — 다른 곳은 아니다. 내가 가장 자주 보는 RS-485 실수는, chain 중간에 있는 장비에 종단(대개 DIP switch)이 켜진 채 남아 있는 것이다. 신호 입장에서 segment가 둘로 잘려 뒤쪽이 전부 굶는다.
증상은 전부 "software"가 아니라 "physical layer"를 가리킨다.
- 2 m bench cable에서는 되는데 300 m 실제 run에서는 실패한다.
- Baud를 올리면 CRC error가 늘어난다 — 9600에서 견디던 reflection이 38400에서는 못 견딘다.
- 장비 세 대면 튼튼하다가 열두 drop을 다 물리면 흔들린다.
- 종단 네 개가 병렬로 걸려 driver를 눌러서 scope상 signal amplitude가 낮다.
Bus 전원을 끄고 pair 양단 저항을 재는 빠른 현장 점검. 올바른 종단 두 개는 120 Ω 병렬이라 약 60 Ω로 보여야 한다 (내부 bias network에 따라 조금 다르다). 30 Ω 근처면 종단을 더 남긴 것이고, open이면 하나도 없는 것이다.
Bias는 idle line이 receiver에게 거짓말하지 않게 한다
시간을 잡아먹는 이유는, 침묵이 아니라 corruption처럼 보이기 때문이다. Modbus RTU frame은 침묵으로 구분된다 — 규격(Modbus over Serial Line V1.02, §2.5.1)은 frame 사이에 최소 3.5 character time의 idle을, frame 안 character 사이에는 최대 1.5 character time을 요구한다. 9600 8N1에서 한 character는 11 bit이라 3.5 char ≈ 4.0 ms다. 그 idle 구간 동안 모든 driver는 tri-state가 되고 pair는 뜬다. Bias가 없으면 noise가 pair를 receiver threshold 너머로 끌어당기고, UART는 가짜 start bit를 보고, 실제 request가 시작되기도 전에 framing/CRC error가 쌓인다.
Fail-safe bias는 non-inverting line에 pull-up, inverting line에 pull-down을 걸어 idle differential을 정의된 1을 보장하는 약 200 mV 위로 유지하는 것이다. Isolated segment마다 한 곳, 통제된 위치에 둔다.
- Master나 gateway에 내장된 경우가 많다 (가끔 switch로 켠다).
- Converter는 보통 pull-up/pull-down DIP switch를 노출한다.
- 끌 수 없는 fixed bias가 든 field device도 있다 — 더 넣기 전에 알아두면 좋다.
Cabinet마다 bias를 켜고 싶은 충동을 참아라. Bias network는 bus를 load하고, 쌓을수록 noise margin이 올라가는 게 아니라 내려간다. Repeater로 run이 나뉘면 각 segment는 전기적으로 별개이니 각자 하나의 bias source가 필요하다.
그다음 framing을 맞추고, 그다음 register다
이제 실제로 빨리 끝나는 지루한 층이다. Segment의 모든 장비는 baud, parity, data bit, stop bit, address에 합의해야 하고, driver는 여기에 response timeout과 inter-request/turnaround delay까지 맞춰야 한다. 전형적인 함정은 meter가 9600 8E1, master가 9600 8N1인 경우다 — 배선은 완벽한데 UART framing이 어긋나 응답이 전부 버려진다. Even parity에 stop bit 하나, no parity에 stop bit 둘은 둘 다 11-bit frame이지만 서로 호환되지 않는다. Receiver는 설정과 다른 frame을 거절한다.
Multi-drop은 느리게 시운전한다. 먼저 보수적인 baud로 chain 전체를 안정시키고, scan time이 요구하고 cable 품질과 CRC counter가 여유를 보장할 때만 올린다. 1초에 한 번 poll하면 되는 400 m run에서 115200을 돌린다고 상 주지 않는다.
Bus에서 가장 빠른 장비가 아니라 가장 느린 장비 기준으로 poll한다
Modbus RTU master는 slave가 driver를 turn around해서 응답할 시간을 기다린다. Power meter나 drive는 보통 몇 ms 안에 답하지만, protection relay, weigh indicator, protocol bridge는 수십 ms, busy면 더 걸린다. Response timeout은 느린 장비 기준으로 잡되, 느린 장비가 scan까지 정하게 두지 마라.
시운전 중에 남긴다: slave별 정상/최악 response time, 시간당 timeout·CRC count, bad-quality 전 retry 횟수, 그리고 각 장비가 견디는 최대 register block (일부는 FC03을 프로토콜 한계 125 register보다 한참 아래로 제한한다). 1분에 한 번 바뀌는 relay diagnostic register가 500 ms process poll을 끌고 있으면 별도 slow poll group으로 분리한다. 빠른 tag를 느린 tag 뒤에서 기다리게 하는 건 스스로 만든 latency다.
실제로 받게 될 네 가지 전화
"한 장비만 응답하고 나머지는 조용하다." Slave address 중복, 첫 장비 이후 극성 반전, 또는 첫 장비에 끝단인 양 종단이 켜져 있는 경우다. Software를 보기 전에 이것부터 확인한다.
"Motor 기동 때만 통신이 깨진다." 교과서적인 coupling이다. Shield bonding, pair가 VFD output cable에 얼마나 가까이 지나는지, converter 접지, port isolation 여부를 본다. Routing과 grounding을 고쳐라 — timeout을 늘리면 다음 기동 때까지 숨길 뿐이다.
"값은 들어오는데 quality가 가끔 나쁘다." 간헐 CRC error, 너무 짧게 잡은 timeout, 장비가 지원하지 않는 큰 block read다. Retry가 지속적 문제를 덮고 있진 않은지 확인한다. Operator에게는 graphic 위 quality noise로 그대로 보인다.
"USB dongle은 되는데 설치된 gateway는 안 된다." Serial setting, 극성, bias, isolation을 비교하고 — register base convention도 확인한다. 40001을 offset 0으로 다루는 test tool과 offset 1로 다루는 gateway는 한 register씩 어긋나 garbage처럼 보인다.
전설이 아니라 증거를 남긴다
기록의 목적은 다음 사람이 당신의 오후를 반복하지 않는 것이다. 종단·bias 위치를 표시한 topology sketch, serial setting이 적힌 device address list, driver의 timeout/retry/poll-group 설정, 안정 운전 후 timeout·CRC counter 기준값, 모든 converter·device DIP switch 사진, 그리고 고치지 못한 비정상 topology에 대한 솔직한 메모를 남긴다. 마지막 하나가 이 페이지에서 가장 값지다 — 문서화된 타협과 미스터리의 차이다.