Skip to content

3.6 BasScript 脚本类

概述

BasScript 是 C++17 公开的结构化脚本构造器。

3.6.1 脚本对象本体

cpp
BasScript()
BasScript(const std::string& scriptName)
说明
说明创建脚本对象
备注可带脚本名,也可使用默认构造

公开成员

成员说明
name脚本名
content脚本文本行
flagIfIF 闭合计数
flagSwitchSWITCH 闭合计数
flagWhileWHILE 闭合计数
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) 会预先写入两行: scriptNameSUB 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
MoveJumpJump 语句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()
方法说明关键约束
LogiIfIF支持寄存器、IO、字面量、字符串、IO 状态
LogiElseIfELSE IF同上
LogiElseELSE
LogiEndIfENDIF
LogiSwitchSWITCH实际输出 SELECT
LogiCaseCASEOtherType 只支持 VALUE / STRING
LogiDefaultDEFAULT
LogiEndSwitchENDSELECT
LogiWhileWHILE条件口径同 LogiIf
LogiEndWhileWEND
LogiGotoGOTO目标为 LABELn
LogiLabelLABEL实际输出 脚本名::LABELn
LogiSkipConditionSKIP CONDITION左右两侧都不允许 MH / MI
LogiBreakBREAK
LogiContinueCONTINUE

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::SROtherType 只支持 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写 MHValueType::RR[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 输出
RctpRTCP 参数C++ 侧名称是 Rctp ,脚本输出为 RTCP
Offset偏移参数输出 FRAME_OFFSET PR[index]
TbTB 参数需要满足 “带 name 的 RUN” 或 “带 index+status 的 ASSIGN” 二选一,否则标记错误
SkipSkip 参数输出 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);  // 生成视觉数量语句

示例代码

cpp17/bas_script_execution/src/main.cpp
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();
}