zoukankan      html  css  js  c++  java
  • [开源]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();
    }
  • 相关阅读:
    subString用法
    [转]Apache Commons工具集简介
    MyEclipse发布项目更改项目名
    ubuntu下设置文件权限
    mysql数据库中实现内连接、左连接、右连接
    hibernate中onetomany实例一
    hibernate中manytoone实例一
    FireFox中使用ExtJs日期控件错误的解决方法
    Ext.ux.form.SearchField使用方法
    mysql kill操作
  • 原文地址:https://www.cnblogs.com/jayhust/p/5812747.html
Copyright © 2011-2022 走看看