精华内容
下载资源
问答
  • 原标题:【对话老宋】深入浅出OPC UA经典十问现在谈到智能制造...OPC UA究竟一种通讯协议标准还是一技术规范?如何能正确使用OPC UA技术?等等一系列问题并不能很清晰地认识和解答。今天,我们通过对话OPC U...

    原标题:【对话老宋】深入浅出OPC UA经典十五问

    现在谈到智能制造或者工业互联网的时候,总会提到OPC UA。很多人对OPC UA听的几乎耳朵起茧了,但是,对究竟什么是OPC UA?为什么会被工业4.0标准如此重视?各大自动化厂商为什么会纷纷追捧?OPC UA究竟是一种通讯协议标准还是一个技术规范?如何能正确使用OPC UA技术?等等一系列问题并不能很清晰地认识和解答。

    今天,我们通过对话OPC UA基金会(中国)技术顾问、贝加莱工业自动化(中国)有限公司技术传播经理宋华振来由浅入深谈谈OPC UA的问题,让你对OPC UA有一个全面的了解。

    对话人

    老石(石林才)

    CE China主编

    老宋(宋华振)

    贝加莱技术传播经理

    对话实录

    老石第一问

    我们现在经常听到或看到OPC UA,那么什么是OPC UA呢?是一项技术呢还是一项标准?

    老宋答

    OPC UA属于标准与规范范畴,具体是IEC62451,标准与规范通常的目的在于进行“统一协调”,并非是一种技术壁垒或者门槛,而是一种为了不同的厂商的网络应用层数据进行交互时有个统一规范,确保协同一致,其核心在“统一”,其实现在“集成”,比如OPC UA就是属于三个集成:

    (1).通信集成:把通信的Client/Server、Pub/Sub机制予以集成,即,把现有各种通信机制都予以支持,确保连接性;

    (2)对基础信息模型、垂直行业信息模型进行集成,这样可以降低在具体项目中的工程成本,避免编写大量的程序和各种驱动接口;

    (3)对信息安全机制进行集成,确保信息被安全的传送。

    在OPC UA的这几个集成中,都是对原有的技术进行了统一的规范和接口而已,并没有新的技术,但整体又是一个“创新”,构建了一个实现异构网络设备中的数据互操作的方案。

    老石第二问

    OPC UA主要是干什么用的?工业上为什么要有这个OPC UA呢?

    老宋答

    OPC UA的角色在于让工业设备使用统一的语言并实现语义互操作,通俗的说,就是希望大家在一起讲相同的语言,就像设备来自不同的国家,有说德语的、日语的、法语的、英语的、中文的,大家说的都是“你好!”,但是,相互却听不懂,OPC UA希望是的大家具有统一的语言,这个语言当然是“计算机”、“控制器”都能听懂的语言进行交互。要知道,计算机属于IT世界,控制器属于OT世界,他们两个人平时都是不同的语言表达方式、“术语”都不同,缩写都不一样,而且在OT和IT内部本身还有“方言”,也要统一到“普通话”这个水平,就是大家都实用某个语言的标准化版本。

    工业上需要OPC UA的原因在于“连接”,对于流程工业本身就是连续的生产,而对于离散制造业,也正在将不同设备连接起来,不仅是物理的连接,也包括信息、软件接口的连接,这样就需要统一的接口,就像阀门之间的连接需要统一规范一样。

    老石第三问

    以前听说过OPC,现在OPC UA是OPC的升级吗?它有什么特点呢?

    老宋答

    OPC是在1996年即推出的,主要是HMI/SCADA/DCS访问现场设备,OLE for Process Control,由其名字可知,OPC基于Windows的访问,后来OPC UA希望设计独立于平台,并且具有建模能力,从嵌入式系统到SCADA和ERP这些开放系统,以及安全、互操作方面的需求,同时利用原有的能力,在2006年推出OPC UA-即统一架构(Unified Architecture),OPC UA具有跨平台,支持SoA、信息建模等显著特点。在通信支持上,这些二进制、TCP都是跨平台运行能力的,信息模型更是使得用户更易于实现数据集成,而降低工程时间消耗。

    老石第四问

    说OPC UA是用来解决互联互通之后的互操作性,那它原理上怎么实现互操作性的呢?

    老宋答

    实现互操作就是采用了统一的标准与规范,所以,它的实现首先是一种“约定”,就是大家同意采用这样一个格式进行数据的标准书写,就像各种应用软件都会有“打印”这个功能,不管什么软件,打印这个功能就给了用户定义打印顺序、正反面、纸张尺寸、打印机的编号等信息,这些信息构建了一个“框架”,每个应用软件写“打印”功能的时候就直接在系统里添加打印这个软件组件,然后打印机也遵循这个“框架”设定自己的打印机对应的功能,那么这个应用软件和打印机之间的这个“框架”就是类似于OPC UA的角色,它给大家一个统一的框架,大家都按照这个框架,每个应用软件不管下面打印机是什么样的,就直接按打印就可以,而开发应用的工程师调用一个“打印”功能就可以很容易的开发这个功能而无需写很多程序,而这个语义互操作,实际上就是说,Power Point发了把PPT页面4张打印到1张A4纸上,正反面,每个打印机都知道它在说什么,然后选择纸盒、启动电机进行纸张的翻转、把四张PPT的信息微缩到一个A4页面上,这一系列的工作,都是由这些标准规范、语义描述来实现的。

    老石第五问

    OPC UA是应用层的协议,那是否意味着无论是那种工业以太网都可以支持OPC UA协议来传输数据呢?

    老宋答

    是的,其实这里必须说明一下,ISO/OSI的模型中的各个层级之间其实是相互独立的,即,OPC UA通常放在了应用层,而以太网仅指物理层(L1)与数据链路层(L2)的标准定义,因此OPC UA可以运行在各种总线、基于以太网的总线(如POWERLINK、Profinet、Ethernet/IP等),也可以运行在TSN这样的以太网标准之上。这就相当于你写了寄快递,你用一个手机端APP还是一个PC输入了地址、收件人、联系方式通过Wifi联网送入顺丰的服务器,这个服务器的物流调度则是由顺丰自己的中央物流分拣系统根据各个省市的需求、汽车/飞机的成本、时间消耗等综合出来的最佳路径,然后这些数据要分发给各个传输工具的司机,这种数据在用户端、调度系统、分拣中心、司机之间流动,都需要统一的格式和语义描述,包括目标地址、源地址、重量、货物尺寸规格、重量、类型(冷冻、易燃易爆都要有特殊的运输方式),而至于用什么方式运输,比如飞机、火车、公路交通,乃至末端的电动单车,这些都是属于通信的物理层介质问题,各个单元相互独立,却通过数据、协议、模型、语义来连接 。

    老石第六问

    目前在网络互联分OSI 7层模型,也有分5层的,但无论哪种都有应用层,那么和OPC UA一样属于应用层协议的还有哪些呢?他们之间是并列关系吗?

    老宋答

    传统的工业以太网应用层都是与OPC UA并列的,如CANopen、Profinet、Modbus都属于应用层协议,包FDT/DTM、DDS、MQTT都是处理“数据分发”的机制,并不包含信息模型的问题,或者像FDT/DTM主要偏向流程工业,而各个总线基金会他们的应用层都是属于私有的规约,由企业或企业联盟自行定义的,不能与其它的进行互操作,因此,还是需要OPC UA这个角色。

    老石第七问

    能否介绍一个典型的OPC UA的工业应用呢?构成这么一个应用需要哪些硬件或者软件的支持?

    老宋答

    再一次强调“独立性”,即,OPC UA本身与硬件软件是独立的关系,OPC UA在实现的时候对于Intel、ARM还是其它处理器硬件都没有关系,或者什么样的操作系统都没有特别大的关系,OPC UA的应用可以以贝加莱的mappVIEW作为场景,以OPC UA作为一个隔离层,让HMI和PLC程序实现隔离,进而相互不影响,程序与画面没有了绑定关系,另外,OPC UA为控制器提供了更为丰富多样的数据呈现方式,包括多点触摸支持、丰富的IT控件等,当然,显著的特点在于SCADA、MES等软件可以通过OPC UA访问各种现场不同厂商的控制器,第三种应用就是像EUROMAP 77这样采用OPC UA规范的行业信息模型,可以让注塑机和MES之间进行连接,EUROMAP 79使得注塑机与机器人之间可以进行信息连接。

    老石第八问

    OPC UA既然是解决互操作性,那是否是说OPC UA只是用于控制器以上的数据传输,控制器内部及往下的I/O,运动控制、传感器等就不需要用OPC UA?目前的状态是哪样的?

    老宋答

    OPC UA的目标要实现水平集成,就是指在各个机器上不同控制器之间的数据交互,垂直集成,从底层传感器到云端的集成,第三是端到端集成,就是制造单元与供应链、设计单元之间的集成,因此,OPC UA不仅仅是在数据上行,而是让数据以一种任意的方式在各个单元间流动,互相调用。当然,OPC UA是欠缺一定实时性的,这也是为什么要推进TSN的原因,即OPC UA over TSN,OPC UA来解决语义互操作,而TSN解决实时性问题,贝加莱目前的X20BC008T模块就是直接将传感器(I/O,模拟量)通过OPC UA over TSN的节点传输到上层系统。

    老石第九问

    现在经常看到OPC UA TSN,这是OPC UA over TSN的意思吗?那有没有OPC UA over其他工业以太网呢?比如OPC UA over ETHERCAT、OPC UA over ProfiNet、OPC UA over Powerlink、OPC UA over CC-Link等?

    老宋答

    OPC UA over TSN是一个标准的书写,当然其它公司也开发了Profinet@TSN, Ethernet/IP over TSN, CC-Link IE TSN等,这些都是为了保持原来的应用层,但是物理层和数据链路层采用TSN标准,但是,每家的控制器实际上都是会有OPC UA Sever的,通过总线是把数据采集到控制器,然后可以写入OPC UA Server,这实际上内部是一个转换,然后就统一可以被第三方上位系统访问了,任何技术实现都要考虑原有的投资安全,这是工业领域设计任何系统必须考虑的,未来可以直接由OPC UA over TSN,当然,这是一个过程。

    老石第十问

    那为什么说OPC UA over TSN可能会是未来的统一通信标准呢?

    老宋答

    我们讨论是否会由OPC UA over TSN统一,首先要问,产业有这个统一的需求吗?显然从IIoT、智能制造的角度来说,一个企业内部的多个系统单元的连接的确存在着语义互操作的需求,异构网络的多个厂商的系统有这个需求,其次,用户的需求是什么?用户的需求就是“统一”,接着的问题是由谁统一?答案是“开放”,谁更开放,更中立,因为任何一个用户都不希望被“私有”、“具体”的企业制定的标准与规范所约束,不仅在企业层面,在国家标准的层面来说,这也是不允许的。还有一个很重要的问题就是“生态系统”,即使是中立的标准规范,也必须有大量厂商支持才行,而这一点上OPC基金会有大量的会员,TSN目前也有大量的自动化和通信厂商的支持。

    结论就是统一是一种需求,而由谁统一在于谁更中立,更大的生态来决定的。

    老石第十一问

    目前OPC UA的全球和中国的标准制定情况如何?都有哪些知名厂商参与和支持?

    老宋答

    目前OPC UA的国际标准已经发布到了Part XIIII部分,OPC UA主要在IEC,基本上全球主流的厂商都参与了标准制定,国内的标准由ITEI,即SAC/TC124在组织,OPC UA目前国内的话,包括华为、和利时、优稳自动化、浙大中控等均已在其产品和系统集成了OPC UA。

    老石第十二问

    要开发一个支持OPC UA的PLC或者其他产品,需要增加哪些软硬件?需要通过什么认证或者一致性测试吗?

    老宋答

    OPC UA的话,需要进行测试验证,这个由OPC基金会合作的实验室,如国内在ITEI就有测试验证实验室。

    老石第十三问

    目前市场上支持OPC UA的产品多吗?主要集中在哪些产品类型?

    老宋答

    目前市场上欧美的主流控制器、SCADA、DCS、ERP都有了对OPC UA的支持。

    老石第十四问

    从目前来看,采用OPC UA会不会增加一个控制系统的成本?OPC UA应用普及过程中有哪些难点吗?

    老宋答

    OPC UA本身的优点在于占用较小的内存空间运行,大约在16kB,这个对于现在的控制器运行RTOS或基于Windows+RTOS的架构来说,并不会增加太多的CPU负荷,因此,如果纯粹从软硬件资源消耗角度看,不够成对OPC UA的普及障碍,但是,OPC UA意味着我们需要额外增加开发的工程师,对一个公司产品的软件开发要求比较高,至于对用户—这倒也不是问题,他们仅需配置参数即可,因此,主要的推广难点我想在于开发OPC UA本身的软件需要一定的工程师资源。

    老石第十五问

    请谈谈OPC UA会给我们今后的工业自动化或者数字化制造带来哪些变化?

    老宋答

    OPC UA带来的首要变化在于降低工程成本,其实,没有OPC UA也可以连接,只是会比较复杂,写大量程序,包括各个系统间写很多接口程序,在推进一个IIoT、数字孪生、智能制造等项目的时候会比较复杂,成本比较高,任何规范和技术的基础功能首先还是得能降低成本,如果不能做到这一点,就很难被推进。

    OPC UA赋予了未来更为灵活的控制系统、计算系统架构,使得真正是IT与OT的融合,因为,大家首先能够使得各自的数据代表什么?用什么结构进行了统一,使得数据真正意义实现“透明”,这很关键,因为,所有我们今天所期望的“智能时代”的愿景都必须基于“互联、互通、互操作”才能实现。

    它带来的变化就在于“实现你愿望”--这些过去这么多年里用户期待的,实现数据的连通,挖掘数据的价值,必须建立在一个可以互联的基础上。

    -END-

    发送“姓名+技术兴趣+城市”添加小编微信(cec_editor),审核后将邀请您加入相应技术群。返回搜狐,查看更多

    责任编辑:

    展开全文
  •  当前物联网进展中,从技术发展趋势呈现出智能化的特征,从管理应用发展趋势呈现标准化的特征。伴随着物联网的应用场景的拓展,会对企业的自动化、信息化进程产生重要的影响。在物联网的应用必然会产生海量数据,...

    物联网,即“万物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与互联网结合起来而形成的一个巨大网络,实现在任何时间、任何地点,人、机、物的互联互通。

      当前物联网进展中,从技术发展趋势呈现出智能化的特征,从管理应用发展趋势呈现标准化的特征。伴随着物联网的应用场景的拓展,会对企业的自动化、信息化进程产生重要的影响。在物联网的应用必然会产生海量数据,那么我们该如何有效的处理这些海量数据呢?

    17bc0006a45e1e5f5c66b576295aba24.png

      什么是数据处理?

      为了理解物联网传感器收集的大量数据,我们需要对其进行处理。换句话说,数据处理是对数据的采集、存储、检索、加工、变换和传输,目的是将原始数据转换为有用的信息。其中,数据是数字、符号、字母和各种文字的集合。数据处理的输出的是信息,并能以不同的形式呈现,例如纯文本文件、图表、电子表格或图像。

      数据处理过程通常遵循一个由三个基本阶段组成的循环:输入、处理和输出。

      输入:输入是数据处理周期的第一阶段,这是一个将收集到的数据转换成机器可读形式以便计算机处理的阶段。

      处理:在处理阶段,计算机将原始数据转换成信息。转换是通过使用不同的数据操作技术来执行的。

      输出:这是处理后的数据转换成人类可读形式并作为有用信息呈现给最终用户的阶段。

      那么,数据处理是如何工作的呢?

      数据处理的方法

      物联网的大规模应用会产生海量的数据,为了减轻系统的负荷,可以对数据的分级处理和降维处理。分级处理可以有效的减轻系统的负荷;降维处理可以有效的压缩数据量,是处理一些数据必须进行的步骤,并且已在大规模的图像处理算法中得到应用。

      数据的分级处理

      从信息处理的角度,物联网可以分为三个层次:

      1.底层是局部区域的协同感知。多个同类或异类的传感器办同感知被测目标,获得立体的丰富的感知数据,通过局部区域的信息处理和融合,能够获得高精度的、可靠的感知信息;2.第二层是传输过程中的数据处理。包括面向无线传输网络状态的感知信息的进一步聚合和融合处理,自适应传输链路状态的应用层编码和传送协议优化,以及数据的安全传输处理,使得海量信息能够高效的、可靠和安全的传输;3.第三层是应用支撑层上的基于各类物联网应用的共性支撑、服务决策、协调控制等。物联网的信息是超大规模的海量信息,需要利用感知信息具有的时间和空间的关联特性,实现不同空间区域上的多粒度的分级存储和检索,提高资源利用率和信息获取效率。提出一种基于多级数据处理的嵌人式中间件系统的解决方案,系统集合了数据过滤、数据聚合和数据处理等功能,可在一定程度上提高大型应用系统的整体效率。

      数据的降维处理

      随着信息技术的发展,特别是物联网技术的应用,人们将会不分时间和地点,可以方便的获得大量的信息,人们获得的数据量将以指数形式快速增长。这些数据具有快速更新、数据维数更高、非结构化等特点。

      目前人们对这些数据的处理还没有形成相应的有效方法,传统的数据分析方法在处理这些数据集合时,往往效果并不好,甚至在某些情况下失效。蕴含在数据中的知识和规律我们无法得知,将会导致数据灾难问题。因此,人们就迫切希望去认识和探索这些数据之间的奥秘。而如何能有效的利用这些高维数据是人们面临的基本问题。

      在很多情况下,我们可以首先将数据的维数将到一个合理的大小,同时尽可能多的保留原始的信息,然后再将降维处理后的数据送入信息处理系统。这样的做法是非常有用的。而降维算法也是一些机器学习、数据挖掘方法的组成部分。对数据降维处理,结合一些具体的业务需求,是一个行之有效对海量数据进行处理的方法。

      降维算法主要分为线性降维算法和非线性降维算法。降维的实质就是寻找投影变换:从高维空间到低维空间变换。现在有一种最小量嵌入算法,在保持局部等距和角度不变的约束条件下,就能很好的揭示数据内在的流形结构。

      数据处理的注意事项

      既然我们已经知道了数据的分级和降维处理,那么在物联网中涉及到这些问题时,有注意事项需要我们了解:

      期望的输出

      即使数据处理周期从输入阶段开始,我们也应该首先考虑想要的输出。换句话说,我们对什么样的信息感兴趣?一个示例是,在机器的温度超过阈值时接收警报。

      数据的存储

      一旦我们弄清楚想要的输出是什么,我们就必须找到一种方法来获得它。传感器收集的数据必须以适当的形式存储,以便将其转换为我们正在寻找的信息。

      例如,当机器运行时,我们可以定期(例如每10分钟)接收数据。我们可能希望利用这些数据来计算自上次维护以来机器已经运行了多少小时。我们还可以检测这些数据中的趋势,并对何时达到特定的小时数进行预估(如果使用量保持在相同的水平)。

      由于传感器收集的数据量可能很大,我们应该购买可扩展的云服务来存储数据。此外,我们还应该制定一个数据保留政策,以便定时清理不必要的数据。我们拥有的数据越多,保存的时间越长,存储数据的成本就越高。另一方面,更少的数据意味着更少的见解和历史参考。因此,我们必须在成本和想要存储的数据量之间进行优先级排序和平衡。

      更新频率

      在执行数据处理之前,重要的是要确定更新频率和资源消耗(如计算能力、功率)之间的良性平衡。“良性平衡”完全取决于物联网用例。

      在某些用例中,必须立即知道收集的数据是如何影响输出的,然而,这需要实时的数据处理,这可能非常消耗资源。在其他一些用例中,收集到的数据,每天处理一次就足够了。

      小结

      在物联网数据处理方面,我们正处于一个充满挑战的时刻,这个时刻充满了机遇,也充满了风险。通过收集、处理和分析物联网数据,消费者和组织可以获得有价值的见解,帮助他们成长并对未来做出更好的决策。

    来源:工业互联网前线

    展开全文
  • 不知道是哪部分出了问题。 文本文件 stu.txt bek 23 三年二班 sdk 23 四年八班 sa 23 年1班 d 21 六年3班 ds 23 一年1班</code></pre> 这方面的知识不够牢固,希望大神们稍微讲解一下,指点一下...
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。 答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型  建成三级结构的Internet;分为主干网、地区网和校园网;  形成多层次ISP结构的...
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型 建成三级结构的Internet;分为主干网、地区网和校园网; 形成多层次ISP结构的...
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。  答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型  建成三级结构的Internet;分为主干网、地区网和校园网;  形成多层次ISP结构的...
  • LOD地形设计(

    2008-01-22 20:58:00
    视截体计算机图形学的关键内容之一,涉及裁剪、...视截体类应该至少包含计算6面的函数,判断一正方体,球体,点是否在视截体内部的函数,平面法线标准化的函数,以及存储视截体各个面的系数的二维矩阵。下面

    视截体是计算机图形学的关键内容之一,涉及裁剪、投影等内容,视截体分为长方体和平头椎体两种,前者关乎平行投影,后者关乎透视投影。但不论是哪一种,视截体都有六个面,在上节内容中,我介绍了视截体6个面求解的数学推导,这一节实现视截体的实际编程。

    视截体类应该至少包含计算6个面的函数,判断一个正方体,球体,点是否在视截体内部的函数,平面法线标准化的函数,以及存储视截体各个面的系数的二维矩阵。

    下面是视截体类的简单定义:

    /*****************************************************************************************
    *    Copyright Reserved By QingeSoftware
    *    Author : QinGe
    *    Filename : Frustum.h 1.0
    *    Date: 2008-01-10
    ****************************************************************************************/

    #pragma once
    enum FrustumSide
    {
        RIGHT = 0,                 //Right side
        LEFT  = 1,                 //left side
        BOTTOM= 2,                 //top side
        TOP   = 3,                 // back side
        BACK  = 4,                 //back side
        FRONT = 5                 // front side
    };

    enum PlaneNormal
    {
        A = 0,                    // x value of normal ;
        B = 1,                    // y value of normal;
        C = 2,                    // z value of normal
        D = 3                    // distance of point to plane.
    }  ;
    class CFrustum
    {
    public:
        CFrustum(void);
        virtual ~CFrustum(void);
    public:
        void CalculateFrustum();                                                      //计算视截体的6个面。
        BOOL CubeInFrustum(float x, float y, float z, float size);     //判断一个正方体是否在视截体内
        void NormalizePlane(float Frustum[6][4],int side);               //把法线标准化
    private:
        float m_Frustum[6][4];                                                          //视截体6个面的方程

    };

     

    视截体类的实现文件:

    /*****************************************************************************************
    *    Copyright Reserved By QingeSoftware
    *    Author : QinGe
    *    Filename : Frustum.cpp 1.0
    *    Date: 2008-01-10
    ****************************************************************************************/

    #include "StdAfx.h"
    #include "Frustum.h"
    #include
    CFrustum::CFrustum(void)
    {

    }

    CFrustum::~CFrustum(void)
    {
    }

    void CFrustum::NormalizePlane(float Frustum[6][4],int side)
    {  

        //获取法线的模
        float manatude =sqrtf(Frustum[side][0]*Frustum[side][0]+   
                                           Frustum[side][1]*Frustum[side][1]+
                                           Frustum[side][2]*Frustum[side][2]);

        //单位化
        Frustum[side][0]/=manatude;
        Frustum[side][1]/=manatude;
        Frustum[side][2]/=manatude;
        Frustum[side][3]/=manatude;
    }

     

    //判断正方体是否在视截体内
    BOOL CFrustum::CubeInFrustum(float x, float y, float z, float size)
    {  
       //循环判断正方体的八个顶点是否全部在视截体一个面的后部
       //如果是,那么正方体肯定在视截体外部,返回FALSE;循环遍历六个面,如果找不到这样的面
       //则说明正方体至少有一个点在视截体内部。返回TRUE。
       for(int i = 0; i < 6; i++ )
        {
            if(m_Frustum[i][A] * (x - size) + m_Frustum[i][B] * (y - size) + m_Frustum[i][C] * (z - size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x + size) + m_Frustum[i][B] * (y - size) + m_Frustum[i][C] * (z - size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x - size) + m_Frustum[i][B] * (y + size) + m_Frustum[i][C] * (z - size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x + size) + m_Frustum[i][B] * (y + size) + m_Frustum[i][C] * (z - size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x - size) + m_Frustum[i][B] * (y - size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x + size) + m_Frustum[i][B] * (y - size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x - size) + m_Frustum[i][B] * (y + size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)
               continue;
            if(m_Frustum[i][A] * (x + size) + m_Frustum[i][B] * (y + size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)
               continue;

            // If we get here, it isn't in the frustum
            return false;
        }

        return true;

    }

    void CFrustum::CalculateFrustum()
    {
        /* 这部分是我自己写的,但是运行效率较低,请高手指教!
        float ModelView[4][4];
        float Projective[4][4];
        float Clip[4][4];

        glGetFloatv(GL_MODELVIEW_MATRIX,*(ModelView+0));
        glGetFloatv(GL_PROJECTION_MATRIX,*(Projective+0));

        for(int i=0; i<4; i++)                                  //M=模型矩阵A*投影矩阵B。
        {   
            for(int j=0;j<4; j++)
            {
                Clip[i][j]=0;
                for( int k=0; k<4; k++)
                {
                  Clip[i][j] += ModelView[i][k]*Projective[k][j];
                }
            }
        }
        //数学推导出来的东西,没什么好注释的。想说明白的话,注释肯定得比代码还多
        //建议看看3D数学。
        m_Frustum[RIGHT][0] = Clip[0][3] - Clip[0][0];
        m_Frustum[RIGHT][1] = Clip[1][3] - Clip[1][0];
        m_Frustum[RIGHT][2] = Clip[2][3] - Clip[2][0];
        m_Frustum[RIGHT][3] = Clip[3][3] - Clip[3][0];
        NormalPlane(m_Frustum,RIGHT);

        m_Frustum[LEFT][0] = Clip[0][3] + Clip[0][0];
        m_Frustum[LEFT][1] = Clip[1][3] + Clip[1][0];
        m_Frustum[LEFT][2] = Clip[2][3] + Clip[2][0];
        m_Frustum[LEFT][3] = Clip[3][3] + Clip[3][0];
        NormalPlane(m_Frustum,LEFT);

        m_Frustum[BOTTOM][0] = Clip[0][3] + Clip[0][1];
        m_Frustum[BOTTOM][1] = Clip[1][3] + Clip[1][1];
        m_Frustum[BOTTOM][2] = Clip[2][3] + Clip[2][1];
        m_Frustum[BOTTOM][3] = Clip[3][3] + Clip[3][1];
        NormalPlane(m_Frustum,BOTTOM);

        m_Frustum[TOP][0] = Clip[0][3] - Clip[0][1];
        m_Frustum[TOP][1] = Clip[1][3] - Clip[1][1];
        m_Frustum[TOP][2] = Clip[2][3] - Clip[2][1];
        m_Frustum[TOP][3] = Clip[3][3] - Clip[3][1];
        NormalPlane(m_Frustum,TOP);

        m_Frustum[BACK][0] = Clip[0][3] - Clip[0][2];
        m_Frustum[BACK][1] = Clip[1][3] - Clip[1][2];
        m_Frustum[BACK][2] = Clip[2][3] - Clip[2][2];
        m_Frustum[BACK][3] = Clip[3][3] - Clip[3][2];
        NormalPlane(m_Frustum,BACK);

        m_Frustum[FRONT][0] = Clip[0][3] + Clip[0][2];
        m_Frustum[FRONT][1] = Clip[1][3] + Clip[1][2];
        m_Frustum[FRONT][2] = Clip[2][3] + Clip[2][2];
        m_Frustum[FRONT][3] = Clip[3][3] + Clip[3][2];
        NormalPlane(m_Frustum,FRONT);

       
        */  自己写的部分到此结束,

     

     

     

       //由于自己写的部分运行效率较低,故下面采用书上的代码,效率明显提高!


        float   proj[16];                                // This will hold our projection matrix
        float   modl[16];                                // This will hold our modelview matrix
        float   clip[16];                                // This will hold the clipping planes

        //获得投影矩阵,模型变换矩阵
        glGetFloatv( GL_PROJECTION_MATRIX, proj );
        glGetFloatv( GL_MODELVIEW_MATRIX, modl );

        //利用前面两个矩阵得到世界变幻矩阵,利用该矩阵得到视截体6个面的系数
        //视截体平面的法向量都是指向视截体内部的
        clip[ 0] = modl[ 0] * proj[ 0] + modl[ 1] * proj[ 4] + modl[ 2] * proj[ 8] + modl[ 3] * proj[12];
        clip[ 1] = modl[ 0] * proj[ 1] + modl[ 1] * proj[ 5] + modl[ 2] * proj[ 9] + modl[ 3] * proj[13];
        clip[ 2] = modl[ 0] * proj[ 2] + modl[ 1] * proj[ 6] + modl[ 2] * proj[10] + modl[ 3] * proj[14];
        clip[ 3] = modl[ 0] * proj[ 3] + modl[ 1] * proj[ 7] + modl[ 2] * proj[11] + modl[ 3] * proj[15];

        clip[ 4] = modl[ 4] * proj[ 0] + modl[ 5] * proj[ 4] + modl[ 6] * proj[ 8] + modl[ 7] * proj[12];
        clip[ 5] = modl[ 4] * proj[ 1] + modl[ 5] * proj[ 5] + modl[ 6] * proj[ 9] + modl[ 7] * proj[13];
        clip[ 6] = modl[ 4] * proj[ 2] + modl[ 5] * proj[ 6] + modl[ 6] * proj[10] + modl[ 7] * proj[14];
        clip[ 7] = modl[ 4] * proj[ 3] + modl[ 5] * proj[ 7] + modl[ 6] * proj[11] + modl[ 7] * proj[15];

        clip[ 8] = modl[ 8] * proj[ 0] + modl[ 9] * proj[ 4] + modl[10] * proj[ 8] + modl[11] * proj[12];
        clip[ 9] = modl[ 8] * proj[ 1] + modl[ 9] * proj[ 5] + modl[10] * proj[ 9] + modl[11] * proj[13];
        clip[10] = modl[ 8] * proj[ 2] + modl[ 9] * proj[ 6] + modl[10] * proj[10] + modl[11] * proj[14];
        clip[11] = modl[ 8] * proj[ 3] + modl[ 9] * proj[ 7] + modl[10] * proj[11] + modl[11] * proj[15];

        clip[12] = modl[12] * proj[ 0] + modl[13] * proj[ 4] + modl[14] * proj[ 8] + modl[15] * proj[12];
        clip[13] = modl[12] * proj[ 1] + modl[13] * proj[ 5] + modl[14] * proj[ 9] + modl[15] * proj[13];
        clip[14] = modl[12] * proj[ 2] + modl[13] * proj[ 6] + modl[14] * proj[10] + modl[15] * proj[14];
        clip[15] = modl[12] * proj[ 3] + modl[13] * proj[ 7] + modl[14] * proj[11] + modl[15] * proj[15];
        // Now we actually want to get the sides of the frustum.  To do this we take
        // the clipping planes we received above and extract the sides from them.

        // This will extract the RIGHT side of the frustum
        m_Frustum[RIGHT][A] = clip[ 3] - clip[ 0];
        m_Frustum[RIGHT][B] = clip[ 7] - clip[ 4];
        m_Frustum[RIGHT][C] = clip[11] - clip[ 8];
        m_Frustum[RIGHT][D] = clip[15] - clip[12];

        // Now that we have a normal (A,B,C) and a distance (D) to the plane,
        // we want to normalize that normal and distance.

        // Normalize the RIGHT side
        NormalizePlane(m_Frustum, RIGHT);

        // This will extract the LEFT side of the frustum
        m_Frustum[LEFT][A] = clip[ 3] + clip[ 0];
        m_Frustum[LEFT][B] = clip[ 7] + clip[ 4];
        m_Frustum[LEFT][C] = clip[11] + clip[ 8];
        m_Frustum[LEFT][D] = clip[15] + clip[12];

        // Normalize the LEFT side
        NormalizePlane(m_Frustum, LEFT);

        // This will extract the BOTTOM side of the frustum
        m_Frustum[BOTTOM][A] = clip[ 3] + clip[ 1];
        m_Frustum[BOTTOM][B] = clip[ 7] + clip[ 5];
        m_Frustum[BOTTOM][C] = clip[11] + clip[ 9];
        m_Frustum[BOTTOM][D] = clip[15] + clip[13];

        // Normalize the BOTTOM side
        NormalizePlane(m_Frustum, BOTTOM);

        // This will extract the TOP side of the frustum
        m_Frustum[TOP][A] = clip[ 3] - clip[ 1];
        m_Frustum[TOP][B] = clip[ 7] - clip[ 5];
        m_Frustum[TOP][C] = clip[11] - clip[ 9];
        m_Frustum[TOP][D] = clip[15] - clip[13];

        // Normalize the TOP side
        NormalizePlane(m_Frustum, TOP);

        // This will extract the BACK side of the frustum
        m_Frustum[BACK][A] = clip[ 3] - clip[ 2];
        m_Frustum[BACK][B] = clip[ 7] - clip[ 6];
        m_Frustum[BACK][C] = clip[11] - clip[10];
        m_Frustum[BACK][D] = clip[15] - clip[14];

        // Normalize the BACK side
        NormalizePlane(m_Frustum, BACK);

        // This will extract the FRONT side of the frustum
        m_Frustum[FRONT][A] = clip[ 3] + clip[ 2];
        m_Frustum[FRONT][B] = clip[ 7] + clip[ 6];
        m_Frustum[FRONT][C] = clip[11] + clip[10];
        m_Frustum[FRONT][D] = clip[15] + clip[14];

        // Normalize the FRONT side
        NormalizePlane(m_Frustum, FRONT);
    }

    //可以加入判断别的形体是否在视截体内部的函数,在此仅举正方体的例子!

    展开全文
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。 答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型  建成三级结构的Internet;分为主干网、地区网和校园网;  形成多层次ISP结构的...
  • 绝对完整版的计算机网络(第版)的答案! 第一章 概述 1-01 计算机网络向用户可以提供那些服务? 答: 连通性和共享 1-02 简述分组交换的要点。 答:(1)报文分组,加首部 (2)经路由器储存转发 (3)在目的...
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。 答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型建成三级结构的Internet;分为主干网、地区网和校园网;形成多层次ISP结构的Internet...
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。 答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型  建成三级结构的Internet;分为主干网、地区网和校园网;  形成多层次ISP结构的...
  • 我们都知道CUDA提供了一种提供了一种提高并行计算应用性能的有效方法,...在这种情况下,我们就需要可视代码一部分耗时最长,NVIDIA在安装时,也附带了标准的CUDA安装,该工具称为Nvidia Visual Profiler,可以...

    我们都知道CUDA提供了一种提供了一种提高并行计算应用性能的有效方法,但是有时候会出现的一个问题是:即使我们使用了CUDA,即使用了代码并行操作,但是代码的时间消耗并没有有效减少,还有可能因为代码书写的原因导致运行时间更长,这是有可能的。

    在这种情况下,我们就需要可视化代码哪一部分耗时最长,NVIDIA在安装时,也附带了标准的CUDA安装,该工具称为Nvidia Visual Profiler,可以使用nvvp启动这个软件。

    nvvp
    

    在这里插入图片描述如果能够看到这个上述窗口,O(∩_∩)O哈哈~基本上也就是成功一半。

    然后选择file->New Session
    在这里插入图片描述
    在File位置选择对应的可执行文件,然后Next->Finish
    就在你以为胜利就在眼前的时候,会出现如下Warning:

    nvprof log: /home/felaim/nvvp_workspace/.metadata/.plugins/com.nvidia.viper/launch/0/nvprof_11779.log
    ==11779== Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device. See the following link for instructions to enable permissions and get more information: https://developer.nvidia.com/ERR_NVGPUCTRPERM 
    ==11779== Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.
    

    主要问题,提取出来,还是权限问题

    Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device.
    

    NVIDIA官网给出了解决方案:https://developer.nvidia.com/nvidia-development-tools-solutions-ERR_NVGPUCTRPERM-permission-issue-performance-counters#SolnAdminTag

    在这里插入图片描述
    在这里插入图片描述LZ按照官网可以尝试一下

    modprobe nvidia NVreg_RestrictProfilingToAdminUsers=0
    

    但是好像重新启动nvvp,并没有什么效果,第二方案,使用sudo权限:
    在这里插入图片描述
    出现了以下问题:

    command not found
    

    换句话说,问题可以总结成:执行sudo命令时command not found

    问题的原因: 在编译sudo包的时候默认开启了- -with-secure-path选项。

    方法1: 在/etc/sudoers文件内增加这么一行:Defaults secure_path=”/bin:/usr/bin:/usr/local/bin:…”, 把要用的命令path包括进去。

    方法2: 用命令的绝对路径。

    方法3: 使用sudo的env选项,像这样sudo env PATH=$PATH cmd.sh。

    方法4: 把脚本拷贝或链接到系统$PATH中。

    方法5: 重新编译sudo,不带–with-secure-path选项了.(终极解决办法)。

    LZ这边选择第二种,先看下效果!查找nvvp的绝对路径

    which nvvp
    

    在这里插入图片描述

    sudo /usr/local/cuda-10.1/bin//nvvp
    

    在这里插入图片描述具体各个参数什么含义,小伙伴们可以自己研究下。

    参考链接:

    1. https://blog.csdn.net/xueli1991/article/details/72818921

    PS:
    今天疫情情况,明天要破两万的节奏。。。
    在这里插入图片描述在这里插入图片描述
    昨天去了几个药店只买到10个口罩,分给妹妹家五个,还剩5个,但是看香港专家的预测,模型暂时还没收敛,还属于发散状态,只是希望这场疫情快点到达终点!

    武汉加油!湖北加油!中国加油!

    展开全文
  • 1-05 因特网的发展大致分为阶段?请指出这几阶段的主要特点。 答:从单个网络APPANET向互联网发展;TCP/IP协议的初步成型  建成三级结构的Internet;分为主干网、地区网和校园网;  形成多层次ISP结构的...
  • (3)具有统一的网络体系结构,遵循国际标准化协议的计算机网络:为了使不同体系结构的计算机网络都能互联,国际标准化组织ISO提出了一能使各种计算机在世界范围内互联成网的标准框架—开放 系统互连基本参考模型...
  • 计算机网络第版谢希仁答案

    千次下载 热门讨论 2010-03-29 22:51:59
     (2)建议标准(Proposed Standard) ——从这阶段开始就成为 RFC 文档。 (3)草案标准(Draft Standard) (4) 因特网标准(Internet Standard) 1-07小写和大写开头的英文名字 internet 和Internet在意思上有何...
  • 组织ISO 提出了一能使各种计算机在世界范围内互联成网的标准框架—开放系统互连基 本参考模型OSI.。这样,只要遵循OSI 标准,一系统就可以和位于世界上任何地方的、也 遵循同一标准的其他任何系统进行通信。 ...
  • 自OSI参考模型推出后,计算机网络一直沿着标准化的方向在发展,而网络标准化的最大体现Internet的飞速发展。Internet计算机网络最辉煌的成就,它已成为世界上最大的国际性计算机互联网,并已影响着人们生活的...
  • 组织ISO 提出了一能使各种计算机在世界范围内互联成网的标准框架—开放系统互连基 本参考模型OSI.。这样,只要遵循OSI 标准,一系统就可以和位于世界上任何地方的、也 遵循同一标准的其他任何系统进行通信。 ...
  • 第4章 字符串和格式输入/输出 4.1 前导程序 4.2 字符串简介 4.3 常量和C预处理器 4.4 研究和利用printf()和scanf() 4.5 关键概念 4.6 总结 4.7 复习题 4.8 编程练习 第5章 运算符、表达式和语句 5.1...
  • 只要安装最好的从发展上看,计算机将向着方向发展?()。 A.系统和应用B.网络和智能C.巨型一张软磁盘中已存有若下信息,当什么情况下,会使这些信息受到破坏()。 A.放在磁盘盒内半CAI表示为()。 A...
  • 1、网络协议分层按照分层的...各层间通过一接口在相邻层上下通信OSI七层模型和TCP/IP层模型的对比如下,我们现在用的是五层协议模型:2、PDU、封装和解封装PDU(protocol data unit):每一层使用自己层的协议...
  • 1、网络协议分层按照分层的...各层间通过一接口在相邻层上下通信OSI七层模型和TCP/IP层模型的对比如下,我们现在用的是五层协议模型:2、PDU、封装和解封装PDU(protocol data unit):每一层使用自己层的协议...
  •  (2)建议标准(Proposed Standard) ——从这阶段开始就成为 RFC 文档。 (3)草案标准(Draft Standard) (4) 因特网标准(Internet Standard) 1-07小写和大写开头的英文名字 internet 和Internet在意思上有何...
  • 第3到15章介绍了C语言的相关知识,包括数据类型、格式输入输出、运算符、表达式、流程控制语句、函数、数组和指针、字符串操作、内存管理、位操作等等,知识内容都针对C99标准;另外,第10章强化了对指针的讨论,...
  • 第3到15章介绍了C语言的相关知识,包括数据类型、格式输入输出、运算符、表达式、流程控制语句、函数、数组和指针、字符串操作、内存管理、位操作等等,知识内容都针对C99标准;另外,第10章强化了对指针的讨论,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 149
精华内容 59
关键字:

五个标准化是哪五个