Browse Source

三代机框架搭建

master
pry 2 years ago
parent
commit
921c32d139
49 changed files with 2470 additions and 141 deletions
  1. +56
    -51
      HBLConsole.Business/Devices/MORKS.cs
  2. +21
    -0
      HBLConsole.Business/MessageServer/Base.cs
  3. +0
    -2
      HBLConsole.GVL/CircuitAttribute.cs
  4. +1
    -0
      HBLConsole.GVL/MORKS.cs
  5. +13
    -0
      HBLConsole.Interface/IDeviceType.cs
  6. +16
    -0
      HBLConsole.Model/CommunicationPar/CommunicationPar.cs
  7. +58
    -0
      HBLConsole.Model/CommunicationPar/CommunicationSet.cs
  8. +50
    -0
      HBLConsole.Model/CommunicationPar/ModbusRtu.cs
  9. +19
    -0
      HBLConsole.Model/CommunicationPar/ModbusTcp.cs
  10. +45
    -0
      HBLConsole.Model/CommunicationPar/Siemens.cs
  11. +14
    -0
      HBLConsole.Model/DeviceManagermentResult.cs
  12. +15
    -0
      HBLConsole.Model/Enums/DisplayFormat.cs
  13. +29
    -0
      HBLConsole.Model/Enums/EAlarmType.cs
  14. +24
    -0
      HBLConsole.Model/Enums/EAlongTriggerType.cs
  15. +19
    -0
      HBLConsole.Model/Enums/EAnalogAlarmType.cs
  16. +22
    -0
      HBLConsole.Model/Enums/EDataType.cs
  17. +16
    -0
      HBLConsole.Model/Enums/EDeviceType.cs
  18. +39
    -0
      HBLConsole.Model/Enums/EOperatorType.cs
  19. +15
    -0
      HBLConsole.Model/Enums/EParity.cs
  20. +16
    -0
      HBLConsole.Model/Enums/ESiemensPlcType.cs
  21. +5
    -0
      HBLConsole.Model/HBLConsole.Model.csproj
  22. +41
    -0
      HBLConsole.Model/SerialDeviceBase.cs
  23. +2
    -1
      HBLConsole.Model/SimOrderData.cs
  24. +21
    -0
      HBLConsole.Model/TcpDeviceBase.cs
  25. +17
    -0
      HBLConsole.Model/UniversalBase.cs
  26. +0
    -34
      HBLConsole.PryUserControl/BeveledButton.xaml
  27. +20
    -0
      HBLConsole.PryUserControl/Quadrilateral.xaml
  28. +96
    -0
      HBLConsole.PryUserControl/Quadrilateral.xaml.cs
  29. +27
    -0
      HBLConsole.PryUserControl/TitleTextBlock.xaml
  30. +38
    -0
      HBLConsole.PryUserControl/TitleTextBlock.xaml.cs
  31. +12
    -1
      HBLConsole.Service/ActionManagerment.cs
  32. +12
    -0
      HBLConsole.Service/Json.cs
  33. +1
    -1
      HBLConsole/App.config
  34. +32
    -0
      HBLConsole/Converter/VisibleConvert.cs
  35. +196
    -0
      HBLConsole/DialogWindow/View/DeviceManagermentSetView.xaml
  36. +84
    -0
      HBLConsole/DialogWindow/View/DeviceManagermentSetView.xaml.cs
  37. +68
    -0
      HBLConsole/DialogWindow/ViewModel/DeviceManagermentSetViewModel.cs
  38. +0
    -6
      HBLConsole/HBLConsole.csproj
  39. BIN
     
  40. +464
    -1
      HBLConsole/Resources/ResourceDictionarys/BasicStyle.xaml
  41. +16
    -24
      HBLConsole/View/DebugView.xaml
  42. +489
    -0
      HBLConsole/View/DeviceManageView.xaml
  43. +28
    -0
      HBLConsole/View/DeviceManageView.xaml.cs
  44. +11
    -3
      HBLConsole/View/MainView.xaml
  45. +12
    -0
      HBLConsole/View/ProcessMonitoringView.xaml
  46. +28
    -0
      HBLConsole/View/ProcessMonitoringView.xaml.cs
  47. +7
    -17
      HBLConsole/ViewModel/DebugViewModel.cs
  48. +132
    -0
      HBLConsole/ViewModel/DeviceManageViewModel.cs
  49. +123
    -0
      HBLConsole/ViewModel/ProcessMonitoringViewModel.cs

+ 56
- 51
HBLConsole.Business/Devices/MORKS.cs View File

@@ -24,25 +24,6 @@ namespace HBLConsole.Business.Devices

public GVL.MORKS mORKS { get; set; } = new GVL.MORKS();

/// <summary>
/// 写入配方数据到 PLC
/// </summary>
private void WriteRecipeBoms()
{
List<ushort> recipeBoms = new List<ushort>();
foreach (var item in Json<BatchingInfoPar>.GetInstance.Base.recipeBoms.RecipeIds)
{
foreach (var rec in item.Recipes)
{
recipeBoms.Add((ushort)rec);
}
}
if (ModbusTcpHelper.GetInstance.Write(1100, WriteType.HoldingRegisters, recipeBoms.ToArray()))
{
MessageLog.GetInstance.Show("成功写入配方数据");
}
}

public void Init()
{
//Modbus TCP连接成功
@@ -60,9 +41,7 @@ namespace HBLConsole.Business.Devices

//Modbus Tcp 连接
//ModbusTcpHelper.GetInstance.ModbusTcpConnect("192.168.1.11", 508);
// ModbusTcpHelper.GetInstance.ModbusTcpConnect("127.0.0.1");
// Action action;
//action.inv
ModbusTcpHelper.GetInstance.ModbusTcpConnect("127.0.0.1");

//模拟订单
SimOrder();
@@ -73,6 +52,9 @@ namespace HBLConsole.Business.Devices

List<BatchingInfo> batchingInfos = new List<BatchingInfo>();

/// <summary>
/// 心跳状态
/// </summary>
private void Heartbeat()
{
HeartbeatReport.GetInstance.GetMessage = new Action(() =>
@@ -225,24 +207,21 @@ namespace HBLConsole.Business.Devices
if (o is SimOrderData simOrderData)
{
string subId = Guid.NewGuid().ToString();
if (simOrderData.IsEnableRandom)
{
if (simOrderData.NoodleIsEnableRandom)
NoodleLoc = (ushort)(new Random().Next(1, 6));
BowlLoc = (ushort)(new Random().Next(10, 12));
}
else
{
NoodleLoc = (ushort)simOrderData.NoodleLoc;
BowlLoc = (ushort)simOrderData.BowlLoc;
}


if (simOrderData.BowlIsEnableRandom)
BowlLoc = (ushort)(new Random().Next(10, 12));
else
BowlLoc = (ushort)simOrderData.BowlLoc;
mORKS.RBTakeNoodleTask.Enqueue(new GVL.OrderLocInfo() { Loc = NoodleLoc, SuborderId = subId });
mORKS.TakeBowlTask.Enqueue(new GVL.OrderLocInfo() { Loc = BowlLoc, SuborderId = subId });
MessageLog.GetInstance.Show($"添加订单:面条位置【{NoodleLoc}】,碗位置【{BowlLoc}】");
}
}


}), "SimOrder");
}

