# RDS 脚本方法字典

## 脚本方法使用示例

以下以[异步创建并运行一个任务](#%E5%BC%82%E6%AD%A5%E5%88%9B%E5%BB%BA%E5%B9%B6%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1)的脚本方法为例进行演示：

```
// 构建createWindTask脚本方法所需要的输入参数
var inputParams = {"fromSite": "PS-01"};// 天风任务的输入参数
var taskParam = {
    // 任务类型 id
    "taskId": "12345",
    // 任务名称
    "taskLabel": "Ps2Ws",
    // 指定创建的任务实例的id
    "taskRecordId": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
    //任务优先级(天风任务的参数：task.priority)
    "priority": 10
    // 在天风任务中定义的参数
    "inputParams": JSON.stringify(inputParams)
};

// 调用createWinTask方法，传入上面的输入参数
jj.createWindTask(JSON.stringify(taskParam));
```

## 任务相关

#### 校验任务参数

* 方法说明

  校验输入参数中的 taskId 和 taskLabel 字段，如果同时为空，则返回 false，否则则返回 true。

```
  function checkTaskParam(param: string): boolean
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
  {
      // 任务类型 id
      "taskId": "12345",
      // 任务名称
      "taskLabel": "Ps2Ws"
  }
```

* 输出参数
* true，taskId 和 taskLabel 字段不是都为空字符串。
* false，taskId 和 taskLabel 字段同时为空字符串。
* 异常

  本方法会抛出异常。

#### 异步创建并运行一个任务

* 方法说明

  本方法是非阻塞方法，将在脚本中创建一个线程，来执行天风任务的实例。

```
  function createWindTask(param: string): string
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
  {
      // 任务类型 id
      "taskId": "12345",
      // 任务名称
      "taskLabel": "Ps2Ws",
      // 指定创建的任务实例的id
      "taskRecordId": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
      // 在天风任务中定义的参数
      "inputParams": "{\"fromSite\":\"PS-01\"}"
  }
```

**注意**：`taskId` 和 `taskLabel` 两者必选其一。如果同时存在，将首选使用 `taskId` 字段。

**注意，inputParam 字段，是个 JSON 字符串。需要在脚本里将任务参数序列化为 JSON。**

* 输出参数

  JSON字符串

```
  {
      "code":200,  //200表示成功 -1表示失败
      "msg":""    //提示信息
  }
```

* 异常

  本方法不抛出异常。

#### 根据任务实例 ID 查询任务实例

* 方法说明

  根据任务实例 ID 查询任务数据。

```
  function getTaskRecordById(taskRecordId: string): string
```

* 输入参数

  taskRecordId，string 类型，是任务实例的唯一 ID。
* 输出参数
* 如存在指定 ID 的任务实例，返回 JSON 格式的字符串。

  ```
  {
      // 任务实例id
      "id":"123",
      // 天风任务id
      "defId":"6743",
      // 天风任务名
      defLabel:"agvMove",
      // 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
      "status":1000,
      // 任务创建时间
      "createdOn":"2022-02-12 11:23:12.0",
      // 任务结束时间
      "endedOn":"2022-02-12 11:26:12.0",
      // 任务状态描述
      "stateDescription":"物料搬运中",
      // 外部订单号
      “outOrderNo”:"D6567812",
      // 机器人Id
      "agvId":""
  }
  ```
* 如果不存在指定 ID 的任务实例，返回 “null”。
* 异常

  本方法抛出异常。

#### 根据外部单号查询任务实例列表

* 方法说明

  根据外部单号查询任务实例列表。

```
  function getTaskRecordListByOutOrderNo(outOrderNo: string): string
```

* 输入参数

  outOrderNo，string 类型，是外部单号 ID。
* 输出参数（JSON 格式的字符串）：

  是 JSON 数组，包含查询到的任务实例数据。

```
  [{
      // 任务实例id
      "id":"123",
      // 天风任务id
      "defId":"6743",
      // 天风任务名
      defLabel:"agvMove",
      // 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
      "status":1000,
      // 任务创建时间
      "createdOn":"2022-02-12 11:23:12",
      // 结束原因
      "endedReason":"运行结束",
      // 任务结束时间
      "endedOn":"2022-02-12 11:26:12",
      // 任务状态描述
      "stateDescription":"物料搬运中",
      // 外部订单号
      “outOrderNo”:"D6567812"
  }]
```

如果不存在指定外部单号的任务实例，返回 "[]"。

* 异常

  本方法抛出异常。

#### 根据机器人 ID 查询任务实例列表

* 方法说明

  根据机器人ID查询任务实例列表。

```
  function getTaskRecordByAgvId(agvId: string): string
```

* 输入参数

  agvId，string 类型，是机器人 ID。
* 输出参数（JSON 格式的字符串）：

  是 JSON 数组，包含查询到的任务实例数据。

```
  [{
      // 任务实例id
      "id":"123",
      // 天风任务id
      "defId":"6743",
      // 天风任务名
      defLabel:"agvMove",
      // 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束, 1005：重启异常, 1006：异常中断）
      "status":1000,
      // 任务创建时间
      "createdOn":"2022-02-12 11:23:12",
      // 结束原因
      "endedReason":"运行结束",
      // 任务结束时间
      "endedOn":"2022-02-12 11:26:12",
      // 任务状态描述
      "stateDescription":"物料搬运中",
      // 外部订单号
      “outOrderNo”:"D6567812"
  }]
```

如果不存在对应机器人的任务实例数据，返回 "[]"。

* 异常

  本方法抛出异常。

#### Core 运单封口

* 方法说明

  将 Core 中指定 ID 的运单封口。

```
  function markComplete(orderId: string): void
```

* 输入参数

  orderId，string 类型，Core 运单执行 ID。
* 输出参数

  无
* 异常

  本方法会抛出异常。

#### 校验任务实例ID是否存在

* 方法说明

  校验任务实例id是否存在。

```
  function isTaskRecordIdExist(taskRecordId: string): boolean
```

* 输入参数

  taskRecordId，string 类型，任务实例id。
* 输出参数
* true，存在。
* false，不存在。
* 异常

  本方法会抛出异常。

#### 校验任务名称是否存在

* 方法说明

  校验任务名称是否存在。

```
  function isTaskLabelExist(taskName: string): boolean
```

* 输入参数

  taskName，string 类型，任务名称。
* 输出参数
* true，存在。
* false，不存在。
* 异常

  本方法会抛出异常。

#### 根据查询条件获取任务实例

* 方法说明

  根据参数的条件查询任务实例。

```
  function queryTaskRecord(param: string): string
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
  {
      // 任务类型 id
      "taskId":"",
      // 任务名
      "taskLabel":"",
      // 任务实例 id
      "taskRecordId":"",
      // 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
      "status":"",
      // 执行任务的机器人 id
      "agvId":"",
      // 开始时间，需满足‘yyyy-MM-dd HH:mm:ss’格式。如果该值非空，则返回创建日期大于该时间的任务实例
      "startDate":"",
      // 结束时间，需满足‘yyyy-MM-dd HH:mm:ss’格式。如果该值非空，则返回创建日期小于该时间的任务实例
      "endDate":""
  }
```

* 输出参数

  是 JSON 数组，包含查询到的任务实例数据。

```
  [{
      // 任务实例id
      "id":"123",
      // 天风任务id
      "defId":"6743",
      // 天风任务名
      defLabel:"agvMove",
      // 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
      "status":1000,
      // 任务创建时间
      "createdOn":"2022-02-12 11:23:12",
      // 结束原因
      "endedReason":"运行结束",
      // 任务结束时间
      "endedOn":"2022-02-12 11:26:12",
      // 任务状态描述
      "stateDescription":"物料搬运中",
      // 外部订单号
      “outOrderNo”:"D6567812"
  }]
```

如果不存在满足条件的任务实例数据，返回 "[]"。

* 异常

  本方法抛出异常。

#### 接收并持久化第三方系统任务请求

* 方法说明

```
  function receiveThirdOrder(orderParam: string): boolean
```

接收第三方系统发送的任务请求，并存入数据库（此时未必创建任务）。表结构如下：

```
  CREATE TABLE `t_windthirdorder` (
    `id` varchar(255) NOT NULL,
    `create_date` datetime(6) DEFAULT NULL,
    `params` longtext,
    `status` int DEFAULT '0',
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

* 输入参数

  其参数 `orderParam` 是 JSON 字符串，示例如下：

```
  {
      "name": "运单名",
      "type": "任务名称taskLabel"
  }
```

注：数据表为通用第三方请求数据表，orderParam 存入表 params 字段，orderParam 字段可自定义结构。

* 输出参数
* true，调用方法成功。
* false，调用方法失败。
* 异常

  本方法不抛出异常。

#### 保存任务运行时日志

* 方法说明

  新增RDS任务实例的运行日志，该日志将显示在任务实例的监控界面中。

```
  function saveTaskLog(logParam: string): void
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
  {
      // 任务类型 id
      "taskId": "402883a27cda555f017cda6f55ad01b6",
      // 任务实例 id
      "taskRecordId": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
      // 任务块 id
      "blockId": 2,
      // 日志信息
      "message": "[RootBp]任务开始运行：taskId=402883a27cda555f017cda6f55ad01b6",
      // 日志级别：1，正常运行；2，正常停止；3，异常中断。
      "level": 1
  }
```

* 输出参数

  无
* 异常

  本方法不抛出异常。

#### 创建并运行一个任务

* 方法说明

  本方法是阻塞方法，可以在脚本中创建一个天风任务的实例，并在任务执行结束后返回。

```
  function syncCreateWindTask(taskParam: string): string
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
  {
      // 任务类型 id
      "taskId": "12345",
      // 任务名称
      "taskLabel": "Ps2Ws",
      // 指定创建的任务实例的id
      "taskRecordId": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
      // 在天风任务中定义的参数
      "inputParams": "{\"fromSite\":\"PS-01\"}"
  }
```

**注意**，`taskId` 和 `taskLabel` 两者必选其一。如果同时存在，将首选使用 `taskId` 字段。

**注意，inputParam 字段，是个 JSON 字符串。需要在脚本里将任务参数序列化为 JSON。**

* 输出参数
* "9013"，任务正常结束。
* "9014"，任务异常结束。
* 异常

  本方法不抛出异常。

#### 终止任务

* 方法说明

  本方法是非阻塞方法，可用于终止多个正在运行的天风任务实例。

```
  function terminateTasks(param: string): void
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
  [
      {
          // 指定创建的任务实例的id
          "taskRecordId": "04d11f4f-d17c-4a41-9cf7-67de468035f9"
      },
      {
          // 指定创建的任务实例的id
          "taskRecordId": "04d11f4f-d17c-4a41-9cf7-67de468035fe"
      }
  ]
```

* 输出参数

  无
* 异常

  本方法会抛出异常。

#### 查询子任务的任务id列表

* 方法说明

  本方法是非阻塞方法，可根据父任务的id查询所有子任务的id。

```
  function getChildrenTaskRecordId(recordId: string): string
```

* 输入参数

  recordId，父任务的recordId。
* 输出参数

  包含子任务id的 JSON 字符串，转换成 JSON 对象之后的示例数据如下所示：

```
  [
  "child-58d549a4-6d4c-4e01-a327-269e3d4c1863",
  "child-sdsdfvsd-qrwe-4e02-a327-269eqwcfs863"
  ]
```

​ 如果不存在满足条件的子任务，返回 "[]"。

* 异常

  本方法会抛出异常。

#### 设置任务优先级

* 方法说明

  本方法是非阻塞方法，可根据设置任务的优先级。

```
  function setTaskPriority(taskRecordId: string,priority: number): void
```

* 输入参数

  taskRecordId，任务的实例id。

  priority, 任务的优先级
* 输出参数

  无
* 异常

  本方法不会抛出异常。

## 机器人相关

#### 校验机器人是否存在

* 方法说明

  校验机器人是否存在。

```
  function isRobotExist(robotName: string): boolean
```

* 输入参数

  robotName，string 类型，机器人名称。
* 输出参数
* true，存在。
* false，不存在。
* 异常

  本方法不抛出异常。

#### 获取机器人基本信息

* 方法说明

  获取机器人基本信息。

```
  function getLiteRobotsStatus(): string
```

* 输入参数

  无。
* 输出参数

```
  [
    {
      "battery_level": 1,                            #机器人电池电量, 范围 [0, 1]
      "confidence": 1,                            #机器人的定位置信度, 范围 [0, 1]
      "currentGroup": "unnamed",                    #机器人当前所在机器人组
      "current_map": "newCHACHECPD-15_1",            #当前地图
      "current_map_invalid": false,                #机器人当前地图不在场景中
      "dI": [],                                    #输入信号
      "dO": [],                                    #输出信号
      "disconnect": false,                        #与机器人网络断连
      "dispatchable": true,                        #机器人可接单状态
      "dispatchable_status": 0,                    #可接单状态 = api 设置可接单，1 = api 设置不可接单(小车占用资源)， 2 = api 设置不可接单(小车不占用资源)
      "errors": [],                                #报警码
      "ip": "",                                    #机器人ip
      "low_battery": false,                        #低电量
      "reloc_status": 1,                            #0 = FAILED(定位失败), 1 = SUCCESS(定位正确), 2 = RELOCING(正在重定位), 3=COMPLETED(定位完成)
      "task_status": 0,                            #机器人当前的导航状态：0 = NONE, 1 = WAITING(目前不可能出现该状态), 2 = RUNNING, 3 = SUSPENDED, 4 = COMPLETED, 5 = FAILED, 6 = CANCELED
      "unconfirmed_reloc": false,                    #未确认定位
      "unlock": 0,                                #0: 控制权在 RDSCore 手上 1: 控制权被其他人抢走; 2: 控制权没有被抢占
      "uuid": "sim_01"                            #机器人名
    },
    {
      "battery_level": 1,
      "confidence": 1,
      "currentGroup": "RobotGroup-01",
      "current_map": "newCHACHECPD-15_1",
      "current_map_invalid": false,
      "dI": [],
      "dO": [],
      "disconnect": false,
      "dispatchable": true,
      "dispatchable_status": 0,
      "errors": [],
      "ip": "",
      "low_battery": false,
      "orderId": "ab913f4b-9a35-4cdf-a4e5-07928897e0d2",
      "reloc_status": 1,
      "state": "FINISHED",
      "task_status": 4,
      "unconfirmed_reloc": false,
      "unlock": 0,
      "uuid": "sim_02"
    }
  ]
```

* 异常

  本方法抛出异常。

#### 根据Id获取机器人基本信息

* 方法说明

  根据Id获取机器人基本信息。

```
  function getLiteRobotsStatuById(agvId:string):string;
```

* 输入参数

  agvId，string 类型，机器人Id。
* 输出参数

```
  {
      "battery_level": 1,                            #机器人电池电量, 范围 [0, 1]
      "confidence": 1,                            #机器人的定位置信度, 范围 [0, 1]
      "currentGroup": "unnamed",                    #机器人当前所在机器人组
      "current_map": "newCHACHECPD-15_1",            #当前地图
      "current_map_invalid": false,                #机器人当前地图不在场景中
      "dI": [],                                    #输入信号
      "dO": [],                                    #输出信号
      "disconnect": false,                        #与机器人网络断连
      "dispatchable": true,                        #机器人可接单状态
      "dispatchable_status": 0,                    #可接单状态 = api 设置可接单，1 = api 设置不可接单(小车占用资源)， 2 = api 设置不可接单(小车不占用资源)
      "errors": [],                                #报警码
      "ip": "",                                    #机器人ip
      "low_battery": false,                        #低电量
      "reloc_status": 1,                            #0 = FAILED(定位失败), 1 = SUCCESS(定位正确), 2 = RELOCING(正在重定位), 3=COMPLETED(定位完成)
      "task_status": 0,                            #机器人当前的导航状态：0 = NONE, 1 = WAITING(目前不可能出现该状态), 2 = RUNNING, 3 = SUSPENDED, 4 = COMPLETED, 5 = FAILED, 6 = CANCELED
      "unconfirmed_reloc": false,                    #未确认定位
      "unlock": 0,                                #0: 控制权在 RDSCore 手上 1: 控制权被其他人抢走; 2: 控制权没有被抢占
      "uuid": "sim_01"                            #机器人名
    }
```

* 异常

  本方法会抛出异常。

#### 根据Id获取机器人位置

* 方法说明

  根据机器人id获取机器人的位置

```
  getVehicleStation(agvId:string):string;
```

* 输入参数

  agvId，string 类型，机器人Id。
* 输出参数

```
  {
      "lastStation": "LM32", //上次位置  可能是空
      "station": "AP25"       //当前位置  可能是空
  }
```

如果与调度断连返回空对象 {}。

* 异常

  本方法不抛出异常。

#### 获取Core报错信息

* 方法说明

  获取Core报错信息。

```
  function getCoreAlarms():string;
```

* 输入参数

  无。
* 输出参数

```
  {
      "errors": [{
          "code": 52106,
          "desc": "(AMB-01: blocked by chengpin-02 in occupy path. blocked by chengpin-02 in block group's edge BlockGroup102)(AMB-02: blocked by AMB-05 in occupy path. blocked by AMB-05 in block group's edge BlockGroup94)(AMB-03: blocked by AMB-05 in block group's lm BlockGroup94)(AMB-05: blocked by AMB-03 in block group's lm BlockGroup105)(chengpin-02: blocked by AMB-01 in occupy path. blocked by AMB-01 in block group's edge BlockGroup102)",
          "times": 5,
          "timestamp": 1681110467
      }, {
          "code": 52201,
          "desc": "(AMB-01,chengpin-02, in BlockGroup102, whose max number is 1 ), The number of robots in same block group is over max number.",
          "times": 1,
          "timestamp": 1681110452
      }],
      "warnings": [{
          "code": 54000,
          "desc": "AMB-02,AMB-05,chengpin-03,chengpin-08, unable to reach park point.",
          "times": 1,
          "timestamp":
          1681110462
      }]
  }
```

当与调度断连时，本方法会返回 null。

* 异常

  本方法不会抛出异常。

#### 根据Id获取Core报错信息

* 方法说明

  根据Id获取Core报错信息。

```
  function getCoreAlarms(code:int):string;
```

* 输入参数

  code，int类型，错误码。
* 输出参数

```
  {
      "errors": [{
          "code": 52201,
          "desc": "(AMB-01,chengpin-02, in BlockGroup102, whose max number is 1 ), The number of robots in same block group is over max number.",
          "times": 1,
          "timestamp": 1681110452
      }]
  }
```

当与调度断连时，本方法会返回 null。

* 异常

  本方法不会抛出异常。

#### 获取Rbk报错信息

* 方法说明

  获取Rbk报错信息。

```
  function getRbkAlarms():string;
```

* 输入参数

  无。
* 输出参数

```
  {
      "errors": [{
          "code": 52200,
          "desc": "Blocked by : chengpin-02",
          "times": 1,
          "timestamp": 1681116822857
      }, {
          "code": 52200,
          "desc": "Blocked by : AMB-01",
          "times": 1,
          "timestamp": 1681116822858
      }]
  }
```

当与调度断连时，本方法会返回 null。

* 异常

  本方法不会抛出异常。

#### 根据Id获取Rbk报错信息

* 方法说明

  根据Id获取Rbk报错信息。

```
  function getRbkAlarms(code:int):string;
```

* 输入参数

  code，int类型，错误码。
* 输出参数

```
  {
      "errors": [{
          "code": 52200,
          "desc": "Blocked by : chengpin-02",
          "times": 1,
          "timestamp": 1681117052956
      }, {
          "code": 52200,
          "desc": "Blocked by : AMB-01",
          "times": 1,
          "timestamp": 1681117052956
      }]
  }
```

当与调度断连时，本方法会返回 null。

* 异常

  本方法不会抛出异常。

#### 设置机器人软急停

* 方法说明

  设置机器人软急停。

```
  function setSoftStop(vehicleId: string,status: boolean): boolean
```

* 输入参数

  vehicleId，string 类型，机器人名称。

  status，boolean类型，true：设置机器人软急停 。false：取消机器人软急停
* 输出参数
* true，成功。
* false，失败。
* 异常

  本方法不抛出异常。

#### 获取机器人所有信息

* 方法说明

  获取机器人所有信息。

```
  function getRobotsStatus(): string
```

* 输入参数

  无。
* 输出参数

```
  {
    "dynamic_obstacle": {},
    "errors": [
      {
        "52101": 1634020173,
        "desc": "hu-test-1,hu-test-3, have no charge point in map.",
        "times": 1
      },
      {
        "52103": 1634020173,
        "desc": "hu-test-1,hu-test-3, have no park point in map.",
        "times": 1
      },
      {
        "53200": 1634020174,
        "desc": "[{\"error_msg\":\"old: hu-test-1, now: AMB-01, please change back!\",\"ip\":\"106.14.198.1\"}]",
        "times": 1
      }
    ],
    "fatals": [],
    "notices": [],
    "report": [
      {
        "area_resources_occupied": [
          {
            "area_name": "new",
            "avoidObs_area_occupied": {
              "radius": -1,
              "x": 0,
              "y": 0
            },
            "blocks_occupied": [],
            "path_occupied": [
              {
                "end_id": "AP1",
                "end_percentage": 0.7882161028093827,
                "source_id": "AP61",
                "start_percentage": 0.7882161028093827
              }
            ]
          }
        ],
        "basic_info": {
          "current_map": "20200529150233136",
          "dsp_version": "simulation",
          "ip": "106.14.198.1",
          "model": "AMB-150",
          "robot_note": "",
          "version": "v3.3.4.51"
        },
        "changes": {
          "maps": [
            "20200529150233136.smap",
            "default.smap",
            "wwww(1).smap"
          ],
          "model": true
        },
        "chassis": {
          "goods_region": {
            "name": "",
            "point": []
          },
          "head": 0.42,
          "radius": 0.0,
          "shape": 1,
          "tail": 0.38,
          "width": 0.56
        },
        "connection_status": 1,
        "current_order": {},
        "dispatchable": false,
        "is_error": false,
        "lock_info": {
          "desc": "",
          "ip": "58.34.135.130",
          "locked": true,
          "nick_name": "DESKTOP-27FKEEM(0d50b)",
          "port": 54733,
          "time_t": "1634023715",
          "type": 2
        },
        "network_delay": 100,
        "rbk_report": {
          "DI": [],
          "DO": [],
          "angle": -1.5626,
          "battery_level": 1.0,
          "blocked": false,
          "brake": false,
          "charging": false,
          "confidence": 0.996,
          "current": -1.0,
          "current_map": "20200529150233136",
          "current_map_md5": "72a91de898406e10b9cedfed51a3a5f9",
          "current_station": "LM1",
          "emergency": false,
          "errors": [],
          "fatals": [],
          "fork": {
            "fork_auto_flag": true,
            "fork_height": -0.0,
            "fork_height_in_place": false,
            "forward_in_place": false,
            "forward_val": 0.0
          },
          "info": {},
          "jack": {
            "jack_emc": false,
            "jack_enable": false,
            "jack_error_code": 0,
            "jack_height": 0.0,
            "jack_isFull": false,
            "jack_load_times": 0,
            "jack_mode": false,
            "jack_speed": 0,
            "jack_state": 0
          },
          "last_station": "CP2",
          "lock_info": {
            "desc": "",
            "ip": "58.34.135.130",
            "locked": true,
            "nick_name": "DESKTOP-27FKEEM(0d50b)",
            "port": 54733,
            "time_t": "1634023715",
            "type": 2
          },
          "notices": [],
          "odo": 24.771,
          "received_on": {
            "data_nsec": "1110998989197957",
            "frame_id": "",
            "pub_nsec": "1110998989197957",
            "seq": "0"
          },
          "reloc_status": 1,
          "requestCurrent": -0.0,
          "requestVoltage": -0.0,
          "roller": {
            "roller_emc": false,
            "roller_enable": false,
            "roller_error_code": 0,
            "roller_isFull": false,
            "roller_mode": false,
            "roller_speed": 0,
            "roller_state": 0
          },
          "soft_emc": false,
          "steer": -0.0,
          "time": 104303118,
          "today_odo": 15.812,
          "total_time": 444534615,
          "voltage": 1.0,
          "vx": -0.0,
          "vy": -0.0,
          "w": -0.0,
          "warnings": [
            {
              "55001": 1634020734,
              "desc": "The robot is in the dispatching state. If you need to control, please regain control and go offline during dispatching.",
              "times": 1
            }
          ],
          "x": -0.3316,
          "y": -1.4711
        },
        "undispatchable_reason": {
          "current_map_invalid": false,
          "disconnect": false,
          "dispatchable_status": 0,
          "low_battery": false,
          "unconfirmed_reloc": false,
          "unlock": 1
        },
        "uuid": "hu-test-1",
        "vehicle_id": "AMB-01"
      },
      {
        "area_resources_occupied": [
          {
            "area_name": "new",
            "avoidObs_area_occupied": {
              "radius": -1,
              "x": 0,
              "y": 0
            },
            "blocks_occupied": [],
            "path_occupied": [
              {
                "end_id": "AP33",
                "end_percentage": 1,
                "source_id": "AP32",
                "start_percentage": 1
              }
            ]
          }
        ],
        "basic_info": {
          "current_map": "zhihuichufang-Area-1ss-sim",
          "dsp_version": "simulation",
          "ip": "106.14.190.57",
          "model": "AMB-300-D",
          "robot_note": "",
          "version": "v3.3.4.51"
        },
        "changes": {
          "maps": [
            "20210107101108218.smap",
            "20210915133008125.smap",
            "WEIYI-2L.smap",
            "default-old.smap",
            "default.smap",
            "default123.smap",
            "jiaxing-fork2.smap",
            "seer-pda-20211011-132546.smap",
            "seer-pda-20211011-132611.smap",
            "seer-pda-20211011-132635.smap",
            "seer-pda-2021930-175116(1).smap",
            "wwww(1).smap",
            "zhacai-sim.smap"
          ],
          "model": true
        },
        "chassis": {
          "goods_region": {
            "name": "",
            "point": []
          },
          "head": 0.52,
          "radius": 0.0,
          "shape": 1,
          "tail": 0.48,
          "width": 0.7
        },
        "connection_status": 1,
        "current_order": {},
        "dispatchable": false,
        "is_error": false,
        "lock_info": {
          "desc": "",
          "ip": "58.34.135.130",
          "locked": true,
          "nick_name": "8e06e130-a2fa-4681-8473-bc6f3f9d76fd",
          "port": 58088,
          "time_t": "1634025655",
          "type": 255
        },
        "network_delay": 85,
        "rbk_report": {
          "DI": [],
          "DO": [],
          "angle": -2.9679,
          "battery_level": 1.0,
          "blocked": false,
          "brake": false,
          "charging": false,
          "confidence": 0.9949,
          "current": -1.0,
          "current_map": "zhihuichufang-Area-1ss-sim",
          "current_map_md5": "7a239eb7d76c4cdb1a4edac9524a15c5",
          "current_station": "",
          "emergency": false,
          "errors": [],
          "fatals": [],
          "fork": {
            "fork_auto_flag": true,
            "fork_height": -0.0,
            "fork_height_in_place": false,
            "forward_in_place": false,
            "forward_val": 0.0
          },
          "info": {},
          "jack": {
            "jack_emc": false,
            "jack_enable": false,
            "jack_error_code": 0,
            "jack_height": 0.0,
            "jack_isFull": false,
            "jack_load_times": 0,
            "jack_mode": false,
            "jack_speed": 0,
            "jack_state": 0
          },
          "last_station": "",
          "lock_info": {
            "desc": "",
            "ip": "58.34.135.130",
            "locked": true,
            "nick_name": "8e06e130-a2fa-4681-8473-bc6f3f9d76fd",
            "port": 58088,
            "time_t": "1634025655",
            "type": 255
          },
          "notices": [
            {
              "57005": 1634021893,
              "desc": "json conversion error",
              "times": 21
            }
          ],
          "odo": 35984.386,
          "received_on": {
            "data_nsec": "1110998932407317",
            "frame_id": "",
            "pub_nsec": "1110998932407317",
            "seq": "0"
          },
          "reloc_status": 1,
          "requestCurrent": -0.0,
          "requestVoltage": -0.0,
          "roller": {
            "roller_emc": false,
            "roller_enable": false,
            "roller_error_code": 0,
            "roller_isFull": false,
            "roller_mode": false,
            "roller_speed": 0,
            "roller_state": 0
          },
          "soft_emc": false,
          "steer": -0.0,
          "time": 444682933,
          "today_odo": 17.77,
          "total_time": 26574775786,
          "voltage": 1.0,
          "vx": -0.0,
          "vy": -0.0,
          "w": -0.0,
          "warnings": [
            {
              "55001": 1633952368,
              "desc": "The robot is in the dispatching state. If you need to control, please regain control and go offline during dispatching.",
              "times": 1
            }
          ],
          "x": -15.8727,
          "y": 11.6028
        },
        "undispatchable_reason": {
          "current_map_invalid": false,
          "disconnect": false,
          "dispatchable_status": 0,
          "low_battery": false,
          "unconfirmed_reloc": false,
          "unlock": 1
        },
        "uuid": "hu-test-3",
        "vehicle_id": "hu-test-3"
      }
    ],
    "scene_md5": "b481893504019cd71c03484f4b2419e1",
    "warnings": []
  }
```

当与调度断连时，本方法会返回 null。

* 异常

  本方法抛出异常。

#### 查询所有机器人充电阈值

* 方法说明

  获取所有机器人充电阈值信息。

  ```
  function queryChargeParam(): string;
  ```
* 输入参数

  无。
* 输出参数

  ```
  [
      {
          "vehicle": "AMB-01",
          "params": {
              "chargeNeed": 40.0,
              "chargeOnly": 30.0,
              "chargedOK": 50.0,
              "chargedFull": 90.0
          }
      },
      {
          "vehicle": "AMB-02",
          "params": {
              "chargeNeed": 50.0,
              "chargeOnly": 20.0,
              "chargedOK": 60.0,
              "chargedFull": 80.0
          }
      }
  ]
  ```

  当与调度断连时，本方法会返回 null。
* 异常

  本方法不抛出异常。

#### 查询机器人充电阈值

* 方法说明

  根据机器人名称获取机器人充电阈值信息。

  ```
  function queryChargeParam(vehicles: string): string;
  ```
* 输入参数

  vehicles: JSON 格式的字符串(将数组转成字符串格式)，查询指定数量的机器人充电阈值信息。
* 输出参数

  ```
  [
      {
          "vehicle": "AMB-01",
          "params": {
              "chargeNeed": 40.0,
              "chargeOnly": 30.0,
              "chargedOK": 50.0,
              "chargedFull": 90.0
          }
      },
      {
          "vehicle": "AMB-02",
          "params": {
              "chargeNeed": 50.0,
              "chargeOnly": 20.0,
              "chargedOK": 60.0,
              "chargedFull": 80.0
          }
      }
  ]
  ```
* 异常

  本方法不抛出异常。

#### 修改机器人充电阈值

* 方法说明

  根据机器人名称修改机器人充电阈值信息。

  ```
  function modifyChargeParam(param: string): boolean;
  ```
* 输入参数

  vehicles: JSON 格式的字符串(将数组转成字符串格式)，查询指定数量的机器人充电阈值信息。
* 输出参数

  + true: 修改成功。
  + false: 修改失败。
* 异常

  本方法不抛出异常。
* 示例：

  ```
  function boot() {
      // 指定要修改的机器人名称，以及对应的阈值
      const req = {
          "vehicles": ["sim_01"],
          "params": {
              "chargeNeed": 30
          }
      };
      // 查询修改前的阈值信息
      const before = jj.queryChargeParam(JSON.stringify(["sim_01"]));
      // 使用 modifyChargeParam 修改阈值
      const data = jj.modifyChargeParam(JSON.stringify(req));
      // 查询修改后的阈值信息
      const after = jj.queryChargeParam(JSON.stringify(["sim_01"]));
      // 打印结果
      jj.scriptLog("info", "Charge", "query = " + before);
      jj.scriptLog("info", "Charge", "modify = " + data);
      jj.scriptLog("info", "Charge", "query = " + after);
  }
  ```

  得到以下打印信息，表示修改 chargeNeed 参数成功：

  ![修改充电阈值](data:image/png;base64...)

## 库位相关

#### 检查站点是否存在

* 方法说明

  检查站点是否存在。

```
  function isPointExist(pointName: string):boolean
```

* 输入参数

  pointName，站点名。
* 输出参数
* true，该站点存在。
* false，该站点不存在。
* 异常

  本方法抛出异常。

#### 检查库位是否存在

* 方法说明

  检查库位名是否存在

```
  function checkSiteExistedBySiteId(siteId: string): boolean
```

* 输入参数
* siteId，库位名称。
* 输出参数
* true，该库位存在。
* false，该库位不存在。
* 异常

  本方法抛出异常。

#### 检查库区是否存在

* 方法说明

  检查库区名是否存在

```
  function checkSiteGroupExistedByGroupName(groupName: string): boolean
```

* 输入参数
* groupName，库区名称。
* 输出参数
* true，该库区存在。
* false，该库区不存在。
* 异常

  本方法抛出异常。

#### 根据条件获取库位

* 方法说明

  根据条件获取库位

```
function findSitesByCondition(conditions: string,sort:string): string
```

* 输入参数
* conditions，查询条件，模糊查询用'%'标记

  ```
  {
    "area": "area01", //区域名
    "colNum": ["abc","'%bc'","'%b%'","'ab%'"],//列，带'%'表示模糊查询
    "content": ["abc","'%bc'","'%b%'","'ab%'"],//货物
    "depth": ["abc","'%bc'","'%b%'","'ab%'"],//深
    "filled": true,    //是否有货
    "groupNames": ["abc","'%bc'","'%b%'","'ab%'"],//库区名
    "level": ["abc","'%bc'","'%b%'","'ab%'"],//货架层数
    "locked": true, //是否已锁定
    "lockedBy": "12345", //锁定的任务实例id
    "no": ["abc","'%bc'","'%b%'","'ab%'"],//库位编号
    "rowNum": ["abc","'%bc'","'%b%'","'ab%'"], //货架行
    "siteIds": ["abc","'%bc'","'%b%'","'ab%'"], //库位id
    "tags": ["abc","'%bc'","'%b%'","'ab%'"],//库位标签
    "type": 1    //库位类别，1物理库位，0逻辑库位
  }
  ```
* sort，根据siteId排序："ASC"顺序排序，"DESC"倒序排序
* 输出参数

  库位列表json

```
  [{
      "area": "area01",   //区域
      "colNum": "abc-1",//列
      "content": "abc-1",    //货物
      "depth": "abc-1",//深
      "disabled": true,//禁用
      "filled": 1,//占用
      "groupNames": "abc",//库区名
      "level": "abc-1",//层
      "locked": 1,//锁定
      "lockedBy": "123456",//锁定的任务id
      "no": "abc-1",//编号
      "preparing": true,//准备中
      "rowNum": "abc-1",//列
      "siteId": "abc-1",//库位id
      "tags": "abc-1",//标签
      "type": 1,//库位类型
      "working": true//工作中
      },
      {
      "area": "area01",
      "colNum": "abc-2",
      "content": "abc-2",
      "depth": "abc-2",
      "disabled": true,
      "filled": 1,
      "groupNames": "abc",
      "level": "abc-2",
      "locked": 1,
      "lockedBy": "123456",
      "no": "abc-2",
      "preparing": true,
      "rowNum": "abc-2",
      "siteId": "abc-2",
      "tags": "abc-2",
      "type": 1,
      "working": true
  }]
```

如果输出值没有满足条件的库位，方法将返回字符串"null"。

* 异常

  本方法抛出异常。
* 例子

  1.根据库位id查询库位是否有货

```
  function test(){
       var condition = {
           "siteIds": ["E1-1"],
           "filled": true
       }
       var site = jj.findSitesByCondition(JSON.stringify(condition),"ASC")
  }
```

2.查询某一库区内的所有库位

```
  function test(){
       var condition = {
           "groupNames": ["E1"]
       }
       var site = jj.findSitesByCondition(JSON.stringify(condition),"ASC")
  }
```

#### 根据条件获取有效库位

* 方法说明

  根据条件获取有效库位，即未禁用（disabled=0）并且同步成功（syncFailed=0）的库位。

```
function findAvailableSitesByCondition(conditions: string,sort:string): string
```

* 输入参数
* conditions，查询条件，模糊查询用'%'标记

  ```
  {
    "area": "area01", //区域名
    "colNum": ["abc","'%bc'","'%b%'","'ab%'"],//列，带'%'表示模糊查询
    "content": ["abc","'%bc'","'%b%'","'ab%'"],//货物
    "depth": ["abc","'%bc'","'%b%'","'ab%'"],//深
    "filled": true,    //是否有货
    "groupNames": ["abc","'%bc'","'%b%'","'ab%'"],//库区名
    "level": ["abc","'%bc'","'%b%'","'ab%'"],//货架层数
    "locked": true, //是否已锁定
    "lockedBy": "12345", //锁定的任务实例id
    "no": ["abc","'%bc'","'%b%'","'ab%'"],//库位编号
    "rowNum": ["abc","'%bc'","'%b%'","'ab%'"], //货架行
    "siteIds": ["abc","'%bc'","'%b%'","'ab%'"], //库位id
    "tags": ["abc","'%bc'","'%b%'","'ab%'"],//库位标签
    "type": 1    //库位类别，1物理库位，0逻辑库位
  }
  ```
* sort，根据siteId排序："ASC"顺序排序，"DESC"倒序排序
* 输出参数
* 包含库位列表的 JSON 字符串，转换成 JSON 对象之后的示例数据如下所示：

  ```
  [{
      "area": "area01",   //区域
      "colNum": "abc-1",//列
      "content": "abc-1",    //货物
      "depth": "abc-1",//深
      "disabled": true,//禁用
      "filled": 1,//占用
      "groupNames": "abc",//库区名
      "level": "abc-1",//层
      "locked": 1,//锁定
      "lockedBy": "123456",//锁定的任务id
      "no": "abc-1",//编号
      "preparing": true,//准备中
      "rowNum": "abc-1",//列
      "siteId": "abc-1",//库位id
      "tags": "abc-1",//标签
      "type": 1,//是否物理库位
      "working": true//工作中
      },
      {
      "area": "area01",
      "colNum": "abc-2",
      "content": "abc-2",
      "depth": "abc-2",
      "disabled": true,
      "filled": 1,
      "groupNames": "abc",
      "level": "abc-2",
      "locked": 1,
      "lockedBy": "123456",
      "no": "abc-2",
      "preparing": true,
      "rowNum": "abc-2",
      "siteId": "abc-2",
      "tags": "abc-2",
      "type": 1,
      "working": true
  }]
  ```
* 如果没有符合条件的库位，则返回值为 `"null"` ，而不是 `[]` 。
* 异常

  本方法抛出异常。

#### 根据扩展字段获取有效库位

* 方法说明

  根据扩展字段获取有效库位，即未禁用（disabled=0）并且同步成功（syncFailed=0）的库位。

```
function findAvailableSitesByExtFields(conditions: string): string
```

* 输入参数
* conditions，查询条件，模糊查询用'%'标记

  ```
  [
    {
      "attributeName": "ext5",
      "attributeValue": "ex%"
    },
    {
      "attributeName": "ext10",
      "attributeValue": "%ex"
    },
    {
      "attributeName": "ex100",
      "attributeValue": "ex3"
    },
    {
      "attributeName": "ex101",
      "attributeValue": "%ex"
    },
    {
      "attributeName": "filled", // 是否占用
      "attributeValue": "0"
    },
    {
      "attributeName": "locked", // 是否锁定
      "attributeValue": "0"
    },
    {
      "attributeName": "area", // 区域
      "attributeValue": "new"
    },
    {
      "attributeName": "groupName", // 库区名
      "attributeValue": "CYJ-IN-UP"
    },
    {
      "attributeName": "siteId", // 库位id
      "attributeValue": "CYJ-IN-01"
    }
  ]
  ```
* 请求示例

```
    var conditions = [{"attributeName":"ext5", "attributeValue":"ex%"},{"attributeName":"ext10", "attributeValue":"%ex"},{"attributeName":"ex100", "attributeValue":"ex3"},{"attributeName":"ex101", "attributeValue":"%ex"},{"attributeName":"filled", "attributeValue":"0"},{"attributeName":"locked", "attributeValue":"0"},{"attributeName":"area", "attributeValue":"new"},{"attributeName":"groupName", "attributeValue":"CYJ-IN-UP"},{"attributeName":"siteId", "attributeValue":"CYJ-IN-01"}];
    var data = jj.findAvailableSitesByExtFields(JSON.stringify(conditions));
```

* 库位列表json
* 包含库位列表的 JSON 字符串，转换成 JSON 对象之后的示例数据如下所示：

  ```
  [
    {
      "area": "new",
      "content": null,
      "filled": 1,
      "groupName": null,
      "locked": 0,
      "lockedBy": null,
      "siteId": "CYJ-IN-01",
      "siteName": null,
      "tags": "CYJ-IN-UP",
      "type": null
    }
  ]
  ```
* 如果没有符合条件的库位，则返回值为 `"null"` ，而不是 `[]` 。
* 异常

  本方法抛出异常。

#### 根据条件更新库位

* 方法说明

  根据条件更新库位

```
function updateSitesByCondition(conditions: string,values:string): number
```

* 输入参数
* conditions，更新条件，模糊查询用'%'标记

  ```
  {
    "area": "area01", //区域名
    "colNum": ["abc","'%bc'","'%b%'","'ab%'"],//列，带'%'表示模糊查询
    "content": ["abc","'%bc'","'%b%'","'ab%'"],//货物
    "depth": ["abc","'%bc'","'%b%'","'ab%'"],//深
    "filled": true,    //是否有货
    "groupNames": ["abc","'%bc'","'%b%'","'ab%'"],//库区名
    "level": ["abc","'%bc'","'%b%'","'ab%'"],//货架层数
    "locked": true, //是否已锁定
    "lockedBy": "12345", //锁定的任务实例id
    "no": ["abc","'%bc'","'%b%'","'ab%'"],//库位编号
    "rowNum": ["abc","'%bc'","'%b%'","'ab%'"], //货架行
    "siteIds": ["abc","'%bc'","'%b%'","'ab%'"], //库位id
    "tags": ["abc","'%bc'","'%b%'","'ab%'"],//库位标签
    "type": 1    //库位类别，1物理库位，0逻辑库位
  }
  ```
* values，修改的字段

  ```
  {
    "area": "abc",  //区域
    "colNum": "4",  //列
    "content": "abc", //货物
    "depth": "2",  //深
    "disabled": true, //禁用
    "filled": true, //有货
    "groupName": "abc", //库区名
    "level": "3", //层
    "locked": true,  //锁定
    "lockedBy": "12345",  //锁定的任务id
    "no": "10",  //编号
    "preparing": true,  //准备中
    "rowNum": "5",  //行
    "siteId": "site_01",  //库位名
    "tags": "abc",  //标签
    "type": 1,  //是否物理库位
    "working": true //工作中
  }
  ```
* 输出参数
* 更新成功的数据库记录行数
* 异常

  本方法抛出异常。
* 例子

​ 1.根据库位id查询有货未加锁的库位并进行加锁

```
function test(){
  var taskId = jj.currentTimeMillis()
     var condition = {
         "siteIds": ["E1-1"],
         "filled": true,
         "disabled": false,
         "locked": false
     }
     var value = {
         "siteIds": ["E1-1"],
         "filled": true,
         "locked": true,
         "lockedBy": taskId+""
     }
     var site = jj.updateSitesByCondition(JSON.stringify(condition),JSON.stringify(value))
}
```

​ 2.更新库区内的有货未加锁的所有库位并进行加锁

```
function test(){
  var taskId = jj.currentTimeMillis()
     var condition = {
         "groupName": ["E1"],
         "filled": true,
         "disabled": false,
         "locked": false
     }
     var value = {
         "groupName": ["E1"],
         "filled": true,
         "locked": true,
         "lockedBy": taskId+""
     }
     var site = jj.updateSitesByCondition(JSON.stringify(condition),JSON.stringify(value))
}
```

#### 根据条件更新库位扩展字段值

* 方法说明

  根据库位id和扩展字段名更新扩展字段的值

```
  function updateSiteExtFieldByIdAndExtFieldName(conditions: string): void
```

* 输入参数
* conditions，库位id、扩展字段名和更新值

```
  [
          {
              siteId: "Loc-01",
              extFieldName: "test",
              updateValue: "111"
          },
          {
              siteId: "Loc-02",
              extFieldName: "test",
              updateValue: "222"
          },
          {
              siteId: "Loc-03",
              extFieldName: "test",
              updateValue: "333"
          }
  ]
```

* 输出参数

  无。
* 异常

  本方法抛出异常
* 例子
* 更新Loc-01、Loc-02、Loc-03的扩展字段test的值分别为111、222、333

```
function test(){
    var conditions = [
        {
            siteId: "Loc-01",
            extFieldName: "test",
            updateValue: "111"
        },
        {
            siteId: "Loc-02",
            extFieldName: "test",
            updateValue: "222"
        },
        {
            siteId: "Loc-03",
            extFieldName: "test",
            updateValue: "333"
        }
    ]

    jj.updateSiteExtFieldByIdAndExtFieldName(JSON.stringify(conditions));
}
```

## 全局缓存数据

#### 获取缓存数据

* 方法说明

  **由于 RDS 的脚本里，无法使用全局变量，我们推荐如下方式缓存变量值。**

  根据已缓存的 key 获取缓存数据。

```
  function getCacheParam(key: string): string
```

* 输入参数
* key，缓存键。
* 输出参数
* string，JSON 格式。如果数据不存在，将返回 null。
* 异常

  本方法抛出异常。

#### 缓存数据

* 方法说明

  将参数中的 key 和 value 键值对在系统中进行缓存，缓存的数据将持久化，之后可通过 getCacheParam 方法根据 key 获取对应的 value。

```
  function putCacheParam(key: string, value: string): void
```

* 输入参数
* key，缓存键。
* value，缓存值。如果要缓存一个对象，需要先序列化为 JSON 字符串。
* 输出参数

  无。
* 异常
  本方法不会抛出异常。

#### 删除缓存数据

* 方法说明

  删除缓存数据。

```
  function clearCacheParam(key: string): void
```

* 输入参数
* key，缓存键。
* 输出参数

  本方法无输出参数。
* 异常

  本方法不抛出异常。

#### 获取所有的缓存数据

* 方法说明

  获取缓存块的全部缓存数据，并以 JSON 格式返回。

```
  function getAllCacheParams(): string
```

* 输入参数

  无。
* 输出参数
* string，JSON 格式。如果数据不存在，将返回空串。
* 异常

  本方法抛出异常。

## 手持端相关

#### 通知手持端（工位/岗位）

* 方法说明

  可以给手持端的指定工位或者岗位发送弹框通知。该弹框可以人工确认。如无人工确认，可配置保持时间，超过保持时间，弹框自动消失。

```
  function noticeOperator(workTypes: string, workStations: string, content: string, needConfirm: boolean, keepTime: number): void
```

* 输入参数
* workTypes，string 类型，要通知的岗位。多岗位间逗号分隔。
* workStations，string 类型，要通知的工位。多工位间逗号分隔。
* content，string 类型，通知的内容。
* needConfirm，boolean类型，表示是否需要手持端用户点击确认后，通知弹框才会消失。
* keepTime，number类型，表示通知弹框在手持端的保持时间，单位秒，超过这个时间弹框将消失。

  **注意**：本方法采用异步的方式发送群发通知。
* 输出参数

  本方法输出参数为空。
* 异常

  本方法抛出异常。

#### 通知手持端用户

* 方法说明

  可以给手持端的指定用户发送弹框通知。该弹框可以人工确认。如无人工确认，可配置保持时间，超过保持时间，弹框自动消失。

```
  function noticeOperatorByUser(userNames: string, content: string, needConfirm: boolean, keepTime: number): void
```

* 输入参数
* userNames，string 类型，要通知的用户。多用户间逗号分隔。
* content，string 类型，通知的内容。
* needConfirm，boolean类型，表示是否需要手持端用户点击确认后，通知弹框才会消失。
* keepTime，number类型，表示通知弹框在手持端的保持时间，单位秒，超过这个时间弹框将消失。

  **注意**：本方法采用异步的方式发送群发通知。
* 输出参数

  本方法输出参数为空。
* 异常

  本方法抛出异常。

#### 通过menuId修改手持端按钮的label

* 方法说明

  通过menuId定位修改手持端对应按钮的label(重启之后会失效，恢复到初始状态)

```
  function setPadLabelByMenuId(menuId: String, label: String):void
```

* 输入参数
* menuId，string 类型，要更改的手持端任务按钮的menuId
* label，string 类型，将手持端按钮上标签的内容修改为label中的内容
* 输出参数

  本方法输出参数为空。
* 异常

  本方法抛出异常。

#### 通过menuId修改手持端按钮的背景色

* 方法说明

  通过menuId修改手持端按钮的背景色(重启之后会失效，恢复到初始状态)

```
  function setPadBackgroundByMenuId(menuId: String, background: String):void
```

* 输入参数
* menuId，string 类型，要更改的手持端任务按钮的menuId
* background，string 类型，将手持端按钮上标签的背景色修改为background中的颜色（16进制的RGB格式）
* 输出参数

  本方法输出参数为空。
* 异常

  本方法抛出异常。

#### 通过menuId设置手持端按钮是否禁用

* 方法说明

  通过menuId设置手持端按钮是否禁用(重启之后会失效，恢复到初始状态)

```
  function setPadDisableByMenuId(menuId: String, disable: boolean):void
```

* 输入参数
* menuId，string 类型，要更改的手持端任务按钮的menuId
* disable，布尔类型，手持端按钮是否设置为禁用
* 输出参数

  本方法输出参数为空。
* 异常

  本方法抛出异常。

## 多线程及时间

#### 休眠指定时间

* 方法说明

  本方法是阻塞方法，使当前线程休眠指定时间。

```
  function sleep(ms: number): void
```

* 输入参数
* ms，number 类型，休眠的时间，单位毫秒。
* 输出参数

  本方法输出参数为空。
* 异常

  本方法不抛出异常。

#### 获取当前系统时间戳

* 方法说明

  获取当前的系统时间戳。

```
  function currentTimeMillis(): number
```

* 输入参数
  无
* 输出参数
  number 类型，当前系统的毫秒时间戳。

#### 获取当前时间

* 方法说明

  获取当前系统的格式化时间。

```
  function nowDate(): string
```

* 输入参数

  无
* 输出参数

  字符串：按照 `yyyy-MM-dd HH:mm:ss` 格式。
* 异常

  本方法不抛出异常。

#### 将时间戳转为日期格式

* 方法说明

  将时间戳转为格式化的日期时间。

```
  function timeMillisFormat(time: number): string
```

* 输入参数
* time，number 类型，当前毫秒时间戳。
* 输出参数

  字符串：按照 `yyyy-MM-dd HH:mm:ss` 格式。
* 异常

  本方法会抛出异常。

## HTTP 请求

#### 发送 POST 请求，参数为 JSON 格式

* 方法说明

  本方法是阻塞方法，发送 POST 请求，参数为 JSON 格式。

```
  function requestPost(url: string, param: string): string
```

* 输入参数
* url，string 类型，请求的 URL。
* param，string 类型，JSON 字符串，请求的参数。
* 输出参数
* 若请求成功：返回响应的 JSON 字符串。
* 若请求失败：null。
* 异常

  本方法会不抛出异常。

#### 发送 POST 请求，参数为 XML 格式

* 方法说明

  本方法是阻塞方法，发送 POST 请求，参数为 XML格式。在本方法中会自动将传入的 JSON 格式字符串转化为 XML 格式

```
  function requestPostXml(url: string, param: string): string
```

* 输入参数
* url，string 类型，请求的 URL。
* param，string 类型，JSON 字符串，请求的参数。
* 输出参数
* 若请求成功：将响应的 XML 格式 字符串 转化为 JSON 格式并返回。
* 若请求失败：null。
* 异常

  本方法会不抛出异常。

#### 发送 PUT请求，参数为 JSON 格式

* 方法说明

  本方法是阻塞方法，发送 PUT请求，参数为 JSON 格式。

```
  function requestPutJson(url: string, param: string): string
```

* 输入参数
* url，string 类型，请求的 URL。
* param，string 类型，JSON 字符串，请求的参数。
* 输出参数
* 若请求成功：返回响应的 JSON 字符串。
* 若请求失败：null。
* 异常

  本方法会不抛出异常。

#### 发送 GET 请求

* 方法说明

  本方法是阻塞方法，发送 GET 请求。

```
  function requestGet(url: string): string
```

* 输入参数

  url，string 类型，请求的 URL。
* 输出参数
* 若请求成功：请求返回的字符串。
* 若请求失败：null。
* 异常

  本方法会不抛出异常。

#### 设置请求头

* 方法说明

  本方法是阻塞方法，设置请求头，设置一次之后，对所有请求都有效。

```
  function setHeader(key: string, value: string): void
```

* 输入参数

  key，string 类型，请求头的key。

  value，string 类型，请求头的value。
* 输出参数

  无

#### 发送 POST 请求

* 方法说明

  本方法是阻塞方法，发送 `POST` 请求，参数为 `JSON` 格式。可设置请求媒体(`MediaType`)，可设置请求头

```
  function requestHttpPost(url: String, param: String, headParam: String, mediaType: String):String
```

* 输入参数

  url: 请求的 URL

  param: 请求的入参 json 字符串

  headParam: 请求头，如有传 json 字符串，无传空字符串

  mediaType：请求类型默认 application/json，可有如下选择 `JSON`、`JAVASCRIPT`、`HTML`、`XML`、`XWWWFORMURLENCODED` 分别表示：`application/json`、`application/javascript`、`text/html`、`application/xml`、`application/x-www-form-urlencoded`
* 输出参数

  成功返回 json 字符串，失败返回 null

注意：setHeader 设置对此方法也有效

#### 发送 GET 请求

* 方法说明

  本方法是阻塞方法，发送 `GET` 请求，参数为 `JSON` 格式。可设置请求头

```
  function requestHttpGet(url: String, headParam: String):String
```

* 输入参数

  url: 请求的 URL

  headParam: 请求头，如有传 json 字符串，无传空字符串
* 输出参数

  成功返回 json 字符串，失败返回 null

注意：setHeader 设置对此方法也有效

#### 发送 PUT 请求

* 方法说明

  本方法是阻塞方法，发送 `PUT` 请求，参数为 `JSON` 格式。可设置请求媒体(`MediaType`)，可设置请求头

```
  function requestHttpPut(url: String, headParam: String, mediaType: String, param: String)
```

* 输入参数

  url: 请求的 URL

  headParam: 请求头，如有传 json 字符串，无传空字符串

  mediaType：请求类型默认 application/json，可有如下选择 `JSON`、`JAVASCRIPT`、`HTML`、`XML`、`XWWWFORMURLENCODED` 分别表示：`application/json`、`application/javascript`、`text/html`、`application/xml`、`application/x-www-form-urlencoded`

  param: 请求的入参 json 字符串
* 输出参数

  成功返回 json 字符串，失败返回 null

注意：setHeader 设置对此方法也有效

## 日志记录

#### 获取日志打印对象

* 方法说明

  获取日志打印对象，可用于将指定信息打印进日志文件。

```
  function getLogger(): Logger
```

* 输入参数

  无
* 输出参数是日志对象，定义如下：

```
  interface Logger {
      info: (message: string) => void;
      debug: (message: string) => void;
      warn: (message: string) => void;
      error: (message: string, e: any) => void;
  }
```

调用方法：

```
  jj.getLogger().info("hello world");
  jj.getLogger().error("there is an error.", "");
```

使用以上方法，可在日志文件中打印指定记录。

* 异常

  本方法会抛出异常。

#### 在脚本页面下打印日志

* 方法说明

  在 RDS 脚本页面下，打印日志信息。

```
  function scriptLog(level: string, functionName: string, content: any): void
```

* 输入参数
* level，string 类型，日志等级，可选 “INFO”，“ERROR”。
* functionName，string 类型，一般填入所在函数的签名，用于快速定位信息。
* content，any 类型，日志信息。
* 输出参数

  无
* 异常

  本方法会抛出异常。

## 注册方法

**以下方法，需要在 boot() 函数中调用。**

#### 定时执行脚本方法

*需求：脚本方法能传参。*

* 方法说明

  将脚本方法设置为定时执行。

  **注意，该方法需要在 boot() 方法中调用。**

```
  function defineScheduledFunctions(isParallel: boolean, delay: number, period: number, functionName: string, args: any[]): void
```

* 输入参数
* isParallel：boolean 类型，是否并行。
* delay：number 类型，启动延迟执行的时间，单位毫秒。
* period：number类型，脚本方法的周期，单位毫秒。
* functionName：string 类型，周期执行的方法名。
* args：周期执行的方法的参数。
* 输出参数

​ 无

* 异常

  本方法会抛出异常。

#### 注册系统启动初始化方法

* 方法说明

  注册系统启动即执行的初始化方法。

```
  function defineInitDataFunctions(functionName:string):void
```

* 输入参数

  functionName：注册的方法名。
* 输出参数

​ 无

* 异常

  本方法会抛出异常。

#### 注册按钮

* 方法说明

  向rds注册管理后台可见的按钮。

```
  function registerButton(label: string, remark: string, scriptFunction: string, level: string, type: Number): void
```

* 输入参数
* label，string 类型，按钮名。
* remark，string 类型，按钮备注。
* scriptFunction，string 类型，点击按钮触发的方法名，**注意该方法不能带参数**。
* level，string 类型，按钮等级，用颜色区分。blue：蓝色，yellow：黄色 ，red：红色。
* type，Number类型，0: 普通按钮 1: 导出按钮，可选
* 输出参数

​ 无

* 异常

  本方法会抛出异常。

#### 注册 Web 接口方法

* 方法说明

  在脚本中注册接口方法。

```
  function registerHandler(method: string, path: string, callback: string, auth: boolean): void
```

* 输入参数
* method：HTTP 请求方式，支持 POST，GET。
* path：接口的 URL 路径。
* callback：处理接口的脚本方法名。
* auth：调用此接口是否需要登录。
* 输出参数

​ 无

* 异常

  本方法会抛出异常。

#### 注册事件处理器

* 方法说明

  注册事件处理器，可处理天风任务“触发任务事件”块所抛出的事件。

```
  function registerTaskEventFunction(functionName: string): void
```

* 输入参数
* functionName：注册的方法名。
* 输出参数

​ 无

* **注意事项**

  **若希望处理“触发任务事件”块抛出的事件，需要：**
* **在脚本中实现与“触发任务事件”块的“事件名”参数同名的函数。**
* **脚本函数的签名为：**

  ```
   function functionName(param: string): void
  ```
* **在 boot() 方法中，调用 registerTaskEventFunction 方法将脚本函数注册为事件处理器。**
* 异常

  本方法会抛出异常。

## 业务配置

#### 获取 application-biz.yml 的配置

* 方法说明

  获取 application-biz.yml 的配置。

```
  function getApplicationBusinessConfigValue(key: string): string
```

* 输入参数

  key，string 类型，是 application-biz.yml 中所要获取配置的字段名。
* 输出参数

  JSON 字符串。
* 异常

  无

## 数据库

#### 执行 SQL 语句

* 方法说明

  通过 SQL 命令操作 RDS 系统数据库，可用于创建自定义数据表。

```
  function jdbcExecuteSql(sql: string): Boolean
```

* 输入参数

  sql：string 类型，创建表的 SQL 语句。示例如下：

```
  CREATE TABLE `test` (`id` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4
```

* 输出参数：
* true， SQL 命令执行成功。
* false， SQL 命令执行失败。
* 异常

  本方法不抛出异常，方法内捕获到异常后，按执行失败的信息返回处理。

#### 使用 SQL 查询数据

* 方法说明

  本方法可以使用自定义的 SQL 查询数据，并返回指定字段。

```
  function jdbcQuery(sql: string): string
```

* 输入参数

  sql：string 类型，SQL 语句。
* 输出参数是 JSON 格式的字符串。

  假设查询 sql 参数为：sql="select id, name, age from person\_table"

  则返回的结果，经 JSON 反序列化后，数据如下：

```
  [
      {
          "id": "1",
          "name": "lilei",
          "age": 14
      }
  ]
```

* 异常

  本方法不抛出异常。

#### 更新数据

* 方法说明

  更新数据记录。更新内容和目标条件，都支持动态扩展，即可执行动态拼接的 SQL 语句。

```
  function jdbcInsertOrUpdate(sql: string, ...sqlParams: any): number
```

* 输入参数
* sql，string 类型，SQL 语句字符串。
* sqlParams，any 类型，可动态扩展的参数。
* 输出参数

  number 类型：0 表示更新失败，大于 0 的数字表示更新的记录数目。
* 使用示例：

```
  const sql = "update employee set age = 25 where name = ? and id = ?"
  jj.jdbcInsertOrUpdate(sql, "bob", 123)
```

* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 查询数据数量

* 方法说明

  执行一条自定义 SQL 语句，以查询满足条件数据的数量。

```
  function jdbcQueryCount(sql: string): number | null
```

* 输入参数
* sql，string 类型，SQL 语句字符串。**注意，只能使用 select count 语句。**

  ```
  select count(1) from person where age = 20
  ```
* 输出参数

  number 类型，null 表示查询失败，其他数字表示查询到的记录数目。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

## Modbus Tcp

#### Func01 读取线圈量

* 方法说明

  Modbus 读取线圈量，功能码 01。

```
  function readCoilStatus(ip: string, port: number, slaveId: number, offset: number): boolean | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* 输出参数
* null，读取失败。
* boolean，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func02 读取线圈量

* 方法说明

  Modbus 读取线圈量，功能码 02。

```
  function readInputStatus(ip: string, port: number, slaveId: number, offset: number): boolean | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* 输出参数
* null，读取失败。
* boolean，读取成功的返回值。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### Func03 读取保持寄存器

* 方法说明

  Modbus 读取保持寄存器，功能码 03。

```
  function readHoldingRegister(ip: string, port: number, slaveId: number, offset: number, dataType: number): number | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* dataType，number 类型，2：无符号整形，3：有符号整形。
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### Func04 读取输入寄存器

* 方法说明

  Modbus 读取只读输入寄存器，功能码 04。

```
  function readInputRegister(ip: string, port: number, slaveId: number, offset: number, dataType: number): number | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* dataType，number 类型，2：无符号整形，3：有符号整形。
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### Func01 批量读取线圈量

* 方法说明

  Modbus 读取线圈量多个连续地址值，并以数组的形式返回其中的值，功能码 01。

```
  function batchReadCoilStatus(ip: string, port: number, slaveId: number, offset: number, len: number): Array<boolean> | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 首地址。
* len，number 类型，Modbus 地址数量。
* 输出参数
* null，读取失败。
* Array，读取成功后，返回结果数组。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func02 批量读取离散输入

* 方法说明

  Modbus 读取离散输入多个连续地址值，并以数组的形式返回其中的值，功能码 02。

```
  function batchReadInputStatus(ip: string, port: number, slaveId: number, offset: number, len: number): Array<boolean> | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 首地址。
* len，number 类型，Modbus 地址数量。
* 输出参数
* null，读取失败。
* Array，读取成功后，返回结果数组。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func03 批量读取保持寄存器

* 方法说明

  Modbus 读取保持寄存器多个连续地址值，并以数组的形式返回其中的值，功能码 03。

```
  function batchReadHoldingRegisters(ip: string, port: number, slaveId: number, offset: number, len: number): Array<number> | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 首地址。
* len，number 类型，Modbus 地址数量。
* 输出参数
* null，读取失败。
* Array，读取成功后，返回结果数组。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func04 批量读取输入寄存器

* 方法说明

  Modbus 读取输入寄存器多个连续地址值，并以数组的形式返回其中的值，功能码 04。

```
  function batchReadInputRegisters(ip: string, port: number, slaveId: number, offset: number, len: number): Array<number> | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 首地址。
* len，number 类型，Modbus 地址数量。
* 输出参数
* null，读取失败。
* Array，读取成功后，返回结果数组。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func05 写入线圈量

* 方法说明

  Modbus 写入线圈量，功能码 05。

```
  function writeCoilStatus(ip: string, port: number, slaveId: number, offset: number, value: boolean): boolean
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* value，boolean 类型，写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### Func06 写入保持寄存器

* 方法说明

  Modbus 写入保持寄存器，功能码 06。

```
  function writeHoldingRegister(ip: string, port: number, slaveId: number, offset: number, dataType: number, value: number): boolean
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* dataType，number 类型，2：无符号整形，3：有符号整形。
* value，number 类型，写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### Func0f 批量写入线圈量

* 方法说明

  Modbus 写入线圈量多个连续地址，功能码 0f。

```
  function batchWriteCoilStatus(ip: string, port: number, slaveId: number, offset: number, value: Array<boolean>): boolean
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* value，boolean 数组类型，多个需写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### Func10 批量写入保持寄存器

* 方法说明

  Modbus 写入保持寄存器多个连续地址，功能码 10。

```
  function batchWriteHoldingRegister(ip: string, port: number, slaveId: number, offset: number, value: Array<number>): boolean
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* offset，number 类型，Modbus 地址。
* value，number 数组类型，多个需写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### 通用写入单个地址

* 方法说明

  Modbus 写入单个地址，通过参数 type 指定读取的地址类型。

```
  function writeSingleModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number, value: number): boolean
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* type，string类型，表示地址类型，可选择‘0x’，‘1x’，‘3x’，‘4x’，和功能码的对应关系如下：

  0x：对应功能码0x01，表示读线圈。
  1x：对应功能码0x02，表示读离散输入。
  3x：对应功能码0x04，表示读输入寄存器。
  4x：对应功能码0x03，表示读保持寄存器。
* offset，number 类型，表示Modbus 地址。
* value，number 类型，表示写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通用写入多个地址

* 方法说明

  Modbus 写入单个地址，通过参数 type 指定读取的地址类型。

```
  function writeBatchModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number, values: number[]): boolean
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* type，string类型，表示地址类型，可选择‘0x’，‘1x’，‘3x’，‘4x’，和功能码的对应关系如下：

  0x：对应功能码0x01，表示读线圈。
  1x：对应功能码0x02，表示读离散输入。
  3x：对应功能码0x04，表示读输入寄存器。
  4x：对应功能码0x03，表示读保持寄存器。
* offset，number 类型，表示Modbus 地址。
* values，number 数组类型，表示写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通过实例名称写入单个地址

* 方法说明

  Modbus 写入单个地址，通过参数 name 指定已经配置的实例名称。

```
  function writeSingleModbusValueByInstanceName(name: string, offset: number, value: number): boolean
```

* 输入参数
* name，string 类型，已经配置的实例名称。
* offset，number 类型，表示 Modbus 地址。
* value，number 类型，表示写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

#### 通过实例名称写入多个地址

* 方法说明

  Modbus 写入多个地址，通过参数 name 指定已经配置的实例名称。

```
  function writeBatchModbusValueByInstanceName(name: string, offset: number, values: number[]): boolean
```

* 输入参数
* name，string 类型，已经配置的实例名称。
* offset，number 类型，表示 Modbus 地址。
* values，number 数组类型，表示写入的值。
* 输出参数
* true，写入成功。
* false，写入失败。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

#### 通用读取单个地址

* 方法说明

  Modbus 读取单个地址，通过参数 type 指定读取的地址类型。

```
  function readSingleModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number): number | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* slaveId，number 类型，从机 slave ID。
