May 4, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

MoonWalker Series Motor Controllers User’s Manual 14. Mini-C 스크립트 언어

MW001

MW001

MoonWalker Series

Motor Controllers

User’s Manual

MW-MDC24D100S / MW-MDC24D100D

MW-MDC24D200S / MW-MDC24D200D

MW-MDC24D500S / MW-MDC24D500D

 ※ 사용자 매뉴얼에 포함된 정보는 정확하고 신뢰성이 있는 내용입니다. 그러나 출판 당시 발견되지 않은 오류가 있을 수 있으니 사용자는 자신의 제품 검증을 수행하시기 바라며, 전적으로 사용자 매뉴얼에 포함된 정보에 의존하지 마시기 바랍니다.

 
14. Mini-C 스크립트 언어

Mini-C 스크립트 언어는 C언어에서와 유사하게 제어기의 프로그래밍을 하도록 하기 위한 C언어의 서브셋으로 설계된 언어입니다. C언어의 제어문과 수식 연산구조를 일부 따오면서 배열이나 함수포인트 등 복잡한 부분을 제거하여 스크립트 언어를 처음 접하는 사용자가 쉽게 배우고 사용할 수 있습니다. 만일 C언어를 알고 있는 사용자라면 “14.2 C언어와의 차이”만 살펴보더라도 바로 사용 가능합니다.
이 장은 스크립트의 기본 구성과 특징에 대하여 설명하고 사용자가 직접 프로그램을 작성할 수 있도록 연산자, 제어문, 내장 함수들에 대하여 예제와 함께 설명합니다.

14.1 스크립트 관련 구성

Mini-C 스크립트 언어를 이용하여 작성한 제어기 프로그램은 Mini-C 스크립트 컴파일러를 사용하여 바이트코드로 변환 되고, 이 바이트코드는 제어기로 다운로드 되어 가상머신에 의해 해석되어 실행됩니다.

Mini-C 스크립트 언어:
Mini-C 스크립트 언어는 C언어의 서브셋으로 제어기의 프로그래밍에 사용되는 언어입니다.

Mini-C 스크립트 컴파일러:
Mini-C 스크립트 언어로 작성된 프로그램을 제어기의 가상머신에서 수행 가능한 바이트코드로 컴파일 합니다. 컴파일러는 Motor Control UI 유틸리티에 내장되어 있습니다.

바이트코드(Bytecode):
바이트코드는 제어기의 가상머신에서 실행될 수 있도록 정의된 중간코드입니다. 스크립트 언어로 작성된 프로그램은 바이트코드로 해석된 다음 제어기에 다운로드 되고 실행됩니다. 이러한 두 단계 구조는 바이트코드에 실행 시 필요한 정보만 담게 되어 스크립트 코드를 직접적으로 인터프리팅 하는 시스템에 비해 수행 성능을 높일 수 있습니다.

가상머신(Virtual Machine):
가상머신은 모터제어기의 마이크로컨트롤러에 포팅되어 있습니다. 가상머신은 바이트코드로 컴파일 된 프로그램을 해석하여 실행합니다.

 

14.2 C언어와의 차이

Mini-C 스크립트 언어는 C언어의 문법을 참조하여 설계되었습니다. 스크립트 언어는 C언어에서 다음과 같은 것들을 제공하지 않는 서브셋 언어 입니다:

·  #define, #ifdef, #if 등의 전처리 문
·  함수의 정의와 선언 (main 함수 포함)
·  return 키워드
·  int, float, long 등 자료형 키워드
·  문자열 상수 (Ex: “abc”, “ABC”)와 문자 상수 (Ex: ‘a’, ‘A’)
·  배열 연산자([]), 포인터 연산자(*), 주소 참조 연산자(&), 멤버 연산자(., ->)
·  sizeof 연산자
·  ? : 연산자
·  캐스트 연산자 (Ex: (int), (float) )
·  typedef, struct, union, enum 등 자료구조 관련 키워드
·  switch, case 분기문 키워드

변수의 선언에 자료형은 사용되지 않으며, 변수는 정수형이나 실수형으로 초기화 하면서 선언됩니다. 다음 변수 선언 예를 참조하기 바랍니다:

·  a=123 – 정수형 변수 a를 선언하면서 값 할당
·  b=4.567 – 실수형 변수 b를 선언하면서 값 할당

C언어에서 사용되는 다음 분기문과 반복문을 사용 가능합니다:

·  if, else  – 조건에 따라 정해진 영역의 프로그램을 실행
·  goto, label  – 특정 프로그램 코드 위치로 무조건 점프
·  for  – 특정 조건이 완료 될 때까지 특정 영역을 반복 실행
·  while  – 특정 조건이 만족할 동안 특정 영역을 반복 실행
·  do, while  – 먼저 특정 영역을 실행하고 조건이 맞으면 이를 반복
·  break  – 현재 실행하고 있는 반복문 블록을 빠져 나옴
·  continue  – 현재 실행하고 있는 반복문 블록의 초기로 이동

 C언어에서 사용되는 다음 수학 연산자는 사용 가능합니다:

·  산술 연산자: +, -, *, /, %, ++, –
·  관계 연산자: ==, !=, >, <, >=, <=
·  논리 연산자: !, &&, ||
·  비트 연산자: ~, &, |, ^, <<, >>
·  대입 연산자: =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

Mini-C 스크립트 언어에서 사용하는 키워드는 다음과 같습니다:

·  if, else, do, for, while, goto, break, continue

Mini-C 스크립트 언어에서는 다음 상수
가 정의되어 있습니다:

· _E, _PI, _EULER, _status, _s, _fault, _f

 

14.3 문장

스크립트로 작성된 프로그램은 문장(Statement)들로 구성됩니다. 문장은 프로그램을 실행하기 위한 기본적인 실행 단위라고 볼 수 있습니다. 다음 그림 14‑1은 스크립트 프로그램의 구조를 보여주고 있습니다.

Cap 2014-02-25 16-00-30-656
그림 14‑1 스크립트 프로그램의 구조

 

14.3.1 수식과 문장

프로그램을 이루는 가장 기본적인 것은 수식입니다. 연산자는 “a = 10″, “a < b”, “a + b”, “a << 4″ 등과 같이 하나의 연산을 행하는 가장 단순한 것입니다. 그리고 단순한 수식이 여러 개가 모여 “a+b*10″, “(a>b) && (b>c)” 등과 같이 복잡한 수식을 이루게 됩니다. 이러한 수식은 하나 또는 그 이상이 모여 하나의 문장을 구성합니다.
스크립트 언어에서는 ‘;’로 문장을 구분합니다. 이렇게 ‘;’로 구분된 각각의 문장을 단일문이라고 합니다. 다음 예제를 참고하십시오.

a = 5; 10*a + 3;

14.3.2 복합문

여러 개의 문장들을 ‘{‘와 ‘}’를 이용하여 하나의 실행단위로 묶어 줄 수 있는데, 이를 블록 또는 복합문(Compound Statement)이라 하고 이 복합문을 하나의 문장으로 다시 고려할 수 있습니다. 다음과 같이 사용하면 복합문이 됩니다.

{
a = 5;
b = 10*a + 3;
}

14.3.3 제어문

스크립트 언어에서는 일정한 형식을 가지고 프로그램의 흐름을 제어하는 문장들도 있습니다. 예를 들자면, 조건을 판단하여 분기하는 if-else 문장 같은 것입니다. 제어문에 대해서는 “14.8 제어문”에서 상세하게 설명합니다.

 

14.4 주석

스크립트 언어에서 주석문(Comment)은 ‘/*’ 와 ‘*/’사이 또는 ‘//’뒤에 기술하며, 컴파일 대상에서 제외됩니다. 주석문은 주로 프로그램의 이해를 증진시키기 위해 사용합니다. 스크립트 프로그램 내에 주석문을 나타내기 위해, C언어에서 사용하는 것과 동일한 두 가지 방법을 제공합니다.

14.4.1 블록 주석문

블록 주석은 ‘/*’과 ‘*/’로 둘러 싸인 주석문을 말합니다. 이러한 블록 주석문은 한 라인 또는 두 라인 이상을 주석으로 처리할 수 있으며 다음과 같이 사용할 수 있습니다.

/*

블록 주석 내용1
블록 주석 내용2

*/

14.4.2 라인 주석문

라인 주석은 ‘//’를 사용하여 나타내며, ‘//’가 한 라인의 어디에 나와도 상관없고, ‘//’이 나온 후부터 그 라인의 끝까지 주석으로 처리하게 됩니다. 라인 주석문은 다음과 같이 사용할 수 있습니다.

// 라인 주석 내용1
// 라인 주석 내용2

 

14.5 상수

상수는 한번 값이 결정되면 프로그램이 실행되는 동안 새로운 값으로 변경할 수 없는 정보를 말합니다. 스크립트 언어에서 사용되는 상수(리터럴 혹은 리터럴 상수)는 정수형과 실수형(부동 소수; floating point), 미리 정의된 상수로 구분됩니다.
스크립트 언어는 부울형(TRUE, FALSE)이나 문자 상수(‘A’, ‘a’), 문자열 상수(“abc”, “DEF”)를 지원하지 않습니다.

14.5.1 정수형 상수

정수형 상수는 스크립트 언어에서 사용되는 가장 기본적인 형태의 상수입니다. 메모리에 저장될 때는 32bit 크기를 가지며 범위는 -231 과 231-1 사이가 됩니다.
다음과 같이 사용되면 정수형 상수로 인식됩니다.

10, -10, 999                        // 10진수로 표현된 정수형 상수
05, 011, -077                   // 8진수로 표현된 정수형 상수
0×11, -0×11, 0xFF         // 16진수로 표현된 정수형 상수

상기 예에서와 같이 정수형 상수는 8진수, 10진수, 그리고 16진수 등 세가지 진법으로 표현할 수 있습니다:

·  8진수 : ’0′으로 시작하는 정수형 상수, ’0′ 다음에는 ’0′에서 ’7′까지의 8진수 숫자들이 옴
·  10진수: 일반적으로 사용하는 정수형 상수, ’0′에서 ’9′까지의 10진수 숫자들로 표현
·  16진수: ’0x’ 또는 ’0X’로 시작하는 정수형 상수, ’0x’ 또는 ’0X’ 다음에는 ’0′에서 ’9′와 ‘A’ 또는 ‘a’에서 ‘F’ 또는 ‘f’ 등 16진수 숫자들이 옴

10진수는 양수, 0, 음수가 있습니다. 스크립트에서 10진수를 사용할 때 0으로 시작해서는 안됩니다. 예를 들면 01234라고 쓰면 이것은 10진수가 아닙니다. 10진수는 0을 제외한 나머지 숫자로 시작하고 그 뒤로는 0부터 9까지의 숫자가 올 수 있습니다. 0으로 시작되는 숫자는 스크립트에서는 8진수나 16진수를 의미합니다.

14.5.2 실수형 상수

실수형 상수는 부동소수 값을 표현할 수 있습니다. 메모리에 저장될 때는 IEEE 754 표준에 따라 64bit 크기를 가지며 범위는 음수일 때 -1.79769313486231E+308 과 -4.9406564584124E-308 사이고 양수일 때 4.9406564584124E-308 과 1.79769313486231E+308 사이가 됩니다.
다음과 같이 사용되면 실수형 상수가 됩니다.

1.234, -1.234, 123.                // 고정 소수점으로 표기된 실수형 상수
1.234e3, 1.234e-3               // 부동 소수점으로 표기된 실수형 상수

상기 예에서와 같이 실수형 상수의 가장 간단한 표기법으로는 소수점을 기준으로 왼쪽에 정수부 오른쪽에 소수부를 적는 고정 소수점 표기법을 사용하는 것입니다. 예로 숫자 5를 쓸 때, 5라고 쓰면 정수형 상수가 됩니다. 실수형 상수임을 나타내려면 5.0이라고 쓰거나 0을 생략하고 5.라고 써야 합니다.

또 다른 표기법으로 e를 기준으로 왼쪽에 가수 오른쪽에 지수를 적는 부동 소수점 표기법이 있습니다. 숫자 중간에 나오는 e(또는 E)는 부동 소수의 지수부분을 의미합니다. 실수는 내부적으로 모두 부동 소수점 방식으로 기억되지만 상수를 표현할 때는 고정 소수점과 부동 소수점 표기법을 모두 사용할 수 있습니다.

14.5.3 미리 정의된 상수

다음은 스크립트 언어에서 미리 정의된 수학 상수입니다. 수학 상수는 프로그램이 컴파일 될 때, 실수형 상수로 바뀌게 됩니다.

표 14‑1 정의된 수학 상수

상수 설명
_E 2.7182818284590452354 자연상수
_PI 3.14159265358979323846 원주율
_EULER 0.57721566490153286061 오일러-마스케로니 상수

수학 상수는 다음과 같이 사용할 수 있습니다.

a = sin(_PI/2); // a는 1을 가짐
b = cos(_PI/2); // b는 0을 가짐

또한 사용자가 제어기의 오브젝트를 참조하는 오브젝트 Index를 프로그램 작성시 쉽게 사용할 수 있도록 오브젝트 이름에 대한 상수를 정의하고 있습니다. 이 상수는 오브젝트의 Long Name과 Short Name 앞에 밑줄 문자 ‘_’를 추가하여 정의됩니다.

표 14‑2 스크립트에서 사용 가능한 상수

Long Name, Short Name

Index

Description

_vendor_id, _vid

1

제품 공급자 ID

_product_id, _pid

2

제품 ID

_software_version, _swv

3

제어기 펌웨어 버전

_hardware_version, _hwv

4

제어기 하드웨어 버전

_system_status, _sst

5

제어기의 운용 상태

_system_command, _sco

7

제어기에 내려지는 명령

_battery_voltage, _bv

8

전원 소스로부터 제어기에 공급되는 전압 (단위: V)

_battery_current, _bc

9

전원 소스로부터 제어기를 통해 흐르는 전류 (단위: A)

_device_id, _id

11

장치 ID

_can_br, _cb

12

CAN 통신 속도

_serial_bps, _sb

13

USB/RS-232의 통신 속도

_serial_watchdog, _sw

14

CAN, USB, RS-232 포트로 수신되는 명령어 패킷에 대한 와치독 타이머 타임아웃 값 (단위: ms)

_startup_script_run, _ssr

16

제어기 시작 시 스크립트의 실행 여부

_control_mixing, _cm

21

두 모터에 내려지는 속도/전압 명령의 믹싱 모드

_center_safety, _cs

22

모터에 내려지는 속도/전류/전압 명령의 Center Safety

_min_max_safety, _ms

23

모터에 내려지는 속도/전류/전압 명령의 MinMax Safety

_pwm_switching, _ps

31

PWM 스위칭 방법

_pwm_frequency, _pf

32

PWM 주파수

_user_value, _uv

56

사용자가 읽고 쓰는 변수들, 플래시 메모리에 저장됨

_temp_value, _tv

57

사용자가 읽고 쓰는 변수들, RAM에만 저장됨

_num_di, _ndi

60

디지털 입력 채널의 수

_di_enable, _die

61

각 비트별 해당 디지털 입력 채널의 사용 여부

_di_invert, _dii

62

각 비트별 해당 디지털 입력 채널의 반전 여부

_di_all_values, _di

63

디지털 입력을 하나의 32bit 값으로 모음

_num_do, _ndo

65

디지털 출력 채널의 수

_do_enable, _doe

66

각 비트별 해당 디지털 출력 채널의 활성화 여부

_do_invert, _doi

67

각 비트별 해당 디지털 출력 채널의 반전 여부

_do_all_values, _do

68

디지털 출력을 하나의 32bit 값으로 모음

_num_ai, _nai

70

아날로그 입력 채널의 수

_ai_enable, _aie

71

각 비트별 해당 아날로그 입력 채널의 활성화 여부

_ai_invert, _aii

72

각 비트별 해당 아날로그 입력 채널의 극성 반전 여부

_num_pi, _npi

75

펄스 입력 채널의 수

_pi_enable, _pie

76

각 비트별 해당 펄스 입력 채널의 활성화 여부

_pi_invert, _pii

77

각 비트별 해당 펄스 입력 채널의 극성 반전 여부

_num_motors, _nm

80

제어기에 연결 가능한 모터의 수

_wheel_radius, _wr

86

이동로봇의 바퀴 반지름 (단위: m)

_axle_length, _al

87

이동로봇 좌우 바퀴간 거리 (단위: m)

_gear_ratio, _gr

88

모터와 바퀴간 감속비율 (모터 회전수/바퀴 회전수)

_m_position, _mp

91

모터 채널 1,2의 엔코더 값을 읽음 (단위: pulse, pulse)

_m_position_command, _mpc

92

모터 채널 1,2의 위치구동 명령을 내리고(단위: pulse, pulse) 엔코더 값을 읽음(단위: pulse, pulse)

_m_velocity_command, _mvc

93

모터 채널 1,2의 속도 구동 명령을 내리고(단위: RPM, RPM) 엔코더 값을 읽음(단위: pulse, pulse)

_m_current_command, _mcc

94

모터 채널 1,2의 전류 구동 명령을 내리고(단위: A, A) 전류 값을 읽음 (단위: A, A)

_m_voltage_command, _mvtc

95

모터 채널 1,2의 전압 구동 명령을 내리고(단위: V, V) 엔코더 값을 읽음(단위: pulse, pulse)

_m_lav_command, _mla

96

전진속도와 각속도로 이동로봇의 구동 명령을 내리고(단위: m/s, rad/s) 모터 1,2의 엔코더 값을 읽음(단위: pulse, pulse)

_status, _s

102

모터제어기의 현재 상태

_fault, _f

103

모터제어기 및 관련 I/O에서 발생한 폴트

_command, _co

101

모터제어기에 내려지는 명령 코드

_position_command, _pc

111

모터의 폐루프 위치 제어 명령 (단위: pulse)

_velocity_command, _vc

112

모터의 폐루프 속도 제어 명령 (단위: RPM)

_current_command, _cc

113

모터의 폐루프 전류 제어 명령 (단위: A)

_voltage_command, _vtc

114

모터에 인가되는 전압 출력 (단위: V)

_temperature, _tp

121

FET와 방열판의 온도 (단위: °C)

_voltage, _vt

122

모터에 가해지는 전압 (단위: V)

_current, _c

123

모터에 흐르는 전류 (단위: A)

_velocity, _v

124

모터의 회전속도 (단위: RPM)

_position, _p

125

모터의 회전위치 (단위: pulse)

_hall_count, _h

126

BLDC 모터의 홀 센서 카운트 값 (단위: pulse)

_ai_potentiometer, _pt

131

아날로그 입력 포트에 매핑된 위치 센서의 피드백 값

_ai_tachometer, _ta

132

아날로그 입력 포트에 매핑된 속도 센서의 피드백 값

_min_position, _np

141

모터가 이동 가능한 최소 위치 (단위: pulse)

_max_position, _xp

142

모터가 이동 가능한 최대 위치 (단위: pulse)

_home_position, _hp

143

홈센서 감지 시 position에 로드 되는 위치 값 설정 (단위: pulse)

_encoder_ppr, _ep

144

모터 1회전당 엔코더 펄스 수 (단위: pulse/rev)

_num_pole_pairs, _npp

145

BLDC 모터에서 홀센서의 폴페어 수 (단위: pulse/rev)

_use_soft_limit, _usl

146

소프트 리미트 스위치 사용 여부

_max_current, _xc

151

모터에 흐르는 최대 연속 전류 (단위: A)

_max_voltage, _xvt

152

모터에 가해지는 최대 전압 (단위: V)

_max_velocity, _xv

153

모터의 최대 회전 속도 (단위: RPM)

_acceleration, _ac

154

모터의 회전 가속도 (단위: RPM/s)

_deceleration, _dc

155

모터의 회전 감속도 (단위: RPM/s)

_overheat_limit, _ohl

161

FET와 방열판의 과열 한계 (단위: °C)

_overcurrent_limit, _ocl

162

모터의 과전류 한계 (단위: A)

_overcurrent_delay, _ocd

163

과전류 허용 지연 시간 (단위: ms)

_peakcurrent_ratio, _pcr

164

모터의 순간 피크 전류 (단위: %)

_overvoltage_limit, _ovl

165

전원단의 과전압 한계 (단위: V)

_undervoltage_limit, _uvl

166

전원단의 저전압 한계 (단위: V)

_stall_detection, _sd

167

모터의 구동 명령에 대해 움직이지 않는 상황 감지

_vel_error_detection, _ved

168

폐루프 속도제어기에서 명령과 피드백 사이의 오차에 의한 이상 감지

_pos_error_detection, _ped

169

폐루프 위치제어기에서 명령과 피드백 사이의 오차에 의한 이상 감지

_feedback_sensor, _fs

171

제어기 피드벡 센서 선택

_profile_mode, _pm

172

속도 명령에 사다리꼴 프로파일 적용여부

_startup_power_on, _spo

173

제어기가 시작될 때 모터 Power ON/OFF 설정

_direction, _dir

174

모터의 정방향/역방향 회전 설정

_brake_on_delay, _bod

175

브레이크 작동 시 지연시간 설정 (단위: ms)

_high_voltage, _hv

176

제동저항(Brake Resistor)을 켜는 전압 설정 (단위: V)

_high_temperature, _ht

177

냉각 팬을 켜는 온도 설정

_cc_kp, _cp

181

PI 전류제어기의 비례제어 이득

_cc_ki, _ci

182

PI 전류제어기의 적분제어 이득

_cc_kff, _cff

185

PI 전류제어기의 모터 회전속도 전향 보상 이득

_vc_kp, _vp

186

PI 속도제어기의 비례제어 이득

_vc_ki, _vi

187

PI 속도제어기의 적분제어 이득

_vc_ks, _vs

190

속도 레퍼런스에 대한 스케일 펙터

_pc_kp, _pp

191

PID 위치제어기의 비례제어 이득

_pc_ki, _pi

192

PID 위치제어기의 적분제어 이득

_pc_kd, _pd

193

PID 위치제어기의 미분제어 이득

_di_value, _div

201

디지털 입력 채널의 값

_di_function, _dif

202

디지털 입력 채널을 특정 모터의 동작으로 매핑

_do_value, _dov

211

디지털 출력 채널의 값 (0 or 1)

_do_function, _dof

212

디지털 출력 채널을 특정 모터의 상태로 매핑

_ai_value, _aiv

221

아날로그 입력 채널의 원시 값

_ai_converted_value, _aicv

222

변환 과정을 거쳐 정규화된 값

_ai_linearity, _ail

223

지수/로그 변환 형식 지정

_ai_function, _aif

224

아날로그 입력을 특정 모터의 명령이나 피드백과 매핑

_ai_input_min, _ain

225

캘리브레이션: 입력 최소값

_ai_input_center, _aic

226

캘리브레이션: 입력 중앙값

_ai_input_max, _aix

227

캘리브레이션: 입력 최대값

_ai_input_deadband, _aidb

228

캘리브레이션: 입력의 데드밴드 값

_pi_value, _piv

231

펄스 입력 채널의 원시 값

_pi_converted_value, _picv

232

변환 과정을 거쳐 정규화 된 값

_pi_capture_type, _pit

233

펄스 캡쳐의 종류

_pi_linearity, _pil

234

지수/로그 변환 형식 지정

_pi_function, _pif

235

펄스 입력을 특정 모터의 명령이나 피드백과 매핑

_pi_input_min, _pin

236

캘리브레이션: 입력 최소값

_pi_input_center, _pic

237

캘리브레이션: 입력 중앙값

_pi_input_max, _pix

238

캘리브레이션: 입력 최대값

_pi_input_deadband, _pidb

239

캘리브레이션: 입력의 데드밴드 값

_script_size, _ss

250

바이트코드를 다운로드하기 전에 크기 전송 (단위: byte)

_script_code, _sc

251

바이트코드를 4-byte씩 묶어서 차례로 전송

_script_variable, _sv

252

스크립트가 실행되는 동안 사용되는 변수

오브젝트이름 상수는 다음과 같이 사용할 수 있습니다.

v = getv (_temp_value, 1)/1000;
w = getv (_temp_value, 2)/1000;

setv (_velocity_command, 1, v+w);

setv (_velocity_command, 2, v-w);

 

14.6 변수

변수는 프로그램이 실행되는 동안 처리되는 데이터를 임시 저장하는 메모리 공간입니다. 변수는 프로그램이 시작될 때 모두 0으로 초기화 됩니다.

14.6.1 변수명

변수명을 만들 때 사용 가능한 문자는 대문자, 소문자, 숫자, 밑줄문자(‘_’)입니다. 이 중 숫자는 변수명의 처음 문자로 올 수 없습니다. 변수명은 다음과 같은 규칙에 의해 사용자가 정합니다:

·  영문자(‘a’~'z’, ‘A’~'Z’), 숫자(’0′~’9′), 밑줄문자 ‘_’로 구성되며, 첫 글자는 반드시 영문자 또는 밑줄문자 ‘_’가 되어야 함
·  대문자와 소문자는 서로 다른 문자로 인식함
·  예약어(for, while, do, …)와 미리 정의된 상수(_PI, _E, _status, _s, …)는 변수명으로 사용할 수 없음

변수 명은 다음과 다음과 같이 만들 수 있습니다.

abc, abc123, _123, ABC, ABCdef

14.6.2 변수의 선언과 초기화