@@ -311,12 +290,10 @@ namespace HBLConsole.Business.Devices
{
mORKS.AllowRun = mORKS.InitComplete && !mORKS.TemperatureReached;

if (mORKS.AllowRun)
{
TakeBowlTask();
TakeBowlTask();
TakeNoodleTask();

TakeNoodleTask();
}
OutNoodleTask();

SingleDetect();
@@ -333,7 +310,7 @@ namespace HBLConsole.Business.Devices
/// </summary>
private void TakeBowlTask()
{
if (mORKS.TakeBowlTask.Count > 0 && !mORKS.TakeBowlIdle && !mORKS.TakeBowlInterlock)
if (mORKS.AllowRun && mORKS.TakeBowlTask.Count > 0 && !mORKS.TakeBowlIdle && !mORKS.TakeBowlInterlock)
{
if (mORKS.TakeBowlTask.TryDequeue(out GVL.OrderLocInfo orderLocInfo))
{
@@ -398,25 +375,30 @@ namespace HBLConsole.Business.Devices
private void TakeNoodleTask()
{
//取面控制
if (mORKS.RobotIdle && !mORKS.RobotTaskInterlock && mORKS.AllowTakeNoodle && mORKS.TurntableMoveInPlace && !mORKS.TakeNoodleInterlock && !mORKS.OutNoodleing && mORKS.RBTakeNoodleTask.Count > 0)
if (mORKS.AllowRun && mORKS.RobotIdle && !mORKS.RobotTaskInterlock && mORKS.AllowTakeNoodle && mORKS.TurntableMoveInPlace && !mORKS.TakeNoodleInterlock && !mORKS.OutNoodleing && mORKS.RBTakeNoodleTask.Count > 0)
{
if (mORKS.RBTakeNoodleTask.TryDequeue(out GVL.OrderLocInfo orderLocInfo))
int loc = Array.FindIndex(mORKS.NoodleCookerStatus, p => p == false);//查找煮面炉空闲位置
if (loc >= 0 && loc <= 5)
{
//设置转台位置
SetTurntableLoc(orderLocInfo.Loc);
//设置倒面位置
int loc = Array.FindIndex(mORKS.NoodleCookerStatus, p => p == false);//查找煮面炉空闲位置
if (loc >= 0 && loc <= 5)
if (mORKS.RBTakeNoodleTask.TryDequeue(out GVL.OrderLocInfo orderLocInfo))
{
//设置转台位置
SetTurntableLoc(orderLocInfo.Loc);
//设置倒面位置

//if (loc >= 0 && loc <= 5)
//{
CookNodelId[loc] = orderLocInfo.SuborderId;
SetFallNoodleLoc((ushort)(loc + 1));
//}
//机器人开始取面
RobotTakeNoodle();
SimpleFactory.GetInstance.OrderChanged(orderLocInfo.SuborderId, ORDER_STATUS.COOKING);
MessageLog.GetInstance.Show($"订单【{orderLocInfo.SuborderId}】,转台:[{orderLocInfo}],煮面栏:[{loc + 1}]");
mORKS.TakeNoodleInterlock = true;
}
//机器人开始取面
RobotTakeNoodle();
SimpleFactory.GetInstance.OrderChanged(orderLocInfo.SuborderId, ORDER_STATUS.COOKING);
MessageLog.GetInstance.Show($"订单【{orderLocInfo.SuborderId}】,转台:[{orderLocInfo}],煮面栏:[{loc + 1}]");
mORKS.TakeNoodleInterlock = true;
}

}
}

@@ -500,11 +482,33 @@ namespace HBLConsole.Business.Devices
int OutMealRequstCount = mORKS.CookNoodlesComplete.Where(p => p == true).ToList().Count;
int mlCount = mORKS.NoodleCookerStatus.Where(p => p == true).ToList().Count;
mORKS.RobotTaskInterlock = OutMealRequstCount > 0 && mORKS.AllowFallNoodle && (mlCount >= 2 || mORKS.RBTakeNoodleTask.Count == 0);

}


#region PLC 控制函数

/// <summary>
/// 写入配方数据到 PLC
/// </summary>
private void WriteRecipeBoms()
{
List<ushort> recipeBoms = new List<ushort>();
foreach (var item in Json<BatchingInfoPar>.GetInstance.Base.recipeBoms.RecipeIds)
{
foreach (var rec in item.Recipes)
{
recipeBoms.Add((ushort)rec);
}
}
if (recipeBoms.Count > 0)
{
if (ModbusTcpHelper.GetInstance.Write(1100, WriteType.HoldingRegisters, recipeBoms.ToArray()))
{
MessageLog.GetInstance.Show("成功写入配方数据");
}
}
}

/// <summary>
/// 转台移动
/// </summary>
@@ -531,8 +535,9 @@ namespace HBLConsole.Business.Devices
{
ushort addRess = (ushort)(1136 + num - 1);
ModbusTcpHelper.GetInstance.Write(addRess, WriteType.Coils, false);
MessageLog.GetInstance.Show($"{num}号煮面口占用复位");
}
MessageLog.GetInstance.Show($"{num}号煮面口占用复位");
}

/// <summary>


+ 21
- 0
HBLConsole.Business/MessageServer/Base.cs View File

@@ -32,15 +32,25 @@ namespace HBLConsole.Business.MessageServer
}
}

/// <summary>
/// 接收来自MQTT 推送的物料信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="batchingInfo"></param>
public override void GetBatchingInfo<T>(T batchingInfo)
{
if (batchingInfo == null) return;
if (batchingInfo is OrderMaterialDelivery BatchingInfos)
{
Json<BatchingInfoPar>.GetInstance.Base.orderMaterialDelivery = BatchingInfos;
MessageLog.GetInstance.Show("收到推送的物料信息");
}
}

/// <summary>
/// 通过接口获取物料信息
/// </summary>
/// <param name="ClientId"></param>
public override void GetBatchingInfo(int ClientId)
{
string result = string.Empty;
@@ -64,6 +74,11 @@ namespace HBLConsole.Business.MessageServer
});
}

/// <summary>
/// 接收MQTT 推送过来的辅料信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="recipeBomInfo"></param>
public override void GetRecipeBom<T>(T recipeBomInfo)
{
if (recipeBomInfo == null) return;
@@ -74,6 +89,12 @@ namespace HBLConsole.Business.MessageServer
MessageLog.GetInstance.Show("接收到辅料信息");
}

/// <summary>
/// 订单状态改变
/// </summary>
/// <param name="subOrderId"></param>
/// <param name="status"></param>
/// <returns></returns>
public override bool OrderStatusChange(string subOrderId, ORDER_STATUS status)
{
string result = string.Empty;


+ 0
- 2
HBLConsole.GVL/CircuitAttribute.cs View File

@@ -55,8 +55,6 @@ namespace HBLConsole.GVL
{
ProcessData.GetInstance.Conditions[item].Add(new Condition() { propertyIllustrate = propertyIllustrate });
}


}
}



+ 1
- 0
HBLConsole.GVL/MORKS.cs View File

@@ -39,6 +39,7 @@ namespace HBLConsole.GVL
/// <summary>
/// 允许运行
/// </summary>
[Circuit(new string[] { "机器人取面", "取碗控制" }, "允许运行")]
public bool AllowRun { get; set; }

/// <summary>


+ 13
- 0
HBLConsole.Interface/IDeviceType.cs View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Interface
{
public interface IDeviceType
{
//void Init();
}
}

+ 16
- 0
HBLConsole.Model/CommunicationPar/CommunicationPar.cs View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
/// <summary>
/// 通讯参数
/// </summary>
public class CommunicationPar
{
public List<CommunicationSet> communicationSets = new List<CommunicationSet>();
}
}

+ 58
- 0
HBLConsole.Model/CommunicationPar/CommunicationSet.cs View File

@@ -0,0 +1,58 @@
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HBLConsole.Interface;


namespace HBLConsole.Model
{
public class CommunicationSet : ObservableObject
{
public CommunicationSet()
{
RemoveCommand = new RelayCommand<object>((o) => { if (RemoveAction != null) RemoveAction(o); });
}

public Action<object> RemoveAction { get; set; }


public IDeviceType Device { get { return _mDevice; } set { _mDevice = value; OnPropertyChanged(); } }
private IDeviceType _mDevice;


//public Siemens CommSiemens { get { return _mCommSiemens; } set { _mCommSiemens = value; OnPropertyChanged(); } }
//private Siemens _mCommSiemens;

//public ModbusTcp CommModbusTcp { get { return _mCommModbusTcp; } set { _mCommModbusTcp = value; OnPropertyChanged(); } }
//private ModbusTcp _mCommModbusTcp;

//public ModbusRtu CommModbusRtu { get { return _mCommModbusRtu; } set { _mCommModbusRtu = value; OnPropertyChanged(); } }
//private ModbusRtu _mCommModbusRtu;

/// <summary>
/// 是否激活
/// </summary>
public bool IsActive { get { return _mIsActive; } set { _mIsActive = value; OnPropertyChanged(); } }
private bool _mIsActive = true;

/// <summary>
/// 新增设备名称
/// </summary>
public string DeviceName { get { return _mDeviceName; } set { _mDeviceName = value; OnPropertyChanged(); } }
private string _mDeviceName;

/// <summary>
/// 设备类型
/// </summary>
public EDeviceType deviceType { get { return _mdeviceType; } set { _mdeviceType = value; OnPropertyChanged(); } }
private EDeviceType _mdeviceType;



public RelayCommand<object> RemoveCommand { get; set; }
}
}

+ 50
- 0
HBLConsole.Model/CommunicationPar/ModbusRtu.cs View File

@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.IO.Ports;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public class ModbusRtu : SerialDeviceBase
{
public ModbusRtu()
{
Init();
}

public ObservableCollection<string> Ports { get; set; } = new ObservableCollection<string>();

public ObservableCollection<string> BaudRates { get; set; } = new ObservableCollection<string>();

public ObservableCollection<string> Paritys { get; set; } = new ObservableCollection<string>();

private void Init()
{
Ports.Clear();
foreach (var item in SerialPort.GetPortNames())
{
Ports.Add(item);
}


BaudRates.Clear();
BaudRates.Add("110");
int initValue = 300;
for (int i = 0; i < 17; i++)
{
BaudRates.Add(initValue.ToString());
initValue *= 2;
}


Paritys.Clear();
foreach (var item in Enum.GetNames(typeof(EParity)))
{
Paritys.Add(item);
}
}
}
}

+ 19
- 0
HBLConsole.Model/CommunicationPar/ModbusTcp.cs View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace HBLConsole.Model
{
public class ModbusTcp : TcpDeviceBase
{
/// <summary>
/// 站号,默认为 1
/// </summary>
public int StationNo { get; set; } = 1;


}
}

