3.6 BasScript Class
Overview
BasScript is the structured script builder exposed by the C++17 SDK.
3.6.1 Script Object
cpp
BasScript()
BasScript(const std::string& scriptName)| Item | Description |
|---|---|
| Description | Creates a script object |
| Notes | A script name can be supplied, or the default constructor can be used |
Public Members
| Member | Description |
|---|---|
name | Script name |
content | Script text lines |
flagIf | IF closure count |
flagSwitch | SWITCH closure count |
flagWhile | WHILE closure count |
indent | Current indentation level |
Basic Methods
cpp
GetScript() -> std::string
SetParam(ParamType type, ValueType valueType, SetParamVal_t value) -> STATUS_CODE
AssignValue(AssignType param1, int32_t index, AssignParam2 param2, AssignValue_t value, int32_t optIndex = 0, int32_t optValue = 0) -> STATUS_CODE| Method | Description | Return |
|---|---|---|
GetScript | Outputs the script text generated by the current builder | std::string |
SetParam | Sets a script parameter | STATUS_CODE |
AssignValue | Generates an assignment | STATUS_CODE |
Additional notes:
BasScript(scriptName)prewrites two lines:scriptNameandSUB main.BasScript()creates an empty script object. Use the named constructor when a script header is required.
3.6.2 BasMotion
cpp
MoveJoint(MovePoseType, int32_t, SpeedType, Float64, SmoothType, Float64 = 0.0, const ExtraParam* = nullptr)
MoveLine(MovePoseType, int32_t, SpeedType, Float64, SmoothType, Float64 = 0.0, const ExtraParam* = nullptr)
MoveCircle(MovePoseType, int32_t, MovePoseType, int32_t, SpeedType, Float64, SmoothType, Float64 = 0.0, const ExtraParam* = nullptr)
MoveJump(MovePoseType, int32_t, Float64, Float64, SpeedType, Float64, SmoothType, Float64 = 0.0, const ExtraParam* = nullptr)
MoveJump3(MovePoseType, const std::vector<int32_t>&, Float64, Float64, SmoothType, Float64 = 0.0, const ExtraParam* = nullptr)
MoveJump3cp(MovePoseType, const std::vector<int32_t>&, Float64, SmoothType, Float64 = 0.0, const ExtraParam* = nullptr)| Method | Description | Key Constraints |
|---|---|---|
MoveJoint | Joint motion statement | VALUE speed range 0~100 |
MoveLine | Linear motion statement | VALUE speed range 0~5000 |
MoveCircle | Circular motion statement | VALUE speed range 0~5000 |
MoveJump | Jump statement | speedRatio range 0~100 |
MoveJump3 | Three-point Jump statement | poseIndex.size() must be 3 |
MoveJump3cp | Three-point continuous Jump statement | poseIndex.size() must be 3 |
Common constraints:
- When
SmoothType::SMOOTH_DISTANCEis used,smoothDistancemust be in the range0~1000. - If an invalid
ExtraParamconfiguration is passed, motion methods returnINVALID_PARAMETER.
3.6.3 BasLogical
cpp
LogiIf(LogiParam1, int32_t, LogiParam2, LogiValue_t, BooleanOperator = EQ)
LogiElseIf(LogiParam1, int32_t, LogiParam2, LogiValue_t, BooleanOperator = EQ)
LogiElse()
LogiEndIf()
LogiSwitch(LogiParam1, int32_t)
LogiCase(LogiParam2, LogiCaseValue_t)
LogiDefault()
LogiEndSwitch()
LogiWhile(LogiParam1, int32_t, LogiParam2, LogiValue_t, BooleanOperator = EQ)
LogiEndWhile()
LogiGoto(int32_t index)
LogiLabel(int32_t index)
LogiSkipCondition(LogiParam1, int32_t, LogiParam2, LogiValue_t, BooleanOperator = EQ)
LogiBreak()
LogiContinue()| Method | Description | Key Constraints |
|---|---|---|
LogiIf | IF | Supports registers, IO, literals, strings, and IO status |
LogiElseIf | ELSE IF | Same as above |
LogiElse | ELSE | None |
LogiEndIf | ENDIF | None |
LogiSwitch | SWITCH | Actually outputs SELECT |
LogiCase | CASE | OtherType supports only VALUE / STRING |
LogiDefault | DEFAULT | None |
LogiEndSwitch | ENDSELECT | None |
LogiWhile | WHILE | Condition rules are the same as LogiIf |
LogiEndWhile | WEND | None |
LogiGoto | GOTO | Target is LABELn |
LogiLabel | LABEL | Actually outputs scriptName::LABELn |
LogiSkipCondition | SKIP CONDITION | Neither side may use MH / MI |
LogiBreak | BREAK | None |
LogiContinue | CONTINUE | None |
3.6.4 BasStructure
cpp
Wait(LogiParam1, int32_t, WaitParam2, WaitValue_t, BooleanOperator = EQ)
WaitTime(ValueType, SetParamVal_t)
Pause()
Abort()
Call(const std::string& name)
Run(const std::string& name)
Load(LoadType param, LoadValue_t value)
Unload(LoadType param, LoadValue_t value)
Exec(LoadType param, LoadValue_t value)| Method | Description | Key Constraints |
|---|---|---|
Wait | Conditional wait | Left operand does not support RegisterType::SR ; OtherType supports only IO_STATUS |
WaitTime | Time wait | VALUE outputs a literal; R outputs R[index] |
Pause | Pause | None |
Abort | Abort | None |
Call | Synchronously calls a script | Automatically inserts IMPORT name at the file header |
Run | Runs a script asynchronously | None |
Load | Load | R/SR pass an index, STRING passes a string, and VALUE passes a numeric value |
Unload | Unload | Same as Load |
Exec | Execute | Same as Load |
3.6.5 BasSocket
cpp
SocketOpen(int32_t index)
SocketClose(int32_t index)
SocketConnect(int32_t index)
SocketSend(int32_t index, StrType msgType, SocketValue_t value)
SocketRecv(int32_t index, int32_t msgLength, StrType msgType, SocketValue_t value)| Method | Description | Key Constraints |
|---|---|---|
SocketOpen | Opens the connection | Actually outputs SOCKET_OPEN SK[index] |
SocketClose | Closes the connection | Actually outputs SOCKET_CLOSE SK[index] |
SocketConnect | Connects | Actually outputs SOCKET_CONNECT SK[index] |
SocketSend | Sends data | SR accepts only an integer index; STRING accepts only a string |
SocketRecv | Receives data | SR accepts only an integer index; STRING accepts only a string |
3.6.6 BasModbus
cpp
ModbusReadMH(int32_t, int32_t, int32_t, int32_t, int32_t)
ModbusReadMI(int32_t, int32_t, int32_t, int32_t, int32_t)
ModbusWriteMH(int32_t, int32_t, int32_t, int32_t, ValueType, int32_t)| Method | Description | Key Constraints |
|---|---|---|
ModbusReadMH | Reads MH | Result is written to R[rIndex] |
ModbusReadMI | Reads MI | Result is written to R[rIndex] |
ModbusWriteMH | Writes MH | ValueType::R writes R[index] ; VALUE writes a literal |
3.6.7 BasVision
cpp
VisionFind(const std::string& name)
VisionGetOffset(const std::string& name, int32_t index, int32_t labelIndex)
VisionGetQuantity(const std::string& name, int32_t index)| Method | Description | Actual Output |
|---|---|---|
VisionFind | Find | VISION_FIND "name" |
VisionGetOffset | Offset | VISION_GET_OFFSET "name" VR[index] GOTO LABEL[labelIndex] |
VisionGetQuantity | Quantity | VISION_GET_QUANTITY "name" R[index] |
3.6.8 ExtraParam
cpp
Acceleration(Float64 value)
Rctp()
Offset(int32_t index)
Tb(Float64 second, const std::string& type, const std::string& name = "", int32_t index = 0, const std::string& status = "")
Skip(int32_t index)
Approach(Float64 departureDist, Float64 approachingDist)| Method | Description | Key Behavior |
|---|---|---|
Acceleration | Additional acceleration | Values outside 1~120 are output as 100.0 |
Rctp | RTCP parameter | The C++ name is Rctp ; the script output is RTCP |
Offset | Offset parameter | Outputs FRAME_OFFSET PR[index] |
Tb | TB parameter | Must satisfy either "RUN with name " or "ASSIGN with index+status "; otherwise it is marked as an error |
Skip | Skip parameter | Outputs SKIP GOTO LABELn |
Approach | Departure/approach distance | Used only as an additional parameter for Jump instructions |
3.6.9 Execution Semantics
| Item | Description |
|---|---|
GetScript | Returns the current script text |
ExecuteBasScript | Validates first, then automatically appends RETURN / END |
| Closure validation | IF / SWITCH / WHILE must be closed |
Call | Inserts IMPORT name at the script header, then generates CALL "name" |
Minimal Call Example
cpp
#include <iostream> // Standard output stream for printing generated script text
#include "arm_api.h" // Arm entry point and BasScript builder type
#include "status_code.h" // STATUS_CODE for checking builder call results
int main()
{
Arm arm;
STATUS_CODE connectRet = arm.Connect("192.168.110.2", "");
if (connectRet != STATUS_CODE::OK) {
return 1;
}
BasScript script("demo.bas");
STATUS_CODE waitRet = script.structure.WaitTime(
ValueType::VALUE,
Float64{0.1}
);
if (waitRet != STATUS_CODE::OK) {
return 1;
}
STATUS_CODE loadRet = script.structure.Load(
LoadType::STRING,
std::string("demo_program")
);
if (loadRet != STATUS_CODE::OK) {
return 1;
}
std::cout << script.GetScript() << "\n";
// STATUS_CODE execRet = arm.programManager.ExecuteBasScript(script);
return 0;
}Scenario Examples
The snippets below cover the BasScript builder APIs across basic construction, motion statements, logical statements, flow-control statements, and Socket/Modbus/vision statements. The examples only build script text and do not send it to the controller.
Basic Builder and Extra Parameters
cpp
BasScript script("demo.bas");
BasScript emptyScript;
ExtraParam extra;
extra.Acceleration(80.0);
extra.Rctp();
extra.Offset(1);
extra.Tb(0.1, "RUN", "helper.bas");
extra.Skip(10);
extra.Approach(10.0, 10.0);
STATUS_CODE setTfRet = script.SetParam(ParamType::TF_NO, ValueType::VALUE, int32_t{0});
STATUS_CODE assignRet = script.AssignValue(AssignType::R, 1, OtherType::VALUE, Float64{3.14});
std::cout << script.GetScript() << "\n";Generate Motion Statements
cpp
BasScript script("motion.bas");
ExtraParam extra;
extra.Acceleration(80.0);
STATUS_CODE moveJointRet = script.motion.MoveJoint(MovePoseType::PR, 1, SpeedType::VALUE, 20.0, SmoothType::FINE, 0.0, &extra);
STATUS_CODE moveLineRet = script.motion.MoveLine(MovePoseType::PR, 2, SpeedType::VALUE, 100.0, SmoothType::SMOOTH_DISTANCE, 5.0, &extra);
STATUS_CODE moveCircleRet = script.motion.MoveCircle(MovePoseType::PR, 2, MovePoseType::PR, 3, SpeedType::VALUE, 100.0, SmoothType::FINE, 0.0, &extra);
STATUS_CODE moveJumpRet = script.motion.MoveJump(MovePoseType::PR, 4, 100.0, 50.0, SpeedType::VALUE, 20.0, SmoothType::FINE, 0.0, &extra);
STATUS_CODE moveJump3Ret = script.motion.MoveJump3(MovePoseType::PR, std::vector<int32_t>{1, 2, 3}, 100.0, 50.0, SmoothType::FINE, 0.0, &extra);
STATUS_CODE moveJump3cpRet = script.motion.MoveJump3cp(MovePoseType::PR, std::vector<int32_t>{1, 2, 3}, 100.0, SmoothType::FINE, 0.0, &extra);Generate Condition and Loop Statements
cpp
BasScript script("logical.bas");
STATUS_CODE ifRet = script.logical.LogiIf(RegisterType::R, 1, OtherType::VALUE, Float64{1.0}, BooleanOperator::EQ);
STATUS_CODE elseIfRet = script.logical.LogiElseIf(RegisterType::R, 1, OtherType::VALUE, Float64{2.0}, BooleanOperator::EQ);
STATUS_CODE elseRet = script.logical.LogiElse();
STATUS_CODE endIfRet = script.logical.LogiEndIf();
STATUS_CODE switchRet = script.logical.LogiSwitch(RegisterType::R, 1);
STATUS_CODE caseRet = script.logical.LogiCase(OtherType::VALUE, int32_t{1});
STATUS_CODE defaultRet = script.logical.LogiDefault();
STATUS_CODE endSwitchRet = script.logical.LogiEndSwitch();
STATUS_CODE whileRet = script.logical.LogiWhile(RegisterType::R, 1, OtherType::VALUE, Float64{1.0}, BooleanOperator::EQ);
STATUS_CODE continueRet = script.logical.LogiContinue();
STATUS_CODE breakRet = script.logical.LogiBreak();
STATUS_CODE endWhileRet = script.logical.LogiEndWhile();
STATUS_CODE labelRet = script.logical.LogiLabel(10);
STATUS_CODE gotoRet = script.logical.LogiGoto(10);
STATUS_CODE skipRet = script.logical.LogiSkipCondition(IOType::DI, 0, OtherType::IO_STATUS, IOStatus::ON, BooleanOperator::EQ);Generate Flow-Control Statements
cpp
BasScript script("structure.bas");
STATUS_CODE waitRet = script.structure.Wait(IOType::DI, 0, OtherType::IO_STATUS, IOStatus::ON, BooleanOperator::EQ);
STATUS_CODE waitTimeRet = script.structure.WaitTime(ValueType::VALUE, Float64{0.1});
STATUS_CODE pauseRet = script.structure.Pause();
STATUS_CODE abortRet = script.structure.Abort();
STATUS_CODE callRet = script.structure.Call("helper.bas");
STATUS_CODE runRet = script.structure.Run("helper.bas");
STATUS_CODE loadRet = script.structure.Load(LoadType::STRING, std::string("demo_program"));
STATUS_CODE unloadRet = script.structure.Unload(LoadType::STRING, std::string("demo_program"));
STATUS_CODE execRet = script.structure.Exec(LoadType::STRING, std::string("demo_program"));Generate Socket, Modbus, and Vision Statements
cpp
BasScript script("io.bas");
STATUS_CODE socketOpenRet = script.socket.SocketOpen(1);
STATUS_CODE socketConnectRet = script.socket.SocketConnect(1);
STATUS_CODE socketSendRet = script.socket.SocketSend(1, StrType::STRING, std::string("hello"));
STATUS_CODE socketRecvRet = script.socket.SocketRecv(1, 32, StrType::SR, int32_t{1});
STATUS_CODE socketCloseRet = script.socket.SocketClose(1);
STATUS_CODE readMhRet = script.modbus.ModbusReadMH(0, 1, 0, 2, 1);
STATUS_CODE readMiRet = script.modbus.ModbusReadMI(0, 1, 0, 2, 2);
STATUS_CODE writeMhRet = script.modbus.ModbusWriteMH(0, 1, 0, 1, ValueType::VALUE, 10);
STATUS_CODE visionFindRet = script.vision.VisionFind("camera");
STATUS_CODE visionOffsetRet = script.vision.VisionGetOffset("camera", 1, 10);
STATUS_CODE visionQuantityRet = script.vision.VisionGetQuantity("camera", 2);Example code:
cpp
#include "build_bas_script/run.h"
#include "execute_bas_script/run.h"
int main(void)
{
// [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
// [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
return RunBasScriptExecutionBuildBasScript();
// return RunBasScriptExecutionExecuteBasScript();
}