범위 바이너리 옵션 타입

마지막 업데이트: 2022년 5월 2일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
숫자 데이터 타입의 정밀도(precision)는 그 값이 유지할 수 있는 유효한 자릿수로 정의된다. 이는 정확한 수치형이든 근사치 수치형이든 마찬가지이다. 스케일(scale)은 소수점 이하의 자릿수를 나타내는데, 정확한 수치형에서만 의미가 있다. 정확한 수치형으로 선언된 속성은 항상 고정된 정밀도와 스케일을 갖게 된다. NUMERIC (또는 DECIMAL) 데이터 타입은 항상 최소한 한 자리의 정밀도를 갖는다. 스케일의 범위는 0과 선언된 정밀도 사이여야 한다. 스케일이 정밀도보다 클 수는 없다. INTEGERSMALLINT, BIGINT 데이터 타입에서는 스케일은 0이고(즉, 소수점 이하가 없음), 정밀도는 시스템에 의해 고정된다.

범위 바이너리 옵션 타입

이 옵션을 바로 따르는 옵션들에 있는 텍스트를 FileMaker의 내부 문자 인코딩에서 지정된 인코딩으로 변환합니다. TextEncode 함수 함수의 encoding 매개 변수에 대해 정의된 이름 중 하나를 사용합니다.

모든 지원되는 옵션이 직접적인 접근을 허용하지 않거나 파일 시스템에서 파일 생성을 허용하지 않더라도 FileMaker 변수를 옵션이 필요한 데이터의 원본 또는 대상으로 지정할 수 있습니다. 파일을 생성하거나 접근하려면 컨테이너 필드에 변수를 설정할 수 있습니다.

• cURL 라이브러리에서 반환한 오류가 FileMaker 클라이언트에서 Get(마지막 오류) 함수 를 통해서 오류 코드 1631을 반환하도록 하여 지정되지 않은 연결이 실패하는 것을 나타내는 경우 Get(마지막 외부 오류 세부 정보) 함수 는 cURL 명령 행 도구가 반환하는 것과 동일한 텍스트를 반환합니다.

• 작업이 성공했지만 서버가 응답 코드 400 또는 그 이상을 데이터와 함께 반환하는 경우 FileMaker 클라이언트는 적절한 오류 코드를 반환합니다. 적절한 FileMaker 오류 코드가 없는 경우 Get(마지막 오류) 함수는 1631을 반환하고 Get(마지막 외부 오류 세부 정보) 함수는 응답 코드를 "응답 코드: nnn"의 형태로 반환합니다.

--show-error 옵션을 사용하지 않는 경우 서버 응답 코드 401은 Get(마지막 오류) 함수가 FileMaker 오류 코드 1627("인증에 실패했습니다")를 반환하도록 합니다. 모든 기타 응답 코드는 FileMaker 오류 코드 0("오류 없음")을 반환합니다.

HTTPS POST 데이터를 myusername 및 mypassword 인증서를 사용하여 두 개의 키 값 쌍( fname=Bob 및 lname=Smith )으로 www.filemaker.com에 보내고, $$results 변수에 요청된 데이터를 저장합니다.

변수 설정 [ $post_data ; 테이블::post_data ]
URL에서 삽입 [SSL 인증서 확인; 대화상자 사용: 끔 ; $$results ;
"http://www.filemaker.com/kr" ;
"--user myusername:mypassword -d @$post_data" ]

• cURL 옵션 내에서 각 따옴표와 백슬래시가 앞에 나옵니다. 예를 들어 Content-type: application/json 에 대해 HTTP 헤더를 지정하려면 cURL 옵션 지정 에 대한 텍스트 표현식은 다음과 같습니다.

데이터 타입¶

수치형 데이터 타입은 정확한(exact) 타입과 근사치(approximate) 타입으로 구분된다. 정확한 수치형 데이터 타입(SMALLINT, INT, BIGINT, NUMERIC)은 정확하고 일관된 값을 가져야 하는 경우에 사용된다. 근사치 수치형 데이터 타입(FLOAT, DOUBLE, MONETARY)은 리터럴 값이 같아도 시스템에 따라 다르게 해석될 수 있으므로 주의한다.

