- 파이썬 코드를 작성할 때는 항상 PEP8 (파이썬 개선 제안 #8) 스타일 가이드를 따르기 - 큰 파이썬 커뮤니티와 공통된 스타일을 공유하면 다른 사람과 협력할 때 도움이 됨 - 일관성 있는 스타일을 사용하면 나중에 자신이 작성한 코드를 직접 수정할 때 더 수월함
(1) 공백(whitespace) / 탭, 스페이스, 새줄(newline) 등의 문자를 모두 합한 말
- 탭 대신 스페이스를 사용해 들여쓰기 - 문법적으로 중요한 들여쓰기에는 4칸 스페이스 사용하기 - 라인 길이는 79개 문자 이하 - 긴 식을 다음 줄에 이어서 쓸 경우, 일반적인 들여쓰기보다 4 스페이스 더 들여쓰기 - 파일 안에 각 함수와 클래스 사이에는 빈 줄을 두 줄 넣기 - 클래스 안에서 메서드(함수)와 메서드(함수) 사이에는 빈 줄을 한 줄 넣기 - 딕셔너리(dictionary)에서 키와 콜론(:) 사이에는 공백을 넣지 않고, 한 줄 안에 키와 값을 같이 넣는 경우에는 콜론 다음에 스페이스를 하나 넣기 - 변수 대입에서 = 전후에는 스페이스를 하나씩만 넣기 - 타입 표기를 덧붙이는 경우, 변수 이름과 콜론 사이에 공백을 넣지 않도록 주의! 콜론과 타입 정보 사이에는 스페이스 하나 넣기
(2) 명명 규약 - 함수, 변수, 애트리뷰트(attribute)는 lowercase_underscore 처럼 소문자와 밑줄 사용하기 - 보호돼야 하는 인스턴스 애트리뷰트는 일반적인 애트리뷰트 이름 규칙을 따르되, _leading_underscore 처럼 밑줄로 시작하기 - 비공개(private) (한 클래스 안에서만 쓰이고 다른 곳에서는 쓰면 안 되는 경우) 인스턴스 애트리뷰트는 일반적인 애트리뷰트 이름 규칙을 따르되, __leading_underscore처럼 밑줄 두 개로 시작하기 - 클래스(예외도 포함)는 CapitalizedWord처럼 여러 단어를 이어 붙이되, 각 단어의 첫 글자를 대문자로 하기 - 모듈 수준의 상수는 ALL_CAPS 처럼 모든 글자를 대문자로 하고 단어와 단어 사이를 밑줄로 연결한 형태를 사용 - 클래스에 들어 있는 인스턴스 메서드(함수)는 호출 대상 객체를 가리키는 첫 번째 인자의 이름으로 반드시 self를 사용해야 함 - 클래스 메서드는 클래스를 가리키는 첫 번째 인자의 이름으로 반드시 cls를 사용해야 함 (cls 참고 : https://journeytosth.tistory.com/73)
(3) 식과 문 - 긍정적인 식을 부정하지 말고 (if not a is b) 부정을 내부에 넣기 (if a is not b) - 빈 컨테이너(container)나 시퀀스(sequence) ([]나 " 등)를 검사할 때는 길이를 0과 비교 (if len(something)==0) 하지 말기. 대신 if 컨테이너가 비어 있지 않은 경우 암묵적으로 True로 평가된다는 사실을 활용할 것 - 한 줄짜리 if 문이나 한 줄짜리 for, while 루프, 한 줄짜리 except 복합문을 사용하지 말기. 명확성을 위해 각 부분을 여러 줄에 나눠 배치하기 - 식을 한 줄 안에 다 쓸 수 없는 경우, 식을 괄호로 둘러싸고 줄바꿈과 들여쓰기를 추가해서 읽기 쉽게 만들기 - 여러 줄에 걸쳐 식을 쓸 때는 줄이 계속된다는 표시를 하는 \ 문자보다는 괄호를 사용하기
(4) 임포트 - import 문(from x import y 포함)을 항상 파일 맨 앞에 위치하기 - 모듈을 임포트할 때 절대적인 이름(absolute name)을 사용하고, 현 모듈의 경로에 상대적인 이름은 사용하지 말기 (예를 들어 bar 패키지로부터 foo 모듈을 임포트한다면 from bar import foo라고 해야지, import foo라고 하면 안 됨) - 반드시 상대적인 경로로 임포트해야 하는 경우는 from . import foo 처럼 명시적인 구문을 사용하기 - 임포트를 적을 때는 표준 라이브러리 모듈, 서드 파티 모듈, 개인이 만든 모듈 순서로 섹션을 나누기. 각 섹션에는 알파벳 순서로 모듈을 임포트하기.
(주의! 공부 차원으로 해석을 해서 정확하지 않을 수 있음. 해석이 막힐 때는 구글 번역기를 사용함)
1. Modbus Protocol 이란?
Modbus는 master(의역 : 주장치(PC를 말함인가?))-slave(종속 장치) 관계를 사용해서 시행하는 request(요청)-response(응답) 프로토콜이다. master-slave 관계에서, 통신은 쌍으로 항상 발생하며 - 한 장치가 요청을 개시해야 응답을 기다리고 - 개시된 장치(the master)가 모든 대화에 책임이 있다. 보통 master는 HMI(Human Machine Interface), SCADA(Supervisory Control and Data Acqusition) 시스템이고 slave는 센서, PLC(Programmable Logic Controller), 또는 PAC(Programmable Automation Controller) 이다. 이러한 요청과 응답 내용, 그리고 이러한 메시지가 전송되는 네트워크 계층은 프로토콜의 다른 계층에 의해 정의 된다.
2. 모드버스 프로토콜의 레이어
초기 구현에서, Modbus는 serial 위에 구축 된 단일 프로토콜이여서, 여러 레이어로 나눌 수 없었다. 시간이 지나, 시리얼을 통해 사용되는 패킷 형식을을 변경하거나 TCP/IP 및 UDP(사용자 데이터그램 프로토콜) 네트워크의 사용을 허용하기 위해 다른 애플리케이션 데이터가 소개되었다. 이것은 핵심 프로토콜의 분리를 이끌었고, PDU(프로토콜 데이터 유닛)와 네트워크 레이어를 정의했고, ADU(애플리케이션 데이터 유닛)를 정의했다.
이것을 다루는 PDU와 코드는 위 모드버스 애플리케이션 프로토콜 설명(첨부 문서)에 핵심으로 구성되 있다. 이 설명서는 PDU의 형식을 정의한다. 프로토콜에 의해 다양한 데이터 형식이 사용되고, 데이터에 접근하기 위한 함수코드의 사용, 그리고 각 함수 코드의 구체적인 실행과 제약들이 사용된다.
Modbus PDU 형식은 데이터의 연관된 세트로 주어진 함수코드로 정의된다. 이 데이터의 크기와 내용들은 함수 코드에 의해 정의되고, 전체의 PDU(함수코드와 데이터)는 253바이트 크기를 초과할 수 없다. 모든 함수 코드는 slaves(종속장치들)가 원하는 애플리케이션 동작에 따라 유연하게 구현할 수 있는 구체적 동작을 한다. PDU 설명서는 데이터 접근과 취급에 관한 핵심 개념을 정의한다; 그러나 slave(종속장치)는 사양서에 명쾌하게 정의 되지 않은 한 가지 방법으로 데이터를 처리할 수 있다.
3-1. Modbus 데이터 접근하기와 Modbus 데이터 모델
일반적으로, 모드버스-접근가능한 데이터는 4개의 데이터 더미나 address(주소) 범위 중 하나(coils, discrete inputs, holding registers, input registers)에 저장된다. 대부분의 사양서와 마찬가지로, 산업 또는 응용에 따라 이름이 다를 수 있다. 예를 들어, holding registers 는 출력 레지스터라고 할 수 있고, coils는 디지털 또는 이산 출력이라고 할 수 있다. 이러한 데이터 더미는 포함된 데이터의 유형 및 액세스 권한을 정의한다. Slave(종속) 장치들은 로컬로 호스팅 되는데, 이 데이터에 직접 접근할 수 있다. Modbus에 접근가능한 데이터는 일반적으로 장치의 메인 메모리의 부분 집합이다. 반대로, Modbus 마스터(주장치)는 다양한 함수코드를 통해 이 데이터에 접근을 요청해야 한다. [테이블 1]에 각 블럭의 행동에 대해 서술했다.
메모리 구역
데이터 유형
마스터 접근
종속장치 접근
Coils
Boolean
읽기/쓰기
읽기/쓰기
Discrete Inputs
Boolean
읽기 전용
읽기/쓰기
Holding Registers
Unsigned Word
읽기/쓰기
읽기/쓰기
Input Registers
Unsigned Word
읽기 전용
읽기/쓰기
[테이블1] Modbus 데이터 모델 구역
이러한 블럭은 다양한 데이터 요소에 대한 접근을 제한하거나 허용하는 기능을 제공하고 또한 application 레이어에 다양한 데이터 형식으로 접근할 수 있는 간단한 메커니즘을 제공한다.
블럭들은 완전히 개념적이다. 주어진 시스템에서 독립된 메모리 주소로 존재하고, 또한 겹칠 수도 있다. 예를들면, Coil 한 개가 holding 레지스터 한 개에 해당하는 word의 첫번째 비트로 메모리 안 같은 위치에 존재할 수 있다. 주소(어드레싱) 제도는 전적으로 종속장치(slave)에 의해 정의되고, 각 메모리 블럭의 해석은 장치의 데이터 모델의 중요한 부분이다.
3-2. 데이터 모델 어드레싱
사양서는 65,536(2**16)개 요소의 주소공간을 포함함하는 것으로 각 블럭을 정의한다. PDU 정의 내에서, Modbus 는 0~65,535 범위의 각 데이터 요소에 주소를 정의한다. 하지만, 각 데이터 요소는 1부터 n까지 번호화 되어 있고, n의 최대값은 65,536 이다. 그것은, Coil 1은 주소0의 코일블록에 있고, holding 레지스터 54는 종속장치가 hoding 레지스터로 정의하는 메모리의 섹션 안에서 주소 53에 있다.