범위 바이너리 옵션 타입

마지막 업데이트: 2022년 4월 25일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
▲ Pull Type

C 언어 코딩 도장

지금까지 오버플로우, 언더플로우와 자료형의 크기에 대해서 알아보았습니다. 이번에는 소스 코드에서 정수의 최솟값과 최댓값을 표현하는 방법을 알아보겠습니다.

유닛 맨 앞의 표 7‑1에서 부호 있는 int 의 최솟값은 -2,147,483,648이라고 했지만 Visual Studio에서 이 값을 직접 넣어보면 컴파일 에러가 발생합니다.따라서 소스 코드에서 정수의 최솟값을 표현하려면 limits.h 헤더 파일을 사용해야 합니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요(실행 결과는 Visual Studio, Windows 기준).

CHAR_MIN , SHRT_MIN , INT_MIN , LONG_MIN , LLONG_MIN 은 부호 있는 정수의 최솟값입니다. limits.h 헤더 파일에는 다음과 같이 부호 있는 정수와 부호 없는 정수의 최솟값과 최댓값이 정의되어 있습니다.

표 7‑3 정수 자료형의 최솟값과 최댓값

범위 바이너리 옵션 타입
자료형 최솟값 최댓값
char CHAR_MIN CHAR_MAX
short SHRT_MIN SHRT_MAX
int INT_MIN INT_MAX
long LONG_MIN LONG_MAX
long long LLONG_MIN LLONG_MAX
unsigned char 0 UCHAR_MAX
unsigned short 0 USHRT_MAX
unsigned int 0 UINT_MAX
unsigned long 0 ULONG_MAX
unsigned long long 0 ULLONG_MAX

다음과 같이 limits.h 에 정의된 최댓값을 넘어서도 오버플로우가 발생합니다.

부호 있는 정수는 저장할 수 있는 범위를 넘어서면 최솟값(음수)부터 다시 시작하고, 부호 없는 정수는 범위를 넘어서면 최솟값인 0부터 다시 시작합니다.

마찬가지로 최솟값보다 작아지면 언더플로우가 발생합니다

최솟값에서 1을 빼서 값이 더 작아지면 언더플로우가 발생하여 다시 한 바퀴 돌게 되므로 최댓값이 출력됩니다.

지금까지 정수 자료형의 오버플로우와 언더플로우를 설명했습니다. 값을 계산하다가 오버플로우나 언더플로우 현상이 발생하면 의도치 않은 결과가 나올 수 있습니다. 따라서 프로그래밍할때는 정수 자료형의 크기를 항상 생각하고, 값이 범위를 넘어서지는 않는지 반드시 확인합니다.

게임을 개발하면서 몬스터를 스폰하는데 각 몬스터마다 겹치지 않는 ID가 필요하다고 치죠. 그래서 unsigned int 변수가 1씩 증가하면서 고유의 ID(유니크 ID)를 발급하는 함수를 만들었습니다. 언뜻 보기에는 잘 동작할 것 같지만 실제로는 문제가 있습니다. 시간이 오래 흘러 발급된 ID가 4,294,967,295을 넘어서면 오버플로우가 발생하여 0부터 다시 시작하게 됩니다. 이때부터는 ID가 중복되면서 여러 가지 문제가 발생할 것입니다.

오버플로우 문제는 당장 버그를 일으키지 않지만 언제 터질지 모르는 시한 폭탄과 같습니다. 즉, 오버플로우 상황이 발생하면 예상치 못한 버그가 발생하며 원인을 찾기가 매우 힘듭니다. 따라서 기능을 구현하기 전에 사용한 자료형이 적합한지 세심히 살펴봐야 합니다.

유튜브에서 싸이의 강남스타일 뮤직 비디오 조회수가 21억을 넘어서면서 음수로 표시된 적이 있었는데 이 사례도 정수 오버플로우 문제입니다.

범위 바이너리 옵션 타입

데이터들엔 타입이 존재합니다. 학번 데이터라면 정수를, 이름 데이터라면 문자열을 저장하듯이 SQL에서도 타입이 존재합니다.

오늘 포스트에서는 여러 타입 중 숫자와 관련한 타입들을 알아보도록 하겠습니다.

모든 숫자 타입은 UNSIGNED 옵션을 사용할 수 있습니다. UNSIGNED 옵션을 사용하면 범위 바이너리 옵션 타입 0과 양수만을 표현 하게 됩니다.

1. 정수

우선 가장 기본적인 숫자라고 할 수 있는 정수 타입에 대해 알아보겠습니다.

타입명 크기 값의 범위 값의 범위 (unsigned)
TINYINT 1 byte -(2^7) ~ 2^7 - 1 0 ~ 2^8 - 1
SMALLINT 2 byte -(2^15) ~ 2^15 0 ~ 2^16 - 1
MEDIUMINT 3 byte -(2^23) ~ 2^23 0 ~ 2^24 -1
INT 4 byte -(2^31) ~ 2^31 범위 바이너리 옵션 타입 0 ~ 2^32 - 1
BIGINT 5 byte -(2^63) ~ 2^63 0 ~ 2^64 - 1

2. 고정 소수점과 부동 소수점

컴퓨터의 실수 표현에는 고정 소수점과 부동 소수점 방식이 존재합니다. 지금은 SQL을 다루기 때문에 깊게는 설명할 수 없지만, 고정 소수점은 정확한 데이터를 위해, 부동 소수점은 데이터 값의 표현을 위해서 사용됩니다.

고정 소수점 방식에는 DECIMAL 또는 NUMERIC 키워드를 사용합니다. 이 키워드는 크기 표현란에, 정밀도와 스케일을 넣습니다.

정밀도(precision)은 총 자릿수를 의미하고, 스케일(scale)은 소수점 자릿수를 의미합니다. 만약 DECIMAL(3, 1)과 같은 표현식이 온다면 해당 컬럼의 표현가능한 고정 소수점 수는 -99.9 ~ 99.9가 됩니다.

부동 소수점 방식에는 FLOAT와 DOUBLE이 사용됩니다. 부동 소수점에는 단정도 형식(single-precision)과 배정도 형식(double-precision)이 존재합니다. 부동 소수점 방식은 다음과 같이 사용하고, 표시한 정밀도에 따라서, FLOAT, DOUBLE이 자동 선택됩니다.

단정도 형식은 FLOAT 키워드가 선택됩니다. FLOAT는 0~23 사이의 정밀도를 가지며, 4 byte 크기를 갖습니다.

배정도 형식은 DOUBLE 키워드가 선택됩니다. DOUBLE은 0~53사이의 정밀도를 가지며, 8 byte 크기를 갖습니다.

3. 비트

비트는 0/1의 binary 값을 저장하는 타입입니다. 비트 타입에는 1 ~ 64 비트의 범위가 올 수 있으며, 생략시 기본값인 1이 적용됩니다.

비트는 지정된 비트수보다 적은 크기의 값이 들어가면 자동으로 앞을 0으로 채워줍니다. BIT(4)의 컬럼에 01이라는 값을 넣으면 자동으로 0001로 변환되어 저장됩니다.

데브옵스의 확장 모델 – 깃옵스(GitOps) 이해하기

