SCADA 代表 监督控制和数据采集系统。SCADA系统是一种基于软件的应用程序,在工业制造领域,用于控制一系列硬件组件。此外,正如首字母缩略词所暗示的那样,SCADA系统将包含一个数据组件,该组件将向用户提供系统的历史概述。此类系统用于制造环境,以整合对多条生产线的控制,收集可操作的数据并推动业务决策,从而实现过程控制和改进。

SCADA系统通常会管理整个制造工厂或其中的大部分。SCADA系统的实施考虑到了特定的目标。为了更好地理解系统实施过程,以下是SCADA的主要任务:
SCADA系统的架构是通过直接连接到制造堆栈中的上下层来实现的。让我们检查每个组件以及它如何绑定到SCADA系统中。

仪表层
仪表层(Instrumentation)包含负责获取信息并直接控制过程的所有工厂车间设备。这包括光眼、温度探头、气动阀、变频驱动器、电机、流量计等。换句话说,直接发送或接收数字或模拟信号的每个设备都被视为驻留在该层内。这一层不会直接与SCADA通信。但是,SCADA系统从PLC接收信息,该PLC将与该层通信。
想象一下,同一台磨床能够出现故障。由于缺乏维护(低油位)、不可预见的故障(进料处堵塞)或操作员失误(安全门打开),它可能会停止。这些故障状态中的每一个都由直接在电气面板上的 LED 显示。由于我们有这些信息,我们可以选择将其添加到HMI中,为操作员提供更精细的反馈机制,从而消除固有故障。
PLC 和人机界面层
仪表层(Instrumentation)中的设备与 PLC 接口。PLC通过输入接收信息来了解过程的当前状态,并通过使用输出来做出决策和控制过程。人机界面(HMI)是一个本地屏幕,允许操作员观察过程的状态并控制某些部分。典型的HMI系统将显示系统的当前状态,与资产相关的警报以及用于进行调整的控制屏幕。HMI会将信息发送到PLC,反之亦然;它不会直接与检测交互。
SCADA层
SCADA系统将直接与制造车间的多个PLC通信。此外,许多SCADA系统要求控制系统工程师创建一个通信层,该通信层将在每个PLC中实例化,以便相应地传递数据。这一层中的一个重要基础设施是网络。尽管PLC和HMI层需要数据网络,但由于SCADA系统将消耗大量数据,因此会对工厂网络造成额外的压力。
除了地板人机界面之外,SCADA系统还能够提供HMI服务。主要区别在于,基于SCADA的HMI解决方案将联网到服务器,而PLC和HMI层的解决方案仅与本地PLC通信。SCADA系统将实施一个数据库来存储从工厂车间收集的数据。该数据库可能专用于系统或与上述层共享。通常,在可以改造MES系统的新安装期间,会将数据库集中到一个位置,并备份冗余。
制造执行系统层
制造执行系统层(MES)将收集有关制造过程的信息,并提供原材料到最终产品信息的高级概述。换句话说,该系统通常会根据生产的最终产品跟踪进入工厂的原材料数量和生产活动的结果。
这些系统包括几个各种类型的子系统。OEE,或整体设备效率,允许制造工厂跟踪制造车间设备的可靠性。此外,OEE被用作关键的制造指标,它将提供有关每种资产生产率的管理信息。MES系统用于制造,分销,供应链运营等。
企业资源规划层
企业资源规划层(ERP)系统扩展到制造设施之外。它们有助于向第三方跟踪资产、原材料和成品。这些可能包括供应商、供应商、配送中心等。这些系统的目标是提供操作流程的数据和问责制。ERP将创建必要的信息来管理运输,接收,运输,采购等。
SCADA系统通常是指操作的基础软件组件。但是,如上所述,SCADA系统将依赖于制造环境中的多个硬件组件。在本节中,我们将探讨这些组件及其在系统中的角色。

服务器基础结构
SCADA软件在位于设施内或云中的服务器上运行。该层的适当实现非常关键,并将影响SCADA系统捕获的数据的可靠性和准确性。服务器基础结构的正确实现将通过双冗余可靠,通过虚拟机进行扩展,并通过适当的网络基础结构正确联网。
网络
由于大量数据流向SCADA系统,因此需要正确建立网络基础设施才能实现最佳运行。此外,各种各样的工业网络协议使得在实践中难以建立这一点。就最佳实践而言,工业制造工厂在部署SCADA之前应具有已建立的网络。但是,这两种集成可以并行进行。为支持不断增长的SCADA系统而构建的网络将包括交换机冗余,路由表和VLAN,用于分段工厂以及冗余硬件,以消除故障点。
可视化和人机界面
SCADA系统将从制造车间收集数据,并通过专用的可视化介质提供数据。这些可能是整个楼层的专用人机界面(HMI),控制室内的计算机,Web界面和移动应用程序。无论使用何种媒介,数据的呈现在系统中都起着重要作用。因此,重要的是要了解谁将使用SCADA系统以及如何将此信息传送到这些设备。最简单的SCADA实施只会将数据提供给工厂管理层。
SCADA可以利用分布式拓扑来部署现场的HMI系统。换句话说,数据和控制系统将以节点的形式从服务器到地板应用程序提供服务。这种集成需要到目前为止提到的组件,并且由于通过这种分配所需的终端成本低,为制造工厂节省了大量成本。
可编程逻辑控制器
PLC是SCADA与之交互最多的设备;数据将在两者之间连续流动。因此,必须在两端创建强大的实现。从 PLC 向上发送的数据应该是准确的、缓冲的,并且在断开连接的情况下仍然可用。PLC端通常通过高效的代码满足这一要求,这些代码将在建立与SCADA数据库的连接之前将数据存储一段时间。
Sovit2D是一款功能强大的基于Web的可视化2D组态软件,采用标准HTML5技术,基于B/S架构进行开发,支持WEB端呈现,支持在浏览器端完成便捷的人机交互,简单的拖拽即可完成可视化页面的设计。可快速构建和部署可扩展的SCADA、HMI、仪表板或IIoT系统。使用Sovit2D组态编辑器,可以创建现代化、可视化、形象化的流程,来反映机器设备和实时数据的状态,为自动化工业工厂的控制仪表进行个性化设计。




类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or