CUBRID는 수치형 데이터 타입에 대해 UNSIGNED 타입을 지원하지 않는다.

위의 표에서 두 가지 이름으로 표기한 타입들은 동일하지만, 테이블 생성 후 SHOW COLUMNS 문으로 타입의 이름을 확인할 때에는 항상 위 단어로 표기된다. 예를 들어, 테이블을 생성할 때에는 SHORT, SMALLINT 둘 다 쓸 수 있으며, SHOW COLUMNS 문으로 타입의 이름을 확인할 때에는 항상 SHORT 로 표기된다.

정밀도와 스케일(Precision and Scaling)

숫자 데이터 타입의 정밀도(precision)는 그 값이 유지할 수 있는 유효한 자릿수로 정의된다. 이는 정확한 수치형이든 근사치 수치형이든 마찬가지이다.

스케일(scale)은 소수점 이하의 자릿수를 나타내는데, 정확한 수치형에서만 의미가 있다. 정확한 수치형으로 선언된 속성은 항상 고정된 정밀도와 스케일을 갖게 된다. NUMERIC (또는 DECIMAL) 데이터 타입은 항상 최소한 한 자리의 정밀도를 갖는다. 스케일의 범위는 0과 선언된 정밀도 사이여야 한다. 스케일이 정밀도보다 클 수는 없다. INTEGERSMALLINT, BIGINT 데이터 타입에서는 스케일은 0이고(즉, 소수점 이하가 없음), 정밀도는 시스템에 의해 고정된다.

수치형 리터럴(Numeric Literals)

수치형 값을 입력하기 위해서는 특별한 기호가 사용될 수 있는데, 플러스(+)는 양수를, 마이너스(-)는 음수를 나타내는 데 사용한다. 과학용 표기법이 사용될 수도 있다. 화폐 값을 표현하기 위하여 시스템에 지정된 통화 기호를 사용할 수도 있다. 수치형 리터럴로 표현 가능한 최대 정밀도는 255이다.

수치형 변환(Numeric Coercions)

모든 수치형 데이터 타입은 상호 비교 가능하고, 이를 위해 서로 공통된 수치형 데이터 타입으로 자동 변환이 이루어진다. 명시적인 변환은 CAST 연산자를 이용해야 한다. 서로 다른 수치형 데이터가 서로 정렬되거나, 수식에서 계산될 때에는 시스템에 의하여 자동으로 변환된다. 예를 들어, FLOAT 타입의 속성 값과 INTEGER 타입의 속성 값을 더하게 되면, 시스템이 자동적으로 INTEGER 속성 값을 가장 근사한 FLOAT 값으로 변환한 후 덧셈을 수행한다.

Warning

CUBRID 2008 R2.0 미만 범위 바이너리 옵션 타입 버전에서는 입력된 상수가 INTEGER 범위를 넘어서면 NUMERIC으로 처리되었으나, CUBRID 2008 R2.0 이상 버전에서는 BIGINT로 처리된다.

INT, INTEGER¶

INTEGER 데이터 타입은 정수 표현을 위해 사용하며, 표현할 수 있는 값의 범위는 -2,147,483,648에서 +2,147,483,647이다. 작은 정수를 표현하기 위해 SMALLINT를 사용하거나, 큰 정수를 표현하기 위해 BIGINT를 사용할 수 있다.

SHORT, SMALLINT¶

SMALLINT 데이터 타입은 작은 정수 표현을 위해 사용되며, 표현할 수 있는 값의 범위는 -32,768에서 +32,767이다.

  • SMALLINTSHORT는 같은 의미로 사용된다.
  • SMALLINT 타입에 실수가 입력되면, 소수점 아래 숫자가 반올림되어 정수값이 저장된다.

BIGINT¶