데브옵스 개념이 등장한 지 10년이 흐른 지금, 가치를 따지는 것은 무의미한 일이 되었습니다. 그 동안 축적된 긍정적인 결과들은 데브옵스를 더이상 유행이 아니라 소프트웨어 개발과 운영에 꼭 필요한 표준의 영역으로 이끌었습니다.

개인적으로 데브옵스가 널리 사랑 받게 된 이유는 커다란 목표와 원칙을 공유할 뿐 상세한 규칙이나 절차는 비어 있다는 점, 즉 유연성과 확장성에 있다고 생각합니다. 이는 급변하는 시장에서 살아 남을 수 있는 원동력이 되었고 지금도 여러가지 방식으로 또 데브섹옵스(DevSecOps), 깃옵스(GitOps), AI옵스(AIOps) 등의 다양한 이름으로 진화를 계속해 나가고 있습니다.

이들 중에서 개인적으로 많은 공감을 하였고 최근에 진행한 프로젝트에 직접 적용해 본 “깃옵스(GitOps)”에 대해 설명드리고자 합니다. 깃옵스의 기본 원칙과 패턴에 대해 알아본 다음 구현체 중 하나인 아르고CD(ArgoCD)를 활용하여 샘플 프로젝트에 적용하는 과정을 보여 드리겠습니다.

깃옵스는 위브웍스(Weaveworks Inc.)에서 처음 사용한 용어로 프로젝트에 데브옵스를 적용하는 실천 방법 중 하나입니다. 그 중에서도 클라우드 네이티브 애플리케이션을 대상으로 한 지속적 배포(Continuous Deployment)에 초점을 두고 있습니다.

※ 클라우드 네이티브 애플리케이션이 아니어도 깃옵스를 적용할 수 있으나 아래에서 설명드릴 선언형 모델(Declarative Model)을 지원하는 최근 도구들이 클라우드 네이티브에 중점을 두기 때문에 어려움을 겪을 수 있습니다. 위브웍스는 아예 쿠버네티스 대상이라고 못박고 있습니다.

이름에서 나타나듯 애플리케이션의 배포와 운영에 관련된 모든 요소를 코드화하여 깃(Git)에서 관리(Ops)하는 것이 깃옵스의 핵심입니다. 기본 개념은 코드를 이용하여 인프라를 프로비저닝 하고 관리하는 IaC(Infrastructure as Code)에서 나온 것으로 깃옵스는 이를 인프라에서 전체 애플리케이션 범위로 확장하였습니다.

Guide to GitOps은 DEV,VCS code base, CI, Container Registry, Confic repo의 과정으로이루어진다.

▲Guide to GitOps

깃옵스의 핵심 아이디어는 다음과 같습니다.

1) 배포에 관련된 모든 것을 선언형 기술서(Declarative Descriptions) 형태로 작성하여 Config Repository(혹은 Environment Repository)에서 관리한다.
2) Config Repository의 선언형 기술서와 운영 환경 간 상태 차이가 없도록 유지시켜주는 자동화 시스템을 구성한다.

깃옵스 환경에서 새로운 버전의 애플리케이션을 배포하거나 기존의 운영 환경을 바꾸고 싶다면 선언형 기술서를 수정한 뒤 Config Repository에 반영하기만 하면 됩니다. 나머지 과정은 자동화된 시스템이 알아서 수행할 것입니다.

깃옵스를 움직이는 핵심 개념들

1) 선언형 모델(Declarative Model)

여러분이 원격에 위치한 대상(서버)에 작업(애플리케이션 배포, 설정 관리 등)을 자동화 한다고 했을 때 가장 먼저 떠오르는 방법은 명령어를 순서대로 나열하는 명령형 모델(Imperative Model)일 것입니다.
“ssh로 접속 → cd로 이동 → mkdir로 디렉토리 생성”

간단한 방법인 만큼 단점도 명확합니다. 우선 예외 상황을 모두 관리(이미 디렉토리가 존재한다면? 권한은? 등)해야 하며 원격 대상에 대한 지식(OS 종류에 따른 명령어 차이 등)도 필요합니다.
다른 방법으로 선언형 모델이 있습니다. 대상이 무엇이 되어야 하는지만 기술하면 됩니다. 이해 하기 쉽도록 예를 들어 보겠습니다.

원격 서버에 ‘/etc/some_directory’ 디렉토리가 필요한 상황입니다. 선언형 모델에서는 아래와 같이 코드 형태로 세부 내용을 작성하기만 하면 됩니다.

- name: Create a directory if it does not exist
file:
path: /etc/some_directory
state: directory
(https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html)

디렉토리가 이미 존재하는지 확인하거나 OS에 따라 바뀌는 명령어를 사용자가 알아야 할 필요가 없습니다. 이는 선언형 모델 구현체의 몫입니다. 이 중 가장 대표적인 것이 쿠버네티스이며 깃옵스와도 궁합이 잘 맞습니다. 무엇보다도 가장 큰 장점은 인프라를 포함한 애플리케이션 배포와 운영에 관련된 모든 것을 코드로 관리할 수 있다는 점과 이 코드를 이용하여 언제든 똑같은 환경을 다시 만들어내거나 부분 소실 시 복원할 수 있다는 점입니다.

2) 단일 진실 공급원(Single Source Of Truth, SSOT)

같은 데이터가 여러 곳에 있을 경우 문제를 일으킬 수 있습니다. 데이터의 중복은 당연하고 수정 시 한 곳이라도 빠지게 된다면 비정합성까지 발생합니다. 때문에 한 곳에 두고 관리하고 다른 곳에서 필요 시 참조만 하도록 하여 범위 바이너리 옵션 타입 문제를 해결합니다.

대표적으로 데이터 정규화 작업에 이용됩니다. 예를 들어 보겠습니다. “Employee”와 “Employees' Skills” 테이블이 있습니다. 각 레코드들은 Employee Name, Employee Email 정보를 중복해서 포함 하고 있습니다. ‘Tom’의 이메일 주소가 변경되었습니다. 여러 개의 테이블의 레코드를 수정해야 합니다만 하나라도 수정이 이루어지지 않을 경우 모순 상태가 됩니다. 조회하는 테이블에 따라 ‘Tom’ 이메일이 다르게 조회되기 때문입니다.

[Employee] Table
employee_name employee_email
———————————————
Jack [email protected]
Tom [email protected]

[Employees' Skills] Table
employee_name employee_email skill
——————————————————————
Jack [email protected] Typing
Tom [email protected] Speaking ← 수정 실패

이런 경우 “Employees’ Skills” 테이블에서 Employee Email을 제거하고 employee_name를 이용해 “Employee” 테이블을 참조하도록 합니다. Employee Email 정보는 오직 “Employee”라는 하나의 테이블에서만 관리하도록 하는 것입니다.

깃옵스에서도 마찬가지입니다. 깃을 단일 진실 공급원으로 지정하고 오직 이 곳에서만 관리하도록 합니다. 모든 운영 활동의 시작은 깃이므로 사람 혹은 시스템 간의 혼선을 최소화 할 수 있습니다. 그리고 개발 단계에서만 누릴 수 있었던 깃의 강력하고 익숙한 기능을 운영 단계에서도 활용할 수 있게 됩니다. (History, Commit, Merge Request/ Review, Revert 등)

깃옵스 구현

실제로 깃옵스를 프로젝트에 적용할 때 고려해야 할 점들을 알아보겠습니다. 깃옵스는 어디까지나 방법론이기 때문에 정해진 도구가 따로 없습니다. 각자 익숙한 도구를 이용하면 됩니다.
그리고 깃옵스는 빌드와 테스트가 끝난 바이너리(이미지)를 저장소에 등록한 이후의 단계를 다루고 있기 때문에 지속적 통합(Continuous Integration) 부분은 생략하겠습니다.

1) 저장소 전략

