提交 c06d7dd8 编写于 作者: cdy816's avatar cdy816

修复文件存储在跨时间段时出现错误

上级 6a0c8c42
此差异已折叠。
......@@ -1470,7 +1470,7 @@ namespace Cdy.Tag
using (var stream = System.IO.File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
byte[] bvals = new byte[1024];
for (long i = 0; i < memory.Position / 1024; i++)
for (long i = 0; i < memory.Length / 1024; i++)
{
Marshal.Copy(new IntPtr(memory.Handles.ToInt64() + i * 1024), bvals, 0, 1024);
stream.Write(bvals, 0, 1024);
......@@ -1489,7 +1489,7 @@ namespace Cdy.Tag
byte[] bvals = new byte[1024];
long totalsize = memory.AllocSize;
long csize = 0;
for (long i = 0; i < memory.Position / 1024; i++)
for (long i = 0; i < memory.Length / 1024; i++)
{
Marshal.Copy(new IntPtr(memory.Handles.ToInt64() + i * 1024), bvals, 0, 1024);
int isize = (int)Math.Min(totalsize - csize, 1024);
......
......@@ -62,6 +62,11 @@ namespace Cdy.Tag
return Empty;
}
public override string ToString()
{
return X+","+Y;
}
}
/// <summary>
///
......@@ -84,6 +89,11 @@ namespace Cdy.Tag
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
public override string ToString()
{
return X + "," + Y+","+Z;
}
}
/// <summary>
......@@ -104,6 +114,11 @@ namespace Cdy.Tag
}
public uint X { get; set; }
public uint Y { get; set; }
public override string ToString()
{
return X + "," + Y;
}
}
/// <summary>
///
......@@ -126,6 +141,12 @@ namespace Cdy.Tag
public uint X { get; set; }
public uint Y { get; set; }
public uint Z { get; set; }
public override string ToString()
{
return X + "," + Y + "," + Z;
}
}
/// <summary>
......@@ -146,6 +167,11 @@ namespace Cdy.Tag
}
public long X { get; set; }
public long Y { get; set; }
public override string ToString()
{
return X + "," + Y;
}
}
/// <summary>
......@@ -169,6 +195,11 @@ namespace Cdy.Tag
public long X { get; set; }
public long Y { get; set; }
public long Z { get; set; }
public override string ToString()
{
return X + "," + Y + "," + Z;
}
}
/// <summary>
......@@ -189,6 +220,11 @@ namespace Cdy.Tag
}
public ulong X { get; set; }
public ulong Y { get; set; }
public override string ToString()
{
return X + "," + Y;
}
}
/// <summary>
......@@ -213,6 +249,11 @@ namespace Cdy.Tag
public ulong X { get; set; }
public ulong Y { get; set; }
public ulong Z { get; set; }
public override string ToString()
{
return X + "," + Y + "," + Z;
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Cdy.Tag\Cdy.Tag.csproj" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy &quot;$(TargetPath)&quot; &quot;$(SolutionDir)\Output&quot; /y&#xD;&#xA;if exist &quot;$(TargetDir)$(TargetName).XML&quot; copy &quot;$(TargetDir)$(TargetName).XML&quot; &quot;$(SolutionDir)\Output\Xml&quot; /y&#xD;&#xA;if exist &quot;$(TargetDir)$(TargetName).pdb&quot; copy &quot;$(TargetDir)$(TargetName).pdb&quot; &quot;$(SolutionDir)\Output&quot; /y&#xD;&#xA;copy &quot;$(TargetDir)Config\*.cfg&quot; &quot;$(SolutionDir)\Output\Config&quot; /y&#xD;&#xA;if exist &quot;$(TargetDir)zh-CN&quot; copy &quot;$(TargetDir)zh-CN\*.dll&quot; &quot;$(SolutionDir)\Output\zh-CN&quot; /y&#xD;&#xA;" />
</Target>
</Project>
//==============================================================
// Copyright (C) 2020 Inc. All rights reserved.
//
//==============================================================
// Create by 种道洋 at 2020/5/9 21:48:50.
// Version 1.0
// 种道洋
//==============================================================
using System;
using System.Collections.Generic;
using System.Text;
namespace Cdy.Tag
{
/// <summary>
///
/// </summary>
public interface IRuntimeSecurity
{
#region ... Variables ...
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
#endregion ...Properties...
#region ... Methods ...
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
bool CheckLogin(string id);
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
bool FreshUserId(string id);
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <param name="pass"></param>
/// <returns></returns>
string Login(string user, string pass);
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
bool Logout(string id);
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
string GetUserByLoginId(string id);
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
List<UserPermission> GetPermission(string user);
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
}
......@@ -45,6 +45,14 @@ namespace Cdy.Tag.Driver
/// <returns></returns>
object GetTagValueForProductor(int id);
/// <summary>
///
/// </summary>
/// <param name="group"></param>
/// <param name="values"></param>
/// <returns></returns>
bool SetTagByGroup(string group, params object[] values);
/// <summary>
///
/// </summary>
......
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Cdy.Tag.Common\Cdy.Tag.Common.csproj" />
</ItemGroup>
</Project>
//==============================================================
// Copyright (C) 2020 Inc. All rights reserved.
//
//==============================================================
// Create by 种道洋 at 2020/5/11 11:34:18.
// Version 1.0
// 种道洋
//==============================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
namespace Cdy.Tag
{
public class ServerProcessItem
{
#region ... Variables ...
private System.Net.Sockets.Socket mSocket;
private SocketBuffer mSendBuffer;
private SocketBuffer mReceiveBuffer;
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
/// <summary>
///
/// </summary>
/// <param name="socket"></param>
public ServerProcessItem(Socket socket)
{
mSocket = socket;
}
#endregion ...Constructor...
#region ... Properties ...
#endregion ...Properties...
#region ... Methods ...
private void Init()
{
mSendBuffer = new SocketBuffer(1024 * 10);
mReceiveBuffer = new SocketBuffer(1024 * 10);
}
/// <summary>
///
/// </summary>
public void Receive()
{
int count = mSocket.Receive(mReceiveBuffer.Buffers, mReceiveBuffer.ReceiveAddr, mSocket.Available, SocketFlags.None);
mReceiveBuffer.ReceiveAddr += count;
}
/// <summary>
///
/// </summary>
public void Send()
{
}
/// <summary>
///
/// </summary>
public void Close()
{
mSocket.Close();
}
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
}
//==============================================================
// Copyright (C) 2020 Inc. All rights reserved.
//
//==============================================================
// Create by 种道洋 at 2020/5/11 12:09:03.
// Version 1.0
// 种道洋
//==============================================================
using System;
using System.Collections.Generic;
using System.Text;
namespace Cdy.Tag
{
/// <summary>
///
/// </summary>
public class SocketBuffer:FixedMemoryBlock
{
#region ... Variables ...
private int mReceiveAddr = 0;
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
/// <summary>
///
/// </summary>
/// <param name="size"></param>
public SocketBuffer(int size):base(size)
{
}
#endregion ...Constructor...
#region ... Properties ...
/// <summary>
///
/// </summary>
public int ReceiveAddr
{
get { return mReceiveAddr; }
set
{
if (value > this.Length)
{
mReceiveAddr = (int)(value - Length);
}
else
{
mReceiveAddr = value;
}
}
}
/// <summary>
///
/// </summary>
public int SendAddr { get; set; }
#endregion ...Properties...
#region ... Methods ...
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
}
using System;
using System.Net;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
namespace Cdy.Tag
{
/// <summary>
///
/// </summary>
public class SocketServer
{
#region ... Variables ...
private string mIp;
private System.Net.Sockets.Socket mServerSocket;
private Dictionary<EndPoint, ServerProcessItem> mClients = new Dictionary<EndPoint, ServerProcessItem>();
private Thread mAcceptThread;
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
#endregion ...Properties...
#region ... Methods ...
/// <summary>
///
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
public void Start(string ip,int port)
{
mIp = ip;
StartInner(port);
}
/// <summary>
///
/// </summary>
public void Start(int port)
{
mIp = "0.0.0.0";
StartInner(port);
}
public void StartIpv6(string ip,int port)
{
mIp = ip;
StartInnerV6(port);
}
private void StartInner(int port)
{
mServerSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
mServerSocket.Bind(new IPEndPoint(IPAddress.Parse(mIp), port));
mServerSocket.Listen(1024);
StartScan();
}
/// <summary>
///
/// </summary>
/// <param name="port"></param>
private void StartInnerV6(int port)
{
mServerSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetworkV6, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
mServerSocket.Bind(new IPEndPoint(IPAddress.Parse(mIp), port));
mServerSocket.Listen(1024);
StartScan();
}
/// <summary>
///
/// </summary>
private void StartScan()
{
mAcceptThread = new Thread(AcceptThreadPro);
mAcceptThread.IsBackground = true;
mAcceptThread.Start();
}
/// <summary>
///
/// </summary>
private void AcceptThreadPro()
{
while(true)
{
var socket = mServerSocket.Accept();
mClients.Add(socket.RemoteEndPoint, new ServerProcessItem(socket));
}
}
/// <summary>
///
/// </summary>
public void Stop()
{
foreach(var vv in mClients)
{
vv.Value.Close();
}
mAcceptThread.Abort();
}
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
}
......@@ -790,13 +790,13 @@ namespace Cdy.Tag
re = MemoryHelper.ReadInt32((void*)handle, index * 4);
break;
case 5:
re = MemoryHelper.ReadInt32((void*)handle, index * 4);
re = MemoryHelper.ReadUInt32((void*)handle, index * 4);
break;
case 6:
re = MemoryHelper.ReadInt32((void*)handle, index * 8);
re = MemoryHelper.ReadInt64((void*)handle, index * 8);
break;
case 7:
re = MemoryHelper.ReadInt32((void*)handle, index * 8);
re = MemoryHelper.ReadUInt64((void*)handle, index * 8);
break;
case 8:
re = MemoryHelper.ReadFloat((void*)handle, index * 4);
......@@ -823,6 +823,32 @@ namespace Cdy.Tag
}
re = new string((char*)handle, pos+1, MemoryHelper.ReadByte((void*)handle, pos));
break;
case 12:
var x = MemoryHelper.ReadInt32((void*)handle, index * 8);
var y = MemoryHelper.ReadInt32((void*)handle, index * 8+4);
re = new IntPointData(x, y);
break;
case 13:
re = new UIntPointData(MemoryHelper.ReadUInt32((void*)handle, index * 8), MemoryHelper.ReadUInt32((void*)handle, index * 8 + 4));
break;
case 14:
re = new IntPoint3Data(MemoryHelper.ReadInt32((void*)handle, index * 12), MemoryHelper.ReadInt32((void*)handle, index * 12 + 4), MemoryHelper.ReadInt32((void*)handle, index * 12 + 8));
break;
case 15:
re = new UIntPoint3Data(MemoryHelper.ReadUInt32((void*)handle, index * 12), MemoryHelper.ReadUInt32((void*)handle, index * 12 + 4), MemoryHelper.ReadUInt32((void*)handle, index * 12 + 8));
break;
case 16:
re = new LongPointData(MemoryHelper.ReadInt64((void*)handle, index * 16), MemoryHelper.ReadInt64((void*)handle, index * 16 + 8));
break;
case 17:
re = new ULongPointData(MemoryHelper.ReadUInt64((void*)handle, index * 16), MemoryHelper.ReadUInt64((void*)handle, index * 16 + 8));
break;
case 18:
re = new LongPoint3Data(MemoryHelper.ReadInt64((void*)handle, index * 24), MemoryHelper.ReadInt64((void*)handle, index * 24 + 8), MemoryHelper.ReadInt64((void*)handle, index * 24 + 16));
break;
case 19:
re = new ULongPoint3Data(MemoryHelper.ReadUInt64((void*)handle, index * 24), MemoryHelper.ReadUInt64((void*)handle, index * 24 + 8), MemoryHelper.ReadUInt64((void*)handle, index * 24 + 16));
break;
}
time = MemoryHelper.ReadDateTime((void*)handle, index * 8 + mTimeAddr);
......@@ -905,28 +931,28 @@ namespace Cdy.Tag
case "string":
mDataType = 11;
return Const.StringSize;
case "IntPointdata":
case "intpointdata":
mDataType = 12;
return 8;
case "UIntPointdata":
case "uintpointdata":
mDataType = 13;
return 8;
case "IntPoint3data":
case "intpoint3data":
mDataType = 14;
return 12;
case "UIntPoint3data":
case "uintpoint3data":
mDataType = 15;
return 12;
case "LongPointdata":
case "longpointdata":
mDataType = 16;
return 16;
case "ULongPointdata":
case "ulongpointdata":
mDataType = 17;
return 16;
case "LongPoint3data":
case "longpoint3data":
mDataType = 18;
return 24;
case "ULongPoint3data":
case "ulongpoint3data":
mDataType = 19;
return 24;
}
......
......@@ -81,4 +81,35 @@ namespace Cdy.Tag
#endregion ...Interfaces...
}
public static class IValueConvertExtend
{
/// <summary>
///
/// </summary>
/// <param name="convert"></param>
/// <returns></returns>
public static string SeriseToString(this IValueConvert convert)
{
return convert.Name + ":" + convert.SaveToString();
}
/// <summary>
///
/// </summary>
/// <param name="convert"></param>
/// <returns></returns>
public static IValueConvert DeSeriseToValueConvert(this string convert)
{
string[] sval = convert.Split(new char[] { ':' });
var vtmp = ValueConvertManager.manager.GetConvert(sval[0]);
if (vtmp != null)
{
return vtmp.LoadFromString(convert.Replace(sval[0] + ":", ""));
}
return null;
}
}
}
......@@ -163,7 +163,7 @@ namespace Cdy.Tag
/// <summary>
/// 小数位数
/// </summary>
public byte Precision { get; set; } = 3;
public byte Precision { get; set; } = 6;
#endregion ...Properties...
#region ... Methods ...
......@@ -193,7 +193,7 @@ namespace Cdy.Tag
xe.SetAttributeValue("ReadWriteType", (int)tag.ReadWriteType);
if(tag.Conveter!=null)
{
xe.SetAttributeValue("Conveter", tag.Conveter+":"+ tag.Conveter.SaveToString());
xe.SetAttributeValue("Conveter", tag.Conveter.Name+":"+ tag.Conveter.SaveToString());
}
if(tag is NumberTagBase)
{
......
......@@ -73,6 +73,9 @@ namespace Cdy.Tag
return null;
}
#endregion ...Methods...
#region ... Interfaces ...
......
......@@ -33,7 +33,7 @@ namespace Cdy.Tag
public PermissionDocument()
{
var superPermission = new PermissionItem() { Name = "Super", SuperPermission = true, EnableWrite = true,Desc="Super Permission" };
var superPermission = new UserPermission() { Name = "Super", SuperPermission = true, EnableWrite = true,Desc="Super Permission" };
Permissions.Add(superPermission.Name, superPermission);
}
......@@ -44,7 +44,7 @@ namespace Cdy.Tag
/// <summary>
///
/// </summary>
public Dictionary<string, PermissionItem> Permissions { get; set; } = new Dictionary<string, PermissionItem>();
public Dictionary<string, UserPermission> Permissions { get; set; } = new Dictionary<string, UserPermission>();
......@@ -56,7 +56,7 @@ namespace Cdy.Tag
///
/// </summary>
/// <param name="permission"></param>
public void Add(PermissionItem permission)
public void Add(UserPermission permission)
{
if(!Permissions.ContainsKey(permission.Name))
{
......
......@@ -147,7 +147,7 @@ namespace Cdy.Tag
public PermissionDocument LoadPermission(XElement element)
{
PermissionDocument re = new PermissionDocument();
re.Permissions = new Dictionary<string, PermissionItem>();
re.Permissions = new Dictionary<string, UserPermission>();
foreach(var vv in element.Elements())
{
var pp = LoadPermissionItem(vv);
......@@ -260,7 +260,7 @@ namespace Cdy.Tag
return xe;
}
private XElement Save(PermissionItem permission)
private XElement Save(UserPermission permission)
{
XElement re = new XElement("PermissionItem");
re.SetAttributeValue("Name", permission.Name);
......@@ -280,9 +280,9 @@ namespace Cdy.Tag
return re;
}
private PermissionItem LoadPermissionItem(XElement xe)
private UserPermission LoadPermissionItem(XElement xe)
{
PermissionItem re = new PermissionItem();
UserPermission re = new UserPermission();
if(xe.Attribute("Name") !=null)
{
re.Name = xe.Attribute("Name").Value;
......
......@@ -16,7 +16,7 @@ namespace Cdy.Tag
/// <summary>
///
/// </summary>
public class PermissionItem
public class UserPermission
{
/// <summary>
///
......
......@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Linq;
using Cdy.Tag;
namespace DBDevelopClientApi
{
......@@ -308,14 +309,14 @@ namespace DBDevelopClientApi
/// </summary>
/// <param name="database"></param>
/// <returns></returns>
public List<Cdy.Tag.PermissionItem> GetAllDatabasePermission(string database)
public List<Cdy.Tag.UserPermission> GetAllDatabasePermission(string database)
{
List<Cdy.Tag.PermissionItem> re = new List<Cdy.Tag.PermissionItem>();
List<Cdy.Tag.UserPermission> re = new List<Cdy.Tag.UserPermission>();
if (mCurrentClient != null && !string.IsNullOrEmpty(mLoginId))
{
foreach (var vv in mCurrentClient.GetAllDatabasePermission(new DBDevelopService.GetAllDatabasePermissionRequest() { Database = database, LoginId = mLoginId }).Permission)
{
Cdy.Tag.PermissionItem user = new Cdy.Tag.PermissionItem() { Name = vv.Name, Group = vv.Group.ToList(),Desc=vv.Desc,EnableWrite=vv.EnableWrite,SuperPermission=vv.SuperPermission };
Cdy.Tag.UserPermission user = new Cdy.Tag.UserPermission() { Name = vv.Name, Group = vv.Group.ToList(),Desc=vv.Desc,EnableWrite=vv.EnableWrite,SuperPermission=vv.SuperPermission };
re.Add(user);
}
}
......@@ -343,7 +344,7 @@ namespace DBDevelopClientApi
/// <param name="database"></param>
/// <param name="permission"></param>
/// <returns></returns>
public bool UpdateDatabasePermission(string database,Cdy.Tag.PermissionItem permission)
public bool UpdateDatabasePermission(string database,Cdy.Tag.UserPermission permission)
{
if (mCurrentClient != null && !string.IsNullOrEmpty(mLoginId))
{
......@@ -491,6 +492,18 @@ namespace DBDevelopClientApi
tag.Name = vv.Name;
tag.Desc = vv.Desc;
tag.Group = vv.Group;
tag.ReadWriteType = (Cdy.Tag.ReadWriteMode)vv.ReadWriteMode;
tag.Conveter = !string.IsNullOrEmpty(vv.Convert) ? vv.Convert.DeSeriseToValueConvert():null;
if (tag is Cdy.Tag.NumberTagBase)
{
(tag as Cdy.Tag.NumberTagBase).MaxValue = vv.MaxValue;
(tag as Cdy.Tag.NumberTagBase).MinValue = vv.MinValue;
}
if (tag is Cdy.Tag.FloatingTagBase)
{
(tag as Cdy.Tag.FloatingTagBase).Precision = (byte)vv.Precision;
}
mRealTag.Add(tag.Id, tag);
}
......@@ -558,6 +571,18 @@ namespace DBDevelopClientApi
tag.Name = vv.Name;
tag.Desc = vv.Desc;
tag.Group = vv.Group;
tag.ReadWriteType = (Cdy.Tag.ReadWriteMode)vv.ReadWriteMode;
tag.Conveter = !string.IsNullOrEmpty(vv.Convert) ? vv.Convert.DeSeriseToValueConvert() : null;
if (tag is Cdy.Tag.NumberTagBase)
{
(tag as Cdy.Tag.NumberTagBase).MaxValue = vv.MaxValue;
(tag as Cdy.Tag.NumberTagBase).MinValue = vv.MinValue;
}
if (tag is Cdy.Tag.FloatingTagBase)
{
(tag as Cdy.Tag.FloatingTagBase).Precision = (byte)vv.Precision;
}
mRealTag.Add(tag.Id, tag);
}
......@@ -628,6 +653,18 @@ namespace DBDevelopClientApi
tag.Name = vv.Name;
tag.Desc = vv.Desc;
tag.Group = vv.Group;
tag.ReadWriteType = (Cdy.Tag.ReadWriteMode)vv.ReadWriteMode;
tag.Conveter = !string.IsNullOrEmpty(vv.Convert) ? vv.Convert.DeSeriseToValueConvert() : null;
if (tag is Cdy.Tag.NumberTagBase)
{
(tag as Cdy.Tag.NumberTagBase).MaxValue = vv.MaxValue;
(tag as Cdy.Tag.NumberTagBase).MinValue = vv.MinValue;
}
if (tag is Cdy.Tag.FloatingTagBase)
{
(tag as Cdy.Tag.FloatingTagBase).Precision = (byte)vv.Precision;
}
mRealTag.Add(tag.Id, tag);
}
......@@ -788,6 +825,18 @@ namespace DBDevelopClientApi
re.TagType = (uint)tag.Type;
re.Group = tag.Group;
re.Desc = tag.Desc;
re.Convert = tag.Conveter != null ? tag.Conveter.SeriseToString() : string.Empty;
re.ReadWriteMode = (int)tag.ReadWriteType;
if(tag is NumberTagBase)
{
re.MaxValue = (tag as NumberTagBase).MaxValue;
re.MinValue = (tag as NumberTagBase).MinValue;
}
if (tag is FloatingTagBase)
{
re.Precision = (tag as FloatingTagBase).Precision;
}
return re;
}
......
......@@ -505,6 +505,11 @@ message RealTagMessage
string Group = 4;
string Desc = 5;
string LinkAddress = 6;
string Convert=7;
int32 ReadWriteMode=8;
double MaxValue=9;
double MinValue=10;
int32 Precision=11;
}
//历史变量定义
......
......@@ -505,6 +505,11 @@ message RealTagMessage
string Group = 4;
string Desc = 5;
string LinkAddress = 6;
string Convert=7;
int32 ReadWriteMode=8;
double MaxValue=9;
double MinValue=10;
int32 Precision=11;
}
//历史变量定义
......
......@@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using Grpc.Core;
using Microsoft.Extensions.Logging;
using Cdy.Tag;
namespace DBDevelopService
{
public class DevelopServerService : DevelopServer.DevelopServerBase
......@@ -119,7 +119,7 @@ namespace DBDevelopService
var db = DbManager.Instance.GetDatabase(request.Database);
if (db != null)
{
var pers = new Cdy.Tag.PermissionItem() { Name = request.Permission.Name, Desc = request.Permission.Desc, EnableWrite = request.Permission.EnableWrite};
var pers = new Cdy.Tag.UserPermission() { Name = request.Permission.Name, Desc = request.Permission.Desc, EnableWrite = request.Permission.EnableWrite};
pers.Group.AddRange(request.Permission.Group);
db.Security.Permission.Add(pers);
}
......@@ -171,7 +171,7 @@ namespace DBDevelopService
}
else
{
var pp = new Cdy.Tag.PermissionItem() { Name = request.Permission.Name, Desc = request.Permission.Desc, EnableWrite = request.Permission.EnableWrite };
var pp = new Cdy.Tag.UserPermission() { Name = request.Permission.Name, Desc = request.Permission.Desc, EnableWrite = request.Permission.EnableWrite };
pp.Group.AddRange(request.Permission.Group);
db.Security.Permission.Add(pp);
}
......@@ -735,7 +735,7 @@ namespace DBDevelopService
{
if (cc >= from && cc < (from + PageCount))
{
rre.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc, Group = vv.Group, LinkAddress = vv.LinkAddress, TagType = (uint)vv.Type });
rre.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc, Group = vv.Group, LinkAddress = vv.LinkAddress, TagType = (uint)vv.Type, Convert = vv.Conveter != null ? vv.Conveter.SeriseToString() : string.Empty, ReadWriteMode = (int)vv.ReadWriteType, MaxValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MaxValue : 0, MinValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MinValue : 0, Precision = (vv is Cdy.Tag.FloatingTagBase) ? (vv as Cdy.Tag.FloatingTagBase).Precision : 0 });
if (db.HisDatabase.HisTags.ContainsKey(vv.Id))
{
......@@ -791,7 +791,7 @@ namespace DBDevelopService
{
if (cc >= from && cc < (from + PageCount))
{
rre.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc, Group = vv.Group, LinkAddress = vv.LinkAddress, TagType = (uint)vv.Type });
rre.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc, Group = vv.Group, LinkAddress = vv.LinkAddress, TagType = (uint)vv.Type, Convert = vv.Conveter != null ? vv.Conveter.SeriseToString() : string.Empty, ReadWriteMode = (int)vv.ReadWriteType, MaxValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MaxValue : 0, MinValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MinValue : 0, Precision = (vv is Cdy.Tag.FloatingTagBase) ? (vv as Cdy.Tag.FloatingTagBase).Precision : 0 });
if (db.HisDatabase.HisTags.ContainsKey(vv.Id))
{
......@@ -869,7 +869,7 @@ namespace DBDevelopService
{
foreach (var vv in db.RealDatabase.ListAllTags())
{
re.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc,Group = vv.Group, LinkAddress = vv.LinkAddress,TagType=(uint)vv.Type });
re.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc,Group = vv.Group, LinkAddress = vv.LinkAddress,TagType=(uint)vv.Type,Convert=vv.Conveter!=null?vv.Conveter.SeriseToString():string.Empty,ReadWriteMode=(int)vv.ReadWriteType,MaxValue=(vv is Cdy.Tag.NumberTagBase)?(vv as Cdy.Tag.NumberTagBase).MaxValue:0,MinValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MinValue:0, Precision = (vv is Cdy.Tag.FloatingTagBase) ? (vv as Cdy.Tag.FloatingTagBase).Precision:0 });
}
}
var msg = new GetRealTagMessageReply() { Result = true };
......@@ -982,7 +982,7 @@ namespace DBDevelopService
List<RealTagMessage> re = new List<RealTagMessage>();
foreach (var vv in htags)
{
re.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc, Group = vv.Group, LinkAddress = vv.LinkAddress, TagType = (uint)vv.Type });
re.Add(new RealTagMessage() { Id = (uint)vv.Id, Name = vv.Name, Desc = vv.Desc, Group = vv.Group, LinkAddress = vv.LinkAddress, TagType = (uint)vv.Type, Convert = vv.Conveter != null ? vv.Conveter.SeriseToString() : string.Empty, ReadWriteMode = (int)vv.ReadWriteType, MaxValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MaxValue : 0, MinValue = (vv is Cdy.Tag.NumberTagBase) ? (vv as Cdy.Tag.NumberTagBase).MinValue : 0, Precision = (vv is Cdy.Tag.FloatingTagBase) ? (vv as Cdy.Tag.FloatingTagBase).Precision : 0 });
}
var msg = new GetRealTagMessageReply() { Result = true };
msg.Messages.AddRange(re);
......@@ -1158,6 +1158,22 @@ namespace DBDevelopService
re.Group = tmsg.Group;
re.Desc = tmsg.Desc;
re.Id = (int)tmsg.Id;
re.ReadWriteType = (Cdy.Tag.ReadWriteMode)tmsg.ReadWriteMode;
if(!string.IsNullOrEmpty(tmsg.Convert))
{
re.Conveter = tmsg.Convert.DeSeriseToValueConvert();
}
if(re is Cdy.Tag.NumberTagBase)
{
(re as Cdy.Tag.NumberTagBase).MaxValue = tmsg.MaxValue;
(re as Cdy.Tag.NumberTagBase).MinValue = tmsg.MinValue;
}
if (re is Cdy.Tag.FloatingTagBase)
{
(re as Cdy.Tag.FloatingTagBase).Precision = (byte)tmsg.Precision;
}
}
return re;
......
......@@ -4,6 +4,7 @@ using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
namespace DBStudio
{
......@@ -36,7 +37,7 @@ namespace DBStudio
if (cmsg == "exit")
{
OutByLine("","确定要退出?输入y确定,输入其他任意字符取消");
OutByLine("", "确定要退出?输入y确定,输入其他任意字符取消");
cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (cmd.Length == 0) continue;
if (cmd[0].ToLower() == "y")
......@@ -53,7 +54,7 @@ namespace DBStudio
}
else if (cmsg == "h")
{
OutByLine("",GetHelpString());
OutByLine("", GetHelpString());
}
}
DBDevelopService.Service.Instanse.Stop();
......@@ -65,9 +66,9 @@ namespace DBStudio
/// </summary>
/// <param name="prechar"></param>
/// <param name="msg"></param>
private static void OutByLine(string prechar,string msg)
private static void OutByLine(string prechar, string msg)
{
Console.WriteLine(prechar+">" + msg);
Console.WriteLine(prechar + ">" + msg);
}
/// <summary>
......@@ -89,9 +90,9 @@ namespace DBStudio
DBDevelopService.DbManager.Instance.Load();
StringBuilder sb = new StringBuilder();
foreach(var vdd in DBDevelopService.DbManager.Instance.ListDatabase())
foreach (var vdd in DBDevelopService.DbManager.Instance.ListDatabase())
{
sb.Append(vdd+",");
sb.Append(vdd + ",");
}
sb.Length = sb.Length > 1 ? sb.Length - 1 : sb.Length;
OutByLine("", sb.ToString());
......@@ -102,7 +103,7 @@ namespace DBStudio
/// </summary>
/// <param name="db"></param>
/// <param name="msg"></param>
private static void ProcessDatabaseCommand(Database db,string msg)
private static void ProcessDatabaseCommand(Database db, string msg)
{
try
{
......@@ -135,7 +136,7 @@ namespace DBStudio
}
catch
{
}
}
......@@ -149,13 +150,13 @@ namespace DBStudio
DBDevelopService.DbManager.Instance.Load();
Database db = DBDevelopService.DbManager.Instance.GetDatabase(name);
if (db == null)
{
db = Database.New(name);
}
OutByLine(name,Res.Get("HelpMsg"));
OutByLine(name, Res.Get("HelpMsg"));
while (true)
{
OutInLine(name, "");
......@@ -184,6 +185,11 @@ namespace DBStudio
{
UpdateTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
}
else if (cmsg == "start")
{
StartDb(db.Name);
}
else if (cmsg == "updatehis")
{
UpdateHisTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
......@@ -199,11 +205,11 @@ namespace DBStudio
}
else if (cmsg == "export")
{
if(cmd.Length>1)
ExportToCSV(db, cmd[1].ToLower());
if (cmd.Length > 1)
ExportToCSV(db, cmd[1].ToLower());
else
{
ExportToCSV(db, name+".csv");
ExportToCSV(db, name + ".csv");
}
}
else if (cmsg == "list")
......@@ -213,11 +219,15 @@ namespace DBStudio
}
else if (cmsg == "h")
{
if(cmd.Length==1)
if (cmd.Length == 1)
{
Console.WriteLine(GetDbManagerHelpString());
}
}
else if (cmsg == "sp")
{
Sp(db, cmd.Skip(1).ToArray());
}
else if (cmsg == "exit")
{
break;
......@@ -225,7 +235,124 @@ namespace DBStudio
}
catch
{
OutByLine(name ,Res.Get("ErroParameter"));
OutByLine(name, Res.Get("ErroParameter"));
}
}
}
/// <summary>
///
/// </summary>
/// <param name="name"></param>
private static void StartDb(string name)
{
var info = new ProcessStartInfo() { FileName = "DbInRun.exe" };
info.UseShellExecute = true;
info.Arguments = "start "+name;
info.WorkingDirectory = System.IO.Path.GetDirectoryName(typeof(Program).Assembly.Location);
Process.Start(info);
}
/// <summary>
///
/// </summary>
/// <param name="db"></param>
/// <param name="paras"></param>
private static void Sp(Database db, params string[] paras)
{
Cdy.Tag.RealDatabase test = db.RealDatabase;
db.RealDatabase = test;
Cdy.Tag.HisDatabase htest = db.HisDatabase;
string address = "";
if (paras.Length > 0)
{
int dcount = int.Parse(paras[0]);
for (int i = 0; i < dcount; i++)
{
if (i % 3 == 0)
{
address = "Sim:sin";
}
else if (i % 3 == 1)
{
address = "Sim:cos";
}
else
{
address = "Sim:step";
}
var vtag = new Cdy.Tag.DoubleTag() { Name = "Double" + i, Group = "Double", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Double, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
}
}
if (paras.Length > 1)
{
int fcount = int.Parse(paras[1]);
for (int i = 0; i < fcount; i++)
{
if (i % 3 == 0)
{
address = "Sim:sin";
}
else if (i % 3 == 1)
{
address = "Sim:cos";
}
else
{
address = "Sim:step";
}
var vtag = new Cdy.Tag.FloatTag() { Name = "Float" + i, Group = "Float", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Float, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
}
}
if (paras.Length > 2)
{
int fcount = int.Parse(paras[2]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.LongTag() { Name = "Long" + i, Group = "Long", LinkAddress = "Sim:step" };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Long, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
}
}
if (paras.Length > 3)
{
int fcount = int.Parse(paras[3]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.IntTag() { Name = "Int" + i, Group = "Int", LinkAddress = "Sim:step" };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Int, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
}
}
if (paras.Length > 4)
{
int fcount = int.Parse(paras[4]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.BoolTag() { Name = "Bool" + i, Group = "Bool", LinkAddress = "Sim:square" };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Bool, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
}
}
if (paras.Length > 5)
{
int fcount = int.Parse(paras[5]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.IntPointTag() { Name = "IntPoint" + i, Group = "IntPoint", LinkAddress = "Sim:steppoint" };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.IntPoint, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = 0 });
}
}
}
......@@ -246,6 +373,7 @@ namespace DBStudio
re.AppendLine("import [filename] //import tags from a csvfile");
re.AppendLine("export [filename] //export tags to a csvfile");
re.AppendLine("list [tagtype] //the sumery info of specical type tags or all tags");
re.AppendLine("sp [double tag number] [float tag number] [long tag number] [int tag number] [bool tag number] [intpoint tag number] //Quickly generate a specified number of tags for test purposes");
re.AppendLine("exit //exit and back to parent");
return re.ToString();
......@@ -319,6 +447,32 @@ namespace DBStudio
sb.Append(mRealTagMode.Group + ",");
sb.Append(mRealTagMode.Type + ",");
sb.Append(mRealTagMode.LinkAddress + ",");
sb.Append((int)mRealTagMode.ReadWriteType + ",");
if(mRealTagMode.Conveter!=null)
sb.Append(mRealTagMode.Conveter.SeriseToString() + ",");
else
{
sb.Append(",");
}
if (mRealTagMode is NumberTagBase)
{
sb.Append((mRealTagMode as NumberTagBase).MaxValue.ToString() + ",");
sb.Append((mRealTagMode as NumberTagBase).MinValue.ToString() + ",");
}
else
{
sb.Append(",");
sb.Append(",");
}
if(mRealTagMode is FloatingTagBase)
{
sb.Append((mRealTagMode as FloatingTagBase).Precision + ",");
}
else
{
sb.Append(",");
}
if (mHisTagMode != null)
{
sb.Append(mHisTagMode.Type + ",");
......@@ -352,19 +506,35 @@ namespace DBStudio
realtag.Desc = stmp[2];
realtag.Group = stmp[3];
realtag.LinkAddress = stmp[5];
realtag.ReadWriteType = (ReadWriteMode)(int.Parse(stmp[6]));
if(stmp[7]!=null)
{
realtag.Conveter = stmp[7].DeSeriseToValueConvert();
}
if(realtag is NumberTagBase)
{
(realtag as NumberTagBase).MaxValue = double.Parse(stmp[8], System.Globalization.NumberStyles.Any);
(realtag as NumberTagBase).MinValue = double.Parse(stmp[9], System.Globalization.NumberStyles.Any);
}
if (realtag is FloatingTagBase)
{
(realtag as FloatingTagBase).Precision = byte.Parse(stmp[10]);
}
if (stmp.Length > 6)
if (stmp.Length > 11)
{
Cdy.Tag.HisTag histag = new HisTag();
histag.Type = (Cdy.Tag.RecordType)Enum.Parse(typeof(Cdy.Tag.RecordType), stmp[6]);
histag.Type = (Cdy.Tag.RecordType)Enum.Parse(typeof(Cdy.Tag.RecordType), stmp[11]);
histag.Circle = long.Parse(stmp[7]);
histag.CompressType = int.Parse(stmp[8]);
histag.Circle = long.Parse(stmp[12]);
histag.CompressType = int.Parse(stmp[13]);
histag.Parameters = new Dictionary<string, double>();
histag.TagType = realtag.Type;
histag.Id = realtag.Id;
for (int i = 9; i < stmp.Length; i++)
for (int i = 14; i < stmp.Length; i++)
{
string skey = stmp[i];
if (string.IsNullOrEmpty(skey))
......@@ -522,6 +692,7 @@ namespace DBStudio
private static void ClearTag(Database database)
{
database.RealDatabase.Tags.Clear();
database.RealDatabase.MaxId = 0;
database.HisDatabase.HisTags.Clear();
}
......
......@@ -14,6 +14,7 @@
<ItemGroup>
<ProjectReference Include="..\Cdy.Tag.Common\Cdy.Tag.Common.csproj" />
<ProjectReference Include="..\Cdy.Tag.Consume\Cdy.Tag.Consume.csproj" />
<ProjectReference Include="..\Cdy.Tag.Driver\Cdy.Tag.Driver.csproj" />
<ProjectReference Include="..\Cdy.Tag\Cdy.Tag.csproj" />
<ProjectReference Include="..\DBHisData\DBHisData.csproj" />
......
......@@ -160,7 +160,7 @@ namespace Cdy.Tag
Stopwatch sw = new Stopwatch();
sw.Start();
CheckTagAddress(source);
CheckTagAddress(source);
long datasize = 0;
int headOffset = 4 + 4;
long Offset = headOffset + this.mTagAddress.Count * 8;
......@@ -234,8 +234,10 @@ namespace Cdy.Tag
tp.Parameters = histag.Parameters;
var size = tp.Compress(mSourceMemory, addr, this, targetPosition + 5, len) + 1;
this.WriteInt(targetPosition, (int)size);
//this.Dump();
return size + 5;
}
return 0;
}
......
......@@ -48,6 +48,7 @@ namespace Cdy.Tag
/// <returns></returns>
public override long Compress(MarshalMemoryBlock source, long sourceAddr, MarshalMemoryBlock target, long targetAddr, long size)
{
// LoggerService.Service.Erro("NoneCompressUnit", "目标地址:"+targetAddr +" 数值地址: " + (targetAddr+10) +" 变量个数: "+ (size - this.QulityOffset));
target.WriteDatetime(targetAddr,this.StartTime);
target.Write((ushort)(size - this.QulityOffset));//写入值的个数
if (size > 0)
......@@ -3211,11 +3212,12 @@ namespace Cdy.Tag
var vals = source.ReadInts(valaddr, valuecount * 2);
for (i = 0; i < valuecount; i=i+2)
for (i = 0; i < vals.Count; i=i+2)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 2;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1] , qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1] , qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3229,11 +3231,12 @@ namespace Cdy.Tag
var vals = source.ReadUInts(valaddr, valuecount * 2);
for (i = 0; i < valuecount; i = i + 2)
for (i = 0; i < vals.Count; i = i + 2)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 2;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1], qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3247,11 +3250,12 @@ namespace Cdy.Tag
var vals = source.ReadInts(valaddr, valuecount * 3);
for (i = 0; i < valuecount; i = i + 3)
for (i = 0; i < vals.Count; i = i + 3)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 3;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1],vals[i + 2], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1],vals[i + 2], qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3265,11 +3269,12 @@ namespace Cdy.Tag
var vals = source.ReadUInts(valaddr, valuecount * 3);
for (i = 0; i < valuecount; i = i + 3)
for (i = 0; i < vals.Count; i = i + 3)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 3;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1], vals[i + 2], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1], vals[i + 2], qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3283,11 +3288,12 @@ namespace Cdy.Tag
var vals = source.ReadLongs(valaddr, valuecount * 2);
for (i = 0; i < valuecount; i = i + 2)
for (i = 0; i < vals.Count; i = i + 2)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 2;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1], qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3301,11 +3307,12 @@ namespace Cdy.Tag
var vals = source.ReadULongs(valaddr, valuecount * 2);
for (i = 0; i < valuecount; i = i + 2)
for (i = 0; i < vals.Count; i = i + 2)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 2;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1], qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3319,11 +3326,12 @@ namespace Cdy.Tag
var vals = source.ReadLongs(valaddr, valuecount * 3);
for (i = 0; i < valuecount; i = i + 3)
for (i = 0; i < vals.Count; i = i + 3)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 3;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1], vals[i + 2], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1], vals[i + 2], qs[j].Item1, qq[j]);
rcount++;
}
}
......@@ -3337,11 +3345,12 @@ namespace Cdy.Tag
var vals = source.ReadULongs(valaddr, valuecount * 3);
for (i = 0; i < valuecount; i = i + 3)
for (i = 0; i < vals.Count; i = i + 3)
{
if (qs[i].Item2 && qq[i] < 100 && qs[i].Item1 >= startTime && qs[i].Item1 < endTime)
int j = i / 3;
if (qs[j].Item2 && qq[j] < 100 && qs[j].Item1 >= startTime && qs[j].Item1 < endTime)
{
result.AddPoint(vals[i], vals[i + 1], vals[i + 2], qs[i].Item1, qq[i]);
result.AddPoint(vals[i], vals[i + 1], vals[i + 2], qs[j].Item1, qq[j]);
rcount++;
}
}
......
......@@ -414,8 +414,24 @@ namespace Cdy.Tag
case Cdy.Tag.TagType.ULong:
case Cdy.Tag.TagType.Double:
case Cdy.Tag.TagType.DateTime:
case TagType.UIntPoint:
case TagType.IntPoint:
qulityOffset = dataOffset + count * 8;
return qulityOffset + count;
case Cdy.Tag.TagType.IntPoint3:
case Cdy.Tag.TagType.UIntPoint3:
qulityOffset = dataOffset + count * 12;
return qulityOffset + count;
case Cdy.Tag.TagType.LongPoint:
case Cdy.Tag.TagType.ULongPoint:
qulityOffset = dataOffset + count * 16;
return qulityOffset + count;
case Cdy.Tag.TagType.LongPoint3:
case Cdy.Tag.TagType.ULongPoint3:
qulityOffset = dataOffset + count * 24;
return qulityOffset + count;
case Cdy.Tag.TagType.String:
qulityOffset = dataOffset + count * Const.StringSize;
return qulityOffset + count;
......@@ -559,6 +575,19 @@ namespace Cdy.Tag
}
}
/// <summary>
///
/// </summary>
/// <param name="memory"></param>
private void CheckMemoryIsReady(MarshalMemoryBlock memory)
{
while (memory.IsBusy())
{
LoggerService.Service.Info("Record", "记录出现阻塞 " + memory.Name);
System.Threading.Thread.Sleep(1);
}
}
/// <summary>
///
/// </summary>
......@@ -589,6 +618,7 @@ namespace Cdy.Tag
if (mMergeMemory != null)
{
RecordAllLastValue();
//mMergeMemory.Dump();
mMergeMemory.MakeMemoryBusy();
//提交到数据压缩流程
......@@ -632,13 +662,17 @@ namespace Cdy.Tag
//拷贝时间
var tcount = (tag.Value.HisValueStartAddr - tag.Value.TimerValueStartAddr);
var vtimeaddr = addrbase + tcount * count + 2;
mMergeMemory.CopyFrom(mcc, tag.Value.TimerValueStartAddr, vtimeaddr, tcount);
// mcc.CopyTo(mMergeMemory, tag.Value.TimerValueStartAddr, vtimeaddr, tcount);
mMergeMemory.CopyFrom(mcc, tag.Value.TimerValueStartAddr, vtimeaddr, tcount);
//LoggerService.Service.Info("HisEnginer","拷贝时间数据:"+count+"," + tag.Value.TimerValueStartAddr +","+ vtimeaddr + "," + tcount);
//拷贝数值
tcount = tag.Value.HisQulityStartAddr - tag.Value.HisValueStartAddr;
vtimeaddr = addrbase + vaddrs.Item2 + tcount * count+tag.Value.SizeOfValue;
mMergeMemory.CopyFrom(mcc, tag.Value.HisValueStartAddr, vtimeaddr, tcount);
//mcc.CopyTo(mMergeMemory, tag.Value.HisValueStartAddr, vtimeaddr, tcount);
mMergeMemory.CopyFrom(mcc, tag.Value.HisValueStartAddr, vtimeaddr, tcount);
//LoggerService.Service.Info("HisEnginer", "拷贝数值数据:" + count + "," + tag.Value.HisValueStartAddr + "," + vtimeaddr + "," + tcount);
......@@ -646,15 +680,19 @@ namespace Cdy.Tag
//拷贝质量戳
tcount = tag.Value.DataSize - tag.Value.HisQulityStartAddr + tag.Value.BlockHeadStartAddr;
vtimeaddr = addrbase + vaddrs.Item3 + tcount * count+1;
// mcc.CopyTo(mMergeMemory, tag.Value.HisQulityStartAddr, vtimeaddr, tcount);
mMergeMemory.CopyFrom(mcc, tag.Value.HisQulityStartAddr, vtimeaddr, tcount);
//LoggerService.Service.Info("HisEnginer", "拷贝质量戳数据:" + count + "," + tag.Value.HisQulityStartAddr + "," + vtimeaddr + "," + tcount);
}
//});
// mMergeMemory.Dump();
//mcc.Dump();
ClearMemoryHisData(mcc);
mcc.MakeMemoryNoBusy();
//ClearMemoryHisData(mcc);
sw.Stop();
LoggerService.Service.Info("Record", "合并完成 " + mcc.Name+" 次数:"+(count+1)+" 耗时:"+sw.ElapsedMilliseconds);
}
......@@ -828,19 +866,16 @@ namespace Cdy.Tag
LoggerService.Service.Info("Record", "*************************************************************************", ConsoleColor.Green);
}
//else
//{
foreach (var vv in mRecordTimerProcesser)
{
vv.Notify(dt);
}
foreach (var vv in mRecordTimerProcesser)
{
vv.Notify(dt);
}
//值改变的变量,也受内部定时逻辑处理。这样值改变频路高于MemoryTimeTick 的值时,无效。
foreach (var vv in mValueChangedProcesser)
{
vv.Notify(dt);
}
//}
//值改变的变量,也受内部定时逻辑处理。这样值改变频路高于MemoryTimeTick 的值时,无效。
foreach (var vv in mValueChangedProcesser)
{
vv.Notify(dt);
}
mIsBusy = false;
}
......@@ -909,6 +944,7 @@ namespace Cdy.Tag
{
Stopwatch sw = new Stopwatch();
sw.Start();
while (memory.IsBusy()) ;
memory.Clear();
sw.Stop();
LoggerService.Service.Info("Record", memory.Name + "清空数据区耗时:" + sw.ElapsedMilliseconds);
......
......@@ -189,6 +189,7 @@ namespace Cdy.Tag
mNeedSaveMemory1.MakeMemoryBusy();
RecordToFile();
mNeedSaveMemory1.MakeMemoryNoBusy();
ClearMemoryHisData(mNeedSaveMemory1);
}
CheckRemoveOldFiles();
sw.Stop();
......@@ -199,6 +200,20 @@ namespace Cdy.Tag
}
/// <summary>
///
/// </summary>
/// <param name="memory"></param>
public void ClearMemoryHisData(MarshalFixedMemoryBlock memory)
{
Stopwatch sw = new Stopwatch();
sw.Start();
while (memory.IsBusy()) ;
memory.Clear();
sw.Stop();
LoggerService.Service.Info("Record", memory.Name + "清空数据区耗时:" + sw.ElapsedMilliseconds);
}
/// <summary>
///
/// </summary>
......@@ -233,6 +248,7 @@ namespace Cdy.Tag
{
string sfileName = vv.Name;
DateTime dt = new DateTime(int.Parse(sfileName.Substring(0, 4)), int.Parse(sfileName.Substring(4, 2)), int.Parse(sfileName.Substring(6, 2)), int.Parse(sfileName.Substring(8, 2)), int.Parse(sfileName.Substring(10, 2)), int.Parse(sfileName.Substring(12, 2)));
if(!logFiles.ContainsKey(dt))
logFiles.Add(dt, vv.FullName);
}
}
......
......@@ -743,7 +743,7 @@ namespace Cdy.Tag
Stopwatch sw = new Stopwatch();
sw.Start();
var totalsize = mProcessMemory.ReadInt(dataOffset);
var datasize = mProcessMemory.ReadInt(dataOffset);
var count = mProcessMemory.ReadInt(dataOffset + 4);
mTagCount = count;
mCurrentTime = time;
......@@ -808,10 +808,17 @@ namespace Cdy.Tag
{
mFileWriter.GoToEnd();
long lpp = mFileWriter.CurrentPostion;
mProcessMemory.WriteToStream(mFileWriter.GetStream(), start, totalsize - start);//直接拷贝数据块
// LoggerService.Service.Info("SeriseFileItem", "数据写入地址:" + lpp + ",更新指针地址:" + pointAddr+" block index:"+bid+" tagcount:"+count+" block point Start Addr:"+ mBlockPointOffset+" point values:"+sb.ToString());
mProcessMemory.WriteToStream(mFileWriter.GetStream(), start, datasize);//直接拷贝数据块
// mProcessMemory.WriteToStream(mFileWriter.GetStream(), start, totalsize - start);//直接拷贝数据块
LoggerService.Service.Info("SeriseFileItem", "数据写入地址:" + lpp + " 数据大小: "+(datasize) +" 最后地址: "+mFileWriter.CurrentPostion+ ",更新指针地址:" + pointAddr + " block index:" + bid + " tagcount:" + count + " block point Start Addr:" + mBlockPointOffset, ConsoleColor.Red);
// LoggerService.Service.Info("SeriseFileItem", "数据写入地址:" + lpp + ",更新指针地址:" + pointAddr+" block index:"+bid+" tagcount:"+count+" block point Start Addr:"+ mBlockPointOffset+" point values:"+sb.ToString());
//this.mFileWriter.Append(mProcessMemory.Buffers, (int)start, (int)(totalsize - start));
mFileWriter.Write(mBlockPointMemory.Buffers, pointAddr, 0, (int)mBlockPointMemory.AllocSize);
......@@ -820,7 +827,7 @@ namespace Cdy.Tag
}
sw.Stop();
LoggerService.Service.Info("SeriseFileItem" + Id, "写入数据 " + mCurrentFileName + " 数据大小:" + ((totalsize - start) + mBlockPointMemory.AllocSize) / 1024.0 / 1024 + " m" +"其他脚本耗时:"+ltmp+","+(ltmp2-ltmp)+","+(ltmp3-ltmp2)+ "存储耗时:" + (sw.ElapsedMilliseconds-ltmp3));
LoggerService.Service.Info("SeriseFileItem" + Id, "写入数据 " + mCurrentFileName + " 数据大小:" + ((datasize) + mBlockPointMemory.AllocSize) / 1024.0 / 1024 + " m" +"其他脚本耗时:"+ltmp+","+(ltmp2-ltmp)+","+(ltmp3-ltmp2)+ "存储耗时:" + (sw.ElapsedMilliseconds-ltmp3));
}
catch(System.IO.IOException ex)
......
......@@ -176,9 +176,9 @@ namespace Cdy.Tag
//实时数据内存结构为:实时值+时间戳+质量戳,时间戳2个字节,质量戳1个字节
HisAddr.WriteUShortDirect(TimerValueStartAddr + vcount * 2, (ushort)(tim));
//写入数值
//HisAddr.WriteBytesDirect(HisValueStartAddr + vcount * SizeOfValue, RealMemoryAddr, RealValueAddr, SizeOfValue);
//写入数值
//HisAddr.WriteBytesDirect(HisValueStartAddr + vcount * SizeOfValue, RealMemoryAddr, RealValueAddr, SizeOfValue);
//LoggerService.Service.Erro("HisTag","read from realmemory:"+ MemoryHelper.ReadDouble((void*)RealMemoryPtr, RealValueAddr));
HisAddr.WriteBytesDirect(HisValueStartAddr + vcount * SizeOfValue, RealMemoryPtr, RealValueAddr, SizeOfValue);
//更新质量戳
......
......@@ -446,6 +446,7 @@ namespace Cdy.Tag
/// <param name="time"></param>
public void SetValueByAddr(long addr, double value, byte quality, DateTime time)
{
//LoggerService.Service.Warn("RealEnginer", " write value:"+ value.ToString() + "");
MemoryHelper.WriteDouble(mMHandle, addr, value);
MemoryHelper.WriteDateTime(mMHandle, addr + 8, time);
MemoryHelper.WriteByte(mMHandle, addr + 16, quality); ;
......@@ -518,7 +519,7 @@ namespace Cdy.Tag
MemoryHelper.WriteInt32(mMHandle, addr, value1);
MemoryHelper.WriteInt32(mMHandle, addr+4, value2);
MemoryHelper.WriteDateTime(mMHandle, addr + 8, time);
MemoryHelper.WriteByte(mMHandle, addr + 16, quality); ;
MemoryHelper.WriteByte(mMHandle, addr + 16, quality);
}
/// <summary>
......@@ -534,7 +535,7 @@ namespace Cdy.Tag
MemoryHelper.WriteUInt32(mMHandle, addr, value1);
MemoryHelper.WriteUInt32(mMHandle, addr + 4, value2);
MemoryHelper.WriteDateTime(mMHandle, addr + 8, time);
MemoryHelper.WriteByte(mMHandle, addr + 16, quality); ;
MemoryHelper.WriteByte(mMHandle, addr + 16, quality);
}
/// <summary>
......@@ -603,7 +604,7 @@ namespace Cdy.Tag
MemoryHelper.WriteInt64(mMHandle, addr, value1);
MemoryHelper.WriteInt64(mMHandle, addr + 8, value2);
MemoryHelper.WriteDateTime(mMHandle, addr + 16, time);
MemoryHelper.WriteByte(mMHandle, addr + 24, quality); ;
MemoryHelper.WriteByte(mMHandle, addr + 24, quality);
}
/// <summary>
......@@ -621,7 +622,7 @@ namespace Cdy.Tag
MemoryHelper.WriteInt64(mMHandle, addr + 8, value2);
MemoryHelper.WriteInt64(mMHandle, addr + 16, value3);
MemoryHelper.WriteDateTime(mMHandle, addr + 24, time);
MemoryHelper.WriteByte(mMHandle, addr + 32, quality); ;
MemoryHelper.WriteByte(mMHandle, addr + 32, quality);
}
/// <summary>
......@@ -639,7 +640,7 @@ namespace Cdy.Tag
MemoryHelper.WriteUInt64(mMHandle, addr + 8, value2);
MemoryHelper.WriteUInt64(mMHandle, addr + 16, value3);
MemoryHelper.WriteDateTime(mMHandle, addr + 24, time);
MemoryHelper.WriteByte(mMHandle, addr + 32, quality); ;
MemoryHelper.WriteByte(mMHandle, addr + 32, quality);
}
#endregion
......@@ -2972,6 +2973,62 @@ namespace Cdy.Tag
#endregion
/// <summary>
///
/// </summary>
/// <param name="group"></param>
/// <param name="values"></param>
/// <returns></returns>
public bool SetTagByGroup(string group, params object[] values)
{
var vatg = mConfigDatabase.GetTagsByGroup(group);
DateTime time = DateTime.Now;
for(int i=0;i<values.Length;i++)
{
var tag = vatg[i];
switch (tag.Type)
{
case TagType.Bool:
SetBoolTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.Byte:
SetByteTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.DateTime:
SetDateTimeTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.Double:
SetDoubleTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.Float:
SetFloatTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.Int:
SetIntTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.Long:
SetLongTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.Short:
SetShortTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.String:
SetSrtingTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.UInt:
SetUIntTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.ULong:
SetULongTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
case TagType.UShort:
SetUShortTagValue(tag, values[i], (byte)QualityConst.Good, time);
break;
}
}
return true;
}
/// <summary>
///
/// </summary>
......@@ -3792,8 +3849,12 @@ namespace Cdy.Tag
return true;
}
#endregion
#endregion ...Interfaces...
}
}
......@@ -49,6 +49,8 @@ namespace Cdy.Tag
private QuerySerivce querySerivce;
private SecurityRunner mSecurityRunner;
private bool mIsStarted = false;
#endregion ...Variables...
......@@ -171,6 +173,9 @@ namespace Cdy.Tag
querySerivce = new QuerySerivce(this.mDatabaseName);
mSecurityRunner = new SecurityRunner() { Document = mDatabase.Security };
RegistorInterface();
DriverManager.Manager.Init(realEnginer);
......@@ -204,6 +209,8 @@ namespace Cdy.Tag
ServiceLocator.Locator.Registor<IHisQuery>(querySerivce);
ServiceLocator.Locator.Registor<ITagManager>(mRealDatabase);
ServiceLocator.Locator.Registor<IRuntimeSecurity>(mSecurityRunner);
}
/// <summary>
......@@ -239,6 +246,7 @@ namespace Cdy.Tag
seriseEnginer.Start();
compressEnginer.Start();
hisEnginer.Start();
mSecurityRunner.Start();
DriverManager.Manager.Start();
mIsStarted = true;
LoggerService.Service.Info("Runner", " 数据库 " + database + " 启动完成");
......@@ -253,6 +261,8 @@ namespace Cdy.Tag
hisEnginer.Stop();
compressEnginer.Stop();
seriseEnginer.Stop();
mSecurityRunner.Stop();
DriverManager.Manager.Stop();
mIsStarted = false;
}
......
//==============================================================
// Copyright (C) 2020 Inc. All rights reserved.
//
//==============================================================
// Create by 种道洋 at 2020/5/9 21:36:54.
// Version 1.0
// 种道洋
//==============================================================
using Cdy.Tag;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Cdy.Tag
{
/// <summary>
///
/// </summary>
public class SecurityRunner: IRuntimeSecurity
{
#region ... Variables ...
private SecurityDocument mDocument;
private Dictionary<string, DateTime> mLastLogin = new Dictionary<string, DateTime>();
private Dictionary<string, string> mUseIdMap = new Dictionary<string, string>();
public const int Timeout = 10;
private bool mIsClosed = false;
private Thread mScanThread;
private object mLockObj = new object();
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
/// <summary>
///
/// </summary>
public SecurityDocument Document
{
get
{
return mDocument;
}
set
{
mDocument = value;
}
}
#endregion ...Properties...
#region ... Methods ...
/// <summary>
///
/// </summary>
public void Start()
{
mScanThread = new Thread(ProcessTimeOut);
mScanThread.IsBackground = true;
mScanThread.Start();
}
/// <summary>
///
/// </summary>
public void Stop()
{
mIsClosed = true;
}
/// <summary>
///
/// </summary>
private void ProcessTimeOut()
{
List<string> ltmp = new List<string>();
while(!mIsClosed)
{
ltmp.Clear();
DateTime dt = DateTime.Now;
lock (mLockObj)
{
foreach (var vv in mLastLogin)
{
if ((dt - vv.Value).TotalMinutes >= Timeout)
{
ltmp.Add(vv.Key);
}
}
foreach (var vv in ltmp)
{
mLastLogin.Remove(vv);
if (mUseIdMap.ContainsKey(vv)) mUseIdMap.Remove(vv);
}
}
Thread.Sleep(500);
}
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool CheckLogin(string id)
{
return mLastLogin.ContainsKey(id);
}
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <param name="pass"></param>
/// <returns></returns>
public string Login(string user, string pass)
{
if(mDocument!=null&&mDocument.User.Users.ContainsKey(user)&&mDocument.User.Users[user].Password == pass)
{
string sid = Guid.NewGuid().ToString().Replace("-", "");
lock(mLockObj)
{
mLastLogin.Add(sid, DateTime.Now);
mUseIdMap.Add(sid, user);
}
}
return string.Empty;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool Logout(string id)
{
if(mLastLogin.ContainsKey(id))
{
mLastLogin.Remove(id);
}
if (mUseIdMap.ContainsKey(id)) return mUseIdMap.Remove(id);
return true;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string GetUserByLoginId(string id)
{
if(mUseIdMap.ContainsKey(id))
{
return mUseIdMap[id];
}
return string.Empty;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public List<UserPermission> GetPermission(string id)
{
List<UserPermission> re = new List<UserPermission>();
if (mDocument.User.Users.ContainsKey(id))
{
var vtmp = mDocument.User.Users[id].Permissions;
if (vtmp != null)
{
foreach (var vv in vtmp)
{
if(mDocument.Permission.Permissions.ContainsKey(vv))
{
re.Add(mDocument.Permission.Permissions[vv]);
}
}
}
}
return re;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool FreshUserId(string id)
{
if(mLastLogin.ContainsKey(id))
{
mLastLogin[id] = DateTime.Now;
}
return true;
}
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
}
......@@ -25,6 +25,19 @@
"bin/placeholder/Cdy.Tag.Common.dll": {}
}
},
"Cdy.Tag.Consume/1.0.0": {
"type": "project",
"framework": ".NETStandard,Version=v2.1",
"dependencies": {
"Cdy.Tag": "1.0.0"
},
"compile": {
"bin/placeholder/Cdy.Tag.Consume.dll": {}
},
"runtime": {
"bin/placeholder/Cdy.Tag.Consume.dll": {}
}
},
"Cdy.Tag.Driver/1.0.0": {
"type": "project",
"framework": ".NETStandard,Version=v2.1",
......@@ -65,6 +78,11 @@
"path": "../Cdy.Tag.Common/Cdy.Tag.Common.csproj",
"msbuildProject": "../Cdy.Tag.Common/Cdy.Tag.Common.csproj"
},
"Cdy.Tag.Consume/1.0.0": {
"type": "project",
"path": "../Cdy.Tag.Consume/Cdy.Tag.Consume.csproj",
"msbuildProject": "../Cdy.Tag.Consume/Cdy.Tag.Consume.csproj"
},
"Cdy.Tag.Driver/1.0.0": {
"type": "project",
"path": "../Cdy.Tag.Driver/Cdy.Tag.Driver.csproj",
......@@ -80,6 +98,7 @@
".NETCoreApp,Version=v3.1": [
"Cdy.Tag >= 1.0.0",
"Cdy.Tag.Common >= 1.0.0",
"Cdy.Tag.Consume >= 1.0.0",
"Cdy.Tag.Driver >= 1.0.0",
"DBHisData >= 1.0.0"
]
......@@ -117,6 +136,9 @@
"D:\\Project\\Galaxy\\Cdy.Tag.Common\\Cdy.Tag.Common.csproj": {
"projectPath": "D:\\Project\\Galaxy\\Cdy.Tag.Common\\Cdy.Tag.Common.csproj"
},
"D:\\Project\\Galaxy\\Cdy.Tag.Consume\\Cdy.Tag.Consume.csproj": {
"projectPath": "D:\\Project\\Galaxy\\Cdy.Tag.Consume\\Cdy.Tag.Consume.csproj"
},
"D:\\Project\\Galaxy\\Cdy.Tag.Driver\\Cdy.Tag.Driver.csproj": {
"projectPath": "D:\\Project\\Galaxy\\Cdy.Tag.Driver\\Cdy.Tag.Driver.csproj"
},
......
......@@ -13,10 +13,33 @@ namespace DbInRunWebApi.Controllers
public class LoginController : ControllerBase
{
// POST: Login
[HttpPost]
public string Post([FromBody] LoginUser user)
[HttpPost("Login")]
public LoginResponse Login([FromBody] LoginUser user)
{
return Guid.NewGuid().ToString();
return new LoginResponse() { Token = Cdy.Tag.ServiceLocator.Locator.Resolve<Cdy.Tag.IRuntimeSecurity>().Login(user.UserName, user.Password),Time=DateTime.Now };
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("Hart")]
public bool Hart([FromBody] Requestbase token)
{
return Cdy.Tag.ServiceLocator.Locator.Resolve<Cdy.Tag.IRuntimeSecurity>().FreshUserId(token.Token);
}
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost("Logout")]
public bool Logout([FromBody] Requestbase token)
{
return Cdy.Tag.ServiceLocator.Locator.Resolve<Cdy.Tag.IRuntimeSecurity>().Logout(token.Token);
}
}
}
......@@ -21,7 +21,23 @@ namespace DbInRunWebApi.Controllers
[HttpGet()]
public RealValueQueryResponse Get([FromBody] RealDataRequest request)
{
if(DbInRunWebApi.SecurityManager.Manager.IsLogin(request.Token)&&DbInRunWebApi.SecurityManager.Manager.CheckReaderPermission(request.Token,request.Group))
{
RealValueQueryResponse response = new RealValueQueryResponse() { Result = true, Datas = new List<RealValue>(request.TagNames.Count) };
var service = ServiceLocator.Locator.Resolve<IRealTagComsumer>();
var ids = service.GetTagIdByName(request.TagNames);
for(int i=0;i<request.TagNames.Count;i++)
{
if (ids[i].HasValue)
{
byte quality;
DateTime time;
var val = service.GetTagValue(ids[i].Value, out quality, out time);
response.Datas.Add(new RealValue() { Quality = quality, Time = time, Value = val });
}
}
return response;
}
//ServiceLocator.Locator.Resolve<IRealTagComsumer>().GetTagValue()
return new RealValueQueryResponse() { Result = false };
}
......
......@@ -9,6 +9,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Cdy.Tag.Common\Cdy.Tag.Common.csproj" />
<ProjectReference Include="..\Cdy.Tag.Consume\Cdy.Tag.Consume.csproj" />
<ProjectReference Include="..\Cdy.Tag\Cdy.Tag.csproj" />
</ItemGroup>
......
......@@ -6,6 +6,73 @@ using System.Threading.Tasks;
namespace DbInRunWebApi.Model
{
public class ReponseBase
{
#region ... Variables ...
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
/// <summary>
///
/// </summary>
public string Token { get; set; }
#endregion ...Properties...
#region ... Methods ...
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
public class LoginResponse:ReponseBase
{
#region ... Variables ...
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
/// <summary>
///
/// </summary>
public DateTime Time { get; set; }
#endregion ...Properties...
#region ... Methods ...
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
/// <summary>
///
/// </summary>
......@@ -58,7 +125,12 @@ namespace DbInRunWebApi.Model
#endregion ...Constructor...
#region ... Properties ...
/// <summary>
///
/// </summary>
public string Group { get; set; }
/// <summary>
///
/// </summary>
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Cdy.Tag;
namespace DbInRunWebApi
{
public class SecurityManager
{
#region ... Variables ...
/// <summary>
///
/// </summary>
public static SecurityManager Manager = new SecurityManager();
private Dictionary<string, List<string>> mUserReaderPermissionCach = new Dictionary<string, List<string>>();
private Dictionary<string, List<string>> mUserWriterPermissionCach = new Dictionary<string, List<string>>();
/// <summary>
///
/// </summary>
private Dictionary<string, bool> mSuperUsers = new Dictionary<string, bool>();
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
#endregion ...Properties...
#region ... Methods ...
/// <summary>
///
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public bool IsLogin(string token)
{
return ServiceLocator.Locator.Resolve<IRuntimeSecurity>().CheckLogin(token);
}
/// <summary>
///
/// </summary>
/// <param name="token"></param>
/// <param name="group"></param>
/// <param name="isEnableWrite"></param>
/// <returns></returns>
public bool CheckWritePermission(string token,string group)
{
var securityService = ServiceLocator.Locator.Resolve<IRuntimeSecurity>();
var user = securityService.GetUserByLoginId(token);
if (mUserWriterPermissionCach.ContainsKey(user))
{
return mSuperUsers[user] || (mUserWriterPermissionCach[user].Contains(group));
}
else
{
var pps = securityService.GetPermission(user);
bool issuerper = false;
List<string> mgroups = new List<string>();
foreach (var vv in pps)
{
issuerper = issuerper | vv.SuperPermission;
if (vv.Group != null && vv.EnableWrite)
mgroups.AddRange(vv.Group);
}
if (mSuperUsers.ContainsKey(user)) mSuperUsers[user] = issuerper;
else mSuperUsers.Add(user, issuerper);
mUserWriterPermissionCach.Add(user, mgroups);
return mSuperUsers[user] || (mUserReaderPermissionCach[user].Contains(group));
}
//var pps = securityService.GetPermission(user);
//foreach(var vv in pps)
//if (vv.SuperPermission || (vv.Group.Contains(group)&& vv.EnableWrite )) return true;
//return false;
}
/// <summary>
///
/// </summary>
/// <param name="token"></param>
/// <param name="group"></param>
/// <returns></returns>
public bool CheckReaderPermission(string token, string group)
{
var securityService = ServiceLocator.Locator.Resolve<IRuntimeSecurity>();
var user = securityService.GetUserByLoginId(token);
if (mUserReaderPermissionCach.ContainsKey(user))
{
return mSuperUsers[user] || (mUserReaderPermissionCach[user].Contains(group));
}
else
{
var pps = securityService.GetPermission(user);
bool issuerper = false;
List<string> mgroups = new List<string>();
foreach(var vv in pps)
{
issuerper = issuerper | vv.SuperPermission;
if(vv.Group!=null)
mgroups.AddRange(vv.Group);
}
if (mSuperUsers.ContainsKey(user)) mSuperUsers[user] = issuerper;
else mSuperUsers.Add(user, issuerper);
mUserReaderPermissionCach.Add(user, mgroups);
return mSuperUsers[user] || (mUserReaderPermissionCach[user].Contains(group));
}
}
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
}
......@@ -114,6 +114,15 @@ namespace DBInStudio.Desktop.Properties {
}
}
/// <summary>
/// 查找类似 Convert 的本地化字符串。
/// </summary>
internal static string Convert {
get {
return ResourceManager.GetString("Convert", resourceCulture);
}
}
/// <summary>
/// 查找类似 Database select 的本地化字符串。
/// </summary>
......@@ -267,6 +276,24 @@ namespace DBInStudio.Desktop.Properties {
}
}
/// <summary>
/// 查找类似 MaxValue 的本地化字符串。
/// </summary>
internal static string MaxValue {
get {
return ResourceManager.GetString("MaxValue", resourceCulture);
}
}
/// <summary>
/// 查找类似 MinValue 的本地化字符串。
/// </summary>
internal static string MinValue {
get {
return ResourceManager.GetString("MinValue", resourceCulture);
}
}
/// <summary>
/// 查找类似 Name 的本地化字符串。
/// </summary>
......@@ -357,6 +384,42 @@ namespace DBInStudio.Desktop.Properties {
}
}
/// <summary>
/// 查找类似 Precision 的本地化字符串。
/// </summary>
internal static string Precision {
get {
return ResourceManager.GetString("Precision", resourceCulture);
}
}
/// <summary>
/// 查找类似 Read 的本地化字符串。
/// </summary>
internal static string Read {
get {
return ResourceManager.GetString("Read", resourceCulture);
}
}
/// <summary>
/// 查找类似 ReadWrite 的本地化字符串。
/// </summary>
internal static string ReadWrite {
get {
return ResourceManager.GetString("ReadWrite", resourceCulture);
}
}
/// <summary>
/// 查找类似 ReadWriteMode 的本地化字符串。
/// </summary>
internal static string ReadWriteMode {
get {
return ResourceManager.GetString("ReadWriteMode", resourceCulture);
}
}
/// <summary>
/// 查找类似 Record 的本地化字符串。
/// </summary>
......@@ -536,5 +599,14 @@ namespace DBInStudio.Desktop.Properties {
return ResourceManager.GetString("UserName", resourceCulture);
}
}
/// <summary>
/// 查找类似 Write 的本地化字符串。
/// </summary>
internal static string Write {
get {
return ResourceManager.GetString("Write", resourceCulture);
}
}
}
}
......@@ -135,6 +135,9 @@
<data name="CompressType" xml:space="preserve">
<value>CompressType</value>
</data>
<data name="Convert" xml:space="preserve">
<value>Convert</value>
</data>
<data name="databaseSelect" xml:space="preserve">
<value>Database select</value>
<comment>List database View Title</comment>
......@@ -188,6 +191,12 @@
<data name="MainwindowTitle" xml:space="preserve">
<value>Mars database developer</value>
</data>
<data name="MaxValue" xml:space="preserve">
<value>MaxValue</value>
</data>
<data name="MinValue" xml:space="preserve">
<value>MinValue</value>
</data>
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
......@@ -218,6 +227,18 @@
<data name="PermissionList" xml:space="preserve">
<value>Permission list</value>
</data>
<data name="Precision" xml:space="preserve">
<value>Precision</value>
</data>
<data name="Read" xml:space="preserve">
<value>Read</value>
</data>
<data name="ReadWrite" xml:space="preserve">
<value>ReadWrite</value>
</data>
<data name="ReadWriteMode" xml:space="preserve">
<value>ReadWriteMode</value>
</data>
<data name="Record" xml:space="preserve">
<value>Record</value>
</data>
......@@ -279,4 +300,7 @@
<data name="UserName" xml:space="preserve">
<value>UserName</value>
</data>
<data name="Write" xml:space="preserve">
<value>Write</value>
</data>
</root>
\ No newline at end of file
......@@ -9,6 +9,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Windows.Data;
......@@ -79,4 +80,34 @@ namespace DBInStudio.Desktop
#endregion ...Interfaces ...
}
public class BoolInvertConvert : IValueConverter
{
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return !(bool)value;
}
/// <summary>
///
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
......@@ -9,6 +9,7 @@
<UserControl.Resources>
<local:IndexConverter x:Key="ic" />
<BooleanToVisibilityConverter x:Key="btv" />
<local:BoolInvertConvert x:Key="biv" />
</UserControl.Resources>
<Grid>
<DataGrid ScrollViewer.CanContentScroll="True" VerticalScrollBarVisibility="Auto" ScrollViewer.ScrollChanged="DataGrid_ScrollChanged" VirtualizingPanel.IsVirtualizing="True" RowDetailsVisibilityMode="VisibleWhenSelected" MinRowHeight="24" Margin="0,0,0,32" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding SelectGroupTags}" SelectedItem="{Binding CurrentSelectTag,Mode=TwoWay}" BorderThickness="0,0,0,1" Background="{x:Null}" >
......@@ -55,6 +56,75 @@
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="{local:ResMarker ReadWriteMode}" MinWidth="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Margin="5,0" Text="{Binding ReadWriteModeString}" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Margin="0" BorderThickness="0" ItemsSource="{Binding ReadWriteModeList}" SelectedIndex="{Binding ReadWriteMode}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="{local:ResMarker Convert}" MinWidth="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Margin="5,0" Text="{Binding ConvertString}" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Margin="5,0" Text="{Binding ConvertString}" VerticalAlignment="Center" />
<Button Content="..." VerticalAlignment="Center" VerticalContentAlignment="Top" Click="{Binding ConvertEditCommand}" Width="30" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="{local:ResMarker MaxValue}" MinWidth="100" IsReadOnly="{Binding IsNumberTag,Converter={StaticResource biv}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Margin="5,0" Text="{Binding MaxValue}" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Margin="5,0" Text="{Binding MaxValue,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" VerticalAlignment="Stretch" VerticalContentAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="{local:ResMarker MinValue}" MinWidth="100" IsReadOnly="{Binding IsNumberTag,Converter={StaticResource biv}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Margin="5,0" Text="{Binding MinValue}" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Margin="5,0" Text="{Binding MinValue,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" VerticalAlignment="Stretch" VerticalContentAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="{local:ResMarker Precision}" MinWidth="100" IsReadOnly="{Binding IsFloatingTag,Converter={StaticResource biv}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Margin="5,0" Text="{Binding Precision}" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Margin="5,0" Text="{Binding Precision,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" VerticalAlignment="Stretch" VerticalContentAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="{local:ResMarker Record}" Width="120">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
......
......@@ -32,4 +32,6 @@ namespace DBInStudio.Desktop.View
}
}
}
}
......@@ -153,7 +153,7 @@ namespace DBInStudio.Desktop.ViewModel
private void Add()
{
string sname = GetAvaiabelName("Permission");
Cdy.Tag.PermissionItem pitem = new Cdy.Tag.PermissionItem() { Name = sname };
Cdy.Tag.UserPermission pitem = new Cdy.Tag.UserPermission() { Name = sname };
//if(DBDevelopClientApi.DevelopServiceHelper.Helper.UpdateDatabasePermission(this.Database,pitem))
//{
this.Permissions.Add(new PermissionItemViewModel(pitem) { IsNew = true });
......@@ -195,7 +195,7 @@ namespace DBInStudio.Desktop.ViewModel
#region ... Variables ...
private Cdy.Tag.PermissionItem mModel;
private Cdy.Tag.UserPermission mModel;
private string mGroupString;
......@@ -222,7 +222,7 @@ namespace DBInStudio.Desktop.ViewModel
///
/// </summary>
/// <param name="mode"></param>
public PermissionItemViewModel(Cdy.Tag.PermissionItem mode)
public PermissionItemViewModel(Cdy.Tag.UserPermission mode)
{
mModel = mode;
MakeGroupString();
......@@ -291,7 +291,7 @@ namespace DBInStudio.Desktop.ViewModel
/// <summary>
///
/// </summary>
public Cdy.Tag.PermissionItem Model
public Cdy.Tag.UserPermission Model
{
get
{
......
......@@ -31,6 +31,7 @@ namespace DBInStudio.Desktop
private static string[] mTagTypeList;
private static string[] mRecordTypeList;
private static string[] mCompressTypeList;
private static string[] mReadWriteModeList;
/// <summary>
///
......@@ -46,6 +47,8 @@ namespace DBInStudio.Desktop
private string[] mRegistorList;
private ICommand mConvertEditCommand;
#endregion ...Variables...
#region ... Events ...
......@@ -203,6 +206,18 @@ namespace DBInStudio.Desktop
}
}
/// <summary>
///
/// </summary>
public string[] ReadWriteModeList
{
get
{
return mReadWriteModeList;
}
}
/// <summary>
///
/// </summary>
......@@ -454,6 +469,179 @@ namespace DBInStudio.Desktop
}
}
/// <summary>
///
/// </summary>
public string ConvertString
{
get
{
return mRealTagMode.Conveter != null ? mRealTagMode.Conveter.ToString() : string.Empty;
}
}
/// <summary>
///
/// </summary>
public IValueConvert Convert
{
get
{
return mRealTagMode.Conveter;
}
set
{
if (mRealTagMode.Conveter != value)
{
mRealTagMode.Conveter = value;
OnPropertyChanged("Convert");
OnPropertyChanged("ConvertString");
}
}
}
/// <summary>
///
/// </summary>
public ICommand ConvertEditCommand
{
get
{
if(mConvertEditCommand==null)
{
mConvertEditCommand = new RelayCommand(() => {
// to do here
});
}
return mConvertEditCommand;
}
}
/// <summary>
///
/// </summary>
public int ReadWriteMode
{
get
{
return (int)mRealTagMode.ReadWriteType;
}
set
{
if ((int)mRealTagMode.ReadWriteType != value)
{
mRealTagMode.ReadWriteType = (Cdy.Tag.ReadWriteMode)value;
OnPropertyChanged("ReadWriteMode");
OnPropertyChanged("ReadWriteModeString");
}
}
}
/// <summary>
///
/// </summary>
public double AllowMaxValue
{
get
{
return mRealTagMode is Cdy.Tag.NumberTagBase ? (mRealTagMode as Cdy.Tag.NumberTagBase).AllowMaxValue : 0;
}
}
/// <summary>
///
/// </summary>
public double AllowMinValue
{
get
{
return mRealTagMode is Cdy.Tag.NumberTagBase ? (mRealTagMode as Cdy.Tag.NumberTagBase).AllowMinValue : 0;
}
}
/// <summary>
///
/// </summary>
public double MaxValue
{
get
{
return mRealTagMode is Cdy.Tag.NumberTagBase ? (mRealTagMode as Cdy.Tag.NumberTagBase).MaxValue : 0;
}
set
{
if (mRealTagMode is Cdy.Tag.NumberTagBase)
{
if (value <= AllowMaxValue)
{
(mRealTagMode as Cdy.Tag.NumberTagBase).MaxValue = value;
}
OnPropertyChanged("MaxValue");
}
}
}
/// <summary>
///
/// </summary>
public double MinValue
{
get
{
return mRealTagMode is Cdy.Tag.NumberTagBase ? (mRealTagMode as Cdy.Tag.NumberTagBase).MinValue : 0;
}
set
{
if (mRealTagMode is Cdy.Tag.NumberTagBase)
{
if(value>=AllowMinValue)
(mRealTagMode as Cdy.Tag.NumberTagBase).MinValue = value;
OnPropertyChanged("MinValue");
}
}
}
public bool IsNumberTag
{
get
{
return mRealTagMode is Cdy.Tag.NumberTagBase;
}
}
/// <summary>
///
/// </summary>
public byte Precision
{
get
{
return mRealTagMode is Cdy.Tag.FloatingTagBase ? (mRealTagMode as Cdy.Tag.FloatingTagBase).Precision : (byte)0;
}
set
{
if (mRealTagMode is Cdy.Tag.FloatingTagBase)
{
(mRealTagMode as Cdy.Tag.FloatingTagBase).Precision = value;
OnPropertyChanged("Precision");
}
}
}
public bool IsFloatingTag
{
get
{
return mRealTagMode is Cdy.Tag.FloatingTagBase;
}
}
/// <summary>
///
......@@ -466,6 +654,18 @@ namespace DBInStudio.Desktop
}
}
/// <summary>
///
/// </summary>
public string ReadWriteModeString
{
get
{
return Res.Get(((Cdy.Tag.ReadWriteMode)ReadWriteMode).ToString());
}
}
/// <summary>
///
......@@ -541,6 +741,7 @@ namespace DBInStudio.Desktop
{
mTagTypeList = Enum.GetNames(typeof(Cdy.Tag.TagType));
mRecordTypeList = Enum.GetNames(typeof(Cdy.Tag.RecordType));
mReadWriteModeList = Enum.GetNames(typeof(Cdy.Tag.ReadWriteMode));
}
/// <summary>
......@@ -763,7 +964,32 @@ namespace DBInStudio.Desktop
sb.Append(mRealTagMode.Group + ",");
sb.Append(mRealTagMode.Type + ",");
sb.Append(mRealTagMode.LinkAddress + ",");
if(this.mHisTagMode!=null)
sb.Append((int)mRealTagMode.ReadWriteType + ",");
if (mRealTagMode.Conveter != null)
sb.Append(mRealTagMode.Conveter.SeriseToString() + ",");
else
{
sb.Append(",");
}
if (mRealTagMode is NumberTagBase)
{
sb.Append((mRealTagMode as NumberTagBase).MaxValue.ToString() + ",");
sb.Append((mRealTagMode as NumberTagBase).MinValue.ToString() + ",");
}
else
{
sb.Append(",");
sb.Append(",");
}
if (mRealTagMode is FloatingTagBase)
{
sb.Append((mRealTagMode as FloatingTagBase).Precision + ",");
}
else
{
sb.Append(",");
}
if (this.mHisTagMode!=null)
{
sb.Append(mHisTagMode.Type + ",");
sb.Append(mHisTagMode.Circle + ",");
......@@ -796,19 +1022,34 @@ namespace DBInStudio.Desktop
realtag.Desc = stmp[2];
realtag.Group = stmp[3];
realtag.LinkAddress = stmp[5];
realtag.ReadWriteType = (ReadWriteMode)(int.Parse(stmp[6]));
if (stmp[7] != null)
{
realtag.Conveter = stmp[7].DeSeriseToValueConvert();
}
if (stmp.Length > 6)
if (realtag is NumberTagBase)
{
(realtag as NumberTagBase).MaxValue = double.Parse(stmp[8], System.Globalization.NumberStyles.Any);
(realtag as NumberTagBase).MinValue = double.Parse(stmp[9], System.Globalization.NumberStyles.Any);
}
if (realtag is FloatingTagBase)
{
(realtag as FloatingTagBase).Precision = byte.Parse(stmp[10]);
}
if (stmp.Length > 11)
{
Cdy.Tag.HisTag histag = new HisTag();
histag.Type = (Cdy.Tag.RecordType)Enum.Parse(typeof(Cdy.Tag.RecordType), stmp[6]);
histag.Type = (Cdy.Tag.RecordType)Enum.Parse(typeof(Cdy.Tag.RecordType), stmp[11]);
histag.Circle = long.Parse(stmp[7]);
histag.CompressType = int.Parse(stmp[8]);
histag.Circle = long.Parse(stmp[12]);
histag.CompressType = int.Parse(stmp[13]);
histag.Parameters = new Dictionary<string, double>();
histag.TagType = realtag.Type;
histag.Id = realtag.Id;
for (int i=9;i<stmp.Length;i++)
for (int i=14;i<stmp.Length;i++)
{
string skey = stmp[i];
if(string.IsNullOrEmpty(skey))
......
......@@ -17,6 +17,7 @@ using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Linq;
using Cdy.Tag;
namespace HisDataTools.ViewModel
{
......@@ -155,6 +156,7 @@ namespace HisDataTools.ViewModel
if (mSelectTag != value)
{
mSelectTag = value;
FilterData();
OnPropertyChanged("SelectTag");
}
}
......@@ -562,6 +564,30 @@ namespace HisDataTools.ViewModel
case (byte)Cdy.Tag.TagType.UShort:
ProcessDataQuery<ushort>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.IntPoint:
ProcessDataQuery<IntPointData>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.UIntPoint:
ProcessDataQuery<UIntPointData>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.IntPoint3:
ProcessDataQuery<IntPoint3Data>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.UIntPoint3:
ProcessDataQuery<UIntPoint3Data>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.LongPoint:
ProcessDataQuery<LongPointData>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.ULongPoint:
ProcessDataQuery<ULongPointTag>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.LongPoint3:
ProcessDataQuery<LongPoint3Data>(id, sTime, eTime);
break;
case (byte)Cdy.Tag.TagType.ULongPoint3:
ProcessDataQuery<ULongPoint3Data>(id, sTime, eTime);
break;
}
mIsBusy = false;
}
......@@ -616,12 +642,14 @@ namespace HisDataTools.ViewModel
minx = minx > i ? i : minx;
maxx = maxx < i ? i : maxx;
miny = miny > Convert.ToDouble(value) ? Convert.ToDouble(value) : miny;
maxy = maxy < Convert.ToDouble(value) ? Convert.ToDouble(value) : maxy;
var dtmp = ConvertValue(vv);
miny = miny > dtmp ? dtmp : miny;
maxy = maxy < dtmp ? dtmp : maxy;
PointC point = new PointC();
point.X = i;
point.Y = Convert.ToDouble(value);
point.Y = dtmp;
point.Text = time.ToString("dd HH:mm:ss");
entity.Source.Add(point);
......@@ -654,6 +682,15 @@ namespace HisDataTools.ViewModel
YLineItems = yitems;
}
private double ConvertValue(object value)
{
if((value is UIntPointData)|| (value is IntPointData)|| (value is IntPoint3Data)|| (value is UIntPoint3Data)|| (value is LongPointData) || (value is ULongPointData) || (value is LongPoint3Data) || (value is ULongPoint3Data))
{
return Convert.ToDouble(((dynamic)value).X);
}
return Convert.ToDouble(value);
}
/// <summary>
///
/// </summary>
......@@ -694,12 +731,14 @@ namespace HisDataTools.ViewModel
minx = minx > i ? i : minx;
maxx = maxx < i ? i : maxx;
miny = miny > Convert.ToDouble(value) ? Convert.ToDouble(value) : miny;
maxy =maxy < Convert.ToDouble(value) ? Convert.ToDouble(value) : maxy;
double dtmp = ConvertValue(value);
miny = miny > dtmp ? dtmp : miny;
maxy =maxy < dtmp ? dtmp : maxy;
PointC point = new PointC();
point.X = i;
point.Y = Convert.ToDouble(value);
point.Y = dtmp;
point.Text = time.ToString("dd HH:mm:ss");
entity.Source.Add(point);
......
......@@ -43,7 +43,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{2C1049
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cdy.Tag.Consume", "Cdy.Tag.Consume\Cdy.Tag.Consume.csproj", "{1B99F842-E366-43E8-8FAF-A14A10740B9E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbInRunWebApi", "DbInRunWebApi\DbInRunWebApi.csproj", "{5D7F9E22-D683-4E27-8952-4A36EE8AB123}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbInRunWebApi", "DbInRunWebApi\DbInRunWebApi.csproj", "{5D7F9E22-D683-4E27-8952-4A36EE8AB123}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cdy.Tag.Network", "Cdy.Tag.Network\Cdy.Tag.Network.csproj", "{3B08487A-442F-4ACF-BFC1-7A4EE5FD4AE2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
......@@ -119,6 +121,10 @@ Global
{5D7F9E22-D683-4E27-8952-4A36EE8AB123}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5D7F9E22-D683-4E27-8952-4A36EE8AB123}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5D7F9E22-D683-4E27-8952-4A36EE8AB123}.Release|Any CPU.Build.0 = Release|Any CPU
{3B08487A-442F-4ACF-BFC1-7A4EE5FD4AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B08487A-442F-4ACF-BFC1-7A4EE5FD4AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B08487A-442F-4ACF-BFC1-7A4EE5FD4AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B08487A-442F-4ACF-BFC1-7A4EE5FD4AE2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......@@ -141,6 +147,7 @@ Global
{F6B8840F-9F8C-4194-923F-BCF0BA1D9BF3} = {95F6A9D4-42A9-483A-80F8-EADDD6CEFEDE}
{1B99F842-E366-43E8-8FAF-A14A10740B9E} = {2C104906-798F-4EEB-931C-F01600EA9F7F}
{5D7F9E22-D683-4E27-8952-4A36EE8AB123} = {95F6A9D4-42A9-483A-80F8-EADDD6CEFEDE}
{3B08487A-442F-4ACF-BFC1-7A4EE5FD4AE2} = {2C104906-798F-4EEB-931C-F01600EA9F7F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {577CCEC3-4CDB-458A-B93D-F8579C2C3D8F}
......
......@@ -5,6 +5,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
namespace SimDriver
{
......@@ -19,6 +20,8 @@ namespace SimDriver
private short mNumber = 0;
private bool mBoolNumber = false;
private IRealTagProducter mTagService;
private bool mIsBusy = false;
......@@ -29,6 +32,14 @@ namespace SimDriver
private int mBusyCount = 0;
private bool mIsSecond = false;
private int mTickCount = 0;
private Thread mScanThread;
private bool mIsClosed = false;
#endregion ...Variables...
#region ... Events ...
......@@ -64,7 +75,7 @@ namespace SimDriver
{
get
{
return new string[] { "cos", "sin", "step","steppoint" };
return new string[] { "cos", "sin", "step","steppoint", "square" };
}
}
......@@ -79,6 +90,7 @@ namespace SimDriver
private void Log(string sval)
{
mWriter.WriteLine(sval);
mWriter.Flush();
}
/// <summary>
......@@ -87,7 +99,7 @@ namespace SimDriver
/// <param name="tagQuery"></param>
private void InitTagCach(IRealTagProducter tagQuery)
{
mTagIdCach = tagQuery.GetTagsByLinkAddress(new List<string>() { "Sim:cos", "Sim:sin", "Sim:step", "Sim:steppoint" });
mTagIdCach = tagQuery.GetTagsByLinkAddress(new List<string>() { "Sim:cos", "Sim:sin", "Sim:step", "Sim:steppoint", "Sim:square" });
}
/// <summary>
......@@ -99,12 +111,96 @@ namespace SimDriver
{
mTagService = tagQuery;
InitTagCach(tagQuery);
mScanTimer = new System.Timers.Timer(100);
mScanTimer.Elapsed += MScanTimer_Elapsed;
mScanTimer.Start();
mScanThread = new Thread(ScanThreadPro);
mScanThread.IsBackground = true;
mScanThread.Start();
//mScanTimer = new System.Timers.Timer(100);
//mScanTimer.Elapsed += MScanTimer_Elapsed;
//mScanTimer.Start();
return true;
}
private void ScanThreadPro()
{
while (!mIsClosed)
{
mTickCount++;
DateTime time = DateTime.Now;
if (mTickCount < 5)
{
mIsBusy = false;
Thread.Sleep(100);
continue;
}
else
{
mTickCount = 0;
}
if((mLastProcessTime-time).TotalSeconds>1000)
{
LoggerService.Service.Warn("Sim Driver", "出现阻塞");
}
mLastProcessTime = time;
if (!mIsSecond)
{
mNumber++;
mNumber = mNumber > (short)360 ? (short)0 : mNumber;
mIsSecond = true;
}
else
{
mIsSecond = false;
}
if (mNumber % 100 == 0) mBoolNumber = !mBoolNumber;
double fval = Math.Cos(mNumber / 180.0 * Math.PI);
double sval = Math.Sin(mNumber / 180.0 * Math.PI);
//#if DEBUG
Stopwatch sw = new Stopwatch();
sw.Start();
Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " " + "Sim:step " + mNumber + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//#endif
System.Threading.Tasks.Parallel.ForEach(mTagIdCach, (vv) =>
{
if (vv.Key == "Sim:cos")
{
mTagService.SetTagValue(vv.Value, fval);
}
else if (vv.Key == "Sim:sin")
{
mTagService.SetTagValue(vv.Value, sval);
}
else if (vv.Key == "Sim:step")
{
mTagService.SetTagValue(vv.Value, mNumber);
}
else if (vv.Key == "Sim:steppoint")
{
mTagService.SetPointValue(vv.Value, mNumber, mNumber, mNumber);
}
else if (vv.Key == "Sim:square")
{
mTagService.SetPointValue(vv.Value, mBoolNumber);
}
});
//#if DEBUG
sw.Stop();
LoggerService.Service.Info("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds);
//#endif
Thread.Sleep(100);
}
}
/// <summary>
///
/// </summary>
......@@ -112,50 +208,55 @@ namespace SimDriver
/// <param name="e"></param>
private void MScanTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
mTickCount++;
if (mIsBusy)
{
mBusyCount++;
if(mBusyCount>=10)
LoggerService.Service.Warn("Sim Driver", "出现阻塞");
if (mBusyCount >= 10)
{
mBusyCount = 0;
LoggerService.Service.Warn("Sim Driver", "出现阻塞");
}
return;
}
mBusyCount = 0;
mIsBusy = true;
DateTime time = DateTime.Now;
if ((time - mLastProcessTime).Seconds < 1)
if (mTickCount <5)
{
mIsBusy = false;
return;
}
else
{
mTickCount = 0;
}
mLastProcessTime = time;
if(!mIsSecond)
{
mNumber++;
mNumber = mNumber > (short)360 ? (short)0 : mNumber;
mIsSecond = true;
}
else
{
mIsSecond = false;
}
if (mNumber % 100 == 0) mBoolNumber = !mBoolNumber;
mNumber++;
mNumber = mNumber > (short)360 ? (short)0 : mNumber;
//#if DEBUG
// Stopwatch sw = new Stopwatch();
// sw.Start();
//#endif
double fval = Math.Cos(mNumber / 180.0 * Math.PI);
double sval = Math.Sin(mNumber / 180.0 * Math.PI);
#if DEBUG
Stopwatch sw = new Stopwatch();
sw.Start();
Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " " + "Sim:step " + mNumber + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//foreach (var vv in mTagIdCach)
//{
// if (vv.Key == "Sim:cos")
// {
// mTagService.SetTagValue(vv.Value, fval);
// }
// else if (vv.Key == "Sim:sin")
// {
// mTagService.SetTagValue(vv.Value, sval);
// }
// else if (vv.Key == "Sim:step")
// {
// mTagService.SetTagValue(vv.Value, mNumber);
// }
//}
#endif
System.Threading.Tasks.Parallel.ForEach(mTagIdCach, (vv) =>
{
......@@ -175,13 +276,17 @@ namespace SimDriver
{
mTagService.SetPointValue(vv.Value,mNumber,mNumber,mNumber);
}
else if (vv.Key == "Sim:square")
{
mTagService.SetPointValue(vv.Value, mBoolNumber);
}
});
//#if DEBUG
// sw.Stop();
#if DEBUG
sw.Stop();
// LoggerService.Service.Info("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds + " total count:" + mNumber + " cos:" + Math.Cos(mNumber / 180.0 * Math.PI) + " sin:" + Math.Sin(mNumber / 180.0 * Math.PI));
//#endif
LoggerService.Service.Info("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds + " total count:" + mNumber + " cos:" + Math.Cos(mNumber / 180.0 * Math.PI) + " sin:" + Math.Sin(mNumber / 180.0 * Math.PI));
#endif
mIsBusy = false;
}
......@@ -191,7 +296,9 @@ namespace SimDriver
/// <returns></returns>
public bool Stop()
{
mScanTimer.Stop();
//mScanTimer.Stop();
mIsClosed = true;
// mScanThread.Abort();
mWriter.Close();
return true;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册