• [开源]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();
    }
  • 相关阅读:
    忙碌进度条
    WPF异步调用WCF
    Oracle 数据类型及存储方式(二)
    C# 与Oracle Data Type Mappings
    【CEO来信】任正非寄语2010:开放、妥协与灰度
    数据库数据类型
    asccii 表
    SQlServer2008 表结构查询
    Oracle 数据类型及存储方式(六)
    应用特征备份
  • 原文地址:https://www.cnblogs.com/jayhust/p/5812747.html
Copyright © 2020-2023  润新知