* type，string类型，表示地址类型，可选择‘0x’，‘1x’，‘3x’，‘4x’，和功能码的对应关系如下：

  0x：对应功能码0x01，表示读线圈。
  1x：对应功能码0x02，表示读离散输入。
  3x：对应功能码0x04，表示读输入寄存器。
  4x：对应功能码0x03，表示读保持寄存器。
* offset，number 类型，Modbus 地址。
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通用读取多个地址

* 方法说明

  Modbus 读取多个地址，通过参数 name 指定已经配置的实例名称。

```
  function readBatchModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number, length: number): number[] | null
```

* 输入参数
* ip: string 类型，从机 IP。
* port: number 类型，从机端口。
* slaveId: number 类型，从机 slave ID。
* type: string类型，表示地址类型，可选择‘0x’，‘1x’，‘3x’，‘4x’，和功能码的对应关系如下：

  0x：对应功能码0x01，表示读线圈。
  1x：对应功能码0x02，表示读离散输入。
  3x：对应功能码0x04，表示读输入寄存器。
  4x：对应功能码0x03，表示读保持寄存器。
* offset: number 类型，Modbus 地址。
* length: number 类型，读取的数据长度。
* 输出参数
* null: 读取失败。
* number[]: 读取成功的返回值数组。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通过实例名称读取单个地址