+ 45
- 0
HBLConsole.Model/CommunicationPar/Siemens.cs View File

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public class Siemens : TcpDeviceBase
{
public Siemens()
{
Init();
}

/// <summary>
/// 插槽号
/// </summary>
public int Slot { get; set; } = 0;

/// <summary>
/// 机架号
/// </summary>
public int Rack { get; set; } = 0;

/// <summary>
/// PLC 类型
/// </summary>
public string PlcType { get; set; }

public ObservableCollection<string> PlcTypes { get; set; } = new ObservableCollection<string>();

private void Init()
{
PlcTypes.Clear();
foreach (var item in Enum.GetNames(typeof(ESiemensPlcType)))
{
PlcTypes.Add(item.Substring(1));
}
}


}
}

+ 14
- 0
HBLConsole.Model/DeviceManagermentResult.cs View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public class DeviceManagermentResult
{
public string DeviceType { get; set; }
public string DeviceName { get; set; }
}
}

+ 15
- 0
HBLConsole.Model/Enums/DisplayFormat.cs View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
internal enum DisplayFormat
{
二进制,
十进制,
十六进制,
}
}

+ 29
- 0
HBLConsole.Model/Enums/EAlarmType.cs View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
/// <summary>
/// 报警类型
/// </summary>
public enum EAlarmType
{
/// <summary>
/// 无报警
/// </summary>
无 = 1,

/// <summary>
/// 模拟量报警
/// </summary>
模拟量报警 = 2,

/// <summary>
/// 离散量报警
/// </summary>
离散量报警 = 3
}
}

+ 24
- 0
HBLConsole.Model/Enums/EAlongTriggerType.cs View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
/// <summary>
/// 沿触发类型枚举
/// </summary>
public enum EAlongTriggerType
{
/// <summary>
/// 下降沿触发
/// </summary>
下降沿 = 1,
/// <summary>
/// 上升沿触发
/// </summary>
上升沿 = 2
}

}

+ 19
- 0
HBLConsole.Model/Enums/EAnalogAlarmType.cs View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
/// <summary>
/// 模拟量报警类型
/// </summary>
public enum EAnalogAlarmType
{
高高报警 = 1,
高报警 = 2,
低报警 = 3,
低低报警 = 4,
}
}

+ 22
- 0
HBLConsole.Model/Enums/EDataType.cs View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
/// <summary>
/// 数据类型枚举
/// </summary>
public enum EDataType
{
Bool = 1,
Byte = 2,
Int = 3,
Word = 4,
Dint = 5,
Dword = 6,
Float = 7
}
}

+ 16
- 0
HBLConsole.Model/Enums/EDeviceType.cs View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public enum EDeviceType
{
Siemens,
ModbusRtu,
ModbusTcp,
SerialPort,
}
}

+ 39
- 0
HBLConsole.Model/Enums/EOperatorType.cs View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
/// <summary>
/// 判断操作符枚举
/// </summary>
public enum EOperatorType
{
/// <summary>
/// 大于
/// </summary>
P_GT = 1,
/// <summary>
/// 大于等于
/// </summary>
P_GE = 2,
/// <summary>
/// 等于
/// </summary>
P_EQ = 3,
/// <summary>
/// 不等于
/// </summary>
P_NE = 4,
/// <summary>
/// 小于
/// </summary>
P_LT = 5,
/// <summary>
/// 小于等于
/// </summary>
P_LE = 6
}
}

+ 15
- 0
HBLConsole.Model/Enums/EParity.cs View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public enum EParity
{
无,
奇校验,
偶校验
}
}

+ 16
- 0
HBLConsole.Model/Enums/ESiemensPlcType.cs View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public enum ESiemensPlcType
{
S1200,
S1500,
S300_400,
S200_Smart
}
}

+ 5
- 0
HBLConsole.Model/HBLConsole.Model.csproj View File

@@ -6,6 +6,11 @@

<ItemGroup>
<PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" />
<PackageReference Include="System.IO.Ports" Version="6.0.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\HBLConsole.Interface\HBLConsole.Interface.csproj" />
</ItemGroup>

<ItemGroup>


+ 41
- 0
HBLConsole.Model/SerialDeviceBase.cs View File

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public class SerialDeviceBase : UniversalBase
{
/// <summary>
/// 串口端口
/// </summary>
public string ComSerialPort { get; set; }

/// <summary>
/// 波特率,110,300--115200(从300开始乘以2,直到结果等于115200)
/// </summary>
public string BaudRate { get; set; } = "9600";

/// <summary>
/// 数据位,默认为 8
/// </summary>
public int DataBit { get; set; } = 8;

/// <summary>
/// 停止位,默认为 1
/// </summary>
public int StopBit { get; set; } = 1;

/// <summary>
/// 站号,默认为 1
/// </summary>
public int StationNo { get; set; } = 1;

/// <summary>
/// 奇偶校验,无,奇校验,偶校验
/// </summary>
public string Parity { get; set; }
}
}

+ 2
- 1
HBLConsole.Model/SimOrderData.cs View File

@@ -10,6 +10,7 @@ namespace HBLConsole.Model
{
public int NoodleLoc { get; set; }
public int BowlLoc { get; set; }
public bool IsEnableRandom { get; set; }
public bool NoodleIsEnableRandom { get; set; }
public bool BowlIsEnableRandom { get; set; }
}
}

+ 21
- 0
HBLConsole.Model/TcpDeviceBase.cs View File

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HBLConsole.Model
{
public class TcpDeviceBase : UniversalBase
{
/// <summary>
/// IP地址
/// </summary>
public string IP { get; set; } = "192.168.0.1";

/// <summary>
/// 端口号,默认 102
/// </summary>
public int PortNum { get; set; } = 102;
}
}

+ 17
- 0
HBLConsole.Model/UniversalBase.cs View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HBLConsole.Interface;

namespace HBLConsole.Model
{
public class UniversalBase : IDeviceType
{
/// <summary>
/// 显示/隐藏设置
/// </summary>
public bool IsVisible { get; set; } = true;
}
}

+ 0
- 34
HBLConsole.PryUserControl/BeveledButton.xaml View File

@@ -8,40 +8,6 @@
d:DesignHeight="30"
d:DesignWidth="100"
mc:Ignorable="d">

<!--<UserControl.Resources>
<Style x:Key="BeveledButtonStyle" TargetType="Button">
<Setter Property="FontFamily" Value="楷体" />
<Setter Property="Width" Value="100" />
<Setter Property="FontSize" Value="18" />
<Setter Property="Foreground" Value="Aqua" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="gr">
<ContentControl
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
<Polygon
x:Name="poly"
Points="0 0,80 0,100 30,20 30"
Stroke="#FF34F7F7"
StrokeThickness="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="poly" Property="Fill" Value="#2234F7F7" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>

</Style>
</UserControl.Resources>-->

<Grid>
<Canvas
Name="canvas"


+ 20
- 0
HBLConsole.PryUserControl/Quadrilateral.xaml View File

@@ -0,0 +1,20 @@
<UserControl x:Class="HBLConsole.PryUserControl.Quadrilateral"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HBLConsole.PryUserControl"
mc:Ignorable="d"
d:DesignHeight="30"
d:DesignWidth="100"
>
<Grid>
<Canvas
Name="canvas"
Width="auto"
Height="auto"
SizeChanged="Canvas_SizeChanged">
<Polygon x:Name="poly" />
</Canvas>
</Grid>
</UserControl>

+ 96
- 0
HBLConsole.PryUserControl/Quadrilateral.xaml.cs View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace HBLConsole.PryUserControl
{
/// <summary>
/// Quadrilateral.xaml 的交互逻辑
/// </summary>
public partial class Quadrilateral : UserControl
{
public Quadrilateral()
{
InitializeComponent();
}


public static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as Quadrilateral).Refresh();
}

/// <summary>
/// 依赖属性更改的委托
/// </summary>
private void Refresh()
{
this.poly.Fill = FillColor;
this.poly.StrokeThickness = StrokeThickness;
this.poly.Stroke = Stroke;
}

#region FillColor:填充颜色 依赖属性
/// <summary>
/// 填充颜色
/// </summary>
public Brush FillColor
{
get { return (Brush)GetValue(FillColorProperty); }
set { SetValue(FillColorProperty, value); }
}
public static readonly DependencyProperty FillColorProperty =
DependencyProperty.Register("FillColor", typeof(Brush), typeof(Quadrilateral),
new PropertyMetadata(default(Brush), new PropertyChangedCallback(OnPropertyChanged)));
#endregion

#region 外边线宽度
/// <summary>
/// 外边线宽度
/// </summary>
public int StrokeThickness
{
get { return (int)GetValue(StrokeThicknessProperty); }
set { SetValue(StrokeThicknessProperty, value); }
}
public static readonly DependencyProperty StrokeThicknessProperty =
DependencyProperty.Register("StrokeThickness", typeof(int), typeof(Quadrilateral),
new PropertyMetadata(0, new PropertyChangedCallback(OnPropertyChanged)));
#endregion

#region 外边框颜色
/// <summary>
/// 外边框颜色
/// </summary>
public Brush Stroke
{
get { return (Brush)GetValue(StrokeProperty); }
set { SetValue(StrokeProperty, value); }
}
public static readonly DependencyProperty StrokeProperty =
DependencyProperty.Register("Stroke", typeof(Brush), typeof(Quadrilateral),
new PropertyMetadata(default(Brush), new PropertyChangedCallback(OnPropertyChanged)));
#endregion

