Skip to content

4.6 C99 BasScript 构造器

概述

C99 BasScript 使用 ArmBasScriptHandle*ArmBasExtraParamHandle* 表示构造器句柄。它们是本地脚本文本构造对象,只有执行脚本时才需要传入 ArmHandle*

对应头文件:

  • include/c_arm_bas_script.h

基础接口

Arm_BasScript_Create

c
int Arm_BasScript_Create(ArmBasScriptHandle** outScript);
说明
描述创建空 BAS 脚本构造器。
请求参数outScript : ArmBasScriptHandle** ,输出脚本构造器句柄,成功时写入非空指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_CreateWithName

c
int Arm_BasScript_CreateWithName(const char* scriptName, ArmBasScriptHandle** outScript);
说明
描述创建带脚本名的 BAS 脚本构造器。
请求参数scriptName : const char* ,脚本名称字符串
outScript : ArmBasScriptHandle** ,输出脚本构造器句柄,成功时写入非空指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Destroy

c
void Arm_BasScript_Destroy(ArmBasScriptHandle* script);
说明
描述销毁 BAS 脚本构造器。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值无返回值

Arm_BasScript_Reset

c
int Arm_BasScript_Reset(ArmBasScriptHandle* script);
说明
描述重置 BAS 脚本构造器。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_SetName

c
int Arm_BasScript_SetName(ArmBasScriptHandle* script, const char* scriptName);
说明
描述设置 BAS 脚本名称。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
scriptName : const char* ,脚本名称字符串
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_GetName

c
int Arm_BasScript_GetName(ArmBasScriptHandle* script, char* outBuf, size_t bufSize);
说明
描述读取 BAS 脚本名称。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
outBuf : char* ,输出字符串缓冲区,由调用方分配
bufSize : size_t ,输出缓冲区大小,包含结尾 \0 的空间
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注字符串输出使用调用方提供的缓冲区,缓冲区不足时按状态码返回。

Arm_BasScript_AppendLine

c
int Arm_BasScript_AppendLine(ArmBasScriptHandle* script, const char* line);
说明
描述追加单行 BAS 脚本文本。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
line : const char* ,单行 BAS 脚本文本
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_AppendLines

c
int Arm_BasScript_AppendLines(ArmBasScriptHandle* script, const char* const* lines, size_t lineCount);
说明
描述追加多行 BAS 脚本文本。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
lines : const char* const* ,BAS 脚本文本行数组
lineCount : size_t ,脚本文本行数量
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_GetText

c
int Arm_BasScript_GetText(ArmBasScriptHandle* script, char* outBuf, size_t bufSize);
说明
描述导出当前构造器生成的 BAS 脚本文本。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
outBuf : char* ,输出字符串缓冲区,由调用方分配
bufSize : size_t ,输出缓冲区大小,包含结尾 \0 的空间
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注字符串输出使用调用方提供的缓冲区,缓冲区不足时按状态码返回。

Arm_BasScript_GetLineCount

c
int Arm_BasScript_GetLineCount(ArmBasScriptHandle* script, size_t* outCount);
说明
描述读取当前脚本文本行数。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
outCount : size_t* ,输出数量指针,成功时写入实际数量
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Execute

c
int Arm_BasScript_Execute(ArmHandle* h, ArmBasScriptHandle* script);
说明
描述执行当前构造器生成的 BAS 脚本。
请求参数h : ArmHandle* ,C99 会话句柄,通常来自 Arm_Create() ,业务接口需要先连接成功
script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

值构造接口

Arm_BasValue_Int32

c
ArmBasValue Arm_BasValue_Int32(int32_t value);
说明
描述构造 int32_t 类型的 BAS 参数值。
请求参数value : int32_t ,整数字面量
返回值ArmBasValue ;返回可继续传给 BasScript 构造接口的值对象

Arm_BasValue_Float64

c
ArmBasValue Arm_BasValue_Float64(double value);
说明
描述构造 double 类型的 BAS 参数值。
请求参数value : double ,浮点字面量
返回值ArmBasValue ;返回可继续传给 BasScript 构造接口的值对象

Arm_BasValue_String

c
ArmBasValue Arm_BasValue_String(const char* value);
说明
描述构造字符串类型的 BAS 参数值。
请求参数value : const char* ,字符串字面量,不能为 NULL
返回值ArmBasValue ;返回可继续传给 BasScript 构造接口的值对象

Arm_BasValue_TaggedInt

c
ArmBasValue Arm_BasValue_TaggedInt(int32_t tag, int32_t value);
说明
描述构造带标签的整型 BAS 参数值,用于枚举类参数。
请求参数tag : int32_t ,值标签,指明 ArmBasValue 当前字段含义
value : int32_t ,与标签对应的枚举值或索引值
返回值ArmBasValue ;返回可继续传给 BasScript 构造接口的值对象

指令构造接口

Arm_BasScript_SetParam

c
int Arm_BasScript_SetParam(ArmBasScriptHandle* script, int32_t type, int32_t valueType, ArmBasValue value);
说明
描述生成设置脚本参数的 BAS 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
type : int32_t ,脚本参数类型,取值见 ArmBasParamType
valueType : int32_t ,值来源类型,取值见 ArmBasValueType
value : ArmBasValue ,当 valueType 为直接值时表示参数值;为 R 寄存器时表示 R 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_AssignValue

c
int Arm_BasScript_AssignValue(ArmBasScriptHandle* script, int32_t param1, int32_t index, ArmBasValue param2, ArmBasValue value, int32_t optIndex, int32_t optValue);
说明
描述生成赋值 BAS 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param1 : int32_t ,赋值左侧类型,取值见 ArmBasAssignType
index : int32_t ,赋值左侧编号,例如 R、PR、SR 或 IO 编号
param2 : ArmBasValue ,赋值右侧来源类型,可用寄存器、IO、字面量、字符串或当前位姿
value : ArmBasValue ,赋值右侧值或来源编号
optIndex : int32_t ,PR 元素、IO 组或附加索引
optValue : int32_t ,PR 元素、IO 状态或附加值
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Motion_MoveJoint

c
int Arm_BasScript_Motion_MoveJoint(ArmBasScriptHandle* script, int32_t poseType, int32_t poseIndex, int32_t speedType, double speedValue, int32_t smoothType, double smoothDistance, const ArmBasExtraParamHandle* extraParam);
说明
描述执行或生成关节运动。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
poseType : int32_t ,位姿类型,关节或笛卡尔
poseIndex : int32_t ,PR 点位索引
speedType : int32_t ,速度类型,直接值或寄存器
speedValue : double ,速度值或速度寄存器索引
smoothType : int32_t ,平滑类型
smoothDistance : double ,平滑距离
extraParam : const ArmBasExtraParamHandle* ,BasScript 附加参数构造器句柄,可为 NULL 表示不追加附加参数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Motion_MoveLine

