2.3 BasScript 类型
头文件:
include/bas_script_types.hinclude/bas_script.h
概述
BasScript 构造器依赖一组枚举和 variant 别名来描述 BAS 指令里的位姿、速度、寄存器、IO、等待条件和程序载入参数。
本页说明 BasScript 构造相关枚举、取值含义及参数组合规则。预留枚举按公开头文件定义列出。
2.3.1 运动相关枚举
MovePoseType
MovePoseType 选择运动指令的点位来源。公开 PR ,也就是用位姿寄存器编号拼出 PR[index] 。
| 值 | BAS 记号 | 说明 |
|---|---|---|
PR | PR | 位姿寄存器口径 |
SmoothType
SmoothType 控制运动到目标点时的过渡方式。它会出现在 MOVEJ 、 MOVEL 、 MOVEC 、 JUMP 等运动语句尾部。
| 值 | BAS 记号 | 说明 |
|---|---|---|
FINE | FINE | 精确到点,语句不再追加平滑距离 |
SMOOTH_DISTANCE | SD | 按平滑距离过渡,会继续使用 smoothDistance 参数 |
SpeedType
SpeedType 控制速度参数是直接数值还是来自 MR 运动寄存器。选择 MR 时, speedValue 会按整数索引解释并输出成 MR[index] 。
| 值 | 输出形式 | 说明 |
|---|---|---|
VALUE | 直接输出数值字面量 | 例如 100.0 、 500.0 |
MR | MR[index] | 速度取自运动寄存器 |
MoveJoint 在 VALUE 模式下要求速度范围 0~100 ; MoveLine / MoveCircle 在 VALUE 模式下要求速度范围 0~5000 。
2.3.2 寄存器、IO 与逻辑枚举
RegisterType
RegisterType 描述逻辑条件、等待条件或 CASE 中可作为操作数的寄存器类型。它用于 “读寄存器参与判断” 的场景,不用于 ASSIGN 左侧赋值目标。
| 值 | BAS 记号 | 说明 |
|---|---|---|
R | R | 数值寄存器 |
SR | SR | 字符串寄存器 |
MH | MH | Modbus 保持寄存器 |
MI | MI | Modbus 输入寄存器 |
IOType
IOType 描述逻辑条件、等待条件或 CASE 中可作为操作数的 IO 类型。它只说明 IO 类别,具体端口号仍由调用参数里的 index 或 value 提供。
| 值 | BAS 记号 | 说明 |
|---|---|---|
DI | DI | 数字输入 |
DO | DO | 数字输出 |
AI | AI | 模拟输入 |
AO | AO | 模拟输出 |
RI | RI | 远程控制输入 |
RO | RO | 远程控制输出 |
UI | UI | 用户 / 专用输入 |
UO | UO | 用户 / 专用输出 |
GI | GI | 组输入 |
GO | GO | 组输出 |
TAI | TAI | 末端模拟输入 |
TAO | TAO | 末端模拟输出 |
TDI | TDI | 末端数字输入 |
TDO | TDO | 末端数字输出 |
IOStatus
IOStatus 是 IO 条件和 IO 赋值里使用的状态常量。数字输出赋值、等待条件、逻辑条件都可能用到它。
| 值 | BAS 记号 | 说明 |
|---|---|---|
ON | ON | 置位、高电平或条件成立 |
OFF | OFF | 复位、低电平或条件不成立 |
PULSE | PULSE | 脉冲,赋值时可带脉冲长度 |
POSITIVE_EDGE | PE | 上升沿 |
NEGATIVE_EDGE | NE | 下降沿 |
BooleanOperator
BooleanOperator 是 IF 、 ELSEIF 、 WHILE 、 SKIP CONDITION 和 WAIT 的条件连接或比较符。
| 值 | BAS 记号 | 说明 |
|---|---|---|
AND | AND | 与 |
OR | OR | 或 |
EQ | = | 等于 |
NE | <> | 不等于 |
GT | > | 大于 |
GE | >= | 大于等于 |
LT | < | 小于 |
LE | <= | 小于等于 |
2.3.3 赋值、载入与参数枚举
AssignType
AssignType 描述 ASSIGN 语句两边可使用的寄存器、坐标系或输出目标。作为 param1 时表示赋值左侧;作为 param2 时表示右侧引用另一个寄存器或目标值。
| 值 | BAS 目标 | 说明 |
|---|---|---|
R | R[index] | 数值寄存器 |
MR | MR[index] | 运动寄存器 |
PR | PR[index] | 位姿寄存器 |
PR_ELEMENT | PR[index].n | 位姿寄存器子元素 |
SR | SR[index] | 字符串寄存器 |
UF | UF[index] | 用户坐标系 |
TF | TF[index] | 工具坐标系 |
MH | MH[index] | Modbus 保持寄存器 |
MI | MI[index] | Modbus 输入寄存器 |
DO | DO[index] | 数字输出 |
RO | RO[index] | 远程输出 |
GO | GO[index] | 组输出 |
AO | AO[index] | 模拟输出 |
TAO | TAO[index] | 手腕端模拟输出 |
TDO | TDO[index] | 手腕端数字输出 |
OtherType
OtherType 用于 AssignParam2 / LogiParam2 这类变体参数,表示右侧不是寄存器或 IO,而是字面量、IO 状态或当前位姿。
| 值 | 含义 | 典型场景 |
|---|---|---|
VALUE | 直接数值 | ASSIGN / 逻辑条件 / CASE |
STRING | 字符串字面量 | ASSIGN 、 CASE |
IO_STATUS | IO 状态常量 | ASSIGN 、 WAIT |
CURRENT_POSE | 当前位姿 | ASSIGN |
CurrentPose
CurrentPose 只在 OtherType::CURRENT_POSE 场景下作为 AssignValue_t 使用,用来把当前机器人位姿写入目标。
| 值 | BAS 记号 | 说明 |
|---|---|---|
J_POS | J_POS | 当前关节位姿 |
L_POS | L_POS | 当前笛卡尔位姿 |
LoadType
LoadType 控制 Load() 、 Unload() 、 Exec() 的程序标识来源。 R / SR 表示从寄存器取程序标识, STRING 表示直接传程序名, VALUE 表示直接传数值字面量。
| 值 | 对应 LoadValue_t | 说明 |
|---|---|---|
R | int32_t | 传寄存器索引,输出 R[index] |
SR | int32_t | 传寄存器索引,输出 SR[index] |
STRING | std::string | 传程序名字符串,输出 STRING "name" |
VALUE | int32_t / Float64 | 直接输出数值字面量 |
StrType
StrType 控制 Socket 收发时字符串内容来自哪里或写到哪里。
| 值 | 对应 SocketValue_t | 说明 |
|---|---|---|
STRING | std::string | 直接发送或接收字符串 |
SR | int32_t | 发送到或接收到 SR[index] |
ValueType
ValueType 是通用数值来源选择,常见于 SetParam() 、 WaitTime() 和 ModbusWriteMH() 。
| 值 | 输出形式 | 说明 |
|---|---|---|
VALUE | 数值字面量 | 直接使用数值字面量 |
R | R[index] | 从数值寄存器读取 |
ParamType
ParamType 是 BasScript::SetParam() 能设置的运行参数目标。
| 值 | BAS 记号 | 说明 |
|---|---|---|
TF_NO | TF_NO | 工具坐标系号 |
UF_NO | UF_NO | 用户坐标系号 |
OVC | OVC | 全局速度 |
OAC | OAC | 全局加速度 |
PAYLOAD_NO | PAYLOAD_NO | 负载编号 |
2.3.4 预留枚举
MathOperator
MathOperator 是预留的四则运算符枚举。
| 值 | 预期含义 |
|---|---|
ADD | 加法 |
SUB | 减法 |
MUL | 乘法 |
DIV | 除法 |
2.3.5 可变参数搭配
本节说明构造器参数的可选类型。调用方按目标 BAS 语句选择匹配的参数形态。
赋值语句
AssignValue() 的第三个参数用于声明右侧操作数类别,第四个参数用于传入右侧操作数取值。
| 目标语义 | 第三个参数 | 第四个参数 | 输出含义 |
|---|---|---|---|
| 右侧是另一个寄存器或坐标系 | AssignType | int32_t 索引 | 例如 AssignType::MR + 8 输出 MR[8] |
| 右侧是 PR 子元素 | AssignType::PR_ELEMENT | int32_t PR 索引, optValue 传子元素编号 | 输出 PR[index].n |
| 右侧是数值字面量 | OtherType::VALUE | int32_t 或 Float64 | 输出直接数值 |
| 右侧是字符串字面量 | OtherType::STRING | std::string | 输出带引号字符串 |
| 右侧是 IO 状态 | OtherType::IO_STATUS | IOStatus | 输出 ON / OFF / PULSE 等 |
| 右侧是当前位姿 | OtherType::CURRENT_POSE | CurrentPose | 输出 J_POS 或 L_POS |
逻辑与等待条件
逻辑条件和等待条件由 “左操作数 + 操作符 + 右操作数” 组成。左操作数通常是寄存器或 IO,右操作数可以继续选择寄存器、IO、字面量或状态常量。
| 别名 | 用在 | 可选类型 | 选择方式 |
|---|---|---|---|
LogiParam1 | LogiIf / 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 的选择匹配 |
WaitParam2 | Wait 右侧 | ValueType / IOType / OtherType | 等待数值用 ValueType ,等待另一路 IO 用 IOType ,等待 ON / OFF 等状态用 OtherType::IO_STATUS |
WaitValue_t | Wait 右侧的实际值 | int32_t / Float64 / IOStatus | 类型必须和 WaitParam2 的选择匹配 |
LogiCaseValue_t | LogiCase 的匹配值 | int32_t / Float64 / std::string | 用于 CASE 1 、 CASE 3.14 、 CASE "name" 这类分支 |
其他可变参数
| 别名 | 用在 | 可选类型 | 选择方式 |
|---|---|---|---|
SocketValue_t | SocketSend / SocketRecv | int32_t / std::string | StrType::SR 时传 SR 索引; StrType::STRING 时传字符串 |
SetParamVal_t | SetParam / WaitTime | int32_t / Float64 | 直接数值可传整数或浮点数; ValueType::R 时按 R 寄存器索引解释 |
LoadValue_t | Load / Unload / Exec | int32_t / Float64 / std::string | LoadType::R / SR 传索引, STRING 传程序名, VALUE 传数值 |
读法示例
下面几个搭配可以直接按输出结果理解:
| 调用意图 | 关键参数 | 输出结果 |
|---|---|---|
| 把 MR [8] 写入 R [5] | AssignType::R, 5, AssignType::MR, int32_t{8} | ASSIGN R[5] = MR[8] |
| 等待 DI [1] 变为 ON | IOType::DI, 1, OtherType::IO_STATUS, IOStatus::ON | WAIT 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 输出示例
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"