VWED_server/docs/在线脚本功能详情.md

4798 lines
123 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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"
}
```
* 输出参数
* truetaskId 和 taskLabel 字段不是都为空字符串。
* falsetaskId 和 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
```
* 输入参数
taskRecordIdstring 类型,是任务实例的唯一 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
```
* 输入参数
outOrderNostring 类型,是外部单号 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
```
* 输入参数
agvIdstring 类型,是机器人 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
```
* 输入参数
orderIdstring 类型Core 运单执行 ID。
* 输出参数
* 异常
本方法会抛出异常。
#### 校验任务实例ID是否存在
* 方法说明
校验任务实例id是否存在。
```
function isTaskRecordIdExist(taskRecordId: string): boolean
```
* 输入参数
taskRecordIdstring 类型任务实例id。
* 输出参数
* true存在。
* false不存在。
* 异常
本方法会抛出异常。
#### 校验任务名称是否存在
* 方法说明
校验任务名称是否存在。
```
function isTaskLabelExist(taskName: string): boolean
```
* 输入参数
taskNamestring 类型,任务名称。
* 输出参数
* 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
```
* 输入参数
robotNamestring 类型,机器人名称。
* 输出参数
* 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;
```
* 输入参数
agvIdstring 类型机器人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;
```
* 输入参数
agvIdstring 类型机器人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;
```
* 输入参数
codeint类型错误码。
* 输出参数
```
{
"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;
```
* 输入参数
codeint类型错误码。
* 输出参数
```
{
"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
```
* 输入参数
vehicleIdstring 类型,机器人名称。
statusboolean类型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缓存键。
* 输出参数
* stringJSON 格式。如果数据不存在,将返回 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
```
* 输入参数
无。
* 输出参数
* stringJSON 格式。如果数据不存在,将返回空串。
* 异常
本方法抛出异常。
## 手持端相关
#### 通知手持端(工位/岗位)
* 方法说明
可以给手持端的指定工位或者岗位发送弹框通知。该弹框可以人工确认。如无人工确认,可配置保持时间,超过保持时间,弹框自动消失。
```
function noticeOperator(workTypes: string, workStations: string, content: string, needConfirm: boolean, keepTime: number): void
```
* 输入参数
* workTypesstring 类型,要通知的岗位。多岗位间逗号分隔。
* workStationsstring 类型,要通知的工位。多工位间逗号分隔。
* contentstring 类型,通知的内容。
* needConfirmboolean类型表示是否需要手持端用户点击确认后通知弹框才会消失。
* keepTimenumber类型表示通知弹框在手持端的保持时间单位秒超过这个时间弹框将消失。
**注意**:本方法采用异步的方式发送群发通知。
* 输出参数
本方法输出参数为空。
* 异常
本方法抛出异常。
#### 通知手持端用户
* 方法说明
可以给手持端的指定用户发送弹框通知。该弹框可以人工确认。如无人工确认,可配置保持时间,超过保持时间,弹框自动消失。
```
function noticeOperatorByUser(userNames: string, content: string, needConfirm: boolean, keepTime: number): void
```
* 输入参数
* userNamesstring 类型,要通知的用户。多用户间逗号分隔。
* contentstring 类型,通知的内容。
* needConfirmboolean类型表示是否需要手持端用户点击确认后通知弹框才会消失。
* keepTimenumber类型表示通知弹框在手持端的保持时间单位秒超过这个时间弹框将消失。
**注意**:本方法采用异步的方式发送群发通知。
* 输出参数
本方法输出参数为空。
* 异常
本方法抛出异常。
#### 通过menuId修改手持端按钮的label
* 方法说明
通过menuId定位修改手持端对应按钮的label(重启之后会失效,恢复到初始状态)
```
function setPadLabelByMenuId(menuId: String, label: String):void
```
* 输入参数
* menuIdstring 类型要更改的手持端任务按钮的menuId
* labelstring 类型将手持端按钮上标签的内容修改为label中的内容
* 输出参数
本方法输出参数为空。
* 异常
本方法抛出异常。
#### 通过menuId修改手持端按钮的背景色
* 方法说明
通过menuId修改手持端按钮的背景色(重启之后会失效,恢复到初始状态)
```
function setPadBackgroundByMenuId(menuId: String, background: String):void
```
* 输入参数
* menuIdstring 类型要更改的手持端任务按钮的menuId
* backgroundstring 类型将手持端按钮上标签的背景色修改为background中的颜色16进制的RGB格式
* 输出参数
本方法输出参数为空。
* 异常
本方法抛出异常。
#### 通过menuId设置手持端按钮是否禁用
* 方法说明
通过menuId设置手持端按钮是否禁用(重启之后会失效,恢复到初始状态)
```
function setPadDisableByMenuId(menuId: String, disable: boolean):void
```
* 输入参数
* menuIdstring 类型要更改的手持端任务按钮的menuId
* disable布尔类型手持端按钮是否设置为禁用
* 输出参数
本方法输出参数为空。
* 异常
本方法抛出异常。
## 多线程及时间
#### 休眠指定时间
* 方法说明
本方法是阻塞方法,使当前线程休眠指定时间。
```
function sleep(ms: number): void
```
* 输入参数
* msnumber 类型,休眠的时间,单位毫秒。
* 输出参数
本方法输出参数为空。
* 异常
本方法不抛出异常。
#### 获取当前系统时间戳
* 方法说明
获取当前的系统时间戳。
```
function currentTimeMillis(): number
```
* 输入参数
* 输出参数
number 类型,当前系统的毫秒时间戳。
#### 获取当前时间
* 方法说明
获取当前系统的格式化时间。
```
function nowDate(): string
```
* 输入参数
* 输出参数
字符串:按照 `yyyy-MM-dd HH:mm:ss` 格式。
* 异常
本方法不抛出异常。
#### 将时间戳转为日期格式
* 方法说明
将时间戳转为格式化的日期时间。
```
function timeMillisFormat(time: number): string
```
* 输入参数
* timenumber 类型,当前毫秒时间戳。
* 输出参数
字符串:按照 `yyyy-MM-dd HH:mm:ss` 格式。
* 异常
本方法会抛出异常。
## HTTP 请求
#### 发送 POST 请求,参数为 JSON 格式
* 方法说明
本方法是阻塞方法,发送 POST 请求,参数为 JSON 格式。
```
function requestPost(url: string, param: string): string
```
* 输入参数
* urlstring 类型,请求的 URL。
* paramstring 类型JSON 字符串,请求的参数。
* 输出参数
* 若请求成功:返回响应的 JSON 字符串。
* 若请求失败null。
* 异常
本方法会不抛出异常。
#### 发送 POST 请求,参数为 XML 格式
* 方法说明
本方法是阻塞方法,发送 POST 请求,参数为 XML格式。在本方法中会自动将传入的 JSON 格式字符串转化为 XML 格式
```
function requestPostXml(url: string, param: string): string
```
* 输入参数
* urlstring 类型,请求的 URL。
* paramstring 类型JSON 字符串,请求的参数。
* 输出参数
* 若请求成功:将响应的 XML 格式 字符串 转化为 JSON 格式并返回。
* 若请求失败null。
* 异常
本方法会不抛出异常。
#### 发送 PUT请求参数为 JSON 格式
* 方法说明
本方法是阻塞方法,发送 PUT请求参数为 JSON 格式。
```
function requestPutJson(url: string, param: string): string
```
* 输入参数
* urlstring 类型,请求的 URL。
* paramstring 类型JSON 字符串,请求的参数。
* 输出参数
* 若请求成功:返回响应的 JSON 字符串。
* 若请求失败null。
* 异常
本方法会不抛出异常。
#### 发送 GET 请求
* 方法说明
本方法是阻塞方法,发送 GET 请求。
```
function requestGet(url: string): string
```
* 输入参数
urlstring 类型,请求的 URL。
* 输出参数
* 若请求成功:请求返回的字符串。
* 若请求失败null。
* 异常
本方法会不抛出异常。
#### 设置请求头
* 方法说明
本方法是阻塞方法,设置请求头,设置一次之后,对所有请求都有效。
```
function setHeader(key: string, value: string): void
```
* 输入参数
keystring 类型请求头的key。
valuestring 类型请求头的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
```
* 输入参数
* levelstring 类型,日志等级,可选 “INFO”“ERROR”。
* functionNamestring 类型,一般填入所在函数的签名,用于快速定位信息。
* contentany 类型,日志信息。
* 输出参数
* 异常
本方法会抛出异常。
## 注册方法
**以下方法,需要在 boot() 函数中调用。**
#### 定时执行脚本方法
*需求:脚本方法能传参。*
* 方法说明
将脚本方法设置为定时执行。
**注意,该方法需要在 boot() 方法中调用。**
```
function defineScheduledFunctions(isParallel: boolean, delay: number, period: number, functionName: string, args: any[]): void
```
* 输入参数
* isParallelboolean 类型,是否并行。
* delaynumber 类型,启动延迟执行的时间,单位毫秒。
* periodnumber类型脚本方法的周期单位毫秒。
* functionNamestring 类型,周期执行的方法名。
* args周期执行的方法的参数。
* 输出参数
* 异常
本方法会抛出异常。
#### 注册系统启动初始化方法
* 方法说明
注册系统启动即执行的初始化方法。
```
function defineInitDataFunctions(functionName:string):void
```
* 输入参数
functionName注册的方法名。
* 输出参数
* 异常
本方法会抛出异常。
#### 注册按钮
* 方法说明
向rds注册管理后台可见的按钮。
```
function registerButton(label: string, remark: string, scriptFunction: string, level: string, type: Number): void
```
* 输入参数
* labelstring 类型,按钮名。
* remarkstring 类型,按钮备注。
* scriptFunctionstring 类型,点击按钮触发的方法名,**注意该方法不能带参数**。
* levelstring 类型按钮等级用颜色区分。blue蓝色yellow黄色 red红色。
* typeNumber类型0: 普通按钮 1: 导出按钮,可选
* 输出参数
* 异常
本方法会抛出异常。
#### 注册 Web 接口方法
* 方法说明
在脚本中注册接口方法。
```
function registerHandler(method: string, path: string, callback: string, auth: boolean): void
```
* 输入参数
* methodHTTP 请求方式,支持 POSTGET。
* 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
```
* 输入参数
keystring 类型,是 application-biz.yml 中所要获取配置的字段名。
* 输出参数
JSON 字符串。
* 异常
## 数据库
#### 执行 SQL 语句
* 方法说明
通过 SQL 命令操作 RDS 系统数据库,可用于创建自定义数据表。
```
function jdbcExecuteSql(sql: string): Boolean
```
* 输入参数
sqlstring 类型,创建表的 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
```
* 输入参数
sqlstring 类型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
```
* 输入参数
* sqlstring 类型SQL 语句字符串。
* sqlParamsany 类型,可动态扩展的参数。
* 输出参数
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
```
* 输入参数
* sqlstring 类型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
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* 输出参数
* null读取失败。
* boolean读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func02 读取线圈量
* 方法说明
Modbus 读取线圈量,功能码 02。
```
function readInputStatus(ip: string, port: number, slaveId: number, offset: number): boolean | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* 输出参数
* null读取失败。
* boolean读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func03 读取保持寄存器
* 方法说明
Modbus 读取保持寄存器,功能码 03。
```
function readHoldingRegister(ip: string, port: number, slaveId: number, offset: number, dataType: number): number | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* dataTypenumber 类型2无符号整形3有符号整形。
* 输出参数
* null读取失败。
* number读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func04 读取输入寄存器
* 方法说明
Modbus 读取只读输入寄存器,功能码 04。
```
function readInputRegister(ip: string, port: number, slaveId: number, offset: number, dataType: number): number | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* dataTypenumber 类型2无符号整形3有符号整形。
* 输出参数
* null读取失败。
* number读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func01 批量读取线圈量
* 方法说明
Modbus 读取线圈量多个连续地址值,并以数组的形式返回其中的值,功能码 01。
```
function batchReadCoilStatus(ip: string, port: number, slaveId: number, offset: number, len: number): Array<boolean> | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 首地址。
* lennumber 类型Modbus 地址数量。
* 输出参数
* null读取失败。
* Array读取成功后返回结果数组。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func02 批量读取离散输入
* 方法说明
Modbus 读取离散输入多个连续地址值,并以数组的形式返回其中的值,功能码 02。
```
function batchReadInputStatus(ip: string, port: number, slaveId: number, offset: number, len: number): Array<boolean> | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 首地址。
* lennumber 类型Modbus 地址数量。
* 输出参数
* null读取失败。
* Array读取成功后返回结果数组。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func03 批量读取保持寄存器
* 方法说明
Modbus 读取保持寄存器多个连续地址值,并以数组的形式返回其中的值,功能码 03。
```
function batchReadHoldingRegisters(ip: string, port: number, slaveId: number, offset: number, len: number): Array<number> | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 首地址。
* lennumber 类型Modbus 地址数量。
* 输出参数
* null读取失败。
* Array读取成功后返回结果数组。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func04 批量读取输入寄存器
* 方法说明
Modbus 读取输入寄存器多个连续地址值,并以数组的形式返回其中的值,功能码 04。
```
function batchReadInputRegisters(ip: string, port: number, slaveId: number, offset: number, len: number): Array<number> | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 首地址。
* lennumber 类型Modbus 地址数量。
* 输出参数
* null读取失败。
* Array读取成功后返回结果数组。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func05 写入线圈量
* 方法说明
Modbus 写入线圈量,功能码 05。
```
function writeCoilStatus(ip: string, port: number, slaveId: number, offset: number, value: boolean): boolean
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* valueboolean 类型,写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func06 写入保持寄存器
* 方法说明
Modbus 写入保持寄存器,功能码 06。
```
function writeHoldingRegister(ip: string, port: number, slaveId: number, offset: number, dataType: number, value: number): boolean
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* dataTypenumber 类型2无符号整形3有符号整形。
* valuenumber 类型,写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func0f 批量写入线圈量
* 方法说明
Modbus 写入线圈量多个连续地址,功能码 0f。
```
function batchWriteCoilStatus(ip: string, port: number, slaveId: number, offset: number, value: Array<boolean>): boolean
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* valueboolean 数组类型,多个需写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Func10 批量写入保持寄存器
* 方法说明
Modbus 写入保持寄存器多个连续地址,功能码 10。
```
function batchWriteHoldingRegister(ip: string, port: number, slaveId: number, offset: number, value: Array<number>): boolean
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* offsetnumber 类型Modbus 地址。
* valuenumber 数组类型,多个需写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### 通用写入单个地址
* 方法说明
Modbus 写入单个地址,通过参数 type 指定读取的地址类型。
```
function writeSingleModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number, value: number): boolean
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* typestring类型表示地址类型可选择0x1x3x4x和功能码的对应关系如下
0x对应功能码0x01表示读线圈。
1x对应功能码0x02表示读离散输入。
3x对应功能码0x04表示读输入寄存器。
4x对应功能码0x03表示读保持寄存器。
* offsetnumber 类型表示Modbus 地址。
* valuenumber 类型,表示写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### 通用写入多个地址
* 方法说明
Modbus 写入单个地址,通过参数 type 指定读取的地址类型。
```
function writeBatchModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number, values: number[]): boolean
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* typestring类型表示地址类型可选择0x1x3x4x和功能码的对应关系如下
0x对应功能码0x01表示读线圈。
1x对应功能码0x02表示读离散输入。
3x对应功能码0x04表示读输入寄存器。
4x对应功能码0x03表示读保持寄存器。
* offsetnumber 类型表示Modbus 地址。
* valuesnumber 数组类型,表示写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### 通过实例名称写入单个地址
* 方法说明
Modbus 写入单个地址,通过参数 name 指定已经配置的实例名称。
```
function writeSingleModbusValueByInstanceName(name: string, offset: number, value: number): boolean
```
* 输入参数
* namestring 类型,已经配置的实例名称。
* offsetnumber 类型,表示 Modbus 地址。
* valuenumber 类型,表示写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
如果没有配置 modbus 实例,则会抛出初始化异常。
#### 通过实例名称写入多个地址
* 方法说明
Modbus 写入多个地址,通过参数 name 指定已经配置的实例名称。
```
function writeBatchModbusValueByInstanceName(name: string, offset: number, values: number[]): boolean
```
* 输入参数
* namestring 类型,已经配置的实例名称。
* offsetnumber 类型,表示 Modbus 地址。
* valuesnumber 数组类型,表示写入的值。
* 输出参数
* true写入成功。
* false写入失败。
* 异常
如果没有配置 modbus 实例,则会抛出初始化异常。
#### 通用读取单个地址
* 方法说明
Modbus 读取单个地址,通过参数 type 指定读取的地址类型。
```
function readSingleModbusValue(ip: string, port: number, slaveId: number, type: string, offset: number): number | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* slaveIdnumber 类型,从机 slave ID。
* typestring类型表示地址类型可选择0x1x3x4x和功能码的对应关系如下
0x对应功能码0x01表示读线圈。
1x对应功能码0x02表示读离散输入。
3x对应功能码0x04表示读输入寄存器。
4x对应功能码0x03表示读保持寄存器。
* offsetnumber 类型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类型表示地址类型可选择0x1x3x4x和功能码的对应关系如下
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
```
* 输入参数
* addressstring 类型,读取的地址位。
* 输出参数
* 读到的值。
* 异常
读取失败会抛出 RuntimeException 异常 “readOpcValue error”。
* 方法说明
```
function readOpcValue(namespaceIndex:number, address: string | number): any
```
* 输入参数
* namespaceIndex, number类型命名空间索引
* addressstring 类型,读取的地址位。地址类型 g=550e8400-e29b-41d4-a716-446655440000: g= 表示地址类型是 UUIDi=1008: i= 表示地址类型是 numberb=EAk=: b= 表示地址类型是 Opaques=1009: s= 表示地址类型是字符串
* 输出参数
* 读到的值。
* 异常
读取失败会抛出 RuntimeException 异常 “readOpcValue error”。
#### OPC 订阅方式读取数值
* 方法说明
通过订阅的方式,读取 OPC server 中的某个地址位的值。
```
function readOpcValueBySubscription(namespaceIndex: number, address: string): any
```
* 输入参数
* namespaceIndexnumber 类型,命名空间索引。
* addressstring 类型,读取的地址位。地址类型 g=550e8400-e29b-41d4-a716-446655440000: g= 表示地址类型是 UUIDi=1008: i= 表示地址类型是 numberb=EAk=: b= 表示地址类型是 Opaques=1009: s= 表示地址类型是字符串
* 输出参数
* 读到的值。
* 异常
读取失败会抛出 RuntimeException 异常 “readOpcValue error”。
#### OPC 写入数值
* 方法说明
读取 OPC server 中的某个地址位的值。
```
function writeOpcValue(address: string | number, value: any): boolean
```
* 输入参数
* addressstring 类型,表示写入的地址。
* valueany 类型, 写入的值。
* 输出参数
成功返回 true失败返回 false。
* 异常
本方法不抛出异常。
* 方法说明
读取 OPC server 中的某个地址位的值。
```
function writeOpcValue(namespaceIndex: number,address: string | number, value: any): boolean
```
* 输入参数
* number类型命名空间索引
* addressstring 类型,表示写入的地址。地址类型 g=550e8400-e29b-41d4-a716-446655440000: g= 表示地址类型是 UUIDi=1008: i= 表示地址类型是 numberb=EAk=: b= 表示地址类型是 Opaques=1009: s= 表示地址类型是字符串
* valueany 类型, 写入的值。
* 输出参数
成功返回 true失败返回 false。
* 异常
本方法不抛出异常。
## Melsec
#### Melsec 读取 boolean
* 方法说明
Melsec 读取 boolean。
```
function readMelsecBoolean(ip: string, port: string, address: string): boolean | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* addressstring 类型,读取的地址位。
* 输出参数
* null读取失败。
* boolean读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Melsec 读取 number
* 方法说明
Melsec 读取 number。
```
function readMelsecNumber(ip: string, port: string, address: string): number | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* addressstring 类型,读取的地址位。
* 输出参数
* null读取失败。
* number读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Melsec 读取 string
* 方法说明
Melsec 读取 string。
```
function readMelsecString(ip: string, port: string, address: string, length: number) : string | null
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* addressstring 类型,读取的地址位。
* lengthnumber 类型,读取的长度。
* 输出参数
* null读取失败。
* string读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Melsec 写入 boolean
* 方法说明
Melsec 写入 boolean。
```
function writeMelsecBoolean(ip: string, port: string, address: string, value: boolean): void
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* addressstring 类型,写入的地址位。
* valueboolean 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Melsec 写入 number
* 方法说明
Melsec 写入 number。
```
function writeMelsecNumber(ip: string, port: string, address: string, value: number) : void
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* addressstring 类型,写入的地址位。
* valuenumber 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Melsec 写入 string
* 方法说明
Melsec 写入 string。
```
function writeMelsecString(ip: string, port: string, address: string, value: string) : void
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* addressstring 类型,写入的地址位。
* valuestring 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
## Fins
#### Fins 读取 string
* 方法说明
Fins 读取 string。
```
function readFinsString(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number, wordLength: number) : string
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* areanumber 类型读取的存储区域代码16进制值如0x82
* finsIoAddrnumber 类型,读取的地址位 。
* bitOffsetnumber 类型,读取的偏移量 。
* wordLengthnumber 类型,读取的长度 。
* 输出参数
* null读取失败。
* string读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Fins 读取 word
* 方法说明
Fins 读取 word。
```
function readFinsWord(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number) : number
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* areanumber 类型读取的存储区域代码16进制值如0x82
* finsIoAddrnumber 类型,读取的地址位 。
* bitOffsetnumber 类型,读取的偏移量 。
* 输出参数
* null读取失败。
* number读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Fins 读取 bit
* 方法说明
Fins 读取 bit。
```
function readFinsBit(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number) : number
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* areanumber 类型读取的存储区域代码16进制值如0x82
* finsIoAddrnumber 类型,读取的地址位 。
* bitOffsetnumber 类型,读取的偏移量
* 输出参数
* null读取失败。
* number读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Fins 写入 word
* 方法说明
Fins 写入 word。
```
function writeFinsWord(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number, value: number) : void
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* areanumber 类型写入的存储区域代码16进制值如0x82
* finsIoAddrnumber 类型,写入的地址位 。
* bitOffsetnumber 类型,写入的偏移量 。
* valuenumber 类型,写入的值。
* 输出参数
* 该方法无输出参数。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### Fins 写入 bit
* 方法说明
Melsec 写入 string。
```
function writeFinsBit(ip: string, port: number, area: number, finsIoAddr: number, bitOffset: number, value: boolean) : void
```
* 输入参数
* ipstring 类型,从机 IP。
* portnumber 类型,从机端口。
* areanumber 类型写入的存储区域代码16进制值如0x82
* finsIoAddrnumber 类型,写入的地址位 。
* bitOffsetnumber 类型,写入的偏移量 。
* valueboolean类型写入的值。
* 输出参数
* 该方法无输出参数。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
## S7
#### S7 读取 Int
* 方法说明
S7 读取 Int。
```
function readS7Int(type: string, ip: string, blockAndOffset: string): number;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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 |
* valuenumber 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### S7 写入 DInt
* 方法说明
S7 写入 DInt。
```
function writeS7DInt(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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 |
* valuenumber 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### S7 写入 Word
* 方法说明
S7 写入 Word。
```
function writeS7Word(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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 |
* valuenumber 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### S7 写入 DWord
* 方法说明
S7 写入 DWord。
```
function writeS7DWord(type: string, ip: string, blockAndOffset: string, value: number): boolean;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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 |
* valuenumber 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### S7 写入 String
* 方法说明
S7 写入 String。
```
function writeS7String(type: string, ip: string, blockAndOffset: string, value: string): boolean;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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 |
* valuestring 类型,写入的值。
* 输出参数
* 成功返回 true失败返回 false。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
#### S7 写入 Bool
* 方法说明
S7 写入 Bool。
```
function writeS7Boolean(type: string, ip: string, blockAndOffset: string, value: boolean): boolean;
```
* 输入参数
* typestring 类型PLC 类型可选值区分大小写S1200/S300/S400/S1500/S200Smart/S200。
* ipstring 类型PLC IP。
* blockAndOffsetstring 类型,读取的地址,支持的区域取值示例如下(区分大小写):
| 地址名称 | 地址代号 | 示例 |
| --- | --- | --- |
| 中间寄存器 | 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 |
* valueboolean 类型,写入的值。
* 输出参数
* 成功返回 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同上
* slotCPU 模块的插槽号
* 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同上
* slotCPU 模块的插槽号
* rack中央机架
* dataType在 Int,DInt,Word,String,Bool 中可选
* blockAndOffset同上
* 输出参数
* null读取失败。
* Any读取成功的返回值。
* 异常
本方法不抛出异常,异常捕获后只作日志记录。
## MQTT
### MQTT 订阅信息使用传入的topic
* 方法说明
向指定的 topic 订阅信息 适用于订阅多个topic的场景。
```
function MQTTSubscribe(topic: string): string;
```
* 输入参数
* topicstring 类型,订阅的 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;
```
* 输入参数
* topicstring 类型,订阅的 topic。
* messagestring 类型,需要发布的信息。
* 输出参数
无。
* 异常
本方法不会抛出异常。
* 使用示例
* 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;
```
* 输入参数
* messagestring 类型,需要发布的信息
* 输出参数
无。
* 异常
本方法不会抛出异常。
* 使用示例
* 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
```
* 输入参数
* demandJsonstring 类型,表示需求单的详情,反序列化后的示例如下:
```
{
"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
```
* 输入参数
* demandIdstring 类型,表示需求单的 ID。
* supplementContentstring 类型,表示补充需求内容,为序列化之后的 JSON 数据。
* handlerstring 类型,表示处理人。
* 输出参数
* 成功时,返回值为 1。
* 失败时,返回值为 0。
* 异常
本方法会抛出异常。
### 根据 createBy 更新需求单状态为完成
* 方法说明
根据 createBy 将指定的需求单的状态,更新为完成。
```
function updateDemandFinishedByCreateBy(createBy: string, supplementContent: string, handler: string): number
```
* 输入参数
* createBystring 类型,表示当前需求单的创建者。
* supplementContentstring 类型,表示补充需求内容,为序列化之后的 JSON 数据。
* handlerstring 类型,表示处理人。
* 输出参数
* 成功时,返回值为 1。
* 失败时,返回值为 0。
* 异常
本方法会抛出异常。
## 文件操作
### 根据文件名读取脚本目录下的文件内容
* 方法说明
根据文件名,读取脚本目录下的文件内容。
```
function readFileToString(fileName: string): string
```
* 输入参数
* fileNamestring 类型,表示目标文件的名称(带后缀,例如 a.txt )。
* 输出参数
* 读取文件成功时,返回值为表示文件内容的字符串。
* 读取文件失败时,返回值为 null 。
* 异常
本方法不会抛出异常。
## 分拨单
### 标记分拨点满
* 方法说明
标记分拨点货满,不需要放货
```
function distributeMarkFull(loc:string)
```
* 输入参数
* locstring类型表示库位的id
* 输出参数
* 成功时返回true
* 失败时返回false
### 标记分拨点缺货
* 方法说明
标记分拨点缺货,可以放货
```
function distributeMarkNotFull(loc:string)
```
* 输入参数
* locstring类型表示库位的id
* 输出参数
* 成功时返回true
* 失败时返回false
### 报告放货完成
* 方法说明
报告当前库位放货完成,可离开
```
function distributeTaskDone(vehicleId:string)
```
* 输入参数
* vehicleIdstring类型表示机器人的id
* 输出参数
* 成功时返回true
* 失败时返回false
### 增加分拨点
* 方法说明
向正在运行的分拨任务,添加分拨点
```
function appendToLocList(taskRecordId:String, toLocList:String, blockNo:String): boolean
```
* 输入参数
* taskRecordIdString类型必填任务实例的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
```
* 输入参数
* taskRecordIdString类型必填任务实例的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
```
* 输入参数
* msgstring类型表示要发送的消息
* ipstring类型表示接收消息的客户端ip
* 输出参数
* 无。
* 异常
本方法会抛出异常。
### 根据客户端名称向客户端发送消息
* 方法说明
根据客户端名向客户端发送消息
```
function sendMsgToWscByClientName(msg:string,clientName:string): void
```
* 输入参数
* msgstring类型表示要发送的消息
* clientNamestring类型表示接收消息的客户端名
* 输出参数
* 无。
* 异常
本方法会抛出异常。
### 获取所有客户端ip
* 方法说明
获取所有websocket客户端的ip
```
function getWebsocketClientIp(): string
```
* 输入参数
* 无。
* 输出参数
* 所有客户端的ip
* 异常
本方法会抛出异常。
### 获取所有客户端名
* 方法说明
获取所有websocket客户端名
```
function getWebsocketClientName(): string
```
* 输入参数
* 无。
* 输出参数
* 所有客户端名
* 异常
本方法会抛出异常。
## 其他
### 创建唯一的 ID 编号
* 方法说明
创建唯一的 ID 编号。
```
function createUuid(): string
```
* 输入参数
无。
* 输出参数
* 表示一个唯一 ID 编号的字符串。
* 异常
本方法会抛出异常。
### 发送邮件
* 方法说明
向目标收件方发送简单邮件。
```
function sendMail(param: string): void
```
* 输入参数
* paramstring 类型,表示邮件的详情,反序列化后的示例如下:
```
{
"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
```
* 输入参数
* levelstring 类型表示消息提醒的等级有ERRORWARNINFO三种等级。
* messageTitlestring 类型,表示用户消息的标题。
* messageBodystring 类型,表示用户消息的内容。
* 输出参数
无。
* 异常
本方法不会抛出异常。
### JSON字符串转化为XML字符串
* 方法说明
将json字符串转化为xml字符串
```
function jsonToXml(param: string): string
```
* 输入参数
* paramstring 类型表示传入的json字符串
* 输出参数
* xml字符串
* 异常
本方法会不抛出异常。
### MD5字符串加密
* 方法说明
将字符串进行加密后返回
```
function md5Encode(param: string): string
```
* 输入参数
* paramstring 类型,表示传入的字符串
* 输出参数
* 32位小写字符串
* 异常
本方法会抛出异常。
### Base64字符串重编码
* 方法说明
将字符串进行重编码后返回
```
function base64Encode(param: string): string
```
* 输入参数
* paramstring 类型,表示传入的字符串
* 输出参数
* 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
```
* 输入参数
* agvIdsString 数组类型需放行的机器人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;
```
* 输入参数
* lockNameString 锁的名称
* fairtrue: 公平锁更具时间先后顺序获取false: 非公平锁,随机获取锁
* action: 执行的代码块
* 输出参数
* 异常
本方法不会抛出异常。
* 请求示例
```
jj.withFairnessLock("kk", true, () => {
// 代码块
jj.scriptLog("INFO", "test", "test")
})
```
进程已结束,退出代码为 0