目 录
1. 概述... 1
2. 整体介绍... 2
3. 主要功能简介... 5
1. 概述
历时9个月的时间,对iNeuOS工业互联网操作系统进行全面重构,发布内部测试版本。重构的主要目的:工程化的框架优化,更好的聚焦工业领域业务发展。重构也是保障产品能够可持续发展的重要手段,同时兼顾产品的安全性和稳定性。此次重构的主要特点:
(1)代码层面,进一步统一框架,优化代码;功能层面,提高易用性;运行层面,提高执行效率。
(2)整体框架支持租户,全面支持云端化部署与应用。
(3)前端优化渲染引擎,渲染能力提高10%左右;后端代码执行效率提高3%-5%,实时数据存储空间降低5%。
(4)前后端全面采用模块化开发,提高二次开发效率和更好满足业务定制化开发的需求。
(5)重构系统70%的功能使用“低代码”平台完成开发,基本上具备了“机器”创造“机器”的能力。
开发或选择一款软件产品是一件很不容易的事情,很难同时兼顾满足高质量的代码、漂亮的界面和解决场景实际问题。
(1)大部分开发者都懂得对代码重构,但是大部分开发者又不具备推倒重构代码的勇气,特别是针对框架性的代码。此次对iNeuOS的前端框架、后台接口和后台服务进行了全面重构。经常有用户问我们需要什么样的技术要求才能够进行二次开发?有1年左右工作经验,大概1周左右就能够上手了。
前端框架统一采用VUE框架,主要满足以数据驱动为核心的工程化的业务功能开发与应用,进行组件化开发,减少业务功能开发的代码量,同时增强代码的可读性。代码如下图:

