跳到主要内容

产线自动化

概述

产线自动化是通过提供可视化的方式,使用JavaScript语言编写产线各设备之间的柔性调度逻辑,不再需要额外配备PLC或上位机。可支持150ms以上实时性要求的调度。

设备1
设备1
Janus数据定义
Janus数据定义
触发规则
触发规则
数据下发处理
数据下发处理
设备1数据
设备1数据
下发至设备2数据
下发至设备2数据
上传数据
上传数据
下发指令
下发指令
设备2
设备2
上传数据
上传数据
下发指令
下发指令
产线自动化规则1
产线自动化规则1
触发规则
触发规则
数据下发处理
数据下发处理
设备N数据
设备N数据
下发至设备N+1数据
下发至设备N+1数据
产线自动化规则N
产线自动化规则N
设备N
设备N
上传数据
上传数据
下发指令
下发指令
设备N+1
设备N+1
上传数据
上传数据
下发指令
下发指令
Viewer does not support full SVG 1.1

操作步骤

新建自动化化规则

登录Janus边缘计算平台,点击左侧菜单栏 产线自动化 - 自动化规则,进入自动化规则页面。

点击右上角 新增规则 ,进入自动化规则编辑页。

点击产线自动化应用,在自动化规则页面点击新增规则,进入产线自动化编辑页面。

基础信息

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

  • 名称:填写描述该自动化规则的名称(必填);
  • 备注:填写描述该规则的备注信息(选填);
  • 启用:若勾选,则在点击 保存 时,启用该自动化规则。

设备范围

进入编辑页面,在 设备范围 标签页中配置本次产线自动化规则涉及到的设备,并给设备设置别名,用于在后面规则编写。

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

添加规则

进入编辑页面,在 规则 标签页中编写调度逻辑。

点击 添加规则 ,在对话窗口中输入规则名称,点击 确认 即可新建一条规则。

完成创建后,可对该创建的规则编写调度逻辑。

  • 触发规则:可选 数据驱动定时下发
    • 若选择数据驱动,则需设定 相关设备 数据驱动的数据范围;
    • 若选择定时下发,则需设定 定时下发 的时间周期。
  • 触发方式:可选 满足条件即触发仅结果变更时触发
    • 满足条件即触发:当设备上传的数据满足触发条件,则根据设定的触发次数执行若干次执行代码;
    • 仅结果变更时触发:根据触发条件返回结果判断是否执行触发,当触发判断结果从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");

运行日志

代码编写完毕后,若相关联设备上传数据,触发对应的产线自动化,在运行日志可查看执行情况,确认规则是否触发。