产线自动化
概述
产线自动化是通过提供可视化的方式,使用JavaScript语言编写产线各设备之间的柔性调度逻辑,不再需要额外配备PLC或上位机。可支持150ms以上实时性要求的调度。
操作步骤
新建自动化化规则
登录Janus边缘计算平台,点击左侧菜单栏 产线自动化 - 自动化规则,进入自动化规则页面。
点击右上角 新增规则 ,进入自动化规则编辑页。
点击产线自动化应用,在自动化规则页面点击新增规则,进入产线自动化编辑页面。

基础信息
进入编辑页面,在 基础信息 标签页中填写自动化规则的基础信息。

- 名称:填写描述该自动化规则的名称(必填);
- 备注:填写描述该规则的备注信息(选填);
- 启用:若勾选,则在点击
保存时,启用该自动化规则。
设备范围
进入编辑页面,在 设备范围 标签页中配置本次产线自动化规则涉及到的设备,并给设备设置别名,用于在后面规则编写。

- 在设备一列中点击
⚙按钮在设备一行中点击选择此设备; - 不允许其他规则使用:若勾选,则该设备仅可通过本自动化规则执行产线自动化;
- 设置别名:设置一个别名,用于在后续规则设置及代码中用别名代称该设备;
- 点击
同步按钮,可替换当前规则中的原有名称,比如替换规则及触发条件、执行下发代码中的设备别名。

添加规则
进入编辑页面,在 规则 标签页中编写调度逻辑。
点击 添加规则 ,在对话窗口中输入规则名称,点击 确认 即可新建一条规则。

完成创建后,可对该创建的规则编写调度逻辑。
- 触发规则:可选
数据驱动和定时下发。- 若选择数据驱动,则需设定
相关设备数据驱动的数据范围; - 若选择定时下发,则需设定
定时下发的时间周期。
- 若选择数据驱动,则需设定
- 触发方式:可选
满足条件即触发及仅结果变更时触发- 满足条件即触发:当设备上传的数据满足
触发条件,则根据设定的触发次数执行若干次执行代码; - 仅结果变更时触发:根据触发条件返回结果判断是否执行触发,当触发判断结果从false变为true时,执行一次执行代码;
- 满足条件即触发:当设备上传的数据满足
- 触发条件:点击编辑按钮,可进入触发条件代码编辑窗口,编写调度成立的条件;
- 执行代码:点击编辑按钮,可进入执行代码编辑窗口,编写调度成立时需要传输的内容;
- 规则名称:编辑该规则名称;
- 是否启用:控制该规则的
启用/关闭状态。
触发条件示例
// $CNC$为设备别称,FeedSign为该设备某个布尔值数据栏位
var data = root['$CNC$']['FeedSign'];
if (data) {
return true;
} else {
return false;
}
// 触发条件需最终输出一个true或false
执行代码示例
if (root["$mqtt$"]["LeftStart"] == 1) {
var params = {};
params["deviceID"] = "CNC001";
params["operation"] = "LeftStart";
device.pushDataToDevice("$mqtt$", params);
}
if (root["$mqtt$"]["LeftEnd"] == 1) {
var params = {};
params["deviceID"] = "CNC001";
params["operation"] = "LeftEnd";
params["successPieces"] = root["$mqtt$"]["successPieces"];
params["failedPieces"] = root["$mqtt$"]["failedPieces"];
params["totalPieces"] = root["$mqtt$"]["totalPieces"];
device.pushDataToDevice("$mqtt$", params);
}
调度下发到已接入设备执行代码示例
// 按照JavaScript语法标准编程
// 获取设备数据
var deviceData = root["$device$"]["data_4007"];
// 可添加条件分支,判断是否下发控制
if( deviceData == 1 ) {
// 准备要发送的参数内容,使用object包裹要下发的数据,
var pushData = {
"data_4008": 1,
"data_4009": 1
};
// 调用device.pushDataToDevice方法,将参数内容发送给设备,"$device$"是在设备范围中定义的别名
device.pushDataToDevice("$device$", pushData);
log.info("下发数据成功");
} else {
log.info("未达成条件,无法发送数据");
}
下发数据注意事项
如果设备通过 HTTP server方式接入,使用device.pushDataToDevice()方法时需注意:
- 如果
接入设置-下发数据设置中未设置 Header 参数,则pushDataToDevice的下发内容将作为 Header 发送; - 如果已在请求参数的 Header 中配置
Content-Type: application/json,则pushDataToDevice的下发内容将作为请求 Body 发送。
字符拼接
进行字符串拼接时,请使用 "字符串1" + "字符串2"的加号连接方式,避免使用 ${表达式}的模板字符串语法。由于系统中$开头的内容(如"$AGV01$")会被识别为设备别名,如果在模板字符串中连续使用多个$符号,可能导致引擎误将其解析为设备变量,进而引发执行错误。
正确使用示例:
// 推荐:使用加号进行字符串拼接
log.info(hour + '-' + min + '-' + sec);
错误示例:
// 不推荐:模板字符串中的 $ 符号可能被误解析为设备别名
log.info(`${hour}-${min}-${sec}`);
第三方系统通过API调度控制示例
若第三方系统未接入到janus,可通过以下方法调用第三方系统API
可以使用内置的请求方法实现http的get/post请求,如:
// 使用内置的post方法
http.post("http://192.168.1.1:8080/api/v1/device/control",
{
// 填入请求参数
"param1": "value1"
},
{
// 填入请求头
"Content-Type": "application/json"
},
)
// 使用内置的get方法
http.get("http://192.168.1.1:8080/api/v1/device/control",
{
// 填入请求参数
"param1": "value1"
},
{
// 填入请求头
"Content-Type": "application/json"
},
)
日志打印
日志打印示例,当语句触发时,可在系统左侧菜单栏运行日志中查看日志内容。
log.info("打印正常日志");
log.warning("打印警告日志");
log.error("打印错误日志");
缓存变量
通过保存数据到缓存,可实现跨规则数据传递。
//设置缓存变量
cache.set("key", value);
//获取缓存值
let lastValue = cache.get("key");
//删除缓存变量
cache.delete("key");
运行日志
代码编写完毕后,若相关联设备上传数据,触发对应的产线自动化,在运行日志可查看执行情况,确认规则是否触发。