최소 2개 이상의 Git 저장소를 사용하는 것을 권장합니다.
• 애플리케이션 저장소: 애플리케이션 소스 코드와 애플리케이션 배포를 위한 배포 매니페스트(예: kubernetes yaml)를 포함합니다.
• 배포 환경 구성 저장소: 배포 환경에 대한 모든 매니페스트를 포함합니다. 애플리케이션과 인프라 서비스(모니터링, 메시지 브로커 등)가 어떤 버전으로 어떻게 구성되어야 하는지에 대한 정보가 들어있습니다.

애플리케이션 배포 매니페스트를 별도의 깃 저장소에 보관해도 되고 템플릿 형태로만 가지고 있다가 배포 시 배포 환경 구성 저장소와 합쳐서 매니페스트를 생성하는 방식으로도 사용이 가능합니다.

2) 배포 전략

깃옵스에서는 푸시 타입(Push Type)과 풀 타입(Pull Type), 두 가지의 배포 전략을 가이드 하고 있습니다. 두 옵션 간의 차이점은 저장소에 있는 매니페스트와 배포 환경의 상태를 일치시키는 방법입니다. 무엇을 선택해도 상관없으나 깃옵스는 보안상의 이유로 풀 타입 배포 전략을 권장하고 있습니다. 각각에 대해 간략히 알아보겠습니다.

Push Type의 상세 과정에 대한 설명

▲ Push Type

■ 푸시 타입(Push Type)
저장소에 있는 매니페스트가 변경되었을 때 배포 파이프라인을 실행시키는 구조입니다. 아키텍처가 단순하여 인기 있는 방법이며 젠킨스(Jenkins), 서클CI(CircleCI) 등의 구현에 사용할 수 있는 도구들도 다양합니다. 가장 큰 특징으로 배포 환경(Environment)의 개수에 영향을 받지 않습니다. 접속 정보를 추가하거나 수정하는 것만으로도 간단하게 배포 환경을 추가하거나 변경할 수 있습니다.

그러나 항상 연결되어 있는 상태가 아니라서 실제 배포 작업이 수행되는 시점에 실패할 수도 있습니다. 그리고 배포 환경이 손상되어 배포 환경 구성 저장소의 내용과 다를 경우 차이를 감지하고 배포 파이프라인을 다시 실행시키거나 알림을 줄 수 있는 별도의 모니터링 시스템이 필요합니다.

Pull Type의 상세 과정에 대한 설명

▲ Pull Type

■ 풀 타입(Pull Type)
배포 환경에 위치한 별도의 오퍼레이터가 배포 파이프라인을 대신합니다. 이 오퍼레이터는 저장소의 매니페스트와 배포 환경을 지속적으로 비교하다가 차이가 발생할 경우 저장소의 매니페스트를 기준으로 배포 환경을 유지시켜 줍니다. 만약 누군가가 직접 손으로(허가 받지 않은 작업) 배포 환경을 변경했을 때도 다시 되돌려지게 되는데 이는 배포 환경의 변경은 저장소의 매니페스트를 통해서만 유효하다는 것을 보장해줍니다. 다시 말해 배포 환경에 대한 모든 이력은 배포 환경 구성 저장소 즉, 깃에 존재한다는 것을 의미합니다. 이런 방식을 지원하는 도구로는 아르고CD, 젠킨스X(JenkinsX), 그리고 깃옵스라는 용어를 만든 위브웍스에서 제작한 플럭스(Flux)가 있습니다.

앞에서 보안상의 이유로 깃옵스는 풀 타입 배포 전략을 권장한다고 언급했습니다. 이는 구조적 차이에서 발생하는 것으로 푸시 타입의 경우 배포 환경에 대한 자격 증명 정보를 외부에서 관리할 수 밖에 없습니다. 배포 환경 입장에서는 배포 파이프라인 자체가 외부 도메인이기 때문입니다. 그리고 일반적으로 배포 파이프라인에게 배포 환경에 대한 읽기?쓰기 권한을 부여하기 때문에 만의 하나 노출된다면 큰 피해를 볼 수도 있습니다.

반면 풀 타입의 경우 오퍼레이터가 애플리케이션과 동일한 환경에서 동작 중이어서 자격 증명 정보가 외부에 노출될 일이 없습니다. 그리고 배포 환경에 대한 자격 증명 정보도 오퍼레이터 관리를 위한 최소한의 인력으로 한정 지을 수 있습니다. 신경 써야 할 것은 배포 환경에서 깃 저장소와 이미지 저장소로의 접근 정도입니다.

깃옵스 장점

배포 빈도 및 속도 상승, 생산성 향상, 오류 감소 등 여러 장점들이 있지만 이들 대부분은 다른 데브옵스 구현 방법을 사용해서도 달성할 수 있는 것들입니다. 그렇기 때문에 깃옵스만의 장점을 설명드리겠습니다.

1) 신뢰할 수 있는 정보의 공유

“스테이지 환경에 배포된 A 서비스의 설정 값이 뭐지?”
필자가 개발과 운영을 하던 당시 적지 않게 묻고 대답했던 것 같습니다. 적어도 깃옵스를 사용한다면 누군가의 희미한 기억에 의존하거나 제때 업데이트를 하고 있는지 파악하기 위해 문서를 찾아 본다거나 직접 서버에 접속하기 위해 힘겹게 ssh 명령어를 입력할 필요가 없습니다. 깃 이력을 보면 현재 상태는 물론 누가, 언제, 왜, 어느 곳을 수정했는지 쉽게 알 수 있기 때문입니다. 지금까지의 모든 이력을 포함하고 있는 이 시스템은 부가적인 문서 작업을 없애는 좋은 수단이기도 합니다.

※ 에러 복구 시간 감소
새롭게 서비스를 배포했는데 장애가 발생했을 때 해야 할 일은 ‘git revert’ 명령어, 그리고 배포 환경이 이전 버전으로 롤백될 때까지 기다리는 것입니다.

2) 익숙한 절차

“git commit → push → merge request → review → merge”
개발자에게 굉장히 익숙한 절차입니다. 그렇기 때문에 애플리케이션 배포를 위한 별도의 절차를 만들거나 교육시킬 필요가 없습니다. 그리고 리뷰 절차를 통해 휴먼 에러를 조기에 발견하고 책임을 나눌 수 있습니다.

GitOps 적용

풀 타입 구현체 중 하나인 아르고CD를 이용하여 깃옵스 시스템을 구축하겠습니다.
그리고 저장소에 있는 배포 관련 디스크립션을 수정했을 때 아르고CD가 배포 환경(Kubernetes)에 변경 사항을 잘 반영하는지도 확인해 보겠습니다.

1) Config Repo 생성

깃허브(GitHub)에 개인 프로젝트를 생성하고 쿠버네티스용 디스크립션을 작성합니다.

# example/nginx_deploy.yaml at main · iwin100/example (github.com)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
. . .

2) 애플리케이션 생성

아르고CD 실행화면