변수의 선언에 자료형은 사용되지 않으며, 변수에 상수가 대입될 때와 같이 정수형이나 실수형으로 초기화 되면서 자료형이 결정됩니다. 변수는 자료형을 결정하는 내부 파라미터를 가지며, 변수의 사용처에 따라 혹은 변수에 저장되는 값의 자료형에 따라 변수의 자료형이 결정됩니다.

변수를 선언할 때 초기화 하지 않으면 컴파일러는 변수를 사용하는 것으로 인식합니다. 그래서 선언되지 않은 변수가 사용되었다는 에러를 발생합니다. 다음 예제를 참고하십시오.

a = 123; // 변수 a는 정수형 변수가 됨
b = 1.23; // 변수 b는 실수형 변수가 됨
c; // c는 에러 발생, 변수가 선언될 때는 항상 초기화 되어야 함

변수의 범위는 프로그램 전체에 연장되어있습니다. 변수는 한 번 이상 프로그램에서 선언 할 수 없습니다.

14.6.3 자료형 변환

스크립트에서 사용되는 값들에 대해 필요에 따라 서로 형변환이 가능하도록 합니다. 스크립트에서는 내부적으로 형변환은 자동으로 수행하는 묵시적 형변환(Implicit conversion)을 사용합니다.

Cap 2014-02-25 16-17-38-406
그림 14‑2 스크립트에서의 자료 형변환

C언어에서는 데이터의 손실이 없이 안정적으로 형변환이 가능할 경우에만 내부적으로 자동으로 묵시적 형변환을 수행하고, 데이터의 손실을 야기하는 소지가 있는 경우에는 자동으로 형변환하는 것을 방지합니다. 하지만 스크립트에서는 언어를 간단히 하기 위해 실수형에서 정수형으로의 변환도 묵시적으로 이루어집니다. 실수형에서 정수형으로의 형변환 될 때는 실수형 숫자에 가장 가까운 정수형 숫자를 선택하여 변환 됩니다.

다음 예는 실수에서 정수로 묵시적 형변환이 발생하는 경우입니다. 나머지 연산자(%)는 피연산자로 정수형을 취하기 때문에, 수식 내의 실수형 리터럴은 정수형으로 묵시적 형변환되어 연산됩니다.

a = 10 % 3; // 결과는 1
b = 10.33 % 3; // 10%3과 동일

실수에서 정수로 명시적 형변환이 필요한 경우에는 내장함수 int()를 사용할 수 있습니다. 다음 예를 참고하십시오.

a = int(1.44); // a는 1
b = int(1.55); // b는 2

 

14.7 연산자

연산자는 피연산자와의 조합으로 수식을 만들어냅니다. 스크립트 언어에서는 C언어에서 지원하는 모든 수학 연산자를 사용할 수 있습니다.

14.7.1 산술, 부호 연산자

스크립트 언어에서는 산술 연산을 표현할 수 있도록 산술 연산자를 제공합니다. 더하기는 ‘+’, 빼기는 ‘-’, 곱하기는 ‘*’, 나누기는 ‘/’, 나머지 연산은 ‘%’ 기호를 사용하여 각각의 연산을 표현합니다. ‘%’ 연산자의 피연산자로 실수형을 취할 수 없는데, 이때는 실수형을 정수형으로 묵시적 형변환 한 후 연산이 수행됩니다.
수식에 대한 부호를 나타내기 위해 ‘+’ 및 ‘-’ 등과 같은 부호 연산자를 사용합니다. 부호 연산자는 피연산자를 하나만 취하는 단항 연산자이고, 산술연산자는 두 개의 피연산자를 취하는 이항 연산자입니다.

산술 연산자와 부호 연산자에 대해 정리하면, 다음과 같습니다.

분류

연산자

연산식

예제

설명

연산식

결과

이항 연산자

+

a + b

7 + 5

13

ab를 더하기

-

a – b

7 – 5

2

a에서 b를 빼기

*

a * b

7 * 5

35

ab를 곱하기

/

a / b

7 / 5

1

ab로 나누기

%

a % b

7 % 5

2

ab로 나눈 나머지

단항 연산자

+

+a

+7

7

a가 양의 수임을 나타냄

-

-a

-7

-7

a의 부호를 바꿈

 

14.7.2 증감 연산자

증감 연산자는 변수의 값을 1씩 증가 또는 감소시킨 후, 변화된 값을 다시 그 변수에 저장하는 연산자이고, 하나의 피연산자를 취하는 단항 연산자입니다. 증가 연산자는 1씩 증가시키고, 감소 연산자는 1씩 감소시킨다는 것 외에 동일합니다.
이러한 증감 연산자는 사용되는 위치에 따라 전위형과 후위형 두 가지로 나눌 수 있습니다. 전위형으로 나타내면 변수의 값에 대해 먼저 증감 연산을 수행한 후, 변화된 변수의 값을 참조하여 그 변수가 포함된 연산식에 적용됩니다. 후위형으로 나타내면 변수의 값을 참조하여 연산식에 먼저 적용을 한 후, 변수의 값에 대해 증감 연산을 수행합니다.

증감 연산자에 대해 정리하면 다음과 같습니다.

분류

연산자

연산식

예제

설명

단항
연산자

++

a++

num++

a값을 참조 후 1증가

++a

++num

a값을 1증가 후 참조

a–

num–

a값을 참조 후 1감소

–a

–num

a값을 1감소 후 참조

증감 연산자의 사용시 다음 사항에 주의해야 합니다. 한 변수가 수식 내에 두 번 이상 사용될 경우 증감 연산자를 사용하지 않는 것이 바람직합니다. 물론, 값의 변화를 모두 정확히 추정하여 미리 계산하고 나서 사용한다면 상관 없겠지만, 그렇지 않은 경우에는 사용자의 의도와는 다른 결과를 야기할 수 있으므로 조심해야 합니다.

14.7.3 관계 연산자

관계 연산자는 관계를 따져보기 위한 연산자입니다. 이러한 관계 연산자는 두 개의 피연산자를 필요로 합니다. 두 개의 피연산자에 대해 관계 연산자가 의미하는 관계를 따져보고, 그 결과는 0 또는 1 값을 가집니다. 따라서 이러한 관계 연산자로 표현된 조건식을 ‘boolean-식’이라 할 수 있습니다.
스크립트 언어에서 다음과 같은 관계 연산자들을 제공합니다.

연산자

연산식

예제

설명

연산식

결과

>

a > b

3 > 7

0

ab보다 크면 참

>=

a >= b

3 >= 7

0

ab보다 크거나 같으면 참

<

a < b

3 < 7

1

ab보다 작으면 참

<=

a <= b

3 <= 7

1

ab보다 작거나 같으면 참

==

a == b

3 == 7

0

ab가 같으면 참

!=

a != b

3 != 7

1

ab가 다르면 참

 

14.7.4 논리 연산자

논리 연산자는 논리값에 대한 논리적인 연산을 수행하도록 해 주는 연산자를 말하고, 이러한 논리 연산자를 사용하는 식을 논리식이라 합니다. 논리 연산자는 TRUE(1) 또는 FALSE(0)와 같은 논리값을 사용하여 논리 연산을 수행하고, 그 결과 역시 마찬가지로 TRUE 또는 FALSE의 논리값이 됩니다. 이러한 논리식 역시 조건식과 마찬가지로 boolean-식이라 할 수 있습니다.
스크립트 언어에서 사용 가능한 논리 연산들은 다음과 같습니다.

연산자

연산식

예제

설명

연산식

결과

!

!a

!1

0

a가 거짓(false; 0)이면 참(true; 1)

&&

a && b

0&&1

0

a와 b가 모두 참이면 참

||

a || b

1||0

1

a가나 b 둘 중 하나라도 참이면 참

논리합 연산자(‘&&’)에서 a가거짓이면 b를 평가하지 않습니다. 그리고 논리곱 연산자(‘||’)에서 a가 참이면 b를 평가하지 않습니다.

 

14.7.5 비트 연산자

비트 연산자는 비트 단위의 연산을 수행합니다. 피연산자로 실수형을 제외한 정수형 데이터를 취합니다. 이러한 비트 연산자에는 1의 보수 연산, AND, OR, XOR 등과 같은 비트 연산과 왼쪽/오른쪽 비트 이동을 위한 연산자가 있습니다:

·  1의 보수 연산자(‘~’)는 각 비트에 대해 0은 1로 1은 0으로 바꿈
·  AND 연산자(‘&’)는 주로 데이터의 특정 비트를 0으로 만들기(mask off) 위해 사용되고, 두 개의 피연산자에 대해 대응하는 두 비트 중 하나라도 0이면 결과도 0이 됨
·  OR 연산자(‘|’)는 주로 어떤 데이터의 특정 비트를 1로 만들기(mask on) 위해서 사용하며, 이때 두 개의 피연산자에 대해 대응하는 두 비트 중 어느 하나라도 1이면 결과 비트는 1이 됨
·  XOR 연산자(‘^’)는 두 개의 피연산자에 대해 대응하는 두 비트가 서로 다르면 결과 비트가 1이 됨
·  쉬프트 연산자(‘<<’, ‘>>’)는 주어진 자릿수 만큼 왼쪽 또는 오른쪽으로 비트열을 쉬프트 함

이러한 비트 연산자를 정리하면 다음과 같습니다.

연산자

연산식

예제

설명

연산식

결과

>>

a>>b

10001100 >> 1

11000110

a를 b만큼우측으로 비트 이동

<<

a<<b

10110000 << 1

01100000

a를 b만큼좌측으로 비트 이동

&

a&b

11000110 & 00001111

00000110

a와 b의 비트 단위의 논리곱

|

a|b

11000110 | 00001111

11001111

a와 b의 비트 단위의 논리합

^

a^b

10111011 ^ 10101000

00010011

a와 b의 비트단위의 XOR
(배타적 논리합)

~

~a

~10110110

01001001

a에 대하여 비트 단위의 보수

‘<<’ 연산자를 쓸 경우 쉬프트 연산의 결과로 오른쪽에 생긴 빈자리 부분은 0으로 채웁니다.

‘>>’ 연산자를 사용하여 쉬프트 연산을 수행한 후 왼쪽에 생긴 빈자리에는 MSB 즉, 최상위 비트인 부호비트가 복사됩니다.

 

14.7.6 대입 연산자

대입연산자는 우변에 있는 수식의 값을 좌변이 가리키고 있는 메모리의 위치에 저장(대입)하기 위해 사용하는 연산자입니다. 이때, 좌변에 오는 것을 좌변값(l-value)이라고 하는데, 좌변값에 올 수 있는 것으로는 변수와 같이 메모리에 저장 공간을 가지는 것들만 가능합니다. 스크립트 언어에서의 ‘=’은 수학에서의 “같음”의 의미가 아닌 “대입“의 의미를 가집니다.

대입을 허용하는 경우와 그렇지 않은 경우에 대해 다음 예제를 참고하시기 바랍니다.

·  a + 1 = b; // 허용하지 않음, 컴파일시 에러 발생
·  2 = b; // 허용하지 않음, 컴파일시 에러 발생
·  a = 100; // 100을 변수 a에 대입
·  b = a + 20; // 변수 a에 20을 더하여 변수 b에 대입
·  a = b = c = 100; // 100을 a, b, c에 대입

스크립트 언어에서 사용 가능한 대입식과 단축 대입식은 다음과 같습니다.

연산자

연산식

예제

설명

=

a = b

n = 1;

일반 대입식

+=

a += b

n = n + 1; à n += 1;

a = a + b

-=

a -= b

n = n – 1; à n -= 1;

a = a – b

*=

a *= b

n = n * 1; à n *= 1;

a = a * b

/=

a /= b

n = n / 1; à n /= 1;

a = a / b

%=

a %= b

n = n % 1; à n %= 1;

a = a % b

&=

a &= b

n = n & 1; à n &= 1;

a = a & b

|=

a |= b

n = n | 1; à n |= 1;

a = a | b

^=

a ^= b

n = n ^ 1; à n ^= 1;

a = a ^ b

<<=

a <<= b

n = n << 1; à n <<= 1;

a = a << b

>>=

a >>= b

n = n >> 1; à n >>= 1;

a = a >> b

 

14.7.7 연산자 우선순위

연산자 우선순위는 서로 다른 연산자들 사이의 수행 순서를 결정합니다. 예를 들자면, “a+b*c”와 같은 수식에서 ‘*’ 연산을 ‘+’ 연산보다 먼저 수행하는 것입니다.
연산자 결합성은 같은 우선 순위의 연산자가 두 개 이상 연속적으로 나올 경우, 이들 간의 우선 순위를 결정합니다.

예를 들자면, “a+b+c”와 같이 ‘+’ 연산자와 ‘+’ 연산자가 순서대로 두 개 이상 나올 경우 왼쪽에 있는 “a+b” 연산을 “b+c” 연산보다 먼저 수행합니다.
다음 표는 스크립트 언어에서 사용하는 연산자들에 대해 연산자 우선순위와 연산자 결합성을 보여주고 있습니다.

우선순위

연산자

결합법칙

기본연산자

[ ] . ( ) ++ —

ß

전치

+ – ++ — ~ !

à

승제

* / %

à

가감

+ –

à

비트 이동

<< >>

à

관계

< <= > >=

à

등식

== !=

à

비트 AND

&

à

비트 XOR

^

à

비트 OR

|

à

논리곱

&&

à

논리합

||

à

대입

= *= /= %= += -= <<= >>= >>>= &= ^= |=

ß

스크립트에서 정의하고 있는 연산자 우선순위와 연산자 결합성은 C언어에서 정의하고 있는 것과 동일하며, 스크립트에서는 포인터를 사용하지 않으므로 C언어에서 포인터 연산을 위해 사용하는 구조체 포인터의 항목 참조 연산자(->), 주소 연산자(&), 간접연산자(*) 등은 제공되지 않습니다.

 

14.8 제어문

스크립트 프로그램은 나열된 문장을 순차적으로 실행합니다. 이렇게 순차적으로만 수행하는 것은 작업이 매우 단순할 때지만, 특정 작업을 반복적으로 수행해야 할 경우에는 매우 비효율적인 프로그래밍이 됩니다. 그래서 좀더 효과적인 문장 표현을 위해 다음과 같이 세 가지 형태의 제어문을 제공합니다.
첫 번째, 조건문은 특정 조건에 대해 그 조건이 만족하면 해당 문장 또는 블록을 실행합니다. 스크립트 언어에서는 조건문으로 if문, if-else문을 제공합니다.
두 번째, 반복문은 어떤 문장 또는 블록을 반복 실행할 수 있도록 합니다. 스크립트 언어에서 사용 가능한 반복문은 while문, for문, do-while문 세 가지입니다.
세 번째, 분기문은 문장을 순서대로 실행해 나가다가 프로그램의 실행흐름을 특정 위치로 옮기고자 할 때 사용합니다. 이를 위해 스크립트에서는 break 문, continue 문, goto 문을 제공합니다.

14.8.1 if 문
if문은 가장 간단한 형태의 조건문으로 조건식이 만족할 경우에만 다음 문장을 실행하고자 할 때 사용합니다. 조건식이 참이면 if문 다음의 문장을 실행하고, 거짓이면 if문 다음의 문장을 실행하지 않고 지나갑니다.

If

if (조건식) 문장 또는 블록

다음은 입력이 90 이상일 때 해당 문장이 실행되도록 하는 예입니다.

if (input >= 90) {

}

14.8.2 if-else 문
if-else 문은 조건식이 참 혹은 거짓에 따라 문장을 양자택일할 경우 사용합니다. 조건식이 참이면 if문 다음의 문장만을 실행하고, 거짓이면 else문 다음의 문장만을 실행합니다. 여기서 else 문은 if문에 종속적입니다. if문 없이 else 만 독립적으로 사용될 수는 없습니다.

If-else 문
if (조건식) 문장 또는 블록
else 문장 또는 블록

다음은 홀수와 짝수를 구분하여 동작을 결정하는 예입니다.

if ((n % 2) == 0) {

} else {

}

스크립트 언어에서는 if 문과 else 문을 짝짓기 위한 규칙이 있습니다. 가장 가까운 if와 else를 순서대로 짝지어 주는 것입니다. 이러한 혼동을 피하기 위하여 ‘{‘와 ‘}’를 이용하여 if-else 문을 올바르게 묶어 주어야 합니다.

If-else 문
if (조건식) {
if (조건식) 문장 또는 블록
else 문장 또는 블록
}

 

14.8.3 if-else-if-else 문

다중택일을 위해서 if-else 문을 연결하여 if-else-if-else 과 같이 사용합니다.

If-else-if-else 문

if (조건식) 문장 또는 블록
else if (조건식) 문장 또는 블록
else if (조건식) 문장 또는 블록
……
else 문장 또는 블록

다음은 입력이 90 이상이면 A기능 실행, 80에서 89 사이이면 B기능 실행, 70에서 79 사이이면 C기능 실행, 60에서 69 사이이면 D기능 실행, 나머지는 E기능 실행하는 예입니다.

if(input >= 90) {
// A statement
} else if((input >= 80)&&(input < 90)) {
// B statement
} else if((input >= 70)&&(input < 80)) {
// C statement
} else if((input >= 60)&&(input < 70)) {
// D statement
} else {
// E statement
}

 

14.8.4 while 문
while 문은 조건식이 참일 동안 문장 또는 블록을 반복적으로 실행하게 되고, 반복 실행 중에 조건식이 거짓으로 바뀌게 되면 반복 실행을 중단합니다.

while

 while (조건식) 문장 또는 블록

다음은 1에서 100까지 더하는 연산을 while문으로 작성한 예입니다.

i = 1;
sum = 0;
while (i <= 100) {

sum += i;
i++;

}

 

14.8.5 for 문

반복문을 실행할 때, 다음과 같이 세 단계로 나누어 실행을 해야 할 경우에는 for 문을 사용하는 것이 유리합니다: 1)처음 시작할 때 하는 초기화 과정, 2)반복 여부를 검사하기 위한 조건식 검사, 3)반복할 때마다 실행할 문장 또는 블록.
for 문은 위에 나타난 세 가지 과정을 하나의 문장으로 표현 가능하도록 함으로, 반복 실행을 위한 문장을 작성하는데 드는 노력을 줄여줍니다.

for

for (초기화수식; 조건식; 증감수식) 문장 또는 블록

for 문의 초기화 수식에는 반복 실행을 하는데 필요한 초기화 문장들을 나열합니다. 이때 각 문장들은 ‘,’로 구분합니다. 이 초기화수식은 필요에 따라 생략 가능합니다.

조건식은 문장 또는 블록의 반복 여부를 판단합니다. 이 조건식이 만족할 동안 문장 또는 블록이 반복 실행됩니다. 조건식은 생략될 수 없습니다.

증감 수식에는 주로 증감 연산식이 사용됩니다.

다음은 1에서 100까지 더하는 연산을 for문으로 작성한 예입니다.

sum = 0;
for (i=1; i <= 100; i++) {
sum += i;
}

 

14.8.6 do-while 문

do-while 문은 조건식이 참일 동안 문장 또는 블록을 실행합니다. while 문에서는 반복 실행의 앞부분에서 조건식을 검사했지만, do-while 문에서는 문장 또는 블록을 실행한 후 조건식을 검사합니다. 그래서 조건식이 처음부터 거짓일 경우 연결된 문장 또는 블록을 아예 실행하지 않게 됩니다. 그러나 do-while 문은 문장 또는 블록을 먼저 실행 한 후 조건식을 검사하기 때문에 적어도 한번은 do-while 문에 연결된 문장 또는 블록을 실행을 하게 됩니다.

do-while

do {
문장 또는 블록
} while (
조건식);

다음은 1에서 100까지 더하는 연산을 do-while문으로 작성한 예입니다.

i = 1;

sum = 0;
do {
sum += i;
i++;

} while (i <= 100);

 

14.8.7 break 문

break 문은 항상 for, while, do-while 문과 같이 쓰이며, 현재 실행중인 위치에서 break 문을 만나게 되면 프로그램의 실행이 반복문의 밖으로 빠져나가게 됩니다. break문을 for, while, do-while 문과 상관 없이 사용하면 에러가 발생합니다.

break

while (i<10) {

break;

}

다음은 1에서 100까지 더하는 연산을 while문과 break문으로 작성한 예입니다.

i = 1;
sum = 0;
while (1) {

if (i <= 100) sum += i;
else break;
i++;

}

 

14.8.8 continue 문

continue 문도 break 문처럼 항상 for, while, do-while 문과 같이 쓰이며, 현재 실행중인 위치에서 continue 문을 만나게 되면 프로그램의 실행이 반복문의 다음 시작 위치로 이동하게 됩니다. continue 문이 break 문과 다른 점은 제어흐름이 반복문의 밖으로 이동하는 것이 아니라 반복문의 시작 위치로 이동하는 것입니다.

continue

while (i<10) {


continue;

}

다음은 1에서 100까지 더하는 연산을 do-while문과 continue문으로 작성한 예입니다.

i = 1;
sum = 0;
do {

sum += i;
i++;
if (i <= 100) continue;

} while (0);

 

14.8.9 goto 문

현재 실행중인 위치에서 특정 위치로 이동하기 위하여 goto 문을 사용합니다. 스크립트에서 레이블을 지정하는 방법은 “레이블이름:”과 같이 합니다. 그리고 하나의 프로그램 내에서 사용된 레이블은 각각 구분 가능해야 합니다.

goto

레이블: 

goto 레이블;

다음은 1에서 100까지 더하는 연산을 goto문으로 작성한 예입니다.

i = 1;
sum = 0;

loop:
sum += i;
i++;
if (i <= 100) goto loop;

 

14.9 내장 함수

내장 함수는 스크립트 언어로 프로그램을 작성할 때 호출 가능한 미리 정의된 함수들입니다.

스크립트 언어에서는 다음과 같은 내장 함수들을 제공합니다:

·  clock() – 현재 시간을 밀리초 단위로 반환
·  rand() – 0과 32767 사이의 의사-난수를 반환
·  sleep(x) – x 밀리초 동안 스크립트의 실행을 대기
·  getv(index,sub_index) – index와 sub_index로 지정된 오브젝트의 값을 읽어옴
·  setv(index,sub_index,x) – index와 sub_index로 지정된 오브젝트에 값을 기록함
·  getrv(device_id, index,sub_index) – device_id로 지정된 제어기에서 index와 sub_index로 지정된 오브젝트의 값을 읽어옴
·  setrv(device_id, index,sub_index,x) – device_id로 지정된 제어기에서 index와 sub_index로 지정된 오브젝트의 값을 기록함
·  int(x) – x를 소숫점 첫째 자리에서 반올림하여 정수를 반환
·  sin(x) – 라디안으로 주어진 x의 sine 값을 반환
·  cos(x) – 라디안으로 주어진 x의 cosine 값을 반환
·  tan(x) – 라디안으로 주어진 x의 tangent 값을 반환
·  asin(x) – x(sine x의 결과 값)의 arc sine의 값을 반환
·  acos(x) – x(cosine x의 결과 값)의 arc cosine의 값을 반환
·  atan(x) – x(tangent x 의 결과 값)의 arc tangent의 값을 반환
·  sinh(x) – 수학적으로 exp(x) – exp(-x)/2 로 정의된, x의 쌍곡선 sine을 반환
·  cosh(x) – 수학적으로 exp(x)-exp(-x)/2 로 정의된, x의 쌍곡선 cosine을 반환
·  tanh(x) – sinh(x)/cosh(x)이라는 수학적 정의를 가진, x 의 쌍곡선 tangent x를 반환
·  fabs(x) – x의 절대값을 반환
·  floor(x) – x보다 작거나 같은 정수 중에서 최대 값을 반환
·  ceil(x) – x보다 크거나 같은 정수 중에서 최소 값을 반환
·  sqrt(x) – x의 음이 아닌 루트 값을 반환
·  exp(x) – 자연대수 e의 x 승 값을 반환
·  log(x) – x의 자연로그를 반환
·  log10(x) – 10을 밑으로 하는 x의 로그 값을 반환
·  atan2(x,y) – 두 개의 인수를 가진 arc tangent 함수
·  pow(x,y) – x의 y승을 반환하는 일반적 지수 함수
·  min(x,y) – 주어진 두 인자의 최소값을 반환
·  max(x,y) – 주어진 두 인자의 최대값을 반환

 

14.9.1 clock

Declaration: clock()
제어기의 현재 시각을 밀리초 단위로 읽어 옵니다. 시각은 제어기가 시작된 후 밀리초 단위로 카운트 되는 시각입니다.

Examples:
// 코드 블록의 실행시간 측정
t1 = clock ();
{ … }
t2 = clock ();
dt = t2 – t1;

 

14.9.2 rand

Declaration: rand()

0과 32767 사이의 의사-난수를 반환합니다.
Remarks: 제어기가 시작된 후 매번 난수를 다르게 발생시키기 위하여 시드(seed) 값을 설정합니다. 시드 값은 제어기의 특정 아날로그 입력 포트의 값을 읽어 지정하게 됩니다.

Examples:
// 0에서 99 사이의 난수 발생
a = rand()%100;

 

14.9.3 sleep

Declaration: sleep(x)
스크립트 프로그램의 실행을 x 밀리초 동안 대기합니다.
Remarks: 스크립트 프로그램의 실행이 sleep() 함수에 의해 중단된 상황에서도 제어기의 다른 모든 기능은 정상적으로 수행됩니다.