BIGINT 데이터 타입은 큰 정수 표현을 위해 사용되며, 표현할 수 있는 값의 범위는 -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807이다.

  • BIGINT 타입에 실수가 입력되면, 소수점 아래 숫자가 반올림되어 정수값이 저장된다.
  • 정밀도와 표현할 수 있는 범위를 기준으로는 다음과 같이 정렬할 수 있다. SMALLINTINTEGERBIGINTNUMERIC

NUMERIC, DECIMAL¶

NUMERIC 또는 DECIMAL 데이터 타입은 고정 소수점 숫자를 표현하기 위해 사용되며, 다음과 같이 전체 자리 수(정밀도)와 소수점 아래 자릿수(스케일)을 옵션으로 지정하여 정의할 수 있다. 정밀도 p의 최소값은 1이고 최대값은 38이며, 정밀도 p가 생략되면 기본값은 15이므로, 정수부가 15자리를 초과하는 데이터를 입력할 수 없다. 또한, 스케일 s가 생략되면 스케일의 기본값은 0이므로 소수점 아래 첫째 자리에서 반올림한 정수를 반환한다.

  • 정밀도는 반드시 스케일 이상이어야 한다.
  • 정밀도는 (데이터의 정수부 자리 수 + 스케일) 이상이 되도록 지정한다.
  • NUMERICDECIMAL, 그리고 DEC는 같은 의미로 사용된다.
  • NUMERIC 타입끼리 연산한 결과 값의 정밀도와 스케일이 어떻게 달라지는지 확인하려면 수치형 데이터 타입의 산술 연산과 타입 변환 을 참고한다.

FLOAT, REAL¶

FLOAT (또는 REAL) 데이터 타입은 부동 소수점 숫자를 표현하기 위해 사용된다.

정규 값(normalized value)으로 표현할 수 있는 값의 범위는 -3.402823466E+38 에서 -1.175494351E-38, 0, 그리고 +1.175494351E-38 에서+3.402823466E+38이며, 이 범위를 벗어나서 0에 가까운 값은 비정규 값(denormalized value)으로 표현한다. 이는 ANSI/IEEE 754-1985 표준을 준수한다.

정밀도 p의 최소값은 1이고 최대값은 38이며, 정밀도 p가 생략되거나 7 이하로 지정되면 단일 정밀도(single-precision, 7자리의 유효 숫자)로 표현된다. 만약 정밀도 p가 7보다 크고 38 이하이면 이중 정밀도(double-precision, 15자리의 유효 숫자)로 표현되며, DOUBLE 데이터 타입으로 변환된다.

FLOAT 데이터 타입은 7자리의 유효 자릿수를 넘는 입력 값에 대해 근사치를 저장하는 타입이므로 유효 자릿수를 넘어서는 정확한 값을 저장하려면 사용하지 않도록 주의한다.

  • FLOAT 타입의 유효 자리 수는 7이다.
  • FLOAT 타입은 근사치 데이터를 저장하므로 데이터 비교 시 주의해야 한다.
  • FLOATREAL은 같은 의미로 사용된다.

DOUBLE, DOUBLE PRECISION¶

DOUBLE 데이터 타입은 부동 소수점 숫자를 표현하기 위해 사용된다.

정규 값(normalized value)으로 표현할 수 있는 값의 범위는 -1.7976931348623157E+308에서 -2.2250738585072014E-308, 0, 그리고 2.2250738585072014E-308에서 1.7976931348623157E+308이며, 이 범위를 벗어나서 0에 가까운 값은 비정규 값(denormalized value)으로 표현한다. 이는 ANSI/IEEE 754-1985 표준을 준수한다.

정밀도를 지정할 수 없으며, 이 타입이 지정된 데이터는 이중 정밀도(double-precision, 15자리의 유효 숫자)로 표현된다.

DOUBLE 데이터 타입은 15자리의 유효 자릿수를 넘는 입력 값에 대해 근사치를 저장하는 타입이므로 유효 자릿수를 넘어서는 정확한 값을 지정할 때에는 사용하지 않도록 주의한다.

  • DOUBLE의 유효 자리 수는 15자리이다.
  • DOUBLE 타입은 근사치 데이터를 저장하므로 데이터 비교 시 주의해야 한다.
  • DOUBLEDOUBLE PRECISION은 같은 의미로 사용된다.

