开源Rapid SCADA系统底层数据文件的读写

本文旨在加强对Rapid SCADA整个系统理解,欢迎大家交流,qq交流群:696072800

翻译至:https://rapidscada.org/integration-with-rapid-scada/

强大的集成能力是Rapid SCADA多个出色功能之一,该集成解决方案是自动控制系统为了满足客户的定制需求而允许和第三方软件产品集成而设计。这篇文章描述了Rapid SCADA的current data, archive data,configuration data的数据结构,同时引导大家如何使用这些数据与Rapid SCADA系统集成。

在阅读本文章之前,建议大家先仔细阅读Rapid SCADA管理员手册
Rapid SCADA数据结构:
在Rapid SCADA 系统默认安装目录下有如下目录:
数据目录 默认位置 描述
当前数据 C:\SCADA\ArchiveDAT\Cur 当前输入通道的状态与数值
历史数据(min) C:\SCADA\ArchiveDAT\Min 输入通道的历史状态与历史数值
历史数据(min) C:\SCADA\ArchiveDAT\Hour 小时历史数据及状态
事件目录 C:\SCADA\ArchiveDAT\Events 事件与报警
参数配置目录 C:\SCADA\BaseDAT 正在工作的参数数据库的副本(对自动控制总体描述)
以上的数据存放使用特殊的Dat文件进行开发,该种格式的数据可以保证快速的读写并且保证软件的稳定,即使部分文档有错误。在一个Dat文件中,信息的存储可以由行列组成的表格。因此,对开发者来说操作Rapid SCADA的数据是很简单的。

数据的检索:
SCADA-Server根据系统配置管理当前及历史的数据,为应用程序提供存取信息功能,为了能能让你的软件和Rapid SCADA系统集成,可以使用ScadaData.dll读取Rapid SCADA数据并将其转换为实例对象,该库文件可以在安装目录下找到,你也可以GitHub上找到。

ScadaData.dll库文件使用.NET框架,使用c#语言编写,因此,为了让你的模块也系统集成,你需要使用.NET兼容的语言,使用Microsoft Visual Studio 2010或更高版本进行编译,编译时别忘了引用ScadaData.dll到你的项目中。
在ScadaData.dll中,我们有两个基本的方式让你的应用程序和Rapid SCADA进行数据交互:

第一种方式:直接文件存取

读取当前数据和历史数据:

当前实时数据和历史数据以DAT格式存储在快照表中,快照表一段时间中是输入通道的数据与状态的集合。
默认情况下,当前数据,历史数据,事件存储在C:\SCADA\ArchiveDAT目录下,当前数据以current.dat命名,历史数据以mYYMMDD.dat存储每分钟读取的数据,hYYMMDD.dat存储每小时读取的数据,每一个文件存储了一天的数据,其中YYMMDD代表年月日

为了存取包含快照表的DAT文件,我们设计了Scada.Data.SrezAdapter 这个类,
下面的例子示例从快照表文件中读取数据:

using Scada.Data;
SrezTableLight snapshotTable = new SrezTableLight();
SrezAdapter adapter = new SrezAdapter();
adapter.FileName = @“C:\SCADA\ArchiveDAT\Cur\current.dat”;
adapter.Fill(snapshotTable);

以上的例子使用SrezAdapter适配器的实例将快照表文件的数据填充到SrezTableLight对象中,SrezAdapter适配器支持将数据装载到数据表中。
DataTable是.NET对表的一种基本实现,在速度上DataTable明显慢于SrezTableLight,为了表达清晰你也可以使用DataTable。
为了快速处理某一输入通道的数据,我们设计了Trend类,该类可以将某一通道数据以图表方式显示出来。

如何将快照表的数据输出到控制台?


foreach (SrezTableLight.Srez snapshot in snapshotTable.SrezList.Values)
{
int cnlCnt = snapshot.CnlNums.Length;
Console.WriteLine(“Snapshot {0}, number of channels is {1}:”,
snapshot.DateTime, cnlCnt);
for (int i = 0; i < cnlCnt; i++)
{
Console.WriteLine(” Channel[{0}] = {1}, {2}”, snapshot.CnlNums[i],
snapshot.CnlData[i].Val, snapshot.CnlData[i].Stat);
}
}

读取事件:
从DAT文件中读取事件和读取其他快照方式类似,可使用EventAdapter 对象将数据读到EventTableLight 或者 DataTable 对象中,EventTableLight在性能上有明显优势,事件文件以eYYMMDD.dat命名,其中YYMMDD代表年月日。
下面演示如何读取及输出事件:
// 读取事件示例


EventTableLight eventTable = new EventTableLight();
EventAdapter adapter = new EventAdapter();
adapter.FileName = @“C:\SCADA\ArchiveDAT\Events\e150131.dat”;
adapter.Fill(eventTable);

// 事件的控制台输出


foreach (EventTableLight.Event ev in eventTable.AllEvents)
{
Console.WriteLine(“Number: {0}. Date & time: {1}. Channel: {2}”,
ev.Number, ev.DateTime, ev.CnlNum);
}