Examples:
// 채널 1번 모터에 1초 마다 전압 +5V와 -5V을 교대로 가합니다.
while (1) {
setv (_voltage_command, 1, 5);
sleep (1000);
setv (_voltage_command, 1, -5);
sleep (1000);
}

14.9.4 getv

Declaration: getv (index, sub_index)
인수 index와 sub_index로 지정된 제어기의 오브젝트 값을 읽어옵니다. getv() 함수로 제어기의 모든 오브젝트 값을 읽을 수 있습니다.

index는 제어기 오브젝트명의 참조 값이고 sub_index는 I/O나 모터의 채널 번호입니다. index는 USB/RS-232 통신에서 사용하는 Short Name과 Long Name으로 대체할 수 있으며, 스크립트에서 사용하기 위해서는 Short Name과 Long Name 앞에 언더스코어 문자(‘_’)를 붙여야 합니다.

Remarks: 유효하지 않은 index와 sub_index에 대해 읽기를 시도하는 경우, getv() 함수는 아무런 경고 없이 0을 돌려줍니다. 읽은 값이 0일 때, 실제 오브젝트의 값이 0인지 혹은 유효하지 않은 오브젝트를 엑세스 하였는지 알 수 없기 때문에 사용자는 getv() 함수로 넘기는 index와 sub_index가 유효한지 미리 판단하여야 합니다.
사용 가능한 index와 Short Name, Long Name에 대해서는 “14.5.3 미리 정의된 상수”를 참조하기 바랍니다.

Examples:
// 모터 채널 1의 전압 명령 값을 읽어옴, 다음 3개의 함수는 동일한 기능을 수행함
a = getv (114, 1);
b = getv (_vtc, 1);
c = getv (_voltage_command, 1);

 

14.9.5 setv

Declaration: setv (index, sub_index, x)
인수 index와 sub_index로 지정된 제어기의 오브젝트에 x를 씁니다. setv() 함수로 제어기의 모든 오브젝트에 값을 변경할 수 있습니다. 변경된 값은 제어기에 즉시 적용됩니다. 하지만 변경된 값이 제어기의 플래시 메모리에 저장되지는 않습니다.
index와 sub_index에 대한 설명은 getv() 함수의 설명을 참조하십시오.
Remarks: setv() 함수는 오브젝트에 쓰는 값 x가 유효한지 검사하지 않습니다. 사용자는 오브젝트의 값을 변경할 때 주의하여야 합니다.

Examples:
// 모터 채널 1에 전압 명령 5를 내림, 다음 3개의 함수는 동일한 기능을 수행함
setv (114, 1, 5);
setv (_vtc, 1, 5);
setv (_voltage_command, 1, 5);

 

14.9.6 getrv
Declaration: getrv (device_id, index, sub_index)
인수 device_id로 지정된 원격 제어기에서 index와 sub_index로 지정된 오브젝트 값을 읽어옵니다. getrv() 함수로 원격 제어기의 모든 오브젝트 값을 읽어올 수 있습니다.
device_id는 엑세스 하고자 하는 원격 제어기의 장치 ID 입니다.
index와 sub_index에 대한 설명은 getv() 함수의 설명을 참조하십시오.
Remarks: 그림 14‑3의 스크립트에서 사용된 getrv()와 setrv() 함수는 원격 제어기의 오브젝트를 엑세스 하는데 사용됩니다.

 Cap 2014-02-25 16-51-16-781
그림 14‑3 스크립트에서 원격 제어기의 오브젝트 엑세스

스크립트를 실행하는 제어기는 마스터(상기 그림에서 Device ID: 1)가 되고 오브젝트의 값을 제공하는 제어기는 슬레이브(상기 그림에서 Device ID: 2)가 됩니다. 마스터와 슬레이브 제어기는 동일한 CAN bus에 연결되어 있어야 하며, 동일한 CAN 통신 속도를 사용하지만 장치 ID는 서로 달라야 합니다. 마스터와 슬레이브 제어기를 USB나 RS-232로 연결하였을 경우, getrv()/setrv() 함수는 제대로 동작하지 않습니다.

Examples:
// 장치ID 2번 제어기의 모터 채널 1의 전압 명령 값을 읽어옴
a = getrv (2, 114, 1);
b = getrv (2, _vtc, 1);
c = getrv (2, _voltage_command, 1);

 

14.9.7 setrv
Declaration: setrv (device_id, index, sub_index, x)
인수 device_id로 지정된 원격 제어기에서 index와 sub_index로 지정된 오브젝트에 x를 변경합니다. setrv() 함수로 원격 제어기의 모든 오브젝트에 값을 변경할 수 있습니다. 변경된 값은 원격 제어기에 즉시 적용됩니다. 하지만 변경된 값이 원격 제어기의 Flash Memory에 저장되지는 않습니다.
device_id에 대한 설명은 getrv() 함수의 설명을 참조하십시오.
index와 sub_index에 대한 설명은 getv() 함수의 설명을 참조하십시오.
Remarks: setrv() 함수는 원격 제어기의 오브젝트에 기록되는 값 x가 유효한지 검사하지 않습니다. 사용자는 오브젝트의 값을 변경할 때 주의하여야 합니다.

Examples:
// 장치ID 2번 제어기의 모터 채널 1에 전압 명령 5를 내림
setrv (2, 114, 1, 5);
setrv (2, _vtc, 1, 5);
setrv (2, _voltage_command, 1, 5);

 

14.9.8 int
Declaration: int(x)
주어진 실수에서 가장 가까운 정수를 반환합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 정수입니다.

Examples:
a = int(1.4); // a는 1
b = int(1.6); // b는 2

 

14.9.9 sin
Declaration: sin(x)
라디안 각 x의 sine 값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 -1과 1 사이의 값입니다.

Examples:
// 정현파 전압을 가해 모터를 구동
for (i=0; i<100000000; i++) {

v = 5*sin(i*0.01);
setv (_voltage_command, 1, v);
sleep (10);

}

 

14.9.10 cos

Declaration: cos(x)
라디안 각 x의 cosine 값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 -1과 1 사이의 값입니다.

 

14.9.11 tan

Declaration: tan(x)
라디안 각 x 의 tangent 값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

 

14.9.12 asin

Declaration: asin(x)
x의 arc sine 값을 계산합니다. sin() 함수의 역함수입니다.
인수 x의 값은 -1과 1 사이의 값입니다.
반환 값은 -π/2와 π/2사이의 라디안 각입니다.

 

14.9.13 acos
Declaration: acos(x)
x의 arc cosine 값을 계산합니다. 이 함수는 cos() 함수의 역함수입니다.
인수 x의 값은 -1과 1 사이의 값입니다.
반환 값은 0과 π사이의 라디안 각입니다.

 

14.9.14 atan
Declaration: atan(x)
x의 arc tangent 값을 계산합니다. 이 함수는 tan() 함수의 역함수입니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 -π/2와 π/2사이의 라디안 각입니다.

 

14.9.15 sinh
Declaration: sinh(x)
x의 쌍곡선 sine을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

 

14.9.16 cosh
Declaration: cosh(x)
x의 쌍곡선 cosine을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

 

14.9.17 tanh
Declaration: tanh(x)
x 의 쌍곡선 tangent를 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

 

14.9.18 fabs
Declaration: fabs(x)
x의 절대값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 항상 양수입니다.

Examples:
a = fabs(5.5); // a는 5.5
b = fabs(-5.5); // b는 5.5

 

14.9.19 floor

Declaration: floor(x)
x보다 작거나 같은 정수 중에서 최대 값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 정수입니다.

Examples:
a = floor(5.5); // a는 5
b = floor(-5.5); // b는 -6

 

14.9.20 ceil
Declaration: ceil(x)
x보다 크거나 같은 정수 중에서 최소 값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 정수입니다.

Examples:
a = ceil(5.5); // a는 6
b = ceil(-5.5); // b는 -5

 

14.9.21 sqrt
Declaration: sqrt(x)
x의 음이 아닌 루트의 값을 계산합니다.
인수 x의 값은 음수가 될 수 없습니다.
반환 값은 항상 양수입니다.

Examples:
a = sqrt(4); // a는 2

 

14.9.22 exp
Declaration:exp(x)
자연상수 e의 x 승 값을 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

Examples:
a = exp(2); // a는 7.389…
b = pow(_E, 2); // b는 7.389…

 

14.9.23 log
Declaration: log(x)
x 의 자연로그를 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

Examples:
a = log(_E); // a는 1
b = log(_E*_E); // b는 2

 

14.9.24 log10
Declaration: log10(x)
10을 밑으로 하는 x의 로그를 계산합니다.
인수 x에는 모든 값을 사용할 수 있습니다.
반환 값은 모든 값이 될 수 있습니다.

Examples:
a = log10(10); // a는 1
b = log10(1000); // b는 3

 

14.9.25 atan2
Declaration: atan2 (y, x)
두 개의 인수 y, x로 arc tangent를 계산합니다. y/x에 대한 arc tangent 연산을 수행하고, y와 x의 부호로 4분원(quadrant)을 결정합니다.
인수 y, x는 0이 될 수 없습니다.
반환 값은 -π와 π사이의 라디안 각입니다.

Examples:
a = atan ( 1/ 1); // 1/4*PI
b = atan (-1/ 1); // -1/4*PI
c = atan ( 1/ -1); // -1/4*PI
d = atan (-1/ -1); // 1/4*PI
e = atan2( 1, 1); // 1/4*PI
f = atan2(-1, 1); // -1/4*PI
g = atan2( 1, -1); // 3/4*PI
h = atan2(-1, -1); // -3/4*PI

 

14.9.26 pow
Declaration: pow (x, y)
x의 y승을 계산합니다.
만일 인수 y가 분수 값이면 인수 x는 음수가 될 수 없습니다. 그리고 y가 0보다 작거나 같으면 x는 0이 될 수 없습니다.

Examples:
a = pow( 2, 1.5); // 2.828…
b = pow(-2, 1.5); // 계산 불가
c = pow(1.5, 2); // 2.25
d = pow(1.5, -2); // 0.444…

 

14.9.27 min
Declaration: min (x, y)
주어진 두 인수 x, y의 최소값을 선택합니다.
인수 x, y에는 모든 값을 사용할 수 있습니다.

 

14.9.28 max
Declaration: max (x, y)
주어진 두 인수 x, y의 최대값을 선택합니다.
인수 x, y에는 모든 값을 사용할 수 있습니다.

 

 

 

MoonWalker Series Motor Controllers User’s Manual 13. 통신 프로토콜

MW001

MW001

MoonWalker Series

Motor Controllers

User’s Manual

MW-MDC24D100S / MW-MDC24D100D

MW-MDC24D200S / MW-MDC24D200D

MW-MDC24D500S / MW-MDC24D500D

 ※ 사용자 매뉴얼에 포함된 정보는 정확하고 신뢰성이 있는 내용입니다. 그러나 출판 당시 발견되지 않은 오류가 있을 수 있으니 사용자는 자신의 제품 검증을 수행하시기 바라며, 전적으로 사용자 매뉴얼에 포함된 정보에 의존하지 마시기 바랍니다.

 

13. 통신 프로토콜

이 장에서는 PC나 마이크로컨트롤러에서 제어기의 오브젝트 값을 읽고 쓰기 위한 통신 프로토콜에 대해 설명합니다. 제어기에 동작을 명령하거나 제어기의 구성 파라미터를 설정하는 것은 해당 오브젝트에 특정 값을 쓰는 것을 의미하며, 제어기의 상태를 읽거나 제어기의 구성 파라미터를 읽는 것은 해당 오브젝트에서 특정 값을 읽는 것을 의미합니다.
통신 프로토콜은 크게 CAN 포트에서 사용되는 프로토콜과 시리얼(USB, RS-232) 포트에서 사용되는 프로토콜로 구분됩니다. 시리얼 포트 프로토콜은 다시 패킷의 구조에 따라 바이너리(binary) 형태와 텍스트(text) 형태로 구분됩니다.

13.1 용어의 정의

제어기의 객체를 통신 프로토콜로 읽고 쓰는데 사용되는 용어를 표 13‑1에서 정의합니다.

표 13‑1 통신 프로토콜에 사용되는 용어

Term Description
Index 오브젝트의 참조 색인
Sub-index 오브젝트의 참조 부-색인
Short Name Index와 호환되는 오브젝트의 짧은 이름
Long Name Index와 호환되는 오브젝트의 긴 이름

상기 표에서 사용되는 용어 중 Index, Short Name, Long Name은 오브젝트를 표현하는 방식의 차이입니다. Index는 제어기 내부의 오브젝트를 참조하는 색인으로, CAN 및 시리얼 바이너리 패킷에서 사용됩니다.

Sub-index는 오브젝트를 참조하는 부-색인으로, 통상 모터의 채널 번호를 의미합니다. 채널 1에 연결된 모터에 대한 명령이나 설정이라면 Sub-index로 1을, 채널 2에 연결된 모터의 경우는 2를 사용하면 됩니다. 연결된 모터가 아니라 제어기 자체에 대한 것이라면 통상 Sub-index는 0이 됩니다. Sub-index는 상황에 따라 외부 I/O의 채널 번호가 되기도 합니다.

Short Name과 Long Name은 Index와 호환되는 오브젝트의 짧은 이름과 긴 이름으로, 시리얼 텍스트 패킷에서 사용됩니다. 이 이름은 제어기 내부에서 Index 값으로 변환되어 Index와 동일하게 사용됩니다.

만약 사용자가 제어기에 인가된 주 전원의 전압을 체크하는 ‘Battery Voltage’오브젝트의 내용을 읽고자 할 때, 시리얼 텍스트 기반으로 통신하는 경우, 해당 오브젝트의 Short Name인 bv나 Long Name인 battery_voltage를 사용하면 됩니다. CAN이나 시리얼 바이너리 패킷 통신을 사용하는 경우는 해당 오브젝트의 Index인 8을 사용하면 됩니다.

표 13‑1에서는 오브젝트의 4가지 속성을 보여줍니다. 각각의 오브젝트 타입에 따라 패킷의 길이가 달라질 수 있습니다.

표 13‑2 오브젝트의 타입

Object Type Size Description
INT8 1byte 부호를 가지는 8 bit 정수형
INT16 2bytes 부호를 가지는 16 bit 정수형
INT32 4bytes 부호를 가지는 32 bit 정수형
FLOAT 4bytes 부호를 가지는 32 bit 실수형

또한, 표 13‑2에서는 오브젝트의 엑세스 속성을 나타냅니다. RO로 표시된 오브젝트는 읽기 전용으로 상수(Constant)와 상태(Status) 오브젝트가 여기에 해당하며, 값을 쓰려고 할 때 에러를 리턴할 것입니다. WO로 표시된 오브젝트는 쓰기 전용으로 명령(Command) 오브젝트가 여기에 해당하며, 값을 읽으려고 할 때 에러를 리턴할 것입니다. RW로 표시된 오브젝트는 구성 파라미터(Configuration Parameter)와 변수(Variable) 오브젝트가 여기에 해당합니다.

표 13‑3 오브젝트의 엑세스 속성

Access Object Description
RO Constant, Status 읽기 전용 (Read Only)
WO Command 쓰기 전용 (Write Only)
RW Configuration Parameter, Variable 읽고 쓰기 가능 (Read Writeable)

 

13.2 CAN 메시지

제어기의 구성 파라미터(Configuration Parameter)를 설정하고 명령(Command)을 내리거나 상태(Status)를 읽기 위해서 제어기에 존재하는 여러 오브젝트들을 CAN 통신으로 엑세스 할 수 있습니다. 이 절은 제어기에 존재하는 오브젝트들을 엑세스하기 위한 CAN 통신의 메시지 구조에 대해 기술합니다.

※ 마스터 PC와 제어기가 CAN 버스에 연결되어 통신하기 위해서는, 네트워크에 연결된 모든 노드의 통신 속도가 일치해야 하고 각각의 장치 ID는 모두 달라야 합니다.

13.2.1 CAN 패킷의 기본 구조

마스터 PC와 제어기 간에 CAN 통신으로 주고받는 패킷의 주요 구성 요소는 Node ID와 메시지의 길이(Length) 그리고 전송되는 메시지(Message)가 됩니다(아래 그림 참조).

Node ID Length Message
11bit 0~8 0 ~ 8byte

Node ID로는 최대 11bit를 설정할 수 있는데, 제어기의 ‘Device ID’가 여기에 사용됩니다. 마스터에서 장치로 CAN 메시지를 보내거나 장치가 마스터로 회신 할 때, Node ID에는 장치 ID가 동일하게 지정되어야 합니다. Length는 메시지(Message)의 길이를 나타내는데, 메시지의 최대 크기가 8byte 이므로 0에서 8사이의 값이 됩니다. 메시지에는 전송되는 데이터를 담습니다.

다음 그림은 메시지(Message)의 기본 구조를 나타냅니다. 메시지는 최대 8byte 크기를 가질 수 있으며, 1byte의 Command와 2byte의 Index, 1byte의 Sub-index와 나머지는 상황에 맞는 오브젝트의 값(Value)으로 구성되어 있습니다. 상황에 따라 5th ~ 8th byte 지점의 값들은 존재할 수도 있고 아닐 수도 있습니다. 만약 5th byte 지점까지만 파라미터가 존재한다면 5th byte까지의 내용만 전송하면 됩니다.

1st byte 2nd byte 3rd byte 4th byte 5th byte 6th byte 7th byte 8th byte
Command Index Sub-index Value

여기서 Command는 표 13‑4과 같은 액세스 형식(Access Code)과 오브젝트 형식(Object Type)의 조합으로 1byte를 구성하게 됩니다.

표 13‑4 액세스 형식(Access Code)과 오브젝트 형식(Object Type)

구분 코드 내용
Access Code 0×10 오브젝트 쓰기 요청
0×20 오브젝트 쓰기 요청에 대한 응답
0×30 오브젝트 읽기 요청
0×40 오브젝트 읽기 요청에 대한 응답
0×80 오브젝트 읽기/쓰기 요청에 대한 에러 응답
Object Type 0×00 INT8 – 8 bit signed integer
0×04 INT16 – 16 bit signed integer
0×08 INT32 – 32 bit signed integer
0x0C FLOAT – 32 bit IEEE Standard 754 floating-point

Index나 Value와 같이 한 바이트 이상의 데이터가 메시지에 저장될 때는 데이터의 하위 바이트부터 왼쪽에 저장되는 리틀 인디안(Little-Endian)방식을 따릅니다.

 

13.2.2 오브젝트 읽기 요청

마스터 PC가 제어기의 오브젝트를 읽기 위해, 마스터 PC가 제어기에 보내는 쿼리 패킷을 구성합니다.
오브젝트의 값을 읽을 때는 표 13‑4의 Access Code 0×30과 읽고자 하는 Object Type을 조합해서 Command를 먼저 구성해야 합니다. 읽고자 하는 오브젝트의 형이 INT16 이라면 Command에는 0×34를 사용합니다.

1st byte 2nd byte 3rd byte 4th byte 5th byte 6th byte 7th byte 8th byte
Command Index Sub-index

 

13.2.3 오브젝트 쓰기 요청

마스터 PC가 제어기의 오브젝트에 값을 쓰기 위해, 마스터 PC가 제어기에 보내는 쿼리를 구성합니다.
오브젝트에 값을 쓸 때는, 4th byte 지점 까지는 오브젝트 읽기 요청과 동일하게 구성합니다. 단, Command는 표 13‑4의 Access Code에 의해 0×10과 Object Type에 맞는 조합으로 작성되어야 하며, 그 형식에 맞춰 오브젝트의 값(Value)을 작성합니다.

1st byte 2nd byte 3rd byte 4th byte 5th byte 6th byte 7th byte 8th byte
Command Index Sub-index Value(INT8)
Value(INT16)
Value(INT32)
Value(FLOAT)

 

13.2.4 오브젝트 읽기/쓰기 요청에 대한 성공 응답

제어기가 마스터 PC의 오브젝트 읽기/쓰기 요청에 응답하기 위해, 제어기가 마스터 PC에 보내는 응답 패킷을 구성합니다.
오브젝트의 값을 읽거나 쓰기가 성공한 경우에는 오브젝트의 값(Value)이 응답으로 돌아옵니다. 패킷의 구성은 오브젝트 쓰기 요청에서와 같습니다. 단, Command는 표 13‑4의 Access Code에 제시된 것처럼 0×20이나 0×40중 하나와 Object Type에 맞는 조합으로 작성됩니다.

1st byte 2nd byte 3rd byte 4th byte 5th byte 6th byte 7th byte 8th byte
Command Index Sub-index Value(INT8)
Value(INT16)
Value(INT32)
Value(FLOAT)

※ 제어기는 사용자가 쓴 값이 적용되지 않을 수 있기 때문에 사용자의 오브젝트를 읽는 요청뿐만 아니라 오브젝트에 쓰기 요청에 대해서도 해당 오브젝트의 값을 응답합니다.

13.2.5 오브젝트 읽기/쓰기 요청에 대한 실패 응답

제어기가 마스터 PC의 오브젝트 읽기/쓰기 요청에 실패를 알리기 위해, 제어기가 마스터 PC에 보내는 실패 응답 패킷을 구성합니다.
오브젝트의 내용을 읽거나 쓰기 위한 패킷을 제어기에 요청했을 때, 오류가 발생하는 경우는 다음 그림과 같은 형식의 오류 패킷이 돌아옵니다.

1st byte 2nd byte 3rd byte 4th byte 5th byte 6th byte 7th byte 8th byte
Command Error Code

오류 메시지는 표 13‑5에 나타나 있습니다. CAN 패킷에서 오류 메시지 내용은 전달되지 않으며 Error Code만 반환됩니다. 그리고 Command는 0×80이 반환됩니다.

표 13‑5 오브젝트의 읽기/쓰기 과정에서 발생하는 오류

Error Code Error Message 내용
1 undefined index Index나 Sub-index로 지정한 오브젝트가 존재하지 않음
2 packet format error 패킷의 구성이 잘못 되었음
3 variable access error 읽기 전용 오브젝트에 쓰거나, 쓰기 전용 오브젝트의 읽기를 시도함

※ 본 절의 오류 메시지는 패킷의 구성에 관련된 오류로 제어기의 오류 상황이나 오작동에 대한 부분이 아닙니다.

 

13.3 시리얼 바이너리 패킷

제어기의 오브젝트들은 시리얼(USB나 RS-232) 통신으로도 읽고 쓰기가 가능합니다. 시리얼 통신은 텍스트 기반의 패킷과 함께 바이너리 기반의 패킷 통신을 함께 지원합니다.

이 절은 제어기에 존재하는 오브젝트들을 엑세스하기 위한 시리얼 통신의 바이너리 패킷 구조에 관해 설명합니다.

13.3.1 바이너리 패킷의 기본 구조

바이너리 패킷의 메시지 구조는 CAN 패킷에서 사용되는 메시지 구조와 동일합니다. 단 CAN에서는 Object Type에 따라 패킷의 길이가 바뀌지만, 바이너리 패킷 구조에서는 Value의 최대 길이를 4byte로 고정하고 패킷 전체 길이를 13byte로 고정합니다.

1st byte 2nd byte 3rd byte 4th ~ 11th byte 12th byte 13th byte
STX (0×02) Length (=13) Device ID Message Checksum ETX (0×03)

상기 그림에서 처음과 끝의 STX, ETX는 시작과 끝을 의미하는 문자입니다. 그리고 Length는 13으로 고정되어 있습니다.

Checksum은 3rd ~ 11th byte 지점 까지를 바이트 단위로 더한 후 결과에서 1byte만 취한 값입니다. 다음은 C언어로 작성된 Checksum 계산 예제 코드입니다:

char Checksum (char *msg, int len)
{

char cs = 0;

for (int i=0; i<len; ++i)<br=”"> cs += msg[i];
return cs;

}

4th ~ 11th byte 영역의 Message는 CAN 통신에서의 메시지 구조와 동일합니다. 단 CAN은 8byte의 메시지를 모두 채우지 않아도 되지만, 시리얼 바이너리 패킷에서는 8byte의 메시지를 모두 채워야 합니다. 만약 메시지의 크기가 8byte가 되지 않는다면, 남는 공간에 0을 채우면 됩니다.

시리얼 바이너리 패킷에서도 CAN 패킷에서와 같이 리틀 인디안(Little-Endian)방식으로 패킷을 구성합니다.

13.3.2 오브젝트 읽기 요청

오브젝트의 값을 읽을 때는, 패킷의 4th ~ 11th byte 지점에 위치하는 Message를 아래와 같이 구성하면 됩니다. Command는 표 13‑4의 Access Code 0×30과 읽고자 하는 Object Type을 조합해서 Command를 먼저 구성해야 합니다.

4th byte 5th byte 6th byte 7th byte 8th byte 9th byte 10th byte 11th byte
Command Index Sub-index 0 0 0 0

 

13.3.3 오브젝트 쓰기 요청

오브젝트에 값을 쓸 때는, 7th byte 지점 까지는 오브젝트 읽기 요청과 동일하게 구성합니다. 단 Command는 표 13‑4의 Access Code에 의해 0×10과 오브젝트 형에 맞는 조합으로 작성되어야 하며, 그 형식에 맞춰 오브젝트의 값(Value)을 작성합니다.

4th byte 5th byte 6th byte 7th byte 8th byte 9th byte 10th byte 11th byte
Command Index Sub-index Value(INT8) 0 0 0
Value(INT16) 0 0
Value(INT32)
Value(FLOAT)

 

13.3.4 오브젝트 읽기/쓰기 요청에 대한 성공 응답

