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 를 넣어라” 를 보냈는데 응답이 없었다. 올바른 대응은?
🤔 확인 문제
이 강의의 코드에 대해 말할 수 없는 것은?
🤔 확인 문제
이 강의를 마치고 다른 장치 펌웨어를 볼 때 가장 먼저 물어야 할 것은?