c
int Arm_BasScript_Motion_MoveLine(ArmBasScriptHandle* script, int32_t poseType, int32_t poseIndex, int32_t speedType, double speedValue, int32_t smoothType, double smoothDistance, const ArmBasExtraParamHandle* extraParam);
说明
描述执行或生成直线运动。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
poseType : int32_t ,位姿类型,关节或笛卡尔
poseIndex : int32_t ,PR 点位索引
speedType : int32_t ,速度类型,直接值或寄存器
speedValue : double ,速度值或速度寄存器索引
smoothType : int32_t ,平滑类型
smoothDistance : double ,平滑距离
extraParam : const ArmBasExtraParamHandle* ,BasScript 附加参数构造器句柄,可为 NULL 表示不追加附加参数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Motion_MoveCircle

c
int Arm_BasScript_Motion_MoveCircle(ArmBasScriptHandle* script, int32_t poseType1, int32_t poseIndex1, int32_t poseType2, int32_t poseIndex2, int32_t speedType, double speedValue, int32_t smoothType, double smoothDistance, const ArmBasExtraParamHandle* extraParam);
说明
描述执行或生成圆弧运动。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
poseType1 : int32_t ,途经点来源类型,当前公开取值为 ARM_BAS_MOVE_POSE_PR
poseIndex1 : int32_t ,途经点 PR 索引
poseType2 : int32_t ,终点来源类型,当前公开取值为 ARM_BAS_MOVE_POSE_PR
poseIndex2 : int32_t ,终点 PR 索引
speedType : int32_t ,速度类型,直接值或寄存器
speedValue : double ,速度值或速度寄存器索引
smoothType : int32_t ,平滑类型
smoothDistance : double ,平滑距离
extraParam : const ArmBasExtraParamHandle* ,BasScript 附加参数构造器句柄,可为 NULL 表示不追加附加参数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Motion_MoveJump

c
int Arm_BasScript_Motion_MoveJump(ArmBasScriptHandle* script, int32_t poseType, int32_t poseIndex, double speedValue, double speedRatio, int32_t limZType, double limZValue, int32_t smoothType, double smoothDistance, const ArmBasExtraParamHandle* extraParam);
说明
描述执行 BasScript Motion MoveJump 对应的 C99 接口能力。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
poseType : int32_t ,位姿类型,关节或笛卡尔
poseIndex : int32_t ,PR 点位索引
speedValue : double ,速度值或速度寄存器索引
speedRatio : double ,速度比例
limZType : int32_t ,Jump 限高参数类型
limZValue : double ,Jump 限高值
smoothType : int32_t ,平滑类型
smoothDistance : double ,平滑距离
extraParam : const ArmBasExtraParamHandle* ,BasScript 附加参数构造器句柄,可为 NULL 表示不追加附加参数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Motion_MoveJump3

c
int Arm_BasScript_Motion_MoveJump3(ArmBasScriptHandle* script, int32_t poseType, const int32_t* poseIndexList, size_t poseIndexCount, double speedValue, double speedRatio, int32_t smoothType, double smoothDistance, const ArmBasExtraParamHandle* extraParam);
说明
描述执行 BasScript Motion MoveJump3 对应的 C99 接口能力。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
poseType : int32_t ,位姿类型,关节或笛卡尔
poseIndexList : const int32_t* ,PR 点位索引数组
poseIndexCount : size_t ,PR 点位索引数量
speedValue : double ,速度值或速度寄存器索引
speedRatio : double ,速度比例
smoothType : int32_t ,平滑类型
smoothDistance : double ,平滑距离
extraParam : const ArmBasExtraParamHandle* ,BasScript 附加参数构造器句柄,可为 NULL 表示不追加附加参数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Motion_MoveJump3cp

c
int Arm_BasScript_Motion_MoveJump3cp(ArmBasScriptHandle* script, int32_t poseType, const int32_t* poseIndexList, size_t poseIndexCount, double speedValue, int32_t smoothType, double smoothDistance, const ArmBasExtraParamHandle* extraParam);
说明
描述执行 BasScript Motion MoveJump3cp 对应的 C99 接口能力。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
poseType : int32_t ,位姿类型,关节或笛卡尔
poseIndexList : const int32_t* ,PR 点位索引数组
poseIndexCount : size_t ,PR 点位索引数量
speedValue : double ,速度值或速度寄存器索引
smoothType : int32_t ,平滑类型
smoothDistance : double ,平滑距离
extraParam : const ArmBasExtraParamHandle* ,BasScript 附加参数构造器句柄,可为 NULL 表示不追加附加参数
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_If

c
int Arm_BasScript_Logical_If(ArmBasScriptHandle* script, ArmBasValue param1, int32_t index, ArmBasValue param2, ArmBasValue value, int32_t op);
说明
描述生成 IF 条件语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param1 : ArmBasValue ,条件左侧来源类型,可用寄存器、IO、字面量或字符串
index : int32_t ,条件左侧编号,例如 R、SR 或 IO 编号
param2 : ArmBasValue ,条件右侧来源类型
value : ArmBasValue ,条件右侧值或来源编号
op : int32_t ,比较或逻辑操作符,取值见 ArmBasBooleanOperator
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_ElseIf

c
int Arm_BasScript_Logical_ElseIf(ArmBasScriptHandle* script, ArmBasValue param1, int32_t index, ArmBasValue param2, ArmBasValue value, int32_t op);
说明
描述生成 ELSE IF 条件语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param1 : ArmBasValue ,条件左侧来源类型,可用寄存器、IO、字面量或字符串
index : int32_t ,条件左侧编号,例如 R、SR 或 IO 编号
param2 : ArmBasValue ,条件右侧来源类型
value : ArmBasValue ,条件右侧值或来源编号
op : int32_t ,比较或逻辑操作符,取值见 ArmBasBooleanOperator
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Else

c
int Arm_BasScript_Logical_Else(ArmBasScriptHandle* script);
说明
描述生成 ELSE 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_EndIf

c
int Arm_BasScript_Logical_EndIf(ArmBasScriptHandle* script);
说明
描述生成 ENDIF 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Switch