오브젝트의 값을 읽거나 쓰기가 성공한 경우에는 오브젝트의 값(Value)이 응답으로 돌아옵니다. 패킷의 구성은 오브젝트 쓰기 요청에서와 같습니다. 단, Command는 표 13‑4의 Access Code에 제시된 것처럼 0×20이나 0×40중 하나와 Object Type에 맞는 조합으로 작성됩니다.

4th byte 5th byte 6th byte 7th byte 8th byte 9th byte 10th byte 11th byte
Command Index Sub-index Value(INT8) 0 0 0
Value(INT16) 0 0
Value(INT32)
Value(FLOAT)

제어기는 사용자가 쓴 값이 적용되지 않을 수 있기 때문에 사용자의 오브젝트를 읽는 요청뿐만 아니라 오브젝트에 쓰기 요청에 대해서도 해당 오브젝트의 값을 응답합니다.

13.3.5 오브젝트 읽기/쓰기 요청에 대한 실패 응답

오브젝트의 내용을 읽거나 쓰기 위한 패킷을 제어기에 요청했을 때, 오류가 발생하는 경우는 다음 그림과 같은 형식의 오류 패킷이 돌아옵니다.

4th byte 5th byte 6th byte 7th byte 8th byte 9th byte 10th byte 11th byte
Command Error Code 0 0 0  0 0

오류 메시지는 표 13‑5에 나타나 있습니다. 시리얼 바이너리 패킷에서 오류 메시지 내용은 전달되지 않으며 Error Code만 반환됩니다. 그리고 Command는 0×80이 반환됩니다.

※ 오류 메시지는 패킷의 구성에 관련된 오류로 제어기의 오류 상황이나 오작동에 대한 부분이 아닙니다.

 

13.4 시리얼 텍스트 패킷

시리얼(USB나 RS-232) 통신에서는 텍스트(text) 기반으로 제어기의 오브젝트를 읽고 쓸 수 있도록 합니다. 이는 사용자가 통신을 위한 전용 프로그램을 사용하지 않더라도 Hyperterminal과 같은 유틸리티를 사용하여 제어기의 오브젝트들을 쉽게 엑세스 할 수 있도록 합니다.
시리얼 텍스트 기반 패킷에서는 Index를 직접적으로 사용하지 않고 표 13‑1의 Short Name이나 Long Name과 Sub-index를 사용합니다.

13.4.1 오브젝트 읽기 요청

오브젝트 값을 읽을 때는 텍스트 패킷을 다음과 같이 구성합니다.

Short/Long Name Sub-index CR/LF

Short/Long Name은 오브젝트의 Index에 해당하는 이름이며, Sub-index는 해당 Index에 따라 필요하면 모터 채널 혹은 외부 I/O의 채널을 의미합니다. Sub-index가 0인 경우 생략 가능합니다.
CR/LF는 Carriage Return/Line Feed의 약자로 ASCII 코드상 각각 0x0D, 0x0A입니다. 일반적으로는 키보드의 Enter 키에 해당하며 하이퍼터미널과 같은 유틸리티로 PC에서 연결했다면 명령 입력 후 Enter 키를 입력하는 것입니다. (이후 CR/LF를 ↵기호로 대체)
만약 채널 1에 연결된 모터에 내려진 전압 명령의 값을 알고자 할 때는 아래와 같이 입력합니다.

voltage_command1↵
vtc1ㅍ↵

모터의 전압 명령은 ‘Voltage Command’로, 이에 대한 Long Name은 voltage_command이고 Short Name은 vtc입니다. 그러므로 상기 두 명령은 동일한 결과를 가져옵니다.

13.4.2 오브젝트 쓰기 요청

오브젝트 값을 쓸 때는 텍스트 패킷을 다음과 같이 구성합니다.

Short/Long Name Sub-index = Value CR/LF

Short/Long Name은 오브젝트의 Index에 해당하는 이름이며, Sub-index는 해당 Index에 따라 필요하면 모터 채널 혹은 외부 I/O의 채널을 의미합니다. Sub-index가 0인 경우 생략 가능합니다.
만약 채널 1에 연결된 모터를 10V 전압으로 구동시키고자 할 때 아래와 같이 입력합니다.

vtc1=10↵
voltage_command1=10↵

모터의 전압 명령은 ‘Voltage Command’로, 이에 대한 Long Name은 voltage_command이고 Short Name은 vtc입니다. 그러므로 상기 두 명령은 동일한 결과를 가져옵니다.

그리고 본 제어기의 가장 큰 장점 중의 하나는 듀얼 채널 제어기에 특화된 명령을 가지고 있습니다. 듀얼 채널 제어기에서는 다음과 같은 명령을 사용할 수 있습니다:

·  m_position_command
·  m_velocity_command
·  m_current_command
·  m_velocity_command
·  m_lav_command

상기 명령을 인가하는 방법은 다음과 같은 형식을 가집니다. 여기서 Value1은 1번 채널을, Value2는 2번 채널을 의미합니다.

Short/Long Name = Value1 , Value2 CR/LF

여기서 Sub-Index는 의미가 없기 때문에 사용하지 않습니다. 대신 각각의 채널에 대한 값을 ‘,’로 구분하여 패킷을 구성합니다.

만약 두 모터에 위치 명령을 동시에 인가하는 m_position_command/mpc 오브젝트를 통해 명령을 내리고자 할 때 다음과 같이 입력하면 됩니다.

mpc=100,100↵
m_position_command=1000,2000↵

 

13.4.3 오브젝트 읽기/쓰기 요청에 대한 성공 응답

오브젝트의 값을 읽거나 쓰기가 성공한 경우에는 오브젝트의 값(Value)이 응답으로 돌아옵니다. 제어기가 응답하는 형식은 다음과 같습니다.

Short/Long Name Sub-index = Value CR/LF

 

사용자가 Short/Long Name 형식 중 하나로 질의를 하면, 같은 형식으로 응답합니다. 응답하는 문장의 끝에는 CR 문자와 LF 문자가 함께 붙습니다.

두 채널을 동시에 다루는 명령에 대해 다음과 같이 응답합니다.

Short/Long Name = Value1 , Value2 CR/LF

제어기는 사용자가 쓴 값이 적용되지 않을 수 있기 때문에 사용자의 오브젝트를 읽는 요청뿐만 아니라 오브젝트에 쓰기 요청에 대해서도 해당 오브젝트의 값을 응답합니다.

13.4.4 오브젝트 읽기/쓰기 요청에 대한 실패 응답

오브젝트의 내용을 읽거나 쓰기 위한 패킷을 제어기에 요청했을 때, 오류가 발생하는 경우는 다음 그림과 같은 형식의 오류 패킷이 돌아옵니다.

! Error Code , Error Message CR/LF

오류 메시지는 표 13‑5에 나타나 있습니다.

※ 오류 메시지는 패킷의 구성에 관련된 오류로 제어기의 오류 상황이나 오작동에 대한 부분이 아닙니다.

13.4.5 Device ID의 부여

만일 둘 이상의 제어기가 RS-422이나 RS-485 버스에 연결된 경우, 시리얼 텍스트 패킷에는 각각의 제어기를 구분하는 장치의 ID를 부여해야 합니다.
이 때는 다음 그림과 같이 패킷을 수신할 장치의 ID를 패킷 앞에 붙이면 됩니다.

Device ID ; Serial Text Packet

만약 ‘Device ID’ 1번을 가지는 제어기의 채널 1에 연결된 모터를 10V 전압으로 구동시키고자 할 때 아래와 같이 입력합니다.

1;vtc1=10↵
1;voltage_command1=10↵

제어기가 장치 ID를 가지는 패킷을 수신하였을 때는, 응답 패킷에도 장치 ID를 붙여 응답합니다. 응답 패킷도 다음과 같은 형태가 됩니다.

Device ID ; Serial Text Packet

※주의※
RS-422이나 RS-485 버스에 둘 이상의 제어기를 연결할 때는, 각각의 제어기 간에 Device ID가 서로 충돌하지 않도록 주의하십시오.

MoonWalker Series Motor Controllers User’s Manual 12. I/O 오브젝트

MW001

MW001

MoonWalker Series

Motor Controllers

User’s Manual

MW-MDC24D100S / MW-MDC24D100D

MW-MDC24D200S / MW-MDC24D200D

MW-MDC24D500S / MW-MDC24D500D

 ※ 사용자 매뉴얼에 포함된 정보는 정확하고 신뢰성이 있는 내용입니다. 그러나 출판 당시 발견되지 않은 오류가 있을 수 있으니 사용자는 자신의 제품 검증을 수행하시기 바라며, 전적으로 사용자 매뉴얼에 포함된 정보에 의존하지 마시기 바랍니다.

 

12. I/O 오브젝트

제어기는 외부 센서와 액츄에이터를 연결할 수 있는 디지털 입력, 디지털 출력, 아날로그 입력, 펄스 입력 포트를 가지고 있습니다. 이러한 입출력 포트들은 모터제어기의 특정 기능으로 매핑되어 모터제어기가 외부로 인터페이스 할 수 있도록 합니다.

이 장에서는 제어기의 입출력 채널에 관련된 오브젝트들에 대해 설명합니다.

MW054

그림 12 1 I/O Objects

 

12. 1 디지털 입력

 

이 절에서는 디지털 입력 채널들에 대해 공통으로 사용되는 오브젝트들에 대해 다룹니다.

표 12‑1 디지털 입력 오브젝트

Long name, Short name Index/ Sub-index Type Description
num_di, ndi 60/0 I8 (CN) 디지털 입력 채널의 수
di_enable, die 61/0 I32 (CP) 각 비트별 해당 디지털 입력 채널의 사용 여부
di_invert, dii 62/0 I32 (CP) 각 비트별 해당 디지털 입력 채널의 반전 여부
di_all_values, di 63/0 I32 (ST) 디지털 입력 채널들을 하나의 32bit 값으로 모음

상기 표에서 Long Name과 Short Name은 텍스트 모드에서 오브젝트를 엑세스 할 수 있도록 부여된 이름입니다. 그리고 Index와 Sub-index는 오브젝트를 엑세스 하기 위한 주소입니다.

Type 열은 오브젝트의 형식을 나타냅니다:

·  I8 – 부호를 가지는 8bit 정수형 수
·  I16 – 부호를 가지는 16bit 정수형 수
·  I32 – 부호를 가지는 32bit 정수형 수
·  F32 – 부호를 가지는 32bit 실수형 수

Type 열의 괄호 안 표기는 다음과 같습니다:

·  (CN) – Constant 오브젝트
·  (CM) – Command 오브젝트
·  (ST) – Status 오브젝트
·  (CP) – Configuration Parameter 오브젝트
·  (VA) – Variable 오브젝트

12.1.1 num_di – Number of DI

num_di 상수는 제어기가 보유한 디지털 입력 채널의 수를 나타냅니다. 디지털 입력 채널의 수는 제어기 모델에 따라 다릅니다. 해당 제품의 데이터시트에서도 참조 가능합니다.

12.1.2 di_enable – DI Enable

di_enable 파라미터의 각 비트는 해당 디지털 입력 채널의 사용 여부를 결정합니다:

Bit0 – 디지털 입력 채널 1의 사용 여부
Bit1 – 디지털 입력 채널 2의 사용 여부

해당 비트가 0인 경우 디지털 입력 채널은 사용 불가능합니다. 1인 경우 디지털 입력 채널은 사용 가능합니다.

12.1.3 di_invert – DI Invert

di_invert 파라미터의 각 비트는 해당 디지털 입력 채널의 반전 여부를 결정합니다:

Bit0 – 디지털 입력 채널 1의 반전 여부
Bit1 – 디지털 입력 채널 2의 반전 여부

해당 비트가 0인 경우 디지털 입력 채널의 신호를 그대로 읽습니다. 1인 경우는 디지털 입력 채널의 입력 신호를 반전하여 읽습니다. 즉, 0인 경우 1로, 1인 경우 0으로 읽습니다.

12.1.4 di_all_values – DI All Values

di_all_values 상태의 각 비트는 해당 디지털 입력 채널의 값(di_value)을 나타냅니다:

Bit0 – 디지털 입력 채널 1의 값
Bit1 – 디지털 입력 채널 2의 값

이 상태는 모든 디지털 입력 채널의 값을 한 번에 읽을 수 있도록 합니다.

12.2 디지털 입력 채널

다음은 디지털 입력의 각 채널 별로 설정되는 오브젝트입니다.

표 12‑2 디지털 입력 채널 오브젝트

Long name, Short name Index/ Sub-index Type Description
di_value, div 201/ 1~n I8 (ST) 디지털 입력 채널의 값 (범위: 0 or 1)
di_function, dif 202/ 1~n I16 (CP) 디지털 입력 채널을 특정 모터의 동작으로 매핑

상기 표에서 Sub-index에 사용된 n은 디지털 입력 채널의 수(num_di)를 나타냅니다.

12.2.1 di_value – DI Value
di_value 상태는 디지털 입력 채널의 값을 나타냅니다. 값으로 1bit의 0이나 1을 가지며, di_invert에서 설정된 반전 여부가 적용된 값입니다.

12.2.2 di_function – DI Function
di_function 파라미터는 제어기의 디지털 입력 채널을 특정 모터의 디지털 입력 버퍼의 동작으로 매핑합니다. 이 파라미터의 상위 8bit로는 대상 모터를 선정합니다:

·  0×0000 – 채널 1번에 연결된 모터 선택
·  0×0100 – 채널 2번에 연결된 모터 선택

하위 8bit로는 동작을 선택합니다:

0 – None
1 – Emergency Stop
2 – Quick Stop
3 – Stop
4 – Run Script
5 – Forward Limit Switch
6 – Reverse Limit Switch
7 – Invert Direction
8 – Load Home Counter

 

12.3 디지털 출력

이 절에서는 디지털 출력 채널들에 공통으로 사용되는 오브젝트들에 대해 다룹니다.

표 12‑3 디지털 출력 오브젝트

Long name, Short name Index/ Sub-index Type Description
num_do, ndo 65/0 I8 (CN) 디지털 출력 채널의 수
do_enable, doe 66/0 I32 (CP) 각 비트별 해당 디지털 출력 채널의 활성화 여부
do_invert, doi 67/0 I32 (CP) 각 비트별 해당 디지털 출력 채널의 반전 여부
do_all_values, do 68/0 I32 (ST) 디지털 출력 채널들을 하나의 32bit 값으로 모음

12.3.1 num_do – Number of DO

num_do 상수는 제어기가 가진 디지털 출력 채널의 수를 나타냅니다. 디지털 출력 채널의 수는 제어기 모델에 따라 다릅니다. 해당 제품의 데이터시트에서도 참조 가능합니다.

12.3.2 do_enable – DO Enable

do_enable 파라미터의 각 비트는 해당 디지털 출력 채널의 사용 여부를 결정합니다:

Bit0 – 디지털 출력 채널 1의 사용 여부
Bit1 – 디지털 출력 채널 2의 사용 여부

해당 비트가 0인 경우 디지털 출력 채널은 사용 불가능합니다. 1인 경우 디지털 출력 채널은 사용 가능합니다.

12.3.3 do_invert – DO Invert

do_invert 파라미터의 각 비트는 해당 디지털 출력 채널의 반전 여부를 결정합니다:

Bit0 – 디지털 출력 채널 1의 반전 여부
Bit1 – 디지털 출력 채널 2의 반전 여부

해당 비트가 0인 경우 디지털 출력 채널의 신호는 변환 없이 출력됩니다. 1인 경우 디지털 출력 채널의 신호는 반전되어 출력됩니다.

12.3.4 do_all_values – DO All Values

do_all_values 변수의 각 비트는 해당 디지털 출력 채널의 값(do_value)을 나타냅니다:

Bit0 – 디지털 출력 채널 1의 값
Bit1 – 디지털 출력 채널 2의 값

이 변수는 모든 디지털 출력 채널의 값을 한 번에 내보낼 수 있도록 합니다.

 

12.4 디지털 출력 채널

다음은 디지털 출력의 각 채널 별로 설정되는 오브젝트입니다.

표 12‑4 디지털 출력 채널 오브젝트

Long name,
Short name
Index/
Sub-index
Type Description
do_value, dov 211/ 1~m I32 (VA) 디지털 출력 채널의 값 (범위: 0 or 1)
do_function, dof 212/ 1~m I32 (CP) 디지털 출력 채널을 특정 모터의 상태로 매핑

상기 표에서 Sub-index에 사용된 m은 디지털 출력 채널의 수(num_do)를 나타냅니다.

12.4.1 do_value – DO Value

do_value 변수는 디지털 출력 채널에 값을 읽고 씁니다. 값으로 1bit의 0이나 1을 가지며, do_invert에서 설정된 반전 여부가 적용되기 전의 값입니다. 반전 여부는 디지털 출력 포트로 신호가 나갈 때 적용됩니다.
디지털 출력 채널에 do_function으로 기능이 매핑되지 않은 경우, 사용자가 직접 do_value에 값을 씀으로 디지털 출력 채널로 원하는 값을 내보낼 수 있습니다.

12.4.2 do_function – DO Function

do_function 파라미터는 제어기의 디지털 출력 채널을 특정 모터의 디지털 출력 버퍼의 상태로 매핑합니다. 이 파라미터의 상위 8bit로는 대상 모터를 선정합니다:

0×0000 – 채널 1번에 연결된 모터 선택
0×0100 – 채널 2번에 연결된 모터 선택

하위 8bit로는 상태를 선택합니다:

0 – None
1 – Motor Power ON (Break Release)
2 – Motor is Reversed (Warning Buzzer ON)
3 – High Voltage (Brake Resistor ON)
4 – High Temperature (Cooling Fan ON)

 

12.5 아날로그 입력

이 절에서는 아날로그 입력 채널에 공통으로 사용되는 오브젝트들에 대해 다룹니다.

표 12‑5 아날로그 입력 오브젝트

Long name, Short name Index/ Sub-index Type Description
num_ai, nai 70/0 I8 (CN) 아날로그 입력 채널의 수
ai_enable, aie 71/0 I32 (CP) 각 비트별 해당 아날로그 입력 채널의 활성화 여부
ai_invert, aii 72/0 I32 (CP) 각 비트별 해당 아날로그 입력 채널의 극성 반전 여부

12.5.1 num_ai – Number of AI

num_ai 상수는 제거기가 보유한 아날로그 입력 채널의 수를 나타냅니다. 아날로그 입력 채널의 수는 제어기 모델에 따라 다릅니다. 해당 제품의 데이터시트에서도 참조 가능합니다.

12.5.2 ai_enable – AI Enable
ai_enable 파라미터의 각 비트는 해당 아날로그 입력 채널의 사용 여부를 결정합니다:

Bit0 – 아날로그 입력 채널 1의 사용 여부
Bit1 – 아날로그 입력 채널 2의 사용 여부

해당 비트가 0인 경우 아날로그 입력 채널은 사용 불가능합니다. 1인 경우 아날로그 입력 채널은 사용 가능합니다.

12.5.3 ai_invert – AI Invert

ai_invert 파라미터의 각 비트는 해당 아날로그 입력 채널의 반전 여부를 결정합니다:

Bit0 – 아날로그 입력 채널 1의 반전 여부
Bit1 – 아날로그 입력 채널 2의 반전 여부

해당 비트가 1인 경우, 아날로그 입력 값이 변환 과정을 거쳐 정규화 된 ai_converted_value 값의 극성이 반전됩니다. 즉, -1은 1로 반전되고 1은 -1로 반전됩니다. 0의 값은 그대로 유지됩니다.

 

12.6 아날로그 입력 채널

다음은 아날로그 입력의 각 채널 별로 설정되는 오브젝트입니다.

표 12‑6 아날로그 입력 채널 오브젝트

Long name, Short name Index/ Sub-index Type Description
ai_value, aiv 221/ 1~o I32 (ST) 아날로그 입력 채널의 원시 값(raw value)
(범위: 0 ~ 4095)
ai_converted_value, aicv 222/ 1~o F32 (ST) 변환 과정을 거쳐 정규화된 값(normalized value)
(범위: -1 ~ 1)
ai_linearity, ail 223/ 1~o I8 (CP) 지수/로그 변환 형식 지정
ai_function, aif 224/ 1~o I16 (CP) 아날로그 입력을 특정 모터의 명령이나 피드백과 매핑
ai_input_min, ain 225/ 1~o I32 (CP) 캘리브레이션: 입력 최소값
ai_input_center, aic 226/ 1~o I32 (CP) 캘리브레이션: 입력 중앙값
ai_input_max, aix 227/ 1~o I32 (CP) 캘리브레이션: 입력 최대값
ai_input_deadband, aidb 228/ 1~o I32 (CP) 캘리브레이션: 입력의 데드밴드(deadband) 값

상기 표에서 Sub-index에 사용된 o는 아날로그 입력 채널의 수(num_ai)를 나타냅니다.

12.6.1 ai_value – AI Value

아날로그 입력 포트에는 0V 과 5V 사이의 전압이 가해집니다. 전압은 12bits AD 컨버터에 의해 디지털로 변환되어 마이크로컨트롤러가 읽게 됩니다.
ai_value 상태는 아날로그 입력 채널의 값을 나타냅니다. 값은 변환이 이루어지기 전의 0과 4095 사이의 12bits 디지털 값입니다.

12.6.2 ai_converted_value – AI Converted Value
ai_converted_value 상태는 아날로그 입력 채널에서 읽은 원시 값을 변환 과정을 거쳐 -1과 1 사이의 정규화 된 값으로 나타냅니다.

12.6.3 ai_linearity – AI Linearity
ai_linearity 파라미터는 아날로그 입력의 정규화 된 값을 지수/로그 함수로 변환합니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – linear(no change) (기본값)
1 – exp weak
2 – exp medium
3 – exp strong
4 – log weak
5 – log medium
6 – log strong

12.6.4 ai_function – AI Function

ai_function 파라미터는 제어기의 아날로그 입력 채널을 특정 모터의 명령 버퍼나 피드백 버퍼, 디지털 입력 버퍼로 매핑 합니다. 이 파라미터의 상위 8bit로는 대상 모터를 선정합니다:

0×0000 – 채널 1번에 연결된 모터 선택
0×0100 – 채널 2번에 연결된 모터 선택

하위 8bit로는 명령 버퍼나 피드백 버퍼, 디지털 입력 버퍼의 기능을 선택합니다:

0 – None
1 – Command: Voltage
2 – Command: Current
3 – Command: Velocity
4 – Command: Position
5 – Feedback: Position
6 – Feedback: Velocity
7 – DI: Emergency Stop
8 – DI: Quick Stop
9 – DI: Slowdown Stop
10 – DI: Run Script
11 – DI: Forward Limit Switch
12 – DI: Reverse Limit Switch
13 – DI: Invert Direction
14 – DI: Load Home Counter

여기서 ‘Command:’로 표기된 기능은 명령 버퍼로 매핑되는 기능입니다. ‘Feedback:’으로 표기된 기능은 피드백 버퍼로 매핑되는 기능입니다. ‘DI’로 표기된 기능은 디지털 입력 버퍼로 매핑되는 기능입니다. 디지털 입력 버퍼로 매핑된 경우, 아날로그 입력 값이 0보다 크면 버퍼 값은 1, 0을 포함하고 0보다 작으면 버퍼 값은 0이 됩니다.

12.6.5 ai_input_min, ai_input_center, ai_input_max – AI Input Min, Center, Max

ai_input_min, ai_input_center, ai_input_max는 아날로그 입력을 정규화하는데 사용되는 캘리브레이션 파라미터들입니다.
ai_input_min 파라미터는 아날로그 입력의 최소값을 나타냅니다. 이 값이 정규화되면 -1이 됩니다. ai_input_center 파라미터는 아날로그 입력의 중앙값을 나타냅니다. 이 값이 정규화되면 0이 됩니다. ai_input_max 파라미터는 아날로그 입력의 최대값을 나타냅니다. 이 값이 정규화되면 1이 됩니다.
ai_input_min 보다 ai_input_center 값이 같거나 커야 하고, ai_input_center 보다 ai_input_max 값이 같거나 커야 합니다.

12.6.6 ai_input_deadband – AI Input Deadband

ai_nput_deadband 파라미터는 아날로그 입력의 중앙값에서 0으로 인식하는 입력 범위를 나타냅니다.

 

12.7 펄스 입력

이 절에서는 펄스 입력 채널에 공통으로 사용되는 오브젝트들에 대해 다룹니다.

표 12‑7 펄스 입력 오브젝트

Long name, Short name Index/ Sub-index Type Description
num_pi, npi 75/0 I8 (CN) 펄스 입력 채널의 수
pi_enable, pie 76/0 I32 (CP) 각 비트별 해당 펄스 입력 채널의 활성화 여부
pi_invert, pii 77/0 I32 (CP) 각 비트별 해당 펄스 입력 채널의 극성 반전 여부

12.7.1 num_pi – Number of PI

num_pi 상수는 펄스 입력 채널의 수를 나타냅니다. 펄스 입력 채널의 수는 제어기 모델에 따라 다릅니다. 해당 제품의 데이터시트에서도 참조 가능합니다.

12.7.2 pi_enable – PI Enable

pi_enable 파라미터의 각 비트는 해당 펄스 입력 채널의 사용 여부를 결정합니다:

Bit0 – 펄스 입력 채널 1의 사용 여부
Bit1 – 펄스 입력 채널 2의 사용 여부