* 方法说明

  Modbus 读取单个地址，通过参数 name 指定已经配置的实例名称。

```
  function readSingleModbusValueByInstanceName(name: string, offset: number): number | null
```

* 输入参数
* name: string 类型，配置的唯一实例名称。
* offset: number 类型，Modbus 地址。
* 输出参数
* null: 读取失败。
* number: 读取成功的返回值。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

#### 通过实例名称读取多个地址

* 方法说明

  Modbus 读取多个地址，通过参数 name 指定已经配置的实例名称。

```
  function readBatchModbusValueByInstanceName(name: string, offset: number, length: number): number[] | null
```

* 输入参数
* name: string 类型，配置的唯一实例名称。
* offset: number 类型，Modbus 地址。
* length: number 类型，读取的数据长度。
* 输出参数
* null: 读取失败。
* number[]: 读取成功的返回值。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

## OPC-UA

#### OPC 读取数值

* 方法说明

  读取 OPC server 中的某个地址位的值。

```
  function readOpcValue(address: string | number): any
```

* 输入参数
* address，string 类型，读取的地址位。
* 输出参数
* 读到的值。
* 异常

  读取失败会抛出 RuntimeException 异常 “readOpcValue error”。
* 方法说明

```
  function readOpcValue(namespaceIndex:number, address: string | number): any
```

