XScript 手册 · Chapter 2

语言基础

XScript 程序由四种构成要素组成。

要素说明
Variable全局/局部变量。保存设备状态、计数、标志等
Function可复用的逻辑单元
Sequence状态迁移单元,由主时序依次执行
StepSequence 内部的细分步骤

支持类型

类型说明
int · uint整数
double浮点数
booltrue/false(或 ON/OFF)
string字符串。支持插值 $"Hello {name}"
array动态数组

变量

全局变量在 Variable 编辑器中声明,局部变量在函数内部声明。左大括号必须放在下一行

int count = 0;
bool initOk = false;
double targetPos = 100.0;
string jobName = "default";
 
// 模块变量访问
MachineLoaded = false;
SS.UnitCount = 10;        // 安装参数
SYS.DateString;           // 系统值

常量

常量在 DATA.Const 或 Constant Editor 中声明,在全局以只读方式引用。

// 例: MAX_NUM_UNIT, DEVICE_NAME, SUPPLY_STEP 等被注册为常量
int n = MAX_NUM_UNIT;
string name = DEVICE_NAME;

函数

使用 FUNCTION 关键字声明。左大括号在下一行。

FUNCTION CheckLoad()
{
    if (IO["LOAD_SENSOR"] == ON)
    {
        return true;
    }
    return false;
}
 
FUNCTION MoveToPos(double pos, bool wait)
{
    MOTOR["M_X"].SetSpeed("RUN");
    if (MOTOR["M_X"].MoveAbs(pos, wait) == false)
    {
        return false;
    }
    return true;
}
  • 返回类型可自动推导(惯例返回 bool)。
  • 支持按名称传参: MoveToPos(/*pos*/100.0, /*wait*/true)

时序与步骤

Sequence 是主循环重复执行的块,Step 是其内部状态。 使用 goto "STEP_名称" 跳转到下一步。

SEQUENCE SeqSTEP_Idle空闲 · 刷新数据STEP_WaitOrder等待传感器 ONSTEP_Get接收物料当 unitIndex > 0 时直接跳到 STEP_Get每个 STEP 都像独立函数运行。return false 结束当前循环,goto 跳转到下一步。
////SEQUENCE,Seq
 
////STEP,STEP_Idle
UpdateData();
Sleep(100);
 
UnitData::UnitStatus[unitIndex] = "--";
 
if (unitIndex >= SS.UnitCount)
{
    Sleep(2000);
    return false;
}
 
if (unitIndex > 0)
{
    goto "STEP_Get";  // 第二个及之后的单元直接进入接收
}
 
////STEP,STEP_WaitOrder
Sleep(200);
 
if (IO[cnvSensorName].CheckContiOn(2000) == false)
{
    return false;
}
 
UnitData::UnitStatus[unitIndex] = "等待订单";
 
if (ProcessOrder() == false)
{
    return false;
}
 
////STEP,STEP_Get
// ... 接收动作
  • 每个步骤都像独立函数一样执行,return false 结束当前循环。
  • goto "STEP_名称" 跳转到下一步,下次循环从该步骤开始。
  • 模块变量(如 unitIndex)在步骤之间保留。

View 模块结构

画面(View)模块由 Design / Variable / Functions 三部分组成:

  • Design — XAML 布局
  • Variable — 画面绑定用变量
  • FunctionsOnShow, OnHide, OnTimer, OnClickEvent 等事件处理器
FUNCTION OnShow(string sender, int tag, array params)
{
    UpdateOrderDisplay();
    ViewSetup::UpdateUnitList();
}
 
FUNCTION OnTimer(string sender, int tag, array params)
{
    UpdateOrderDisplay();
    count++;
}