2

我问了一个关于这个主题的好书的问题

它没有得到很多回复,所以也许没有什么好书(虽然我觉得这很奇怪;我必须自己去亚马逊搜索)。

在没有书的情况下,也许有一个好的框架,一些好的 URL,或者只是一般的建议。

正如我在另一个问题中所问的:

我正在研究几个项目,它们都具有大致相同的功能。

一些仪器收集一些数据(或控制一些功能)。它们通过 Internet(以太网/wifi/GPRS/卫星)与数据库服务器进行通信,该数据库服务器存储测量结果并提供基于浏览器的查询数据、生成报告等方式(并且可能还允许控制远程设备)。

任何人都可以推荐一本好书,描述一种开发这种软件架构的方法,保持它的通用性,哪些工具,语言。测试方法等使用?

对于“书”,请替换为“框架、一些好的 URL 或只是一般性建议”。

这是一种非常常见的系统模式。谁能给点建议?

4

1 回答 1

2

我已经编写了一个完整的 SCADA 系统(不包括定制仪器硬件)。该系统被设计为通用的,以允许创建新的硬件模型、仪器和数据收集——它不像为单个公司/工厂编写的许多 SCADA 系统那样编写,而是为成千上万的公司/工厂在国际上使用

我是唯一的开发人员/设计师,一名管理人员监督和指导项目。这样做花了更长的时间,但它是可行的。我们查看了已经存在的其他 SCADA 特定系统/框架,并决定由于我们的单元是定制的,因此利用现有的开发框架和第 3 方组件从头开始编写系统会更容易、更灵活。回想起来,这对我们来说非常有效,因为我们有时间和技能,但这通常不是最佳解决方案,具体取决于您的业务/合同模型。

我不再在那家公司工作,但是,他们仍然只使用我的软件,我离开的条件很好。我很乐意回答您的任何一般性问题,并帮助您指明正确的方向。

系统架构

以下是系统组成的高级概述:

  • 具有通用输入以适应多种不同类型仪器(模拟、数字、压力、电流强度、浮子等)的定制蜂窝设备
  • 自定义格式的 UDP/TCP 数据包由单元通过蜂窝网络 (GPRS) 发送到我们的服务器 ( Windows Server 2003 R2)。定期发送信息用于报告,以及可在设备上或在线编程的可定制状态变化(通过蜂窝网络发送的配置)
  • 使用 TCP/UDP 侦听器的自定义多线程.NET应用程序,它抓取传入的数据包(每天数十万个),破译自定义标头,并将数据包路由到正确的数据库而无需进一步解释(某些客户端需要自己的独立系统)
  • 一个Microsoft SQL 2005数据库,充当整个系统的大脑。使用CLR 函数解释数据包并自动触发警报(如配置)、编译报告并保留完整历史记录
  • 通过拨打电话、发送 SMS 消息和发送电子邮件来处理警报的自定义.NET应用程序。电话逻辑由英特尔对话卡通过模拟线路使用录制的提示和文本到语音的组合来处理。
  • 3 个ASP.NET站点:
    • 面向客户的站点,允许他们管理其帐户/子用户、跟踪警报、配置单元和警报、图表数据、地图设备、导出报告等。
    • 允许向销售人员分发材料、跟踪单个设备、设备健康报告等的销售站点。
    • 允许创建客户帐户、配置/构建单元以及所有其他需要的管理功能的内部管理站点。
  • 还有一个定制的内部监控系统来验证系统的健康状况,并在必要时提醒技术人员出现问题,因为系统需要 24/7 正常运行时间。
  • 此外,我们创建了一个iOS 应用程序、一个移动站点和一个自定义 Web 服务/客户端 ( API ),以允许客户直接检索客户数据,从而允许他们将我们的解决方案与他们现有的(通常是自定义的) SCADA 系统集成。

这些是我们使用的组件并且它们有效。再做一次,我会改变一些事情。我会使用Windows Server 2008 R2SQL 2008 R2,而不是 Dialogic 卡,我会使用 Microsoft TellMe和 VoIP。我也会使用Silverlight而不是 ASP.NET。我真的很喜欢 ASP.NET,但 Silverlight 可以提供更好的演示,并且可以根据需要在浏览器之外使用 - 这是 SCADA 操作员的常见请求。

这些站点都使用了第 3 方组件,因此不必从头开始编写图表和表格。有一些 SCADA 特定组件(主要基于 Java)。然而,我们发现它们中的大多数都是粗糙的、丑陋的,或者太具体而无法在我们的通用系统中使用(也很昂贵!定制仪表/图表包以“制作”我们自己的更容易和更灵活)

如前所述,系统的大脑是数据库。之所以这样做,是因为 Microsoft SQL 是一款非常棒且支持良好的产品,专为超长正常运行时间而设计,具有出色的备份和性能选项。.NET CLR 集成也给我们留下了深刻的印象,它可以让我们的自定义 .NET 代码作为该过程的一部分运行。我们支持的单元有多种型号,可以配置为使用任何仪器组合,因此保持数据库的灵活性是关键。 我们使用了很多标准化!

真正有用的一件事是在值仍然是默认值时使用递归 CTE来伪造数据的存在。我们这样做是为了节省数据库中的空间,但这也使我们能够在数据库中引入一个抽象层,使查询也变得灵活。

我们过去曾与 OPC 混过,但发现它太不灵活、太难、太烦人了,无法满足我们的需求。不过那是几年前的事了,从那以后我就再也没有看过它。

这是对您的问题的一个很长且非常笼统的答案。由于该信息是该公司的财产,因此我无法为您提供具体的代码或非常详细的信息,但我可以回答一些设计问题并为您指出我们认为有用的框架/工具。我的主要建议是将所有内容分解为单独的组件并在每个组件上使用黑盒模型,以便可以根据需要更换/改进各个组件。否则,该项目的范围似乎势不可挡。如果您有其他问题或想了解更多信息,请告诉我,祝您好运!

于 2011-01-06T14:38:22.307 回答