* 输入参数
* namespaceIndex, number类型，命名空间索引
* address，string 类型，读取的地址位。地址类型 g=550e8400-e29b-41d4-a716-446655440000: g= 表示地址类型是 UUID；i=1008: i= 表示地址类型是 number；b=EAk=: b= 表示地址类型是 Opaque；s=1009: s= 表示地址类型是字符串
* 输出参数
* 读到的值。
* 异常

  读取失败会抛出 RuntimeException 异常 “readOpcValue error”。

#### OPC 订阅方式读取数值

* 方法说明

  通过订阅的方式，读取 OPC server 中的某个地址位的值。

```
  function readOpcValueBySubscription(namespaceIndex: number, address: string): any
```

* 输入参数
* namespaceIndex，number 类型，命名空间索引。
* address，string 类型，读取的地址位。地址类型 g=550e8400-e29b-41d4-a716-446655440000: g= 表示地址类型是 UUID；i=1008: i= 表示地址类型是 number；b=EAk=: b= 表示地址类型是 Opaque；s=1009: s= 表示地址类型是字符串
* 输出参数
* 读到的值。
* 异常

  读取失败会抛出 RuntimeException 异常 “readOpcValue error”。

#### OPC 写入数值

* 方法说明

  读取 OPC server 中的某个地址位的值。

