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 控制运动到目标点时的过渡方式。它会出现在 MOVEJ 、 MOVEL 、 MOVEC 、 JUMP 等运动语句尾部。

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

SpeedType ​

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

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

MoveJoint 在 VALUE 模式下要求速度范围 0~100 ; MoveLine / MoveCircle 在 VALUE 模式下要求速度范围 0~5000 。

2.3.2 寄存器、IO 与逻辑枚举 ​

RegisterType ​

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

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

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 ​

BooleanOperator 是 IF 、 ELSEIF 、 WHILE 、 SKIP CONDITION 和 WAIT 的条件连接或比较符。

值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字符串字面量ASSIGN 、 CASE
IO_STATUSIO 状态常量ASSIGN 、 WAIT
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 ​

ParamType 是 BasScript::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_t 或 Float64输出直接数值
右侧是字符串字面量OtherType::STRINGstd::string输出带引号字符串
右侧是 IO 状态OtherType::IO_STATUSIOStatus输出 ON / OFF / PULSE 等
右侧是当前位姿OtherType::CURRENT_POSECurrentPose输出 J_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::string用于 CASE 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] 变为 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 。
  • WaitParam2 取 OtherType 时,只支持 OtherType::IO_STATUS 。
  • LogiSkipCondition() 左右两侧都不允许 MH / MI 。
  • AssignValue() 中, param1 == AssignType::PR_ELEMENT 时必须提供 optIndex 。
  • AssignValue() 中, param2 == AssignType::PR_ELEMENT 时, value 表示 PR 索引, 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() 中, LoadType 和 LoadValue_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"