c
int Arm_BasScript_Logical_Switch(ArmBasScriptHandle* script, ArmBasValue param, int32_t index);
说明
描述生成 SWITCH / SELECT 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param : ArmBasValue ,SELECT 表达式来源类型
index : int32_t ,SELECT 表达式编号,例如 R、SR 或 IO 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Case

c
int Arm_BasScript_Logical_Case(ArmBasScriptHandle* script, ArmBasValue param, ArmBasValue value);
说明
描述生成 CASE 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param : ArmBasValue ,CASE 值来源类型
value : ArmBasValue ,CASE 匹配值或来源编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Default

c
int Arm_BasScript_Logical_Default(ArmBasScriptHandle* script);
说明
描述生成 DEFAULT 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_EndSwitch

c
int Arm_BasScript_Logical_EndSwitch(ArmBasScriptHandle* script);
说明
描述生成 END SWITCH / ENDSELECT 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_While

c
int Arm_BasScript_Logical_While(ArmBasScriptHandle* script, ArmBasValue param1, int32_t index, ArmBasValue param2, ArmBasValue value, int32_t op);
说明
描述生成 WHILE 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param1 : ArmBasValue ,条件左侧来源类型,可用寄存器、IO、字面量或字符串
index : int32_t ,条件左侧编号,例如 R、SR 或 IO 编号
param2 : ArmBasValue ,条件右侧来源类型
value : ArmBasValue ,条件右侧值或来源编号
op : int32_t ,比较或逻辑操作符,取值见 ArmBasBooleanOperator
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_EndWhile

c
int Arm_BasScript_Logical_EndWhile(ArmBasScriptHandle* script);
说明
描述生成 WHILE 结束语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Goto

c
int Arm_BasScript_Logical_Goto(ArmBasScriptHandle* script, int32_t index);
说明
描述生成 GOTO 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,目标 LABEL 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Label

c
int Arm_BasScript_Logical_Label(ArmBasScriptHandle* script, int32_t index);
说明
描述生成 LABEL 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,当前 LABEL 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_SkipCondition

c
int Arm_BasScript_Logical_SkipCondition(ArmBasScriptHandle* script, ArmBasValue param1, int32_t index, ArmBasValue param2, ArmBasValue value, int32_t op);
说明
描述生成 SKIP CONDITION 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param1 : ArmBasValue ,条件左侧来源类型,可用寄存器、IO、字面量或字符串
index : int32_t ,条件左侧编号,例如 R、SR 或 IO 编号
param2 : ArmBasValue ,条件右侧来源类型
value : ArmBasValue ,条件右侧值或来源编号
op : int32_t ,比较或逻辑操作符,取值见 ArmBasBooleanOperator
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Break

c
int Arm_BasScript_Logical_Break(ArmBasScriptHandle* script);
说明
描述生成 BREAK 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Logical_Continue

c
int Arm_BasScript_Logical_Continue(ArmBasScriptHandle* script);
说明
描述生成 CONTINUE 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Wait

c
int Arm_BasScript_Structure_Wait(ArmBasScriptHandle* script, ArmBasValue param1, int32_t index, ArmBasValue param2, ArmBasValue value, int32_t op);
说明
描述生成条件等待语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
param1 : ArmBasValue ,等待条件左侧来源类型
index : int32_t ,等待条件左侧编号,例如 R、SR 或 IO 编号
param2 : ArmBasValue ,等待条件右侧来源类型
value : ArmBasValue ,等待条件右侧值或来源编号
op : int32_t ,比较或逻辑操作符,取值见 ArmBasBooleanOperator
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_WaitTime

c
int Arm_BasScript_Structure_WaitTime(ArmBasScriptHandle* script, int32_t valueType, ArmBasValue value);
说明
描述生成按时间等待语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
valueType : int32_t ,时间来源类型,取值见 ArmBasValueType
value : ArmBasValue ,等待时间秒数或 R 寄存器编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Pause

c
int Arm_BasScript_Structure_Pause(ArmBasScriptHandle* script);
说明
描述生成暂停语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Abort

c
int Arm_BasScript_Structure_Abort(ArmBasScriptHandle* script);
说明
描述生成中止语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Call

c
int Arm_BasScript_Structure_Call(ArmBasScriptHandle* script, const char* name);
说明
描述生成同步调用脚本语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
name : const char* ,被同步调用的脚本名,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Run

c
int Arm_BasScript_Structure_Run(ArmBasScriptHandle* script, const char* name);
说明
描述生成异步运行脚本语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
name : const char* ,被异步运行的脚本名,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Load

c
int Arm_BasScript_Structure_Load(ArmBasScriptHandle* script, int32_t loadType, ArmBasValue value);
说明
描述生成 LOAD 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
loadType : int32_t ,程序标识来源,取值见 ArmBasLoadType
value : ArmBasValue ,脚本名、R/SR 编号或直接值
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Unload

c
int Arm_BasScript_Structure_Unload(ArmBasScriptHandle* script, int32_t loadType, ArmBasValue value);
说明
描述生成 UNLOAD 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
loadType : int32_t ,程序标识来源,取值见 ArmBasLoadType
value : ArmBasValue ,脚本名、R/SR 编号或直接值
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Structure_Exec

c
int Arm_BasScript_Structure_Exec(ArmBasScriptHandle* script, int32_t loadType, ArmBasValue value);
说明
描述生成 EXEC 语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
loadType : int32_t ,程序标识来源,取值见 ArmBasLoadType
value : ArmBasValue ,脚本名、R/SR 编号或直接值
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Socket_Open

c
int Arm_BasScript_Socket_Open(ArmBasScriptHandle* script, int32_t index);
说明
描述生成 Socket 打开语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Socket 通道编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Socket_Close

c
int Arm_BasScript_Socket_Close(ArmBasScriptHandle* script, int32_t index);
说明
描述生成 Socket 关闭语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Socket 通道编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Socket_Connect

c
int Arm_BasScript_Socket_Connect(ArmBasScriptHandle* script, int32_t index);
说明
描述生成 Socket 建连语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Socket 通道编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Socket_Send

c
int Arm_BasScript_Socket_Send(ArmBasScriptHandle* script, int32_t index, int32_t msgType, ArmBasValue value);
说明
描述生成 Socket 发送语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Socket 通道编号
msgType : int32_t ,Socket 消息类型,取值见 ArmBasStrType
value : ArmBasValueARM_BAS_STR_STRING 时为字符串, ARM_BAS_STR_SR 时为 SR 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Socket_Recv