```
  function writeOpcValue(address: string | number, value: any): boolean
```

* 输入参数
* address，string 类型，表示写入的地址。
* value，any 类型， 写入的值。
* 输出参数

  成功返回 true，失败返回 false。
* 异常

  本方法不抛出异常。
* 方法说明

  读取 OPC server 中的某个地址位的值。

```
  function writeOpcValue(namespaceIndex: number,address: string | number, value: any): boolean
```

* 输入参数
* number类型，命名空间索引
* address，string 类型，表示写入的地址。地址类型 g=550e8400-e29b-41d4-a716-446655440000: g= 表示地址类型是 UUID；i=1008: i= 表示地址类型是 number；b=EAk=: b= 表示地址类型是 Opaque；s=1009: s= 表示地址类型是字符串
* value，any 类型， 写入的值。
* 输出参数

  成功返回 true，失败返回 false。
* 异常

  本方法不抛出异常。

## Melsec

#### Melsec 读取 boolean

* 方法说明

  Melsec 读取 boolean。

```
  function readMelsecBoolean(ip: string, port: string, address: string): boolean | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* address，string 类型，读取的地址位。
* 输出参数
* null，读取失败。
* boolean，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Melsec 读取 number

* 方法说明

  Melsec 读取 number。

```
  function readMelsecNumber(ip: string, port: string, address: string): number | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* address，string 类型，读取的地址位。
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Melsec 读取 string

