[转]FreeSCADA的数据库存储方式(Archiver)探究[MySQL为例]

原文链接 https://www.cnblogs.com/jayhust/p/5812747.html

1.我们先新建一个FreeSCADA的工程实例,看下实际的存储效果:

a) 建立几个数据通道作为数据源(Communication菜单编辑,Channels Tree下显示):

clip_image001

b) 建立一个数据库存档(工具栏的Archiver Settings):

clip_image003

c) 定义数据库连接属性(Project菜单下的Database settings子菜单):

clip_image005

d) 编译项目,并运行,查看数据库存储结果:

clip_image007

2.存储过程探究(FreeSCADA2解决方案下的Archiver工程):

我们主要分析Archiver工程下Archiver.cs文件内的的几个方法:

Start方法:

public bool Start()

{

dbWriter = new DbWriter();

if (dbWriter.Open() == false)

return false;

channelUpdaterThread = new Thread(new ParameterizedThreadStart(ChannelUpdaterThreadProc));

channelUpdaterThread.Start(this);

dbReader = new DbReader();

if (dbReader.Open() == false)

return false;

return IsRunning;

}

ChannelUpdaterThreadProc方法:

private static void ChannelUpdaterThreadProc(object obj)

{

ArchiverMain self = (ArchiverMain)obj;

try

{

for (; ; )

{

//System.Console.WriteLine("{0} ChannelUpdaterThreadProc: Start loop", System.DateTime.Now);

foreach (Rule rule in self.channelSettings.Rules)

{

if (rule.Enable)

{

foreach (BaseCondition cond in rule.Conditions)

cond.Process();

if (rule.Archive) // 判断是否需要将本规则下对应的各个数据通道数据存入数据库(通过判断是否使能了本项存储规则、并且存储规则对应的存储条件的参数:间隔时间是否已经到了)

self.dbWriter.WriteChannels(rule.Channels);

}

}

Thread.Sleep(100); // 线程休眠100ms。所以FreeSCADA的查询各个数据通道的间隔就是100ms。

}

}

catch (ThreadAbortException)

{

}

if (self.dbWriter != null)

self.dbWriter.Close();

}

Stop方法:

public void Stop()

{

if (channelUpdaterThread != null)

{

channelUpdaterThread.Abort();

channelUpdaterThread.Join();

channelUpdaterThread = null;

if (dbWriter != null)

dbWriter.Close();

}

if (dbReader != null)

dbReader.Close();

}

您可能还喜欢...

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据