해당 비트가 0인 경우 펄스 입력 채널은 사용 불가능합니다. 1인 경우는 펄스 입력 채널은 사용 가능합니다.

12.7.3 pi_invert – PI Invert

pi_invert 파라미터의 각 비트는 해당 펄스 입력 채널의 반전 여부를 결정합니다:

Bit0 – 펄스 입력 채널 1의 반전 여부
Bit1 – 펄스 입력 채널 2의 반전 여부

해당 비트가 1인 경우, 펄스 입력 값이 변환 과정을 거쳐 정규화 된 pi_converted_value 값의 극성이 반전됩니다. 즉, -1은 1로 반전되고 1은 -1로 반전됩니다. 0의 값은 그대로 유지됩니다.

 

12.8 펄스 입력 채널

다음은 펄스 입력의 각 채널 별로 설정되는 오브젝트들입니다.

표 12‑8 펄스 입력 채널 오브젝트

Long name, Short name Index/ Sub-index Type Description
pi_value, piv 231/ 1~p I32 (ST) 펄스 입력 채널의 원시 값(raw value)
pi_converted_value, picv 232/ 1~p F32 (ST) 변환 과정을 거쳐 정규화 된 값(normalized value)
(범위: -1 ~ 1)
pi_capture_type, pit 233/ 1~p I8 (CP) 펄스 캡쳐의 종류
pi_linearity, pil 234/ 1~p I8 (CP) 지수/로그 변환 형식 지정
pi_function, pif 235/ 1~p I16 (CP) 펄스 입력을 특정 모터의 명령이나 피드백과 매핑
pi_input_min, pin 236/ 1~p I32 (CP) 캘리브레이션: 입력 최소값
pi_input_center, pic 237/ 1~p I32 (CP) 캘리브레이션: 입력 중앙값
pi_input_max, pix 238/ 1~p I32 (CP) 캘리브레이션: 입력 최대값
pi_input_deadband, pidb 239/ 1~p I32 (CP) 캘리브레이션: 입력의 데드밴드(deadband) 값

상기 표에서 Sub-index에 사용된 p는 펄스 입력 채널의 수(num_pi)를 나타냅니다.

12.8.1 pi_value – PI Value
펄스 입력 포트는 펄스기반 입력 신호를 받아들입니다. 펄스 입력은 최소 20Hz에서 최대 20kHz 사이에서 동작하여야 합니다. 그리고 펄스의 ON 신호 폭은 최소 10μs 이상 되어야 합니다.
pi_value 상태는 설정된 pi_capture_type에 따라 Pulse Width, Frequency, Duty Cycle 중 하나의 값을 캡쳐 한 원시 값입니다.

12.8.2 pi_converted_value – PI Converted Value

pi_converted_value 상태는 펄스 입력 채널에서 읽은 원시 값을 변환 과정을 거쳐 -1과 1 사이의 정규화 된 값으로 나타냅니다.

12.8.3 capture_type – PI Capture Type

capture_type 파라미터는 펄스 입력의 데이터 수집 형식(Capture Type)을 나타냅니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – Pulse Width
1 – Frequency
2 – Duty Cycle

데이터 수집 형식으로 ’0 – Pulse Width’가 설정되면 pi_value는 펄스의 폭을 측정합니다. ’1 – Frequency’가 설정되면 펄스의 주파수를 측정합니다. ’2 – Duty Cycle’로 설정되면 펄스의 듀티 사이클을 측정 하며 측정 값은 0 ~ 1000‰ 사이가 됩니다.

12.8.4 pi_linearity – PI Linearity

pi_linearity 파라미터는 펄스 입력의 정규화 된 값을 지수/로그 함수로 변환합니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – linear(no change) (기본값)
1 – exp weak
2 – exp medium
3 – exp strong
4 – log weak
5 – log medium
6 – log strong

12.8.5 pi_function – PI Function

pi_function 파라미터는 제어기의 펄스 입력 채널을 특정 모터의 특정 모터의 명령 버퍼나 피드백 버퍼, 디지털 입력 버퍼로 매핑합니다. 이 파라미터의 상위 8bit로는 대상 모터를 선정합니다:

0×0000 – 채널 1번에 연결된 모터 선택
0×0100 – 채널 2번에 연결된 모터 선택

하위 8bit로는 명령 버퍼나 피드백 버퍼, 디지털 입력 버퍼의 기능을 선택합니다:

0 – None
1 – Command: Voltage
2 – Command: Current
3 – Command: Velocity
4 – Command: Position
5 – Feedback: Position
6 – Feedback: Velocity
7 – DI: Emergency Stop
8 – DI: Quick Stop
9 – DI: Slowdown Stop
10 – DI: Run Script
11 – DI: Forward Limit Switch
12 – DI: Reverse Limit Switch
13 – DI: Invert Direction
14 – DI: Load Home Counter

여기서 ‘Command:’로 표기된 기능은 명령 버퍼로 매핑되는 기능입니다. ‘Feedback:’으로 표기된 기능은 피드백 버퍼로 매핑되는 기능입니다. ‘DI’로 표기된 기능은 디지털 입력 버퍼로 매핑되는 기능입니다. 디지털 입력 버퍼로 매핑된 경우, 아날로그 입력 값이 0보다 크면 버퍼 값은 1, 0을 포함하고 0보다 작으면 버퍼 값은 0이 됩니다.

12.8.6 pi_input_min, pi_input_center, pi_input_max – PI Input Min, Center, Max

pi_input_min, pi_input_center, pi_input_max는 펄스 입력을 정규화하는데 사용되는 캘리브레이션 파라미터들입니다.
pi_input_min 파라미터는 펄스 입력의 최소값을 나타냅니다. 이 값이 정규화되면 -1이 됩니다. pi_input_center 파라미터는 펄스 입력의 중앙값을 나타냅니다. 이 값이 정규화되면 0이 됩니다. pi_input_max 파라미터는 펄스 입력의 최대값을 나타냅니다. 이 값이 정규화되면 1이 됩니다.
pi_input_min 보다 pi_input_center 값이 같거나 커야 하고, pi_input_center 보다 pi_input_max 값이 같거나 커야 합니다.

12.8.7 pi_input_deadband – PI Input Deadband

pi_input_deadband 파라미터는 펄스 입력의 중앙값에서 0으로 인식하는 입력 범위를 나타냅니다.

 

MoonWalker Series Motor Controllers User’s Manual 11. 모터제어기 오브젝트

MW001

MW001

MoonWalker Series

Motor Controllers

User’s Manual

MW-MDC24D100S / MW-MDC24D100D

MW-MDC24D200S / MW-MDC24D200D

MW-MDC24D500S / MW-MDC24D500D

 ※ 사용자 매뉴얼에 포함된 정보는 정확하고 신뢰성이 있는 내용입니다. 그러나 출판 당시 발견되지 않은 오류가 있을 수 있으니 사용자는 자신의 제품 검증을 수행하시기 바라며, 전적으로 사용자 매뉴얼에 포함된 정보에 의존하지 마시기 바랍니다.

 

11. 모터제어기 오브젝트

제어기는 모델에 따라 한 개 또는 두 개의 모터를 연결하여 제어할 수 있습니다. 이 장에서는 모터 제어부의 구성 파라미터 설정 및 명령과 상태에 관련된 오브젝트들에 대해 설명합니다.

MW053
그림 11‑1 Motor Controller Objects

싱글 채널 제어기는 하나의 모터제어기를 가집니다. 그리고 듀얼 채널 제어기는 두 개의 모터제어기를 가집니다.
듀얼 채널 제어기에서는 모터를 구분하기 위해 Sub-index를 사용합니다. 첫 번째 모터는 Sub-index가 1이고 두 번째 모터는 Sub-index가 2입니다. 싱글 채널 제어기에서는 모터가 하나이기 때문에 Sub-index로 1 또는 0을 사용할 수 있습니다.

11.1 모터 개수
모터 개수는 상수 오브젝트로 읽기만 가능합니다. 제품 생산 시 결정되며 사용자가 바꿀 수 없는 값입니다.

표 11‑1 모터 개수 확인 오브젝트

Long name, Short name Index/ Sub-index Type Description
num_motors,nm 80/0 I8 (CN) 제어기에 연결 가능한 모터의 수

상기 표에서 Long Name과 Short Name은 텍스트 모드에서 오브젝트를 엑세스 할 수 있도록 부여된 이름입니다. 그리고 Index와 Sub-index는 오브젝트를 엑세스 하기 위한 주소입니다.

Type 열은 오브젝트의 형식을 나타냅니다:

·  I8 – 부호를 가지는 8bit 정수형 수
·  I16 – 부호를 가지는 16bit 정수형 수
·  I32 – 부호를 가지는 32bit 정수형 수
·  F32 – 부호를 가지는 32bit 실수형 수

Type 열의 괄호 안 표기는 다음과 같습니다:

·  (CN) – Constant 오브젝트
·  (CM) – Command 오브젝트
·  (ST) – Status 오브젝트
·  (CP) – Configuration Parameter 오브젝트
·  (VA) – Variable 오브젝트

11.1.1 num_motors – Number of Motors
제어기에 연결 가능한 모터의 수는 최대 2개 입니다. num_motors 상수의 값으로 다음 중 하나를 가집니다:

1 – 싱글 채널 제어기
2 – 듀얼 채널 제어기

싱글 채널 제어기에는 최대 1개의 모터를 연결 가능합니다. 듀얼 채널 제어기에는 최대 2개의 모터를 연결 가능합니다.

11.2 모터 명령
이 절에서는 모터에 내려지는 위치, 속도, 전류, 전압 명령에 대해 설명합니다.
명령을 내리면 모터제어기는 해당 명령을 수행하기 위한 모드로 변경되고 명령에 따라 제어기가 동작하여 모터를 제어합니다.

표 11‑2 모터 명령 오브젝트

Long name, Short name Index/Sub-index Type Description
command, co 101/0~2 I16(CM) 모터제어기에 내려지는 명령 코드
position_command, pc 111/0~2 I32(CM) 모터의 폐루프 위치 제어 명령 (단위: pulse)
velocity_command, vc 112/0~2 F32(CM) 모터의 폐루프 속도 제어 명령 (단위: RPM)
current_command, cc 113/0~2 F32(CM) 모터의 폐루프 전류 제어 명령 (단위: A)
voltage_command, vtc 114/0~2 F32(CM) 모터에 인가되는 전압 출력 (단위: V)

11.2.1 command – Command

command에 명령 코드를 쓰는 것으로 모터제어기의 해당 기능을 실행할 수 있습니다. 다음은 명령 코드 목록입니다:

0 – Motor Power OFF
1 – Motor Power ON
2 – Clear Fault Flags
6 – Deceleration Stop
7 – Quick Stop

0 – Motor Power OFF:
모터의 전원을 차단하고 모터를 제어하지 않습니다. 모터의 전원을 차단한 것은 모터가 전원으로부터 분리된 것과 같은 효과를 냅니다. 만일 모터가 회전하고 있는 상태에서 모터에 전원을 차단한다면, 모터의 속도가 줄 지 않고 계속 회전하는 상태로 남아있게 됩니다(마찰이 없을 때).
1 – Motor Power ON:
모터에 0V 전원을 공급하고 모터를 제어하지는 않습니다. 모터에 0V 전원을 공급하는 것은 모터의 +와 – 단자를 결선하는 것과 같은 효과를 냅니다. 만일 모터가 회전하고 있는 상태에서 모터에 0V 전원을 공급한다면, 모터는 급 감속하여 정지하게 됩니다.
2 – Clear Fault Flags:
모터에 발생한 모든 폴트(Fault) 플래그를 해제합니다. 폴트 플래그를 해제한다고 해서 폴트의 원인이 해결되지는 않습니다. 사용자가 원인을 파악하여 적절한 조치를 해야 합니다.
6 – Deceleration Stop:
모터의 속도를 deceleration 파라미터에 설정된 감속도로 감속하여 정지합니다. 모터의 제어 모드가 위치 제어 모드라면 속도 제어 모드로 변경됩니다. 전류 제어 모드라면 전압 출력 모드로 변경됩니다.
7 – Quick Stop
모터를 최대한 빨리 정지합니다. 모터의 제어 모드가 위치, 속도, 전류 제어 모드라면 전압 출력 모드로 변경됩니다. 디지털 입력에서의 ‘Emergency Stop’ 기능과는 구별됩니다.

모터가 Power ON 될 때는 다음 사항을 체크합니다. 이 중 하나라도 통과되지 못하면 모터는 Power OFF 상태에 머무르게 됩니다:

·  모터제어기의 디지털 입력 중 ‘Emergency Stop’이 켜진 상태
·  모터에 흐르는 전류(currnet)가 overcurrent_limit 보다 큰 경우
·  전원의 전압(battery_voltage)이 undervoltage_limit과 overvoltage_limit 범위를 벗어난 경우
·  MOSFET와 방열반의 온도(temperature)가 overheat_limit 보다 큰 경우

모터 Power ON을 성공하면 다음 과정이 진행됩니다:

1. 아날로그 입력과 펄스 입력의 센터 안전 검사 플래그를 리셋
2. 모터제어기는 전압 출력 모드로 설정하고 0V 전압 출력
3. 위치, 속도, 전류, 전압 명령을 모두 0으로 리셋

11.2.2 position_command – Position Command

모터의 폐루프 위치 제어기가 추종해야 할 위치 명령을 내립니다. 명령을 내리기 전에 모터제어기가 속도 제어나 전류 제어, 전압 출력 모드에서 구동 중인 상황에 있었더라도 위치 제어 모드로 즉시 변경되고 position_command로 주어진 명령 인수를 추종합니다.
만일 use_soft_limit이 켜진 상태라면 위치 명령은 min_position과 max_position 범위 내로 제한됩니다. 또한 이동 중 최고 속도는 max_velocity 값에 의해 제한됩니다. Profile Mode를 켠 상태라면 가속과 감속을 위해 acceleration과 deceleration 값이 사용됩니다.
position_command를 사용하려면, 모터제어기는 다음 사항을 만족하여야 합니다:

·  모터는 ‘Motor Power ON’ 상태에 있어야 함
·  모터제어기의 디지털 입력 중 ‘Emergency Stop’, ‘Quick Stop’, ‘Declaration Stop’ 가 꺼져 있거나 제어기의 디지털 입력 포트로 매핑되어있지 않은 상태여야 함
·  모터제어기의 디지털 입력 중 ‘Forward Limit Switch’가 켜져 있는 상태라면 위치 명령이 현재 위치보다 작아야 함
·  모터제어기의 디지털 입력 중 ‘Reverse Limit Switch’가 켜져 있는 상태라면 위치 명령이 현재 위치보다 커야 함

위치 제어 모드에서는 위치 제어기와 속도 제어기, 전류 제어기가 동시에 실행됩니다. “7.3 모터제어기 구조”를 참고하십시오.

11.2.3 velocity_command – Velocity Command

모터의 폐루프 속도 제어기가 추종해야 할 속도 명령을 내립니다. 명령을 내리기 전에 모터제어기가 위치 제어나 전류 제어, 전압 출력 모드에서 구동 중인 상황에 있었더라도 속도 제어 모드로 즉시 변경되고 velocity_command로 주어진 명령 인수를 추종합니다.
속도 명령의 절대값은 max_velocity보다 클 수 없으며, –max_velocity와 max_velocity사이의 값을 가질 수 있습니다. Profile Mode를 켠 상태라면 가속과 감속을 위해 acceleration과 deceleration 값이 사용됩니다.
velocity_command를 사용하려면, 모터제어기는 다음 사항을 만족하여야 합니다:

·  모터는 “Power ON” 상태에 있어야 함
·  모터제어기의 디지털 입력 중 “Emergency Stop”, “Quick Stop”, “Declaration Stop” 가 꺼져 있거나 비활성화 상태(제어기의 디지털 입력 포트로 매핑되어있지 않은 상태)여야 함
·  모터제어기의 디지털 입력 중 “Forward Limit Switch”가 켜져 있는 상태라면 속도 명령이 0보다 작아야 함
·  모터제어기의 디지털 입력 중 “Reverse Limit Switch”가 켜져 있는 상태라면 속도 명령이 0보다 커야 함

속도 제어 모드에서는 전류 제어기가 동시에 실행됩니다. “7.3 모터제어기 구조”를 참고하십시오.

11.2.4 current_command – Current Command
모터의 폐루프 전류 제어기가 추종해야 할 전류 명령을 내립니다. 명령을 내리기 전에 모터제어기가 위치 제어나 속도 제어, 전압 출력 모드에서 구동 중인 상황에 있었더라도 전류 제어 모드로 즉시 변경되고 current_command로 주어진 명령 인수를 추종합니다.
전류 명령의 절대값은 max_current보다 클 수 없으며, –max_current와 max_current 사이의 값을 가질 수 있습니다.
current_command를 사용하려면, 모터제어기는 다음 사항을 만족하여야 합니다:

·  모터는 ‘Motor Power ON’ 상태에 있어야 함
·  모터제어기의 디지털 입력 중 ‘Emergency Stop’, ‘Quick Stop’, ‘Declaration Stop’ 가 꺼져 있거나 제어기의 디지털 입력 포트로 매핑되어있지 않은 상태여야 함
·  모터제어기의 디지털 입력 중 ‘Forward Limit Switch’가 켜져 있는 상태라면 전류 명령이 0보다 작아야 함
·  모터제어기의 디지털 입력 중 ‘Reverse Limit Switch’가 켜져 있는 상태라면 전류 명령이 0보다 커야 함

11.2.5 voltage_command – Voltage Command

voltage_command로 지정된 전압을 모터에 직접 내보냅니다. 명령을 내리기 전에 모터제어기가 위치 제어나 속도 제어, 전류 제어 모드에서 구동 중인 상황에 있었더라도 전압 출력 모드로 즉시 변경되고 voltage_command로 주어진 명령 인수를 추종합니다.
전압 명령의 절대값은 max_voltage보다 클 수 없으며, –max_voltage와 max_voltage사이의 값을 가질 수 있습니다.
current_command를 사용하려면, 모터제어기는 다음 사항을 만족하여야 합니다:

·  모터는 ‘Motor Power ON’ 상태에 있어야 함
·  모터제어기의 디지털 입력 중 ‘Emergency Stop’, ‘Quick Stop’, ‘Declaration Stop’ 가 꺼져 있거나 제어기의 디지털 입력 포트로 매핑되어있지 않은 상태여야 함
·  모터제어기의 디지털 입력 중 ‘Forward Limit Switch’가 켜져 있는 상태라면 전압 명령이 0보다 작아야 함
·  모터제어기의 디지털 입력 중 ‘Reverse Limit Switch’가 켜져 있는 상태라면 전압 명령이 0보다 커야 함

11.3 모터 상태

모터의 전압, 전류, 회전속도, 위치 카운트 값 등의 모터의 운용 상태를 읽어오는 오브젝트입니다.

표 11‑3 모터 상태 확인 오브젝트

Long name, Short name Index/ Sub-index Type Description
status, s 102/0~2 I32 (ST) 모터제어기의 현재 상태
fault, f 103/0~2 I32 (ST) 모터제어기 및 관련 I/O에서 발생한 폴트
temperature, tp 121/ 0~2 F32 (ST) FET와 방열판의 온도 (단위: °C)
voltage, vt 122/ 0~2 F32 (ST) 모터에 가해지는 전압 (단위: V)
current, c 123/ 0~2 F32 (ST) 모터에 흐르는 전류 (단위: A)
velocity, v 124/ 0~2 F32 (ST) 모터의 회전속도 (단위: RPM)
position, p 125/ 0~2 I32 (VA) 모터의 회전위치 (단위: pulse)
hall_count, h 126/ 0~2 I32 (ST) BLDC 모터의 홀 센서 카운트 값 (단위: pulse)
ai_potentiometer, pt 131/ 0~2 I32 (ST) 아날로그 입력 포트에 매핑된 위치 센서의 피드백 값
(범위: -1 ~ 1)
ai_tachometer, ta 132/ 0~2 I32 (ST) 아날로그 입력 포트에 매핑된 속도 센서의 피드백 값
(범위: -1 ~ 1)

11.3.1 status – Status

status의 각 비트는 모터제어기의 구동 상태 및 제어기와 연결된 I/O의 상태를 표시합니다. 다음 목록을 참고하십시오:

0×0001 – Motor Power ON
0×0002 – Motor Moving
0×0004 – Fault Detected
0×0008 – Emergency Stop
0×0010 – Position Controller
0×0020 – Velocity Controller
0×0040 – Current Controller
0×0100 – AI Center Safety Check Failed
0×0200 – PI Center Safety Check Failed
0×0400 – AI Min/Max Safety Check Failed
0×0800 – PI Min/Max Safety Check Failed
0×1000 – DI Stop Requested
0×2000 – Exceed the Limit Range
0×4000 – Serial Command
0×8000 – AI/PI Command
0×10000 – Script Running

0×0001 – Motor Power ON:
모터에 전원이 공급되고 위치, 속도, 전류, 전압 명령에 따라 모터제어기가 구동 가능한 상태입니다. 제어기에 명령을 내리기 전에 이 플래그가 켜진 상태인지 확인해야 합니다.
0×0002 – Motor Moving:
모터가 회전하고 있습니다. 즉, 모터의 속도가 0이 아님을 나타냅니다. 모터의 속도는 단위 시간당 엔코더 카운트 값의 변화량으로 계산합니다. 모터에 구동 명령이 내려지지 않은 상황에서 모터를 손으로 돌려 엔코더 값이 변하게 되어도 이 플래그가 켜집니다.
0×0004 – Fault Detected:
모터제어기에 폴트가 발생한 상태입니다. 폴트 발생 시 제어기와 모터, 주변회로를 보호하기 위해 모터에 공급되는 전원을 차단합니다. 폴트의 원인을 파악하려면 fault 상태를 읽어야 합니다.
0×0008 – Emergency Stop:
모터제어기의 디지털 입력에 매핑 된 ‘Emergency Stop’ 스위치가 켜진 상태입니다. 이 경우 모터는 Power OFF 상태가 됩니다. ‘Emergency stop’ 스위치가 꺼질 때까지 ‘Motor Power ON’ 상태가 되지 못합니다.
0×0010 – Position Controller:
모터의 폐루프 위치제어기가 동작 중입니다. 위치 제어기는 속도제어기와 전류제어기를 내장하고 있기 때문에 함께 동작합니다.
0×0020 – Velocity Controller:
모터의 폐루프 속도제어기가 동작 중입니다. 속도 제어기는 전류제어기를 내장하고 있기 때문에 함께 동작합니다.
0×0040 – Current Controller:
모터의 폐루프 전류 제어기가 동작 중입니다.
0×0100 – AI Center Safety Check Failed:
모터제어기의 속도나 전압 명령에 매핑된 아날로그 입력 값이 모터 전원 공급 후 0에 있지 않습니다. 입력 값이 0이 될 때까지 입력 값은 강제로 0이 됩니다.
0×0200 – PI Center Safety Check Failed:
모터제어기의 속도나 전압 명령에 매핑된 펄스 입력 값이 모터 전원 공급 후 0에 있지 않습니다. 입력 값이 0이 될 때까지 입력 값은 강제로 0이 됩니다.
0×0400 – AI Min/Max Safety Check Failed:
모터제어기의 속도나 전압 명령에 매핑된 아날로그 입력 값이 캘리브레이션의 Min/Max 범위를 벗어났습니다. 이 경우 입력 값은 강제로 0이 됩니다.
0×0800 – PI Min/Max Safety Check Failed:
모터제어기의 속도나 전압 명령에 매핑된 펄스 입력 값이 캘리브레이션의 Min/Max 범위를 벗어났습니다. 이 경우 입력 값은 강제로 0이 됩니다.
0×1000 – DI Stop Requested:
모터제어기의 디지털 입력 포드 중 ‘Declaration Stop’이나 ‘Quick Stop’이 켜진 상태입니다. 이 상태가 꺼질 때까지 모터제어기에 내려지는 위치와 속도, 전류, 전압 명령은 차단됩니다.
0×2000 – Exceed the Limit Range:
모터제어기의 디지털 입력 포트 중 ‘Forward Limit Switch’나 ‘Reverse Limit Switch’가 켜진 상태입니다. 이 상태가 꺼질 때까지 모터제어기에 내려지는 위치와 속도, 전류, 전압 명령은 제한적으로 실행됩니다. 즉, 리미트를 벗어나는 방향으로 움직이는 명령만 수행됩니다.
0×4000 – Serial Command:
시리얼(RS-232, USB) 포트와 CAN 포트로부터 모터제어기에 구동(위치와 속도, 전류, 전압) 명령이 내려지고 있습니다. 이 플래그는 구동 명령 외(구성 파라미터 읽고 쓰기와 같은 것들)에는 반응하지 않습니다.
0×8000 – AI/PI Command:
모터제어기에 매핑 된 아날로그 입력 혹은 펄스 입력 포트로부터 구동 명령이 입력되고 있습니다.
0×10000 – Script Running:
스크립트가 실행 중임을 표시합니다. 제어기의 system_status 상태의 ‘Script Running’ 플래그와 동일합니다.

’0×0010 – Position Controller’, ’0×0020 – Velocity Controller’, ’0×0040 – Current Controller’ 플래그가 모두 꺼지고 ’0×0001 – Motor Power ON’ 상태가 켜진 후에는 전압 출력 모드가 됩니다.

