Niagara 物联网技术基础应用(文章修复中,不定时更新)
新手指南
前言
鉴于市面上有关Niagara物联网技术资料较少,笔者结合自生参加竞赛的经历编写此指南,该指南旨在让新手快速上手Niagara workbench
主要分以下几个模块讲解:
- 物联网软件平台(workbench)的使用
- Niagara编程方式及入门
- 项目创建流程
Workbench 的使用
Niagara软件流程及协议
Niagara系统中主要包括以下几种程序:
platform(平台)
Station(站点)
Workbench(工作台)
Daemon(守护进程)
Web Browser(浏览器客户端)
Niagra支持的协议
预留(暂时没详细了解,理论上支持所有工控协议,但是却不支持一些轻量级设备的协议)
workbench功能及介绍
workbench开发平台是Niagara 4的统一应用开发工具,其功能主要包括数据建模、用户界面设计、驱动开发(内置Java开发环境),用户的所有开发都可在此环境中进行。
Workbench主窗口视图功能
Workbench主窗口视图基本要素如下图1所示,本文档将按照下图所示的标识对功能进行描述
Niagara编程入门
Niagara的大多数功能和应用可采用两种编程方式:
- 专业程序员方式—Java编程
- 非专业程序员方式—接线图(Wire Sheet)编程
专业程序员方式—Java编程
预留(没学过Java)
非专业程序员方式—接线图(Wire Sheet)编程
Point描述
在Niagara软件平台中,所有的参数变量都被抽象作名为点(Point)的模块,这个点又可以分为两个大类
有“简单点”和“代理点”两种主要类型,欲了解更详细的信息请阅读手册"About KitControl"部分内容
\begin{cases}
\colorbox{yellow}{Simple Control Point}\\
\\
\colorbox{yellow}{Proxy Point}
\end{cases}
\]
简单控制点(Simple Control Point):从KitControl\(\to\)ControlPalette\(\to\)Points中添加的点属于简单控制点,在项目中主要起数据处理的作用,无需配置寄存器。
代理点(Proxy Point):通过网络设备驱动添加的点属于代理控制点,通过代理点可以从设备中读取数据,也可向设备中写入数据,但这种点不能随意添加,这种Point与设备内部的寄存器有关,在配置时需要查阅设备的寄存器表
控制点数据类型
布尔型-Boolean:只有on和off两种状态,可用于开关及设备的启停。
数值型-Numeric:代表模拟量(AO、AI信号)适用于一些与数值相关的变量,使用的是双精度(64bit)数值类型。
枚举型-Enum:代表枚举状态(超过两种状态),可以实现多种状态的控制。
字符串类型-String:代表一个或多个ASCⅡ字符,通常具有一些字面意义
控制点读写类型
只读型:只能读取,不能控制和修改
读写型:既能读取,也能修改
如下图所示:
图中带有Writable后缀的Point便是可写类型,而不带此后缀的便是只读类型,下面以布尔点为例讲解点的用法,在这之前我们先了解下组件的通用视图类型。
通用组件视图类型
什么是通用组件视图?通用组件视图在创建一个数据文件时默认加入的视图文件,这些视图用于配置、管理相应的组件,在station-config目录下新建文件夹命名demo,双击该文件夹默认打开的是名为Wire Sheet的视图,展开主视图右上角的视图选择器后可看见系统默认添加的通用组件视图,如下图所示
- Wire sheet: 显示组件间的连接关系,以及运行状态,多用于逻辑程序编写以及程序仿真,该视图是Point类型组件的主要承载者,想要向程序中加入一个点变量便是从Palette中选取想要的变量后采用鼠标拖拽的方式将其拖入该视图。如下所示
- Ax property sheet:显示组件的可见属性,切换至此视图后可见各Point变量以列表的形式呈现,单击某个变量后可展开该点的属性配置,在该视图便于配置多个Point的属性,但不便于展示各Point的连接,展开可见属性后可看见Point的属性是由不同的拓展块组合而成的,在可见属性界面可以再加入新的属性拓展,例如报警点,如下所示
Property sheet: 功能同 Ax property sheet,基于 HTML5 实现
Category sheet:类别管理,与权限配置相关
Ax slot sheet: 显示和编辑组件 slot 属性,如隐藏、显示、类型等(其实就是组件的可见属性)
Relation sheet:显示和管理组件之间的链接关系
可见属性视图详解
我们主要讨论可读写型Point的属性配置,因为只读型Point可讲得东西实在是太少了,但这两个类型的属性界面也有很多相似之处,我们重点选取BooleanWritable和NumericWritable进行讲述,这也是最常用到的Point
首先在WireSheet视图中加入BooleanWritable和NumericWritable点变量,如下所示
双击BooleanWritable图块进入该点位的可见属性配置界面,具体功能描述如下图所示
NumericWritable的属性界面大多与BooleanWritable相同,下面着重介绍NumericWritable的属性界面的不同点,如下图所示
再讲一下些二者的共同点,虽然这种可读写型点位变量最多支持17个输入端口,但在WireSheet视图中,我们只看到了其中的两个输入,如下图所示,该点位的仅有两个输入端口
想必你也不希望视图里是一长串的输入端口,所以变量在创建时默认只开放了两个输入端口,那么要怎么加入更多输入端口呢?首先对着Point模块单击鼠标右键,如图出现下列菜单
单击最下方的Pin Slots出现端口插槽菜单,如下图所示,其中带有图钉标号的就是该模块开放的端口
若想对端口作改动,只需要单击相应的端口直到被标上图钉标志即可
Poxy Point设置流程
项目创建流程
资料准备
预留
在组态软件中配置项目
创建工作站
在菜单栏依次点击Tools-New Station
按需输入工作站名称,工作路径一般无法更改,默认在C盘(与计算机管理员绑定),随后选择工作站模板(默认即可)
随后设置工作站密码,首先是admin(超级管理员用户)用户,该账户用于管理有关Station的操作,用户名就是admin且无法更改,密码设置完毕后该Station的所有文件将保存在侧栏目录中,如下所示
—My Host:主机名
—My File System
—User Home
—Station
—用户创建station
在此目录下,用户能以“离线”状态编辑station相关功能
打开platform平台
在菜单栏依次点击My Host-My Modules-platform
其中会出现两个platform,带小锁图标的是TLS(一种安全协议)连接,另一个是普通连接,双击后进入登录界面,如果是在本机上运行的platform,其账户密码为此电脑的管理员账户和密码,但如果要登录其他设备,如JACE,需在菜单栏依次点击File-Open-Open Platform进入界面后输入正确的IP地址和端口号进行连接,此时的密码为该设备的platform密码
拷贝station文件夹至Daemon(守护进程)目录
不论在任何设备上运行station都是从Platform Daemon User Home中启用站点,所以离线运行的station必须将该站点拷贝进入Platform Daemon User Home文件夹中,先在侧栏依次打开My Host-Platform。在主界面的功能目录上选择Station Copier功能,进入后能看见左右两个文件区域,左侧区域是本地(也就是创建的离线station)station,右侧则是守护进程的目录,选中本地文件夹的station再点击中间的copy即可将文件转移到另一区域,当然,守护进程的文件也可以下载,但是通常需要授权(station密码),拷贝过程会出现两个复选框,这两个复选框的功能请查阅书籍P102
启动station
进行上述步骤后双击回到platform界面,在主界面视图选择Application Director,进入界面后可看到为未启动的实例,启动station代命令行出现正在运行的相关字样说明station启动完成
打开station
在station启动完成后侧栏的platform下方会出现station标识,双击即可进入station登录界面,此处的station界面的登录密码即为新建station的admin用户的密码,用户名是admin,密码为用户自定义。成功登入后待主界面出现新内容说明station打开成功
配置项目实时数据库
预留
为实时数据配置历史存储功能
历史数据功能概要
网络控制器(JACE)采集的数据属于实时数据,很多情况需要将实时数据保存起来以便后期查询和数据分析。历史记录是有时间戳记录数据的有序集合。
想要让Station中的历史数据提供数据库支持,Station必须包含History Service等历史服务,这些服务在创建station时会默认添加,不建议随意删改,如下图所示。
此外还需要给需要历史数据记录的Point添加正确的历史拓展并进行合适的配置
要记录的数据量往往很大,因此历史数据编程时要注意以下几点
- 哪些数据需要记录?
- 记录的频率是多少?
历史数据记录基本流程
数据采集:确定需要采集的数据,若该数据是根据数据变化记录的,则确定数据变化的幅值;若该数据是根据时间变化记录的,则确定记录的时间间隔
数据储存:主要包括定义要储存的数据库文件名,及定义数据库文件的容量。若为JACE站点,则需要定义一个有限的数据库文件容量,缺省值为500条记录;若为PC站点,可将数据容量定义为无限制
数据归档:指JACE定期将数据归档到Supervisor站点,在节省储存空间的同时也便于永久储存数据
历史数据功能的基本配置流程
在host/station/config目录下创建一个文件夹将其命名为Demo
双击文件夹打开WireSheet视图从Palette-KitControl-Util中将名为Random的模块拖入WireSheet视图中如下图所示
鼠标双击该Point进入可见属性配置界面,将偏移值设置为-10,将最大数据范围设置为60,并将表面属性数值修改为摄氏度并修改该Point的DisplayName,如下图所示
在WireSheet再添加一个NumericWriable的数据点并按照Doc Histories文档向该点添加相应的拓展
其中,Interval类型是按时间间隔收集历史数据的拓展(周期性存储);Cov类型是按数据变化收集历史数据的拓展(状态变位存储,一般用于布尔类型)。
打开历史拓展属性,详细属性配置如下
把历史数据的使能打开,然后将历史数据记录间隔修改为5秒
随后在history便可在Host/Station/Config/Demo/History/TEST(station的名字)中双击RT_Temperature数据库后可以看到相应的数据曲线图(chart)。如下图所示
从视图切换列表中可以切换不同的视图,到此,历史服务建立的基本流程结束
为实时数据配置报警
需要配置报警功能的项目
- 异常范围:当某个数值超出了规定的数据范围,必须设计报警功能提醒管理员
- 警告提示:当程序突然去执行其他任务时需要给管理员一个必要的提示
- 故障报警:设备返回故障或脱离控制需要及时提醒管理员维护
报警功能的基本配置流程
基本流程
报警生成
报警路由
报警生成
下面是报警流程配置的基本步骤
- 要想使Point具有报警功能同样是需要安装相应的属性拓展,在Palette中搜索alarm功能组,进入alarm功能组后再选择Extensions目录按需选择相应的拓展(详见手册),这里我们在上次进行历史数据配置的例子中安装拓展,如下图所示
- 以OutOfRangeAlarmExt(根据数值上下限产生报警的拓展)为例解释其中的详细属性配置,如下图所示
根据需要编写联动控制程序
在Wire Sheet界面中,能以鼠标拖拽Point模块端口的方式进行输出(out)与输入(in)之间的连接,这是在一个Wire Sheet视图中的Point之间的连接,但这种方式是不可以连接到这个Wire Sheet视图以外的点,下面主讲不同Wire Sheet之间的Point的连接方式。
跨文件数据交互(处于不同Wire Sheet中的Point之间的互联方式)
手册Basic object linking
我们首先在Host>station>config目录下创建两个文件夹,一个命名为Data1,另一个命名为Data2,如下图所示
创建完成后在Data1文件夹中创建一个随机数Random,在Data2文件夹中创建一个NumericWriable点,如下图所示
显然,利用鼠标拖拽的方式并不能使这里两个点互联,在Niagara中,处于不同Wire Sheet视图中的Point进行互联是可以的,首先需要定义“数据源”(一般就是输出),先对着需要定义的“数据源”的Point模块单击鼠标右键,会相应的菜单选项,我们将视角锁定到这个选项,如下图所示
![](E:\new desk\Niagara项目文档\文档图片\link mark.bmp)
这里实际上我已经点击过Link Mark选项,否则这三行选项除了Link Mark选项以外其余两项是灰色且不显示内容的,在单击Link Mark选项过后就完成了“数据源”的定义,而图中的Link From“Random”就是将该点作为目标点与源点进行连接,而Link To “Random”就是将改点作为源点与目标点进行连接,显然,我们对自己定义的数据源点进行这两个操作是不合理的,我们现在打开Data2的Wire Sheet视图对想要连接的Point单击鼠标右键,我们选择Link From “Random”选项,会出现这样的界面,如下图所示
在此界面我们可以看到我们之前使用Link Mark定义的“数据源”,以及我们现在定义的“目标源”,单击“数据源”的输出(out)和单击“目标源”的输入(in10或in16)在点击“ok”便可完成跨文件的数据连接,通过下拉link窗口你可以看到一些用户的操作slot也能够进行互联,形成控制关系,连接完成Point会出现一个小尾巴,如下图所示
如图所示,该点已经成功接收到了来自另一个文件夹中的数据,双击小尾巴可以直接跳转到“数据源”,通过这样的方式可以实现跨文件甚至跨协议的数据交互。到此,跨文件数据交互的基本流程结束。有几个要点需要注意
- 并不是所有点都能连接,比如输入就必须和输出进行配对,不能互联的slot在选中后会变成灰色
- 这里只展示了Point默认开放的端口的连接,实际上用这种方式连接Point甚至可以在Pin Slot没有完全开放的情况下进行进行互联,互联后会默认开放未开放的Pin Slot,因为端口是具有优先级的,在进行这种操作要特别注意
- 另外还有一个ralation mark选项是用于定义结构层级的,具体的使用方法和应用未知
使用时间表对Point动作进行规划
预留
组态图形界面用于人机交互
Px视图基础
Niagara作为中间件,提供了一种组态的方式搭建GUI界面,Px是一种文件的格式,用来定义显示图像所需要的信息、控制参数和设计属性等。一个Px文件定义了Baja UI Widget以及这些Widget绑定数据的树形结构。在Px视图中可以使用任何类型的组件,包括Point甚至是Workbench的窗口也能加入其中。
可以制作什么界面?
- 标准web页面,支持html5,需要前端知识
- px页面,只需要掌握workbench的使用即可,但受限于niagara的组件功能,难以实现高度定制化需求
px视图创建流程
首先在station>File中创建一个PX文件
把想要添加的图片文件放入守护进程的station目录中(磁盘:\ProgramData\Niagara4.9\tridium\stations\station文件\shared)
通过鼠标拖拽的形式可以将想要的图片加入画布中,在右侧导航栏的widget tree中可以查看自己添加了哪些图片以及可以修改图片的一些简单属性
在PX layer中可以创建图层,要想将一张图片设为一个单独的图层,则需要在Px editor中的主视图界面双击一张图片,在layer选项中选择相应的图层名即可。
添加图片binding:双击图片点击properties中的label右边的第一个按钮,即Add Binding功能,比如添加value binding,该功能使图片随着组件(point)变化而变化,成功添加value binding后再properties界面中出现新的属性选项(原本只有label属性),点击ord在文件选择窗口选择component chooser选项即可进入组件选择视图,选择station文件中的想要绑定的点位(如布尔点),这样就完成了基本的关联。
如何让图片随着绑定的Point的状态变化而变化:这种功能一般需要两张图片,分别代表两个状态的图片,可以是静态的,也可以是动态的(gif),在properties页面中鼠标右击label属性中的Image选项会出现animate(动画)选项窗口,在此根据Point的不同状态设置不同的图片,设置完成后可在Px view界面右击设置过的图片选择set改变状态验证该功能。
在px editor界面鼠标右击New>Label可创建标签图块,可以拖动图块上的点调整图块的大小,也可双击该图块进行命名,名命有两种,一种是普通文本命名,在properties界面的label属性中直接在Text一栏填入即可,第二种是右击Text选择Animate可以使用BFormat语法进行命名(这种命名方式需要先设置相应的value binding)。随后可以添加value binding与station>config中的文件发生关联。
可以直接将左侧导航栏中的组件拖入Px editor进行设置,拖入组件后会出现一个名为Make Widget的窗口,如下图所示(手册Adding widgets using the Make Widget wizard)
![](E:\new desk\Niagara项目文档\文档图片\make widget.jpg)
该窗口用于创建Binding属性,这个窗口对于人机界面的制作是非常重要的,这里我们选择的是Random随机数将其拖入到Px editor后在make widget窗口选择Bound Label类型即可将该Point的可见属性显示在视图上如下图所示
![](E:\new desk\Niagara项目文档\文档图片\bound label创建.jpg)
![](E:\new desk\Niagara项目文档\文档图片\Make widget实例.jpg)
使用这种方法能够让系统自动创建一个BFormat命名的标签图块
一个组件或者Point能与多个binding类型进行绑定,例如在视图上创建一个布尔点与Action>set进行绑定如下所示
![](E:\new desk\Niagara项目文档\文档图片\action类型binding创建.jpg)
进行上述操作以后会出现这样的一个set按钮,在Px view界面可以鼠标左键点击该按钮进行状态切换
![](E:\new desk\Niagara项目文档\文档图片\set创建.jpg)
但是该点虽然具有Action binding属性但不具有value binding属性,所以无法将该点的状态显示在按钮上,我们可以在Px editor界面双击该点添加一个value binding属性
![](E:\new desk\Niagara项目文档\文档图片\添加新binding.jpg)
点击Animata后先选择类型
![](E:\new desk\Niagara项目文档\文档图片\1.jpg)
随后设定状态的显示文本
![](E:\new desk\Niagara项目文档\文档图片\2.jpg)
完成后可看见原本的set按钮变为了可显示状态的按钮,甚至还可以为不同的状态设定不同的颜色,如下所示
![](E:\new desk\Niagara项目文档\文档图片\3.jpg)
![](E:\new desk\Niagara项目文档\文档图片\4.png)
在Px editor界面的右侧栏有一个名为Bound Ords的窗口由于显示一个Px页面中所关联的组件或Point的路径,有时候一个交互界面可能会有上百个具有binding类型的项目,可以借助此工具栏快速管理它们。
可用的binding属性
- Action Binding
只有当组件或Point拥有类似Active的属性才可以配置,该功能可以在Px界面设定一个用于改变某种状态的触发按钮,Px页面的触发状态可以改变组件或者Ponit的触发状态。
- Bound Label binding
将值连接到绑定标签小部件。
- Field Editor binding
用于将字段编辑器组件绑定到对象。
Popup binding
用于在您可以指定和配置的附加“弹出”窗口中显示Px视图。
Setpoint binding
用于显示“设定点”的当前值,并提供对其进行修改的能力。
- Spectrum binding
用于为小部件的笔刷(颜色)属性设置动画。
Spectrum setpoint binding
与光谱conjunction绑定一起使用。
Table binding
用于在绑定表中绑定表数据。
Value binding
用于绑定到通常位于组件下的值。
测试
预留
软件界面发布
预留
用户权限管理
预留
附录
BFormat语法
手册Formats (BFormat)
BFormat default scripts
Baja Format(BFormat)是一个使用标准格式模式语言(脚本)返回对象字符串的类。BFormat脚本由一个或多个使用句点(.)运算符链接在一起的调用组成。BFormat语法要求每个脚本的开头和结尾都有一个百分比(%)字符。像通配符或变量一样,您可以在静态文本字符串中嵌入BFormat脚本。系统从声明格式的对象开始解析格式(执行嵌入脚本中包含的调用)。然后嵌入的调用(指令)动态解析为对象,系统将最终对象转换为字符串。
系统会使用默认的BFormat脚本填充某些组件的文本特性(从选项板复制或源自管理器视图)。其他文本属性默认为空。此表列出了具有默认脚本的组件的示例。
![](E:\new desk\Niagara项目文档\文档图片\屏幕截图 2023-08-28 124917.jpg)
Niagara 物联网技术基础应用(文章修复中,不定时更新)的更多相关文章
- 技术基础 | 在Apache Cassandra中改变VNodes数量的影响
Apache Cassandra中num_tokens的默认值在4.0版本中将会有变化!这看起来好像只是在CHANGES.txt文件中做了个小小的改动,但实际上这个改动将会对集群的日常运维有着深远的影 ...
- Niagara物联网框架机制二(笔记)
一.Niagara框架 1.一个Niagara 系统中有四种典型的Programs,这些程序间的关系及其网络通讯关系可通过下面的通讯图表解释 2. Niagara Programs station ...
- 新一代Java程序员必学的Docker容器化技术基础篇
Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...
- 【第1期】腾讯云的1001种玩法征集,Ipad mini和Kindle 等你拿!(文章评审中)
版权声明:本文由阁主的小跟班原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/695994001482226944 来源:腾云 ...
- JNI技术基础(2)——从零开始编写JNI代码
书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...
- JavaScript基础:数据类型的中的那些少见多怪
原文:JavaScript基础:数据类型的中的那些少见多怪 Javascript共有6种数据类型,其中包括3个基本数据类型(string,number,boolean).2个特殊数据类型(undefi ...
- AOP技术基础
1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...
- 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展
[Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...
- 《C#语言和数据库技术基础》单词必备
<C#语言和数据库技术基础> 第一章1..NET Framework 框架2.sharp 尖锐,强烈的3.application 应用程序4.devel ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
随机推荐
- [Go] Golang并发控制: WaitGroup 含义和常规用法
一个 WaitGroup 等待一个 goroutine 集合的结束. 主 goroutine 调用 Add 设置需要等待的 goroutine 数量. 接下来每个 goroutine 运行并在结束时调 ...
- Windows 查看端口是被什么程序占用
netstat -ano | grep 27017 tasklist | grep 11496 Link:https://www.cnblogs.com/farwish/p/15262813.html
- Python:Short Circuiting -- “OR”
Short Circuiting Operator Checks if: Evaluates from left to right up to: Example AND All values are ...
- dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目
本文来告诉大家一个黑科技,通过 .suo 文件读取 VisualStudio 的启动项目.在 sln 项目里面,都会生成对应的 suo 文件,这个文件是 OLE 格式的文件,文件的格式没有公开,本文的 ...
- 什么是IPD项目管理模式?聊聊IPD下的产品研发流程
IPD(集成产品开发)涵盖了产品从创意提出到研发.生产.运营等,包含了产品开发到营销运营的整个过程.围绕产品(或项目)生命周期的过程的管理模式,是一套生产流程,更是时下国际先进的管理体系.IPD(集成 ...
- 第8讲 browse命令的使用技巧
第8讲 browse命令的使用技巧 1.浏览所有parts,使用技巧 选中工程文件*.dsn/Edit/Browse/Parts.列出工程中用到的所有元件,方便在画完原理图后,查看哪些元件没有编号或数 ...
- 【股票爬虫教程】我用100行Python代码,爬了雪球网5000只股票,还发现一个网站bug!
目录 一.爬取目标 二.分析网页 三.爬虫代码 四.同步视频 五.get完整源码 一.爬取目标 您好,我是@马哥python说,今天继续分享爬虫案例. 爬取网站:雪球网的沪深股市行情数据 具体菜单:雪 ...
- 鸿蒙HarmonyOS实战-ArkUI事件(手势方法)
一.手势方法 应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式.手势操作可以包括点击.滑动.双击.捏合等动作,用于实现不同的功能和操作. HarmonyOS中常见的手势操作及其 ...
- 解决HtmlUnit执行JS报错提示ScriptException
问题描述 HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序. 但是,众所周知,HtmlUnit对JS脚本 ...
- ContextCapture-硬件配置推荐
ContextCapture倾斜摄影的空三计算.三维建模应用.非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间. 硬件常见问题 随着倾斜摄影建模算法成熟,应用越来越广泛,数据量越来越大,需 ...