From ab5ea49d6b2a5a99c85bb6b70622ca324b26e26c Mon Sep 17 00:00:00 2001 From: Candy Date: Sat, 25 Apr 2020 22:14:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=8D=9F=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E6=95=B0=E6=8D=AE=E5=AD=98=E5=82=A8=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cdy.Tag/His/DataFileSeriserbase.cs | 7 + Cdy.Tag/Interface/HisQueryResult.cs | 4 +- DBDevelopService/Database/DbManager.cs | 6 + DBHisData/HisQuery/DataFileManager.cs | 2 +- DBInRun/Program.cs | 16 +- DBStudio/DBInStudioServer.csproj | 15 + DBStudio/Program.cs | 500 +++++++++++++++++- DBStudio/Properties/Resources.Designer.cs | 108 ++++ DBStudio/Properties/Resources.resx | 135 +++++ DBStudio/Res.cs | 24 + .../Compress/Special/LosslessCompressUnit.cs | 39 +- .../His/Compress/Special/NoneCompressUnit.cs | 2 +- DataRunner/His/HisEnginer.cs | 16 +- DataRunner/His/Serise/LocalFileSeriser.cs | 17 + DataRunner/His/TimerMemoryCacheProcesser.cs | 2 +- .../His/ValueChangedMemoryCacheProcesser.cs | 2 +- HisDataTools/View/HisDataQueryView.xaml | 3 +- HisDataTools/ViewModel/HisDataQueryModel.cs | 9 + 18 files changed, 863 insertions(+), 44 deletions(-) create mode 100644 DBStudio/Properties/Resources.Designer.cs create mode 100644 DBStudio/Properties/Resources.resx create mode 100644 DBStudio/Res.cs diff --git a/Cdy.Tag/His/DataFileSeriserbase.cs b/Cdy.Tag/His/DataFileSeriserbase.cs index d927345..95f4c31 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 971dc13..13c2a7f 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 e44be8d..60dcabd 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 adcd799..af42805 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 12798ac..d2b41d1 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 57fe9f6..c9c3001 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 44ab037..35dc48b 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 0000000..67270d2 --- /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 0000000..1509a86 --- /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 0000000..3dba060 --- /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 a699dbc..e68f360 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 08ee433..f712f23 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 f2a5757..637cd2e 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 d599c5f..07769e7 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 80b1a56..414a76d 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 3c08290..4467913 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 8ee171c..9c4ec9e 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 a63a60e..f6ecddd 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"); + } + } + + /// /// /// -- GitLab