diff --git a/Cdy.Tag/His/DataFileSeriserbase.cs b/Cdy.Tag/His/DataFileSeriserbase.cs
index d9273457bdc8063010d59686274235de43e4501e..95f4c319b240b46760bd7c0ebd02d517ac8b6a60 100644
--- a/Cdy.Tag/His/DataFileSeriserbase.cs
+++ b/Cdy.Tag/His/DataFileSeriserbase.cs
@@ -66,6 +66,13 @@ namespace Cdy.Tag
///
public abstract bool OpenFile(string filename);
+ ///
+ ///
+ ///
+ ///
+ ///
+ public abstract bool OpenForReadOnly(string filename);
+
///
/// 检查是否存在
///
diff --git a/Cdy.Tag/Interface/HisQueryResult.cs b/Cdy.Tag/Interface/HisQueryResult.cs
index 971dc1387e6eb33e442a8d12a8007d54733252ce..13c2a7fdb721af8e31ae30fe8def147626652736 100644
--- a/Cdy.Tag/Interface/HisQueryResult.cs
+++ b/Cdy.Tag/Interface/HisQueryResult.cs
@@ -127,7 +127,7 @@ namespace Cdy.Tag
///
public void Add(T value,DateTime time,byte qulity)
{
- Add((bool)((object)value), time, qulity);
+ Add((object)value, time, qulity);
}
///
@@ -200,7 +200,7 @@ namespace Cdy.Tag
break;
}
MemoryHelper.WriteDateTime((void*)handle, mCount * 8 + mTimeAddr, time);
- Marshal.WriteByte(handle + mCount + mQulityAddr, (byte)value);
+ Marshal.WriteByte(handle + mCount + mQulityAddr, (byte)qulity);
// mDataBuffer[mCount + mQulityAddr] = qulity;
mCount++;
}
diff --git a/DBDevelopService/Database/DbManager.cs b/DBDevelopService/Database/DbManager.cs
index e44be8dae9035053b8d5505ffd1fe8ca88f35b08..60dcabd6226123dafe7219d35115b0579194b882 100644
--- a/DBDevelopService/Database/DbManager.cs
+++ b/DBDevelopService/Database/DbManager.cs
@@ -29,6 +29,11 @@ namespace DBDevelopService
#region ... Properties ...
+ ///
+ ///
+ ///
+ public bool IsLoaded { get; set; }
+
#endregion ...Properties...
#region ... Methods ...
@@ -55,6 +60,7 @@ namespace DBDevelopService
}
}
}
+ IsLoaded = true;
}
///
diff --git a/DBHisData/HisQuery/DataFileManager.cs b/DBHisData/HisQuery/DataFileManager.cs
index adcd79932bbc50bf37ebf6a553a66ec88b1fa3f4..af42805c6a19aa0e2f32e1510306dea71f2f14cf 100644
--- a/DBHisData/HisQuery/DataFileManager.cs
+++ b/DBHisData/HisQuery/DataFileManager.cs
@@ -223,7 +223,7 @@ namespace Cdy.Tag
{
List re = new List();
int id = Id / TagCountOneFile;
- if (mTimeFileMaps.ContainsKey(Id))
+ if (mTimeFileMaps.ContainsKey(id))
{
var nxtYear = new DateTime(startTime.Year+1, 1, 1);
if (nxtYear > startTime + span)
diff --git a/DBInRun/Program.cs b/DBInRun/Program.cs
index 12798ac28ed9f939e0553d7c166e3cc3acfdd7cc..d2b41d18540cdf6c0795930e52df2c7fa307a961 100644
--- a/DBInRun/Program.cs
+++ b/DBInRun/Program.cs
@@ -8,6 +8,7 @@ namespace DBInRun
{
static void Main(string[] args)
{
+ bool mIsClosed = false;
Console.WriteLine(Res.Get("WelcomeMsg"));
if (args.Length>0 && args[0]== "start")
{
@@ -22,7 +23,7 @@ namespace DBInRun
}
Console.WriteLine(Res.Get("HelpMsg"));
- while (true)
+ while (!mIsClosed)
{
Console.Write(">");
string[] cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
@@ -37,6 +38,7 @@ namespace DBInRun
{
Cdy.Tag.Runner.RunInstance.Stop();
}
+ mIsClosed = true;
break;
case "start":
if (cmd.Length > 1)
@@ -91,6 +93,7 @@ namespace DBInRun
private static string GetHelpString()
{
StringBuilder re = new StringBuilder();
+ re.AppendLine();
re.AppendLine("start [database] // "+Res.Get("StartMsg"));
re.AppendLine("stop // " + Res.Get("StopMsg"));
re.AppendLine("gd [databasename] [double tag count] [float tag count] [long tag count] [int tag count] [bool tag count] // "+Res.Get("GDMsg"));
@@ -141,36 +144,37 @@ namespace DBInRun
test.Append(new Cdy.Tag.BoolTag() { Name = "Bool" + i, Group = "Bool" });
}
+
Cdy.Tag.HisDatabase htest =db.HisDatabase;
int id = 0;
for (int i = 0; i < dcount; i++)
{
- htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Double, Circle = 1000,Type = Cdy.Tag.RecordType.Timer });
+ htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Double, Circle = 1000,Type = Cdy.Tag.RecordType.Timer,CompressType=0 });
id++;
}
for (int i = 0; i < fcount; i++)
{
- htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Float, Circle = 1000, Type = Cdy.Tag.RecordType.Timer });
+ htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Float, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
id++;
}
for (int i = 0; i < lcount; i++)
{
- htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Long, Circle = 1000, Type = Cdy.Tag.RecordType.Timer });
+ htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Long, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
id++;
}
for (int i = 0; i < icount; i++)
{
- htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Int, Circle = 1000, Type = Cdy.Tag.RecordType.Timer });
+ htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Int, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
id++;
}
for (int i = 0; i < bcount; i++)
{
- htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Bool, Circle = 1000, Type = Cdy.Tag.RecordType.Timer });
+ htest.AddHisTags(new Cdy.Tag.HisTag() { Id = id, TagType = Cdy.Tag.TagType.Bool, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
id++;
}
db.HisDatabase = htest;
diff --git a/DBStudio/DBInStudioServer.csproj b/DBStudio/DBInStudioServer.csproj
index 57fe9f623f02fd1477c9b0f36762c0dbfbddaee3..c9c30012e335fe79eba14db064dc29aa2f414b13 100644
--- a/DBStudio/DBInStudioServer.csproj
+++ b/DBStudio/DBInStudioServer.csproj
@@ -10,6 +10,21 @@
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
diff --git a/DBStudio/Program.cs b/DBStudio/Program.cs
index 44ab0375f91ff0b9f027794d6ea14aa39d68e5c3..35dc48b8bfaaabda0efe6bbc7cc824de8be9896f 100644
--- a/DBStudio/Program.cs
+++ b/DBStudio/Program.cs
@@ -1,4 +1,6 @@
-using System;
+using Cdy.Tag;
+using System;
+using System.Text;
namespace DBStudio
{
@@ -8,23 +10,28 @@ namespace DBStudio
{
int port = 5001;
int webPort = 9000;
- if(args.Length>0)
+ if (args.Length > 0)
{
port = int.Parse(args[0]);
}
- if(args.Length>1)
+ if (args.Length > 1)
{
webPort = int.Parse(args[1]);
}
DBDevelopService.Service.Instanse.Start(port, webPort);
Console.WriteLine("输入exit退出服务");
+ Console.WriteLine(Res.Get("HelpMsg"));
while (true)
{
+ Console.Write(">");
string[] cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (cmd.Length == 0) continue;
- if(cmd[0].ToLower()=="exit")
+
+ string cmsg = cmd[0].ToLower();
+
+ if (cmsg == "exit")
{
Console.WriteLine("确定要退出?输入y确定,输入其他任意字符取消");
cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
@@ -32,9 +39,494 @@ namespace DBStudio
if (cmd[0].ToLower() == "y")
break;
}
+ else if (cmsg == "db")
+ {
+ if (cmd.Length > 1)
+ ProcessDatabaseCreat(cmd[1]);
+ }
+ else if (cmsg == "h")
+ {
+ Console.WriteLine(GetHelpString());
+ }
}
DBDevelopService.Service.Instanse.Stop();
}
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void ProcessDatabaseCommand(Database db,string msg)
+ {
+ try
+ {
+ string[] cmd = msg.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+ string cmsg = cmd[0].ToLower();
+ if (cmsg == "save")
+ {
+ new DatabaseSerise() { Dbase = db }.Save();
+ }
+ else if (cmsg == "add")
+ {
+ AddTag(db, cmd[1].ToLower(), cmd[2], cmd[3], int.Parse(cmd[4]));
+ }
+ else if (cmsg == "remove")
+ {
+ RemoveTag(db, cmd[1].ToLower());
+ }
+ else if (cmsg == "update")
+ {
+ UpdateTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
+ }
+ else if (cmsg == "updatehis")
+ {
+ UpdateHisTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
+ }
+ else if (cmsg == "import")
+ {
+ Import(db, cmd[1].ToLower());
+ }
+ }
+ catch
+ {
+
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ private static void ProcessDatabaseCreat(string name)
+ {
+ if (!DBDevelopService.DbManager.Instance.IsLoaded)
+ DBDevelopService.DbManager.Instance.Load();
+
+ Database db = DBDevelopService.DbManager.Instance.GetDatabase(name);
+
+ if (db == null)
+ {
+ db = Database.New(name);
+ }
+
+ Console.WriteLine(Res.Get("HelpMsg"));
+ while (true)
+ {
+ Console.Write(name+">");
+ string[] cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+ if (cmd.Length == 0) continue;
+ string cmsg = cmd[0].ToLower();
+ try
+ {
+ if (cmsg == "save")
+ {
+ new DatabaseSerise() { Dbase = db }.Save();
+ }
+ else if (cmsg == "add")
+ {
+ AddTag(db, cmd[1].ToLower(), cmd[2], cmd[3], int.Parse(cmd[4]));
+ }
+ else if (cmsg == "remove")
+ {
+ RemoveTag(db, cmd[1].ToLower());
+ }
+ else if (cmsg == "update")
+ {
+ UpdateTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
+ }
+ else if (cmsg == "updatehis")
+ {
+ UpdateHisTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
+ }
+ else if (cmsg == "import")
+ {
+ Import(db, cmd[1].ToLower());
+ }
+ else if (cmsg == "list")
+ {
+ ListDatabase(db, cmd[1].ToLower());
+ }
+ else if (cmsg == "h")
+ {
+
+ }
+ else if (cmsg == "exit")
+ {
+ break;
+ }
+ }
+ catch
+ {
+ Console.Write(name + ">" + Res.Get("ErroParameter"));
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void ListDatabase(Database database, string type)
+ {
+ if(string.IsNullOrEmpty(type))
+ {
+
+ }
+ else
+ {
+
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void Import(Database database,string file)
+ {
+ string sfile = file;
+ if(!System.IO.Path.IsPathRooted(sfile))
+ {
+ sfile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(typeof(Program).Assembly.Location), sfile);
+ }
+ if(System.IO.File.Exists(sfile))
+ {
+ var reader = new System.IO.StreamReader(System.IO.File.Open(sfile, System.IO.FileMode.Open));
+ while(reader.Peek()>0)
+ {
+ var cmd = reader.ReadLine();
+ ProcessDatabaseCommand(database, cmd);
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void UpdateTag(Database database, string tag, string parameterName, string value)
+ {
+ var vv = database.RealDatabase.GetTagByName(tag);
+ if (vv != null)
+ {
+ UpdateTagParameter(vv, parameterName, value);
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void UpdateTagParameter(Tagbase tag, string parameterName, string value)
+ {
+ switch (parameterName)
+ {
+ case "linkaddress":
+ tag.LinkAddress = value;
+ break;
+ case "group":
+ tag.Group = value;
+ break;
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void UpdateHisTag(Database database, string tag,string parameterName,string value)
+ {
+ var vv = database.RealDatabase.GetTagByName(tag);
+ if (vv != null)
+ {
+ if (database.HisDatabase.HisTags.ContainsKey(vv.Id))
+ {
+ UpdateHisTagParameter(database.HisDatabase.HisTags[vv.Id], parameterName, value);
+ }
+ else
+ {
+ HisTag vtag = new HisTag() { Id = vv.Id, TagType = vv.Type };
+ database.HisDatabase.AddHisTags(vtag);
+ UpdateHisTagParameter(vtag, parameterName, value);
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void UpdateHisTagParameter(HisTag tag,string parameterName,string value)
+ {
+ switch(parameterName)
+ {
+ case "type":
+ tag.Type = (RecordType)(int.Parse(value));
+ break;
+ case "circle":
+ tag.Circle = long.Parse(value);
+ break;
+ case "compresstype":
+ tag.CompressType = int.Parse(value);
+ break;
+ case "parameters":
+ var vals = value.Split(new char[';']);
+ foreach(var vv in vals)
+ {
+ string[] sval = vv.Split(new char['=']);
+ tag.Parameters.Add(sval[0], double.Parse(sval[1]));
+ }
+ break;
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void RemoveTag(Database database, string tag)
+ {
+ var vv = database.RealDatabase.GetTagByName(tag);
+ if(vv!=null)
+ {
+ database.RealDatabase.Remove(vv.Id);
+ database.HisDatabase.RemoveHisTag(vv.Id);
+ }
+ }
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private static void AddTag(Database database ,string type,string tag,string link,int repeat)
+ {
+ if (type == "double")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.DoubleTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Double, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.DoubleTag() { Name = tag+j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Double, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "float")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.FloatTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Float, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.FloatTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Float, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "int")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.IntTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Int, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.IntTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Int, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "uint")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.UIntTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UInt, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.UIntTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UInt, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "long")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.LongTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Long, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.LongTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Long, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "ulong")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.ULongTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULong, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.ULongTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULong, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "short")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.ShortTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Short, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.ShortTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Short, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "ushort")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.UShortTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UShort, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.UShortTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UShort, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "bool")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.BoolTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Bool, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.BoolTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Bool, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "string")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.StringTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.StringTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ else if (type == "datetime")
+ {
+ if (repeat == 1)
+ {
+ var vtag = new Cdy.Tag.DateTimeTag() { Name = tag, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ else
+ {
+ for (int j = 0; j < repeat; j++)
+ {
+ var vtag = new Cdy.Tag.DateTimeTag() { Name = tag + j, LinkAddress = link };
+ database.RealDatabase.Append(vtag);
+ database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
+ }
+ }
+ }
+ }
+
+ private static string GetHelpString()
+ {
+ StringBuilder re = new StringBuilder();
+ re.AppendLine();
+ re.AppendLine("db [databasename] // " + Res.Get("GDMsg"));
+ re.AppendLine("exit // " + Res.Get("Exit"));
+ re.AppendLine("h // " + Res.Get("HMsg"));
+ return re.ToString();
+ }
}
}
+
diff --git a/DBStudio/Properties/Resources.Designer.cs b/DBStudio/Properties/Resources.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..67270d22a1d6c312c6c03d3b96b561d574d65cb8
--- /dev/null
+++ b/DBStudio/Properties/Resources.Designer.cs
@@ -0,0 +1,108 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace DBInStudioServer.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DBInStudioServer.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性
+ /// 重写当前线程的 CurrentUICulture 属性。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 查找类似 Invailed Parameter! 的本地化字符串。
+ ///
+ internal static string ErroParameter {
+ get {
+ return ResourceManager.GetString("ErroParameter", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 exit 的本地化字符串。
+ ///
+ internal static string Exit {
+ get {
+ return ResourceManager.GetString("Exit", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 manage a database 的本地化字符串。
+ ///
+ internal static string GDMsg {
+ get {
+ return ResourceManager.GetString("GDMsg", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 enter h for command help information 的本地化字符串。
+ ///
+ internal static string HelpMsg {
+ get {
+ return ResourceManager.GetString("HelpMsg", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 display command list 的本地化字符串。
+ ///
+ internal static string HMsg {
+ get {
+ return ResourceManager.GetString("HMsg", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/DBStudio/Properties/Resources.resx b/DBStudio/Properties/Resources.resx
new file mode 100644
index 0000000000000000000000000000000000000000..1509a86ed79e3b3787d555208adcf33d6e746d72
--- /dev/null
+++ b/DBStudio/Properties/Resources.resx
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Invailed Parameter!
+
+
+ exit
+
+
+ manage a database
+
+
+ enter h for command help information
+
+
+ display command list
+
+
\ No newline at end of file
diff --git a/DBStudio/Res.cs b/DBStudio/Res.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3dba06040953354a05c7355706540fff726f4d04
--- /dev/null
+++ b/DBStudio/Res.cs
@@ -0,0 +1,24 @@
+//==============================================================
+// Copyright (C) 2020 Inc. All rights reserved.
+//
+//==============================================================
+// Create by 种道洋 at 2020/3/29 11:05:05.
+// Version 1.0
+// 种道洋
+//==============================================================
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+
+namespace DBStudio
+{
+ public class Res
+ {
+ public static string Get(string name)
+ {
+ return DBInStudioServer.Properties.Resources.ResourceManager.GetString(name, Thread.CurrentThread.CurrentCulture);
+ }
+ }
+}
diff --git a/DataRunner/His/Compress/Special/LosslessCompressUnit.cs b/DataRunner/His/Compress/Special/LosslessCompressUnit.cs
index a699dbc34557f7cea10d2b09c14322b6a8609a7e..e68f36052543fad6227391355247914ae233a67c 100644
--- a/DataRunner/His/Compress/Special/LosslessCompressUnit.cs
+++ b/DataRunner/His/Compress/Special/LosslessCompressUnit.cs
@@ -55,33 +55,33 @@ namespace Cdy.Tag
///
public override long Compress(MarshalMemoryBlock source, long sourceAddr, MarshalMemoryBlock target, long targetAddr, long size)
{
- target.Write(this.StartTime);
+ target.WriteDatetime(targetAddr, this.StartTime);
switch (TagType)
{
case TagType.Bool:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr+8, size) + 8;
case TagType.Byte:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr+8, size) + 8;
case TagType.UShort:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.Short:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.UInt:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.Int:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.ULong:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.Long:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.Double:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.Float:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.String:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
case TagType.DateTime:
- return Compress(source, sourceAddr, target, targetAddr, size) + 8;
+ return Compress(source, sourceAddr, target, targetAddr + 8, size) + 8;
}
return 8;
}
@@ -97,9 +97,9 @@ namespace Cdy.Tag
int preids = 0;
mVarintMemory.Position = 0;
bool isFirst = true;
- for (int i = 1; i < timerVals.Count; i++)
+ for (int i = 0; i < timerVals.Count; i++)
{
- if (timerVals[i] > 0)
+ if (timerVals[i] > 0||i==0)
{
var id = timerVals[i];
if (isFirst)
@@ -556,7 +556,7 @@ namespace Cdy.Tag
//byte[] qus = null;
int rcount = count - emptys.Count;
- target.Write((ushort)rcount);
+ target.WriteUShort(targetAddr,(ushort)rcount);
rsize += 2;
target.Write((int)datas.Length);
target.Write(datas);
@@ -788,8 +788,9 @@ namespace Cdy.Tag
for (int i = 1; i < count; i++)
{
var ss = (ushort)memory.ReadInt32();
- re.Add((ushort)(preval + ss));
- preval = ss;
+ var val = (ushort)(preval + ss);
+ re.Add(val);
+ preval = val;
}
return re;
}
@@ -1049,7 +1050,7 @@ namespace Cdy.Tag
public virtual int DeCompressALlValue(MarshalMemoryBlock source, int sourceAddr, DateTime startTime, DateTime endTime, int timeTick, HisQueryResult result)
{
int count = 0;
- var timers = GetTimers(source, sourceAddr + 8, startTime, endTime, timeTick,out count);
+ var timers = GetTimers(source, sourceAddr, startTime, endTime, timeTick,out count);
var valuesize = source.ReadInt();
var value = DeCompressValue(source.ReadBytes(valuesize),count);
diff --git a/DataRunner/His/Compress/Special/NoneCompressUnit.cs b/DataRunner/His/Compress/Special/NoneCompressUnit.cs
index 08ee433a3b9fd0f0349830533c19569154f6ece1..f712f23c87710587404eceff92444e1248babac0 100644
--- a/DataRunner/His/Compress/Special/NoneCompressUnit.cs
+++ b/DataRunner/His/Compress/Special/NoneCompressUnit.cs
@@ -48,7 +48,7 @@ namespace Cdy.Tag
///
public override long Compress(MarshalMemoryBlock source, long sourceAddr, MarshalMemoryBlock target, long targetAddr, long size)
{
- target.Write(this.StartTime);
+ target.WriteDatetime(targetAddr,this.StartTime);
target.Write((ushort)(size - this.QulityOffset));//写入值的个数
if (size > 0)
source.CopyTo(target, sourceAddr, targetAddr + 10, size);
diff --git a/DataRunner/His/HisEnginer.cs b/DataRunner/His/HisEnginer.cs
index f2a575756e0db549231af32222c54b16ed2747c3..637cd2e7a4f8958f85e044a553d4b91ece0dc815 100644
--- a/DataRunner/His/HisEnginer.cs
+++ b/DataRunner/His/HisEnginer.cs
@@ -210,31 +210,31 @@ namespace Cdy.Tag
{
case Cdy.Tag.TagType.Bool:
case Cdy.Tag.TagType.Byte:
- mHisTag = new ByteHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new ByteHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr,CompressType = vv.Value.CompressType,Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.Short:
case Cdy.Tag.TagType.UShort:
- mHisTag = new ShortHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new ShortHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.Int:
case Cdy.Tag.TagType.UInt:
- mHisTag = new IntHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new IntHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.Long:
case Cdy.Tag.TagType.ULong:
- mHisTag = new LongHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr,RealMemoryPtr=realHandle, RealValueAddr = realaddr };
+ mHisTag = new LongHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr,RealMemoryPtr=realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.Float:
- mHisTag = new FloatHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new FloatHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.Double:
- mHisTag = new DoubleHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new DoubleHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.DateTime:
- mHisTag = new DateTimeHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new DateTimeHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
case Cdy.Tag.TagType.String:
- mHisTag = new StirngHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr };
+ mHisTag = new StirngHisRunTag() { Id = vv.Value.Id, Circle = vv.Value.Circle, Type = vv.Value.Type, TagType = vv.Value.TagType, RealMemoryAddr = realbaseaddr, RealMemoryPtr = realHandle, RealValueAddr = realaddr, CompressType = vv.Value.CompressType, Parameters = vv.Value.Parameters };
break;
}
mHisTag.MaxCount = count;
diff --git a/DataRunner/His/Serise/LocalFileSeriser.cs b/DataRunner/His/Serise/LocalFileSeriser.cs
index d599c5f06fc53f6bbdc8b64f7c08000b1edf3909..07769e78d6a4a57994898ba19d43b145c9cd1810 100644
--- a/DataRunner/His/Serise/LocalFileSeriser.cs
+++ b/DataRunner/His/Serise/LocalFileSeriser.cs
@@ -377,6 +377,21 @@ namespace Cdy.Tag
return false;
}
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override bool OpenForReadOnly(string filename)
+ {
+ if (System.IO.File.Exists(filename))
+ {
+ mStream = System.IO.File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+ return true;
+ }
+ return false;
+ }
+
///
///
///
@@ -485,5 +500,7 @@ namespace Cdy.Tag
//LoggerService.Service.Info("LocalFileSeriser", "写入文件耗时:" + sw.ElapsedMilliseconds + " 文件大小:" + len / 1024.0 / 1024.0);
return this;
}
+
+
}
}
diff --git a/DataRunner/His/TimerMemoryCacheProcesser.cs b/DataRunner/His/TimerMemoryCacheProcesser.cs
index 80b1a5645331b89ab049d2555dfebbe5b6c9a8a5..414a76dfee112a2a0aa7ff097192d8bb9a5642c4 100644
--- a/DataRunner/His/TimerMemoryCacheProcesser.cs
+++ b/DataRunner/His/TimerMemoryCacheProcesser.cs
@@ -126,7 +126,7 @@ namespace Cdy.Tag
public void Stop()
{
mIsClosed = true;
- closedEvent.WaitOne();
+ closedEvent.WaitOne(1000);
}
///
diff --git a/DataRunner/His/ValueChangedMemoryCacheProcesser.cs b/DataRunner/His/ValueChangedMemoryCacheProcesser.cs
index 3c08290d8341bfff79b05a91fc98b2958453d5d4..4467913809cfc9734e99e02eda1689737a9ad4ff 100644
--- a/DataRunner/His/ValueChangedMemoryCacheProcesser.cs
+++ b/DataRunner/His/ValueChangedMemoryCacheProcesser.cs
@@ -128,7 +128,7 @@ namespace Cdy.Tag
public void Stop()
{
mIsClosed = true;
- closedEvent.WaitOne();
+ closedEvent.WaitOne(1000);
}
///
diff --git a/HisDataTools/View/HisDataQueryView.xaml b/HisDataTools/View/HisDataQueryView.xaml
index 8ee171cb0f7938b8857bac7f8f3a7d6f0b8428d4..9c4ec9e379afbfff12fcbcfc993b1d96881a9f1a 100644
--- a/HisDataTools/View/HisDataQueryView.xaml
+++ b/HisDataTools/View/HisDataQueryView.xaml
@@ -9,6 +9,7 @@
d:DesignHeight="450" d:DesignWidth="926">
+
@@ -61,7 +62,7 @@
-
+
diff --git a/HisDataTools/ViewModel/HisDataQueryModel.cs b/HisDataTools/ViewModel/HisDataQueryModel.cs
index a63a60e9cac9be7f46a053ec3289ce9253c5097f..f6ecddd52393b82e6a84e00f2fbdd094f0df3286 100644
--- a/HisDataTools/ViewModel/HisDataQueryModel.cs
+++ b/HisDataTools/ViewModel/HisDataQueryModel.cs
@@ -337,6 +337,15 @@ namespace HisDataTools.ViewModel
///
public DateTime DateTime { get; set; }
+ public string DateTimeString
+ {
+ get
+ {
+ return DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
+ }
+ }
+
+
///
///
///