MONETARY¶

MONETARY 데이터 타입은 근사치 숫자 타입이다. 시스템에 따라 다를 수 있지만, 표현할 수 있는 값의 범위는 범위 바이너리 옵션 타입 DOUBLE과 같으며, 소수점 이하 둘째 자리까지 표시된다. 또한, 1,000 단위마다 쉼표가 붙는다.

달러 기호나 소수점을 사용할 수도 있으나, 쉼표(,)는 사용할 수 없다.

날짜/시간 데이터 타입¶

날짜/시간 데이터 타입은 날짜, 시간 혹은 이 두 가지를 모두 표현할 때 사용하는 데이터 타입으로 다음과 같은 데이터 타입을 지원한다.

타입 bytes 최소값 최대값 비고
DATE 4 0001년 1월 1일 9999년 12월 31일 예외적으로 DATE '0000-00-00'을 입력할 수 있다.
TIME 4 00시 00분 00초 23시 59분 59초
TIMESTAMP 4 1970년 1월 1일 0시 0분 1초(GMT) 1970년 1월 1일 9시 0분 1초(KST) 2038년 1월 19일 3시 14분 7초(GMT) 2038년 1월 19일 12시 14분 7초(KST) 예외적으로 TIMESTAMP '0000-00-00 00:00:00'을 입력할 수 있다.
DATETIME 8 0001년 1월 1일 0시 0분 0.000초 9999년 12월 31일 23시 59분 59.999초 예외적으로 DATETIME '0000-00-00 00:00:00'을 입력할 수 있다.

범위와 해상도(Range and Resolution)

  • 시간 값의 표현은 기본적으로 24시간 시스템에 의하여 그 범위가 결정된다. 날짜는 그레고리력(Gregorian calendar)을 따른다. 이 두 제약 사항을 벗어나는 값이 날짜나 시간으로 입력되면 오류가 발생한다.
  • DATE 중 연도의 범위는 0001~9999 AD이다.
  • CUBRID 2008 R3.0 버전부터는 연도를 두 자리만 표기하면, 00~69는 2000~2069로 변환되고, 70~99는 1970~1999로 변환된다. R3.0 미만 버전에서는 01~99까지의 두 자리 연도를 표기하면, 각각 0001~0099로 변환된다.
  • TIMESTAMP 의 범위는 GMT로 1970년 1월 1일 0시 0분 1초부터 2038년 1월 19일 03시 14분 07초까지이다. KST (GMT+9)로는 1970년 1월 1일 9시 0분 1초부터 2038년 1월 19일 12시 14분 07초까지 저장할 수 있다. GMT로 timestamp'1970-01-01 00:00:00'은 timestamp'0000-00-00 00:00:00'와 같다.
  • 날짜, 시간, 타임스탬프와 관련된 연산은 시스템의 반올림 시스템에 따라 결과가 달라질 수 있다. 이러한 경우, 시간과 타임스탬프는 가장 근접한 초를 최소 해상도로, 날짜는 가장 근접한 날짜를 최소 해상도로 하여 결정된다.

변환(Coercion)

날짜/시간 데이터 타입의 값은 서로 똑같은 항목을 가지고 있는 경우에만 CAST 연산자를 이용한 명시적인 변환이 가능하며, 묵시적 변환은 묵시적 타입 변환 을 참고한다. 아래의 표는 명시적 변환이 가능한 타입을 설명한다. 날짜/시간 데이터 타입 간 산술 연산에 대한 내용은 날짜/시간 데이터 타입의 산술 연산과 타입 변환 을 참고한다.

명시적 변환

FROM \ TO DATE TIME DATETIME TIMESTAMP
DATE - X O O
TIME X - X X
DATETIME O O - O
TIMESTAMP O O O -