c
int Arm_BasScript_Socket_Recv(ArmBasScriptHandle* script, int32_t index, int32_t msgLength, int32_t msgType, ArmBasValue value);
说明
描述生成 Socket 接收语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Socket 通道编号
msgLength : int32_t ,接收消息长度
msgType : int32_t ,Socket 消息类型,取值见 ArmBasStrType
value : ArmBasValueARM_BAS_STR_STRING 时为字符串变量名, ARM_BAS_STR_SR 时为 SR 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Modbus_ReadMH

c
int Arm_BasScript_Modbus_ReadMH(ArmBasScriptHandle* script, int32_t index, int32_t id, int32_t address, int32_t length, int32_t rIndex);
说明
描述生成读取 MH 的 Modbus 脚本语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Modbus 语句索引
id : int32_t ,Modbus 从站 ID
address : int32_t ,MH 起始地址
length : int32_t ,读取长度
rIndex : int32_t ,结果写入的 R 寄存器编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Modbus_ReadMI

c
int Arm_BasScript_Modbus_ReadMI(ArmBasScriptHandle* script, int32_t index, int32_t id, int32_t address, int32_t length, int32_t rIndex);
说明
描述生成读取 MI 的 Modbus 脚本语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Modbus 语句索引
id : int32_t ,Modbus 从站 ID
address : int32_t ,MI 起始地址
length : int32_t ,读取长度
rIndex : int32_t ,结果写入的 R 寄存器编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Modbus_WriteMH

c
int Arm_BasScript_Modbus_WriteMH(ArmBasScriptHandle* script, int32_t index, int32_t id, int32_t address, int32_t length, int32_t valueType, int32_t value);
说明
描述生成写入 MH 的 Modbus 脚本语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
index : int32_t ,Modbus 语句索引
id : int32_t ,Modbus 从站 ID
address : int32_t ,MH 起始地址
length : int32_t ,写入长度
valueType : int32_t ,写入值来源,取值见 ArmBasValueType
value : int32_t ,直接写入值或 R 寄存器编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Vision_Find

c
int Arm_BasScript_Vision_Find(ArmBasScriptHandle* script, const char* name);
说明
描述生成视觉查找语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
name : const char* ,视觉任务名称,不能为 NULL
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Vision_GetOffset

c
int Arm_BasScript_Vision_GetOffset(ArmBasScriptHandle* script, const char* name, int32_t index, int32_t labelIndex);
说明
描述生成获取视觉偏移语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
name : const char* ,视觉任务名称,不能为 NULL
index : int32_t ,视觉偏移结果编号
labelIndex : int32_t ,偏移失败时跳转的标签编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasScript_Vision_GetQuantity

c
int Arm_BasScript_Vision_GetQuantity(ArmBasScriptHandle* script, const char* name, int32_t index);
说明
描述生成获取视觉数量语句。
请求参数script : ArmBasScriptHandle* ,BasScript 脚本构造器句柄
name : const char* ,视觉任务名称,不能为 NULL
index : int32_t ,数量结果写入编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

附加参数接口

Arm_BasExtraParam_Create

c
int Arm_BasExtraParam_Create(ArmBasExtraParamHandle** outExtraParam);
说明
描述创建 BAS 附加参数构造器。
请求参数outExtraParam : ArmBasExtraParamHandle** ,输出附加参数构造器句柄,成功时写入非空指针
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_Destroy

c
void Arm_BasExtraParam_Destroy(ArmBasExtraParamHandle* extraParam);
说明
描述销毁 BAS 附加参数构造器。
请求参数extraParam : ArmBasExtraParamHandle* ,需要销毁的附加参数构造器;可为 NULL
返回值无返回值

Arm_BasExtraParam_Reset

c
int Arm_BasExtraParam_Reset(ArmBasExtraParamHandle* extraParam);
说明
描述重置 BAS 附加参数构造器。
请求参数extraParam : ArmBasExtraParamHandle* ,需要重置的附加参数构造器
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_GetText

c
int Arm_BasExtraParam_GetText(ArmBasExtraParamHandle* extraParam, char* outBuf, size_t bufSize);
说明
描述导出当前附加参数文本。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
outBuf : char* ,输出字符串缓冲区,由调用方分配
bufSize : size_t ,输出缓冲区大小,包含结尾 \0 的空间
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理
备注字符串输出使用调用方提供的缓冲区,缓冲区不足时按状态码返回。

Arm_BasExtraParam_Acceleration

c
int Arm_BasExtraParam_Acceleration(ArmBasExtraParamHandle* extraParam, double value);
说明
描述追加加速度附加参数。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
value : double ,附加加速度,超出 1~120 时按 100.0 输出
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_Rctp

c
int Arm_BasExtraParam_Rctp(ArmBasExtraParamHandle* extraParam);
说明
描述追加 RTCP 附加参数。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_Offset

c
int Arm_BasExtraParam_Offset(ArmBasExtraParamHandle* extraParam, int32_t index);
说明
描述追加坐标偏移附加参数。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
index : int32_t ,偏移使用的 PR 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_Tb

c
int Arm_BasExtraParam_Tb(ArmBasExtraParamHandle* extraParam, double second, const char* type, const char* name, int32_t index, const char* status);
说明
描述追加 TB 附加参数。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
second : double ,时间参数,单位秒
type : const char* ,TB 类型,例如 RUNASSIGN
name : const char*RUN 类型使用的脚本名,可按 TB 类型传空
index : int32_tASSIGN 类型使用的索引
status : const char*ASSIGN 类型使用的状态字符串
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_Skip

c
int Arm_BasExtraParam_Skip(ArmBasExtraParamHandle* extraParam, int32_t index);
说明
描述追加 Skip 附加参数。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
index : int32_t ,跳转的 LABEL 编号
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

Arm_BasExtraParam_Approach

c
int Arm_BasExtraParam_Approach(ArmBasExtraParamHandle* extraParam, double departureDist, double approachingDist);
说明
描述追加 Jump 接近 / 离开距离参数。
请求参数extraParam : ArmBasExtraParamHandle* ,附加参数构造器
departureDist : double ,Jump 离开距离
approachingDist : double ,Jump 接近距离
返回值STATUS_CODE 整数值; 0 表示成功,其他值按状态码处理

枚举与值

