Skip to content

2.3 BasScript 타입

헤더 파일:

  • include/bas_script_types.h
  • include/bas_script.h

개요

BasScript 빌더는 BAS 명령의 포즈, 속도, 레지스터, IO, 대기 조건, 프로그램 로드 파라미터를 설명하기 위해 여러 열거형과 variant 별칭에 의존합니다.

이 페이지는 BasScript 구성과 관련된 열거형, 값의 의미, 파라미터 조합 규칙을 설명합니다. 예약 열거형은 공개 헤더 파일 정의에 따라 나열합니다.

2.3.1 모션 관련 열거형

MovePoseType

MovePoseType 은 모션 명령의 포즈 소스를 선택합니다. 공개된 값은 PR 이며, 포즈 레지스터 번호로 PR[index] 를 구성한다는 뜻입니다.

BAS 표기설명
PRPR포즈 레지스터 기준

SmoothType

SmoothType 은 목표점으로 이동할 때의 전환 방식을 제어합니다. MOVEJ , MOVEL , MOVEC , JUMP 같은 모션 문장의 끝에 나타납니다.

BAS 표기설명
FINEFINE지점에서 정확히 정지하며, 문장에 평활 거리를 추가하지 않음
SMOOTH_DISTANCESD평활 거리로 전환하며, smoothDistance 파라미터를 계속 사용

SpeedType

SpeedType 은 속도 파라미터가 직접 숫자인지 MR 모션 레지스터에서 오는지를 제어합니다. MR 을 선택하면 speedValue 는 정수 인덱스로 해석되어 MR[index] 로 출력됩니다.

출력 형식설명
VALUE숫자 리터럴을 직접 출력예: 100.0 , 500.0
MRMR[index]속도를 모션 레지스터에서 가져옴

MoveJointVALUE 모드에서 속도 범위 0~100 을 요구합니다. MoveLine / MoveCircleVALUE 모드에서 속도 범위 0~5000 을 요구합니다.

2.3.2 레지스터, IO 및 논리 열거형

RegisterType

RegisterType 은 논리 조건, 대기 조건 또는 CASE 에서 피연산자로 사용할 수 있는 레지스터 타입을 설명합니다. "레지스터를 읽어 판단에 참여"하는 시나리오에 사용되며, ASSIGN 왼쪽의 대입 대상에는 사용되지 않습니다.

BAS 표기설명
RR숫자 레지스터
SRSR문자열 레지스터
MHMHModbus holding 레지스터
MIMIModbus input 레지스터

IOType

IOType 은 논리 조건, 대기 조건 또는 CASE 에서 피연산자로 사용할 수 있는 IO 타입을 설명합니다. IO 종류만 나타내며, 구체적인 포트 번호는 호출 파라미터의 index 또는 value 가 제공합니다.

BAS 표기설명
DIDI디지털 입력
DODO디지털 출력
AIAI아날로그 입력
AOAO아날로그 출력
RIRI원격 제어 입력
RORO원격 제어 출력
UIUI사용자 / 전용 입력
UOUO사용자 / 전용 출력
GIGI그룹 입력
GOGO그룹 출력
TAITAI말단 아날로그 입력
TAOTAO말단 아날로그 출력
TDITDI말단 디지털 입력
TDOTDO말단 디지털 출력

IOStatus

IOStatus 는 IO 조건과 IO 대입에서 사용하는 상태 상수입니다. 디지털 출력 대입, 대기 조건, 논리 조건에서 모두 사용할 수 있습니다.

BAS 표기설명
ONON설정, 높은 레벨 또는 조건 성립
OFFOFF리셋, 낮은 레벨 또는 조건 불성립
PULSEPULSE펄스이며, 대입 시 펄스 길이를 포함할 수 있음
POSITIVE_EDGEPE상승 에지
NEGATIVE_EDGENE하강 에지

BooleanOperator

