20강 / 20강
예외 · 로그, 그리고 못 하는 것
여덟 시간을 지키는 일과, 이 코드가 아닌 것
스무 강을 한 표로 접습니다. 먼저 예외를 어떻게 갈라 둘 것인가 입니다.
요령은 하나입니다 — 예외의 종류가 곧 대응 방침이 되게 만듭니다.
그러면 except 절이 저절로 짧아집니다.
class TransientDeviceError(Exception): pass # 다시 해 보면 된다 — CRC 실패, 타임아웃
class DeviceFailure(Exception): pass # 이 장치는 끝났다 — 배치를 접는다
class ProcessDeviation(Exception): pass # 공정이 벗어났다 — 멈추고 사람을 부른다
class SafetyFault(Exception): pass # 지금 당장 안전 상태로 — 뒷정리도 하지 않는다
재시도의 규칙
읽기 — 마음껏
다시 읽어도 세상은 그대로입니다. 지수 백오프로 몇 번 시도하십시오.
쓰기 — 읽어 보고
“100 µL 넣어라” 를 다시 보내면 200 µL 가 들어갈 수 있습니다.
먼저 실제 상태를 읽어 확인한 뒤에만 다시 보냅니다.
기록은 두 갈래다
| 진단 로그 | 배치 기록 | |
|---|---|---|
| 누가 보나 | 만든 사람 | 결과를 믿어야 할 사람 |
| 형식 | 돌려 쓰는 파일 | 덧붙이기만 하는 JSON 줄 |
| 지우나 | 오래된 것은 지운다 | 절대 안 지운다 |
| 쓰는 법 | 큐에 넣고 딴 실이 쓴다 | 한 줄마다 fsync |
제어 루프 안에서 직접 파일에 쓰지 마십시오. SD 카드 쓰기는 수백 밀리초씩 멈출 수 있고(2강), 그 멈춤이 그대로 제어 지터가 됩니다.
코드가 좋아진다고 규제 적합이 되지는 않습니다. 그 둘은 다른 종류의 일입니다.
Python
브라우저에서 실행
다음 걸음 — 경계를 밖으로 드러내기
마지막으로 권할 것이 하나 있습니다. 지금까지 만든 장치 계층의 약속을 바깥에서도 부를 수 있게 내놓는 것입니다. 실험 자동화 쪽에는 그 표준이 둘 있습니다 — SiLA 2(gRPC 기반)와 OPC UA LADS(2023년에 나온 실험장비 표준).
당장 쓰지 않더라도 값어치가 있습니다. 내보낼 명령과 상태를 이름 붙여 적다 보면, 우리 장치 계층이 제대로 설계됐는지가 드러나기 때문입니다. 잘 만들어 두었다면 이 작업은 거의 기계적인 옮겨 적기가 됩니다. 그렇지 않다면 — 그것이 바로 배울 점입니다.
🤔 확인 문제
“100 µL 를 넣어라” 를 보냈는데 응답이 없었다. 올바른 대응은?
해설 응답이 없다고 안 들어간 것은 아닙니다. 그냥 다시 보내면 200 µL 가 들어갑니다. 읽기는 마음껏, 쓰기는 읽어 보고 입니다.
🤔 확인 문제
이 강의의 코드에 대해 말할 수 없는 것은?
해설 적합성은 품질 시스템의 성질이지 코드의 성질이 아닙니다. 검증 · 위험분석 · 변경관리 · 교육이 없으면 코드가 아무리 좋아도 그 주장은 할 수 없습니다.
🤔 확인 문제
이 강의를 마치고 다른 장치 펌웨어를 볼 때 가장 먼저 물어야 할 것은?
해설 1강에서 시작해 20강까지 되풀이한 물음입니다. 안전한 상태는 에너지가 사라졌을 때 빠지는 상태여야 합니다.