3.6 BasScript 脚本类
概述
BasScript 是 C++17 公开的结构化脚本构造器。
3.6.1 脚本对象本体
cpp
BasScript()
BasScript(const std::string& scriptName)| 项 | 说明 |
|---|---|
| 说明 | 创建脚本对象 |
| 备注 | 可带脚本名,也可使用默认构造 |
公开成员
| 成员 | 说明 |
|---|---|
name | 脚本名 |
content | 脚本文本行 |
flagIf | IF 闭合计数 |
flagSwitch | SWITCH 闭合计数 |
flagWhile | WHILE 闭合计数 |
indent | 当前缩进级别 |
基础方法
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| 方法 | 说明 | 返回 |
|---|---|---|
GetScript | 输出当前构造器已生成的脚本文本 | std::string |
SetParam | 设置脚本参数 | STATUS_CODE |
AssignValue | 赋值 | STATUS_CODE |
补充说明:
BasScript(scriptName)会预先写入两行:scriptName和SUB main。BasScript()创建空脚本对象;需要脚本头时使用带名称构造器。
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)| 方法 | 说明 | 关键约束 |
|---|---|---|
MoveJoint | 关节运动语句 | VALUE 速度范围 0~100 |
MoveLine | 直线运动语句 | VALUE 速度范围 0~5000 |
MoveCircle | 圆弧运动语句 | VALUE 速度范围 0~5000 |
MoveJump | Jump 语句 | speedRatio 范围 0~100 |
MoveJump3 | 三点 Jump 语句 | poseIndex.size() 必须为 3 |
MoveJump3cp | 三点连续 Jump 语句 | poseIndex.size() 必须为 3 |
通用约束:
SmoothType::SMOOTH_DISTANCE时,smoothDistance范围必须为0~1000。- 传入配置无效的
ExtraParam时,运动方法返回INVALID_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()| 方法 | 说明 | 关键约束 |
|---|---|---|
LogiIf | IF | 支持寄存器、IO、字面量、字符串、IO 状态 |
LogiElseIf | ELSE IF | 同上 |
LogiElse | ELSE | 无 |
LogiEndIf | ENDIF | 无 |
LogiSwitch | SWITCH | 实际输出 SELECT |
LogiCase | CASE | OtherType 只支持 VALUE / STRING |
LogiDefault | DEFAULT | 无 |
LogiEndSwitch | ENDSELECT | 无 |
LogiWhile | WHILE | 条件口径同 LogiIf |
LogiEndWhile | WEND | 无 |
LogiGoto | GOTO | 目标为 LABELn |
LogiLabel | LABEL | 实际输出 脚本名::LABELn |
LogiSkipCondition | SKIP CONDITION | 左右两侧都不允许 MH / MI |
LogiBreak | BREAK | 无 |
LogiContinue | CONTINUE | 无 |
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)| 方法 | 说明 | 关键约束 |
|---|---|---|
Wait | 条件等待 | 左操作数不支持 RegisterType::SR ; OtherType 只支持 IO_STATUS |
WaitTime | 时间等待 | VALUE 输出字面量, R 输出 R[index] |
Pause | 暂停 | 无 |
Abort | 中止 | 无 |
Call | 同步调用脚本 | 会在文件头自动插入 IMPORT name |
Run | 异步运行脚本 | 无 |
Load | 加载 | R/SR 传索引, STRING 传字符串, VALUE 传数值 |
Unload | 卸载 | 同 Load |
Exec | 执行 | 同 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)| 方法 | 说明 | 关键约束 |
|---|---|---|
SocketOpen | 打开连接 | 实际输出 SOCKET_OPEN SK[index] |
SocketClose | 关闭连接 | 实际输出 SOCKET_CLOSE SK[index] |
SocketConnect | 建连 | 实际输出 SOCKET_CONNECT SK[index] |
SocketSend | 发送 | SR 只接受整数索引, STRING 只接受字符串 |
SocketRecv | 接收 | SR 只接受整数索引, 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)| 方法 | 说明 | 关键约束 |
|---|---|---|
ModbusReadMH | 读 MH | 结果写入 R[rIndex] |
ModbusReadMI | 读 MI | 结果写入 R[rIndex] |
ModbusWriteMH | 写 MH | ValueType::R 写 R[index] , VALUE 写字面量 |
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)| 方法 | 说明 | 实际输出 |
|---|---|---|
VisionFind | 查找 | VISION_FIND "name" |
VisionGetOffset | 偏移 | VISION_GET_OFFSET "name" VR[index] GOTO LABEL[labelIndex] |
VisionGetQuantity | 数量 | 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)| 方法 | 说明 | 关键行为 |
|---|---|---|
Acceleration | 附加加速度 | 超出 1~120 时按 100.0 输出 |
Rctp | RTCP 参数 | C++ 侧名称是 Rctp ,脚本输出为 RTCP |
Offset | 偏移参数 | 输出 FRAME_OFFSET PR[index] |
Tb | TB 参数 | 需要满足 “带 name 的 RUN” 或 “带 index+status 的 ASSIGN” 二选一,否则标记错误 |
Skip | Skip 参数 | 输出 SKIP GOTO LABELn |
Approach | 出发 / 接近距离 | 只作为 Jump 类指令的附加参数 |
3.6.9 执行语义
| 项 | 说明 |
|---|---|
GetScript | 返回当前脚本文本 |
ExecuteBasScript | 先校验,再自动追加 RETURN / END |
| 闭合校验 | IF / SWITCH / WHILE 必须闭合 |
Call | 会把 IMPORT name 插入脚本头部,再生成 CALL "name" |
最小调用示例
cpp
#include <iostream> // 引入标准输出流,用于打印生成后的脚本文本
#include "arm_api.h" // 引入 Arm 主入口和 BasScript 构造器类型
#include "status_code.h" // 引入 STATUS_CODE,用于检查构造器调用结果
int main() // 示例程序入口
{ // 进入示例主函数
Arm arm; // 创建机器人会话对象
STATUS_CODE connectRet = arm.Connect("192.168.110.2", ""); // 连接控制器,示教器地址留空表示使用默认规则
if (connectRet != STATUS_CODE::OK) { // 判断连接是否失败
return 1; // 连接失败时直接退出
} // 结束连接结果判断
BasScript script("demo.bas"); // 创建带脚本名的 BasScript 构造器
STATUS_CODE waitRet = script.structure.WaitTime( // 追加一条等待时间语句
ValueType::VALUE, // 表示等待时间使用字面量
Float64{0.1} // 设置等待时间为 0.1 秒
); // 结束等待语句构造调用
if (waitRet != STATUS_CODE::OK) { // 判断等待语句构造是否失败
return 1; // 构造失败时返回错误码
} // 结束等待语句结果判断
STATUS_CODE loadRet = script.structure.Load( // 追加一条 LOAD 语句
LoadType::STRING, // 表示程序名直接使用字符串
std::string("demo_program") // 设置要加载的程序名
); // 结束 LOAD 语句构造调用
if (loadRet != STATUS_CODE::OK) { // 判断 LOAD 语句构造是否失败
return 1; // 构造失败时返回错误码
} // 结束 LOAD 语句结果判断
std::cout << script.GetScript() << "\n"; // 打印构造器当前生成的脚本文本
// STATUS_CODE execRet = arm.programManager.ExecuteBasScript(script); // 真正执行会下发到控制器,确认后再取消注释
return 0; // 示例正常结束
} // 结束示例主函数场景化示例
下面几组片段按 “基础构造器、运动语句、逻辑语句、流程语句、Socket/Modbus/ 视觉” 交叉覆盖 BasScript 构造器 API。示例只构造脚本文本,不主动下发到控制器。
基础构造器和附加参数
cpp
BasScript script("demo.bas"); // 创建带脚本头的构造器
BasScript emptyScript; // 创建空构造器,适合只拼接片段的场景
ExtraParam extra; // 创建运动附加参数对象
extra.Acceleration(80.0); // 设置附加加速度
extra.Rctp(); // 追加 RTCP 参数
extra.Offset(1); // 追加 FRAME_OFFSET PR[1]
extra.Tb(0.1, "RUN", "helper.bas"); // 追加 TB RUN 参数
extra.Skip(10); // 追加 SKIP GOTO LABEL10 参数
extra.Approach(10.0, 10.0); // 追加 Jump 接近和离开距离
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}); // 给 R[1] 赋字面量
std::cout << script.GetScript() << "\n"; // 输出当前构造器生成的脚本文本生成运动语句
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); // 生成 Jump 运动语句
STATUS_CODE moveJump3Ret = script.motion.MoveJump3(MovePoseType::PR, std::vector<int32_t>{1, 2, 3}, 100.0, 50.0, SmoothType::FINE, 0.0, &extra); // 生成三点 Jump 语句
STATUS_CODE moveJump3cpRet = script.motion.MoveJump3cp(MovePoseType::PR, std::vector<int32_t>{1, 2, 3}, 100.0, SmoothType::FINE, 0.0, &extra); // 生成三点连续 Jump 语句生成条件和循环语句
cpp
BasScript script("logical.bas"); // 创建用于生成逻辑脚本的构造器
STATUS_CODE ifRet = script.logical.LogiIf(RegisterType::R, 1, OtherType::VALUE, Float64{1.0}, BooleanOperator::EQ); // 生成 IF 条件
STATUS_CODE elseIfRet = script.logical.LogiElseIf(RegisterType::R, 1, OtherType::VALUE, Float64{2.0}, BooleanOperator::EQ); // 生成 ELSEIF 条件
STATUS_CODE elseRet = script.logical.LogiElse(); // 生成 ELSE
STATUS_CODE endIfRet = script.logical.LogiEndIf(); // 生成 ENDIF
STATUS_CODE switchRet = script.logical.LogiSwitch(RegisterType::R, 1); // 生成 SELECT
STATUS_CODE caseRet = script.logical.LogiCase(OtherType::VALUE, int32_t{1}); // 生成 CASE
STATUS_CODE defaultRet = script.logical.LogiDefault(); // 生成 DEFAULT
STATUS_CODE endSwitchRet = script.logical.LogiEndSwitch(); // 生成 ENDSELECT
STATUS_CODE whileRet = script.logical.LogiWhile(RegisterType::R, 1, OtherType::VALUE, Float64{1.0}, BooleanOperator::EQ); // 生成 WHILE
STATUS_CODE continueRet = script.logical.LogiContinue(); // 生成 CONTINUE
STATUS_CODE breakRet = script.logical.LogiBreak(); // 生成 BREAK
STATUS_CODE endWhileRet = script.logical.LogiEndWhile(); // 生成 WEND
STATUS_CODE labelRet = script.logical.LogiLabel(10); // 生成 LABEL10
STATUS_CODE gotoRet = script.logical.LogiGoto(10); // 生成 GOTO LABEL10
STATUS_CODE skipRet = script.logical.LogiSkipCondition(IOType::DI, 0, OtherType::IO_STATUS, IOStatus::ON, BooleanOperator::EQ); // 生成 SKIP 条件生成流程控制语句
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")); // 生成 LOAD 语句
STATUS_CODE unloadRet = script.structure.Unload(LoadType::STRING, std::string("demo_program")); // 生成 UNLOAD 语句
STATUS_CODE execRet = script.structure.Exec(LoadType::STRING, std::string("demo_program")); // 生成 EXEC 语句生成 Socket、Modbus 和视觉语句
cpp
BasScript script("io.bas"); // 创建用于生成外设脚本的构造器
STATUS_CODE socketOpenRet = script.socket.SocketOpen(1); // 生成 SOCKET_OPEN
STATUS_CODE socketConnectRet = script.socket.SocketConnect(1); // 生成 SOCKET_CONNECT
STATUS_CODE socketSendRet = script.socket.SocketSend(1, StrType::STRING, std::string("hello")); // 生成 SOCKET_SEND
STATUS_CODE socketRecvRet = script.socket.SocketRecv(1, 32, StrType::SR, int32_t{1}); // 生成 SOCKET_RECV
STATUS_CODE socketCloseRet = script.socket.SocketClose(1); // 生成 SOCKET_CLOSE
STATUS_CODE readMhRet = script.modbus.ModbusReadMH(0, 1, 0, 2, 1); // 生成 MH 读取语句
STATUS_CODE readMiRet = script.modbus.ModbusReadMI(0, 1, 0, 2, 2); // 生成 MI 读取语句
STATUS_CODE writeMhRet = script.modbus.ModbusWriteMH(0, 1, 0, 1, ValueType::VALUE, 10); // 生成 MH 写入语句
STATUS_CODE visionFindRet = script.vision.VisionFind("camera"); // 生成视觉查找语句
STATUS_CODE visionOffsetRet = script.vision.VisionGetOffset("camera", 1, 10); // 生成视觉偏移语句
STATUS_CODE visionQuantityRet = script.vision.VisionGetQuantity("camera", 2); // 生成视觉数量语句示例代码
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();
}