BooleanOperatorIF , ELSEIF , WHILE , SKIP CONDITION , WAIT 의 조건 연결 또는 비교 연산자입니다.

BAS 표기설명
ANDANDAND
OROROR
EQ=같음
NE<>같지 않음
GT>
GE>=크거나 같음
LT<작음
LE<=작거나 같음

2.3.3 대입, 로드 및 파라미터 열거형

AssignType

AssignTypeASSIGN 문 양쪽에서 사용할 수 있는 레지스터, 좌표계 또는 출력 대상을 설명합니다. param1 로 쓰이면 대입 왼쪽을 나타내고, param2 로 쓰이면 오른쪽이 다른 레지스터나 대상 값을 참조함을 나타냅니다.

BAS 대상설명
RR[index]숫자 레지스터
MRMR[index]모션 레지스터
PRPR[index]포즈 레지스터
PR_ELEMENTPR[index].n포즈 레지스터 하위 요소
SRSR[index]문자열 레지스터
UFUF[index]사용자 좌표계
TFTF[index]도구 좌표계
MHMH[index]Modbus holding 레지스터
MIMI[index]Modbus input 레지스터
DODO[index]디지털 출력
RORO[index]원격 출력
GOGO[index]그룹 출력
AOAO[index]아날로그 출력
TAOTAO[index]손목 단 아날로그 출력
TDOTDO[index]손목 단 디지털 출력

OtherType

OtherTypeAssignParam2 / LogiParam2 같은 variant 파라미터에 사용되며, 오른쪽이 레지스터나 IO가 아니라 리터럴, IO 상태 또는 현재 포즈임을 나타냅니다.

의미일반적인 시나리오
VALUE직접 숫자ASSIGN / 논리 조건 / CASE
STRING문자열 리터럴ASSIGN , CASE
IO_STATUSIO 상태 상수ASSIGN , WAIT
CURRENT_POSE현재 포즈ASSIGN

CurrentPose

CurrentPoseOtherType::CURRENT_POSE 시나리오에서만 AssignValue_t 로 사용되며, 현재 로봇 포즈를 대상에 쓰는 데 사용됩니다.

BAS 표기설명
J_POSJ_POS현재 관절 포즈
L_POSL_POS현재 직교 좌표 포즈

LoadType

LoadTypeLoad() , Unload() , Exec() 의 프로그램 식별자 출처를 제어합니다. R / SR 은 레지스터에서 프로그램 식별자를 가져오고, STRING 은 프로그램 이름을 직접 전달하며, VALUE 는 숫자 리터럴을 직접 전달함을 의미합니다.

대응 LoadValue_t설명
Rint32_t레지스터 인덱스를 전달하며 R[index] 를 출력
SRint32_t레지스터 인덱스를 전달하며 SR[index] 를 출력
STRINGstd::string프로그램 이름 문자열을 전달하며 STRING "name" 을 출력
VALUEint32_t / Float64숫자 리터럴을 직접 출력

StrType

StrType 은 Socket 송수신 시 문자열 내용이 어디에서 오거나 어디에 쓰이는지를 제어합니다.

대응 SocketValue_t설명
STRINGstd::string문자열을 직접 송신 또는 수신
SRint32_tSR[index] 로 송신하거나 SR[index] 에 수신

ValueType

ValueType 은 범용 숫자 값 출처 선택이며, SetParam() , WaitTime() , ModbusWriteMH() 에서 자주 사용됩니다.

출력 형식설명
VALUE숫자 리터럴숫자 리터럴을 직접 사용
RR[index]숫자 레지스터에서 읽음

ParamType

ParamTypeBasScript::SetParam() 이 설정할 수 있는 실행 파라미터 대상입니다.

BAS 표기설명
TF_NOTF_NO도구 좌표계 번호
UF_NOUF_NO사용자 좌표계 번호
OVCOVC전역 속도
OACOAC전역 가속도
PAYLOAD_NOPAYLOAD_NO페이로드 번호