* 方法说明

  Melsec 读取 string。

```
  function readMelsecString(ip: string, port: string, address: string, length: number) : string | null
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* address，string 类型，读取的地址位。
* length，number 类型，读取的长度。
* 输出参数
* null，读取失败。
* string，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Melsec 写入 boolean

* 方法说明

  Melsec 写入 boolean。

```
  function writeMelsecBoolean(ip: string, port: string, address: string, value: boolean): void
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* address，string 类型，写入的地址位。
* value，boolean 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Melsec 写入 number

* 方法说明

  Melsec 写入 number。

```
  function writeMelsecNumber(ip: string, port: string, address: string, value: number) : void
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* address，string 类型，写入的地址位。
* value，number 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Melsec 写入 string

* 方法说明

  Melsec 写入 string。

```
  function writeMelsecString(ip: string, port: string, address: string, value: string) : void
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* address，string 类型，写入的地址位。
* value，string 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

## Fins

#### Fins 读取 string

* 方法说明

  Fins 读取 string。

```
  function readFinsString(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number, wordLength: number) : string
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* area，number 类型，读取的存储区域代码，16进制值如：（0x82） 。
* finsIoAddr，number 类型，读取的地址位 。
* bitOffset，number 类型，读取的偏移量 。
* wordLength，number 类型，读取的长度 。
* 输出参数
* null，读取失败。
* string，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Fins 读取 word

* 方法说明

  Fins 读取 word。

```
  function readFinsWord(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number) : number
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* area，number 类型，读取的存储区域代码，16进制值如：（0x82） 。
* finsIoAddr，number 类型，读取的地址位 。
* bitOffset，number 类型，读取的偏移量 。
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Fins 读取 bit

* 方法说明

  Fins 读取 bit。

```
  function readFinsBit(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number) : number
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* area，number 类型，读取的存储区域代码，16进制值如：（0x82） 。
* finsIoAddr，number 类型，读取的地址位 。
* bitOffset，number 类型，读取的偏移量
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Fins 写入 word

* 方法说明

  Fins 写入 word。

```
  function writeFinsWord(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number, value: number) : void
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* area，number 类型，写入的存储区域代码，16进制值如：（0x82） 。
* finsIoAddr，number 类型，写入的地址位 。
* bitOffset，number 类型，写入的偏移量 。
* value，number 类型，写入的值。
* 输出参数
* 该方法无输出参数。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Fins 写入 bit

* 方法说明

  Melsec 写入 string。

```
  function writeFinsBit(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number, value: boolean) : void
```

* 输入参数
* ip，string 类型，从机 IP。
* port，number 类型，从机端口。
* area，number 类型，写入的存储区域代码，16进制值如：（0x82） 。
* finsIoAddr，number 类型，写入的地址位 。
* bitOffset，number 类型，写入的偏移量 。
* value，boolean类型，写入的值。
* 输出参数
* 该方法无输出参数。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

## S7

#### S7 读取 Int

* 方法说明

  S7 读取 Int。