枚举说明
ArmBasMovePoseType运动点位来源,公开 ARM_BAS_MOVE_POSE_PR
ArmBasSmoothType精确到点或按距离平滑
ArmBasSpeedType速度来自直接数值或 MR
ArmBasRegisterTypeR / SR / MH / MI
ArmBasIOTypeDI / DO / AI / AO / RI / RO / UI / UO / GI / GO / TAI / TAO / TDI / TDO
ArmBasIOStatusON / OFF / PULSE / 上升沿 / 下降沿
ArmBasBooleanOperatorAND / OR / EQ / NE / GT / GE / LT / LE
ArmBasAssignTypeASSIGN 左侧目标或右侧来源
ArmBasOtherType字面量、字符串、IO 状态、当前位姿
ArmBasCurrentPose当前关节或笛卡尔位姿
ArmBasLoadTypeLOAD / UNLOAD / EXEC 的程序标识来源
ArmBasStrTypeSocket 字符串或 SR
ArmBasValueType直接值或 R 寄存器
ArmBasParamTypeTF、UF、OVC、OAC、负载编号
ArmBasMathOperator预留四则运算枚举
ArmBasValueTag指明 ArmBasValue 当前字段含义

关键语义

类别说明
运动速度MoveJoint 使用直接速度值时范围为 0~100MoveLineMoveCircle 使用直接速度值时范围为 0~5000
Jump 点位MoveJump3MoveJump3cpposeIndexList 必须包含 3 个 PR 点位索引。
条件语句IF、ELSE IF、WHILE、WAIT、SKIP CONDITION 使用同一套条件参数口径,支持寄存器、IO、字面量、字符串和 IO 状态。
SELECT 语句Arm_BasScript_Logical_Switch() 输出 SELECT; Arm_BasScript_Logical_EndSwitch() 输出 ENDSELECT。
闭合校验IF / SELECT / WHILE 必须闭合;导出或执行脚本文本前应补齐对应结束语句。
SocketARM_BAS_STR_STRING 使用字符串值, ARM_BAS_STR_SR 使用 SR 编号。
ModbusReadMH / ReadMI 将结果写入 R 寄存器; WriteMH 可写直接值或 R 寄存器值。
附加加速度Arm_BasExtraParam_Acceleration() 的有效范围为 1~120 ;超出范围时按 100.0 输出。
TB 附加参数TB 参数需要满足 “带 name 的 RUN” 或 “带 index + status 的 ASSIGN” 二选一。
ApproachArm_BasExtraParam_Approach() 只作为 Jump 类指令的附加参数。

构造器规则

  • Arm_BasScript_Create() 创建空构造器。
  • Arm_BasScript_CreateWithName() 创建带脚本名的构造器,并生成脚本头。
  • Arm_BasScript_SetName() 只修改名称,已有内容保持不变。
  • Arm_BasScript_AppendLine() / Arm_BasScript_AppendLines() 只追加脚本文本。
  • Arm_BasScript_GetText() 序列化当前内容;需要脚本头时使用 Arm_BasScript_CreateWithName()
  • Arm_BasScript_Reset() 回到创建时的模式。
  • Arm_BasScript_Execute() 通过 ArmHandle* 执行构造器生成的脚本。
  • Arm_BasExtraParam_GetText() 输出当前附加参数文本。

最小调用示例

c
#include <stdio.h>  // 引入 printf,用于打印生成后的脚本文本
#include "c_arm_api.h"  // 引入 C99 SDK 总头文件
int main(void)  // 示例程序入口
{  // 进入示例主函数
    ArmBasScriptHandle* script = NULL;  // 准备脚本构造器句柄
    char text[2048] = {0};  // 准备脚本文本输出缓冲区
    int ret = Arm_BasScript_CreateWithName("demo.bas", &script);  // 创建带名称的脚本构造器
    if (ret != 0 || script == NULL) {  // 判断构造器是否创建失败
        return 1;  // 创建失败时退出
    }  // 结束创建判断
    Arm_BasScript_Structure_WaitTime(script, ARM_BAS_VALUE_TYPE_VALUE, Arm_BasValue_Float64(0.1));  // 追加等待语句
    Arm_BasScript_GetText(script, text, sizeof(text));  // 导出脚本文本
    printf("%s\n", text);  // 打印脚本文本
    Arm_BasScript_Destroy(script);  // 销毁脚本构造器
    return 0;  // 示例成功结束
}  // 结束示例主函数

场景化示例

运动语句和附加参数

c
ArmBasScriptHandle* script = NULL;  // 准备脚本构造器
ArmBasExtraParamHandle* extra = NULL;  // 准备附加参数构造器
int createRet = Arm_BasScript_Create(&script);  // 创建脚本构造器
int extraRet = Arm_BasExtraParam_Create(&extra);  // 创建附加参数构造器
Arm_BasExtraParam_Acceleration(extra, 80.0);  // 设置附加加速度
Arm_BasExtraParam_Rctp(extra);  // 设置 RTCP 附加参数
Arm_BasExtraParam_Offset(extra, 1);  // 设置 FRAME_OFFSET PR[1]
Arm_BasExtraParam_Skip(extra, 10);  // 设置 SKIP GOTO LABEL10
Arm_BasExtraParam_Approach(extra, 20.0, 10.0);  // 设置 Jump 接近 / 离开距离
Arm_BasScript_Motion_MoveJoint(script, ARM_BAS_MOVE_POSE_PR, 1, ARM_BAS_SPEED_VALUE, 30.0, ARM_BAS_SMOOTH_FINE, 0.0, extra);  // 生成关节运动语句
Arm_BasScript_Motion_MoveLine(script, ARM_BAS_MOVE_POSE_PR, 2, ARM_BAS_SPEED_VALUE, 30.0, ARM_BAS_SMOOTH_DISTANCE, 5.0, extra);  // 生成直线运动语句
Arm_BasScript_Motion_MoveCircle(script, ARM_BAS_MOVE_POSE_PR, 2, ARM_BAS_MOVE_POSE_PR, 3, ARM_BAS_SPEED_VALUE, 20.0, ARM_BAS_SMOOTH_FINE, 0.0, extra);  // 生成圆弧运动语句
Arm_BasScript_Motion_MoveJump(script, ARM_BAS_MOVE_POSE_PR, 4, 40.0, 80.0, ARM_BAS_VALUE_TYPE_VALUE, 100.0, ARM_BAS_SMOOTH_FINE, 0.0, extra);  // 生成 Jump 语句
(void)createRet;  // 示例中保留创建状态码
(void)extraRet;  // 示例中保留附加参数创建状态码
Arm_BasExtraParam_Destroy(extra);  // 销毁附加参数构造器
Arm_BasScript_Destroy(script);  // 销毁脚本构造器