’0×0100 – AI Center Safety Check Failed’와 ’0×0200 – PI Center Safety Check Failed’ 플래그가 작동하려면 아날로그 입력 포트 혹은 펄스 입력 포트가 제어기의 모터 구동 명령에 매핑되어 있어야 합니다. 이 상태를 체크하는 기능은 center_safety 파라미터에 의해 켜고 끌 수 있습니다. 조이스틱이나 RC 조종기의 입력 값이 0이 아닌 상황에서 모터에 전력이 공급되어 모터가 갑자기 움직이면 위험한 상황이 발생할 수 있기 때문에 이를 방지하기 위한 기능입니다.

’0×0400 – AI Min/Max Safety Check Failed’와 ’0×0800 – PI Min/Max Safety Check Failed’ 플래그가 작동하려면 아날로그 입력 포트 혹은 펄스 입력 포트가 제어기의 모터 구동 명령에 매핑되어 있어야 합니다. 이 상태를 표시하는 기능은 min_max_safety 파라미터에 의해 켜고 끌 수 있습니다. 조이스틱이나 RC 조종기의 연결이 끊어지거나 하여 잘못된 신호가 입력되고, 이로 인해 모터가 오작동하면 위험한 상황이 발생할 수 있기 때문에 이를 방지하기 위한 기능입니다.

’0×0100 – AI Center Safety Check Failed’, ’0×0200 – PI Center Safety Check Failed’, ’0×0400 – AI Min/Max Safety Check Failed’,

’0×0800 – PI Min/Max Safety Check Failed’ 플래그가 켜지면 모터제어기의 입력 값은 0이 됩니다. 이 플래그가 켜지더라도 USB나 RS-232, CAN 포트로 내려지는 명령은 처리 됩니다.

’0×4000 – Serial Command’나 ’0×8000 – AI/PI Command’ 플래그는 통신 포트나 I/O 포트로부터 모터 구동 명령이 내려지는 상태로 250ms 동안 ON 상태가 유지됩니다.

※주의※
사용자는 상기 모터의 상태를 잘 확인하고 모터를 구동해야 합니다. 특히 ’0×0004 – Fault Detected’ 상태인 경우 폴트의 원인을 파악하여 적절한 조치를 한 후 모터 구동을 재개해야 합니다.

11.3.2 fault – Fault

모터제어기에서 폴트(Fault)가 발생하면 모터에 공급되는 전원은 차단됩니다. 폴트 상황이 해제되어야만 모터에 전력 공급이 가능합니다. 폴트 상태에서 모터제어기의 구성 파라미터 설정이나 상태 모니터링은 가능하지만 구동 명령은 실행되지 않습니다.
fault는 status의 ‘ 0×0004 – Fault Detected’ 플래그가 켜졌을 때 폴트의 발생 원인을 파악하기 위한 오브젝트 입니다. 다음 목록을 참고하십시오:

0×0001 – Overcurrent
0×0002 – Overvoltage
0×0004 – Undervoltage
0×0008 – Overheat
0×0010 – Short Circuit
0×0020 – Stall Detection
0×0040 – Velocity Error Detection
0×0080 – Position Error Detection

0×0001 – Overcurrent:
모터에 흐르는 전류가 overcurrent_limit에서 설정한 값 이상으로 흘렀습니다. 과전류(Overcurrent)는 다음 중 하나가 원인이 될 수 있습니다:
전압 명령으로 모터를 직접 구동할 때(위치/속도/전류 제어기가 동작하지 않는 상황)
폐루프 전류 제어기의 이득을 잘못 조정한 상태에서 위치, 속도, 전류 명령을 실행할 때
회전 관성이 큰 부하가 연결된 모터를 빠르게 감속하는 경우
0×0002 – Overvoltage:
제어기에 공급되는 전압이 overvoltage_limit에서 설정한 값 이상으로 올라갔습니다. 과전압(Overvoltage)은 다음 중 하나가 원인이 될 수 있습니다:
제어기 전원(배터리, 파워서플라이)로부터 제어기에 높은 전압이 공급되는 경우
회전 관성이 큰 부하가 연결된 모터를 빠르게 감속하는 경우
과전압 상황은 일반적으로 전원으로 배터리가 아닌 파워서플라이가 사용될 경우 모터의 회생전류를 흡수하지 못하여 발생합니다. 이때에는 전원에 제동저항(Brake Resistor) 회로를 구성해야 합니다.
0×0004 – Undervoltage:
제어기에 공급되는 전압이 undervoltage_limit에서 설정한 값 이하로 내려갔습니다. 저전압(Undervoltage)은 다음 중 하나가 원인이 될 수 있습니다:
제어기 전원(배터리, 파워서플라이)으로부터 낮은 전압이 공급되는 경우
회전 관성이 큰 부하가 연결된 모터를 빠르게 가속하는 경우
저전압 상황은 일반적으로 전원의 용량이 낮아 모터의 초기 구동 시 흐르는 높은 전류를 감당하지 못하여 발생합니다. profile_mode를 켜고 acceleration을 낮게 설정하여 모터가 급격히 가속하지 않도록 해야 합니다.
0×0008 – Overheat:
MOSFET와 방열판의 온도가 overheat_limit에서 설정한 값 이상으로 올라갔습니다.
0×0010 – Short Circuit:
모터의 +, – 선이 서로 단락 되었거나 전원과 단락 되었습니다. 또는 MOSFET 스위칭 소자의 파괴로 인해 H-bridge 회로가 잘못된 조합으로 켜진 상태가 되었습니다.
0×0020 – Stall Detection:
모터에 전력이 공급되는 상황에서 모터의 회전이 검출되지 않는 경우 스톨 상황으로 판단합니다. stall_detection 파라미터를 참조하십시오.
0×0040 – Velocity Error Detection:
폐루프 속도제어 모드에서 속도 오차가 커지면 속도제어 에러 상황으로 판단합니다. vel_error_detection 파라미터를 참조하십시오.
0×0080 – Position Error Detection:
위치제어 모드에서 위치 오차가 지정된 값 이상이면 위치제어 에러 상황으로 판단합니다. pos_error_detection 파라미터를 참조하십시오.

11.3.3 temperature –Temperature

temperature 상태는 MOSFET와 방열판의 온도를 나타냅니다.
이 값이 high_temperature 파라미터로 설정한 값 이상으로 올라가면 냉각 팬을 켜 온도 상승을 억제할 수 있습니다. 이 기능을 사용하려면, 제어기의 디지털 출력 포트 중 적어도 하나에 ‘High Temperature (Cooling Fan ON)’ 기능이 선택되어 있어야 합니다.
또한 이 값이 overheat_limit에서 설정한 값 이상으로 올라가면 ’0×0008 – Overheat’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.
※ MOSFET의 내부 온도는 온도 센서에의 해 측정되는 온도보다 훨씬 높을 수 있습니다.

11.3.4 voltage – Voltage

voltage 상태는 모터에 공급되는 전압을 나타냅니다.
이 값이 high_voltage 파라미터로 설정한 값 이상으로 올라가면 제동저항(Brake Resistor)을 켜 전압 상승을 억제할 수 있습니다. 이 기능을 사용하려면, 제어기의 디지털 출력 포트 중 적어도 하나에 ”High Voltage (Brake Resistor ON)’ 기능이 선택되어 있어야 합니다.
또한 이 값이 undervoltage_limit에서 설정한 값 이하로 내려가면 ’0×0004 – Undervoltage’ 폴트를 발생하고 overvoltage_limit에서 설정한 값 이상으로 올라가면 ’0×0002 – Overvoltage’ 폴트를 발생합니다. 그리고 모터는 Power OFF 상태가 됩니다.

11.3.5 current – Current

current 상태는 모터에 흐르는 전류를 나타냅니다. battery_current 오브젝트와 구분하기 바랍니다.
이 값이 overcurrent_delay 시간 동안 overcurrent_limit에서 설정한 값 이상으로 올라가면 ’0×0001 – Overcurrent’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.
또한 이 값이 peakcurrent_ratio x overcurrent_limit 이상으로 한 번이라도 올라가면 ’0×0001 – Overcurrent’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.

11.3.6 velocity – Velocity

velocity 상태는 단위 시간당 모터의 위치 변화량(회전속도)을 나타냅니다. 회전속도를 계산하려면 제어기에 엔코더나 홀센서가 연결되어 있어야 합니다. 또한 회전속도는 ai_potentiometer나 ai_tachometer 로부터 측정되거나 계산될 수 있습니다.

11.3.7 position – Position

position 변수는 모터의 위치를 나타냅니다. 위치를 카운트하려면 제어기에 엔코더나 홀센서가 연결되어 있어야 합니다. 또한 위치는 ai_potentiometer나 ai_tachometer 로부터 측정되거나 계산될 수 있습니다.
feedback_sensor가 ’1 – Encoder’로 설정된 경우 position 변수는 엔코더 카운터를 읽은 값이 됩니다. ’2 – Hall Sensors’로 설정된 경우 홀센서 카운터를 읽은 값이 됩니다.
이 절의 다른 상태 오브젝트와 달리 position은 쓰기 가능합니다. 특정한 값을 쓰면, 이 값은 바로 모터제어기에 적용됩니다. 이 때, 만일 feedback_sensor가 ’2 – Hall Sensors’로 설정되어 홀센서 카운터 값이 위치에 연결되어 있더라도 hall_count 값은 영향을 받지 않습니다.

※주의※
모터가 구동중인 상황에서 위치를 바꾸는 것은 위험한 상황을 초래할 수 있습니다. 값을 바꾸기 전에 반드시 모터는 Power OFF 상태에 있어야 합니다.

11.3.8 hall_count – Hall Count

hall_count 상태는 BLDC 모터에서만 사용됩니다. feedback_sensor가 ’2 – Hall Sensors’로 설정된 경우, 이 상태는 position 변수에 업데이트 됩니다. 그리고 이 값은 엔코더를 대신하여 폐루프 위치 제어기와 속도 제어기의 피드백으로 사용됩니다.

11.3.9 ai_potentiometer – AI Potentiometer

ai_potentiometer 상태는 모터제어기의 위치 피드백 센서 값을 가집니다. 제어기의 아날로그 입력 포트나 펄스 입력 포트 중 하나가 여기로 매핑될 수 있습니다(‘Motor feedback: Position’ 기능 매핑).
feedback_sensor가 ’3 – Potentiometer’로 설정된 경우, 이 상태는 position 변수에 업데이트 됩니다. 그리고 이 값은 엔코더를 대신하여 폐루프 위치 제어기의 피드백으로 사용됩니다.

11.3.10 ai_tachometer – AI Tachometer

ai_tachometer 상태는 모터제어기의 속도 피드백 센서 값을 가집니다. 제어기의 아날로그 입력 포트나 펄스 입력 포트 중 하나가 여기로 매핑될 수 있습니다(‘Motor feedback: Velocity’ 기능 매핑).
feedback_sensor가 ’4 – Tachometer로 설정된 경우, 이 상태는 velocity 변수에 업데이트 됩니다. 그리고 이 값은 엔코더를 대신하여 폐루프 속도 제어기의 피드백으로 사용됩니다.

 

11.4 위치 센서 설정

모터의 회전 위치와 속도를 검출하는데 사용하는 위치센서(Encoder, Hall Sensors)에 대한 설정입니다.

표 11‑4 위치 센서 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
min_position,np 141/0~2 I32 (CP) 모터가 이동 가능한 최소 위치
(단위: pulse, 범위: 0 ~ 음수)
max_position,xp 142/0~2 I32 (CP) 모터가 이동 가능한 최대 위치
(단위: pulse, 범위: 0 ~ 양수)
home_position,hp 143/0~2 I32 (CP) 홈센서 감지 시 position에 로드 되는 위치 값 설정
(단위: pulse)
encoder_ppr,ep 144/0~2 I16 (CP) 모터 1회전당 엔코더 펄스 수
(단위: pulse/rev)
num_pole_pairs,npp 145/0~2 I16 (CP) BLDC 모터에서 홀센서의 폴페어(Pole Pairs) 수
(단위: pulse/rev)
use_soft_limit,usl 146/0~2 I8 (CP) 소프트 리미트 스위치 사용 여부
(기본값: 0)

11.4.1 min_position, max_position – Min, Max Position

min_position과 max_position 파라미터는 모터가 이동 가능한 최소 위치와 최대 위치를 가집니다. 최소 위치는 양수가 될 수 없으며, 최대 위치는 음수가 될 수 없습니다.
use_soft_limit이 켜진 경우, position_command와 home_position 오브젝트는 최소 위치와 최대 위치 범위 내로 조정됩니다.
또한 min_position과 max_position은 encoder_ppr과 함께 사용되어 정규화된 아날로그 입력이나 펄스 입력을 모터제어기의 위치 명령이나 위치 피드백으로 스케일을 변환합니다.

11.4.2 home_position – Home Position

home_position 파라미터는 디지털 입력 포트에 연결된 홈 센서 감지 시 position에 로드 되는 위치 값을 가집니다.
모터의 홈 위치는 다음과 같이 결정합니다:

1. home_position에 모터의 홈 위치를 설정합니다
2. 전압 명령으로 모터를 천천히 움직입니다.
3. 홈 센서가 트리거 되면 position에 home_postion 값이 로드 됩니다.
4. 0V 전압 명령으로 모터를 정지합니다.

11.4.3 encoder_ppr – Encoder PPR

encoder_ppr 파라미터는 모터가 1회전할 때 카운트 되는 엔코더 펄스 수입니다. 모터제어기는 엔코더의 A/B상 펄스 수를 4체배 하여 카운트 합니다.
모터의 엔코더 펄스 수를 모르는 경우는, 모터를 Power OFF 하고 손으로 모터 축을 한 바퀴 돌렸을 때 카운트 되는 펄스 수를 사용하면 됩니다. 감속기가 적용된 모터에서는 감속비를 고려해야 합니다.

※ 이 파라미터는 모터의 회전속도 계산에 사용됩니다. 그리고 min_position, max_position과 함께 정규화된 아날로그 입력이나 펄스 입력을 모터제어기의 위치 명령이나 위치 피드백으로 스케일을 변환하는데도 사용되기 때문에, 모터제어기에 엔코더가 연결되지 않은 경우에도 필히 설정되어야 하는 값입니다.

11.4.4 num_pole_pairs – Number of Pole Pairs

num_pole_pairs 파라미터는 BLDC모터에서 홀센서(Hall Sensors)의 폴페어(Pole Pairs) 수입니다. 모터가 1회전 하였을 때 발생하는 펄스 수는 6 x num_pole_pairs가 됩니다. 이 파라미터는 BLDC 모터의 속도 계산에 사용될 수 있습니다. BLDC 모터 제어기에서 엔코더를 사용하지 않고 홀센서 만으로 위치 제어와 속도 제어를 수행하는 경우 이 값은 올바르게 설정되어야 합니다. 그렇지 않은 경우 모터의 속도를 정확히 계산할 수 없습니다. 만일 엔코더를 사용하는 BLDC 모터라면 이 값은 제어기의 동작에 영향을 미치지 않습니다.

11.4.5 use_soft_limit – Use Soft Limit

use_soft_limit는 소프트 리미트 스위치의 사용 여부를 결정합니다. 소프트 리미트 스위치는 실제 제어기의 디지털 입력 포트에 연결된 센서가 아니라, 소프트웨어적으로 설정된 리미트 범위를 벗어나는지에 대해 리미트 스위치의 ON/OFF 상태를 에뮬레이션 합니다.
이 값으로 다음 중 하나를 선택합니다:

0 – 소프트 리미트 사용하지 않음 (기본값)
1 – 소프트 리미트 사용함

이 값이 1로 설정된 경우, 모터의 위치(position)가 min_position과 max_position 범위를 벗어나면 리미트 스위치가 동작한 것과 같은 효과를 내도록 합니다.

 

11.5 모터 속성 설정

이 절은 모터의 특성과 모터에 연결된 부하의 특성에 따라 결정되는 오브젝트들에 대하여 설명합니다.

표 11‑5 모터 속성 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
max_current, xc 151/ 0~2 F32 (CP) 모터에 흐르는 최대 연속 전류 (단위: A)
max_voltage, xvt 152/ 0~2 F32 (CP) 모터에 가해지는 최대 전압 (단위: V)
max_velocity, xv 153/ 0~2 F32 (CP) 모터의 최대 회전 속도 (단위: RPM)
acceleration, ac 154/ 0~2 F32 (CP) 모터의 회전 가속도 (단위: RPM/s)
deceleration, dc 155/ 0~2 F32(CP) 모터의 회전 감속도 (단위: RPM/s)

※주의※
모터의 속성에 관련된 구성 파라미터들은 제어기와 모터를 안전하게 운용하기 위해 올바른 값들로 설정되어야 합니다. 모터의 데이터시트를 참고하여 모터 정격에 맞게 설정하기 바랍니다.

11.5.1 max_current – Max Current
max_current 파라미터에는 모터에 연속해서 흘릴 수 있는 최대 전류를 설정합니다. 이 값은 overcurrent_limit 보다 낮게 설정되어야 합니다.
위치제어나 속도제어 모드에서 폐루프 전류제어기는 모터에 흐르는 전류가 max_current를 넘지 않는 범위 내에서 제어합니다.

11.5.2 max_voltage – Max Voltage
max_voltage 파라미터에는 모터에 가해질 수 있는 최대 전압을 설정합니다. 이 값은 overvoltage_limit 보다 낮게 설정되어야 합니다.
위치제어나 속도제어, 전류제어, 전압 출력 모드에서 모터에 가해지는 전압은 max_voltage를 넘지 않도록 제한됩니다.

11.5.3 max_velocity – Max Velocity
max_velocity 파라미터는 모터의 최대 회전속도를 설정합니다.
위치제어 모드에서 폐루프 속도제어기는 모터의 속도가 max_velocity를 넘지 않는 범위 내에서 제어합니다.

11.5.4 acceleration, deceleration – Acceleration, Deceleration
acceleration과 deceleration 파라미터에는 각각 모터의 회전 가속도와 감속도를 설정합니다.
profile_mode가 1로 설정되어 있는 경우, 가속도와 감속도는 위치제어, 속도제어, 전압출력 모드에서 속도 프로파일을 만드는데 사용됩니다.

 

11.6 모터 구동 한계 설정

이 절에서는 모터의 구동 한계를 설정하는 오브젝트들에 대해 다룹니다.

표 11‑6 모터 구동 한계 설정 오브젝트

 Long name, Short name  Index/ Sub-index  Type  Description
 overheat_limit, ohl  161/0~2  F32 (CP)  FET와 방열판의 과열 한계 (단위: °C)
 overcurrent_limit, ocl  162/0~2  F32 (CP)  모터의 과전류 한계 (단위: A)
 overcurrent_delay, ocd  163/0~2  I16 (CP)  과전류 허용 지연 시간 (단위: ms)
 peakcurrent_ratio, pcr  164/0~2  F32 (CP)  모터의 순간 피크 전류 (단위: %)
  overvoltage_limit, ovl  165/0~2  F32 (CP)  전원단의 과전압 한계 (단위: V)
 undervoltage_limit, uvl  166/0~2  F32 (CP)  전원단의 저전압 한계 (단위: V)

모터의 상태(전압, 전류, 열 등)가 한계를 벗어나는 경우에 폴트(Fault)를 발생하고 모터는 Power OFF 상태가 됩니다.

11.6.1 overheat_limit – Overheat Limit
overheat_limit 파라미터는 방열판의 과열(Overheat) 상황을 감지하기 위한 최대 한계 온도를 설정합니다.
MOSFET와 방열판의 온도(temperature)가 overheat_limit를 넘어갈 경우, ’0×0008- Overheat’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.
이 파라미터는 MOSFET와 방열판의 열 전달을 고려하여 값을 설정해야 합니다. MOSFET의 온도는 온도 센서에의 해 측정되는 온도보다 훨씬 높을 수 있습니다.

11.6.2 overcurrent_delay, overcurrent_limit – Overcurrent Limit, Overcurrent Delay
overcurrent_delay와 overcurrent_limit 파라미터는 모터의 과전류(Overcurrent) 상황을 감지하기 위한 최대 한계전류를 설정합니다.
모터에 흐르는 전류(current)가 overcurrent_delay 동안 overcurrent_limit 값을 넘어갈 경우, ’0×0001 – Overcurrent’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.
overcurrent_limit 값은 max_current보다 120% 이상 높게 설정되어야 합니다. 모터의 전류 측정값에는 정류자에서 발생하는 아크 및 MOSFET 스위칭시 발생하는 전압 스파이크에 의해 노이즈가 많이 포함되어 있습니다. 만일 overcurrent_limit과 max_current 간에 값의 차이가 미소하다면 노이즈로 인해 폴트가 발생할 가능성이 높습니다.

11.6.3 peakcurrent_ratio – Peak Current Ratio
peakcurrent_ratio 파라미터는 모터의 과전류(Overcurrent) 상황을 감지하기 위한 피크 전류를 설정합니다.
모터에 흐르는 전류(current)가 한 순간이라도 peakcurrent_ratio x overcurrent_limit 값을 넘어갈 경우, ’0×0001 – Overcurrent’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.

11.6.4 overvoltage_limit – Overvoltage Limit
overvoltage_limit 파라미터는 모터의 과전압(Overvoltage) 상황을 감지하기 위한 최대 한계 전압을 설정합니다.
전원에서 공급되는 전압이 overvoltage_limit 값을 넘어갈 경우, ’0×0002 – Overvoltage’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.

11.6.5 undervoltage_limit – Undervoltage Limit
undervoltage_limit 파라미터는 모터의 저전압(Undervoltage) 상황을 감지하기 위한 최소 한계 전압을 설정합니다.
전원에서 공급되는 전압이 undervoltage_limit 값 아래로 내려갈 경우, ’0×0004 – Undervoltage’ 폴트를 발생하고 모터는 Power OFF 상태가 됩니다.

 

11.7 모터 구동오류 감지조건 설정

이 절에서는 모터에 구동 명령이 인가되었는데 모터가 정지해 있거나 명령을 추종하지 못하는 상황을 감지하기 위한 오브젝트들에 대해 설명합니다.

표 11‑7 모터 구동오류 감지조건 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
stall_detection, sd 167/0~2 I8 (CP) 모터의 구동 명령에 대해 움직이지 않는 상황 감지
(기본값: 0)
vel_error_detection, ved 168/0~2 I8 (CP) 폐루프 속도제어기에서 명령과 피드백 사이의
오차에 의한 이상 감지 (기본값: 0)
pos_error_detection, ped 169/0~2 I8 (CP) 폐루프 위치제어기에서 명령과 피드백 사이의
오차에 의한 이상 감지 (기본값: 0)

11.7.1 stall_detection – Stall Detection

stall_detection 파라미터는 모터의 구동 명령에 대해 움직이지 않는 상황을 감지하기 위한 조건을 설정합니다.
지정된 시간 동안 모터에 지정된 전압(PWM 듀티비로 전압 생성) 이상이 가해지는데도 모터가 회전하지 않으면 스톨(stall) 상황으로 감지합니다. 그리고 ’0×0020 – Stall Detection’ 폴트를 발생하며 모터를 Power OFF 합니다.
이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – Not used (기본 값)
1 – 100ms at 10% PWM duty ratio
2 – 200ms at 20% PWM duty ratio
3 – 400ms at 30% PWM duty ratio
4 – 700ms at 40% PWM duty ratio
5 – 1s at 50% PWM duty ratio

스톨 감지 기능은 모든 구동모드(폐루프 위치제어, 속도제어, 전류제어 모드 및 개루프 전압 출력 모드)에서 활성화 됩니다. 또한 엔코더나 홀센서와 같은 위치를 읽기 위한 센서가 제어기에 연결되어야 합니다.

11.7.2 vel_error_detection – Velocity Error Detection

vel_error_detection 파라미터는 폐루프 속도제어기에서 명령과 피드백 사이의 오차에 의한 이상을 감지하기 위한 조건을 설정합니다.
폐루프 속도제어기에서 지정된 시간 동안 명령 속도와 피드백 속도의 오차가 지정된 속도보다 커지면 속도에러 상황으로 감지합니다. 그리고 ’0×0040 – Velocity Error Detection’ 폴트를 발생하고 모터를 Power OFF 합니다.
이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – Not used (기본값)
1 – 100ms and error > 100 RPM
2 – 200ms and error > 200 RPM
3 – 400ms and error > 500 RPM
4 – 700ms and error > 1500 RPM
5 – 1s and error > 3000 RPM

속도에러 감지 기능은 폐루프 위치제어와 속도제어 모드에서 활성화 됩니다. 또한 엔코더나 홀센서와 같은 위치를 읽기 위한 센서가 제어기에 연결되어야 합니다.

※ 만일 속도 명령이 드문드문 불연속적으로 내려지는 경우에는 Velocity Error Detection 기능을 사용하지 않는 것이 좋습니다. 명령이 내려질 때 큰 속도오차가 발생하여 폴트가 발생하게 됩니다.

11.7.3 pos_error_detection – Position Error Detection

pos_error_detection 파라미터는 폐루프 위치제어기에서 명령과 피드백 사이의 오차에 의한 이상을 감지하기 위한 조건을 설정합니다.
폐루프 위치제어기에서 지정된 시간 동안 명령 위치와 피드백 위치의 오차가 지정된 거리보다 커지면 위치에러 상황으로 감지합니다. 그리고 ’0×0080 – Position Error Detection’ 폴트를 발생하고 모터를 Power OFF 합니다.
이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – Not used (기본값)
1 – 100ms and error > 100 pulse
2 – 200ms and error > 500 pulse
3 – 400ms and error > 2000 pulse
4 – 700ms and error > 5000 pulse
5 – 1s and error > 20000 pulse

