# 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 | 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 | 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 | 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 | 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 ``` * 输入参数 * 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): 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): 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