이제 아르고CD에게 일을 시켜보겠습니다. 로그인 후 왼쪽 상단의 “+NEW APP” 혹은 중앙의 “CREATE APPLICATION” 클릭 하고 생성에 필요한 정보를 입력 합니다.

표 1. 광의의 기준정보 유형 및 주요 특징
Application Name 아르고CD 에서 사용할 애플리케이션 이름입니다
Project 애플리케이션들을 구분하고 관리하기 위한 논리적 그룹입니다. 프로젝트 단위로 배포 환경에 대한 권한이나 사용할 수 있는 자원들(Cluster, Namespace, Source 등)을 허용하거나 제한할 수 있습니다.
SYNC POLICY
(Manual | Automatic)
깃에 정의된 디스크립션과 배포 환경을 비교하고 유지하는 작업을 주기적(3초)으로 수행할 지, 수동으로 수행할 지를 선택합니다.
Repository URL 깃 저장소 주소입니다.
Revision 리비전 정보입니다. 브랜치명 이외에 태그도 가능합니다.
Path 깃 저장소 내에 디스크립션이 위치한 디렉토리 정보를 입력합니다.
Cluster Url 아르고CD와 동일한 환경에 배포하려면“https://kubernetes.default.svc”를 입력합니다. 다른 클러스터에 배포할 수 있습니다.
Namespace 쿠버네티스 namespace 정보입니다.

작성 후 “Create” 버튼을 누르면 내부적인 검증 작업을 거친 뒤 신규 애플리케이션이 생성되며, SYNC POLICY 값을 Automatic으로 설정했다면 아래처럼 배포까지 진행됩니다.

아르고CD 실행화면

애플리케이션 카드를 클릭하면 아래와 같이 각각의 쿠버네티스 리소스에 대한 정보는 물론 동작 상태에 대한 상세 정보가 제공됩니다.

아르고CD 실행화면

3) 감시 기능 확인

마지막으로 아르고CD의 감시 기능이 제대로 동작하는지 확인하기 위해 깃에서 Deployment-replicas 값을 1에서 2로 수정하고 커밋하겠습니다.

아르고CD 실행화면

잠시 후 아르고CD에서 “nginx-deployment” pod가 두 개로 늘어난 것을 확인할 수 있습니다.

아르고CD 실행화면

데브섹옵스, 깃옵스, AI옵스 등 데브옵스를 확장하거나 특정 기술 혹은 업무에 특화된 모델들이 몇 해 전부터 등장하고 있습니다. 이는 데브옵스가 도입기를 넘어 모델의 다양성이 가속화 되는 성장기 혹은 그 다음 단계로 진입했음을 보여주는 것이라고 생각합니다.

깃옵스도 지금까지 소개된 많은 모델 중 하나지만 대상과 장점이 아주 명확합니다. 그렇기 때문에 클라우드 네이티브 대상, 그 중에서도 쿠버네티스로의 배포를 고려 중이거나 보안에 민감하여 권한과 정보를 엄격하게 관리하는 프로젝트일 경우 깃옵스는 좋은 선택지가 될 것입니다.

새롭게 데브옵스 환경을 구축할 계획을 가지고 있거나 기존의 것이 아쉬운 개발자 분들에게 본 아티클이 조금이나마 도움이 되기를 바랍니다.

▶ 해당 콘텐츠는 저작권법에 의하여 보호받는 저작물로 기고자에게 저작권이 있습니다.
▶ 해당 콘텐츠는 사전 동의 없이 2차 가공 및 영리적인 이용을 금하고 있습니다.

Assets HTTP API

다음 Assets HTTP API를 사용하면 메타데이터, 표현물 및 주석을 비롯한 디지털 자산에 대해 를 사용하여 구조화된 컨텐츠와 함께 CRUD(create-read-update-delete) 작업을 수행할 수 있습니다 Experience Manager 컨텐츠 조각. 에 노출되어 있습니다 /api/assets 및 는 REST API로 구현됩니다. 여기에는 다음이 포함됩니다 컨텐츠 조각 지원.

  1. 에서 API 서비스 문서를 엽니다. https://[hostname]:[port]/api.json .
  2. 다음을 수행합니다 Assets 다음으로 연결되는 서비스 링크 https://[hostname]:[server]/api/assets.json .

API 응답은 일부 MIME 유형에 대한 JSON 파일이며 모든 MIME 유형에 대한 응답 코드입니다. JSON 응답은 선택 사항이며 PDF 파일과 같이 사용할 수 없습니다. 추가적인 분석 또는 작업을 위해서는 응답 코드를 사용하십시오.

다음 이후 해제 시간, 자산 및 해당 표현물은 Assets 웹 인터페이스 및 HTTP API를 통해 사용할 수 있습니다. API는 시간 은 미래의 또는 해제 시간 는 과거입니다.

HTTP API는 메타데이터 속성을 업데이트합니다 에서 jcr 네임스페이스. 그러나 Experience Manager 사용자 인터페이스는 의 메타데이터 속성을 업데이트합니다 dc 네임스페이스.

콘텐츠 조각

A 콘텐츠 조각 는 특별한 유형의 자산입니다. 텍스트, 숫자, 날짜 등과 같은 구조화된 데이터에 액세스하는 데 사용할 수 있습니다. 다음과 같은 몇 가지 차이점이 있습니다 standard 자산(이미지 또는 문서 등), 일부 추가 규칙은 컨텐츠 조각 처리에 적용됩니다.

데이터 모델

다음 Assets HTTP API는 두 개의 주요 요소, 폴더 및 자산(표준 자산의 경우)을 표시합니다.

또한 컨텐츠 조각에 구조화된 컨텐츠를 설명하는 사용자 지정 데이터 모델에 대해 더 자세한 요소를 노출합니다. 자세한 내용은 컨텐츠 조각 데이터 모델 추가 정보.

폴더는 기존 파일 시스템의 디렉토리와 같습니다. 다른 폴더 또는 어설션의 컨테이너입니다. 폴더에는 다음 구성 요소가 있습니다.

엔티티: 폴더의 엔티티는 폴더 및 범위 바이너리 옵션 타입 자산일 수 있는 하위 요소입니다.

속성:

  • name 은 폴더의 이름입니다. 확장 없이 URL 경로에 있는 마지막 세그먼트와 동일합니다.
  • title 은 폴더 이름 대신 표시할 수 있는 폴더의 선택적 제목입니다.

폴더 또는 자산의 일부 속성이 다른 접두사에 매핑됩니다. 다음 jcr 접두사 jcr:title , jcr:description , 및 jcr:language 다음으로 대체됨 dc 접두사를 사용합니다. 따라서 반환된 JSON에서 dc:title 및 dc:description 다음 값 포함 jcr:title 및 jcr:description 각각 입니다.

링크 폴더에 세 개의 링크가 표시됩니다.

  • self : 직접 연결합니다.
  • parent : 상위 폴더에 연결합니다.
  • thumbnail : (선택 사항) 폴더 축소판 이미지에 연결된 링크입니다.

Experience Manager 시 자산에 다음 요소가 포함됩니다.

  • 자산의 속성 및 메타데이터입니다.
  • 원본 표현물(원래 업로드된 자산), 축소판 범위 바이너리 옵션 타입 및 기타 표현물과 같은 여러 표현물이 있습니다. 추가적인 표현물은 다양한 크기, 다양한 비디오 인코딩 또는 PDF 또는 추출된 페이지의 이미지일 수 있습니다 Adobe InDesign 파일.
  • 선택적 주석입니다.