private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
PointCollection points = new PointCollection();
points.Add(new Point(0, 0));
points.Add(new Point(e.NewSize.Width - (e.NewSize.Height / 2), 0));
points.Add(new Point(e.NewSize.Width, e.NewSize.Height));
points.Add(new Point(e.NewSize.Height / 2, e.NewSize.Height));
this.poly.Points = points;
}
}
}

+ 27
- 0
HBLConsole.PryUserControl/TitleTextBlock.xaml View File

@@ -0,0 +1,27 @@
<UserControl
x:Class="HBLConsole.PryUserControl.TitleTextBlock"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HBLConsole.PryUserControl"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="30"
d:DesignWidth="100"
mc:Ignorable="d">
<Grid>
<Canvas
Name="canvas"
Width="auto"
Height="auto"
SizeChanged="Canvas_SizeChanged">
<Polygon x:Name="poly">
<Polygon.Fill>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Color="#ff1247EC" />
<GradientStop Offset="1" Color="#111247EC" />
</LinearGradientBrush>
</Polygon.Fill>
</Polygon>
</Canvas>
</Grid>
</UserControl>

+ 38
- 0
HBLConsole.PryUserControl/TitleTextBlock.xaml.cs View File

@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace HBLConsole.PryUserControl
{
/// <summary>
/// TitleTextBlock.xaml 的交互逻辑
/// </summary>
public partial class TitleTextBlock : UserControl
{
public TitleTextBlock()
{
InitializeComponent();
}

private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
PointCollection points = new PointCollection();
points.Add(new Point(0, 0));
points.Add(new Point(e.NewSize.Width - (e.NewSize.Height / 2), 0));
points.Add(new Point(e.NewSize.Width, e.NewSize.Height));
points.Add(new Point(0, e.NewSize.Height));
this.poly.Points = points;
}
}
}

+ 12
- 1
HBLConsole.Service/ActionManagerment.cs View File

@@ -16,12 +16,23 @@ namespace HBLConsole.Service

private static ConcurrentDictionary<string, Delegation> actions = new ConcurrentDictionary<string, Delegation>();

private static ConcurrentDictionary<string, ActionManagerment> actionManagers = new ConcurrentDictionary<string, ActionManagerment>();
//private static ConcurrentDictionary<string, ActionManagerment> actionManagers = new ConcurrentDictionary<string, ActionManagerment>();

static readonly object SendLock = new object();
static readonly object SendParLock = new object();
static readonly object RegisterLock = new object();

/// <summary>
/// 注销委托
/// </summary>
/// <param name="name"></param>
public void LogOut(string name)
{
if (actions.ContainsKey(name))
{
actions.TryRemove(name, out Delegation t);
}
}

public void Send(string name, object token, Action action = null)
{


+ 12
- 0
HBLConsole.Service/Json.cs View File

@@ -48,5 +48,17 @@ namespace HBLConsole.Service
}


public void ReadIntres()
{
if (File.Exists(path))
{
string JsonString = File.ReadAllText(path);

var result = JsonConvert.DeserializeObject<T>(JsonString);
if (result != null) { Base = result; }
}
}


}
}

+ 1
- 1
HBLConsole/App.config View File

@@ -11,7 +11,7 @@

<!--客户端ID-->
<!--MorkD = 2,MorkS 且时且多 = 8,MorkS 珠海 = 9,冰淇淋 = 4,咖啡机 = 13-->
<add key="ClientId" value="8"/>
<add key="ClientId" value="2"/>


</appSettings>

+ 32
- 0
HBLConsole/Converter/VisibleConvert.cs View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows;

namespace HBLConsole.Converter
{
public class VisibleConvert : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null && parameter != null)
{

if (value.ToString() == parameter.ToString())
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

+ 196
- 0
HBLConsole/DialogWindow/View/DeviceManagermentSetView.xaml View File

@@ -0,0 +1,196 @@
<Window
x:Class="HBLConsole.DialogWindow.View.DeviceManagermentSetView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HBLConsole.DialogWindow.View"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:HBLConsole.DialogWindow.ViewModel"
Title="DeviceManagermentSetView"
Width="400"
Height="275"
AllowsTransparency="True"
Background="{x:Null}"
Opacity="0.8"
Topmost="True"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
mc:Ignorable="d">

<Window.DataContext>
<vm:DeviceManagermentSetViewModel />
</Window.DataContext>

<Window.Resources>
<ResourceDictionary Source="../../Resources/ResourceDictionarys/BasicStyle.xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<Style x:Key="buttonStyle" TargetType="Button">
<Setter Property="FontFamily" Value="楷体" />
<Setter Property="Width" Value="100" />
<Setter Property="FontSize" Value="18" />
<Setter Property="Foreground" Value="Aqua" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="gr">
<ContentControl
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
<Polygon
x:Name="poly"
Points="0 0,80 0,100 30,20 30"
Stroke="#FF34F7F7"
StrokeThickness="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="poly" Property="Fill" Value="#2234F7F7" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>

<Grid Background="#103153">
<Grid.RowDefinitions>
<RowDefinition Height="35" />
<RowDefinition />
</Grid.RowDefinitions>

<!--#region 标题栏设置-->
<Border
x:Name="MoveBorder"
Height="35"
VerticalAlignment="Top"
Background="#0C2349"
BorderBrush="#55ffffff"
BorderThickness="0,0,0,1">
<StackPanel Orientation="Horizontal">
<Image Margin="15,5,0,5" Source="../../Resources/Images/hbl.png" />
<TextBlock
Name="tbTitle"
Margin="10,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
FontSize="18"
Foreground="White"
Text="设备管理" />
</StackPanel>
</Border>

<UniformGrid
Width="150"
Height="30"
HorizontalAlignment="Right"
Columns="3">
<Button
Name="ButMin"
Content="&#xe664;"
Style="{StaticResource TitleBarStyle}"
Visibility="Hidden" />
<Button
Name="ButMax"
Content="&#xe65d;"
Style="{StaticResource TitleBarStyle}"
Visibility="Hidden" />
<Button
Name="ButClose"
Content="&#xe639;"
FontSize="30"
Style="{StaticResource TitleBarStyle}" />
</UniformGrid>
<!--#endregion-->

<!--#region 内容显示区-->
<Grid Grid.Row="1" Margin="20">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<TextBlock
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontFamily="楷体"
FontSize="20"
Foreground="#FF34F7F7"
Text="请选择设备类型:" />
<ComboBox
Grid.Column="1"
VerticalAlignment="Center"
BorderBrush="#FF23CACA"
BorderThickness="1"
FontFamily="楷体"
FontSize="20"
Foreground="#ff23caca"
IsEditable="False"
ItemsSource="{Binding DeviceType}"
SelectedIndex="0"
Style="{StaticResource ComboBoxStyle}"
Text="{Binding devcieManagerResult.DeviceType}" />

<TextBlock
Grid.Row="1"
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontFamily="楷体"
FontSize="20"
Foreground="#FF34F7F7"
Text="请输入设备名称:" />
<TextBox
Grid.Row="1"
Grid.Column="1"
Margin="0,10"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="#FF23CACA"
CaretBrush="Aqua"
FontFamily="楷体"
FontSize="21"
Foreground="#ff34f7f7"
Text="{Binding devcieManagerResult.DeviceName}" />

<TextBlock
TextWrapping="Wrap"
Grid.Row="2"
Grid.ColumnSpan="2"
Margin="20,0,0,0"
VerticalAlignment="Center"
FontFamily="楷体"
FontSize="16"
Foreground="#FFE2415C"
Text="{Binding LogInfo}" />

<Button
Grid.Row="3"
Margin="20,10"
Command="{Binding CancelCommand}"
Content="取消"
Style="{StaticResource buttonStyle}" />
<Button
Grid.Row="3"
Grid.Column="1"
Margin="20,10"
Command="{Binding ConfirmCommand}"
Content="确认"
Style="{StaticResource buttonStyle}" />

</Grid>
<!--#endregion-->

</Grid>
</Window>

+ 84
- 0
HBLConsole/DialogWindow/View/DeviceManagermentSetView.xaml.cs View File

@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Toolkit.Mvvm.Messaging;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using HBLConsole.Model;
using HBLConsole.Service;

namespace HBLConsole.DialogWindow.View
{
/// <summary>
/// DeviceManagermentSetView.xaml 的交互逻辑
/// </summary>
public partial class DeviceManagermentSetView : Window
{
public DeviceManagermentSetView()
{
InitializeComponent();
this.MoveBorder.MouseLeftButtonDown += (o, e) => { this.DragMove(); };
this.ButMin.Click += (o, e) => { this.WindowState = WindowState.Minimized; };
this.ButMax.Click += (o, e) => { this.WindowState = this.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; };
this.ButClose.Click += (o, e) => { this.DialogResult = false; };
this.MaxWidth = SystemParameters.WorkArea.Width;
this.MaxHeight = SystemParameters.WorkArea.Height;

ActionManagerment.GetInstance.Register(new Action<object>((s) =>
{
this.Tag = s;
this.DialogResult = false;
ActionManagerment.GetInstance.LogOut("Cancel");
this.Close();

}), "Cancel");

ActionManagerment.GetInstance.Register(new Action<object>((s) =>
{
this.Tag = s;
this.DialogResult = true;
ActionManagerment.GetInstance.LogOut("Confirm");
this.Close();

}), "Confirm");


//DelegationNotifi.GetInstance.Cancel = new Action<DeviceManagermentResult>((s) =>
//{
// this.Tag = s;
// this.DialogResult = false;
// DelegationNotifi.GetInstance.Cancel = null;
// this.Close();
//});

//DelegationNotifi.GetInstance.Confirm = new Action<DeviceManagermentResult>((s) =>
//{
// this.Tag = s;
// this.DialogResult = true;
// DelegationNotifi.GetInstance.Cancel = null;
// this.Close();
//});

}


//private void ThisDialogResult(DeviceManagermentResult s, bool result)
//{
// this.Tag = s;
// this.DialogResult = result;
// //DelegationNotifi.GetInstance.Cancel = null;
// ActionManagerment.GetInstance.LogOut("Cancel");
// this.Close();
//}
}
}

+ 68
- 0
HBLConsole/DialogWindow/ViewModel/DeviceManagermentSetViewModel.cs View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using System.Collections.Concurrent;
using System.Collections.ObjectModel;
using Microsoft.Toolkit.Mvvm.Input;
using Microsoft.Toolkit.Mvvm.Messaging;
using System.Diagnostics;
using HBLConsole.Model;
using HBLConsole.Service;

namespace HBLConsole.DialogWindow.ViewModel
{
public class DeviceManagermentSetViewModel : ObservableObject
{
public DeviceManagermentSetViewModel()
{
Init();
CancelCommand = new RelayCommand(() =>
{
ActionManagerment.GetInstance.Send("Cancel", devcieManagerResult);
});
ConfirmCommand = new RelayCommand(() =>
{
var res = ActionManagerment.GetInstance.SendResult("AddDeviceVerify", devcieManagerResult);
if (res != null)
{
if (res is bool blen)
{
if (blen)
{
ActionManagerment.GetInstance.Send("Confirm", devcieManagerResult);
}
else
{
LogInfo = $"警告:设备【{devcieManagerResult.DeviceName}】已存在,请重试";
}
}
}
});
}

public ObservableCollection<string> DeviceType { get; set; } = new ObservableCollection<string>();

public RelayCommand CancelCommand { get; set; }
public RelayCommand ConfirmCommand { get; set; }

private void Init()
{
DeviceType.Clear();
foreach (var item in Enum.GetNames(typeof(EDeviceType))) { DeviceType.Add(item); }
}

public DeviceManagermentResult devcieManagerResult { get { return _mdevcieManagerResult; } set { _mdevcieManagerResult = value; OnPropertyChanged(); } }
private DeviceManagermentResult _mdevcieManagerResult = new DeviceManagermentResult();


public string LogInfo { get { return _mLogInfo; } set { _mLogInfo = value; OnPropertyChanged(); } }
private string _mLogInfo;




}
}

+ 0
- 6
HBLConsole/HBLConsole.csproj View File

@@ -191,12 +191,6 @@
<Resource Include="Resources\Images\黑菠萝科技.png" />
</ItemGroup>

<ItemGroup>
<Folder Include="DialogWindow\View\" />
<Folder Include="DialogWindow\ViewModel\" />
<Folder Include="Converter\" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\HBLConsole.MainConsole\HBLConsole.MainConsole.csproj" />
<ProjectReference Include="..\HBLConsole.Model\HBLConsole.Model.csproj" />


BIN
View File


+ 464
- 1
HBLConsole/Resources/ResourceDictionarys/BasicStyle.xaml View File

@@ -4,10 +4,15 @@
xmlns:con="clr-namespace:HBLConsole.Converter"
xmlns:pry="clr-namespace:HBLConsole.PryUserControl;assembly=HBLConsole.PryUserControl">

<!--#region 全局样式-->
<SolidColorBrush x:Key="TextBlockForeground" Color="#9934F7F7" />
<!--#endregion-->

<!--#region 转换器-->
<con:ColorConverter x:Key="ColorConverter" />
<!--<con:ColorConverter x:Key="ColorConverter" />-->
<con:TextConverter x:Key="TextConverter" />
<con:VisibleConvert x:Key="VisibleConvert" />
<!--#endregion-->

<!--#region 右斜边按钮-->
@@ -62,7 +67,7 @@
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RadioButton}">
<Grid x:Name="gr" SnapsToDevicePixels="True">
<Grid SnapsToDevicePixels="True">