本文不涉及对当前及历史数据的写入操作,因为该功能由SCADA-Server负责,其他应用程序不应该直接改变数据文件,而是应该通过SCADA-server 以TCP方式进行交互。

读取配置数据库:

配置数据库可使用SCADA-Administrator应用程序进行编辑,当配置数据库数据变化时,当前正在工作参数的副本将被创建当按下适当的按钮时,该副本被用于其他Rapid SCADA应用,默认情况下,参数存储在C:\SCADA\BaseDAT目录下,该目录下的所有DAT文件都可以通过SCADA-Server查看。

我们设计了Scada.Data.BaseAdapter类用来将配置数据库表DAT文件数据读取到DataTable中,配置数据库表长度不能超过65535行

The example of reading the configuration database table:
下列实例用来读取配置数据库表


DataTable dataTable = new DataTable(“BaseTable”);
BaseAdapter adapter = new BaseAdapter();
adapter.FileName = @“C:\SCADA\BaseDAT\incnl.dat”;
adapter.Fill(dataTable, true);

DataTable详细描述可以参考MSDN

第二种方式: TCP

SCADA-Server支持TCP方式和其他应用程序之间交换数据,例如,SCADA-Communicator ,SCADA-Web,另外,可以使用TCP方式进行远程控制,然后控制命令会被传递到其他控制器。

可以通过配置使SCADA-Server在某个特定端口进行监听,其他的应用程序可以以客户端方式连接SCADA-Server。所用连接的客户端都保存可以在SCADA-Server 状态文件中。
客户端连接时必须提供用户名和命名才能有权请求及发送数据,用户名及密码咋配置文件中指定,用户必须和应用程序角色进行关联。
下面展示如何创建一个可以连接SCADA-Server并读取快照表的的对象:

using Scada.Client;
CommSettings settings = new CommSettings(“localhost”, 10000,
“ScadaServerCtrl”, “12345”, 10000);
ServerComm serverComm = new ServerComm(settings);
SrezTableLight snapshotTable = new SrezTableLight();
bool dataReceived = serverComm.ReceiveSrezTable(“current.dat”, snapshotTable);
serverComm.Close();
if (dataReceived)
Console.WriteLine(“Data received successfully”);
else
Console.WriteLine(“Error receiving data: ” + serverComm.ErrMsg);

以上例程中,为了和通过TCP 方式和SCADA-Server通讯,我们使用Scada.Client.ServerComm类,连接配置信息保存在CommSettings对象中,关于接收到的数据存放在SrezTableLight,数据如何处理不再赘述。

The most useful methods of ServerComm class needed for integration with Rapid SCADA are listed in the following table.
ServerComm类提供了很多实用的方法,下面我把它们列在下面:
方法名 名称
ReceiveBaseTable 接收配置数据库表
ReceiveSrezTable 接收读取快照数据库表
ReceiveTrend Receives a trend of input channel from SCADA-Server
ReceiveEventTable Receives an event table from SCADA-Server
ReceiveFileAge Receives a file’s modification date and time from SCADA-Server
SendStandardCommand Sends a standard command to SCADA-Server
SendBinaryCommand Sends a binary command to SCADA-Server
SendRequestCommand Sends a command of extra request a device to SCADA-Server
ReceiveCommand Receives a command from SCADA-Server
SendSrez Sends a snapshot of the current data to SCADA-Server
SendArchive Sends a snapshot of the archive data to SCADA-Server
SendEvent Sends an event to SCADA-Server
CheckEvent Sends a check event command to SCADA-Server
Close Finalizes interacting with SCADA-Server and releases resources

关于SCADA-Server 模块

SCADA-Server支持插件方式进行扩展,插件是以一定规则使用.NET语言编写的,为了和SCADA-Server内部区别,插件统一以logic为文件结尾。插件可以启动,停止,接收新的数据等。

插件的应用案例:
1, 当接收到数据时传送给第三方软件。
2, 对SCADA-Server接收到的数据进行更复杂的处理。
3, 当条件满足时执行预先定义好的命令
以上开发模块(插件),Microsoft Visual Studio 2010或更高版本是必须的,每个模块必须继承Scada.Server.Modules.ModView 和 Scada.Server.Modules.ModLogic.,ModView是用户界面,主要用于提示用户模块作用,ModLogic实现了具体的功能。

你可以从GitHub上下载模块实现的例程。

模块(插件)的类命名规则:
1,文件必须以Mod作为前缀,例如,ModTest.dll.
2,引用ModView ,ModLogic类的命名空间是Scada.Server.Modules.
3,复制编译好的DLL文件到SCADA-Server模块目录.默认的位置 C:\SCADA\Server\Mod
Then open Modules page of SCADA-Server user interface, add module, save the settings and restart SCADA-Server service.
————————————————
版权声明:本文为CSDN博主「yikerdz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41904695/article/details/86680135

You May Also Like

About the Author: admin

2 Comments

  1. I blog quite often and I genuinely thank you for your content.
    The article has really peaked my interest. I’m going to book mark your blog
    and keep checking for new information about once
    per week. I subscribed to your Feed as well.

发表评论

邮箱地址不会被公开。 必填项已用*标注