in Experience Manager 폴더에는 다음 구성 요소가 있습니다.

  • 엔터티: 자산의 자식은 표현물입니다.
  • 속성.
  • 링크.

다음 Assets HTTP API에는 다음 기능이 포함되어 있습니다.

가독성을 쉽게 하기 위해 다음 예에는 전체 cURL 표기법을 생략합니다. 실제로 표기법은 와 관련 있습니다 복원 에 대한 스크립트 래퍼입니다. cURL .

전제 조건

  • 액세스 https://[aem_server]:[port]/system/console/configMgr .
  • 다음으로 이동 Adobe Granite CSRF 필터.
  • 속성을 확인합니다 필터 메서드 include: POST , PUT , DELETE .

폴더 목록 검색

기존 폴더 및 하위 엔티티(하위 폴더 또는 자산)의 Similar 표현을 검색합니다.

요청: GET /api/assets/myFolder.json

응답 코드: 응답 코드는 다음과 같습니다.

  • 200 - OK - 성공.
  • 404 - 찾을 수 없음 - 폴더가 없거나 액세스할 수 없습니다.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

응답: 반환된 엔티티의 클래스는 자산 또는 폴더입니다. 포함된 엔티티의 등록 정보는 각 엔티티의 전체 등록 정보 집합의 하위 집합입니다. 엔티티의 전체 표현을 가져오려면 클라이언트는 와 함께 링크가 가리키는 URL의 컨텐츠를 검색해야 합니다 rel 의 self .

폴더를 만듭니다

새 항목 만들기 sling : OrderedFolder 를 클릭합니다. 다음과 같은 경우 * 이 노드 이름 대신 제공되면 서블릿은 매개변수 이름을 노드 이름으로 사용합니다. 요청 데이터로 허용됨 은 새 폴더의 Shanner 표현 또는 다음과 같이 인코딩된 이름-값 쌍 세트입니다 application/www-form-urlencoded 또는 multipart / form - data : HTML 양식에서 직접 폴더를 만드는 데 유용합니다. 또한 폴더의 속성을 URL 쿼리 매개 변수로 지정할 수 있습니다.

API 호출이 500 제공된 경로의 상위 노드가 없는 경우 응답 코드가 필요합니다. 호출은 응답 코드를 반환합니다 409 폴더가 이미 있는 경우.

매개 변수: name 는 폴더 이름입니다.