2.3.4 예약 열거형

MathOperator

MathOperator 는 예약된 사칙 연산자 열거형입니다.

예상 의미
ADD덧셈
SUB뺄셈
MUL곱셈
DIV나눗셈

2.3.5 가변 파라미터 조합

이 절은 빌더 파라미터의 선택 가능한 타입을 설명합니다. 호출자는 대상 BAS 문장에 맞는 파라미터 형태를 선택합니다.

대입 문장

AssignValue() 의 세 번째 파라미터는 오른쪽 피연산자의 종류를 선언하고, 네 번째 파라미터는 오른쪽 피연산자의 값을 전달합니다.

대상 의미세 번째 파라미터네 번째 파라미터출력 의미
오른쪽이 다른 레지스터 또는 좌표계AssignTypeint32_t 인덱스예: AssignType::MR + 8MR[8] 출력
오른쪽이 PR 하위 요소AssignType::PR_ELEMENTint32_t PR 인덱스, optValue 는 하위 요소 번호 전달PR[index].n 출력
오른쪽이 숫자 리터럴OtherType::VALUEint32_t 또는 Float64직접 숫자 출력
오른쪽이 문자열 리터럴OtherType::STRINGstd::string따옴표가 포함된 문자열 출력
오른쪽이 IO 상태OtherType::IO_STATUSIOStatusON / OFF / PULSE 등 출력
오른쪽이 현재 포즈OtherType::CURRENT_POSECurrentPoseJ_POS 또는 L_POS 출력

논리 및 대기 조건

논리 조건과 대기 조건은 "왼쪽 피연산자 + 연산자 + 오른쪽 피연산자"로 구성됩니다. 왼쪽 피연산자는 보통 레지스터 또는 IO이며, 오른쪽 피연산자는 레지스터, IO, 리터럴 또는 상태 상수를 선택할 수 있습니다.

별칭사용 위치선택 가능한 타입선택 방식
LogiParam1LogiIf / 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 의 선택과 일치해야 함
WaitParam2Wait 오른쪽ValueType / IOType / OtherType숫자를 기다리면 ValueType , 다른 IO를 기다리면 IOType , ON / OFF 같은 상태를 기다리면 OtherType::IO_STATUS 사용
WaitValue_tWait 오른쪽의 실제 값int32_t / Float64 / IOStatus타입은 WaitParam2 의 선택과 일치해야 함
LogiCaseValue_tLogiCase 의 매칭 값int32_t / Float64 / std::stringCASE 1 , CASE 3.14 , CASE "name" 같은 분기에 사용

기타 가변 파라미터

별칭사용 위치선택 가능한 타입선택 방식
SocketValue_tSocketSend / SocketRecvint32_t / std::stringStrType::SR 일 때 SR 인덱스를 전달하고, StrType::STRING 일 때 문자열을 전달
SetParamVal_tSetParam / WaitTimeint32_t / Float64직접 숫자는 정수 또는 부동소수점 값을 전달할 수 있으며, ValueType::R 일 때 R 레지스터 인덱스로 해석
LoadValue_tLoad / Unload / Execint32_t / Float64 / std::stringLoadType::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::ONWAIT 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 을 지원하지 않습니다.
  • WaitParam2OtherType 일 때는 OtherType::IO_STATUS 만 지원합니다.
  • LogiSkipCondition() 의 양쪽에는 MH / MI 를 사용할 수 없습니다.
  • AssignValue() 에서 param1 == AssignType::PR_ELEMENT 이면 optIndex 를 반드시 제공해야 합니다.
  • AssignValue() 에서 param2 == AssignType::PR_ELEMENT 이면 valuePR 인덱스, 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() 에서 LoadTypeLoadValue_t 는 반드시 일대일로 일치해야 하며, 프로그램 이름 문자열로 자동 변환하지 않습니다.

2.3.7 출력 예제

cpp
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"