后台接口主要采用NET6(C#)开发语言,框架进行模块化设计,系统功能就像搭建乐高积木一样,主要满足领域业务需求不固定、变化多的特点,能够很快实现功能需求的定制化,同时又能够满足功能之间共性需求的提炼与抽象,进一步形成产品设计。代码如下图:

后台服务主要采用NET6(C#)开发语言,算法和机器学习部分采用python开发语言。此次对后台服务进行重构的目标主要体现在执行效率上,优化内存分配机制,使变量和数组能够在连续的内存区域上,确保访问的安全性和高性能。代码如下图:

(2)界面实现了传统菜单导航(Menu Navigation)和窗体应用(Windows)之间的切换。看似是样式上的改变,其实是对前端和后端代码的较大改动。系统默认采用Windows应用模式,但是也有很多用户喜欢传统菜单导航的模式,此次升级也做了兼容性适配。
窗体应用(Windows),如下图:

传统菜单导航(Menu Navigation),如下图:

(3)在实际场景化应用方面,产品化+定制化能够解决现场的实际问题,做到落地可实施。
从设计理念来看,它具备操作系统的特点:即接、即用、即分析、即显示,开放式的二次开发。
从以数据为中心的角度看,数据流程化应用:设备驱动(数据交互驱动)、服务驱动(数据事务处理驱动)、设备模型(设备实时通信及处理)、业务模型(数据分组建模)、资产模型(数据空间规则提取)、计算平台(数据计算与预警)、数据分析、数据转发(多层级系统部署)、视图建模(2D/3D数据展示)、视频转换(视频数据展示)、工艺优化控制(数据联动控制)、算法分析(数据算法分析)、Excel报表设计(数据报表模板设计与应用)、表单开发(“低代码”开发业务功能)和用户权限等;
从更高级的信息化系统建设来看,完全可以在iNeuOS平台基础上承建产线级、企业级、集团级或行业级的物联网平台、大数据平台或是工业互联网平台,进一步构建设备管理、能源管理、环保管理、安全系统、工艺管理等子系统一体化的平台管控系统;
从部署及应用来看,系统完全支持跨平台部署在windows、linux、docker及国产操作系统,可以实现部署在嵌入式网关(资源少)、PC机、服务器上;
从应用行业来看,已经应用在煤炭、钢铁、镍矿、环保、水务、纸业、加工制造、核能、设备厂家等领域。
注:功能介绍功能图为测试环境下的截图。
(1)支持Modbus、PLC、机床和行业非标设备等共总119个设备驱动协议,支持高并发数据采集和反向控制。如下图:


(2)视图建模组态,支持5500多个2D/2.5D的SVG矢量图元信息;支持obj、gltf和fbx格式的3D模型上传到组态中,关联数据驱动模型部件;支持标题、数据点、按钮、视频监控、容器、图片和时间等组件;支持折线图、柱状图、限值预警图、饼图、油表图、进度图、液位图、雷达图等;支持自定义画图元信息,包括:自由绘制、箭头、直线、虚线、圆、椭圆、长方形、直角、等边三角等;支持自定义动作规则,进行预警、改变颜色、闪烁、跳动、旋转等,支持动作响应优先级设置。如下图:

(3)报表设计支持秒、时、日、月和年自定义报表样式,自定义配置数据展示的模板,绑定数据源及配置数据的小数位、数据显示方向、填充数位(显示多少条数据)、统计(均值、和值、最小值、最大值、中位数和众数)。如下图:

(4)“低代码”线表单开发工具,支持的表单组件丰富。可让用户通过拖拽配置的方式配置表单的增删查改,支持添加\更新数据唯一性验证,解放用户对于基础表,父子表、多表关联父子表的开发编辑工作。如下图

(5)计算预警,支持数学运算符和函数对数据点进行复杂的计算,支持创建多个计算任务,支持逻辑规划推理,并对结果进行消息推送。如下图:

(6)算法分析,算法包括:快速傅里叶变换、包络分析、倒频谱和自相关等。会对当前数据点进行数据的基本汇总统计:数据量、均值、最大值和最小值等;还会对数据点的原始值和算法分析结果进行图形化展示。如下图:

(7)资产模型(机器学习),支持通用机器学习算法和集成自定义模型算法,对工况的多维数据空间训练模型,提取工况对应的规则,结合数据空间的实时数据预测对应的工况。如下图:

(8)工艺优化联动控制支持在线开发业务脚本,支持多个生产过程联动控制任务, 脚本引擎支持内置函数:控制命令(ctrl)、控制延迟(delay)、获得当前参数(getpara)、保存中间变量值(save)、控制启动(start)、控制停止(stop)、最新数值(getvalue)和打印日志(log)。如下图:

(9)设备运维业务大屏统计功能主要统计当前系统设备数量、预警设备数量、通讯正常、通讯干扰、通讯中断及按设备区域统计和统计预警信息。展示效果,如下图:

物联网&大数据技术 QQ群:54256083
物联网&大数据项目 QQ群:727664080
QQ:504547114
微信:wxzz0151
博客:https://www.cnblogs.com/lsjwq
购买《物联网软件架构设计与实现》:京东购买。

我正在使用RubyonRails3.2.2,我想从我的模型/类中“提取”一些方法。也就是说,在不止一个类/模型中,我有一些方法(注意:方法与用户授权相关,并被命名为“CRUD方式”),这些方法实际上是相同的;所以我认为DRY方法是将这些方法放在“共享”模块或类似的东西中。实现该目标的常见且正确的方法是什么?例如,我应该将“共享”代码放在哪里(在哪些目录和文件中)?如何在我的类/模型中包含提到的方法?你有什么建议?注意:我正在寻找“RubyonRails制作东西的方式”。 最佳答案 一种流行的方法是使用ActiveSupport关注点
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我正在尝试提取所有包含与当前月份/年份或下一个月年份匹配的字段的账单信息。例如,假设当前月份是2014年12月,我想要这样的内容:Billing.where(exp_month:12,exp_year:2014ORexp_month:1,exp_year:2015)该语法显然不正确,但它让您了解我所追求的。所以,这里的问题是...如何正确设置该查询的格式?如何获取该查询格式的当前/下个月/年份?我正在运行Ruby2.1.2。 最佳答案 Ruby的Date类提供了很多方法:first_of_month=Date.current.beg
除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p
这个问题在这里已经有了答案:HashsyntaxinRuby[duplicate](1个回答)关闭5年前。我有一个Recipe,其中包含以下未通过lint测试的代码:service'apache'dosupports:status=>true,:restart=>true,:reload=>trueend失败并出现错误:UsethenewRuby1.9hashsyntax.supports:status=>true,:restart=>true,:reload=>true不确定新语法是什么样的...有人可以帮忙吗?
我正在做一个项目。目前我有一个相当大的条件语句,它根据一些输入参数为变量赋值。所以,我有这样的东西。ifsomeconditionx=somevalueelsifanotherconditionx=adifferentvalue...重构它的最佳方法是什么?我希望我最终会得到类似的东西x=somevalueifsomecondition||anothervalueifanothercondition这种事情有规律吗? 最佳答案 只需将赋值放在if之外即可。x=ifsomeconditionsomevalueelsifanotherc
我正在重构一个西洋跳棋程序,我正在尝试将玩家移动请求(例如以“3、3、5、5”的形式)处理到一个int数组中。我有以下方法,但感觉不像我所知道的那样像Ruby:deftranslate_move_request_to_coordinates(move_request)return_array=[]coords_array=move_request.chomp.split(',')coords_array.each_with_indexdo|i,x|return_array[x]=i.to_iendreturn_arrayend我用它进行了以下RSpec测试。it"translatesa
我正试图在这里清理这个非常丑陋的方法,它迫切需要重构,但我不确定哪种结构最能做到这一点(即case语句,或者只是一个精心格式化的ifthen语句)乍一看,这似乎是一个理想的放置case语句的地方,带有一些放置得很好的when,但我的理解是case语句只能用于单个变量,而不是两个变量,以及使用散列或数组尝试这些语句的irb的各种摆弄在这里也没有太多说明。你会怎么做?在检查这样的多个bool值时,Ruby中是否有任何常见的技巧来避免这样的代码?defhas_just_one_kind_of_thing?(item,controller)if(controller=='foos'&&item
我正在尝试为自己创建一个直接连接到我的日历的应用程序……但我从不想参与重新验证。我只想编写一次身份验证代码并完成它。授权码如下:key=Google::APIClient::PKCS12.load_key(SERVICE_ACCOUNT_PKCS12_FILE_PATH,PASSWORD)asserter=Google::APIClient::JWTAsserter.new(SERVICE_ACCOUNT_EMAIL,'https://www.googleapis.com/auth/calendar',key)@client=Google::APIClient.new@client.a
如何使用Capistrano将Rails应用程序部署到无法访问外部网络或存储库的生产或暂存服务器?我已经设法完成部署的一半,并意识到Capistrano没有在我的本地机器上下载gitrepo,但它首先连接到远程服务器并尝试在那里下载Git存储库。我希望有一个类似Javaee的构建系统,其中创建可交付成果并将该可交付成果发送到服务器。就像您构建.ear文件并将其部署到您想要的任何服务器上一样。显然在RoR中,你被迫(据我所知)在该服务器上构建应用程序,在那里创建一个gem存储库,在那里克隆最新的分支等等。有什么方法可以将准备运行的包发送到远程服务器吗? 最佳答