```
  function readS7Int(type: string, ip: string, blockAndOffset: string): number;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 读取 DInt

* 方法说明

  S7 读取 DInt。

```
  function readS7DInt(type: string, ip: string, blockAndOffset: string): number;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 读取 Word

* 方法说明

  S7 读取 Word。

```
  function readS7Word(type: string, ip: string, blockAndOffset: string): number;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 读取 DWord

* 方法说明

  S7 读取 DWord。

```
  function readS7DWord(type: string, ip: string, blockAndOffset: string): number;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* 输出参数
* null，读取失败。
* number，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 读取 String

* 方法说明

  S7 读取 String。

```
  function readS7String(type: string, ip: string, blockAndOffset: string): string;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* 输出参数
* null，读取失败。
* string，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 读取 Bool

* 方法说明

  S7 读取 Bool。

```
  function readS7Boolean(type: string, ip: string, blockAndOffset: string): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* 输出参数
* null，读取失败。
* boolean，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入 Int

* 方法说明

  S7 写入 Int。

```
  function writeS7Int(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* value，number 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入 DInt

* 方法说明

  S7 写入 DInt。

```
  function writeS7DInt(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* value，number 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入 Word

* 方法说明

  S7 写入 Word。

```
  function writeS7Word(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* value，number 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入 DWord

* 方法说明

  S7 写入 DWord。

```
  function writeS7DWord(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* value，number 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入 String

* 方法说明

  S7 写入 String。

```
  function writeS7String(type: string, ip: string, blockAndOffset: string, value: string): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* value，string 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入 Bool

* 方法说明

  S7 写入 Bool。

```
  function writeS7Boolean(type: string, ip: string, blockAndOffset: string, value: boolean): boolean;
```

* 输入参数
* type，string 类型，PLC 类型，可选值（区分大小写）：S1200/S300/S400/S1500/S200Smart/S200。
* ip，string 类型，PLC IP。
* blockAndOffset，string 类型，读取的地址，支持的区域取值示例如下（区分大小写）：

  | 地址名称 | 地址代号 | 示例 |
  | --- | --- | --- |
  | 中间寄存器 | M | M100,M200 |
  | 输入寄存器 | I | I100,I200 |
  | 输出寄存器 | Q | Q100,Q200 |
  | DB块寄存器 | DB | DB1.100,DB1.200.7 |
  | V寄存器 | V | V100,V200 |
  | 定时器的值 | T | T100,T200 |
  | 计数器的值 | C | C100,C200 |
  | 智能输入寄存器 | AI | AI100,AI200 |
  | 智能输出寄存器 | AQ | AQ100,AQ200 |
* value，boolean 类型，写入的值。
* 输出参数
* 成功返回 true，失败返回 false。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 写入

* 方法说明

  S7 写入 Int、DInt、Word、DWord、String、Bool.

```
  function writeS7(type String, ip String, slot int, rack int, dataType  String, blockAndOffset String, value Any):Bool;
```

* 输入参数
* type：同上
* ip：同上
* slot：CPU 模块的插槽号
* rack：中央机架
* dataType：在 Int,DInt,Word,String,Bool 中可选
* blockAndOffset：同上
* value: 与 dataType 类型匹配
* 输出参数

  成功返回 true，失败返回 false。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

#### S7 读取

* 方法说明

  S7 读取 Int、DInt、Word、DWord、String、Bool，类型地址位的值。

```
  function readS7(type String, ip String, slot int, rack int, dataType String, blockAndOffset String):Any
```

* 输入参数
* type：同上
* ip：同上
* slot：CPU 模块的插槽号
* rack：中央机架
* dataType：在 Int,DInt,Word,String,Bool 中可选
* blockAndOffset：同上
* 输出参数
* null，读取失败。
* Any，读取成功的返回值。
* 异常

  本方法不抛出异常，异常捕获后只作日志记录。

## MQTT

### MQTT 订阅信息（使用传入的topic）

* 方法说明

  向指定的 topic 订阅信息 ，适用于订阅多个topic的场景。

```
  function MQTTSubscribe(topic: string): string;
```

* 输入参数
* topic，string 类型，订阅的 topic。
* 输出参数

  订阅到的信息。

  如果订阅失败返回 null。
* 异常

  本方法不会抛出异常。
* 使用示例
* 1. 在 application-biz.yml 里面开启MQTT，并完成相应的配置，如下：

```
  # 是否开启 MQTT 服务
  mqttConfigView:
    enable: true
    pubConfig:
      # 服务器端点url
      broker: tcp://broker.emqx.io:1883
      # 订阅的主题，MQTT允许使用通配符订阅主题，不允许使用通配符pub发布消息
      topics:
        - Examples/1/123
      # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
      qos: 2
      # 客户端唯一标识
      clientId: RDS-Pub
      # 连接的用户名，不需要就填 null
      username: null
      # 连接的密码,不需要就填 null
      password: null
      # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
      cleanSession: false
      # 超时时间(seconds)
      connectionTimeout: 30
      # 设置会话心跳时间(seconds)
      keepAliveInterval: 60
      # 设置断开后重新连接
      automaticReconnect: true
      # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
      retained: false
      # 作为publish的遗嘱消息，会存到服务器，在publish端非正常断连的情况下，发送给所有订阅的客户端
      # 不需要就填 null
      willMsg: null
      # 遗嘱消息发布的topic
      willTopic: Examples1
    subConfig:
      # 服务器端点url
      broker: tcp://broker.emqx.io:1883
      # MQTT允许使用通配符sub订阅主题，但不允许使用通配符pub发布消息
      topics:
        - Examples/1/123
      # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
      qos: 1
      # 客户端唯一标识
      clientId: RDS-Sub
      # 连接的用户名，不需要就填 null
      username: null
      # 连接的密码,不需要就填 null
      password: null
      # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
      cleanSession: false
      # 超时时间(seconds)
      connectionTimeout: 30
      # 设置会话心跳时间(seconds)
      keepAliveInterval: 60
      # 设置断开后重新连接
      automaticReconnect: true
      # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
      retained: false
```

* 2. 编写脚本方法

```
  var data = jj.MQTTSubscribe("testTopic");
  jj.scriptLog("info","sub1",data);
```

### MQTT 订阅信息（使用配置文件的topic）

* 方法说明

  向 application-biz.yml 配置的 topic 订阅信息 ，适用于只订阅一个topic的场景。

```
  function MQTTSubscribe(): string;
```

* 输入参数

  无。
* 输出参数

  订阅到的信息。

  如果订阅失败返回 null。
* 异常

  本方法不会抛出异常。
* 使用示例
* 1. 在 application-biz.yml 里面开启MQTT，并完成相应的配置，如下：

```
   # 是否开启 MQTT 服务
   mqttConfigView:
     enable: true
     pubConfig:
       # 服务器端点url
       broker: tcp://broker.emqx.io:1883
       # 订阅的主题，MQTT允许使用通配符订阅主题，不允许使用通配符pub发布消息
       topics:
         - Examples/1/123
       # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
       qos: 2
       # 客户端唯一标识
       clientId: RDS-Pub
       # 连接的用户名，不需要就填 null
       username: null
       # 连接的密码,不需要就填 null
       password: null
       # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
       cleanSession: false
       # 超时时间(seconds)
       connectionTimeout: 30
       # 设置会话心跳时间(seconds)
       keepAliveInterval: 60
       # 设置断开后重新连接
       automaticReconnect: true
       # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
       retained: false
       # 作为publish的遗嘱消息，会存到服务器，在publish端非正常断连的情况下，发送给所有订阅的客户端
       # 不需要就填 null
       willMsg: null
       # 遗嘱消息发布的topic
       willTopic: Examples1
     subConfig:
       # 服务器端点url
       broker: tcp://broker.emqx.io:1883
       # MQTT允许使用通配符sub订阅主题，但不允许使用通配符pub发布消息
       topics:
         - Examples/1/123
       # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
       qos: 1
       # 客户端唯一标识
       clientId: RDS-Sub
       # 连接的用户名，不需要就填 null
       username: null
       # 连接的密码,不需要就填 null
       password: null
       # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
       cleanSession: false
       # 超时时间(seconds)
       connectionTimeout: 30
       # 设置会话心跳时间(seconds)
       keepAliveInterval: 60
       # 设置断开后重新连接
       automaticReconnect: true
       # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
       retained: false
```

* 2. 编写脚本方法

```
   var data = jj.MQTTSubscribe();
   jj.scriptLog("info","sub",data);
```

### MQTT 发布信息（使用传入的topic）

* 方法说明

  向输入的 topic 发布信息 。

```
  function MQTTPublish(topic: string, message: string): void;
```

* 输入参数
* topic，string 类型，订阅的 topic。
* message，string 类型，需要发布的信息。
* 输出参数

  无。
* 异常

  本方法不会抛出异常。
* 使用示例
* 1. 在 application-biz.yml 里面开启MQTT，并完成相应的配置，如下：

```
  # 是否开启 MQTT 服务
  mqttConfigView:
    enable: true
    pubConfig:
      # 服务器端点url
      broker: tcp://broker.emqx.io:1883
      # 订阅的主题，MQTT允许使用通配符订阅主题，不允许使用通配符pub发布消息
      topics:
        - Examples/1/123
      # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
      qos: 2
      # 客户端唯一标识
      clientId: RDS-Pub
      # 连接的用户名，不需要就填 null
      username: null
      # 连接的密码,不需要就填 null
      password: null
      # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
      cleanSession: false
      # 超时时间(seconds)
      connectionTimeout: 30
      # 设置会话心跳时间(seconds)
      keepAliveInterval: 60
      # 设置断开后重新连接
      automaticReconnect: true
      # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
      retained: false
      # 作为publish的遗嘱消息，会存到服务器，在publish端非正常断连的情况下，发送给所有订阅的客户端
      # 不需要就填 null
      willMsg: null
      # 遗嘱消息发布的topic
      willTopic: Examples1
    subConfig:
      # 服务器端点url
      broker: tcp://broker.emqx.io:1883
      # MQTT允许使用通配符sub订阅主题，但不允许使用通配符pub发布消息
      topics:
        - Examples/1/123
      # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
      qos: 1
      # 客户端唯一标识
      clientId: RDS-Sub
      # 连接的用户名，不需要就填 null
      username: null
      # 连接的密码,不需要就填 null
      password: null
      # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
      cleanSession: false
      # 超时时间(seconds)
      connectionTimeout: 30
      # 设置会话心跳时间(seconds)
      keepAliveInterval: 60
      # 设置断开后重新连接
      automaticReconnect: true
      # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
      retained: false
```

* 2. 编写脚本方法

```
     jj.MQTTPublish("testTopic","RDS-Script sub message.");
```

### MQTT 发布信息（使用配置文件的topic）

* 方法说明

  向配置的 topic 发布信息 。

```
  function MQTTPublish(message: string): void;
```

* 输入参数
* message，string 类型，需要发布的信息
* 输出参数

  无。
* 异常

  本方法不会抛出异常。
* 使用示例
* 1. 在 application-biz.yml 里面开启MQTT，并完成相应的配置，如下：

```
   # 是否开启 MQTT 服务
   mqttConfigView:
     enable: true
     pubConfig:
       # 服务器端点url
       broker: tcp://broker.emqx.io:1883
       # 订阅的主题，MQTT允许使用通配符订阅主题，不允许使用通配符pub发布消息
       topics:
         - Examples/1/123
       # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
       qos: 2
       # 客户端唯一标识
       clientId: RDS-Pub
       # 连接的用户名，不需要就填 null
       username: null
       # 连接的密码,不需要就填 null
       password: null
       # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
       cleanSession: false
       # 超时时间(seconds)
       connectionTimeout: 30
       # 设置会话心跳时间(seconds)
       keepAliveInterval: 60
       # 设置断开后重新连接
       automaticReconnect: true
       # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
       retained: false
       # 作为publish的遗嘱消息，会存到服务器，在publish端非正常断连的情况下，发送给所有订阅的客户端
       # 不需要就填 null
       willMsg: null
       # 遗嘱消息发布的topic
       willTopic: Examples1
     subConfig:
       # 服务器端点url
       broker: tcp://broker.emqx.io:1883
       # MQTT允许使用通配符sub订阅主题，但不允许使用通配符pub发布消息
       topics:
         - Examples/1/123
       # 设置message的服务质量（0：消息最多传递一次（零次或一次）1：至少传递一次（一次或多次）。2：只传递一次）
       qos: 1
       # 客户端唯一标识
       clientId: RDS-Sub
       # 连接的用户名，不需要就填 null
       username: null
       # 连接的密码,不需要就填 null
       password: null
       # 设置是否清空session,false表示服务器会保留客户端的连接记录，true每次都以新的身份连接服务器
       cleanSession: false
       # 超时时间(seconds)
       connectionTimeout: 30
       # 设置会话心跳时间(seconds)
       keepAliveInterval: 60
       # 设置断开后重新连接
       automaticReconnect: true
       # 表示发送的消息需要一直持久保存（不受服务器重启影响），不但要发送给当前的订阅者，并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
       retained: false
```

* 2. 编写脚本方法

```
     jj.MQTTPublish("RDS-Script sub message.");
```

## 需求单

### 创建需求单

* 方法说明

  根据指定的参数创建新的需求单。

```
  function addDemand(demandJson: string): string
```

* 输入参数
* demandJson，string 类型，表示需求单的详情，反序列化后的示例如下：

  ```
  {
      "defLabel": "",            // 需求单的名称
      "content": "",            // 需求内容，序列化之后的 JSON 数据
      "createdBy": "",        // 当前需求单的创建者
      "description": "",        // 需求单的描述
      "menuId": "",            // 补充需求菜单id
      "workTypes": "",        // 可操作当前需求单的岗位
      "workStations": "",        // 可操作当前需求单的工位
      "attrList": [           // 需求单的扩展字段值，不需要可以不传此参数
        {
          "attributeName": "ExtendedField1",
          "attributeValue": "value1"
        },
        {
          "attributeName": "ExtendedField2",
          "attributeValue": "value2"
        }
    ]
  }
  ```
* 输出参数

  成功时，返回需求单的 ID。
* 异常

  本方法会抛出异常。

### 根据 ID 更新需求单状态为完成

* 方法说明

  根据 ID 将指定的需求单的状态，更新为完成。

```
  function updateDemandFinishedById(demandId: string, supplementContent: string, handler: string): number
```

* 输入参数
* demandId，string 类型，表示需求单的 ID。
* supplementContent，string 类型，表示补充需求内容，为序列化之后的 JSON 数据。
* handler，string 类型，表示处理人。
* 输出参数
* 成功时，返回值为 1。
* 失败时，返回值为 0。
* 异常

  本方法会抛出异常。

### 根据 createBy 更新需求单状态为完成

* 方法说明

  根据 createBy 将指定的需求单的状态，更新为完成。

```
  function updateDemandFinishedByCreateBy(createBy: string, supplementContent: string, handler: string): number
```

* 输入参数
* createBy，string 类型，表示当前需求单的创建者。
* supplementContent，string 类型，表示补充需求内容，为序列化之后的 JSON 数据。
* handler，string 类型，表示处理人。
* 输出参数
* 成功时，返回值为 1。
* 失败时，返回值为 0。
* 异常

  本方法会抛出异常。

## 文件操作

### 根据文件名读取脚本目录下的文件内容

* 方法说明

  根据文件名，读取脚本目录下的文件内容。

```
  function readFileToString(fileName: string): string
```

* 输入参数
* fileName，string 类型，表示目标文件的名称（带后缀，例如 a.txt ）。
* 输出参数
* 读取文件成功时，返回值为表示文件内容的字符串。
* 读取文件失败时，返回值为 null 。
* 异常

  本方法不会抛出异常。

## 分拨单

### 标记分拨点满

* 方法说明

  标记分拨点货满，不需要放货

```
  function distributeMarkFull(loc:string)
```

* 输入参数
* loc，string类型，表示库位的id
* 输出参数
* 成功时，返回true
* 失败时，返回false

### 标记分拨点缺货

* 方法说明

  标记分拨点缺货，可以放货

```
  function distributeMarkNotFull(loc:string)
```

* 输入参数
* loc，string类型，表示库位的id
* 输出参数
* 成功时，返回true
* 失败时，返回false

### 报告放货完成

* 方法说明

  报告当前库位放货完成，可离开

```
  function distributeTaskDone(vehicleId:string)
```

* 输入参数
* vehicleId，string类型，表示机器人的id
* 输出参数
* 成功时，返回true
* 失败时，返回false

### 增加分拨点

* 方法说明

  向正在运行的分拨任务，添加分拨点

```
  function appendToLocList(taskRecordId:String, toLocList:String, blockNo:String): boolean
```

* 输入参数
* taskRecordId，String类型，必填，任务实例的Id
* toLocList，添加分拨点的参数，字符串，数据格式如下：

  ```
  [
   {
        "toLoc": "LM7",   //必填分拨点
        "postAction":""    //非必填，分拨点完成的回调
   }
  ]
  ```
* blockNo，天风任务块编号（"`b8`"），可不填，默认对应任务下正在运行的分拨单，如果涉及多个需要指定块编号
* 返回值，成功`true`,失败`false`
* 案例

```
  let loc = [{
          "toLoc": "LM7"
      }]
      jj.appendToLocList("6e32d7f2-99fa-42d4-8c4d-cd267190d694",JSON.stringify(loc),"b8")
  #说明：向在天风任务块编号是b8的任务id为6e32d7f2-99fa-42d4-8c4d-cd267190d694的分拨单添加一个分拨点LM7
```

### 删除分拨点

* 方法说明

  向正在运行的分拨任务，删除分拨点

```
  function deleteToLocList(taskRecordId:String, toLocs:String, blockNo:String): boolean
```

* 输入参数
* taskRecordId，String类型，必填，任务实例的Id
* toLocs, 删除分拨点的参数，字符串，数据格式如下：

  ```
  ["LM41"]
  ```
* blockNo，天风任务块编号（"`b8`"），可不填，默认对应任务下正在运行的分拨单，如果涉及多个需要指定块编号
* 返回值，成功`true`,失败`false`
* 案例

```
   let delLoc = ["LM41"];
   jj.deleteToLocList("276ccf58-c429-4e33-ad7b-4bcbe9d56e27", JSON.stringify(delLoc),"b8"))
   #说明：向在天风任务块编号是b8的任务id为6e32d7f2-99fa-42d4-8c4d-cd267190d694的分拨单删除一个分拨点LM41
```

## Websocket

### 根据ip向客户端发送消息

* 方法说明

  根据ip向客户端发送消息

```
  function sendMsgToWscByClientIp(msg:string,ip:string): void
```

* 输入参数
* msg，string类型，表示要发送的消息
* ip，string类型，表示接收消息的客户端ip
* 输出参数
* 无。
* 异常

  本方法会抛出异常。

### 根据客户端名称向客户端发送消息

* 方法说明

  根据客户端名向客户端发送消息

```
  function sendMsgToWscByClientName(msg:string,clientName:string): void
```

* 输入参数
* msg，string类型，表示要发送的消息
* clientName，string类型，表示接收消息的客户端名
* 输出参数
* 无。
* 异常

  本方法会抛出异常。

### 获取所有客户端ip

* 方法说明

  获取所有websocket客户端的ip

```
  function getWebsocketClientIp(): string
```

* 输入参数
* 无。
* 输出参数
* 所有客户端的ip
* 异常

  本方法会抛出异常。

### 获取所有客户端名

* 方法说明

  获取所有websocket客户端名

```
  function getWebsocketClientName(): string
```

* 输入参数
* 无。
* 输出参数
* 所有客户端名
* 异常

  本方法会抛出异常。

## 其他

### 创建唯一的 ID 编号

* 方法说明

  创建唯一的 ID 编号。

```
  function createUuid(): string
```

* 输入参数

  无。
* 输出参数
* 表示一个唯一 ID 编号的字符串。
* 异常

  本方法会抛出异常。

### 发送邮件

* 方法说明

  向目标收件方发送简单邮件。

```
  function sendMail(param: string): void
```

* 输入参数
* param，string 类型，表示邮件的详情，反序列化后的示例如下：

  ```
  {
      "to": "yy@yy.com",                     // 接收方，必填
      "subject": "Daily Meeting",         // 主题，必填
      "text": "xxx",                       // 内容，必填
      "cc": "xxx@xxx.com,yyy@yyy.com",    // 抄送，选填
      "bcc": "zzz@zzz.com"                  // 秘密抄送，选填
  }
  ```
* 输出参数

  无。
* 异常

  本方法会抛出异常。

### 发送用户消息

* 方法说明

  发送用户消息，不仅可以弹窗提醒，还可以在RDS的消息管理界面进行查看。

```
  function sendUserMessage(level: string, messageTitle: string, messageBody: string): void
```

* 输入参数
* level，string 类型，表示消息提醒的等级，有ERROR，WARN，INFO三种等级。
* messageTitle，string 类型，表示用户消息的标题。
* messageBody，string 类型，表示用户消息的内容。
* 输出参数

  无。
* 异常

  本方法不会抛出异常。

### JSON字符串转化为XML字符串

* 方法说明

  将json字符串转化为xml字符串

```
  function jsonToXml(param: string): string
```

* 输入参数
* param，string 类型，表示传入的json字符串
* 输出参数
* xml字符串
* 异常

  本方法会不抛出异常。

### MD5字符串加密

* 方法说明

  将字符串进行加密后返回

```
  function md5Encode(param: string): string
```

* 输入参数
* param，string 类型，表示传入的字符串
* 输出参数
* 32位小写字符串
* 异常

  本方法会抛出异常。

### Base64字符串重编码

* 方法说明

  将字符串进行重编码后返回

```
  function base64Encode(param: string): string
```

* 输入参数
* param，string 类型，表示传入的字符串
* 输出参数
* UrlBase64 重编码后的字符串
* 异常

  本方法会抛出异常。

### 转换成分页对象

* 方法说明

  根据给定的参数和数据，转换成分页对象并进行返回。

```
  function transToPageObj(totalCount: number, currentPage: number, pageSize: number, totalPage: number, pageList: string): string
```

* 输入参数
* totalCount, number 类型，表示分页数据的总条数
* currentPage, number 类型，表示当前是第几页
* pageSize, number 类型，表示每页显示的数量
* totalPage, number 类型，表示总页数
* pageList, string 类型，表示当前页的数据
* 输出参数
* 转换后的分页对象字符串
* 异常

  本方法不会抛出异常。
* 请求示例

```
function transToPageObj() {

// 1. 提供分页相关参数和源数据

  // 当前是第几页，最小值就是1！
  var currentPage = 2;
  // 每页的数据条数
  var pageSize = 20;
  // 获取相关的数据，以实际情况为准进行修改
  var data = jj.findSitesByCondition("{}","ASC");
  // 打印查询到的数据
  jj.scriptLog("INFO", "transToPageObj", data);
  // 转换成对象，方便截取当页的数据
  var dataObj = JSON.parse(data);
  // 截取指定页的数据
  var pageListObj = dataObj.slice((currentPage-1)*pageSize, currentPage*pageSize);
  // 将截取的数据转成字符串
  var pageListStr = JSON.stringify(pageListObj);

// 2. 调用脚本方法，转换成分页对象

  // 将数据转换成分页对象
  var res = jj.transToPageObj(dataObj.length, currentPage, pageSize, Math.ceil(dataObj.length/pageSize), pageListStr);
  // 打印转换后的结果
  jj.scriptLog("INFO", "res=", res);

// 3. 拿着分页对象进行返回或其他操作
  // TODO
}
```

### 获取天风任务参数

* 方法说明

  在脚本中直接获取到天风任务参数。

```
  function getScriptValue(key: string): string
```

* 输入参数
* key，变量表达式。
* 输出参数

  天风任务中参数key的值的字符串。
* 异常
  本方法不会抛出异常。该方法如果获取一个不存在的值时将会返回NULL。
* 请求示例

```
function test() {
    //获取任务变量status
    jj.scriptLog("debug","b1,agvid:",jj.getScriptValue("task.variables.status"))
    //获取b4块选出的库位
    jj.scriptLog("debug","b1,agvid:",jj.getScriptValue("blocks.b4.siteId"))
    //获取输入参数agvId
    jj.scriptLog("debug","b1,agvid:",jj.getScriptValue("taskInputs.agvId"))
}
```

### 批量放行

* 方法说明

  批量放行机器人，与等待放行块结合使用。

```
  function releaseWaitPass(agvIds: Array<String>): boolean
```

* 输入参数
* agvIds，String 数组类型，需放行的机器人Id。
* 输出参数
* true，放行成功。
* false，放行失败
* 异常
  本方法不会抛出异常。
* 请求示例

```
function releaseWaitPass(){
    let agvIds = []//注意参数是数组
    agvIds.push("AMB-150J")//放行一个就只用push一个
    agvIds.push("sim_01")
    jj.releaseWaitPass(agvIds)
}
```

### 脚本公平锁

* 方法说明

  根据锁名称，获取不同的锁，并发情况下串行执行一段代码

```
  function withFairnessLock(lockName: string, fair: boolean, action: () => void): void;
```

* 输入参数
* lockName：String 锁的名称
* fair：true: 公平锁更具时间先后顺序获取，false: 非公平锁，随机获取锁
* action: 执行的代码块
* 输出参数

  无
* 异常
  本方法不会抛出异常。
* 请求示例

```
jj.withFairnessLock("kk", true, () => {
        // 代码块
        jj.scriptLog("INFO", "test", "test")
    })
```

进程已结束，退出代码为 0
