边缘计算

>i此章只讲通过【BOX配置】新增BOX、添加设备、添加变量、新增报警、边缘计算、协议转发等功能 ## BOX配置 >d注意:1.如果不用脚本功能或数据转发功能,建议不用【BOX配置】里面进行编辑,使用ECSManager软件常规编辑即可 2.通过【BOX配置】里面编辑配置后,将不能使用ECSManager软件进行编辑,只能【BOX配置】里面进行编辑或使用新配置软件BOXConfig软件进行编辑 ### 新增BOX 【BOX配置】--【BOX配置】点击【添加BOX】按钮 >s说明: 1.此处添加BOX时,BOX必须在线(网关指示灯CLD亮),否则不能添加 2.此页面的【网络配置】中不要修改任何参数,主要查看用,上网方式的设置请置硬件手册】--选择型号手册中的【网络设置】查看编辑 ![image.png](https://cos.easydoc.net/16860085/files/lmhagica.png) - 删除设备:如果不需要这个BOX,可以删除BOX(如果绑定了项目,需要先至【项目中心】-【项目配置】-【BOX管理】中移除BOX) - 解绑序列号:如果需要释放该序列号供别的BOX或项目使用,解绑即可 - 更改序列号:如果后期更换模块,可以在此更换序列号 - 远程重启:点击后,模块会重新启动 - 升级到新配置软件:升级后,通过ECSManager软件创建的BOX配置将不能通过ECSManager软件进行编辑,切记!!!!!!只能通过在该页面【BOX配置】或下载【客户端BOXConfig】新软件中编辑 ### 添加设备 【BOX配置】-【变量管理】-【通讯口配置】中新增设备 ![image.png](https://cos.easydoc.net/16860085/files/lmhaxrsv.png) - PLC名称:根据需要自定义 - 通讯口:根据实际设备口选择,串口选择232或485,网口就选择网口 - 设备品牌:根据BOX连接的设备品牌选择 - 设备系列:设备具体型号 - IP地址:通讯口选择网口,IP地址填写BOX所连接PLC等设备实际IP即可 - 端口:通讯口选择网口,IP地址填写BOX所连接PLC的协议端口填写即可 - 高级设置: --基本不需要设置,如果遇到某些变量读不上来的情况,可以在此处设置单包变量数为2或别的(根据实际情况调整) ### 添加变量 通过上一步添加设备后,【BOX配置】-【变量管理】-【默认分组】中可以添加变量,默认存在BOX状态和设备状态变量 ![image.png](https://cos.easydoc.net/16860085/files/lmhb8q5y.png) ![image.png](https://cos.easydoc.net/16860085/files/lmhbapsn.png) 添加变量时根据变量点表创建即可: - PLC名称:选择已添加的设备 - 读写类型: -- 读写:该变量可读可写 -- 只读:该变量不支持修改 -- 只写:该变量不上传,只支持修改 - 变量名称:自定义该变量名称 - 变量单位:自定义填写 - 变量地址:根据设备变量点表实际填写 - 地址偏移:根据设备变量点表实际填写 - 数据类型:根据设备变量类型实际填写 - 数据经度:根据设置的精度上传该变量的小数精度 - 变量描述:如有需要,自定义 - 更多设置: -- 线性换算:启用后,可以对该变量进行简单的线性运算,比如缩小10倍、扩大100倍等 -- 有效范围:启用后,该变量值在设定范围内才上传 -- 存储类型:启用后,根据需要选择存储类型,包括周期存储、变化存储、条件存储 -- 安全配置:启用后,该变量的控制权限将和角色的项目权限关联,只有角色有该安全类的才能控制 >d注意:如果该BOX没有绑定项目,且【项目中心】-【项目配置】-【项目信息】-【过期时间】未设置或已过期,变量都显示88888888 ### 边缘计算 针对于某些设备需要做些数据处理,开放了边缘计算功能。 BOX固件版本需要3.5X以上 ![image.png](https://cos.easydoc.net/16860085/files/lmheq4tw.png) 边缘计算使用LUA语音脚本功能,内置了常用的一些脚本模板:例如次数统计、时长计算、费用计算、报警联动、定时任务、MQTT连接、HTTP连接等等 ![image.png](https://cos.easydoc.net/16860085/files/lmhbri0f.png) - 案例:此案例为一个时长计算的脚本案例 -- 创建变量:时长变量使用自定义变量,不要使用设备变量 ![image.png](https://cos.easydoc.net/16860085/files/lmhbzb15.png) --新建脚本:选择时长计算模板 ![image.png](https://cos.easydoc.net/16860085/files/lmhc0dpp.png) --脚本代码 ```python -- 计算设备有效运行时长 local status = get_var("运行") local time = get_var("运行时长") if (status == 1) then set_var("运行时长", time + 1) end ``` ### 下载至BOX 所有配置都配置完成后,或者配置有所修改都需要将配置下载至BOX ![image.png](https://cos.easydoc.net/16860085/files/lmhc81y4.png) ## 脚本块语法 脚本使用LUA,可以参考[LUA语法参考](https://www.runoob.com/lua/lua-basic-syntax.html) ![image.png](https://cos.easydoc.net/16860085/files/lmhctcmd.png) --1.该BOX下创建的变量,供编辑代码时使用,在编辑代码时,选择位置后,双击变量即可 --2.帮助:包含了支持的所有语法和开放的功能块 --3.代码编辑器:代码编辑块 --4.测试、问题:调试用 ### 系统线程库 - 多任务代码示例 ```python require("global") local cnt = 0 --创建一个定时器任务, 每一秒钟执行一次 create_timer(function() cnt = cnt + 1 log("task1", cnt) end, 1) --创建一个定时器任务, 每5秒钟执行一次 create_timer(function() cnt = cnt + 1 log("task2", cnt) end, 5) --创建一个线程任务 create_thread(function() while true do --等待2秒钟 sleep(2) cnt = cnt + 1 log("task3", cnt) end end) --开始同时运行以上所有任务 run() ``` - 创建定时任务 ```python create_timer(function() end, interval) ``` - 创建一个线程 ```python create_thread(function() end) ``` - 启动任务 ```python run() ``` ### LUA基础语法 - function (定义函数) ```python function func1() end ``` - if (条件判断) ```python if (true) then end ``` - if ... else (条件判断2) ```python if (true) then else end ``` - if ... elseif (条件判断3) ```python if (true) then elseif (true) then else end ``` - while … do (条件循环) ```python while (true) do end ``` - for … i (次数循环) ```python for i = 1, 10 do end ``` - for … in (遍历循环) ```python for i, v in ipairs(obj) do print(i, v) end ``` - local (定义变量) ```python local a = 5 ``` - +-*/ (算术运算符) ```python local a = 2 local b = 1 -- 加法 local c = a + b -- 减法 c = a - b -- 乘法 c = a * b -- 除法 c = a / b -- 取余 c = a % b -- 乘幂 c = a^2 -- 负号 c = -a ``` - == <= >= (关系运算符) ```python local a = 2 local b = 1 -- 等于 if (a == b) then -- 不等于 elseif (a ~= b) then -- 大于 elseif (a > b) then -- 小于 elseif (a < b) then -- 大于等于 elseif (a >= b) then -- 小于等于 elseif (a <= b) then end ``` - and or not (逻辑运算符) ```python -- 逻辑非 elseif (not a) then end ``` ### BOX库 天启通过LUA开发的专门读写BOX数据变量的库 - 获取变量值 ```python local var_value = get_var("变量名称"); ``` - 获取所有变量值 ```python --[[ 获取所有变量值 接口名称: get_var_list 参数:无 返回:二维数组,每个元素保存一个变量的 name, id,status,datatype 和 value,比如: { {0, "tag0", false, 5, nil }, { 3, "tag3", true, 8, 789}} 代码示例: ]]-- local vars = get_var_list(); for i, var in pairs(vars) do local id = var[1]; local name = var[2]; local status = var[3]; local datatype = var[4]; local value = var[5]; print(id, name, status, datatype, value); end ``` - 设置单个变量值 ```python set_var("变量名称", "变量值"); ``` - 设置多个变量的值 ```python --[[ 控制多个变量值 - 通过变量名称 接口名称:set_var_batch 参数: 一维数组,元素下标为变量名称 ]]-- local ctrl_tbl = { tag108 = 36, tag109 = 789.561 }; set_var_batch(ctrl_tbl); ``` - 打印日志信息 ```python log(""); ``` ### socket库 - 连接 - 发送 - 接收 - select - 设置超时 - 休眠 - 引用 可参考lua的socket连接使用 ### mqtt库 - 创建客户端 - 订阅 - 发布 - 启动mqtt 可参考lua的socket连接使用,案例 ```python require("global") local config = { uri = "192.168.1.23:1883", id = "mqtt-test-05", username = "admin", password = "123456", } function on_message(topic, payload, qos) print(topic, payload, qos) end function on_event(connected, type, msg) print(connected, type, msg) end local mqtt = create_mqtt_client(config, on_message, on_event) mqtt:subscribe("luamqtt/#", 0) mqtt:run() local i = 0 create_timer(function() i = i + 1 now = get_time_second() local a, b = mqtt:publish("luamqtt/spec111", "this is a test message " .. i) end, 10) run() ``` ### http库 - 引用 ```python require("global") ``` - get请求 ```python -- data_type: json/text, tiomeout:超时时间为秒 local code, data = http_get(url, data_type, timeout) ``` - post请求 ```python http_post(url, data, content_type, data_type, timeout) ``` ### json库 - 引用 ```python local cjson = require("cjson") ``` - 转json ```python local jsonData = cjson.encode(table) ``` - 转数据表 ```python --json转数据 local data = cjson.decode(jsonData) ``` ### lua-表(table)用法 - 声明 - 连接 - 插入 - 移除 - 排序 ### lua-字符串(string)用法 - 声明 - 转换大小写 - 替换 - 查找 - 反转 - 计算长度 - 截取