@@ -10,6 +10,7 @@ namespace BPASmart.Model | |||||
{ | { | ||||
public string DeviceName { get; set; } | public string DeviceName { get; set; } | ||||
public string RealAddress { get; set; } | public string RealAddress { get; set; } | ||||
public string VarName { get; set; } | |||||
public string Value { get; set; } | public string Value { get; set; } | ||||
public EDataType DataType { get; set; } | public EDataType DataType { get; set; } | ||||
public int Sleep { get; set; } | public int Sleep { get; set; } | ||||
@@ -51,6 +51,7 @@ namespace BPASmartClient.Compiler | |||||
_database = _connection.GetDatabase(0);//默认使用db0 | _database = _connection.GetDatabase(0);//默认使用db0 | ||||
subscibe = _connection.GetSubscriber(); | subscibe = _connection.GetSubscriber(); | ||||
} | } | ||||
int dbi = 0; | |||||
public void Connect(string connection) | public void Connect(string connection) | ||||
{ | { | ||||
_connection = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(connection)); | _connection = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(connection)); | ||||
@@ -58,7 +59,7 @@ namespace BPASmartClient.Compiler | |||||
{ | { | ||||
string[] str=connection.Split(','); | string[] str=connection.Split(','); | ||||
string stro = str.ToList().Find(s => s.Contains("defaultDatabase=")); | string stro = str.ToList().Find(s => s.Contains("defaultDatabase=")); | ||||
int dbi = 0; | |||||
try | try | ||||
{ | { | ||||
dbi=int.Parse(stro.Replace("defaultDatabase=","")); | dbi=int.Parse(stro.Replace("defaultDatabase=","")); | ||||
@@ -72,7 +73,7 @@ namespace BPASmartClient.Compiler | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
_database = _connection.GetDatabase();//默认使用db0 | |||||
_database = _connection.GetDatabase(dbi);//默认使用db0 | |||||
} | } | ||||
subscibe = _connection.GetSubscriber(); | subscibe = _connection.GetSubscriber(); | ||||
} | } | ||||
@@ -89,7 +90,14 @@ namespace BPASmartClient.Compiler | |||||
//获取指定服务器 | //获取指定服务器 | ||||
var server = _connection.GetServer(endPoint); | var server = _connection.GetServer(endPoint); | ||||
//在指定服务器上使用 keys 或者 scan 命令来遍历key | //在指定服务器上使用 keys 或者 scan 命令来遍历key | ||||
foreach (var key in server.Keys(0,"设备列表:*")) | |||||
//foreach (var key in server.Keys(0,"设备列表:*")) | |||||
//{ | |||||
// //获取key对于的值 | |||||
// var val = _database.StringGet(key); | |||||
// Console.WriteLine($"key: {key}, value: {val}"); | |||||
// keys[key] = val; | |||||
//} | |||||
foreach (var key in server.Keys(dbi,"*")) | |||||
{ | { | ||||
//获取key对于的值 | //获取key对于的值 | ||||
var val = _database.StringGet(key); | var val = _database.StringGet(key); | ||||
@@ -28,11 +28,21 @@ namespace BPASmartClient.DATABUS | |||||
/// <summary> | /// <summary> | ||||
/// 设备数据 | /// 设备数据 | ||||
/// </summary> | /// </summary> | ||||
public ConcurrentDictionary<string, Dictionary<string,object>> Dic_DeviceData = new ConcurrentDictionary<string,Dictionary<string,object>>(); | |||||
public ConcurrentDictionary<string, Dictionary<string,DeviceDataModel>> Dic_DeviceData = new ConcurrentDictionary<string,Dictionary<string,DeviceDataModel>>(); | |||||
/// <summary> | /// <summary> | ||||
/// API数据 | /// API数据 | ||||
/// </summary> | /// </summary> | ||||
public ConcurrentDictionary<string,string> Dic_APIData = new ConcurrentDictionary<string,string>(); | public ConcurrentDictionary<string,string> Dic_APIData = new ConcurrentDictionary<string,string>(); | ||||
#endregion | #endregion | ||||
} | } | ||||
public class DeviceDataModel | |||||
{ | |||||
public string VarName { get; set; } | |||||
public string VarVaule { get; set; } | |||||
public string DataType { get; set; } | |||||
} | |||||
} | } |
@@ -570,10 +570,10 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
{ | { | ||||
if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | ||||
{ | { | ||||
Dictionary<string,object> b= Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
Dictionary<string,DeviceDataModel> b= Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
if (b!=null && b.ContainsKey(str[1])) | if (b!=null && b.ContainsKey(str[1])) | ||||
{ | { | ||||
object _value = b[str[1]]; | |||||
object _value = b[str[1]].VarVaule; | |||||
this.GetType().GetProperty(item.Key).SetValue(this,_value); | this.GetType().GetProperty(item.Key).SetValue(this,_value); | ||||
} | } | ||||
} | } | ||||
@@ -1,8 +1,10 @@ | |||||
using BPASmartClient.Compiler; | using BPASmartClient.Compiler; | ||||
using BPASmartClient.DATABUS; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.ComponentModel; | using System.ComponentModel; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Reflection; | |||||
using System.Text; | using System.Text; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using System.Windows; | using System.Windows; | ||||
@@ -16,6 +18,7 @@ using System.Windows.Media.Animation; | |||||
using System.Windows.Media.Imaging; | using System.Windows.Media.Imaging; | ||||
using System.Windows.Navigation; | using System.Windows.Navigation; | ||||
using System.Windows.Shapes; | using System.Windows.Shapes; | ||||
using System.Windows.Threading; | |||||
namespace BPASmartClient.SCADAControl.CustomerControls | namespace BPASmartClient.SCADAControl.CustomerControls | ||||
{ | { | ||||
@@ -40,7 +43,14 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
{ | { | ||||
DefaultStyleKeyProperty.OverrideMetadata(typeof(SwitchButton), new FrameworkPropertyMetadata(typeof(SwitchButton))); | DefaultStyleKeyProperty.OverrideMetadata(typeof(SwitchButton), new FrameworkPropertyMetadata(typeof(SwitchButton))); | ||||
} | } | ||||
[Category("事件")] | |||||
public string Value | |||||
{ | |||||
get { return (string)GetValue(ValueProperty); } | |||||
set { SetValue(ValueProperty,value); } | |||||
} | |||||
public static readonly DependencyProperty ValueProperty = | |||||
DependencyProperty.Register("Value",typeof(string),typeof(SwitchButton),new PropertyMetadata(string.Empty)); | |||||
/// <summary> | /// <summary> | ||||
/// 不勾选时执行代码 | /// 不勾选时执行代码 | ||||
/// </summary> | /// </summary> | ||||
@@ -64,7 +74,14 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
} | } | ||||
public static readonly DependencyProperty CheckedExecProperty = | public static readonly DependencyProperty CheckedExecProperty = | ||||
DependencyProperty.Register("CheckedExec", typeof(string), typeof(SwitchButton), new PropertyMetadata(string.Empty)); | DependencyProperty.Register("CheckedExec", typeof(string), typeof(SwitchButton), new PropertyMetadata(string.Empty)); | ||||
[Category("数据绑定-数据来源")] | |||||
public int TimeCount | |||||
{ | |||||
get { return (int)GetValue(TimeCountProperty); } | |||||
set { SetValue(TimeCountProperty,value); } | |||||
} | |||||
public static readonly DependencyProperty TimeCountProperty = | |||||
DependencyProperty.Register("TimeCount",typeof(int),typeof(SwitchButton),new PropertyMetadata(5)); | |||||
protected override void OnRender(DrawingContext drawingContext) | protected override void OnRender(DrawingContext drawingContext) | ||||
{ | { | ||||
base.OnRender(drawingContext); | base.OnRender(drawingContext); | ||||
@@ -128,12 +145,73 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 属性刷新器 | |||||
/// </summary> | |||||
DispatcherTimer timer = new DispatcherTimer(); | |||||
/// <summary> | |||||
/// 属性绑定变量集合 | |||||
/// </summary> | |||||
Dictionary<string,string> propertyBing = new Dictionary<string,string>(); | |||||
public void Register() | public void Register() | ||||
{ | { | ||||
PropertyInfo[] propertyInfos = this.GetType().GetProperties(); | |||||
foreach (PropertyInfo propertyInfo in propertyInfos) | |||||
{ | |||||
var propName = propertyInfo?.GetValue(this,null); | |||||
if (propName is string && propName != null && propName.ToString().Contains("Binding ") && propName.ToString().Contains(".")) | |||||
{ | |||||
propertyBing[propertyInfo.Name] = propName.ToString(); | |||||
} | |||||
} | |||||
timer.Interval = TimeSpan.FromMilliseconds(TimeCount); | |||||
timer.Tick += Timer_Tick; ; | |||||
timer.Start(); | |||||
Checked += TheCheckBox_Checked; | Checked += TheCheckBox_Checked; | ||||
Unchecked += TheCheckBox_Unchecked; | Unchecked += TheCheckBox_Unchecked; | ||||
} | } | ||||
/// <summary> | |||||
/// 属性刷新事件 | |||||
/// </summary> | |||||
/// <param name="sender"></param> | |||||
/// <param name="e"></param> | |||||
private void Timer_Tick(object? sender,EventArgs e) | |||||
{ | |||||
try | |||||
{ | |||||
foreach (var item in propertyBing) | |||||
{ | |||||
//{Binding 测试设备.VAR_A_2} | |||||
string[] str = item.Value.Replace("{Binding ","").Replace("}","").Split("."); | |||||
if (str.Length > 1) | |||||
{ | |||||
if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | |||||
{ | |||||
Dictionary<string,DeviceDataModel> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
if (b != null && b.ContainsKey(str[1])) | |||||
{ | |||||
object _value = b[str[1]].VarVaule; | |||||
bool _checked = false; | |||||
try | |||||
{ | |||||
_checked = bool.Parse(_value.ToString()); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
_checked = false; | |||||
} | |||||
this.GetType().GetProperty("IsChecked").SetValue(this,_checked); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
} | |||||
} | |||||
private void TheCheckBox_Unchecked(object sender, RoutedEventArgs e) | private void TheCheckBox_Unchecked(object sender, RoutedEventArgs e) | ||||
{ | { | ||||
Config.GetInstance().RunJsScipt(UnCheckedExec); | Config.GetInstance().RunJsScipt(UnCheckedExec); | ||||
@@ -3,7 +3,6 @@ | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | ||||
xmlns:local="clr-namespace:BPASmartClient.SCADAControl" | |||||
mc:Ignorable="d" | mc:Ignorable="d" | ||||
d:DesignHeight="450" d:DesignWidth="800"> | d:DesignHeight="450" d:DesignWidth="800"> | ||||
</Button> | </Button> |
@@ -48,7 +48,6 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
isExecuteState = value; | isExecuteState = value; | ||||
if (IsExecuteState) | if (IsExecuteState) | ||||
{ | { | ||||
Style = null; | |||||
Register(); | Register(); | ||||
} | } | ||||
} | } | ||||
@@ -124,10 +123,10 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
{ | { | ||||
if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | ||||
{ | { | ||||
Dictionary<string,object> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
Dictionary<string,DeviceDataModel> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
if (b != null && b.ContainsKey(str[1])) | if (b != null && b.ContainsKey(str[1])) | ||||
{ | { | ||||
object _value = b[str[1]]; | |||||
object _value = b[str[1]].VarVaule; | |||||
this.GetType().GetProperty(item.Key).SetValue(this,_value); | this.GetType().GetProperty(item.Key).SetValue(this,_value); | ||||
} | } | ||||
} | } | ||||
@@ -47,7 +47,6 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
{ | { | ||||
foreach (Image tb in FindVisualChildren<Image>(this)) | foreach (Image tb in FindVisualChildren<Image>(this)) | ||||
{ | { | ||||
// do something with tb here | |||||
if (tb.Tag != null) | if (tb.Tag != null) | ||||
{ | { | ||||
if (tb.Tag.ToString() == "正常") | if (tb.Tag.ToString() == "正常") | ||||
@@ -69,7 +68,6 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
foreach (TextBlock tb in FindVisualChildren<TextBlock>(this)) | foreach (TextBlock tb in FindVisualChildren<TextBlock>(this)) | ||||
{ | { | ||||
// do something with tb here | |||||
if (tb.Tag != null) | if (tb.Tag != null) | ||||
{ | { | ||||
if (tb.Tag.ToString() == "显示文字") | if (tb.Tag.ToString() == "显示文字") | ||||
@@ -159,17 +157,38 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
} | } | ||||
if (Direction == 1) //定时读取数据 | if (Direction == 1) //定时读取数据 | ||||
{ | { | ||||
if (!string.IsNullOrEmpty(DeviceName)) | |||||
try | |||||
{ | { | ||||
RedisValue obj = fRedisClient.RedisGet(DeviceName); | |||||
FDataSouce = obj.ToString(); | |||||
List<ReeisDataModel> str = JsonConvert.DeserializeObject<List<ReeisDataModel>>(FDataSouce); | |||||
Dictionary<string,object> keys=new Dictionary<string, object>(); | |||||
str?.ForEach(par => | |||||
if (!string.IsNullOrEmpty(DeviceName)) | |||||
{ | |||||
RedisValue obj = fRedisClient.RedisGet(DeviceName); | |||||
List<DeviceDataModel> str = JsonConvert.DeserializeObject<List<DeviceDataModel>>(obj.ToString()); | |||||
Dictionary<string,DeviceDataModel> keys = new Dictionary<string,DeviceDataModel>(); | |||||
str?.ForEach(par => | |||||
{ | |||||
keys[par.VarName] = par; | |||||
}); | |||||
Class_DataBus.GetInstance().Dic_DeviceData[DeviceName] = keys; | |||||
if (PropertyChange != null) PropertyChange(this,null); | |||||
} | |||||
else | |||||
{ | { | ||||
keys[par.VarName] = par.VarVaule; | |||||
}); | |||||
Class_DataBus.GetInstance().Dic_DeviceData[DeviceName] = keys; | |||||
fRedisClient.GetKeys()?.ToList().ForEach(par => { | |||||
List<DeviceDataModel> str = JsonConvert.DeserializeObject<List<DeviceDataModel>>(par.Value); | |||||
Dictionary<string,DeviceDataModel> keys = new Dictionary<string,DeviceDataModel>(); | |||||
str?.ForEach(par => | |||||
{ | |||||
keys[par.VarName] = par; | |||||
}); | |||||
Class_DataBus.GetInstance().Dic_DeviceData[par.Key] = keys; | |||||
}); | |||||
if (PropertyChange != null) PropertyChange(this,null); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -284,10 +303,7 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
if (!string.IsNullOrEmpty(FDataSouce)) | if (!string.IsNullOrEmpty(FDataSouce)) | ||||
{ | { | ||||
GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(Code,new object[] { FDataSouce }); | GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(Code,new object[] { FDataSouce }); | ||||
if (PropertyChange != null) | |||||
{ | |||||
PropertyChange(this,null); | |||||
} | |||||
} | } | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
@@ -108,10 +108,10 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
{ | { | ||||
if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | ||||
{ | { | ||||
Dictionary<string,object> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
Dictionary<string,DeviceDataModel> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
if (b != null && b.ContainsKey(str[1])) | if (b != null && b.ContainsKey(str[1])) | ||||
{ | { | ||||
object _value = b[str[1]]; | |||||
object _value = b[str[1]].VarVaule; | |||||
this.GetType().GetProperty(item.Key).SetValue(this,_value); | this.GetType().GetProperty(item.Key).SetValue(this,_value); | ||||
} | } | ||||
} | } | ||||
@@ -35,17 +35,9 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
ResourceDictionary languageResDic = new ResourceDictionary(); | ResourceDictionary languageResDic = new ResourceDictionary(); | ||||
languageResDic.Source = new Uri(@"/BPASmartClient.SCADAControl;component/Themes/Generic.xaml",UriKind.RelativeOrAbsolute); | languageResDic.Source = new Uri(@"/BPASmartClient.SCADAControl;component/Themes/Generic.xaml",UriKind.RelativeOrAbsolute); | ||||
this.Resources.MergedDictionaries.Add(languageResDic); | this.Resources.MergedDictionaries.Add(languageResDic); | ||||
Text = "0.01"; | |||||
//VerticalContentAlignment = VerticalAlignment.Center; | |||||
//Style = Application.Current.Resources["DesignTheTextBox"] as Style;//FindResource("DesignTheTextBox") as Style; | |||||
//Focusable = false; | |||||
Height = 30; | Height = 30; | ||||
Width = 80; | Width = 80; | ||||
FontSize = 16; | FontSize = 16; | ||||
//HorizontalAlignment = HorizontalAlignment.Left; | |||||
//VerticalAlignment = VerticalAlignment.Center; | |||||
//Foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#a2c2e8")); | |||||
//BorderThickness=new Thickness(1); | |||||
} | } | ||||
public string ControlType => "控件"; | public string ControlType => "控件"; | ||||
@@ -122,10 +114,10 @@ namespace BPASmartClient.SCADAControl.CustomerControls | |||||
{ | { | ||||
if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0])) | ||||
{ | { | ||||
Dictionary<string,object> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
Dictionary<string,DeviceDataModel> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]]; | |||||
if (b != null && b.ContainsKey(str[1])) | if (b != null && b.ContainsKey(str[1])) | ||||
{ | { | ||||
object _value = b[str[1]]; | |||||
object _value = b[str[1]].VarVaule; | |||||
this.GetType().GetProperty(item.Key).SetValue(this,_value); | this.GetType().GetProperty(item.Key).SetValue(this,_value); | ||||
} | } | ||||
} | } | ||||
@@ -40,13 +40,14 @@ namespace SCADA.Test | |||||
/// 接收消息集合 | /// 接收消息集合 | ||||
/// </summary> | /// </summary> | ||||
List<EventReceiveMessage> eventReceiveMessages = new List<EventReceiveMessage>(); | List<EventReceiveMessage> eventReceiveMessages = new List<EventReceiveMessage>(); | ||||
FRedisClient fRedisClient = new FRedisClient(); | |||||
public MainWindow() | public MainWindow() | ||||
{ | { | ||||
InitializeComponent(); | InitializeComponent(); | ||||
RedisHelper.GetInstance.ConnectAsync(String.Empty); | |||||
fRedisClient.Connect("124.222.238.75:16000,password=123456,defaultDatabase=1"); | |||||
Dictionary<string,string> sdsd= fRedisClient.GetKeys(); | |||||
string _code = " public string main(string message) \n { \n //请在此填写你的代码\n\n return message; \n }\n"; | string _code = " public string main(string message) \n { \n //请在此填写你的代码\n\n return message; \n }\n"; | ||||
string GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(_code,new object[] { "ERERERERE" }); | string GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(_code,new object[] { "ERERERERE" }); | ||||