DATE, DATETIME, TIMESTAMP 타입의 연, 월, 일에는 0을 입력할 수 없으나, 예외적으로 날짜와 시간이 모두 0인 값은 허용한다. 해당 타입의 칼럼에 대한 질의 수행 시 인덱스가 있으면 이 값을 사용할 수 있다는 점에서 NULL 대신 사용하면 유용하다.

  • DATE, DATETIME, TIMESTAMP 타입이 인자인 일부 함수는 인자의 날짜와 시간 값이 모두 0이면 시스템 파라미터 return_null_on_function_errors 의 값에 따라 다른 값을 반환한다. return_null_on_function_errors 가 yes이면 NULL 을 반환하고 no이면 에러를 반환하며, 기본값은 no 이다.
  • DATE, DATETIME, TIMESTAMP 타입을 반환하는 함수들은 날짜와 시간 값이 모두 0인 값을 반환할 수 있지만 JAVA 응용 프로그램에서는 이러한 값을 Date 객체에 저장할 수 없다. 따라서 연결 URL 문자열의 zeroDateTimeBehavior 속성(Property) 설정에 따라서 예외로 처리하거나 NULL을 반환하거나 또는 최소값을 반환한다(이에 관한 자세한 내용은 연결 설정 참고).
  • 시스템 파라미터 intl_date_lang을 설정하면 TO_DATE() , TO_DATETIME() , TO_TIMESTAMP() 함수의 입력 문자열 형식이 해당 로캘의 날짜 형식을 따른다. 자세한 내용은 구문/타입 관련 파라미터 과 각 함수의 설명을 참고한다.

DATE 데이터 타입은 연도(yyyy), 월(mm), 일(dd)을 표현하며, 지원 범위는 '01/01/0001'에서 '12/31/9999'까지이다. 연도는 생략 가능하며, 생략될 경우 현재 시스템의 연도 값이 자동으로 지정된다. 입력 형식은 다음과 같다.

  • 모든 항목은 정수 형태로 입력되어야 한다.
  • CSQL은 'MM/DD/YYYY' 형식으로 날짜 값을 출력하고, JDBC 응용 프로그램 및 CUBRID 매니저는 'YYYY-MM-DD' 형식으로 날짜 값을 출력한다.
  • 문자열 타입의 데이터를 DATE 타입으로 변환하는 함수는 TO_DATE() 이다.
  • 연, 월, 일에는 0을 입력할 수 없으나 예외적으로 연, 월, 일이 모두 0인 '0000-00-00'은 입력할 수 있다.

TIME 데이터 타입은 시각(hh), 분(mi), 초(ss) 를 표현하며, 지원 범위는 ’00:00:00’에서 ’23:59:59’까지이다. 초는 생략 가능하며, 생략될 경우 0초로 지정된다. 입력 형식은 12시간 표기법(AM/PM표기법) 또는 24시간 표기법이 모두 허용되며, 다음과 같이 작성한다.

  • 모든 항목은 정수로 입력되어야 한다.
  • CSQL은 항상 AM/PM 표기법으로 시간 값을 출력하고, JDBC 응용 프로그램 및 CUBRID 매니저는 24시간 표기법으로 시간 값을 출력한다.
  • 24시간 표기법으로 시간 값을 입력할 때에도 AM/PM을 지정할 수 있으며, 이때 시간 값과 지정된 AM 또는 PM이 일치하지 않으면 오류가 발생한다.
  • 모든 시간 값은 데이터베이스에는 24시간 표기법으로 저장된다.
  • 문자열 타입의 데이터를 TIME 타입으로 변환하는 함수는 TO_TIME() 이다.

TIMESTAMP¶