<pry:BeveledButton
x:Name="bb"
@@ -460,4 +465,462 @@
</Style>
<!--#endregion-->

<!--#region TextBox 样式-->
<Style x:Key="InputTextboxStyle" TargetType="TextBox">
<Setter Property="Margin" Value="3,0,0,0" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!--#endregion-->

<!--#region 新建按钮-->
<ControlTemplate x:Key="NewButtonTemp" TargetType="Button">
<Border
x:Name="br"
Background="Transparent"
BorderBrush="#FF19B7EC"
BorderThickness="2">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="../Fonts/#iconfont"
Text="&#xe626;" />
<ContentControl
Margin="10,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

<Trigger Property="IsPressed" Value="true">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
<!--#endregion-->

<!--#region 保存按钮-->
<ControlTemplate x:Key="SaveButtonTemp" TargetType="Button">
<Border
x:Name="br"
Background="Transparent"
BorderBrush="#FF19B7EC"
BorderThickness="2">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="../Fonts/#iconfont"
FontSize="20"
Text="&#xe936;" />
<ContentControl
Margin="10,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

<Trigger Property="IsPressed" Value="true">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
<!--#endregion-->

<!--#region 取消按钮-->
<ControlTemplate x:Key="CancelButtonTemp" TargetType="Button">
<Border
x:Name="br"
Background="Transparent"
BorderBrush="#FF19B7EC"
BorderThickness="2">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="../Fonts/#iconfont"
FontSize="20"
Text="&#xe8e7;" />
<ContentControl
Margin="10,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

<Trigger Property="IsPressed" Value="true">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
<!--#endregion-->

<!--#region 确认按钮-->
<ControlTemplate x:Key="ConfirmButtonTemp" TargetType="Button">
<Border
x:Name="br"
Background="Transparent"
BorderBrush="#FF19B7EC"
BorderThickness="2">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="../Fonts/#iconfont"
FontSize="20"
Text="&#xe62a;" />
<ContentControl
Margin="10,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

<Trigger Property="IsPressed" Value="true">
<Setter TargetName="br" Property="Background" Value="#2219B7EC" />
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
<!--#endregion-->

<!--#region 移除按钮样式-->
<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
<Border
x:Name="br"
Background="Transparent"
BorderBrush="#FFDE7889"
BorderThickness="2"
CornerRadius="0">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="../Fonts/#iconfont"
FontSize="20"
Text="&#xe68e;" />
<ContentControl
Margin="10,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="br" Property="Background" Value="#22DE7889" />
</Trigger>

<Trigger Property="IsPressed" Value="true">
<Setter TargetName="br" Property="Background" Value="#22DE7889" />
</Trigger>

</ControlTemplate.Triggers>
</ControlTemplate>
<!--#endregion-->

<!--#region 编辑开关 ToggleButton 样式-->
<Style x:Key="EditToggleButtonStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid>
<Border
x:Name="border2"
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Background="Transparent">
<ContentPresenter
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</Grid>

<ControlTemplate.Triggers>
<!--<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" Value="#FFd2e7f4" />
</Trigger>-->

<!-- 控件选中 -->
<Trigger Property="IsChecked" Value="true">
<Setter Property="Foreground" Value="#ff1002E9" />
</Trigger>

<!-- 控件未选中 -->
<Trigger Property="IsChecked" Value="false">
<Setter Property="Foreground" Value="#ff2AB2E7" />
</Trigger>

<!-- 鼠标进入 -->
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border2" Property="Background" Value="#332AB2E7" />
</Trigger>

<!-- 控件禁用 -->
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#662AB2E7" />
</Trigger>

<!-- 控件启用 -->
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Foreground" Value="#ff2AB2E7" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--#endregion-->

<!--#region ComboBox 样式-->
<!-- ComBoBox项选中背景色 -->
<SolidColorBrush x:Key="ComboBoxSelectdBackground" Color="#AA3ba7f2" />
<!-- ComBoBox项鼠标经过背景色 -->
<SolidColorBrush x:Key="ComboBoxMouseOverBackground" Color="#553ba7f2" />
<!-- ComBoBox项选中前景色 -->
<SolidColorBrush x:Key="ComboBoxSelectedForeground" Color="#DDD" />
<!-- ComBoBox项鼠标经过前景色 -->
<SolidColorBrush x:Key="ComboBoxMouseOverForegrond" Color="#DDD" />

<ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
<Grid Height="25" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<Border
Grid.ColumnSpan="2"
Background="White"
Opacity="0" />
<TextBlock
Grid.Column="1"
Margin="0,0,5,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontFamily="../Fonts/#iconfont"
FontSize="14"
Foreground="#FF23CACA"
Text="&#xe64d;" />
<!--<Path
x:Name="Arrow"
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="M 0 0 6 6 12 0 Z"
Fill="#aa20FDFA"
Stretch="None">
<Path.Effect>
<DropShadowEffect
BlurRadius="10"
Direction="90"
Opacity="1"
RenderingBias="Quality"
ShadowDepth="0"
Color="#aa20FDFA" />
</Path.Effect>
</Path>-->
</Grid>
<!--<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="Arrow" Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="180" CenterX="6" CenterY="3" />
</Setter.Value>
</Setter>
<Setter TargetName="Arrow" Property="Margin" Value="0,0,0,2" />
</Trigger>
</ControlTemplate.Triggers>-->
</ControlTemplate>

<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ComboBoxItem">
<Setter Property="Height" Value="25" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Border x:Name="_borderbg" Background="Transparent" />

<TextBlock
x:Name="_txt"
Margin="3,0,3,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="#DDD"
Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" />

<Border
x:Name="_border"
Background="#103153"
Opacity="0" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="_txt" Property="Foreground" Value="{StaticResource ComboBoxSelectedForeground}" />
<Setter TargetName="_borderbg" Property="Background" Value="{StaticResource ComboBoxSelectdBackground}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="false" />
<Condition Property="IsMouseOver" Value="true" />
</MultiTrigger.Conditions>
<Setter TargetName="_borderbg" Property="Background" Value="{StaticResource ComboBoxMouseOverBackground}" />
<Setter TargetName="_txt" Property="Foreground" Value="{StaticResource ComboBoxMouseOverForegrond}" />
</MultiTrigger>

</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid>

<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.7*" />
<ColumnDefinition Width="0.3*" MaxWidth="30" />
</Grid.ColumnDefinitions>
<Border
x:Name="_prybr"
Grid.Column="0"
Grid.ColumnSpan="2"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="0" />
<ContentPresenter
x:Name="ContentSite"
Margin="3,3,0,3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
IsHitTestVisible="False" />

<!-- ToggleButton 已数据绑定到 ComboBox 本身以切换 IsDropDownOpen -->
<ToggleButton
x:Name="ToggleButton"
Grid.Column="0"
Grid.ColumnSpan="2"
ClickMode="Press"
Focusable="false"
IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Template="{StaticResource ComboBoxToggleButton}" />
<!-- 必须将 TextBox 命名为 PART_EditableTextBox,否则 ComboBox 将无法识别它 -->
<TextBox
x:Name="PART_EditableTextBox"
Margin="2,0,0,0"
VerticalAlignment="Center"
Background="Transparent"
BorderThickness="0"
Focusable="True"
IsReadOnly="{TemplateBinding IsReadOnly}"
Visibility="Hidden" />

<!-- Popup 可显示 ComboBox 中的项列表。IsOpen 已数据绑定到通过 ComboBoxToggleButton 来切换的 IsDropDownOpen -->
<Popup
x:Name="Popup"
AllowsTransparency="True"
Focusable="False"
IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"
PopupAnimation="Slide">
<Grid
x:Name="DropDown"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="150"
SnapsToDevicePixels="True">
<Border
x:Name="DropDownBorder"
BorderBrush="#3ba7f2"
BorderThickness="0" />
<ScrollViewer
Margin="1"
CanContentScroll="True"
HorizontalScrollBarVisibility="Auto"
SnapsToDevicePixels="True"
VerticalScrollBarVisibility="Auto">
<!-- StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True -->
<!-- 一下可以设置列表背景色 -->
<StackPanel
Background="#103153"
IsItemsHost="True"
KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Grid>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEditable" Value="true">
<Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="_prybr" Property="BorderBrush" Value="#aa3ba7f2" />
<!--<Setter Property="Background" Value="#553ba7f2" TargetName="_prybr"/>-->
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--#endregion-->

</ResourceDictionary>

+ 16
- 24
HBLConsole/View/DebugView.xaml View File

@@ -178,6 +178,18 @@
Style="{StaticResource TextBoxStyle}"
Text="{Binding NoodleLoc}" />

<CheckBox
Grid.Row="2"
Grid.Column="7"
Height="20"
VerticalAlignment="Center"
Background="#FF2AB2E7"
Content="启用随机数"
FontSize="16"
Foreground="#ddd"
IsChecked="{Binding IsEnableRandom}"
Template="{StaticResource CbTemplate}" />

<TextBlock
Margin="10,0,0,0"
VerticalAlignment="Center"
@@ -185,6 +197,7 @@
Foreground="#00c2f4"
Text="取碗位置:" />


<TextBox
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
@@ -194,14 +207,13 @@
Grid.Row="2"
Grid.Column="7"
Height="20"
Margin="10"
HorizontalAlignment="Right"
Margin="0,0,20,0"
VerticalAlignment="Center"
Background="#FF2AB2E7"
Content="启用随机数"
FontSize="16"
Foreground="#ddd"
IsChecked="{Binding IsEnableRandom}"
IsChecked="{Binding BowlIsEnableRandom}"
Template="{StaticResource CbTemplate}" />

<Button
@@ -222,6 +234,7 @@
Margin="10,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="16"
Foreground="Red"
Text="注意:取面位置范围是:1 -- 5, 取碗位置范围是:10 -- 11" />
</StackPanel>
@@ -286,27 +299,6 @@
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

<!--<ListBox
Margin="0,3,0,0"
Background="Transparent"
BorderThickness="0"
ItemsSource="{Binding Conditions}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<ToggleButton
Content="{Binding ConditionName}"
IsChecked="{Binding ConditionMet}"
Style="{StaticResource ToggleButStyle}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>-->

</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>


+ 489
- 0
HBLConsole/View/DeviceManageView.xaml View File

@@ -0,0 +1,489 @@
<UserControl
x:Class="HBLConsole.View.DeviceManageView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HBLConsole.View"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:pry="clr-namespace:HBLConsole.PryUserControl;assembly=HBLConsole.PryUserControl"
xmlns:vm="clr-namespace:HBLConsole.ViewModel"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">

<UserControl.DataContext>
<vm:DeviceManageViewModel />
</UserControl.DataContext>

<UserControl.Resources>
<ResourceDictionary Source="../Resources/ResourceDictionarys/BasicStyle.xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<Style x:Key="TextBlockStyle" TargetType="TextBlock">
<Setter Property="FontFamily" Value="楷体" />
<Setter Property="FontSize" Value="18" />
<Setter Property="Foreground" Value="{StaticResource TextBlockForeground}" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>

<Style x:Key="TextBoxStyle" TargetType="TextBox">
<Setter Property="FontFamily" Value="楷体" />
<Setter Property="FontSize" Value="22" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{StaticResource TextBlockForeground}" />
<Setter Property="BorderBrush" Value="#FF23CACA" />
<Setter Property="CaretBrush" Value="Aqua" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>

<Style x:Key="buttonStyle" TargetType="Button">
<Setter Property="FontFamily" Value="楷体" />
<Setter Property="FontSize" Value="20" />
<Setter Property="Foreground" Value="#FFDE7889" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<ContentControl
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" />
<pry:Quadrilateral
x:Name="poly"
Stroke="#FFDE7889"
StrokeThickness="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="poly" Property="FillColor" Value="#22DE7889" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>

<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="35" />
<RowDefinition />
</Grid.RowDefinitions>

<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<Button
Width="140"
Margin="0,0,20,0"
Background="#FF19B7EC"
Command="{Binding NewConnectCommand}"
Content="新建连接"
FontFamily="楷体"
FontSize="18"
Template="{StaticResource NewButtonTemp}">
<Button.Foreground>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FFBB662A" />
<GradientStop Offset="1" Color="White" />
</LinearGradientBrush>
</Button.Foreground>
</Button>

<Button
Width="140"
Command="{Binding SaveConnectSetCommand}"
Content="保存"
FontFamily="楷体"
FontSize="18"
Template="{StaticResource SaveButtonTemp}">
<Button.Foreground>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FFBB662A" />
<GradientStop Offset="1" Color="White" />
</LinearGradientBrush>
</Button.Foreground>
</Button>
</StackPanel>

<ScrollViewer
Grid.Row="1"
Margin="0,10,0,0"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden">
<ItemsControl ItemsSource="{Binding communicationSets}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,30">
<Grid.RowDefinitions>
<RowDefinition Height="0.1*" />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>

<!--#region 标题显示及操作-->
<Grid Margin="0,0,0,20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.3*" />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<pry:TitleTextBlock />

<TextBlock
Margin="5"
HorizontalAlignment="Left"
VerticalAlignment="Center"
FontFamily="楷体"
FontSize="20"
Foreground="Aqua"
Text="{Binding DeviceName}" />
</Grid>
<!--#endregion-->

<!--#region 西门子设备-->
<Grid Grid.Row="1" Visibility="{Binding Path=deviceType, Converter={StaticResource VisibleConvert},ConverterParameter=Siemens}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.2*" />
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="20" />
<RowDefinition />
</Grid.RowDefinitions>

<TextBlock
Grid.Column="0"
Style="{StaticResource TextBlockStyle}"
Text="IP地址:" />
<TextBox
Grid.Column="1"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.IP}" />

<TextBlock
Grid.Column="2"
Style="{StaticResource TextBlockStyle}"
Text="端口号:" />
<TextBox
Grid.Column="3"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.PortNum}" />