위치에러 감지 기능은 폐루프 위치제어 모드에서 활성화 됩니다. 또한 엔코더나 홀센서와 같은 위치를 읽기 위한 센서가 제어기에 연결되어야 합니다.

※ 만일 위치 명령이 드문드문 불연속적으로 내려지는 경우에는 Position Error Detection 기능을 사용하지 않는 것이 좋습니다. 명령이 내려질 때 큰 위치오차가 발생하여 폴트가 발생하게 됩니다.

 

11.8 모터 및 I/O 구동관련 설정

이 절에서는 모터 및 I/O의 구동에 관련된 오브젝트들에 대해 설명합니다.

표 11‑8 모터 및 I/O 구동 관련 설정

Long name, Short name Index/Sub-index Type Description
startup_power_on, spo 173/ 0~2 I8 (CP) 제어기가 시작될 때 모터 Power ON/OFF 설정
(기본값: 1)
direction, dir 174/ 0~2 I8 (CP) 모터의 정방향/역방향 회전 설정 (기본값: 0)
brake_on_delay, bod 175/ 0~2 I16 (CP) 브레이크 작동 시 지연시간 설정
(단위: ms, 기본값: 0, 범위: 0 ~ 30000)
high_voltage, hv 176/ 0~2 I16 (CP) 제동저항(Brake Resistor)을 켜는 전압 설정
(단위: V)
high_temperature, ht 177/ 0~2 I16 (CP) 냉각 팬을 켜는 온도 설정 (단위: °C)

11.8.1 startup_power_on – Startup Power ON

startup_power_on 파라미터는 제어기가 시작될 때 모터의 Power ON/OFF를 결정합니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – Disable
1 – at Start-up Controller (기본값)
2 – when Motor Power OFFed

’0 – Disable’로 설정된 경우, 제어기가 시작될 때 모터는 Power OFF 상태가 됩니다.
’1 – at Start-up Controller’로 설정된 경우, 제어기가 시작될 때에만 모터 Power ON 상태로 전환을 시도합니다. Power ON에 관련된 모든 조건이 만족되면 모터는 Power ON 상태가 되고 그렇지 않으면 Power OFF 상태에 머무르게 됩니다.
’2 – when Motor Power OFFed’로 설정된 경우, 모터가 Power OFF 상태가 될 때마다 Power ON 상태로 전환을 시도합니다. 이러한 시도는 위험한 상황을 초래할 수 있기 때문에 특별한 경우를 제외하고는 되도록 사용하지 않는 것이 좋습니다.

11.8.2 direction – Direction
direction은 모터의 회전 방향과 엔코더의 카운트 방향을 결정합니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – Not Change (기본값)
1 – Reverse Direction

듀얼 채널 제어기를 이동로봇에 사용하는 경우, 이 설정은 효과적입니다. 이동로봇의 좌우 바퀴에 연결되는 두 모터는 서로 등지도록 장착되기 때문에, 같은 속도 명령에 대해 두 모터의 회전 방향은 반대가 됩니다. 이럴 경우 한 쪽 모터의 direction을 1로 설정하여 회전 방향을 반대로 설정합니다.

※주의※
direction의 값이 1로 설정된 경우 모터에 가해지는 전압의 부호를 바꿉니다. 그리고 엔코더도 반대로 카운트(증가 카운트인 경우 감소 카운트로, 감소 카운트인 경우 증가 카운트로 바꿈) 합니다. 모터에 양의 전압을 가했을 때 엔코더가 감소 카운트 되는 경우에 혹은 이와 반대의 경우에, 이를 바로잡기 위해 direction 설정을 사용하면 안됩니다.

11.8.3 brake_on_delay – Brake ON Delay
brake_on_delay 파라미터의 변경은 모터에 전원이 차단된 시점부터 브레이크를 활성화하기까지의 지연 시간을 설정합니다.
이 기능을 사용하려면, 제어기의 디지털 출력 포트 중 적어도 하나에 ‘Motor Power ON (Brake Release)’ 기능이 선택되어 있어야 합니다.

11.8.4 high_voltage – High Voltage
high_voltage 파라미터의 변경은 모터의 역기전력으로 인한 파워 소스 및 제어기의 파손을 방지하기 위한 허용 전압을 설정합니다. 제어기의 전원단 전압이 상승하여 이 파라미터로 설정한 값 이상이 되면 제동저항(Brake Resistor)을 켜 전압의 상승을 억제합니다.
이 기능을 사용하려면, 제어기의 디지털 출력 포트 중 적어도 하나에 ‘High Voltage (Brake Resistor ON)’ 기능이 선택되어 있어야 합니다. 그리고 역기전력을 열로 소모하기에 충분한 용량의 션트 저항과 관련 회로가 필요합니다.

11.8.5 high_temperature – High Temperature
high_temperature 파라미터의 변경은 제어기 온도가 너무 높아 고장이 나거나 오작동 하는 것을 방지하기 위한 허용 온도를 설정합니다. 제어기의 방열판 온도가 상승하여 이 파라미터로 설정한 값 이상이 되면 냉각 팬을 켜 온도 상승을 억제합니다.
이 기능을 사용하려면, 제어기의 디지털 출력 포트 중 적어도 하나에 ‘High Temperature (Cooling Fan ON)’ 기능이 선택되어 있어야 합니다. 그리고 제어기의 열을 식히기에 충분한 냉각 팬과 관련 회로가 필요합니다.

 

11.9 폐루프 제어 설정

이 절에서는 폐루프 제어와 관련된 구성 파라미터들에 대해 설명합니다.

표 11‑9 폐루프 제어 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
feedback_sensor, fs 171/ 0~2 I8 (CP) 제어기 피드벡 센서 선택 (기본값: 1)
profile_mode, pm 172/ 0~2 I8 (CP) 속도 명령에 사다리꼴 프로파일 적용여부
(기본값: 1)

11.9.1 feedback_sensor – Feedback Sensor

feedback_sensor 파라미터의 변경은 폐루프 위치제어기와 속도제어기의 피드백 값을 읽을 센서를 결정합니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – None
1 – Encoder (기본값),
2 – Hall Sensors
3 – Potentiometer
4 – Tachometer

’3 – Potentiometer’로 설정된 경우, ai_potentiometer 값은 위치제어기의 피드백으로 사용됩니다. 이때 입력 범위 -1과 1 사이 값은 min_position과 max_position 사이 값으로 스케일 조정됩니다.
’4 – Tachometer’로 설정된 경우, ai_tachometer 값은 속도제어기의 피드백으로 사용됩니다. 이때 입력 범위 -1과 1 사이 값은 -max_velocity와 max_velocity 사이 값으로 스케일 조정됩니다.

11.9.2 profile_mode – Profile Mode
프로파일 모드의 사용 목적은 기본적으로 모터나 모터가 연결된 시스템에 급격한 속도 변화로 인한 충격을 방지하는데 있습니다. 프로파일 생성기는 속도 명령이 급격하게 변하더라도 일정한 가속도와 감속도가 적용된 속도 프로파일을 생성하게 됩니다.
profile_mode는 위치제어와 속도제어 모드에서 사다리꼴 속도 프로파일의 사용 여부를 결정 합니다. 이 파라미터의 값으로 다음 중 하나를 선택합니다:

0 – None
1 – Trapezoidal Velocity Profile Mode (기본값)

profile_mode가 1로 설정된 경우, 사다리꼴 속도 프로파일의 가속과 감속 구간의 기울기는 acceleration과 deceleration에 의해 결정되고 최고 속도는 max_velocity에 의해 결정됩니다.

 

11.10 위치 제어기 이득 설정

폐루프 위치제어기는 기본적으로 PID 제어기로 구성됩니다. 이 절은 PID 제어기의 이득에 대해 설명합니다.

표 11‑10 위치 제어기 이득 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
pc_kp, pp 191/ 0~2 F32 (CP) PID 위치제어기의 비례제어 이득
pc_ki, pi 192/ 0~2 F32 (CP) PID 위치제어기의 적분제어 이득
pc_kd, pd 193/ 0~2 F32 (CP) PID 위치제어기의 미분제어 이득

11.10.1 pc_kp, pc_ki, pc_kd – Kp, Ki, Kd

폐루프 위치제어기에 사용되는 PID 제어기의 비례제어 이득 pc_kp와 적분제어 이득 pc_ki, 미분제어 이득 pc_kd을 설정합니다.
폐루프 위치제어기의 이득 설정에 대한 자세한 내용은 “7.4.3 위치 제어기 PID 이득 조정”을 참고하기 바랍니다.
※ 각각의 이득은 제어기 동작 중에도 변경이 가능합니다. 하지만 제어기 동작 중 이득을 변경하는 것은 제어기의 출력이 갑자기 변하게 되어 위험한 상황을 초래할 수 있습니다.

 

11.11 속도 제어기 이득 설정

폐루프 속도제어기는 기본적으로 PI 제어기로 구성됩니다. 이 절은 PI 제어기의 이득에 대해 설명합니다.

표 11‑11 속도 제어기 이득 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
vc_kp, vp 186/ 0~2 F32 (CP) PI 속도제어기의 비례제어 이득
vc_ki, vi 187/ 0~2 F32 (CP) PI 속도제어기의 적분제어 이득
vc_ks, vff 190/ 0~2 F32 (CP) 속도 레퍼런스에 대한 스케일 펙터

11.11.1 vc_kp, vc_ki – Kp, Ki

폐루프 속도 제어기에 사용되는 PI 제어기의 비례제어 이득 vc_kp과 적분제어 이득 vc_ki을 설정합니다.
폐루프 속도제어기의 이득 설정에 대한 자세한 내용은 “7.4.2 속도 제어기 PI 이득 조정”을 참고하기 바랍니다.
※ 각각의 이득은 제어기 동작 중에도 변경이 가능합니다. 하지만 제어기 동작 중 이득을 변경하는 것은 제어기의 출력이 갑자기 변하게 되어 위험한 상황을 초래할 수 있습니다.

11.11.2 vc_ks – Ks
vc_ks 파라미터의 변경은 폐루프 속도 제어기에서 속도 레퍼런스에 대한 스케일팩터를 설정합니다.
만약 속도 제어기의 비례제어 이득과 적분제어 이득이 0이고 스케일팩터가 어떠한 값을 가진다면, 속도 제어기 내부의 PI 제어기는 동작하지 않고 속도 레퍼런스에 이득 vc_ks만 곱해져 출력으로 내보내는 개루프 속도제어기로 동작합니다.
개루프 속도제어기는 엔코더의 해상도가 너무 낮거나 포텐셔미터와 같이 속도를 측정하기 어려운 센서가 위치제어 피드백으로 사용될 때 속도제어기를 바이패스 하기 위해 사용합니다.

11.12 전류 제어기 이득 설정

폐루프 전류제어기는 기본적으로 PI 제어기로 구성됩니다. 이 절은 PI 제어기의 이득에 대해 설명합니다.

표 11‑12 전류 제어기 이득 설정

Long name, Short name Index/ Sub-index Type  Description
 cc_kp, cp  181/ 0~2  F32 (CP)  PI 전류제어기의 비례제어 이득
 cc_ki, ci  182/ 0~2  F32 (CP)  PI 전류제어기의 적분제어 이득
 cc_kff, cff  185/ 0~2  F32 (CP)  PI 전류제어기의 모터 회전속도 전향 보상 이득

11.12.1 cc_kp, cc_ki – Kp, Ki

폐루프 전류제어기에 사용되는 PI 제어기의 비례제어 이득 cc_kp와 적분제어 이득 cc_ki를 설정합니다.
폐루프 전류제어기의 이득 설정에 대한 자세한 내용은 “7.4.1 전류 제어기 PI 이득 조정”을 참고하기 바랍니다.

※ 각각의 이득은 제어기 동작 중에도 변경이 가능합니다. 하지만 제어기 동작 중 이득을 변경하는 것은 제어기의 출력이 갑자기 변하게 되어 위험한 상황을 초래할 수 있습니다.

11.12.2 cc_kff – Kff

cc_kff 파라미터의 변경은 모터의 회전속도로부터 역기전력을 전향 보상하기 위한 이득을 설정합니다.
모터의 역기전력은 모터의 회전속도에 역기전력 상수를 곱해 계산 가능합니다. 그러므로 cc_kff는 역기전력 상수와 유사한 값을 가질 것입니다.

※ 역기전력 상수로부터 cc_kff를 계산할 때 단위 변환에 주의해야 합니다.

 

MoonWalker Series Motor Controllers User’s Manual 10. 제어기 오브젝트

MW001

MW001

MoonWalker Series

Motor Controllers

User’s Manual

MW-MDC24D100S / MW-MDC24D100D

MW-MDC24D200S / MW-MDC24D200D

MW-MDC24D500S / MW-MDC24D500D

 ※ 사용자 매뉴얼에 포함된 정보는 정확하고 신뢰성이 있는 내용입니다. 그러나 출판 당시 발견되지 않은 오류가 있을 수 있으니 사용자는 자신의 제품 검증을 수행하시기 바라며, 전적으로 사용자 매뉴얼에 포함된 정보에 의존하지 마시기 바랍니다.

10. 제어기 오브젝트

이 장에서는 제어기의 제품 정보와 버전, 통신, 스크립트에 관련된 오브젝트들(상수와 명령, 상태, 구성 파라미터)에 대해서 설명합니다.

MW052
그림 10‑1 Controller Objects

제어기가 가지고 있는 오브젝트들을 모두 표시하면 상기 그림과 같습니다. 이 중, 모터제어 오브젝트(Motor Control Object)와 디지털/아날로그 입출력 오브젝트(I/O Objects: Analog Input, Pulse Input, Digital Input, Digital Output)에 대해서는 11장과 12장에서 설명합니다. 이번 장에서는 이 둘을 제외한 오브젝트들에 대해 설명합니다.

10.1 제품 ID 및 버전 정보
제품 ID 및 소프트웨어/하드웨어 버전은 상수 오브젝트로 읽기만 가능합니다. 이 상수들은 제품 생산 시 결정되며 사용자가 바꿀 수 없습니다.

표 10‑1 제품 ID 및 버전 정보 오브젝트

Long name, Short name Index/ Sub-index Type Description
vendor_id,vid 1/0 I32(CN) 제품 공급자 ID
product_id,pid 2/0 I32(CN) 제품 ID
software_version,swv 3/0 F32(CN) 제어기 펌웨어 버전
hardware_version,hwv 4/0 F32(CN) 제어기 하드웨어 버전

상기 표에서 Long Name과 Short Name은 텍스트 모드에서 오브젝트를 엑세스 할 수 있도록 부여된 이름입니다. 그리고 Index와 Sub-index는 오브젝트를 엑세스 하기 위한 주소입니다.

Type 열은 오브젝트의 형식을 나타냅니다:

·  I8 – 부호를 가지는 8bit 정수형 수
·  I16 – 부호를 가지는 16bit 정수형 수
·  I32 – 부호를 가지는 32bit 정수형 수
·  F32 – 부호를 가지는 32bit 실수형 수

Type 열의 괄호 안 표기는 다음과 같습니다:

·  (CN) – 상수(Constant) 오브젝트
·  (CM) – 명령(Command) 오브젝트
·  (ST) – 상태(Status) 오브젝트
·  (CP) – 구성 파라미터(Configuration Parameter) 오브젝트
(VA) – 변수(Variable) 오브젝트

10.1.1 vendor_id – Vendor ID

vendor_id는 제품 공급자 ID를 가집니다. 현재는 0으로 고정되어 있습니다.

10.1.2 product_id – Product ID

product_id는 제품의 ID를 가집니다. 현재 제어기에 적용된 제품 ID는 다음과 같습니다:

·  101 – 소형 싱글 채널 DC모터 드라이버 (30V, 3A)
·  102 – 소형 듀얼 채널 DC모터 드라이버 (30V, 3A)
·  201 – 중형 싱글 채널 DC모터 드라이버 (30V, 10A)
·  202 – 중형 듀얼 채널 DC모터 드라이버 (30V, 10A)
·  301 – 대형 싱글 채널 DC모터 드라이버 (50V, 80A)
·  302 – 대형 듀얼 채널 DC모터 드라이버 (50V, 40A)

또한, Motor Control UI 유틸리티가 제어기의 종류를 구분하기 위해 사용합니다. 새로운 제품이 출시됨에 따라 제품 ID의 종류는 늘어날 수 있습니다.

10.1.3 software_version – Software Version

software_version은 제어기의 펌웨어 버전 넘버를 가집니다. 버전은 다음과 같이 소수점을 기준으로 상위 1~2자리와 하위 2자리로 구분됩니다.

소프트웨어 버전: XX.YY

XX는 메이저 버전이고 YY는 마이너 버전입니다. 메이저 버전이 변경된 경우에는 제어기와 Motor Control UI 유틸리티 및 기타 응용 소프트웨어들간에 호환되지 않습니다. 제어기와 관련 소프트웨어들이 서로 호환되는 범위 내에서 마이너 버전은 변경될 수 있습니다.
소프트웨어 버전은 제어기의 생산 일자에 따라 달라질 수 있으며 제어기에 최신 펌웨어를 업데이트 하는 경우에도 달라질 수 있습니다.

10.1.4 hardware_version – Hardware Version

hardware_version은 제어기의 하드웨어 버전 넘버를 가집니다. 버전은 다음과 같이 소수점을 기준으로 상위 1~2자리와 하위 2자리로 구분됩니다.

하드웨어 버전: XX.YY

XX는 메이저 버전이고 YY는 마이너 버전입니다. 메이저 버전이 변경된 경우에는 제어기와 Motor Control UI 유틸리티 및 기타 응용 소프트웨어들간에 호환되지 않습니다.
하드웨어 버전은 제어기의 생산 일자에 따라 달라질 수 있습니다.

10.2 제어기 명령 및 상태

제어기에 명령을 내리고 상태를 모니터링 합니다.

표 10‑2 제어기 명령 및 상태 오브젝트

 Long name, Short name  Index/ Sub-index  Type  Description
 system_status, sst  5/0  I32(CN)  제어기의 운용 상태
 system_command, sco  7/0  I16(CM)  제어기에 내려지는 명령

10.2.1 system_status – System Status

system_status는 제어기의 운용 상태를 가집니다. 각 비트에 따라 운용 상태는 다음과 같습니다:

·  0×10000 – Script Running

0×10000 – Script Running:
스크립트가 실행 중임을 표시합니다. 모터제어기의 status 오브젝트의 ‘Script Running’ 플래그와 동일합니다.

10.2.2 system_command – System Command

system_command에 명령 코드를 쓰는 것으로 제어기의 특정 기능을 실행할 수 있습니다. 다음은 명령 코드 목록입니다:

·  1 – Save properties in Flash Memory
·  2 – Load properties from Flash Memory
·  3 – Save Script’s Byte codes in Flash Memory
·  8 – Script Run
·  9 – Script Stop
·  98 – Reset to Factory Default
·  99 – Reset Controller

1 – Save properties in Flash Memory:
제어기의 각종 오브젝트 값을 변경하면, 변경된 값들은 RAM에 기록되어 제어기가 켜져 있는 동안만 유지됩니다. 그리고 제어기가 재시작 되면 이 값들은 소실되고 플래시 메모리에 저장된 값을 RAM으로 읽어 들이게 됩니다. 그렇기 때문에 오브젝트 값을 변경하고 계속 유지가 되기를 바란다면, ’1 – Save properties in Flash Memory’ 명령 코드를 사용하여 변경한 오브젝트들의 값을 플래시 메모리에 저장해야 합니다.

2 – Load properties from Flash Memory:
이 명령 코드는 제어기의 오브젝트들에 현재 설정된 값을 무시하고 플래시 메모리에 저장된 값을 읽어와 덮어씁니다.

3 – Save Script’s Bytecodes in Flash Memory:
스크립트의 바이트코드를 제어기에 다운로드 하면 일시적으로 RAM영역에 저장됩니다. 이 명령 코드로 RAM 영역에 저장된 바이트코드를 플래시 메모리 영역으로 옮겨야 합니다. 이는 PC에서 RAM 영역의 프로그램을 하드디스크에 저장하는 것과 같습니다.

8 – Script Run, 9 – Script Stop:
스크립트와 관련된 또 다른 명령으로는 ’8 – Script Run’과 ’9 – Script Stop’ 명령 코드가 있습니다. 이 두 명령 코드는 각각 스크립트를 실행하고 중단하는 명령입니다.

98 – Reset to Factory Default:
이 명령 코드는 제어기에 현재 설정된 모든 오브젝트들의 값을 무시하고 제품 초기 설정 값(Factory Default Value)으로 복구합니다. 이 명령을 실행하면, RAM 및 플래시 메모리에 있는 모든 값들이 제품 초기 설정 값으로 복구됩니다.

99 – Reset Controller:
이 명령 코드는 제어기를 소프트웨어적으로 리셋 시킵니다. 제어기의 전원을 껐다 켜는 것과 같습니다.

10.3 배터리 상태

제어기에 공급되는 전원의 소스는 주로 배터리 혹은 파워서플라이가 되는데, 매뉴얼에서는 이를 따로 구분하지 않고 배터리로 통칭하여 설명합니다.

표 10‑3 배터리 상태 오브젝트

 Long name, Short name  Index/ Sub-index  Type  Description
 battery_voltage, bv  8/0  F32 (ST)  전원 소스로부터 제어기에 공급되는 전압(단위: V)
 battery_current, bc  9/0  F32 (ST)  전원 소스로부터 제어기를 통과해 흐르는 전류 (단위: A)

10.3.1 battery_voltage – Battery Voltage

battery_voltage는 전원(파워서플라이, 배터리)으로부터 제어기에 공급되는 전압을 나타냅니다.
battery_voltage가 모터제어기의 undervoltage_limit과 overvoltage_limit 범위를 벗어나는 경우, 모터의 폴트(Fault)를 발생합니다. 또한 high_voltage보다 높은 경우, 디지털 출력을 트리거 하는데도 사용됩니다.

10.3.2 battery_current – Battery Current

battery_current는 전원으로부터 제어기를 통과해서 흐르는 전류를 나타냅니다.
battery_current는 전원의 공급 선로에서 직접 측정되지 않습니다. 제어기의 회로가 소비하는 전류와 각 모터에서 소비하는 전류의 합으로 계산됩니다. 모터에서 소비하는 전류는 “6.2.3 전류 측정 방식”에서 설명한 것과 같이 모터 전류로부터 계산된 값입니다. 이 때문에 전원 공급장치에서 표시되는 전류와 battery_current는 차이가 날 수 있습니다.

10.4 통신 설정

이 절에서는 PC 및 마이크로컨트롤러와 제어기를 연결하는 USB, RS-232, CAN 포트의 통신 설정에 대해 다룹니다.

표 10‑4 통신 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
device_id, id 11/0 I32 (CP) 장치 ID (범위: 1 ~ 255, 기본값: 1)
can_br, cb 12/0 I32 (CP) CAN 통신 속도 (기본값: 1000)
serial_bps, sb 13/1 I32 (CP) RS-232 통신 속도 (기본값: 115200)
13/2 I32 (CP) USB 통신 속도 (기본값: 115200)
serial_watchdog, sw 14/0 I32 (CP) CAN, USB, RS-232 포트로 수신되는 명령어 패킷에
대한 와치독 타이머 타임아웃 값
(단위: ms, 범위: 0~10000, 기본값: 0)

 ※ device_id, can_br, serial_bps 값을 변경한 경우에는 제어기를 새로 시작(제어기 전원을 끄고 켜거나 제어기를 리셋)하여야 변경된 값이 적용됩니다.

10.4.1 deice_id – Device ID

CAN 또는 RS-422, RS-485 버스에는 여러 제어기가 동시에 연결되어 통신 선로를 서로 공유합니다. 이때, Device ID는 각각의 제어기를 구분하기 위한 ID 값입니다. 그러므로 하나의 통신 선로에 연결된 제어기의 Device ID는 모두 달라야 합니다.

제품 초기 설정 값(Factory Default Value)으로 제어기의 device_id 파라미터는 1로 설정되어 있습니다. 이 값은 0과 255사이의 값으로 변경될 수 있습니다. 보통 마스터가 되는 PC나 마이크로컨트롤러의 Device ID로 0을 설정하기 때문에, 제어기에서 device_id로 0을 사용하는 것은 피해야 합니다.

만일 CAN 버스에 한 개 이상의 장치(모터제어기 외 다른 장치를 포함)를 연결한다면, 먼저 제어기의 USB 포트로 Motor Control UI 유틸리티를 연결합니다. 그리고 Configuration 탭에서 Serial/CAN Communication 그룹의 Device ID를 서로 중복되지 않도록 변경해야 합니다.

PC나 마이크로컨트롤러에 USB나 RS-232 포트를 통해 하나의 제어기만 연결하는 경우, 이 값을 변경하지 않고 기본 설정 값을 사용하여도 상관없습니다.

10.4.2 can_br – CAN Bitrate

만일 제어기를 CAN 버스에 연결한다면, CAN 버스에 연결되는 모든 제어기는 서로 통신 속도가 일치해야 합니다. can_br 은 CAN 통신 속도를 설정합니다.

can_br 파라미터 값으로 다음 중 하나를 설정하여 CAN 통신 속도를 변경합니다:

·  10 – 10Kbps
·  25 – 25Kbps
·  50 – 50Kbps
·  125 – 125Kbps
·  250 – 250Kbps
·  500 – 500Kbps
·  800 – 800Kbps
·  1000 – 1Mbps (기본값)

만일 상기 목록에 없는 값을 설정하게 되면, CAN 통신 속도는 1Mbps로 설정됩니다.
CAN 버스에 제어기를 연결하려면, 먼저 제어기의 USB 포트로 Motor Control UI 유틸리티를 연결합니다. 그리고 Configuration 탭에서 Serial/CAN Communication 그룹의 CAN Bitrate를 CAN 버스에 연결된 다른 장치들과 일치하도록 변경해야 합니다.

10.4.3 serial_bps – Serial Baudrate

PC나 마이크로컨트롤러의 USB 또는 RS-232 포트에 제어기를 연결하는 경우, serial_bps로 시리얼 통신 속도를 설정해야 합니다.
serial_bps 파라미터의 값으로 다음 중 하나를 설정하여 시리얼 통신 속도를 변경합니다:

·  9600 – 9600bps
·  19200 – 19200bps
·  38400 – 38400bps
·  57600 – 57600bps
·  115200 – 115200bps (기본값)
·  230400 – 230400bps
·  460800 – 460800bps
·  921600 – 921600bps

시리얼 통신속도는 9600에서 921600까지 자유롭게 설정 가능합니다. 하지만 상기 목록 이외의 속도는 다른 장치에서 대부분 사용되지 않습니다. 되도록 상기 목록 중 하나의 값을 사용하도록 합니다.

Sub-index가 1인 경우 RS-232의 통신 속도를 설정하게 되고, 2인 경우 USB의 통신 속도를 설정하게 됩니다. 예로, 제어기에 연결된 텍스트 터미널로 “serial_bps1 = 115200″와 같이 입력하면 RS-232의 시리얼 통신 속도를 115200bps로 설정하게 됩니다. 만일 “serial_bps2 =921600″와 같이 입력하면 USB의 시리얼 통신 속도를 921600bps로 설정하게 됩니다.

USB 또는 RS-232 포트로 Motor Control UI 유틸리티가 연결된 경우, 제어기에 설정된 시리얼 통신 속도를 모르더라도 UI 유틸리티에서 자동으로 검색이 가능합니다. 이를 위해 UI 유틸리티의 Port Configuration 대화상자에서 Serial Baudrate 항목을 ‘Auto Detect’로 설정해야 합니다.

10.4.4 serial_watchdog – Serial Watchdog

시리얼 와치독 타이머는 제어기에 연결된 PC가 오작동 하거나 통신 선로가 끊어져 명령 전송 중단된 상황을 대비하기 위함입니다. 이러한 상황에서 제어기는 마지막 명령을 유지하여 모터가 계속 구동중인 상황이 발생할 수 있습니다.

사용자가 serial_watchdog 파라미터에 설정한 타임아웃 기간 내에 USB 또는 RS-232, CAN 포트를 통해 명령(position_command, velocity_command, current_command, voltage_command 중 하나)이 도착하면, 시리얼 통신은 정상으로 간주됩니다. 와치독 타이머가 타임아웃 되면 시리얼 통신은 비정상으로 간주되고 모터에 정지 명령을 내립니다.

serial_watchdog 값으로 0이 설정되면 와치독 타이머는 타임아웃을 검사하지 않습니다. 그리고 통신 포트는 항상 정상인 상태로 간주됩니다. 와치독 타이머를 활성화 하려면 타임아웃 값을 1보다 큰 값으로 설정해야 합니다. 값의 설정 범위는 0과 10,000ms 사이 입니다.

10.5 전원단 설정

전원단(Power stage)은 모터에 전력을 공급하기 위해 MOSFET 스위칭 소자로 구성된 H-bridge 회로를 말합니다.

표 10‑5 전원단 설정 오브젝트

Long name, Short name Index/ Sub-index Type Description
pwm_switching, ps 31/0 I8 (CP) PWM 스위칭 방법
pwm_frequency, pf 32/0 I8 (CP) PWM 주파수

전원단의 스위칭 방법과 PWM 주파수를 변경하는 것은 모터의 동작에 있어 가시적인 차이를 만들지는 않습니다. 되도록 설정 기본값을 사용하는 것이 좋습니다. 만일 구성을 변경하려면 “6.2 전력단”을 숙지하기를 권장합니다.

※ 상기 값을 변경한 경우에는 제어기를 새로 시작(제어기 전원을 끄고 켜거나 제어기를 리셋)하여야 변경된 값이 적용됩니다.

10.5.1 pwm_switching – PWM Switching

pwm_switching 파라미터는 전원단의 H-bridge 회로의 운용 방법을 결정합니다. H-bridge 회로의 각 스위칭 소자를 운용할 때 가장 많이 사용하는 방법은 Unipolar와 Bipolar 방식입니다.
이 파라미터의 설정 값으로 다음 중 하나를 선택합니다:

·  0 – Unipolar (기본값)
·  1 – Bipolar

일반적으로 ‘Bipolar’ 구동은 저속에서의 속도 제어 특성이 좋지만, 모터의 인덕턴스가 낮은 경우 대기 소모 전력이 높으며 모터 발열을 일으킬 수 있습니다. 이런 경우에는 PWM 주파수를 높이거나 스위칭 방법을 ‘Unipolar’ 방식으로 바꾸어야 합니다. 다른 방법으로 모터와 제어기 간에 인덕턴스가 높은 코일을 연결해서 해결할 수 있습니다.

10.5.2 pwm_frequency – PWM Frequency

pwm_frequency 파라미터는 전원단의 H-bridge 회로를 구성하는 MOSFET 스위칭 소자에 인가되는 PWM 신호의 주파수를 결정합니다.

이 파라미터의 설정 값으로 다음 중 하나를 선택합니다:

·  0 – 18kHz (기본값)
·  1 – 20kHz
·  2 – 24kHz
·  3 – 30kHz
·  4 – 36kHz,
·  5 – 40kHz

PWM 주파수가 가청주파수 대역에 있을 경우 모터에서 고주파 소음이 발생할 수 있습니다. 이때는 PWM 주파수를 높여 가청주파수 대역을 벗어날 수 있습니다. 하지만 H-bridge의 상하 MOSFET 쌍이 동시에 켜지지 못하도록 설정된 PWM 펄스의 데드밴드(Deadband)로 인해, 모터에 정격 전압을 공급하더라도 정격 회전속도에 도달하지 못하게 되는 폭이 조금씩 커집니다.

10.6 사용자/임시 변수

제어기는 사용자가 언제든지 읽고 쓸 수 있는 사용자 변수와 임시 변수를 가지고 있습니다.

표 10‑6 사용자 및 임시 변수 오브젝트

Long name, Short name Index/ Sub-index Type Description
user_value, uv 56/1~32 I32 (CP) 사용자가 읽고 쓰는 변수들,
플래시 메모리에 저장 가능
temp_value, tv 57/1~32 I32 (VA) 사용자가 읽고 쓰는 변수들,
RAM에만 저장 됨

10.6.1 user_value – User Value

일반적으로 user_value 파라미터는 제어기의 운용과 관련된 사용자 파라미터 값들을 저장하는데 사용합니다. 32개의 사용자 파라미터들을 저장할 수 있으며, 각각의 파라미터는 Sub-index에 의해 구분됩니다.
system_command에서 “1 – Save properties in Flash Memory” 명령으로 제어기 구성 파라미터들을 저장한 경우, 이 값들은 제어기의 전원이 꺼지더라도 유지됩니다.

10.6.2 temp_value – Temp Value

일반적으로 temp_value 변수는 마스터 PC와 제어기에서 실행되는 스크립트간에 명령/상태를 주고받기 위해 사용합니다. 32개의 변수들을 저장할 수 있으며, 각각의 변수들은 Sub-index에 의해 구분됩니다.
이 값들은 제어기 전원이 꺼지면 소실됩니다.

10.7 스크립트 다운로드와 실행

스크립트 언어로 작성된 프로그램은 빌드 과정을 거쳐 바이트코드로 컴파일 되어 제어기로 다운로드 됩니다. 다운로드 된 바이트코드는 가상머신에 의해 해석되고 실행됩니다.

표 10‑7 스크립트 다운로드와 실행 오브젝트

Long name, Short name Index/ Sub-index Type Description
startup_script_run, ssr 16/0 I8 (CP) 제어기 시작 시 스크립트의 실행 여부(기본값: 0)
script_variable, sv 252/1~256 F32 (ST) 스크립트가 실행되는 동안 사용되는 변수
script_size, ss 250/0 I32 (VA) 바이트코드를 다운로드하기 전에 크기 전송(단위: byte)
script_code, sc 251/0 I32 (VA) 바이트코드를 4-byte씩 묶어서 차례로 전송

스크립트가 실행되기 위해서는 제어기에 미리 다운로드 되어 있어야 합니다. 스크립트는 하나만 다운로드 가능하며, 새로운 스크립트를 다운로드 하면 이전에 저장된 내용이 지워집니다.

10.7.1 startup_script_run – Startup Script Run

사용자가 startup_script_run 파라미터를 변경하여 제어기가 시작될 때 스크립트의 실행 여부를 설정합니다. 이 값으로 다음 중 하나를 선택합니다:

·  0 – 제어기 시작 시 스크립트 실행하지 않음 (기본값)
·  1 – 제어기 시작 시 스크립트 실행함

스크립트가 실행되면서 메모리의 오버플로우가 발생하는 경우에 시스템 충돌로 이어질 수 있습니다. 이때에는, 실행되는 스크립트를 중지하고 새로운 스크립트를 로드할 수 없게 되거나 PC와 통신할 수 없게 됩니다. 이러한 상황이 발생하는 것을 방지하기 위해, startup_script_run을 0으로 설정하고 사용자가 작성한 스크립트를 충분히 테스트 해야 합니다.
스크립트의 시작과 중지는 system_command 명령으로도 가능합니다. “10.2.2 system_command – System Command”을 참조하기 바랍니다.

10.7.2 script_variable – Script Variable

사용자는 script_variable 변수를 읽음으로 스크립트가 실행되는 동안 사용되는 변수들의 값을 모니터링 합니다. 스크립트가 사용하는 변수는 최대 256개가 되며, 각각의 변수에는 컴파일 시에 변수 ID가 1부터 순차적으로 부여됩니다. 변수의 값을 읽을 때는 변수 ID를 Sub-index로 지정합니다.

하이퍼터미널과 같은 유틸리티로 제어기의 USB 또는 RS-232 포트에 연결하여, 스크립트 변수를 텍스트 형식으로 읽을 때는 터미널 유틸리티에서 다음과 같이 입력합니다.

sv1↵
sv1=1.342
sv2↵
sv2=30
sv3↵
sv3=0

여기서 ↵는 키보드의 Enter 키를 의미합니다. 터미널 설정에 따라 다르겠지만, 입력된 값은 일반적으로 터미널에 표시되지 않습니다. 입력 후 Enter 키를 누를 때마다 읽은 값을 보여줍니다.
만일 스크립트에서 사용하는 변수 ID보다 큰 ID를 지정하면 읽은 값은 0이 됩니다. 또한, 스크립트가 실행되기 전에 읽은 값은 모두 0입니다. 만일 스크립트의 실행이 종료된 후 읽으면, 스크립트 변수에 마지막으로 저장된 값을 읽게 됩니다.
스크립트 변수는 Motor Control UI 유틸리티의 Script 탭에서 모니터링 할 수 있습니다.

10.7.3 script_size – Script Size
스크립트의 소스코드는 제어기에 직접 다운로드 될 수 없고, 다운로드 되기 전에 반드시 바이트코드로 컴파일 되어야 합니다. 스크립트의 바이트코드를 다운로드 하는 것은 script_size와 script_code에 의해 구현됩니다.
제어기에 스크립트를 전송하기에 앞서 script_size에 바이트코드의 크기를 설정해야 합니다. 크기는 byte 단위로 설정합니다.
스크립트 전송이 끝나면 script_size에 -1을 설정하여 전송이 끝났음을 알립니다.

10.7.4 script_code – Script Bytecode
다운로드 할 스크립트의 바이트코드 크기를 script_size에 설정하였다면, 바이트코드를 4-byte씩 묶어서 script_code에 차례로 전송합니다. 마지막 묶음이 4-byte가 되지 않을 때는 남는 공간에 0을 채워 4-byte를 전송합니다.
스크립트의 바이트코드를 다운로드 하기 위해 사용자가 script_size와 script_code를 직접 엑세스하는 것을 권장하지 않습니다. PC의 Motor Control UI 유틸리티를 사용하여 스크립트를 다운로드 하기를 권장합니다.

10.8 모바일 로봇 속성
듀얼 채널 제어기 모델(MW DCS02, MW DCM02, MW DCL02)은 이동로봇의 좌우 바퀴 모터의 구동에 바로 적용될 수 있습니다.
본 절의 오브젝트는 차동 구동형 이동로봇에 특화된 구성 파라미터들입니다. 이 구성 파라미터들은 듀얼 채널 제어기에서만 사용 가능합니다.

표 10‑8 차동 구동형 이동로봇 오브젝트

Long name, Short name Index/ Sub-index Type Description
control_mixing, cm 21/0 I8 (CP) 두 모터에 내려지는 속도/전압 명령의 믹싱 모드
(범위: 0 ~ 4, 기본값: 0)
center_safety, cs 22/0 I8 (CP) 모터에 내려지는 속도/전류/전압 명령의 Center Safety
(범위: 0~1, 기본값: 0)
min_max_safety,ms 23/0 I8 (CP) 모터에 내려지는 속도/전류/전압 명령의 Min/Max Safety
(범위: 0~1, 기본값: 0)
wheel_radius, wr 86/0 F32 (CP) 이동로봇의 바퀴 반지름 (단위: m)
axle_length, al 87/0 F32 (CP) 이동로봇 좌우 바퀴간 거리 (단위: m)
gear_ratio, gr 88/0 F32 (CP) 모터와 바퀴간 감속비율 (모터 회전수/바퀴 회전수)

10.8.1 control_mixing – Control Mixing

조이스틱 혹은 RC 조종기는 이동로봇을 조종하는 입력 장치로 주로 사용됩니다. 일반적으로 조이스틱의 입력을 전진속도(V)와 회전속도(W)로 보고 차동 구동형 이동로봇의 좌우 바퀴의 속도(Vl, Vr)로 믹싱하여 분배합니다.

Cap 2014-02-25 09-56-46-703

믹싱한 결과가 좌우 모터의 최대 속도를 넘어갈 때 처리하는 방식에 따라 4가지 믹싱 모드를 지원합니다. control_mixing 파라미터의 값으로 다음 중 하나를 선택합니다:

·  0 – Separate (기본값)
·  1 – Mixing Mode 1
·  2 – Mixing Mode 2
·  3 – Mixing Mode 3
·  4 – Mixing Mode 4

0 – Separate:
믹싱 기능을 사용하지 않습니다. 조이스틱의 입력은 믹싱되지 않고 이동로봇의 좌우 바퀴의 속도가 됩니다.
1 – Mixing Mode 1:
믹싱 결과가 최대 속도보다 크다면 최대 속도를 넘어가지 않도록 제한합니다.
2 – Mixing Mode 2:
믹싱 결과가 최대 속도보다 크다면 최대 속도를 넘어간 비율만큼 결과를 줄여줍니다.
3 – Mixing Mode 3:
믹싱 결과가 최대 속도보다 클 때 전진속도를 우선 적용하고 회전속도를 줄여 최대 속도 내로 제한합니다.
4 – Mixing Mode 4:
믹싱 결과가 최대 속도보다 클 때 회전속도를 우선 적용하고 전진속도를 줄여 최대 속도 내로 제한합니다.

믹싱 기능은 아날로그 입력 또는 펄스 입력에 적용됩니다. 아날로그/펄스 입력은 두 개의 모터에 각각 동일하게 속도 명령이나 전압 명령으로 매핑된 경우에만 활성화됩니다. “9.6.3 신호의 믹싱”을 참조하기 바랍니다.

10.8.2 center_safety – Center Safety

조이스틱이나 RC 조종기의 스틱이 중앙에 있지 않은 상태에서 제어기가 켜지면 모터가 갑자기 회전하여 위험한 상황을 초래할 수 있습니다. 이러한 상황을 방지하기 위해 센터 안전(Center Safety) 검사 기능을 사용합니다.

center_safety 파라미터의 값으로 다음 중 하나를 선택합니다:

·  0 – Disable (기본값)
·  1 – Enable

이 파라미터가 Enable로 설정되어 있다면, 모터에 전원이 공급되거나 조이스틱이나 RC 조종기가 연결될 때 속도 명령의 값이 100ms동안 0에 머무를 경우 입력 값을 받아들이기 시작합니다.

이 기능은 아날로그 입력 또는 펄스 입력에 대해 사용됩니다. 아날로그/펄스 입력이 모터의 속도명령이나 전류 명령, 전압 명령으로 매핑된 경우에만 활성화됩니다. “9.5.4 센터 안전 검사”을 참조하기 바랍니다.

10.8.3 min_max_safety – Min/Max Safety

Min/Max 안전(Min/Max Safety) 검사 기능은 조이스틱의 연결이 단절되거나 망가져 잘못된 신호가 출력되는 것을 탐지하는 기능입니다. 이 기능은 조이스틱의 양단에 밴드 가드 저항을 닮으로 가능합니다.
아날로그/펄스 입력 값이 캘리브레이션의 입력 최소값과 최대값의 범위를 5% 이상 벗어나는 경우 입력 값이 유효하지 않은 것으로 판단하고 입력 값을 0으로 지정합니다.
min_max_safety 파라미터의 값으로 다음 중 하나를 선택합니다:

·  0 – Disable (기본값)
·  1 – Enable

이 기능은 아날로그 입력 또는 펄스 입력에 대해 사용됩니다. 아날로그/펄스 입력이 모터의 속도명령이나 전류 명령, 전압 명령으로 매핑된 경우에만 활성화됩니다. “9.5.2 Min/Max 안전 검사”를 참조하기 바랍니다.

10.8.4 wheel_radius – Wheel Radius
wheel_radius 파라미터에는 이동로봇의 바퀴 반지름을 설정합니다.
이 파라미터는 m_lav_command 명령으로 이동로봇을 제어할 때, 전진속도와 각속도 명령을 좌/우 바퀴의 속도 명령으로 변환할 때 사용됩니다.

10.8.5 axle_length – Axle Length
axle_length 파라미터에는 이동로봇의 좌우 바퀴간 거리를 설정합니다.
이 파라미터는 m_lav_command 명령으로 이동로봇을 제어할 때, 전진속도와 각속도 명령을 좌/우 바퀴의 속도 명령으로 변환할 때 사용됩니다.

10.8.6 gear_ratio – Gear Ratio
gear_ratio 파라미터에는 이동로봇의 모터와 바퀴간 감속비율을 설정합니다. 감속비율은 바퀴가 1회전 할 때 모터의 회전 비율을 의미합니다.
이 파라미터는 m_lav_command 명령으로 이동로봇을 제어할 때, 전진속도와 각속도 명령을 좌/우 바퀴의 속도 명령으로 변환할 때 사용됩니다.

※ wheel_radius, axle_length, gear_ratio 파라미터들은 m_lav_command 명령이 내려졌을 때 좌우 바퀴의 속도를 계산하는데 사용됩니다. 그리고 스크립트 프로그래밍에서 사용자의 이동 명령(전진 속도, 회전 속도)을 로봇의 좌우 바퀴 속도에 적용하거나 좌우 바퀴의 이동량으로부터 로봇의 위치를 추정하는데 사용될 수 있습니다.

10.9 듀얼 채널 명령

본 절의 듀얼 채널 명령들은 로봇의 좌우 바퀴에 동시에 구동 명령을 내리고 상태를 읽어 오는데 사용됩니다. 다음 명령은 시리얼(USB, RS-232) Text Packet 에서만 사용됩니다. 시리얼 Binary Packet 및 CAN 통신에서는 사용할 수 없습니다.

표 10‑9 다중 명령 오브젝트

Long name, Short name Index/
Sub-index
Type Description
m_position, mp 91/0 (ST) 모터 채널 1,2의 엔코더 값을 읽음(단위: pulse, pulse)
m_position_command, mpc 92/0 (CM)
(ST)
모터 채널 1,2의 위치구동 명령을 내리고(단위: pulse, pulse)
엔코더 값을 읽음(단위: pulse, pulse)
m_velocity_command, mvc 93/0 (CM)
(ST)
모터 채널 1,2의 속도 구동 명령을 내리고(단위: RPM, RPM)
엔코더 값을 읽음(단위: pulse, pulse)
m_current_command, mcc 94/0 (CM)
(ST)
모터 채널 1,2의 전류 구동 명령을 내리고(단위: A, A)
전류 값을 읽음 (단위: A, A)
m_voltage_command, mvtc 95/0 (CM)
(ST)
모터 채널 1,2의 전압 구동 명령을 내리고(단위: V, V)
엔코더 값을 읽음(단위: pulse, pulse)
m_lav_command, mla 96/0 (CM)
(ST)
전진속도와 각속도로 이동로봇의 구동명령을 내리고
(단위: m/s, rad/s)
모터 1,2의 엔코더 값을 읽음(단위: pulse, pulse)

m_position_command, m_velocity_command, m_voltage_command, m_lav_command 명령의 리턴 값은 좌우 모터의 엔코더 값(단위: pulse, pulse)이며, m_current_command 명령의 리턴 값은 좌우 모터의 전류 값(단위: A, A)입니다.

10.9.1 m_position – Multi Position

m_position은 좌우 모터의 위치(주로 엔코더 카운트 값)를 2개의 32bit 정수로 읽어옵니다.
좌우 모터의 위치를 읽으려면 하이퍼터미널과 같은 유틸리티로 제어기의 USB 또는 RS-232 포트에 연결하여 다음과 같이 입력합니다.

mp↵
mp=41256,17448

여기서 ↵는 키보드의 Enter 키를 의미합니다. 터미널 설정에 따라 다르겠지만, 입력된 값은 일반적으로 터미널에 표시되지 않습니다. mp는 m_psotion의 Short Name 입니다.

10.9.2 m_position_command – Multi Position Command
m_position_command는 좌우 모터에 위치 명령을 동시에 내립니다. 그리고 좌우 모터의 위치를 읽어 옵니다.
좌우 모터를 10000, 10000 위치로 이동하기 위해서는 다음과 같이 입력합니다:

mpc=10000,10000↵
mpc=11256,27448

그러면 제어기는 좌우 모터의 현재 위치를 즉시 리턴하고, 명령을 실행하기 시작합니다. mpc는 m_psotion_command의 Short Name 입니다.

10.9.3 m_velocity_command – Multi Velocity Command
m_velocity_command는 좌우 모터에 속도 명령을 동시에 내립니다. 그리고 좌우 모터의 위치를 읽어옵니다.
좌우 모터를 500RPM, 500RPM 속도로 회전하기 위해서는 다음과 같이 입력합니다:

mvc=500,500↵
mvc=10000,10000

그러면 제어기는 좌우 모터의 현재 위치를 즉시 리턴하고, 명령을 실행하기 시작합니다. mvc는 m_velocity_command의 Short Name 입니다.

10.9.4 m_current_command – Multi Current Command
m_current_command는 좌우 모터에 전류 명령을 동시에 내립니다. 그리고 좌우 모터의 전류를 읽어옵니다.
좌우 모터에 1A, 1A 전류를 흘리기 위해서는 다음과 같이 입력합니다:

mcc=1,1↵
mcc=0.004,-0.002

그러면 제어기는 좌우 모터의 현재 전류 값을 즉시 리턴하고, 명령을 실행하기 시작합니다. mcc는 m_current_command의 Short Name 입니다.

10.9.5 m_voltage_command – Multi Voltage Command
m_voltage_command는 좌우 모터에 전압 명령을 동시에 내립니다. 그리고 좌우 모터의 위치를 읽어옵니다.
좌우 모터에 12V, 12V 전압을 가하기 위해서는 다음과 같이 입력합니다:

mvtc=12,12↵
mvtc=1561,1749

그러면 제어기는 현재 좌우 모터의 엔코더 위치를 즉시 리턴하고, 명령을 실행하기 시작합니다. mvtc는 m_voltage_command의 Short Name 입니다.

10.9.6 m_lav_command – Linear/Angular Velocity Command
전진속도와 각속도 명령을 이동로봇에 내립니다. 그리고 좌우 모터의 위치를 읽어옵니다.
m_lav_command 명령으로 전달받은 전진속도(V)와 각속도(W)를 이동로봇의 좌우 바퀴에 대한 회전 속도(Vl, Vr)로 변환하는 식은 다음과 같습니다.

Cap 2014-02-25 11-12-02-500

여기서 b은 좌우 바퀴간 거리(axle_length), r은 바퀴의 반지름(wheel_radius), g는 바퀴의 감속 비율(gear_ratio)입니다.
이동로봇에 전진속도 1[m/s], 각속도 0.1[rad/s]로 구동 명령을 내리기 위해서는 다음과 같이 입력합니다:

mla=1,0.1↵
mla=1961,2749

그러면 제어기는 좌우 모터의 현재 위치를 즉시 리턴하고, 명령을 실행하기 시작합니다. mla는 m_lav_command의 Short Name 입니다.