요청

  • POST /api/assets/myFolder -H"Content-Type: application/json" -d '>'
  • POST /api/assets/* -F"name=myfolder" -F"jcr:title=My Folder"

응답 코드: 응답 코드는 다음과 같습니다.

  • 201 - 생성됨 - 성공적으로 만들 때.
  • 409 - 충돌 - 폴더가 이미 있는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

자산 만들기

제공된 파일을 제공된 경로에 놓아 DAM 저장소에 자산을 만듭니다. 다음과 같은 경우 * 이 노드 이름 대신 제공되면 서블릿은 매개변수 이름 또는 파일 이름을 노드 이름으로 사용합니다.

매개 변수: 매개 변수는 다음과 같습니다 name 자산 이름 및 file 파일 참조.

요청

  • POST /api/assets/myFolder/myAsset.png -H"Content-Type: image/png" --data-binary "@myPicture.png"
  • POST /api/assets/myFolder/* -F"name=myAsset.png" -F"[email protected]"

응답 코드: 응답 코드는 다음과 같습니다.

  • 201 - 작성됨 - 자산이 성공적으로 생성된 경우.
  • 409 - 충돌 - 자산이 이미 있는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

자산 이진 업데이트

자산의 바이너리(이름이 원래 표현물)를 업데이트합니다. 구성된 경우 업데이트는 실행할 기본 자산 처리 워크플로우를 트리거합니다.

요청: PUT /api/assets/myfolder/myAsset.png -H"Content-Type: image/png" --data-binary @myPicture.png

응답 코드: 응답 코드는 다음과 같습니다.

  • 200 - 확인 - 자산이 성공적으로 업데이트된 경우.
  • 404 - 찾을 수 없음 - 제공된 URI에서 자산을 찾거나 액세스할 수 없는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

자산 메타데이터 업데이트

자산 메타데이터 속성을 업데이트합니다. 에서 속성을 업데이트하는 경우 dc: 네임스페이스에서 API는 jcr 네임스페이스. API는 두 네임스페이스 아래의 속성을 동기화하지 않습니다.

요청: PUT /api/assets/myfolder/myAsset.png -H"Content-Type: application/json" -d '>'

응답 코드: 응답 코드는 다음과 같습니다.

  • 200 - 확인 - 자산이 성공적으로 업데이트된 경우.
  • 404 - 찾을 수 없음 - 제공된 URI에서 자산을 찾거나 액세스할 수 없는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

간 메타데이터 업데이트 동기화 dc 및 jcr namespace

API 메서드는 의 메타데이터 속성을 업데이트합니다 jcr 네임스페이스. 사용자 인터페이스를 사용하여 업데이트한 내용은 dc 네임스페이스. 메타데이터 값을 동기화하려면 dc 및 jcr 네임스페이스에서 워크플로우를 만들고 Experience Manager을 구성하여 자산 편집 시 워크플로우를 실행할 수 있습니다. ECMA 스크립트를 사용하여 필요한 메타데이터 속성을 동기화합니다. 다음 샘플 스크립트는 다음 사이에 제목 문자열을 동기화합니다 dc:title 및 jcr:title .

자산 표현물 만들기

자산에 대한 새 자산 표현물을 만듭니다. 요청 매개 변수 이름을 제공하지 않으면 파일 이름이 변환 이름으로 사용됩니다.

매개 변수: 매개 변수는 다음과 같습니다 name 변환 이름 및 file 를 파일 참조로 사용합니다.

요청

  • POST /api/assets/myfolder/myasset.png/renditions/web-rendition -H"Content-Type: image/png" --data-binary "@myRendition.png"
  • POST /api/assets/myfolder/myasset.png/renditions/* -F"name=web-rendition" -F"[email protected]"

응답 코드: 응답 코드는 다음과 같습니다.

  • 201 - CREATED - Rendition이 성공적으로 작성된 경우.
  • 404 - 찾을 수 없음 - 제공된 URI에서 자산을 찾거나 액세스할 수 없는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

자산 표현물 업데이트

업데이트는 자산 표현물을 새 이진 데이터로 바꿉니다.

요청: PUT /api/assets/myfolder/myasset.png/renditions/myRendition.png -H"Content-Type: image/png" --data-binary @myRendition.png

응답 코드: 응답 코드는 다음과 같습니다.

  • 200 - 확인 - 렌디션이 성공적으로 업데이트된 경우.
  • 404 - 찾을 수 없음 - 제공된 URI에서 자산을 찾거나 액세스할 수 없는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

자산에 주석 추가

매개 변수: 매개 변수는 다음과 같습니다 message 설명 및 annotationData JSON 형식의 주석 데이터에 대해 를 참조하십시오.

요청: POST /api/assets/myfolder/myasset.png/comments/* -F"message=Hello World." -F"annotationData=<>"

응답 코드: 응답 코드는 다음과 같습니다.

  • 201 - CREATED - 설명이 성공적으로 작성된 경우
  • 404 - 찾을 수 없음 - 제공된 URI에서 자산을 찾거나 액세스할 수 없는 경우.
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

폴더 또는 자산 복사

제공된 경로에서 사용할 수 있는 폴더 또는 자산을 새 대상에 복사합니다.

요청 헤더: 매개 변수는 다음과 같습니다.

  • X-Destination - 리소스를 복사할 API 솔루션 범위 범위 바이너리 옵션 타입 내의 새 대상 URI입니다.
  • X-Depth - 다음 중 하나 infinity 또는 0 . 사용 0 리소스와 해당 속성만 복사하고 하위 항목은 복사하지 않습니다.
  • X-Overwrite - 사용 F 기존 대상의 자산을 덮어쓰지 않도록 합니다.

요청: COPY /api/assets/myFolder -H"X-Destination: /api/assets/myFolder-copy"

응답 코드: 응답 코드는 다음과 같습니다.

  • 201 - 작성됨 - 폴더/자산이 존재하지 않는 대상에 복사된 경우
  • 204 - 컨텐츠 없음 - 폴더/자산이 기존 대상에 복사된 경우
  • 412 - 전제 조건 실패 - 요청 헤더가 누락된 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

폴더 또는 자산 이동

지정된 경로의 폴더 또는 자산을 새 대상으로 이동합니다.

요청 헤더: 매개 변수는 다음과 같습니다.

  • X-Destination - 리소스를 복사할 API 솔루션 범위 내의 새 대상 URI입니다.
  • X-Depth - 다음 중 하나 infinity 또는 0 . 사용 0 리소스와 해당 속성만 복사하고 하위 항목은 복사하지 않습니다.
  • X-Overwrite - 다음 중 하나를 사용합니다. T 기존 리소스를 강제로 삭제하려면 또는 F 기존 리소스를 덮어쓰지 않도록 합니다.

요청: MOVE /api/assets/myFolder -H"X-Destination: /api/assets/myFolder-moved"

사용 안 함 /content/dam 를 입력합니다. 자산을 이동하고 기존 자산을 덮어쓰는 샘플 명령은 다음과 같습니다.

응답 코드: 응답 코드는 다음과 같습니다.

  • 201 - 작성됨 - 폴더/자산이 존재하지 않는 대상에 복사된 경우
  • 204 - 컨텐츠 없음 - 폴더/자산이 기존 대상에 복사된 경우
  • 412 - 전제 조건 실패 - 요청 헤더가 누락된 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

폴더, 자산 또는 표현물 삭제

제공된 경로에서 리소스(-tree)를 삭제합니다.

요청

  • DELETE /api/assets/myFolder
  • DELETE /api/assets/myFolder/myAsset.png
  • DELETE /api/assets/myFolder/myAsset.png/renditions/original

응답 코드: 응답 코드는 다음과 같습니다.

  • 200 - 확인 - 폴더가 성공적으로 삭제된 경우
  • 412 - 전제 조건 실패 - 루트 컬렉션을 찾을 수 없거나 액세스할 수 없는 경우.
  • 500 - 내부 서버 오류 - 다른 오류가 발생한 경우

팁 및 제한 사항

HTTP API는 메타데이터 속성을 범위 바이너리 옵션 타입 업데이트합니다 에서 jcr 네임스페이스. 그러나 Experience Manager 사용자 인터페이스는 의 메타데이터 속성을 업데이트합니다 dc 네임스페이스.

Assets HTTP API는 전체 메타데이터를 반환하지 않습니다. 네임스페이스는 하드코딩되며 이러한 네임스페이스만 반환됩니다. 전체 메타데이터에 대해서는 자산 경로를 참조하십시오 /jcr_content/metadata.json .

Modbus 시작하기

Modbus는 자동화 디바이스간 통신을 위해 1979년에 개발된 산업용 프로토콜입니다. Modbus는 원래 시리얼 통신을 위해 고안된 어플리케이션 계층 프로토콜이었으나, 점차 시리얼, TCP/IP 범위 바이너리 옵션 타입 및 UDP에서도 구현하도록 사용이 확대되었습니다. 현재 Modbus는 다양한 현대의 네트워크에서 간단하고 안정적이며 효율적인 통신을 구현하기 위해 일반적으로 사용되는 프로토콜입니다.

  • 요청-응답 구조
  • Modbus 데이터 모델
  • Modbus 함수 코드
  • LabVIEW Modbus API
  • Modbus I/O 서버
  • NI OPC 서버를 OPC I/O 서버 또는 OPC UA와 함께 사용

Modbus 시작하기

Modbus는 일반적으로 장치간 SCADA 식의 네트워크 통신에 사용됩니다. 예를 들어, 대형 서버는 PLC 또는 PAC의 마스터가 될 수 있고, PLC/PAC는 또한 센서, 밸브, 모터 또는 기타 임베디드 장치의 마스터가 될 수도 있습니다.

이러한 요구를 충족하기 위해 Modbus는 유연적인 데이터 및 함수 모델을 갖춘 요청-응답 프로토콜로서 제작되었습니다. 이러한 특징이 바로 Modbus가 현재에도 여전히 사용되는 이유입니다.

요청-응답 구조

Modbus 프로토콜은 마스터-슬레이브 구조를 따르며, 이 구조하에서는 마스터는 슬레이브에 요청을 보내고 응답을 기다립니다. 이 구조를 통해 마스터는 정보의 흐름을 전적으로 컨트롤할 수 있어, 종전의 멀티드롭 시리얼 네트워크에 유용합니다. 심지어 현대식 TCP/IP 네트워크에서도 마스터가 슬레이브의 동작을 상당 부분을 컨트롤할 수 있으므로 일부 디자인에 유용합니다.

그림 1. Modbus 장치의 마스터-슬레이브, 요청-응답 구조

Modbus에서 요청은 여러 층으로 된 데이터의 세트입니다. 첫 번째 계층은 Application Data Unit(ADU)로, 대부분의 사람들이 ADU를 Modbus의 "유형"이라고 생각합니다. ADU에는 ASCII, Remote Terminal Unit(RTU), TCP/IP의 세 가지가 있습니다.

TCP는 소프트웨어에서 Modbus의 요청과 응답을 효율적으로 처리하고, 각 요청에 대한 전용 연결과 식별자를 통해 보다 효율적인 네트워킹을 구현하는 현대식 포맷입니다. RTU와 ASCII는 좀 더 오래된 시리얼 ADU 포맷으로, 차이점은 RTU는 바이너리 형식으로 데이터를 표현하며 ASCII는 ASCII 문자로 요청을 보낸다는 점입니다.

대부분의 어플리케이션에 선호되는 ADU는 필요한 물리 네트워크(이더넷, 시리얼 또는 기타), 네트워크 상의 장치의 개수, 네트워크에서 마스터와 슬레이브에 의해 지원되는 ADU에 따라 달라질 수 있습니다. Modbus를 사용하는 어플리케이션의 관점에서 보면, 마치 ADU가 존재하지 않는 것처럼 데이터가 표시되어야 합니다.

각 ADU 내에는 Modbus 프로토콜의 핵심인 Protocol Data Unit(PDU)이 있습니다. 각 PDU에는 함수 코드와 연관 데이터가 포함됩니다. 각 함수 코드에는 잘 정의된 응답이 있습니다. 이 함수 코드를 슬레이브에 보내지는 명령이라고 생각하면 됩니다.

일부 경우 에러가 발생할 수 있습니다. Modbus는 예외를 위한 특정 PDU를 정의함으로써 에러 발생을 마스터에게 알립니다. 대부분의 드라이버는 사용중인 언어나 어플리케이션에서 이해할 수 있는 형식으로 PDU를 변환합니다.

Modbus 데이터 모델

Modbus는 데이터의 접근을 간단하고 유연하게 처리합니다. 원래 Modbus는 두 가지 데이터 타입 즉, 불리언 값과 부호 없는 16비트 정수를 지원합니다.

SCADA 시스템에서 일반적으로 임베디드 장치는 입력으로 정의된 특정 값(게인 또는 PID 설정 등)을 가지며, 다른 값으로는 전류 온도 또는 밸브 위치와 같은 출력값이 있습니다. 이러한 요구를 충족하기 위해 Modbus 데이터 값은 4개의 범위로 나뉩니다. (표 1 참조) 슬레이브는 각 범위에서 많게는 65,536개의 요소를 정의합니다.

메모리 블록 데이터 타입 마스터 접근 슬레이브 접근
Coils 불리언 읽기/쓰기 읽기/쓰기
Discrete Inputs 불리언 읽기만 읽기/쓰기
Holding Registers 부호없는 워드 읽기/쓰기 읽기/쓰기
Input Registers 부호없는 워드 읽기만 읽기/쓰기

표 1. Modbus 데이터 모델 블록

여러 경우, 센서 및 기타 장치는 단순히 불리언 및 부호 없는 정수가 아닌 다른 타입의 데이터를 생성합니다. 일반적으로 슬레이브 장치는 이러한 더욱 큰 데이터 타입을 레지스터로 변환합니다. 예를 들어, 압력 센서는 32비트 부동점 값을 2개의 16비트 레지스터로 나눌 수 있습니다.

Modbus는 이 값들을 개념적으로 (다시 말해, 메모리에 실제로 존재하지 않음) 표시합니다. 예를 들어, 슬레이브 장치는 Holding Register와 Input Register가 실제로 동일한 메모리를 공유하는 방식으로 정의될 수도 있습니다. (단, 동작을 슬레이브가 이해할 수 있는 경우) 대부분의 경우, 슬레이브는 지원하는 각 데이터 타입을 개별 메모리에 저장하며, 마스터가 접근할 수 있는 데이터 요소의 개수를 제한합니다. 이러한 유연성은 Modbus 함수 코드의 잘 정의된 동작을 통해 데이터가 표시되기 때문에 가능한 옵션입니다.

Modbus 함수 코드

Modbus 함수 코드는 마스터가 데이터에 어떻게 접근하며 변경하는지를 결정합니다. 데이터 범위가 개념적인 성격인데 반해, 함수 코드는 잘 정의된 동작을 가집니다. 슬레이브가 함수 코드를 수행하도록 요청을 받으면, 함수의 파라미터를 사용하여 정의된 동작을 실행합니다. 그림 2는 함수 범위 바이너리 옵션 타입 요청과 장치의 실제 메모리의 연결 관계를 나타냅니다.

그림 2. 함수 코드, 데이터 범위 및 슬레이브 장치의 실제 메모리 사이의 관계

가장 일반적인 함수 코드는 코드가 변경하거나 접근하려는 개념적인 데이터 범위에 따라 이름이 정해집니다. 예를 들어, "read holding registers"라는 함수 코드는 홀딩 레지스터라고 정의된 메모리에서 데이터를 꺼낸 후 마스터로 반환합니다. 표 2는 가장 일반적인 함수 코드를 나타냅니다.

표 범위 바이너리 옵션 타입 2. 일반적인 함수 코드

LabVIEW로 Modbus 시작하기

NI는 Modbus 장치와 연동하기 위한 세 가지 주요 구조를 제공합니다. (1) 하이레벨 OPC 서버, (2) Modbus I/O 서버, (3) 로우레벨 Modbus API (LabVIEW Real-Time 또는 LabVIEW Datalogging and Supervisory Control (DSC) Module을 통해 NI LabVIEW 2014에서 소개된 기능)

LabVIEW Modbus API

로우레벨 Modbus API는 Modbus 요청의 시퀀스 및 타이밍을 하이레벨로 컨트롤해야 하는 어플리케이션에 선호되는 옵션입니다. 또한 로우레벨 API는 유연성이 중요한 경우에도 일반적으로 선호됩니다. 그러나, LabVIEW Modbus API가 유연성과 강력한 성능을 제공하지만 API를 처리하기 위해 어플리케이션 코드가 그만큼 복잡하다는 뜻이기도 합니다. 이러한 복잡성의 이해를 돕기 위해 LabVIEW는 두 가지 예제를 제공합니다.

Modbus 소개 예제

첫 번째 예제인 Modbus Library.lvproj는 API의 기능을 간략하게 설명합니다. 또한, PC와 Real-Time 타겟에 실행되었을 때의 차이를 설명합니다. 그림 3은 Real-Time 타겟에서 Modbus 마스터 코드 실행을 보여줍니다.

그림 3. Master on RT Target.vi

이 예제는 LabVIEW API를 사용하는 Modbus 어플리케이션의 핵심 요구사항을 설명합니다. 첫째, Modbus 인스턴스가 생성됩니다. 이 경우, TCP 마스터입니다. 그러나, 다형성 인스턴트 선택자를 변경하여 이 예제를 시리얼 마스터로 전환할 수 있습니다.

그림 4. Modbus 마스터의 유형 변경하기

인스턴스가 생성되면, 사용자는 슬레이브 장치에 대한 폴링을 시작할 수 있습니다. 예제는 함수 코드 Read Input Registers의 사용을 보여줍니다. API에 의해 지원되는 모든 Modbus 함수 코드가 적절한 팔레트에 나타납니다. 슬레이브 API는 마스터가 실행할 수 없는 추가적인 함수를 가지고 있습니다. 예를 들어, 슬레이브는 입력 레지스터 범위에 쓸 수 있지만 마스터는 그 범위로부터 읽을 수만 있습니다. 그림 5는 함수 코드를 나타냅니다.

그림 5. Modbus 마스터 및 슬레이브 팔레트의 함수 코드

마지막으로, Modbus 인스턴스가 닫히면 인스턴스와 연관된 메모리 할당이 해제됩니다. 이 때 TCP 연결 또는 NI-VISA 시리얼 참조와 같은 모든 참조도 닫힙니다.

지금까지 마스터 예제에 대해서만 살펴보았습니다. 그러나, 모든 예제는 대부분의 LabVIEW 사용자들에게 친숙한 열기, 읽기/쓰기, 닫기 등의 기본 패턴을 따릅니다.

마지막으로, API가 똑같이 보인다 하더라도 주요 차이점을 이해해야 합니다. 사용하는 장치가 마스터인 경우, 마스터는 데이터를 수집하기 위해 네트워크에서 적합한 슬레이브로 요청을 보내야 합니다. 반면 슬레이브는 고유한 로컬 데이터 스토리지를 가지며 여기에 신속하게 접근할 수 있습니다.

중복 마스터 예제

일부 어플리케이션은 기본 예제만으로 충분할 수 있지만, 센서나 게이트웨이에 통신해야 하는 복합 어플리케이션의 경우 기본 예제가 충분하지 않을 수 있습니다. 이같은 문제를 해결하기 위해 샘플 어플리케이션은 두 개의 마스터를 사용하여 주어진 슬레이브와 통신하는 방법을 보여줍니다. 마스터 중 하나가 슬레이브 또는 HMI와의 연결에 실패하거나 연결을 잃은 경우, 다른 마스터가 대신합니다.

그림 6. 중복 마스터 구조의 예

이 디자인이 어플리케이션에 적합하다고 생각하거나, Modbus 통신의 보다 복합적인 예제에 관심이 있는 경우, 예제 검색기에서 Redundant Modbus Masters.lvproj를 확인하십시오.

Modbus I/O 서버

LabVIEW DSC 및 LabVIEW Real-Time Module에 있는 Modbus I/O 서버는 Modbus에서 통신하기 위한 하이레벨 엔진을 제공합니다. 전송하고자 하는 함수 코드를 지정하는 대신, 접근하려고 하는 데이터 세트를 등록하면 I/O 서버가 지정된 속도로 요청을 자동적으로 스케쥴합니다.

I/O 서버를 사용하기 위해 프로젝트의 원하는 타겟에 새로운 I/O 서버를 추가합니다. 로우레벨 API에서 처럼, Modbus 마스터 또는 슬레이브 중 선택하면 추가적인 파라미터가 생깁니다. 예를 들어, 마스터는 지정된 폴링 속도(모든 요청이 슬레이브에 보내지는 속도)가 있는 반면, 슬레이브는 이러한 요청에 대해 대기해야 하며 미리 정의된 타이밍이 없습니다.

I/O 서버가 생성된 후, 사용자는 읽으려고 하는 장치의 아이템을 지정할 수 있습니다. 로우레벨 API의 경우 요청을 반드시 직접 생성하고 처리해야 하지만, Modbus I/O 서버를 사용하면 다양한 포맷과 데이터 타입 중에서 선택할 수 있습니다. 예를 들어, 변수를 아이템 400001로 맵핑하여 address 0에서 홀딩 레지스터를 읽을 수 있고, 400001.1을 선택하여 이 레지스터의 첫 번째 비트를 읽을 수 있고, F400001을 선택하여 레지스터 0과 1에 저장된 단정도 부동소수를 읽을 수 있습니다.

접근할 변수를 선택한 후, 사용자는 블록다이어그램의 공유 변수 노드를 사용하여 이러한 변수를 읽거나 쓸 수 있습니다. 변수 이름에 가명을 정할 수도 있습니다.

그림 7. 간단한 I/O 서버 어플리케이션

I/O 서버 어플리케이션은 최소한의 프로그래밍만 필요하며 이해하기가 더욱 쉽습니다. 단, 사용이 쉬운 만큼 단점도 있다는 것을 기억하십시오. 즉, 데이터는 미리 지정된 속도로만 업데이트되며, 요청된 데이터를 실행 중에 추가하거나 제거할 수 없습니다. 이러한 제약이 상관 없다면 I/O 서버를 크로스 플랫폼 옵션으로 권장합니다.

보다 자세한 정보 및 단계별 가이드가 필요한 경우, Connect LabVIEW to Any PLC With Modbus 문서를 확인하십시오.

NI OPC 서버를 OPC I/O 서버 또는 OPC UA와 함께 사용

여러 슬레이브 장치가 서로 다른 프로토콜로 통신하는 복잡한 어플리케이션의 경우, 표준 Modbus I/O는 충분하지 않을 수 있습니다. 이 때 일반적으로 모든 시스템에 대한 Data Aggregator의 역할을 하는 OPC 서버를 사용하며, 그 후 이 OPC 서버와 통신하기 위해 LabVIEW DSC Module에 포함된 OPC I/O 서버를 사용합니다.

그림 8은 이 구조의 예를 보여줍니다. NI OPC 서버에서 Modbus를 사용하여 센서와 직접 통신하며, OPC UA를 사용하여 NI CompactRIO PAC와 통신합니다. 데이터가 NI OPC 서버에 모이면, OPC I/O 서버는 데이터를 추출하여 이를 LabVIEW 어플리케이션과 공유합니다.

그림 8. Modbus, NI OPC 서버 및 OPC I/O 서버를 사용하는 SCADA 어플리케이션

OPC I/O 서버 대신 LabVIEW DSC Module에 포함된 OPC UA 드라이버를 사용하는 유사한 아키텍처를 개발할 수도 있습니다. 그러나 OPC UA 드라이버는 로우레벨 드라이버이며 OPC I/O 서버만큼 사용이 쉽지 않습니다.

이 방식으로 어플리케이션을 개발하려면 슬레이브 장치와 통신하기 위해 NI OPC 서버에 유효한 설정을 반드시 먼저 생성해야 합니다. 설정을 생성하기 위해 채널(드라이버 설정을 정의)과 장치(드라이버에 대한 개별 엔드포인트를 정의)를 생성해야 합니다. 장치를 설정한 후 태그를 생성합니다.

그림 9. NI OPC 서버의 설정 샘플

NI OPC 서버를 설정한 후 태그와 통신하기 위해 OPC I/O 범위 바이너리 옵션 타입 범위 바이너리 옵션 타입 서버를 설정합니다. Modbus I/O 서버는 레지스터에 접근하기 위해 설정되지만, OPC I/O 서버는 OPC 서버에 있는 태그에 접근하기 위해 설정됩니다.

그림 10. OPC I/O 서버 설정하기

이같은 연결 과정을 통해 어플리케이션에서 사용할 수 있는 변수를 생성할 수 있습니다.

그림 11. OPC I/O 서버를 사용하는 간단한 어플리케이션

이 과정에 대한 자세한 설명은 OPC를 이용하여 LabVIEW와 PLC 연결 문서를 확인하십시오.

어플리케이션의 요구 충족

Modbus는 강력한 어플리케이션을 실행하기 위해 다양한 방식으로 사용할 수 있는 간단한 프로토콜입니다.

NI는 각 어플리케이션의 요구를 충족하기 위해 다양한 기능을 제공하는 세 가지의 Modbus 통신 옵션을 제공합니다. 첫째, 로우레벨 API는 프로토콜에 대한 정밀 컨트롤을 제공하며 고성능을 제공하지만 사용이 쉽지 않습니다. 로우레벨 API를 사용할 때 모든 작업이 수동으로 이루어집니다. 보다 간단한 모니터링 어플리케이션을 위한 Modbus I/O 서버는 Modbus 데이터에 접근하고 데이터를 처리하기 위한 보다 간단하고 편리한 API를 제공합니다. 그러나, 사용이 쉬운 대신 I/O 서버는 프로토콜에 대한 제어가 정밀하지 못합니다. 마지막 옵션으로 대형의 복잡한 시스템의 경우 전 기능을 갖춘 OPC 서버를 Data Aggregator로 사용할 수 있습니다. 이 때, LabVIEW OPC UA 드라이버 또는 OPC I/O 서버와 같은 툴을 사용하면, 어플리케이션이 데이터에 접근할 수 있도록 할 수 있습니다.


0 개 댓글

답장을 남겨주세요