Skip to content

2.3 BasScript 类型

头文件:

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

概述

BasScript 构造器依赖一组枚举和 variant 别名来描述 BAS 指令里的位姿、速度、寄存器、IO、等待条件和程序载入参数。

本页说明 BasScript 构造相关枚举、取值含义及参数组合规则。预留枚举按公开头文件定义列出。

2.3.1 运动相关枚举

MovePoseType

MovePoseType 选择运动指令的点位来源。公开 PR ,也就是用位姿寄存器编号拼出 PR[index]

BAS 记号说明
PRPR位姿寄存器口径

SmoothType

SmoothType 控制运动到目标点时的过渡方式。它会出现在 MOVEJMOVELMOVECJUMP 等运动语句尾部。

BAS 记号说明
FINEFINE精确到点,语句不再追加平滑距离
SMOOTH_DISTANCESD按平滑距离过渡,会继续使用 smoothDistance 参数

SpeedType

SpeedType 控制速度参数是直接数值还是来自 MR 运动寄存器。选择 MR 时, speedValue 会按整数索引解释并输出成 MR[index]

输出形式说明
VALUE直接输出数值字面量例如 100.0500.0
MRMR[index]速度取自运动寄存器

MoveJointVALUE 模式下要求速度范围 0~100MoveLine / MoveCircleVALUE 模式下要求速度范围 0~5000

2.3.2 寄存器、IO 与逻辑枚举

RegisterType

RegisterType 描述逻辑条件、等待条件或 CASE 中可作为操作数的寄存器类型。它用于 “读寄存器参与判断” 的场景,不用于 ASSIGN 左侧赋值目标。

BAS 记号说明
RR数值寄存器
SRSR字符串寄存器
MHMHModbus 保持寄存器
MIMIModbus 输入寄存器

IOType

IOType 描述逻辑条件、等待条件或 CASE 中可作为操作数的 IO 类型。它只说明 IO 类别,具体端口号仍由调用参数里的 indexvalue 提供。

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

BooleanOperatorIFELSEIFWHILESKIP CONDITIONWAIT 的条件连接或比较符。

BAS 记号说明
ANDAND
OROR
EQ=等于
NE<>不等于
GT>大于
GE>=大于等于
LT<小于
LE<=小于等于

2.3.3 赋值、载入与参数枚举

AssignType

AssignType 描述 ASSIGN 语句两边可使用的寄存器、坐标系或输出目标。作为 param1 时表示赋值左侧;作为 param2 时表示右侧引用另一个寄存器或目标值。

BAS 目标说明
RR[index]数值寄存器
MRMR[index]运动寄存器
PRPR[index]位姿寄存器
PR_ELEMENTPR[index].n位姿寄存器子元素
SRSR[index]字符串寄存器
UFUF[index]用户坐标系
TFTF[index]工具坐标系
MHMH[index]Modbus 保持寄存器
MIMI[index]Modbus 输入寄存器
DODO[index]数字输出
RORO[index]远程输出
GOGO[index]组输出
AOAO[index]模拟输出
TAOTAO[index]手腕端模拟输出
TDOTDO[index]手腕端数字输出

OtherType

OtherType 用于 AssignParam2 / LogiParam2 这类变体参数,表示右侧不是寄存器或 IO,而是字面量、IO 状态或当前位姿。

含义典型场景
VALUE直接数值ASSIGN / 逻辑条件 / CASE
STRING字符串字面量ASSIGNCASE
IO_STATUSIO 状态常量ASSIGNWAIT
CURRENT_POSE当前位姿ASSIGN

CurrentPose

CurrentPose 只在 OtherType::CURRENT_POSE 场景下作为 AssignValue_t 使用,用来把当前机器人位姿写入目标。

BAS 记号说明
J_POSJ_POS当前关节位姿
L_POSL_POS当前笛卡尔位姿

LoadType

LoadType 控制 Load()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_t发送到或接收到 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 + 8 输出 MR[8]
右侧是 PR 子元素AssignType::PR_ELEMENTint32_t PR 索引, optValue 传子元素编号输出 PR[index].n
右侧是数值字面量OtherType::VALUEint32_tFloat64输出直接数值
右侧是字符串字面量OtherType::STRINGstd::string输出带引号字符串
右侧是 IO 状态OtherType::IO_STATUSIOStatus输出 ON / OFF / PULSE
右侧是当前位姿OtherType::CURRENT_POSECurrentPose输出 J_POSL_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::string用于 CASE 1CASE 3.14CASE "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] 变为 ONIOType::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 时, value 表示 PR 索引, optValue 表示子元素索引。
  • AssignValue() 中, param2 == OtherType::IO_STATUSvalue == 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"