逻辑、流程、Socket、Modbus 和视觉

c
ArmBasScriptHandle* script = NULL;  // 准备脚本构造器
Arm_BasScript_Create(&script);  // 创建脚本构造器
Arm_BasScript_SetParam(script, ARM_BAS_PARAM_OVC, ARM_BAS_VALUE_TYPE_VALUE, Arm_BasValue_Float64(20.0));  // 设置 OVC
Arm_BasScript_AssignValue(script, ARM_BAS_ASSIGN_R, 1, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_VALUE), Arm_BasValue_Float64(1.0), 0, 0);  // 生成赋值语句
Arm_BasScript_Logical_If(script, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_REGISTER_TYPE, ARM_BAS_REGISTER_R), 1, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_VALUE), Arm_BasValue_Float64(1.0), ARM_BAS_BOOLEAN_EQ);  // 生成 IF
Arm_BasScript_Logical_Else(script);  // 生成 ELSE
Arm_BasScript_Logical_EndIf(script);  // 生成 ENDIF
Arm_BasScript_Logical_Switch(script, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_REGISTER_TYPE, ARM_BAS_REGISTER_R), 1);  // 生成 SWITCH
Arm_BasScript_Logical_Case(script, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_VALUE), Arm_BasValue_Int32(1));  // 生成 CASE
Arm_BasScript_Logical_Default(script);  // 生成 DEFAULT
Arm_BasScript_Logical_EndSwitch(script);  // 生成 ENDSWITCH
Arm_BasScript_Logical_While(script, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_REGISTER_TYPE, ARM_BAS_REGISTER_R), 1, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_VALUE), Arm_BasValue_Float64(0.0), ARM_BAS_BOOLEAN_GT);  // 生成 WHILE
Arm_BasScript_Logical_Break(script);  // 生成 BREAK
Arm_BasScript_Logical_Continue(script);  // 生成 CONTINUE
Arm_BasScript_Logical_EndWhile(script);  // 生成 ENDWHILE
Arm_BasScript_Logical_Label(script, 10);  // 生成 LABEL
Arm_BasScript_Logical_Goto(script, 10);  // 生成 GOTO
Arm_BasScript_Logical_SkipCondition(script, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_IO_TYPE, ARM_BAS_IO_DI), 1, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_IO_STATUS), Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_IO_STATUS, ARM_BAS_IO_STATUS_ON), ARM_BAS_BOOLEAN_EQ);  // 生成 SKIP 条件
Arm_BasScript_Structure_Wait(script, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_IO_TYPE, ARM_BAS_IO_DI), 1, Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_IO_STATUS), Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_IO_STATUS, ARM_BAS_IO_STATUS_ON), ARM_BAS_BOOLEAN_EQ);  // 生成 WAIT 条件
Arm_BasScript_Structure_Pause(script);  // 生成暂停语句
Arm_BasScript_Structure_Call(script, "sub.bas");  // 生成 CALL
Arm_BasScript_Structure_Run(script, "sub.bas");  // 生成 RUN
Arm_BasScript_Structure_Load(script, ARM_BAS_LOAD_STRING, Arm_BasValue_String("sub.bas"));  // 生成 LOAD
Arm_BasScript_Structure_Unload(script, ARM_BAS_LOAD_STRING, Arm_BasValue_String("sub.bas"));  // 生成 UNLOAD
Arm_BasScript_Structure_Exec(script, ARM_BAS_LOAD_STRING, Arm_BasValue_String("sub.bas"));  // 生成 EXEC
Arm_BasScript_Socket_Open(script, 1);  // 生成 Socket Open
Arm_BasScript_Socket_Connect(script, 1);  // 生成 Socket Connect
Arm_BasScript_Socket_Send(script, 1, ARM_BAS_STR_STRING, Arm_BasValue_String("ping"));  // 生成 Socket Send
Arm_BasScript_Socket_Recv(script, 1, 128, ARM_BAS_STR_SR, Arm_BasValue_Int32(1));  // 生成 Socket Recv
Arm_BasScript_Socket_Close(script, 1);  // 生成 Socket Close
Arm_BasScript_Modbus_ReadMH(script, 1, 1, 0, 2, 1);  // 生成读 MH
Arm_BasScript_Modbus_ReadMI(script, 1, 1, 0, 2, 1);  // 生成读 MI
Arm_BasScript_Modbus_WriteMH(script, 1, 1, 0, 1, ARM_BAS_VALUE_TYPE_VALUE, 7);  // 生成写 MH
Arm_BasScript_Vision_Find(script, "camera");  // 生成视觉查找
Arm_BasScript_Vision_GetOffset(script, "camera", 1, 10);  // 生成视觉偏移
Arm_BasScript_Vision_GetQuantity(script, "camera", 1);  // 生成视觉数量
Arm_BasScript_Structure_Abort(script);  // 生成中止语句
Arm_BasScript_Destroy(script);  // 销毁脚本构造器

示例代码

c99/bas_script_execution/src/main.cpp
cpp
#include <stdio.h>

#include "c_arm_api.h"