TIMESTAMP 데이터 타입은 날짜(연, 월, 일)와 시간(시, 분, 초)을 결합한 데이터 값을 표현하며, GMT로 '1970-01-01 00:00:01'부터 '2038-01-19 03:14:07'까지 표현할 수 있다. 이 범위를 초과하거나 밀리초 단위의 시간 데이터를 저장하는 경우라면, DATETIME 데이터 타입을 이용할 수 있다. TIMESTAMP 데이터 타입의 입력 형식은 다음과 같다.

  • 모든 항목은 정수로 입력되어야 한다.
  • 연도를 생략하면 기본값으로 현재 연도가 지정되고, 시간 값(시/분/초)를 생략하면 12:00:00 AM으로 지정된다.
  • 시스템의 현재 타임스탬프 값은 SYS_TIMESTAMP (또는 SYSTIMESTAMP , CURRENT_TIMESTAMP ) 함수를 이용하여 TIMESTAMP 데이터 타입에 저장할 수 있다. 함수 또는 TO_TIMESTAMP() 함수를 사용하면, 문자열 데이터 타입의 데이터를 TIMESTAMP 데이터 타입으로 변환할 수 있다.
  • 연, 월, 일에는 0을 입력할 수 없으나 예외적으로 연, 월, 일, 시, 분, 초가 모두 0인 '0000-00-00 00:00:00'은 입력할 수 있다. GMT timestamp'1970-01-01 12:00:00 AM' 또는 KST timestamp'1970-01-01 09:00:00 AM'은 timestamp'0000-00-00 00:00:00'으로 해석된다.

DATETIME¶

DATETIME 타입은 날짜(년, 월, 일)와 시간(시, 분, 초, 밀리초)을 결합한 데이터 값을 표현하며, GMT로 0001-01-01 00:00:00.000부터 9999-12-31 23:59:59.999까지 표현할 수 있다. DATETIME 타입 데이터의 입력 형식은 다음과 같다.

  • 모든 항목은 정수로 입력되어야 한다.범위 바이너리 옵션 타입
  • 연도를 생략하면 기본값으로 현재 연도가 지정되고, 시간 값(시/분/초/밀리초)를 생략하면 12:00:00.000 AM으로 지정된다.
  • 시스템의 현재 타임스탬프 값은 SYS_DATETIME (또는 SYSDATETIME , CURRENT_DATETIME , CURRENT_DATETIME() , NOW() )를 이용하여 DATETIME 타입에 저장할 수 있다.
  • 문자열 타입의 데이터를 DATETIME 타입으로 변환하는 함수는 TO_DATETIME() 이다.
  • 연, 월, 일에는 0을 입력할 수 없으나 예외적으로 연, 월, 일, 시, 분, 초가 모두 0인 '0000-00-00 00:00:00'은 입력할 수 있다.

문자열을 날짜/시간 타입으로 CAST¶

날짜/시간 타입 문자열 권장 형식¶

CAST() 연산자를 사용하여 문자열을 날짜/시간 타입으로 변환할 때에는 문자열을 다음과 같은 형식으로 작성하는 것을 권장한다. 참고로, CAST() 연산자에서 사용하는 날짜/시간 문자열 형식은 로캘(CUBRID_CHARSET 환경 변수의 값으로 지정)의 영향을 받지 않는다.

DATE 타입

TIME 타입

DATETIME 타입

TIMESTAMP 타입

날짜/시간 타입 문자열 허용 형식¶

DATE 문자열 허용 형식

  • 2011-04-20 : 2011년 4월 20일
  • 04-20 : 올해 4월 20일
  • 04/20/2011 : 2011년 4월 20일
  • 04/20 : 올해 4월 20일
  • 20110420 : 2011년 4월 20일
  • 110420 : 2011년 4월 20일
  • 420 : 올해 4월 20일

TIME 문자열 허용 형식

  • 09:10:15.359 am : 오전 9시 10분 15초(0.359초는 버림)
  • 09:10:15 : 오전 9시 10분 15초
  • 09:10 : 오전 9시 10분
  • :10 : 오전 12시 10분
  • 20110420091015.359 am : 오전 9시 10분 15초
  • 0420091015 : 오전 9시 10분 15초
  • 091015.359 am : 오전 9시 10분 15초
  • 91015 : 오전 9시 10분 15초
  • 1015.359 am : 오전 12시 10분 15초
  • 1015 : 오전 12시 10분 15초
  • 15.359 am : 오전 12시 0분 15초
  • 15 : 오전 12시 0분 15초