<TextBlock
Grid.Column="4"
Style="{StaticResource TextBlockStyle}"
Text="PLC类型:" />
<ComboBox
Grid.Column="5"
Margin="0,0,20,0"
VerticalAlignment="Center"
BorderBrush="#FF23CACA"
BorderThickness="1"
FontFamily="楷体"
FontSize="20"
Foreground="#ff23caca"
IsEditable="False"
ItemsSource="{Binding Path=Device.PlcTypes}"
SelectedIndex="0"
Style="{StaticResource ComboBoxStyle}"
Text="{Binding Path=Device.PlcType}" />

<Button
Grid.Column="7"
Command="{Binding RemoveCommand}"
CommandParameter="{Binding DeviceName}"
Content="删除"
FontFamily="楷体"
FontSize="20"
Foreground="#FFDE7889"
Template="{StaticResource ButtonTemplate}" />

<TextBlock
Grid.Row="2"
Style="{StaticResource TextBlockStyle}"
Text="机架号:" />
<TextBox
Grid.Row="2"
Grid.Column="1"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.Rack}" />

<TextBlock
Grid.Row="2"
Grid.Column="2"
Style="{StaticResource TextBlockStyle}"
Text="插槽号:" />
<TextBox
Grid.Row="2"
Grid.Column="3"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.Slot}" />

<CheckBox
Grid.Row="2"
Grid.Column="7"
Width="100"
Height="20"
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="#FF2AB2E7"
Content="IsActive"
FontSize="16"
Foreground="#ddd"
IsChecked="{Binding IsActive}"
Template="{StaticResource CbTemplate}" />
</Grid>
</Grid>
<!--#endregion-->

<!--#region Modbus Tcp 设备-->

<Grid Grid.Row="2" Visibility="{Binding Path=deviceType, Converter={StaticResource VisibleConvert},ConverterParameter=ModbusTcp}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.2*" />
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="20" />
<RowDefinition />
</Grid.RowDefinitions>


<TextBlock
Grid.Column="0"
Style="{StaticResource TextBlockStyle}"
Text="IP地址:" />
<TextBox
Grid.Column="1"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=NotFoundString,FallbackValue=Device.IP}" />

<TextBlock
Grid.Column="2"
Style="{StaticResource TextBlockStyle}"
Text="端口号:" />
<TextBox
Grid.Column="3"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.PortNum}" />

<TextBlock
Grid.Column="4"
Style="{StaticResource TextBlockStyle}"
Text="站号:" />
<TextBox
Grid.Column="5"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.StationNo}" />

<Button
Grid.Column="7"
Command="{Binding RemoveCommand}"
CommandParameter="{Binding DeviceName}"
Content="删除"
FontFamily="楷体"
FontSize="20"
Foreground="#FFDE7889"
Template="{StaticResource ButtonTemplate}" />

<CheckBox
Grid.Row="2"
Grid.Column="7"
Width="100"
Height="20"
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="#FF2AB2E7"
Content="IsActive"
FontSize="16"
Foreground="#ddd"
IsChecked="{Binding IsActive}"
Template="{StaticResource CbTemplate}" />

</Grid>
</Grid>

<!--#endregion-->

<!--#region Modbus RTU 设备-->

<Grid Grid.Row="3" Visibility="{Binding Path=deviceType, Converter={StaticResource VisibleConvert},ConverterParameter=ModbusRtu}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition />
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.2*" />
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="20" />
<RowDefinition />
</Grid.RowDefinitions>

<TextBlock Style="{StaticResource TextBlockStyle}" Text="端口号:" />
<ComboBox
Grid.Column="1"
Margin="0,0,20,0"
VerticalAlignment="Center"
BorderBrush="#FF23CACA"
BorderThickness="1"
FontFamily="楷体"
FontSize="20"
Foreground="#ff23caca"
IsEditable="False"
ItemsSource="{Binding Path=Device.Ports}"
SelectedIndex="0"
Style="{StaticResource ComboBoxStyle}"
Text="{Binding Path=Device.ComSerialPort}" />

<TextBlock
Grid.Column="2"
Style="{StaticResource TextBlockStyle}"
Text="波特率:" />
<ComboBox
Grid.Column="3"
Margin="0,0,20,0"
VerticalAlignment="Center"
BorderBrush="#FF23CACA"
BorderThickness="1"
FontFamily="楷体"
FontSize="20"
Foreground="#ff23caca"
IsEditable="False"
ItemsSource="{Binding Path=Device.BaudRates}"
SelectedIndex="0"
Style="{StaticResource ComboBoxStyle}"
Text="{Binding Path=Device.BaudRate}" />


<TextBlock
Grid.Column="4"
Style="{StaticResource TextBlockStyle}"
Text="奇偶:" />
<ComboBox
Grid.Column="5"
Margin="0,0,20,0"
VerticalAlignment="Center"
BorderBrush="#FF23CACA"
BorderThickness="1"
FontFamily="楷体"
FontSize="20"
Foreground="#ff23caca"
IsEditable="False"
ItemsSource="{Binding Path=Device.Paritys}"
SelectedIndex="0"
Style="{StaticResource ComboBoxStyle}"
Text="{Binding Path=Device.Parity}" />

<TextBlock
Grid.Row="2"
Grid.Column="0"
Style="{StaticResource TextBlockStyle}"
Text="数据位:" />
<TextBox
Grid.Row="2"
Grid.Column="1"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.DataBit}" />
<TextBlock
Grid.Row="2"
Grid.Column="2"
Style="{StaticResource TextBlockStyle}"
Text="停止位:" />
<TextBox
Grid.Row="2"
Grid.Column="3"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.StopBit}" />

<TextBlock
Grid.Row="2"
Grid.Column="4"
Style="{StaticResource TextBlockStyle}"
Text="站号:" />
<TextBox
Grid.Row="2"
Grid.Column="5"
Margin="0,0,20,0"
Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=Device.StationNo}" />

<Button
Grid.Column="7"
Command="{Binding RemoveCommand}"
CommandParameter="{Binding DeviceName}"
Content="删除"
FontFamily="楷体"
FontSize="20"
Foreground="#FFDE7889"
Template="{StaticResource ButtonTemplate}" />

<CheckBox
Grid.Row="2"
Grid.Column="7"
Width="100"
Height="20"
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="#FF2AB2E7"
Content="IsActive"
FontSize="16"
Foreground="#ddd"
IsChecked="{Binding IsActive}"
Template="{StaticResource CbTemplate}" />
</Grid>
</Grid>

<!--#endregion-->

</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

</ScrollViewer>
</Grid>
</UserControl>

+ 28
- 0
HBLConsole/View/DeviceManageView.xaml.cs View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace HBLConsole.View
{
/// <summary>
/// DeviceManageView.xaml 的交互逻辑
/// </summary>
public partial class DeviceManageView : UserControl
{
public DeviceManageView()
{
InitializeComponent();
}
}
}

+ 11
- 3
HBLConsole/View/MainView.xaml View File

@@ -215,6 +215,14 @@
Content="流程监控"
Style="{StaticResource ParallelogramRadioButtonStyle}" />


<RadioButton
Margin="-10,0,0,0"
Command="{Binding NavChangedCommand}"
CommandParameter="DeviceManageView"
Content="设备管理"
Style="{StaticResource ParallelogramRadioButtonStyle}" />

<RadioButton
Margin="-10,0,0,0"
Command="{Binding NavChangedCommand}"
@@ -260,15 +268,15 @@
<Button
Name="ButMin"
Width="40"
Content="&#xe644;"
Content="&#xe664;"
Style="{StaticResource TitleBarStyle}" />
<Button
Name="ButMax"
Content="&#xe645;"
Content="&#xe65d;"
Style="{StaticResource TitleBarStyle}" />
<Button
Name="ButClose"
Content="&#xe602;"
Content="&#xe639;"
FontSize="26"
Style="{StaticResource TitleBarStyle}" />
</UniformGrid>


+ 12
- 0
HBLConsole/View/ProcessMonitoringView.xaml View File

@@ -0,0 +1,12 @@
<UserControl x:Class="HBLConsole.View.ProcessMonitoringView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HBLConsole.View"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
</Grid>
</UserControl>

+ 28
- 0
HBLConsole/View/ProcessMonitoringView.xaml.cs View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace HBLConsole.View
{
/// <summary>
/// ProcessMonitoringView.xaml 的交互逻辑
/// </summary>
public partial class ProcessMonitoringView : UserControl
{
public ProcessMonitoringView()
{
InitializeComponent();
}
}
}

+ 7
- 17
HBLConsole/ViewModel/DebugViewModel.cs View File

