2.3 BasScript 타입
헤더 파일:
include/bas_script_types.hinclude/bas_script.h
개요
BasScript 빌더는 BAS 명령의 포즈, 속도, 레지스터, IO, 대기 조건, 프로그램 로드 파라미터를 설명하기 위해 여러 열거형과 variant 별칭에 의존합니다.
이 페이지는 BasScript 구성과 관련된 열거형, 값의 의미, 파라미터 조합 규칙을 설명합니다. 예약 열거형은 공개 헤더 파일 정의에 따라 나열합니다.
2.3.1 모션 관련 열거형
MovePoseType
MovePoseType 은 모션 명령의 포즈 소스를 선택합니다. 공개된 값은 PR 이며, 포즈 레지스터 번호로 PR[index] 를 구성한다는 뜻입니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
PR | PR | 포즈 레지스터 기준 |
SmoothType
SmoothType 은 목표점으로 이동할 때의 전환 방식을 제어합니다. MOVEJ , MOVEL , MOVEC , JUMP 같은 모션 문장의 끝에 나타납니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
FINE | FINE | 지점에서 정확히 정지하며, 문장에 평활 거리를 추가하지 않음 |
SMOOTH_DISTANCE | SD | 평활 거리로 전환하며, smoothDistance 파라미터를 계속 사용 |
SpeedType
SpeedType 은 속도 파라미터가 직접 숫자인지 MR 모션 레지스터에서 오는지를 제어합니다. MR 을 선택하면 speedValue 는 정수 인덱스로 해석되어 MR[index] 로 출력됩니다.
| 값 | 출력 형식 | 설명 |
|---|---|---|
VALUE | 숫자 리터럴을 직접 출력 | 예: 100.0 , 500.0 |
MR | MR[index] | 속도를 모션 레지스터에서 가져옴 |
MoveJoint 는 VALUE 모드에서 속도 범위 0~100 을 요구합니다. MoveLine / MoveCircle 은 VALUE 모드에서 속도 범위 0~5000 을 요구합니다.
2.3.2 레지스터, IO 및 논리 열거형
RegisterType
RegisterType 은 논리 조건, 대기 조건 또는 CASE 에서 피연산자로 사용할 수 있는 레지스터 타입을 설명합니다. "레지스터를 읽어 판단에 참여"하는 시나리오에 사용되며, ASSIGN 왼쪽의 대입 대상에는 사용되지 않습니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
R | R | 숫자 레지스터 |
SR | SR | 문자열 레지스터 |
MH | MH | Modbus holding 레지스터 |
MI | MI | Modbus input 레지스터 |
IOType
IOType 은 논리 조건, 대기 조건 또는 CASE 에서 피연산자로 사용할 수 있는 IO 타입을 설명합니다. IO 종류만 나타내며, 구체적인 포트 번호는 호출 파라미터의 index 또는 value 가 제공합니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
DI | DI | 디지털 입력 |
DO | DO | 디지털 출력 |
AI | AI | 아날로그 입력 |
AO | AO | 아날로그 출력 |
RI | RI | 원격 제어 입력 |
RO | RO | 원격 제어 출력 |
UI | UI | 사용자 / 전용 입력 |
UO | UO | 사용자 / 전용 출력 |
GI | GI | 그룹 입력 |
GO | GO | 그룹 출력 |
TAI | TAI | 말단 아날로그 입력 |
TAO | TAO | 말단 아날로그 출력 |
TDI | TDI | 말단 디지털 입력 |
TDO | TDO | 말단 디지털 출력 |
IOStatus
IOStatus 는 IO 조건과 IO 대입에서 사용하는 상태 상수입니다. 디지털 출력 대입, 대기 조건, 논리 조건에서 모두 사용할 수 있습니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
ON | ON | 설정, 높은 레벨 또는 조건 성립 |
OFF | OFF | 리셋, 낮은 레벨 또는 조건 불성립 |
PULSE | PULSE | 펄스이며, 대입 시 펄스 길이를 포함할 수 있음 |
POSITIVE_EDGE | PE | 상승 에지 |
NEGATIVE_EDGE | NE | 하강 에지 |
BooleanOperator
BooleanOperator 는 IF , ELSEIF , WHILE , SKIP CONDITION , WAIT 의 조건 연결 또는 비교 연산자입니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
AND | AND | AND |
OR | OR | OR |
EQ | = | 같음 |
NE | <> | 같지 않음 |
GT | > | 큼 |
GE | >= | 크거나 같음 |
LT | < | 작음 |
LE | <= | 작거나 같음 |
2.3.3 대입, 로드 및 파라미터 열거형
AssignType
AssignType 은 ASSIGN 문 양쪽에서 사용할 수 있는 레지스터, 좌표계 또는 출력 대상을 설명합니다. param1 로 쓰이면 대입 왼쪽을 나타내고, param2 로 쓰이면 오른쪽이 다른 레지스터나 대상 값을 참조함을 나타냅니다.
| 값 | BAS 대상 | 설명 |
|---|---|---|
R | R[index] | 숫자 레지스터 |
MR | MR[index] | 모션 레지스터 |
PR | PR[index] | 포즈 레지스터 |
PR_ELEMENT | PR[index].n | 포즈 레지스터 하위 요소 |
SR | SR[index] | 문자열 레지스터 |
UF | UF[index] | 사용자 좌표계 |
TF | TF[index] | 도구 좌표계 |
MH | MH[index] | Modbus holding 레지스터 |
MI | MI[index] | Modbus input 레지스터 |
DO | DO[index] | 디지털 출력 |
RO | RO[index] | 원격 출력 |
GO | GO[index] | 그룹 출력 |
AO | AO[index] | 아날로그 출력 |
TAO | TAO[index] | 손목 단 아날로그 출력 |
TDO | TDO[index] | 손목 단 디지털 출력 |
OtherType
OtherType 은 AssignParam2 / LogiParam2 같은 variant 파라미터에 사용되며, 오른쪽이 레지스터나 IO가 아니라 리터럴, IO 상태 또는 현재 포즈임을 나타냅니다.
| 값 | 의미 | 일반적인 시나리오 |
|---|---|---|
VALUE | 직접 숫자 | ASSIGN / 논리 조건 / CASE |
STRING | 문자열 리터럴 | ASSIGN , CASE |
IO_STATUS | IO 상태 상수 | ASSIGN , WAIT |
CURRENT_POSE | 현재 포즈 | ASSIGN |
CurrentPose
CurrentPose 는 OtherType::CURRENT_POSE 시나리오에서만 AssignValue_t 로 사용되며, 현재 로봇 포즈를 대상에 쓰는 데 사용됩니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
J_POS | J_POS | 현재 관절 포즈 |
L_POS | L_POS | 현재 직교 좌표 포즈 |
LoadType
LoadType 은 Load() , Unload() , Exec() 의 프로그램 식별자 출처를 제어합니다. R / SR 은 레지스터에서 프로그램 식별자를 가져오고, STRING 은 프로그램 이름을 직접 전달하며, VALUE 는 숫자 리터럴을 직접 전달함을 의미합니다.
| 값 | 대응 LoadValue_t | 설명 |
|---|---|---|
R | int32_t | 레지스터 인덱스를 전달하며 R[index] 를 출력 |
SR | int32_t | 레지스터 인덱스를 전달하며 SR[index] 를 출력 |
STRING | std::string | 프로그램 이름 문자열을 전달하며 STRING "name" 을 출력 |
VALUE | int32_t / Float64 | 숫자 리터럴을 직접 출력 |
StrType
StrType 은 Socket 송수신 시 문자열 내용이 어디에서 오거나 어디에 쓰이는지를 제어합니다.
| 값 | 대응 SocketValue_t | 설명 |
|---|---|---|
STRING | std::string | 문자열을 직접 송신 또는 수신 |
SR | int32_t | SR[index] 로 송신하거나 SR[index] 에 수신 |
ValueType
ValueType 은 범용 숫자 값 출처 선택이며, SetParam() , WaitTime() , ModbusWriteMH() 에서 자주 사용됩니다.
| 값 | 출력 형식 | 설명 |
|---|---|---|
VALUE | 숫자 리터럴 | 숫자 리터럴을 직접 사용 |
R | R[index] | 숫자 레지스터에서 읽음 |
ParamType
ParamType 은 BasScript::SetParam() 이 설정할 수 있는 실행 파라미터 대상입니다.
| 값 | BAS 표기 | 설명 |
|---|---|---|
TF_NO | TF_NO | 도구 좌표계 번호 |
UF_NO | UF_NO | 사용자 좌표계 번호 |
OVC | OVC | 전역 속도 |
OAC | OAC | 전역 가속도 |
PAYLOAD_NO | PAYLOAD_NO | 페이로드 번호 |
2.3.4 예약 열거형
MathOperator
MathOperator 는 예약된 사칙 연산자 열거형입니다.
| 값 | 예상 의미 |
|---|---|
ADD | 덧셈 |
SUB | 뺄셈 |
MUL | 곱셈 |
DIV | 나눗셈 |
2.3.5 가변 파라미터 조합
이 절은 빌더 파라미터의 선택 가능한 타입을 설명합니다. 호출자는 대상 BAS 문장에 맞는 파라미터 형태를 선택합니다.
대입 문장
AssignValue() 의 세 번째 파라미터는 오른쪽 피연산자의 종류를 선언하고, 네 번째 파라미터는 오른쪽 피연산자의 값을 전달합니다.
| 대상 의미 | 세 번째 파라미터 | 네 번째 파라미터 | 출력 의미 |
|---|---|---|---|
| 오른쪽이 다른 레지스터 또는 좌표계 | AssignType | int32_t 인덱스 | 예: AssignType::MR + 8 은 MR[8] 출력 |
| 오른쪽이 PR 하위 요소 | AssignType::PR_ELEMENT | int32_t PR 인덱스, optValue 는 하위 요소 번호 전달 | PR[index].n 출력 |
| 오른쪽이 숫자 리터럴 | OtherType::VALUE | int32_t 또는 Float64 | 직접 숫자 출력 |
| 오른쪽이 문자열 리터럴 | OtherType::STRING | std::string | 따옴표가 포함된 문자열 출력 |
| 오른쪽이 IO 상태 | OtherType::IO_STATUS | IOStatus | ON / OFF / PULSE 등 출력 |
| 오른쪽이 현재 포즈 | OtherType::CURRENT_POSE | CurrentPose | J_POS 또는 L_POS 출력 |
논리 및 대기 조건
논리 조건과 대기 조건은 "왼쪽 피연산자 + 연산자 + 오른쪽 피연산자"로 구성됩니다. 왼쪽 피연산자는 보통 레지스터 또는 IO이며, 오른쪽 피연산자는 레지스터, IO, 리터럴 또는 상태 상수를 선택할 수 있습니다.
| 별칭 | 사용 위치 | 선택 가능한 타입 | 선택 방식 |
|---|---|---|---|
LogiParam1 | LogiIf / LogiElseIf / LogiWhile / LogiSkipCondition / Wait 왼쪽 | RegisterType / IOType | 왼쪽에서 레지스터를 판단하려면 RegisterType , IO를 판단하려면 IOType 전달 |
LogiParam2 | 논리 조건 오른쪽, LogiCase 파라미터 | RegisterType / IOType / OtherType | 오른쪽이 레지스터나 IO를 참조하면 대응 타입을 전달하고, 리터럴/문자열/IO 상태이면 OtherType 전달 |
LogiValue_t | 논리 조건 오른쪽의 실제 값 | int32_t / Float64 / std::string / IOStatus | 타입은 LogiParam2 의 선택과 일치해야 함 |
WaitParam2 | Wait 오른쪽 | ValueType / IOType / OtherType | 숫자를 기다리면 ValueType , 다른 IO를 기다리면 IOType , ON / OFF 같은 상태를 기다리면 OtherType::IO_STATUS 사용 |
WaitValue_t | Wait 오른쪽의 실제 값 | int32_t / Float64 / IOStatus | 타입은 WaitParam2 의 선택과 일치해야 함 |
LogiCaseValue_t | LogiCase 의 매칭 값 | int32_t / Float64 / std::string | CASE 1 , CASE 3.14 , CASE "name" 같은 분기에 사용 |
기타 가변 파라미터
| 별칭 | 사용 위치 | 선택 가능한 타입 | 선택 방식 |
|---|---|---|---|
SocketValue_t | SocketSend / SocketRecv | int32_t / std::string | StrType::SR 일 때 SR 인덱스를 전달하고, StrType::STRING 일 때 문자열을 전달 |
SetParamVal_t | SetParam / WaitTime | int32_t / Float64 | 직접 숫자는 정수 또는 부동소수점 값을 전달할 수 있으며, ValueType::R 일 때 R 레지스터 인덱스로 해석 |
LoadValue_t | Load / Unload / Exec | int32_t / Float64 / std::string | LoadType::R / SR 은 인덱스를, STRING 은 프로그램 이름을, VALUE 는 숫자를 전달 |
읽는 예
다음 조합은 출력 결과 그대로 이해할 수 있습니다.
| 호출 의도 | 핵심 파라미터 | 출력 결과 |
|---|---|---|
| MR[8]을 R[5]에 쓰기 | AssignType::R, 5, AssignType::MR, int32_t{8} | ASSIGN R[5] = MR[8] |
| DI[1]이 ON이 될 때까지 대기 | IOType::DI, 1, OtherType::IO_STATUS, IOStatus::ON | WAIT COND DI[1] = ON |
| Socket으로 문자열 전송 | StrType::STRING, std::string{"ping"} | SOCKET_SEND SK[index] "ping" |
| 문자열 프로그램 이름 실행 | LoadType::STRING, std::string{"demo"} | EXEC STRING "demo" |
2.3.6 일반적인 조합 규칙
Wait()의 왼쪽 피연산자는RegisterType::SR을 지원하지 않습니다.WaitParam2가OtherType일 때는OtherType::IO_STATUS만 지원합니다.LogiSkipCondition()의 양쪽에는MH/MI를 사용할 수 없습니다.AssignValue()에서param1 == AssignType::PR_ELEMENT이면optIndex를 반드시 제공해야 합니다.AssignValue()에서param2 == AssignType::PR_ELEMENT이면value는PR인덱스,optValue는 하위 요소 인덱스를 나타냅니다.AssignValue()에서param2 == OtherType::IO_STATUS이고value == IOStatus::PULSE이면optValue는 펄스 길이를 나타냅니다.Wait()에서param2 == IOType이면value는 오른쪽 IO의 포트 인덱스여야 합니다.Wait()에서param2 == ValueType::R이면value는 R 레지스터 인덱스여야 합니다.SocketSend()/SocketRecv()에서StrType::SR은 정수 인덱스만 받고,StrType::STRING은 문자열만 받습니다.Load()/Unload()/Exec()에서LoadType과LoadValue_t는 반드시 일대일로 일치해야 하며, 프로그램 이름 문자열로 자동 변환하지 않습니다.
2.3.7 출력 예제
BasScript script("demo.bas"); // demo.bas라는 BAS 빌더를 생성합니다.
script.motion.MoveLine( // MOVEL 직선 모션 문장을 추가합니다.
MovePoseType::PR, // 포즈 소스로 PR 포즈 레지스터를 사용합니다.
1, // PR[1]을 대상 포즈로 사용합니다.
SpeedType::VALUE, // 속도 파라미터는 직접 숫자를 사용합니다.
Float64{100.0}, // 직선 속도는 100.0으로 씁니다.
SmoothType::FINE // 목표점에서 정지하며 평활 거리를 추가하지 않습니다.
); // MoveLine 호출을 종료합니다.
// 생성: MOVEL PR[1] 100.0 FINE
script.AssignValue( // ASSIGN 대입 문장을 추가합니다.
AssignType::R, // 왼쪽 대상은 R 숫자 레지스터입니다.
1, // 왼쪽 대상 번호는 R[1]입니다.
OtherType::VALUE, // 오른쪽은 직접 숫자를 사용합니다.
Float64{3.14} // 쓰는 숫자는 3.14입니다.
); // AssignValue 호출을 종료합니다.
// 생성: ASSIGN R[1] = 3.14
script.AssignValue( // ASSIGN 대입 문장을 하나 더 추가합니다.
AssignType::R, // 왼쪽 대상은 R 숫자 레지스터입니다.
5, // 왼쪽 대상 번호는 R[5]입니다.
AssignType::MR, // 오른쪽은 MR 모션 레지스터를 참조합니다.
int32_t{8} // 오른쪽 레지스터 번호는 MR[8]입니다.
); // AssignValue 호출을 종료합니다.
// 생성: ASSIGN R[5] = MR[8]
script.structure.Load( // LOAD 프로그램 로드 문장을 추가합니다.
LoadType::STRING, // 프로그램 식별자는 문자열을 직접 사용합니다.
std::string("demo_program") // 프로그램 이름은 demo_program입니다.
); // Load 호출을 종료합니다.
// 생성: LOAD STRING "demo_program"
script.structure.Wait( // WAIT COND 대기 조건 문장을 추가합니다.
IOType::DI, // 왼쪽은 디지털 입력 DI를 판단합니다.
1, // 왼쪽 포트 번호는 DI[1]입니다.
OtherType::IO_STATUS, // 오른쪽은 IO 상태 상수를 사용합니다.
IOStatus::ON // DI[1]이 ON이 되기를 기다립니다.
); // Wait 호출을 종료합니다.
// 생성: WAIT COND DI[1] = ON
script.socket.SocketSend( // SOCKET_SEND 전송 문장을 추가합니다.
1, // Socket 채널 SK[1]을 사용합니다.
StrType::STRING, // 전송 내용은 문자열을 직접 사용합니다.
std::string("ping") // 문자열 ping을 전송합니다.
); // SocketSend 호출을 종료합니다.
// 생성: SOCKET_SEND SK[1] "ping"