Note

CUBRID 2008 R3.1 이하 버전에서는 [H]H 형식을 허용했다. 즉 R3.1 이하 버전에서 문자열 '10'은 TIME'10:00:00'으로 변환되었으나, R4.0부터는 TIME'00:00:10' 으로 변환된다.

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 서버와 같은 툴을 사용하면, 어플리케이션이 데이터에 접근할 수 있도록 할 수 있습니다.

HTTP range requests

HTTP 범위 요청은 HTTP의 일정 부분만 서버에서 범위 바이너리 옵션 타입 범위 바이너리 옵션 타입 클라이언트로 보내도록 허락하는 것입니다. 부분 요청은 예를들어 대형 미디어나 파일 다운로드 도중 일시정지와 다시 시작 기능에 유용합니다.

서버가 부분 요청을 지원하는지 확인

서버가 range 요청을 지원한다면, HTTP 응답에 Accept-Ranges 이 존재(그리고 그 값이 " none "이 아님)할 것입니다. 이는 예를들면 HEAD 를 cURL에서 요청함으로 확인할 수 있습니다.

이 응답에서, Accept-Ranges: bytes 는 바이트가 범위 요청에서 최소단위로 사용될 수 있음을 알려줍니다. 여기에서 Content-Length 헤더 역시 이미지를 얻기 위한 최대 크기를 알 수 있어 유용합니다.

만약 사이트에서 Accept-Ranges 헤더를 빠트린다면, 분할 요청을 지원하지 않는 것으로 생각됩니다. 일부 사이트는 명확하게 " none "을 값으로 보내 지원하지 않는 것을 알려줍니다. 일부 어플리케이션에서는 다운로드 매니저에서 일시정지 버튼을 없애버리는 경우가 있습니다.

서버에 특정 범위를 요청

만약 서버가 범위 요청을 지원한다면, Range 헤더를 사용하여 요청할 수 있습니다. 이는 서버에서 문서의 일부분만 돌려주면 된다는 것을 알 수 있게 해줍니다.

단일 부분 범위

우리는 리소스의 단일 부분에 대해서만 요청할 수 있습니다. 역시 cURL을 사용하여 테스트 합니다. " -H "는 HTTP요청의 헤더에 추가된다는 옵션이며, 이 경우에는 Range 헤더로 첫 1024 바이트를 요청합니다.

서버에서 206 Partial Content 상태로 응답합니다:

Content-Length 헤더는 이제 요청한 범위의 크기(전체 이미지의 크기가 아님)를 알려줍니다. Content-Range 헤더는 리소스의 전체 크기와 메시지가 어느 부분에 속하는지 알려줍니다.

다중 부분 범위

Range 헤더는 문서의 여러 부분 역시 다중 범위 요청을 통해 한번에 가져올 수 있습니다. 범위는 콤마로 나누어집니다.

서버는 206 Partial Content 상태로 응답하며 Content-Type : multipart/byteranges; boundary=3d6b6a416f9b5 는 다중 부분 바이트 범위를 알려줍니다. 각 부분은 고유의 Content-Type 과 Content-Range 영역을 가지고 있으며, 경계를 나누는 문자열인 경계 파라미터를 필요로 합니다.

분할 요청 응답

범위 요청을 처리할 때, 다음의 3가지 상태가 있습니다:

  • 성공적으로 보내질 경우에는, 206 Partial Content 상태가 서버에서 돌아옵니다.
  • 범위를 벗어난 경우(범위 값이 리소스 크기를 벗어났을 때), 서버는 416 Requested Range Not Satisfiable 상태로 답합니다.
  • 범위 범위 바이너리 옵션 타입 요청을 지원하지 않는 경우, 서버는 200 OK 상태를 돌려보냅니다.

Chunked Transfer-Encoding 과 비교