@@ -18,6 +18,7 @@ namespace HBLConsole.ViewModel
{
public class DebugViewModel : ViewModelBase
{
static bool First = false;
public DebugViewModel()
{
WindowName = "调试模式";
@@ -25,9 +26,10 @@ namespace HBLConsole.ViewModel
{
ActionManagerment.GetInstance.Send("SimOrder", new SimOrderData()
{
IsEnableRandom = IsEnableRandom,
NoodleIsEnableRandom = IsEnableRandom,
BowlLoc = BowlLoc,
NoodleLoc = NoodleLoc,
BowlIsEnableRandom = BowlIsEnableRandom
}, new Action(() =>
{
BowlLoc = MORKS.GetInstance.BowlLoc;
@@ -36,17 +38,12 @@ namespace HBLConsole.ViewModel
});

InitCommand = new RelayCommand(() => { MORKS.GetInstance.DeviceInit(); });
ProcessCondition();
//ThreadManagerment.GetInstance.StartLong(new Action(() =>
//{
// NoodleCount = MORKS.GetInstance.mORKS.RBTakeNoodleTask.Count;
// BowlCount = MORKS.GetInstance.mORKS.TakeBowlTask.Count;
// Thread.Sleep(1000);
//}), "数据监控");
if (!First) ProcessCondition();
}

private void ProcessCondition()
{
First = true;
Type type = MORKS.GetInstance.mORKS.GetType();

//添加流程监控信息
@@ -169,15 +166,8 @@ namespace HBLConsole.ViewModel
private static bool _mIsEnableRandom = true;



//public static int NoodleCount { get { return _mNoodleCount; } set { _mNoodleCount = value; OnStaticPropertyChanged(); } }
//private static int _mNoodleCount;


//public static int BowlCount { get { return _mBowlCount; } set { _mBowlCount = value; OnStaticPropertyChanged(); } }
//private static int _mBowlCount;


public static bool BowlIsEnableRandom { get { return _mBowlIsEnableRandom; } set { _mBowlIsEnableRandom = value; OnStaticPropertyChanged(); } }
private static bool _mBowlIsEnableRandom = true;

}
}

+ 132
- 0
HBLConsole/ViewModel/DeviceManageViewModel.cs View File

@@ -0,0 +1,132 @@
using HBLConsole.DialogWindow.View;
using HBLConsole.Interface;
using HBLConsole.Model;
using HBLConsole.Service;
using Microsoft.Toolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace HBLConsole.ViewModel
{
public class DeviceManageViewModel : ViewModelBase
{
public DeviceManageViewModel()
{
WindowName = "设备管理";

NewConnectCommand = new RelayCommand(() => { NewConnect(); });
SaveConnectSetCommand = new RelayCommand(() =>
{
Json<CommunicationPar>.GetInstance.Base.communicationSets.Clear();
foreach (var item in communicationSets)
{
item.RemoveAction = null;
//if (!item.CommModbusRtu.IsVisible) item.CommModbusRtu = null;
//if (!item.CommSiemens.IsVisible) item.CommSiemens = null;
//if (!item.CommModbusTcp.IsVisible) item.CommModbusTcp = null;
Json<CommunicationPar>.GetInstance.Base.communicationSets.Add(item);
}
Json<CommunicationPar>.GetInstance.Save();
});

Json<CommunicationPar>.GetInstance.Read();
communicationSets.Clear();
foreach (var item in Json<CommunicationPar>.GetInstance.Base.communicationSets)
{
item.RemoveAction = RemoveDevice;
communicationSets.Add(item);
}

ActionManagerment.GetInstance.Register(new Func<object, object>((p) =>
{
if (p is DeviceManagermentResult dm)
{
return communicationSets.FirstOrDefault(s => s.DeviceName == dm.DeviceName) == null;
}
return false;
}), "AddDeviceVerify");
}


public static ObservableCollection<CommunicationSet> communicationSets { get; set; } = new ObservableCollection<CommunicationSet>();

public RelayCommand NewConnectCommand { get; set; }

public RelayCommand SaveConnectSetCommand { get; set; }

/// <summary>
/// 创建新连接
/// </summary>
private void NewConnect()
{
DeviceManagermentSetView deviceManagermentSetView = new DeviceManagermentSetView();
var result = deviceManagermentSetView.ShowDialog();
var ResultTag = (DeviceManagermentResult)deviceManagermentSetView.Tag;
if (ResultTag != null)
{
if ((bool)result)
{
var obj = communicationSets.FirstOrDefault(p => p.DeviceName == ResultTag.DeviceName);
if (obj == null)
{
CommunicationSet communicationObj = new CommunicationSet();
EDeviceType eDeviceType = (EDeviceType)Enum.Parse(typeof(EDeviceType), ResultTag.DeviceType);



string NameSpace = "HBLConsole.Model";//Load 加载的是dll的名称,GetType获取的是全命名空间下的类
Type type = Assembly.Load(NameSpace)?.GetType($"{NameSpace}.{ResultTag.DeviceType}");
if (type != null)
{
communicationObj.Device = (IDeviceType)Activator.CreateInstance(type);
}
communicationObj.DeviceName = ResultTag.DeviceName;
communicationObj.deviceType = eDeviceType;
communicationObj.RemoveAction = RemoveDevice;
communicationSets.Add(communicationObj);



//switch (eDeviceType)
//{
// case EDeviceType.Siemens:
// //communicationObj.CommSiemens = new Siemens();
// //communicationObj.CommSiemens.IsVisible = true;
// break;
// case EDeviceType.ModbusRtu:
// //communicationObj.CommModbusRtu.IsVisible = true;
// break;
// case EDeviceType.ModbusTcp:
// //communicationObj.CommModbusTcp.IsVisible = true;
// break;
// case EDeviceType.SerialPort:
// break;
// default:
// break;
//}

}
}
}
deviceManagermentSetView = null;
}

private void RemoveDevice(object o)
{
var result = communicationSets.FirstOrDefault(p => p.DeviceName == o.ToString());
if (result != null)
{
communicationSets.Remove(result);
}
}



}
}

+ 123
- 0
HBLConsole/ViewModel/ProcessMonitoringViewModel.cs View File

@@ -0,0 +1,123 @@
using HBLConsole.Business.Devices;
using HBLConsole.Model;
using HBLConsole.Service;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace HBLConsole.ViewModel
{
public class ProcessMonitoringViewModel : ViewModelBase
{
public ProcessMonitoringViewModel()
{
WindowName = "流程监控";
ProcessCondition();
}

private void ProcessCondition()
{
Type type = MORKS.GetInstance.mORKS.GetType();

//添加流程监控信息
foreach (var item in type.GetProperties())
{
if (item.CustomAttributes.Count() > 0)
{
string? propertyInfo = item.GetCustomAttribute<GVL.CircuitAttribute>()?.PropertyIllustrate;
string[]? Classifiactions = item.GetCustomAttribute<GVL.CircuitAttribute>()?.Classifiaction;
if (Classifiactions != null)
{
foreach (var itemClassifiactions in Classifiactions)
{
if (GVL.ProcessData.GetInstance.Conditions.ContainsKey(itemClassifiactions))
{
if (propertyInfo != null)
{
int index = Array.FindIndex(GVL.ProcessData.GetInstance.Conditions[itemClassifiactions].ToArray(), p => p.propertyIllustrate == propertyInfo);
if (index >= 0)
{
GVL.ProcessData.GetInstance.Conditions[itemClassifiactions].ElementAt(index).ToolTip = item.Name;
}
}
}
}
}
}
}

var Conditions = GVL.ProcessData.GetInstance.Conditions;
if (Conditions != null)
{
foreach (var item in Conditions)
{
ProcessConditions process = new ProcessConditions();
process.ProcessTitl = item.Key;
foreach (var values in item.Value)
{
process.Conditions.Add(new Condition() { ConditionName = values.propertyIllustrate });
}
processConditions.Add(process);
}
}


//更新流程监控图
ThreadManagerment.GetInstance.StartLong(new Action(() =>
{
foreach (var item in type.GetProperties())
{
if (item.CustomAttributes.Count() > 0)
{
string? propertyInfo = item.GetCustomAttribute<GVL.CircuitAttribute>()?.PropertyIllustrate;
string[]? Classifiactions = item.GetCustomAttribute<GVL.CircuitAttribute>()?.Classifiaction;
if (Classifiactions != null)
{
foreach (string? Titles in Classifiactions)
{
if (Titles != null && propertyInfo != null)
{
bool? isNot = GVL.ProcessData.GetInstance.Conditions[Titles]?.FirstOrDefault(p => p.propertyIllustrate == propertyInfo)?.IsNot;
int index = Array.FindIndex(processConditions.ToArray(), p => p.ProcessTitl == Titles);

if (index >= 0)
{
int PropertyIndex = Array.FindIndex(processConditions.ElementAt(index).Conditions.ToArray(), p => p.ConditionName == propertyInfo);
if (PropertyIndex >= 0)
{
var res = type.GetProperty(item.Name)?.GetValue(MORKS.GetInstance.mORKS, null);
if (res != null)
{
if (res is bool blen)
{
if (isNot != null)
{
processConditions.ElementAt(index).Conditions.ElementAt(PropertyIndex).ConditionMet = (bool)isNot ? !blen : blen;
}

}
else if (res is ConcurrentQueue<GVL.OrderLocInfo> OrderLocInfoS)
{
processConditions.ElementAt(index).Conditions.ElementAt(PropertyIndex).ConditionMet = OrderLocInfoS.Count > 0;
}
}

}

}
}
}
}
}
}
Thread.Sleep(1000);
}), "UpdateValue");

}
}
}

Loading…
Cancel
Save