int main(void)
{
    // [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
    // [EN] This example hard-codes the connection addresses in the source code.
    const char* controller_ip = "10.27.1.2";
    const char* teach_panel_ip = "10.27.1.102";
    const int execute_generated_script = 0;
    int overall_status = 0;

#define RECORD_STATUS(label, expr) \
    do { \
        int status = (expr); \
        printf("[c99_bas_script] %s status: %d\n", (label), status); \
        if (status != 0) { \
            overall_status = status; \
        } \
    } while (0)

    // [ZH] 创建并连接 SDK 句柄。构造脚本文本本身不需要连接,执行脚本才需要连接。
    // [EN] Create and connect the SDK handle. Building text does not need a connection; executing does.
    ArmHandle* handle = Arm_Create();
    if (handle == NULL) {
        printf("[c99_bas_script] 创建句柄失败 / Create handle failed\n");
        return 1;
    }

    int connect_ret = Arm_Connect(handle, controller_ip, teach_panel_ip);
    if (connect_ret != 0) {
        printf("[c99_bas_script] 连接机器人失败 / Connect failed: %d\n", connect_ret);
        Arm_Destroy(handle);
        return 1;
    }
    printf("[c99_bas_script] 机器人连接成功 / Robot connected successfully\n");

    // [ZH] 覆盖空构造器、命名、追加原始文本、行数、导出文本和 Reset。
    // [EN] Cover empty creation, naming, raw append, line count, text export, and reset.
    ArmBasScriptHandle* scratch_script = NULL;
    RECORD_STATUS("Create", Arm_BasScript_Create(&scratch_script));
    RECORD_STATUS("SetName", Arm_BasScript_SetName(scratch_script, "scratch.bas"));
    RECORD_STATUS("AppendLine", Arm_BasScript_AppendLine(scratch_script, "WAIT TIME 0.1"));
    const char* raw_lines[2] = {"R[1]=1", "R[2]=2"};
    RECORD_STATUS("AppendLines", Arm_BasScript_AppendLines(scratch_script, raw_lines, 2U));
    size_t scratch_line_count = 0U;
    RECORD_STATUS("GetLineCount", Arm_BasScript_GetLineCount(scratch_script, &scratch_line_count));
    char scratch_text[2048] = {0};
    RECORD_STATUS("GetText(scratch)", Arm_BasScript_GetText(scratch_script, scratch_text, sizeof(scratch_text)));
    RECORD_STATUS("Reset", Arm_BasScript_Reset(scratch_script));
    printf("[c99_bas_script] scratch line count: %zu\n", scratch_line_count);
    printf("[c99_bas_script] scratch text:\n%s\n", scratch_text);
    Arm_BasScript_Destroy(scratch_script);

    // [ZH] 创建主脚本和附加参数构造器。
    // [EN] Create the main script and extra-parameter builder.
    ArmBasScriptHandle* script = NULL;
    ArmBasExtraParamHandle* extra = NULL;
    RECORD_STATUS("CreateWithName", Arm_BasScript_CreateWithName("example_c99.bas", &script));
    RECORD_STATUS("ExtraParam_Create", Arm_BasExtraParam_Create(&extra));
    RECORD_STATUS("ExtraParam_Acceleration", Arm_BasExtraParam_Acceleration(extra, 80.0));
    RECORD_STATUS("ExtraParam_Rctp", Arm_BasExtraParam_Rctp(extra));
    RECORD_STATUS("ExtraParam_Offset", Arm_BasExtraParam_Offset(extra, 1));
    RECORD_STATUS("ExtraParam_Tb", Arm_BasExtraParam_Tb(extra, 0.1, "RUN", "helper.bas", 0, ""));
    RECORD_STATUS("ExtraParam_Skip", Arm_BasExtraParam_Skip(extra, 10));
    RECORD_STATUS("ExtraParam_Approach", Arm_BasExtraParam_Approach(extra, 10.0, 5.0));
    char extra_text[1024] = {0};
    RECORD_STATUS("ExtraParam_GetText", Arm_BasExtraParam_GetText(extra, extra_text, sizeof(extra_text)));
    printf("[c99_bas_script] extra text: %s\n", extra_text);

    // [ZH] 覆盖基础参数与赋值接口。
    // [EN] Cover parameter and assignment APIs.
    RECORD_STATUS(
        "SetParam",
        Arm_BasScript_SetParam(
            script,
            ARM_BAS_PARAM_OVC,
            ARM_BAS_VALUE_TYPE_VALUE,
            Arm_BasValue_Float64(20.0)
        )
    );
    RECORD_STATUS(
        "AssignValue(value)",
        Arm_BasScript_AssignValue(
            script,
            ARM_BAS_ASSIGN_R,
            1,
            Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_VALUE),
            Arm_BasValue_Float64(3.14),
            0,
            0
        )
    );
    RECORD_STATUS(
        "AssignValue(string)",
        Arm_BasScript_AssignValue(
            script,
            ARM_BAS_ASSIGN_SR,
            1,
            Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_STRING),
            Arm_BasValue_String("hello"),
            0,
            0
        )
    );

    // [ZH] 覆盖运动语句构造接口。
    // [EN] Cover motion-statement construction APIs.
    int32_t jump_points[3] = {1, 2, 3};
    RECORD_STATUS(
        "Motion_MoveJoint",
        Arm_BasScript_Motion_MoveJoint(
            script, ARM_BAS_MOVE_POSE_PR, 1, ARM_BAS_SPEED_VALUE, 20.0,
            ARM_BAS_SMOOTH_FINE, 0.0, extra
        )
    );
    RECORD_STATUS(
        "Motion_MoveLine",
        Arm_BasScript_Motion_MoveLine(
            script, ARM_BAS_MOVE_POSE_PR, 2, ARM_BAS_SPEED_VALUE, 100.0,
            ARM_BAS_SMOOTH_DISTANCE, 5.0, extra
        )
    );
    RECORD_STATUS(
        "Motion_MoveCircle",
        Arm_BasScript_Motion_MoveCircle(
            script, ARM_BAS_MOVE_POSE_PR, 2, ARM_BAS_MOVE_POSE_PR, 3,
            ARM_BAS_SPEED_VALUE, 100.0, ARM_BAS_SMOOTH_FINE, 0.0, extra
        )
    );
    RECORD_STATUS(
        "Motion_MoveJump",
        Arm_BasScript_Motion_MoveJump(
            script, ARM_BAS_MOVE_POSE_PR, 4, 100.0, 50.0,
            ARM_BAS_SPEED_VALUE, 20.0, ARM_BAS_SMOOTH_FINE, 0.0, extra
        )
    );
    RECORD_STATUS(
        "Motion_MoveJump3",
        Arm_BasScript_Motion_MoveJump3(
            script, ARM_BAS_MOVE_POSE_PR, jump_points, 3U, 100.0, 50.0,
            ARM_BAS_SMOOTH_FINE, 0.0, extra
        )
    );
    RECORD_STATUS(
        "Motion_MoveJump3cp",
        Arm_BasScript_Motion_MoveJump3cp(
            script, ARM_BAS_MOVE_POSE_PR, jump_points, 3U, 100.0,
            ARM_BAS_SMOOTH_FINE, 0.0, extra
        )
    );

    // [ZH] 覆盖逻辑语句构造接口。
    // [EN] Cover logical-statement construction APIs.
    ArmBasValue reg_r = Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_REGISTER_TYPE, ARM_BAS_REGISTER_R);
    ArmBasValue io_di = Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_IO_TYPE, ARM_BAS_IO_DI);
    ArmBasValue other_value = Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_VALUE);
    ArmBasValue other_status = Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_OTHER_TYPE, ARM_BAS_OTHER_IO_STATUS);
    ArmBasValue status_on = Arm_BasValue_TaggedInt(ARM_BAS_VALUE_TAG_IO_STATUS, ARM_BAS_IO_STATUS_ON);
    RECORD_STATUS("Logical_If", Arm_BasScript_Logical_If(script, reg_r, 1, other_value, Arm_BasValue_Int32(1), ARM_BAS_BOOLEAN_EQ));
    RECORD_STATUS("Logical_ElseIf", Arm_BasScript_Logical_ElseIf(script, reg_r, 1, other_value, Arm_BasValue_Int32(2), ARM_BAS_BOOLEAN_EQ));
    RECORD_STATUS("Logical_Else", Arm_BasScript_Logical_Else(script));
    RECORD_STATUS("Logical_EndIf", Arm_BasScript_Logical_EndIf(script));
    RECORD_STATUS("Logical_Switch", Arm_BasScript_Logical_Switch(script, reg_r, 1));
    RECORD_STATUS("Logical_Case", Arm_BasScript_Logical_Case(script, other_value, Arm_BasValue_Int32(1)));
    RECORD_STATUS("Logical_Default", Arm_BasScript_Logical_Default(script));
    RECORD_STATUS("Logical_EndSwitch", Arm_BasScript_Logical_EndSwitch(script));
    RECORD_STATUS("Logical_While", Arm_BasScript_Logical_While(script, reg_r, 1, other_value, Arm_BasValue_Int32(3), ARM_BAS_BOOLEAN_LT));
    RECORD_STATUS("Logical_Continue", Arm_BasScript_Logical_Continue(script));
    RECORD_STATUS("Logical_Break", Arm_BasScript_Logical_Break(script));
    RECORD_STATUS("Logical_EndWhile", Arm_BasScript_Logical_EndWhile(script));
    RECORD_STATUS("Logical_Label", Arm_BasScript_Logical_Label(script, 10));
    RECORD_STATUS("Logical_Goto", Arm_BasScript_Logical_Goto(script, 10));
    RECORD_STATUS("Logical_SkipCondition", Arm_BasScript_Logical_SkipCondition(script, io_di, 1, other_status, status_on, ARM_BAS_BOOLEAN_EQ));

    // [ZH] 覆盖流程控制语句构造接口。
    // [EN] Cover structural-control statement construction APIs.
    RECORD_STATUS("Structure_Wait", Arm_BasScript_Structure_Wait(script, io_di, 1, other_status, status_on, ARM_BAS_BOOLEAN_EQ));
    RECORD_STATUS("Structure_WaitTime", Arm_BasScript_Structure_WaitTime(script, ARM_BAS_VALUE_TYPE_VALUE, Arm_BasValue_Float64(0.1)));
    RECORD_STATUS("Structure_Pause", Arm_BasScript_Structure_Pause(script));
    RECORD_STATUS("Structure_Abort", Arm_BasScript_Structure_Abort(script));
    RECORD_STATUS("Structure_Call", Arm_BasScript_Structure_Call(script, "helper.bas"));
    RECORD_STATUS("Structure_Run", Arm_BasScript_Structure_Run(script, "helper.bas"));
    RECORD_STATUS("Structure_Load", Arm_BasScript_Structure_Load(script, ARM_BAS_LOAD_STRING, Arm_BasValue_String("demo_program")));
    RECORD_STATUS("Structure_Unload", Arm_BasScript_Structure_Unload(script, ARM_BAS_LOAD_STRING, Arm_BasValue_String("demo_program")));
    RECORD_STATUS("Structure_Exec", Arm_BasScript_Structure_Exec(script, ARM_BAS_LOAD_STRING, Arm_BasValue_String("demo_program")));

    // [ZH] 覆盖 Socket、Modbus 和视觉语句构造接口。
    // [EN] Cover Socket, Modbus, and vision statement construction APIs.
    RECORD_STATUS("Socket_Open", Arm_BasScript_Socket_Open(script, 1));
    RECORD_STATUS("Socket_Connect", Arm_BasScript_Socket_Connect(script, 1));
    RECORD_STATUS("Socket_Send", Arm_BasScript_Socket_Send(script, 1, ARM_BAS_STR_STRING, Arm_BasValue_String("ping")));
    RECORD_STATUS("Socket_Recv", Arm_BasScript_Socket_Recv(script, 1, 32, ARM_BAS_STR_SR, Arm_BasValue_Int32(1)));
    RECORD_STATUS("Socket_Close", Arm_BasScript_Socket_Close(script, 1));
    RECORD_STATUS("Modbus_ReadMH", Arm_BasScript_Modbus_ReadMH(script, 1, 1, 0, 2, 1));
    RECORD_STATUS("Modbus_ReadMI", Arm_BasScript_Modbus_ReadMI(script, 1, 1, 0, 2, 2));
    RECORD_STATUS("Modbus_WriteMH", Arm_BasScript_Modbus_WriteMH(script, 1, 1, 0, 1, ARM_BAS_VALUE_TYPE_VALUE, 10));
    RECORD_STATUS("Vision_Find", Arm_BasScript_Vision_Find(script, "camera"));
    RECORD_STATUS("Vision_GetOffset", Arm_BasScript_Vision_GetOffset(script, "camera", 1, 10));
    RECORD_STATUS("Vision_GetQuantity", Arm_BasScript_Vision_GetQuantity(script, "camera", 2));

    // [ZH] 导出最终脚本文本。默认不执行,避免示例运行时直接下发复杂脚本。
    // [EN] Export the final script text. Execution is disabled by default to avoid sending a complex script.
    char script_name[128] = {0};
    char script_text[8192] = {0};
    RECORD_STATUS("GetName", Arm_BasScript_GetName(script, script_name, sizeof(script_name)));
    RECORD_STATUS("GetText(final)", Arm_BasScript_GetText(script, script_text, sizeof(script_text)));
    printf("[c99_bas_script] script name: %s\n", script_name);
    printf("[c99_bas_script] script text:\n%s\n", script_text);
    if (execute_generated_script != 0) {
        RECORD_STATUS("Execute", Arm_BasScript_Execute(handle, script));
    } else {
        printf("[c99_bas_script] Execute skipped by default / 默认跳过 Execute\n");
    }

    RECORD_STATUS("ExtraParam_Reset", Arm_BasExtraParam_Reset(extra));
    Arm_BasExtraParam_Destroy(extra);
    Arm_BasScript_Destroy(script);
    Arm_Disconnect(handle);
    Arm_Destroy(handle);
    printf("[c99_bas_script] 示例结束 / Example finished\n");
#undef RECORD_STATUS
    return overall_status == 0 ? 0 : 1;
}