Transfer-Encoding 헤더는 chunked encoding 또한 지원하며, 이는 대용량 데이터를 클라이언트에 보낼 때와 요청이 모두 처리되기 전까지 총 크기를 알 수 없을 때 유용합니다. 서버는 데이터를 클라이언트에 응답 버퍼링 없이 즉시 보내거나, 정확한 길이를 측정하여 지연 시간을 향상시킵니다. 범위 요청과 청크는 호환되어 함께 사용할 수도 있고, 따로 사용할 수 있습니다.

둥이들일상 둥이들일상

단일 정밀도를 가진 부동 소수점을 나타낸다. 언제나 부호 있는 수이고, -3.402823466E+38부터 3.402823466E+38까지의 수를 표현할 수 있다.

※ mysql,에서의 float는 실수를 저장하는 데이타형입니다.

하지만 1.11이나 1.23은 잘들어가지는데 1.00이나 1.10 같은 마지막 0은 들어가지지 않습니다.

왜냐하면 자동으로 0은 절삭됩니다. 하지만 table생성시 float가 아닌 float(5,2)로 주면 소수점2자리까지만 입력이 되며 빈공간은 0으로 채워집니다.

앞에것은 잘 모르겠지만 뒤에꺼는 필수 소수점자리입니다. 빈공간은 0으로 자동으로 채워집니다.

2배 정밀도를 가진 부동 소수점 수이다. 언제나 부호있는 수이고, -1.79769313486231517E+308부터 1.7976931348623157E+308까지의

날짜를 표현하는 타입으로 '1000-01-01'부터 '9999-12-31'까지를 나타낼 수 있다. 3 바이트

날짜와 시간을 같이 나타내는 타입이다. '1000-01-01 00:00:00'부터 '9999-12-31 23:59:59'까지 나타낼 수 있다. 8 바이트

'1970-01-01 00:00:00'부터 2037년까지 나타낼 수 있다. 4 바이트

시간을 나타낸다. '-839:59:59'부터 '838:59:59'까지 나타낼 수 있다.

년도를 나타낸다. 1901년부터 2155년, 0000년을 나타낼 수 있다.

고정 길이를 갖는 문자열을 저장할 수 있다. M은 1부터255까지이다.M이 20이면 20개의

※ binary옵션을 붙일시 대소문자를 구분합니다.

CHAR는 고정길이인 반면 VARCHAR는 가변 길이이다. 예를 들어 VARCHAR(20)인 컬럼에

10자만 저장을 하면, 실제로도 10자 만큼을 기억장소를 차지한다. 하지만, CHAR는 나머지

10자를 공백으로 매꾼다.최대 255자까지 저장가능

※ binary옵션을 붙일시 대소문자를 구분합니다.

255개의 문자를 저장할 수 있다.

65,535개의 문자를 선택하여 대입할수있다. value에서 지정하지 않은 값은 에러는 안나나 공백으로 들어가진다.

※ binary옵션을 붙일시 대소문자를 구분합니다.

65,535개의 문자를 저장할 수 있다.

※ binary 옵션을 기재하면 검색시 소문자를 구분합니다.

※ TEXT데이타형은 default 예약어 사용 못함

MEDIUMTEXT (텍스트 파일)

16,777,215개의 문자를 저장할수 있다.

4,294,967,295개의 문자를 저장할수 있다.

65535개의 문자를 저장할 수 있다. BLOB은 BINARY LARGE OBJECT의 약자이다.

일반문자열이 아닌 멀티미디어파일(이미지,영상등)을 넣을때 사용하는 컬럼입니다.

ex : 많이 사용하지 않는다.

(TEXT : blob의 차이) blob : binary large object

0.text나 blob는 둘다 default를 사용못한다.

1.TEXT는 대소문자 안가린다. BLOB는 대소문자 가린다.

2.제한크기보다 작은 크기를 입력해도 둘다 공백이 제거되지 않고 공백도 다같이 저장된다. varchar개념이 아닌 char개념이다.


0 개 댓글

답장을 남겨주세요