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

Posted jayhust

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[开源]FreeSCADA的数据库存储方式(Archiver)探究[MySQL为例]相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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();
}

 

以上是关于[开源]FreeSCADA的数据库存储方式(Archiver)探究[MySQL为例]的主要内容,如果未能解决你的问题,请参考以下文章

block在arc中和mrc中的用法有啥区别

工控软件项目和文档整理

代理和 ARC,不兼容?

ads.ini 中的更改未反映在 arc 的连接存储库中

ARC 禁止合成具有未指定所有权或存储的财产

如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?