[转]FreeSCADA的数据库存储方式(Archiver)探究[MySQL为例]
原文链接 https://www.cnblogs.com/jayhust/p/5812747.html
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();
}
老师,FTSP6.3以上(也就是View…
牛人 谢谢您
坐等大佬D盘更新,祝大佬全家福寿安康
有公众号之类的吗,之前这个网站打不开了
[…] 关于使用Change…