@@ -61,6 +61,8 @@ namespace BPASmartClient.KLMCoffee | |||
{ | |||
MessageLog.GetInstance.ShowEx($"BPASmartClient.KLMCoffee 中引发错误,CoffeeMachine 类,描述:[{ex.Message}]"); | |||
} | |||
} | |||
/// <summary> | |||
@@ -102,6 +104,8 @@ namespace BPASmartClient.KLMCoffee | |||
private void ResolveMsg() | |||
{ | |||
status["CoffeeIsConnected"] = OnLine; | |||
IsConnected = OnLine; | |||
List<byte> temp = new List<byte>(); | |||
//一系列解包 | |||
while (dataStorage.GetSize() > 0) | |||
@@ -170,12 +174,11 @@ namespace BPASmartClient.KLMCoffee | |||
protected override void InitStatus() | |||
{ | |||
status["CoffeeStatus"] = K95SysTemStatus.空闲状态; | |||
status["CoffeedrinkType"] = DrinkType.意式; | |||
status["CoffeedrinkType"] = DrinkType.意式咖啡; | |||
status["CoffeeAppStatus"] = TaskIndex.无任务; | |||
status["Coffeeprogress"] = 0; | |||
status["CoffeeWarning"] = new FaultMessage(0x00, 0x00).dataFault(); | |||
status["CoffeeKeep"] = new UpkeepMessage(0x00).dataFault(); | |||
} | |||
public override void Init() | |||
@@ -189,9 +192,12 @@ namespace BPASmartClient.KLMCoffee | |||
try | |||
{ | |||
free = true; | |||
Thread.Sleep(200); | |||
byte[] data = command.ReturnsCommandData(K95CommandEnum.配方咖啡制作.GetString(), new RecipeModel().Packe(((KLMCoffee_MakeCoffeeEvent)@event).DrinkCode)); | |||
Thread.Sleep(300); | |||
K95deFaultCoffeeEnum K95Code = (K95deFaultCoffeeEnum)((KLMCoffee_MakeCoffeeEvent)@event).KLMDrinkFaultCode; | |||
//byte[] data = command.ReturnsCommandData(K95CommandEnum.配方咖啡制作.GetString(), new RecipeModel().Packe(((KLMCoffee_MakeCoffeeEvent)@event).DrinkCode)); | |||
byte[] data = command.ReturnsCommandData(K95CommandEnum.咖啡制作.GetString(), K95Code.GetString()); | |||
commProxy.SendData(data); | |||
MessageLog.GetInstance.Show($"制作{K95Code}数据发送完成"); | |||
Thread.Sleep(200); | |||
free = false; | |||
} | |||
@@ -89,12 +89,12 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
{ | |||
switch (me) | |||
{ | |||
case DrinkType.意式: return "01"; | |||
case DrinkType.美式: return "02"; | |||
case DrinkType.意式咖啡: return "01"; | |||
case DrinkType.美式咖啡: return "02"; | |||
case DrinkType.热水: return "03"; | |||
case DrinkType.卡布: return "04"; | |||
case DrinkType.玛奇朵: return "05"; | |||
case DrinkType.拿铁: return "06"; | |||
case DrinkType.卡布奇诺: return "04"; | |||
case DrinkType.玛琪雅朵: return "05"; | |||
case DrinkType.拿铁咖啡: return "06"; | |||
case DrinkType.热牛奶: return "07"; | |||
case DrinkType.热奶沫: return "08"; | |||
default: return "01"; | |||
@@ -11,34 +11,34 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
/// </summary> | |||
public enum K95deFaultCoffeeEnum | |||
{ | |||
意式咖啡, | |||
美式咖啡, | |||
咖啡意式咖啡, | |||
卡布奇诺, | |||
玛琪雅朵, | |||
拿铁, | |||
白咖啡, | |||
芮斯崔朵, | |||
意式玛奇朵, | |||
奶油咖啡, | |||
双杯意式咖啡, | |||
双杯卡布奇诺, | |||
双杯拿铁, | |||
双杯玛琪雅朵, | |||
双杯白咖啡, | |||
双杯咖啡, | |||
双杯芮斯崔朵, | |||
双杯意式玛奇朵, | |||
双杯奶油咖啡, | |||
热水, | |||
牛奶, | |||
奶沫, | |||
大壶咖啡, | |||
取消制作, | |||
放杯确认, | |||
清洗冲泡器, | |||
清洗奶沫器, | |||
清洗奶沫器确认, | |||
状态查询 | |||
意式咖啡 = 1, | |||
美式咖啡 = 2, | |||
咖啡意式咖啡 = 9, | |||
卡布奇诺 = 4, | |||
玛琪雅朵 = 5, | |||
拿铁 = 6, | |||
白咖啡 = 14, | |||
芮斯崔朵 = 10, | |||
意式玛奇朵 = 13, | |||
奶油咖啡 = 12, | |||
双杯意式咖啡 = 51, | |||
双杯卡布奇诺 = 55, | |||
双杯拿铁 = 57, | |||
双杯玛琪雅朵 = 56, | |||
双杯白咖啡 = 59, | |||
双杯咖啡 = 52, | |||
双杯芮斯崔朵 = 53, | |||
双杯意式玛奇朵 = 58, | |||
双杯奶油咖啡 = 54, | |||
热水 = 3, | |||
牛奶 = 7, | |||
奶沫 = 8, | |||
大壶咖啡 = 11, | |||
取消制作 = 200, | |||
放杯确认 = 201, | |||
清洗冲泡器 = 202, | |||
清洗奶沫器 = 203, | |||
清洗奶沫器确认 = 204, | |||
状态查询 = 205 | |||
} | |||
} |
@@ -63,7 +63,7 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
public RecipeModel() | |||
{ | |||
饮品类型 = DrinkType.意式; | |||
饮品类型 = DrinkType.意式咖啡; | |||
咖啡量 = 0; | |||
咖啡温度 = TempEnum.低; | |||
咖啡浓度 = CoffeeConcentration.清淡; | |||
@@ -125,22 +125,22 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
{ | |||
switch (drink) | |||
{ | |||
case DrinkType.意式: | |||
case DrinkType.意式咖啡: | |||
return GetItalian(60); | |||
break; | |||
case DrinkType.美式: | |||
case DrinkType.美式咖啡: | |||
return GetAmerican(60,450); | |||
break; | |||
case DrinkType.热水: | |||
return GetHotWater(194); | |||
break; | |||
case DrinkType.卡布: | |||
case DrinkType.卡布奇诺: | |||
return GetCabo(60,17); | |||
break; | |||
case DrinkType.玛奇朵: | |||
case DrinkType.玛琪雅朵: | |||
return GetMacChiato(60,8,17); | |||
break; | |||
case DrinkType.拿铁: | |||
case DrinkType.拿铁咖啡: | |||
return GetLatte(60,8,17); | |||
break; | |||
case DrinkType.热牛奶: | |||
@@ -166,7 +166,7 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
/// <param name="_咖啡量">15-240</param> | |||
public string GetItalian(int _咖啡量) | |||
{ | |||
饮品类型 = DrinkType.意式; | |||
饮品类型 = DrinkType.意式咖啡; | |||
咖啡量 = _咖啡量; | |||
咖啡温度 = TempEnum.中; | |||
咖啡浓度 = CoffeeConcentration.适中; | |||
@@ -187,7 +187,7 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
/// <param name="_热水量">25-450</param> | |||
public string GetAmerican(int _咖啡量,int _热水量) | |||
{ | |||
饮品类型 = DrinkType.美式; | |||
饮品类型 = DrinkType.美式咖啡; | |||
咖啡量 = _咖啡量; | |||
咖啡温度 = TempEnum.中; | |||
咖啡浓度 = CoffeeConcentration.适中; | |||
@@ -228,7 +228,7 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
/// <param name="_奶沫时间">5-120</param> | |||
public string GetCabo(int _咖啡量,int _奶沫时间) | |||
{ | |||
饮品类型 = DrinkType.卡布; | |||
饮品类型 = DrinkType.卡布奇诺; | |||
咖啡量 = _咖啡量; | |||
咖啡温度 = TempEnum.中; | |||
咖啡浓度 = CoffeeConcentration.适中; | |||
@@ -250,7 +250,7 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
/// <param name="_奶沫时间">5-120</param> | |||
public string GetMacChiato(int _咖啡量,int _牛奶时间,int _奶沫时间) | |||
{ | |||
饮品类型 = DrinkType.玛奇朵; | |||
饮品类型 = DrinkType.玛琪雅朵; | |||
咖啡量 = _咖啡量; | |||
咖啡温度 = TempEnum.中; | |||
咖啡浓度 = CoffeeConcentration.适中; | |||
@@ -272,7 +272,7 @@ namespace BPASmartClient.KLMCoffee.Protocal | |||
/// <param name="_奶沫时间">5-120</param> | |||
public string GetLatte(int _咖啡量,int _牛奶时间,int _奶沫时间) | |||
{ | |||
饮品类型 = DrinkType.拿铁; | |||
饮品类型 = DrinkType.拿铁咖啡; | |||
咖啡量 = _咖啡量; | |||
咖啡温度 = TempEnum.中; | |||
咖啡浓度 = CoffeeConcentration.适中; | |||
@@ -11,13 +11,13 @@ namespace BPASmartClient.Model.咖啡机.Enum | |||
/// </summary> | |||
public enum DrinkType | |||
{ | |||
意式, | |||
美式, | |||
热水, | |||
卡布, | |||
玛奇朵, | |||
拿铁, | |||
热牛奶, | |||
热奶沫 | |||
意式咖啡=0, | |||
美式咖啡=1, | |||
热水=2, | |||
卡布奇诺=3, | |||
玛琪雅朵=4, | |||
拿铁咖啡=5, | |||
热牛奶=6, | |||
热奶沫=7, | |||
} | |||
} |
@@ -0,0 +1,58 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.Model.咖啡机.Enum | |||
{ | |||
public enum KLMDrinkFaultType | |||
{ | |||
意式咖啡 = 1, | |||
美式咖啡 = 2, | |||
咖啡意式咖啡 = 9, | |||
卡布奇诺 = 4, | |||
玛琪雅朵 = 5, | |||
拿铁 = 6, | |||
白咖啡 = 14, | |||
芮斯崔朵 = 10, | |||
意式玛奇朵 = 13, | |||
奶油咖啡 = 12, | |||
双杯意式咖啡 = 51, | |||
双杯卡布奇诺 = 55, | |||
双杯拿铁 = 57, | |||
双杯玛琪雅朵 = 56, | |||
双杯白咖啡 = 59, | |||
双杯咖啡 = 52, | |||
双杯芮斯崔朵 = 53, | |||
双杯意式玛奇朵 = 58, | |||
双杯奶油咖啡 = 54, | |||
热水 = 3, | |||
牛奶 = 7, | |||
奶沫 = 8, | |||
大壶咖啡 = 11 | |||
} | |||
/*意式咖啡 = 1, | |||
美式咖啡 = 2, | |||
咖啡意式咖啡 = 9, | |||
卡布奇诺 = 4, | |||
玛琪雅朵 = 5, | |||
拿铁 = 6, | |||
白咖啡 = 14, | |||
芮斯崔朵 = 10, | |||
意式玛奇朵 = 13, | |||
奶油咖啡 = 12, | |||
双杯意式咖啡 = 51, | |||
双杯卡布奇诺 = 55, | |||
双杯拿铁 = 57, | |||
双杯玛琪雅朵 = 56, | |||
双杯白咖啡 = 59, | |||
双杯咖啡 = 52, | |||
双杯芮斯崔朵 = 53, | |||
双杯意式玛奇朵 = 58, | |||
双杯奶油咖啡 = 54, | |||
热水 = 3, | |||
牛奶 = 100, | |||
奶沫 = 101, | |||
大壶咖啡 = 11*/ | |||
} |
@@ -4,7 +4,6 @@ using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.Model | |||
{ | |||
/// <summary> | |||
@@ -22,6 +21,7 @@ namespace BPASmartClient.Model | |||
/// 饮品类型 | |||
/// </summary> | |||
public DrinkType DrinkCode { get; set; } | |||
public KLMDrinkFaultType KLMDrinkFaultCode { get; set; } | |||
} | |||
/// <summary> | |||
@@ -11,6 +11,7 @@ namespace BPASmartClient.Model | |||
{ | |||
public int OrderNum { get; set; } | |||
public DrCoffeeDrinksCode DrinkCode { get; set; } | |||
public KLMDrinkFaultType KLMDrinkFaultCode { get; set; } | |||
public int JuiceList { get; set; } | |||
public string JuiceMakeID{ get; set; } | |||
} | |||
@@ -845,7 +845,7 @@ namespace BPASmartClient.MorkF | |||
/// </summary> | |||
private void SingleProcess() | |||
{ | |||
//主流程出餐完成,相应变量复位 | |||
if (morkF.MainOutMealComplete) | |||
@@ -1950,7 +1950,6 @@ namespace BPASmartClient.MorkF | |||
Task.Delay(5).Wait(); | |||
} | |||
} | |||
} | |||
if (morkF.MinorProessStatus) | |||
{ | |||
@@ -88,7 +88,6 @@ namespace BPASmartClient.MorkS | |||
if (o != null && o is WritePar writePar) WriteData(writePar.Address, writePar.Value); | |||
}), "WriteBools"); | |||
ActionManage.GetInstance.Register(new Action(() => { DeviceInit(); }), "InitDevice"); | |||
} | |||
public override void ResetProgram() | |||
@@ -1,13 +0,0 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFramework>net6.0</TargetFramework> | |||
<ImplicitUsings>enable</ImplicitUsings> | |||
<Nullable>enable</Nullable> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\BPASmartClient.Device\BPASmartClient.Device.csproj" /> | |||
</ItemGroup> | |||
</Project> |
@@ -1,317 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Configuration; | |||
using System.Linq; | |||
using System.Threading; | |||
using System.Collections.Concurrent; | |||
using System.Diagnostics; | |||
using System.Threading.Tasks; | |||
using BPASmartClient.Device; | |||
using BPA.Message.Enum; | |||
using BPA.Message; | |||
using BPASmartClient.Helper; | |||
using BPASmartClient.Model.咖啡机.Enum; | |||
using BPASmartClient.Model; | |||
using BPASmartClient.EventBus; | |||
using static BPASmartClient.EventBus.EventBus; | |||
using BPASmartClient.Model.PLC; | |||
using BPASmartClient.Model.单片机; | |||
namespace BPASmartClient.MorkTJuicer | |||
{ | |||
/* | |||
* 冰淇淋咖啡机组合套装 | |||
* 物料位置: | |||
* 1:冰淇料 | |||
* 2:冰淇淋杯 | |||
* 5:咖啡 | |||
* 6:咖啡杯 | |||
* 9: 茶 | |||
* 10: 茶杯 | |||
*/ | |||
public class Control_MORKJC : BaseDevice | |||
{ | |||
GVL_MORKJC mORKD = new GVL_MORKJC(); | |||
//物料存放位置 | |||
private Dictionary<string, PolymerBatching> batchings = new Dictionary<string, PolymerBatching>(); | |||
//容器位置 | |||
private string holderLoc; | |||
//主料位置 | |||
private string mainMaterialLoc; | |||
//子订单ID | |||
private string subOrderId; | |||
private bool enableFunny = false; | |||
private DateTime lastRecvdOrder = DateTime.Now; | |||
private bool working = false; | |||
/// <summary> | |||
/// 果汁机做法,true:热饮,false:冷饮 | |||
/// </summary> | |||
private bool GuMake = false; | |||
private void OrderChange(string subid, ORDER_STATUS oRDER_STATUS) | |||
{ | |||
EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent() { Status = oRDER_STATUS, SubOrderId = subid, deviceClientType = DeviceType }); | |||
} | |||
//private SerialPortClient commProxy; | |||
public void ConnectOk() | |||
{ | |||
} | |||
ConcurrentQueue<MorkOrderPush> morkOrderPushes = new ConcurrentQueue<MorkOrderPush>(); | |||
public void Init() | |||
{ | |||
//构建所有商品物料信息 | |||
batchings = PolymerBatching.BuildAll(); | |||
Main(); | |||
ReadData(); | |||
ThreadManage.GetInstance().StartLong(new Action(() => | |||
{ | |||
while (morkOrderPushes.Count > 0) | |||
{ | |||
while (enableFunny) { Thread.Sleep(10); } | |||
DeviceProcessLogShow("当前非自嗨模式,允许开工"); | |||
working = true; | |||
if (morkOrderPushes.TryDequeue(out MorkOrderPush order)) | |||
{ | |||
DeviceProcessLogShow($"开始制作订单[{order.SortNum}]"); | |||
//商品类型 | |||
GOODS_TYPE currentGoodsType = GOODS_TYPE.NEITHER; | |||
//子订单ID | |||
subOrderId = order.SuborderId; | |||
//遍历物料 | |||
foreach (var item in order.GoodBatchings) | |||
{ | |||
var res = Json<BatchingInfoPar>.Data.orderMaterialDelivery.BatchingInfo.FirstOrDefault(p => p.BatchingId == item.BatchingId); | |||
if (res != null) | |||
{ | |||
//获取主料和容器位置 | |||
switch (batchings[res.BatchingLoc].BatchingClass) | |||
{ | |||
case BATCHING_CLASS.HOLDER: | |||
holderLoc = res.BatchingLoc; | |||
break; | |||
case BATCHING_CLASS.MAIN_MATERIAL: | |||
// mainMaterialLoc ="1"; | |||
mainMaterialLoc = res.BatchingLoc; | |||
//验证商品是咖啡还是冰淇淋 | |||
if (ValidateGoodsByBatching(res.BatchingLoc) != GOODS_TYPE.NEITHER) | |||
{ | |||
//获取当前物料所属商品类型 | |||
currentGoodsType = ValidateGoodsByBatching(res.BatchingLoc); | |||
} | |||
break; | |||
} | |||
} | |||
} | |||
//根据商品类型执行具体制作流程 | |||
switch (currentGoodsType) | |||
{ | |||
case GOODS_TYPE.JUICE: | |||
GuMake = order.MakeID == "2"; | |||
DoJuicer(); | |||
break; | |||
case GOODS_TYPE.NEITHER: | |||
DeviceProcessLogShow("未知的商品类型"); | |||
break; | |||
} | |||
} | |||
working = false; | |||
lastRecvdOrder = DateTime.Now; | |||
} | |||
Thread.Sleep(1000); | |||
}), "订单制作"); | |||
} | |||
public void Main() | |||
{ | |||
//开始心跳刷新,根据咖啡机及冰淇淋机来判断 | |||
//ThreadManage.GetInstance().StartLong(new Action(() => | |||
//{ | |||
// Thread.Sleep(100); | |||
//}), "MORK-IC心跳刷新"); | |||
} | |||
public void DataParse<T>(T order) | |||
{ | |||
if (order is MorkOrderPush morkOrderPush) | |||
{ | |||
morkOrderPushes.Enqueue(morkOrderPush); | |||
} | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="batchingLoc">物料位置</param> | |||
private GOODS_TYPE ValidateGoodsByBatching(string batchingLoc) | |||
{ | |||
if (batchings.ContainsKey(batchingLoc)) | |||
return batchings[batchingLoc].GoodsType; | |||
return GOODS_TYPE.NEITHER; | |||
} | |||
private AutoResetEvent are = new AutoResetEvent(false); | |||
private T GetStatus<T>(string key) | |||
{ | |||
if (peripheralStatus.ContainsKey(key)) | |||
{ | |||
if (peripheralStatus[key] != null) | |||
{ | |||
return (T)(peripheralStatus[key]); | |||
} | |||
} | |||
return default; | |||
} | |||
private void Wait(int value) | |||
{ | |||
while (!((GetStatus<int>("Get_RobotAO1") == value) && GetStatus<int>("GetProgramStatus") == 0))//判断文件是否已经执行结束 且 文件末端变量值==文件名 | |||
{ | |||
Thread.Sleep(5); | |||
} | |||
} | |||
int[] devStatusBy = new int[2] { 0, 0 }; | |||
/// <summary> | |||
/// 果汁机控制信号 | |||
/// </summary> | |||
private byte JuicerNum; | |||
/// <summary> | |||
/// 做果汁 | |||
/// </summary> | |||
private void DoJuicer() | |||
{ | |||
#region 接果汁流程 | |||
OrderChange(subOrderId, BPA.Message.Enum.ORDER_STATUS.COOKING); | |||
try | |||
{ | |||
int JuicerNum1 = int.Parse(mainMaterialLoc); | |||
switch (JuicerNum1) | |||
{ | |||
case 52: | |||
if (GuMake) | |||
{ | |||
JuicerNum = 0x00; | |||
} | |||
else | |||
{ | |||
JuicerNum = 0x01; | |||
} | |||
break; | |||
case 53: | |||
if (GuMake) | |||
{ | |||
JuicerNum = 0x02; | |||
} | |||
else | |||
{ | |||
JuicerNum = 0x03; | |||
} | |||
break; | |||
case 54: | |||
if (GuMake) | |||
{ | |||
JuicerNum = 0x04; | |||
} | |||
else | |||
{ | |||
JuicerNum = 0x05; | |||
} | |||
break; | |||
case 55: | |||
if (GuMake) | |||
{ | |||
JuicerNum = 0x06; | |||
} | |||
else | |||
{ | |||
JuicerNum = 0x07; | |||
} | |||
break; | |||
default: | |||
JuicerNum = 0x00; | |||
break; | |||
} | |||
var devStatus = GetStatus<int[]>("GetDeviceStatus"); | |||
var devStatus1 = Convert.ToString(devStatus[0], 2); | |||
var devStatus2 = devStatus[1]; | |||
if (devStatus1.IndexOf("0") == 1 && devStatus2 == 0) | |||
{ | |||
new WriteJuicer() { Value = JuicerNum }.Publish(); | |||
Thread.Sleep(100); | |||
devStatusBy = GetStatus<int[]>("GetDeviceStatus"); | |||
while (!(devStatusBy[1] == 0)) | |||
{ | |||
Thread.Sleep(100); | |||
devStatusBy = GetStatus<int[]>("GetDeviceStatus"); | |||
while (devStatusBy.Length != 2) | |||
{ | |||
Thread.Sleep(100); | |||
devStatusBy = GetStatus<int[]>("GetDeviceStatus"); | |||
} | |||
} | |||
devStatusBy = GetStatus<int[]>("GetDeviceStatus"); | |||
Thread.Sleep(5000); | |||
OrderChange(subOrderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_TAKE); | |||
} | |||
} | |||
catch (Exception ex) | |||
{ | |||
DeviceProcessLogShow("获取果汁机状态失败"); | |||
} | |||
#endregion | |||
} | |||
public override DeviceClientType DeviceType => throw new NotImplementedException(); | |||
private T McuRead<T>(string tagName, object par) | |||
{ | |||
new ReadMcu() { DeviceId = DeviceId, TagName = tagName, ReadPar = par }; | |||
if (peripheralStatus.ContainsKey(tagName)) | |||
{ | |||
if (peripheralStatus[tagName] != null) | |||
{ | |||
return (T)peripheralStatus[tagName]; | |||
} | |||
} | |||
return default; | |||
} | |||
public void SimOrder<T>(T simOrder) | |||
{ | |||
} | |||
public override void DoMain() | |||
{ | |||
} | |||
public override void Stop() | |||
{ | |||
} | |||
public override void ReadData() | |||
{ | |||
} | |||
public override void MainTask() | |||
{ | |||
} | |||
public override void ResetProgram() | |||
{ | |||
} | |||
public override void SimOrder() | |||
{ | |||
} | |||
} | |||
} |
@@ -1,8 +0,0 @@ | |||
using BPASmartClient.Device; | |||
namespace BPASmartClient.MorkTJuicer | |||
{ | |||
public class GVL_MORKJC : IStatus | |||
{ | |||
} | |||
} |
@@ -1,15 +0,0 @@ | |||
using BPASmartClient.Device; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM | |||
{ | |||
public class Alarm: IAlarm | |||
{ | |||
[Alarm("报警")] | |||
public string Name { get; set; } | |||
} | |||
} |
@@ -1,48 +0,0 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFramework>net6.0-windows</TargetFramework> | |||
<ImplicitUsings>enable</ImplicitUsings> | |||
<Nullable>enable</Nullable> | |||
<UseWPF>true</UseWPF> | |||
<OutputType>Library</OutputType> | |||
<UseWindowsForms>False</UseWindowsForms> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\BPASmartClient.CustomResource\BPASmartClient.CustomResource.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.Device\BPASmartClient.Device.csproj" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Update="Properties\Resources.Designer.cs"> | |||
<DesignTime>True</DesignTime> | |||
<AutoGen>True</AutoGen> | |||
<DependentUpon>Resources.resx</DependentUpon> | |||
</Compile> | |||
<Compile Update="Properties\Settings.Designer.cs"> | |||
<DesignTimeSharedInput>True</DesignTimeSharedInput> | |||
<AutoGen>True</AutoGen> | |||
<DependentUpon>Settings.settings</DependentUpon> | |||
</Compile> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<EmbeddedResource Update="Properties\Resources.resx"> | |||
<Generator>ResXFileCodeGenerator</Generator> | |||
<LastGenOutput>Resources.Designer.cs</LastGenOutput> | |||
</EmbeddedResource> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Update="Properties\Settings.settings"> | |||
<Generator>SettingsSingleFileGenerator</Generator> | |||
<LastGenOutput>Settings.Designer.cs</LastGenOutput> | |||
</None> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Folder Include="Control\" /> | |||
</ItemGroup> | |||
</Project> |
@@ -1,169 +0,0 @@ | |||
using BPA.Message; | |||
using BPA.Message.Enum; | |||
using BPASmartClient.Device; | |||
using BPASmartClient.EventBus; | |||
using BPASmartClient.Helper; | |||
using BPASmartClient.Message; | |||
using BPASmartClient.Model; | |||
using BPASmartClient.Model.PLC; | |||
using BPASmartClient.MorkTM.Model; | |||
using System.Collections.Concurrent; | |||
using static BPASmartClient.EventBus.EventBus; | |||
namespace BPASmartClient.MorkTM | |||
{ | |||
public class Control_MorkTM : BaseDevice | |||
{ | |||
public override DeviceClientType DeviceType => throw new NotImplementedException(); | |||
GVL_MorkTM morkTM = new GVL_MorkTM(); | |||
public override void DoMain() | |||
{ | |||
ServerInit(); | |||
DataParse(); | |||
ActionManage.GetInstance.Register(new Action<object>((o) => | |||
{ | |||
if (o != null && o is WritePar writePar) WriteData(writePar.Address, writePar.Value); | |||
}), "WriteVW"); | |||
ActionManage.GetInstance.Register(new Action<object>((o) => | |||
{ | |||
if (o != null && o is WritePar writePar) WriteData(writePar.Address, writePar.Value); | |||
}), "WriteBools"); | |||
DeviceProcessLogShow("设备初始化完成"); | |||
} | |||
private void ServerInit() | |||
{ | |||
//物料信息 | |||
EventBus.EventBus.GetInstance().Subscribe<MaterialDeliveryEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack) | |||
{ | |||
if (@event == null) return; | |||
if (@event is MaterialDeliveryEvent material) | |||
{ | |||
orderMaterialDelivery = material.orderMaterialDelivery; | |||
} | |||
}); | |||
//配方数据信息 | |||
EventBus.EventBus.GetInstance().Subscribe<RecipeBomEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack) | |||
{ | |||
if (@event == null) return; | |||
if (@event is RecipeBomEvent recipe) | |||
{ | |||
recipeBoms = recipe.recipeBoms; | |||
} | |||
}); | |||
} | |||
private void DataParse() | |||
{ | |||
EventBus.EventBus.GetInstance().Subscribe<DoOrderEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack) | |||
{ | |||
if(@event == null) return; | |||
if(@event is DoOrderEvent order) | |||
{ | |||
if (order.MorkOrder.GoodBatchings == null) return; | |||
OrderCount++; | |||
OrderChange(order.MorkOrder, ORDER_STATUS.WAIT); | |||
DeviceProcessLogShow($"接收到{OrderCount}次订单"); | |||
Dictionary<string, int> OrderPushes = new Dictionary<string, int>(); | |||
foreach (var item in order.MorkOrder.GoodBatchings) | |||
{ | |||
var res = orderMaterialDelivery?.BatchingInfo?.FirstOrDefault(p => p.BatchingId == item.BatchingId); | |||
if (res != null) | |||
{ | |||
OrderPushes.TryAdd(res.BatchingLoc, item.BatchingCount); | |||
} | |||
} | |||
morkTM.morkOrderPushesTeaWithMilk.Enqueue(new OrderLocInfo() | |||
{ | |||
GoodName = order.MorkOrder.GoodsName, | |||
SuborderId = order.MorkOrder.SuborderId, | |||
GoodPushes = OrderPushes | |||
}); | |||
} | |||
}); | |||
} | |||
private void OrderChange(MorkOrderPush orderPush, ORDER_STATUS oRDER_STATUS) | |||
{ | |||
EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent() | |||
{ | |||
SortNum = orderPush.SortNum.ToString(), | |||
GoodName = orderPush.GoodsName, | |||
Status = oRDER_STATUS, | |||
SubOrderId = orderPush.SuborderId, | |||
deviceClientType = DeviceType | |||
}); | |||
} | |||
public override void MainTask() | |||
{ | |||
IsHealth = true; | |||
MakeTeaWithMilkProcess(); | |||
} | |||
private void MakeTeaWithMilkProcess() | |||
{ | |||
if(morkTM.morkOrderPushesTeaWithMilk.Count > 0) | |||
{ | |||
if(morkTM.morkOrderPushesTeaWithMilk.TryDequeue(out OrderLocInfo orderLoc)) | |||
{ | |||
morkTM.RecipesPushes.Clear(); | |||
morkTM.RecipesPushes = orderLoc.GoodPushes; | |||
foreach(var item in morkTM.RecipesPushes) | |||
{ | |||
WriteData(item.Key,item.Value); | |||
while (!RTrig.GetInstance("OutMaterialComplete").Start(morkTM.OutMaterialComplete)) | |||
{ | |||
Thread.Sleep(100); | |||
} | |||
DeviceProcessLogShow($"奶茶{orderLoc.GoodName}:配料{item.Key}:添加量{item.Value}"); | |||
} | |||
} | |||
} | |||
} | |||
public override void ReadData() | |||
{ | |||
throw new NotImplementedException(); | |||
} | |||
public override void ResetProgram() | |||
{ | |||
morkTM = null; | |||
morkTM = new GVL_MorkTM(); | |||
} | |||
private void WriteData(string address, object value) | |||
{ | |||
EventBus.EventBus.GetInstance().Publish(new WriteModel() { DeviceId = DeviceId, Address = address, Value = value }); | |||
} | |||
private void GetStatus(string key, Action<object> action) | |||
{ | |||
if (peripheralStatus.ContainsKey(key)) | |||
{ | |||
if (peripheralStatus[key] != null) | |||
{ | |||
action?.Invoke(peripheralStatus[key]); | |||
} | |||
} | |||
} | |||
public override void SimOrder() | |||
{ | |||
throw new NotImplementedException(); | |||
} | |||
public override void Stop() | |||
{ | |||
throw new NotImplementedException(); | |||
} | |||
} | |||
} |
@@ -1,33 +0,0 @@ | |||
using BPA.Models; | |||
using BPASmartClient.Device; | |||
using System; | |||
using System.Collections.Concurrent; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM | |||
{ | |||
public class GVL_MorkTM: IStatus | |||
{ | |||
/// <summary> | |||
/// 奶茶订单队列 | |||
/// </summary> | |||
public ConcurrentQueue<OrderLocInfo> morkOrderPushesTeaWithMilk = new ConcurrentQueue<OrderLocInfo>(); | |||
/// <summary> | |||
/// 当前正在制作的奶茶订单 | |||
/// </summary> | |||
public OrderLocInfo CurrentOrderLoc = new OrderLocInfo(); | |||
/// <summary> | |||
/// 奶茶配料的队列 | |||
/// </summary> | |||
public Dictionary<string, int> RecipesPushes = new Dictionary<string, int>(); | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
[VariableMonitor("出料完成", "", "")] | |||
public bool OutMaterialComplete { get; set; } | |||
} | |||
} |
@@ -1,31 +0,0 @@ | |||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.ComponentModel; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM.Model | |||
{ | |||
public class Alarms : ObservableObject | |||
{ | |||
private string _id; | |||
public string ID { get { return _id; } set { _id = value; OnPropertyChanged(); } } | |||
private string _varName; | |||
public string VarName { get { return _varName; } set { _varName = value; OnPropertyChanged(); } } | |||
private string _plcAddress; | |||
public string PLCAddress { get { return _plcAddress; } set { _plcAddress = value; OnPropertyChanged(); } } | |||
private string _modbusTCP; | |||
public string ModbusTCP { get { return _modbusTCP; } set { _modbusTCP = value; OnPropertyChanged(); } } | |||
private string _value; | |||
public string Value { get { return _value; } set { _value = value; OnPropertyChanged(); } } | |||
private string _notes; | |||
public string Notes { get { return _notes; } set { _notes = value; OnPropertyChanged(); } } | |||
} | |||
} |
@@ -1,14 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM.Model | |||
{ | |||
public class WritePar | |||
{ | |||
public string Address { get; set; } | |||
public object Value { get; set; } | |||
} | |||
} |
@@ -1,24 +0,0 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM | |||
{ | |||
public enum Material | |||
{ | |||
Material_Top_1, Material_Top_2, Material_Top_3, Material_Top_4, Material_Top_5, Material_Top_6, | |||
Material_Mid_1, Material_Mid_2, Material_Mid_3, Material_Mid_4, Material_Mid_5, Material_Mid_6, Material_Mid_7, Material_Mid_8, Material_Mid_9, Material_Mid_10, | |||
Marerial_Bottom_1, Marerial_Bottom_2, Marerial_Bottom_3, Marerial_Top_4,Marerial_Bottom_5, Marerial_Bottom_6 | |||
} | |||
public enum TeaStorageBox | |||
{ | |||
TeaStorageBox_1, TeaStorageBox_2, TeaStorageBox_3, TeaStorageBox_4, TeaStorageBox_5, TeaStorageBox_6 | |||
} | |||
public class PolymerBatching | |||
{ | |||
} | |||
} |
@@ -1,16 +0,0 @@ | |||
using System.Runtime.InteropServices; | |||
[assembly: System.Windows.ThemeInfo(System.Windows.ResourceDictionaryLocation.None, System.Windows.ResourceDictionaryLocation.SourceAssembly)] | |||
// 在此类的 SDK 样式项目中,现在,在此文件中早前定义的几个程序集属性将在生成期间自动添加,并使用在项目属性中定义的值进行填充。有关包含的属性以及如何定制此过程的详细信息,请参阅 | |||
// https://aka.ms/assembly-info-properties | |||
// 将 ComVisible 设置为 false 会使此程序集中的类型对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,请将该类型的 ComVisible | |||
// 属性设置为 true。 | |||
[assembly: ComVisible(false)] | |||
// 如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID。 | |||
[assembly: Guid("a100db3c-23af-4bd5-991e-224a062d4f2d")] |
@@ -1,63 +0,0 @@ | |||
//------------------------------------------------------------------------------ | |||
// <auto-generated> | |||
// 此代码由工具生成。 | |||
// 运行时版本:4.0.30319.42000 | |||
// | |||
// 对此文件的更改可能会导致不正确的行为,并且如果 | |||
// 重新生成代码,这些更改将会丢失。 | |||
// </auto-generated> | |||
//------------------------------------------------------------------------------ | |||
namespace BPASmartClient.MorkTM.Properties { | |||
using System; | |||
/// <summary> | |||
/// 一个强类型的资源类,用于查找本地化的字符串等。 | |||
/// </summary> | |||
// 此类是由 StronglyTypedResourceBuilder | |||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 | |||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen | |||
// (以 /str 作为命令选项),或重新生成 VS 项目。 | |||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] | |||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | |||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | |||
internal class Resources { | |||
private static global::System.Resources.ResourceManager resourceMan; | |||
private static global::System.Globalization.CultureInfo resourceCulture; | |||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | |||
internal Resources() { | |||
} | |||
/// <summary> | |||
/// 返回此类使用的缓存的 ResourceManager 实例。 | |||
/// </summary> | |||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |||
internal static global::System.Resources.ResourceManager ResourceManager { | |||
get { | |||
if (object.ReferenceEquals(resourceMan, null)) { | |||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BPASmartClient.MorkTM.Properties.Resources", typeof(Resources).Assembly); | |||
resourceMan = temp; | |||
} | |||
return resourceMan; | |||
} | |||
} | |||
/// <summary> | |||
/// 重写当前线程的 CurrentUICulture 属性,对 | |||
/// 使用此强类型资源类的所有资源查找执行重写。 | |||
/// </summary> | |||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | |||
internal static global::System.Globalization.CultureInfo Culture { | |||
get { | |||
return resourceCulture; | |||
} | |||
set { | |||
resourceCulture = value; | |||
} | |||
} | |||
} | |||
} |
@@ -1,101 +0,0 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<root> | |||
<!-- | |||
Microsoft ResX Schema | |||
Version 1.3 | |||
The primary goals of this format is to allow a simple XML format | |||
that is mostly human readable. The generation and parsing of the | |||
various data types are done through the TypeConverter classes | |||
associated with the data types. | |||
Example: | |||
... ado.net/XML headers & schema ... | |||
<resheader name="resmimetype">text/microsoft-resx</resheader> | |||
<resheader name="version">1.3</resheader> | |||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | |||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | |||
<data name="Name1">this is my long string</data> | |||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | |||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | |||
[base64 mime encoded serialized .NET Framework object] | |||
</data> | |||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | |||
[base64 mime encoded string representing a byte array form of the .NET Framework object] | |||
</data> | |||
There are any number of "resheader" rows that contain simple | |||
name/value pairs. | |||
Each data row contains a name, and value. The row also contains a | |||
type or mimetype. Type corresponds to a .NET class that support | |||
text/value conversion through the TypeConverter architecture. | |||
Classes that don't support this are serialized and stored with the | |||
mimetype set. | |||
The mimetype is used for serialized objects, and tells the | |||
ResXResourceReader how to depersist the object. This is currently not | |||
extensible. For a given mimetype the value must be set accordingly: | |||
Note - application/x-microsoft.net.object.binary.base64 is the format | |||
that the ResXResourceWriter will generate, however the reader can | |||
read any of the formats listed below. | |||
mimetype: application/x-microsoft.net.object.binary.base64 | |||
value : The object must be serialized with | |||
: System.Serialization.Formatters.Binary.BinaryFormatter | |||
: and then encoded with base64 encoding. | |||
mimetype: application/x-microsoft.net.object.soap.base64 | |||
value : The object must be serialized with | |||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter | |||
: and then encoded with base64 encoding. | |||
mimetype: application/x-microsoft.net.object.bytearray.base64 | |||
value : The object must be serialized into a byte array | |||
: using a System.ComponentModel.TypeConverter | |||
: and then encoded with base64 encoding. | |||
--> | |||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | |||
<xsd:element name="root" msdata:IsDataSet="true"> | |||
<xsd:complexType> | |||
<xsd:choice maxOccurs="unbounded"> | |||
<xsd:element name="data"> | |||
<xsd:complexType> | |||
<xsd:sequence> | |||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | |||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | |||
</xsd:sequence> | |||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> | |||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | |||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | |||
</xsd:complexType> | |||
</xsd:element> | |||
<xsd:element name="resheader"> | |||
<xsd:complexType> | |||
<xsd:sequence> | |||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | |||
</xsd:sequence> | |||
<xsd:attribute name="name" type="xsd:string" use="required" /> | |||
</xsd:complexType> | |||
</xsd:element> | |||
</xsd:choice> | |||
</xsd:complexType> | |||
</xsd:element> | |||
</xsd:schema> | |||
<resheader name="resmimetype"> | |||
<value>text/microsoft-resx</value> | |||
</resheader> | |||
<resheader name="version"> | |||
<value>1.3</value> | |||
</resheader> | |||
<resheader name="reader"> | |||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||
</resheader> | |||
<resheader name="writer"> | |||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||
</resheader> | |||
</root> |
@@ -1,26 +0,0 @@ | |||
//------------------------------------------------------------------------------ | |||
// <auto-generated> | |||
// 此代码由工具生成。 | |||
// 运行时版本:4.0.30319.42000 | |||
// | |||
// 对此文件的更改可能会导致不正确的行为,并且如果 | |||
// 重新生成代码,这些更改将会丢失。 | |||
// </auto-generated> | |||
//------------------------------------------------------------------------------ | |||
namespace BPASmartClient.MorkTM.Properties { | |||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | |||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.1.0.0")] | |||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { | |||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); | |||
public static Settings Default { | |||
get { | |||
return defaultInstance; | |||
} | |||
} | |||
} | |||
} |
@@ -1,6 +0,0 @@ | |||
<?xml version='1.0' encoding='utf-8'?> | |||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)"> | |||
<Profiles> | |||
<Profile Name="(Default)" /> | |||
</Profiles> | |||
</SettingsFile> |
@@ -1,69 +0,0 @@ | |||
<UserControl x:Class="BPASmartClient.MorkTM.View.Debug" | |||
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:BPASmartClient.MorkTM.View" | |||
xmlns:vm="clr-namespace:BPASmartClient.MorkTM.ViewModel" | |||
mc:Ignorable="d" | |||
d:DesignHeight="800" d:DesignWidth="1000" | |||
Name="调试界面"> | |||
<UserControl.DataContext> | |||
<vm:DebugViewModel/> | |||
</UserControl.DataContext> | |||
<UserControl.Resources> | |||
<ResourceDictionary> | |||
<ResourceDictionary.MergedDictionaries> | |||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||
</ResourceDictionary.MergedDictionaries> | |||
</ResourceDictionary> | |||
</UserControl.Resources> | |||
<Grid> | |||
<Grid.ColumnDefinitions> | |||
<ColumnDefinition Width="*"/> | |||
<ColumnDefinition Width="*"/> | |||
</Grid.ColumnDefinitions> | |||
<Grid.RowDefinitions> | |||
<RowDefinition Height="2*"/> | |||
<RowDefinition Height="2*"/> | |||
<RowDefinition Height="10*"/> | |||
<RowDefinition Height="10*"/> | |||
</Grid.RowDefinitions> | |||
<StackPanel Orientation="Horizontal"> | |||
<TextBlock Text="出料口" Margin="10,0"/> | |||
<ComboBox ItemsSource="{Binding Materials}" Width="80" Margin="20,0"/> | |||
<TextBlock Text="出料量" Margin="40,0,10,0"/> | |||
<TextBox Text="{Binding MaertialsWight}" Width="60" Margin="10,0"/> | |||
<Button Content="出料" Margin="40,0" Command="{Binding OutMaterials}"/> | |||
</StackPanel> | |||
<Button Grid.Column="1" | |||
Width="120" Margin="20,0" HorizontalAlignment="Left" | |||
Content="转盘转动" Command="{Binding TurnOn}"/> | |||
<Border BorderBrush="White" BorderThickness="2" Grid.Column="0" Grid.Row="1" Grid.RowSpan="2"/> | |||
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center"> | |||
<TextBlock Text="奶茶" Margin="20,0"/> | |||
<ComboBox ItemsSource="{Binding}" Width="120"/> | |||
</StackPanel> | |||
<Grid Grid.Row="2"> | |||
<Grid.ColumnDefinitions> | |||
<ColumnDefinition Width="*"/> | |||
</Grid.ColumnDefinitions> | |||
<Grid.RowDefinitions> | |||
<RowDefinition Height="4*"/> | |||
<RowDefinition Height="*"/> | |||
</Grid.RowDefinitions> | |||
<Viewbox Stretch="Fill"> | |||
</Viewbox> | |||
<Button Content="制作" | |||
Grid.Row="3" Grid.ColumnSpan="4" | |||
HorizontalAlignment="Center"/> | |||
</Grid> | |||
</Grid> | |||
</UserControl> |
@@ -1,50 +0,0 @@ | |||
<UserControl x:Class="BPASmartClient.MorkTM.View.Monitor" | |||
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:BPASmartClient.MorkTM.View" | |||
xmlns:vm="clr-namespace:BPASmartClient.MorkTM.ViewModel" | |||
mc:Ignorable="d" | |||
Name="监控画面" | |||
d:DesignHeight="450" d:DesignWidth="800"> | |||
<Control.DataContext> | |||
<vm:MonitorViewModel/> | |||
</Control.DataContext> | |||
<UserControl.Resources> | |||
<ResourceDictionary> | |||
<ResourceDictionary.MergedDictionaries> | |||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||
</ResourceDictionary.MergedDictionaries> | |||
</ResourceDictionary> | |||
</UserControl.Resources> | |||
<Grid Margin="5" > | |||
<DataGrid Style="{StaticResource dataGrid_Style}" ItemsSource="{Binding alarms}" | |||
x:Name="gridAlarm" Margin="5" AutoGenerateColumns="False" RowHeight="100" | |||
LoadingRow="gridProducts_LoadingRow" | |||
FrozenColumnCount="1" | |||
VerticalAlignment="Top" | |||
IsReadOnly="True" | |||
CanUserResizeColumns="False" CanUserResizeRows="False" SelectionMode="Single" | |||
CanUserReorderColumns="False" AlternationCount="2" RowHeaderWidth="0" CanUserAddRows="False"> | |||
<DataGrid.Columns> | |||
<DataGridTextColumn Header="ID" Binding="{Binding Path=ID ,Mode=TwoWay ,UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dataGridHeader_Style}" Width="60" | |||
CellStyle="{StaticResource dataGridCell_Style}"/> | |||
<DataGridTextColumn Header="变量名" Binding="{Binding Path=VarName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dataGridHeader_Style}" Width="120" | |||
CellStyle="{StaticResource dataGridCell_Style}"/> | |||
<DataGridTextColumn Header="PLC地址" Binding="{Binding Path=PLCAddress,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dataGridHeader_Style}" Width="120" | |||
CellStyle="{StaticResource dataGridCell_Style}"/> | |||
<DataGridTextColumn Header="Modbus TCP地址" Binding="{Binding Path=ModbusTCP,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dataGridHeader_Style}" Width="170" | |||
CellStyle="{StaticResource dataGridCell_Style}"/> | |||
<DataGridTextColumn Header="当前值" Binding="{Binding Path=Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dataGridHeader_Style}" Width="100" | |||
CellStyle="{StaticResource dataGridCell_Style}"/> | |||
<DataGridTextColumn Header="注释" Binding="{Binding Path=Notes,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dataGridHeader_Style}" Width="*" | |||
CellStyle="{StaticResource dataGridCell_Style}"/> | |||
</DataGrid.Columns> | |||
</DataGrid> | |||
</Grid> | |||
</UserControl> |
@@ -1,35 +0,0 @@ | |||
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 BPASmartClient.MorkTM.View | |||
{ | |||
/// <summary> | |||
/// Monitor.xaml 的交互逻辑 | |||
/// </summary> | |||
public partial class Monitor : UserControl | |||
{ | |||
public Monitor() | |||
{ | |||
InitializeComponent(); | |||
} | |||
private void gridProducts_LoadingRow(object sender, DataGridRowEventArgs e) | |||
{ | |||
} | |||
} | |||
} |
@@ -1,49 +0,0 @@ | |||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||
using Microsoft.Toolkit.Mvvm.Input; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Collections.ObjectModel; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM.ViewModel | |||
{ | |||
public class DebugViewModel : ObservableObject | |||
{ | |||
/// <summary> | |||
/// 出料口集合 | |||
/// </summary> | |||
public List<string> Materials { get; set; } = new List<string>(); | |||
/// <summary> | |||
/// 奶茶 | |||
/// </summary> | |||
public ObservableCollection<string> TeaWithMilkType { get; set; } | |||
/// <summary> | |||
/// 出料 | |||
/// </summary> | |||
public RelayCommand OutMaterials { get; set; } | |||
/// <summary> | |||
/// 转盘转动 | |||
/// </summary> | |||
public RelayCommand TurnOn { get; set; } | |||
public float MaertialsWight { get { return _maertialsWight; } set { _maertialsWight = value; OnPropertyChanged(); } } | |||
private float _maertialsWight = 10; | |||
public DebugViewModel() | |||
{ | |||
foreach(TeaStorageBox code in Enum.GetValues(typeof(TeaStorageBox))) | |||
{ | |||
Materials.Add(code.ToString()); | |||
} | |||
foreach (Material materials in Enum.GetValues(typeof(Material))) | |||
{ | |||
Materials.Add(materials.ToString()); | |||
} | |||
} | |||
} | |||
} |
@@ -1,27 +0,0 @@ | |||
using BPASmartClient.MorkTM.Model; | |||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Collections.ObjectModel; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM.ViewModel | |||
{ | |||
public class MonitorViewModel: ObservableObject | |||
{ | |||
public ObservableCollection<Alarms> alarms { get; set; } = new ObservableCollection<Alarms>(); | |||
public MonitorViewModel() | |||
{ | |||
alarms.Add(new Alarms() { ID = "1", VarName = "1", ModbusTCP = "1", Notes = "1111", PLCAddress = "D1", Value = "33" }); | |||
alarms.Add(new Alarms() { ID = "2", VarName = "2", ModbusTCP = "2", Notes = "2222", PLCAddress = "D2", Value = "33" }); | |||
alarms.Add(new Alarms() { ID = "3", VarName = "3", ModbusTCP = "3", Notes = "3333", PLCAddress = "D2", Value = "33" }); | |||
} | |||
} | |||
} |
@@ -0,0 +1,16 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFramework>net6.0-windows</TargetFramework> | |||
<Nullable>enable</Nullable> | |||
<UseWPF>true</UseWPF> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\BPASmartClient.Business\BPASmartClient.Business.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.CustomResource\BPASmartClient.CustomResource.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.Device\BPASmartClient.Device.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.KLMCoffee\BPASmartClient.KLMCoffee.csproj" /> | |||
</ItemGroup> | |||
</Project> |
@@ -0,0 +1,315 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Configuration; | |||
using System.Linq; | |||
using System.Threading; | |||
using System.Collections.Concurrent; | |||
using System.Diagnostics; | |||
using System.Threading.Tasks; | |||
using BPASmartClient.Device; | |||
using BPA.Message.Enum; | |||
using BPA.Message; | |||
using BPASmartClient.Helper; | |||
using BPASmartClient.Model.咖啡机.Enum; | |||
using BPASmartClient.Model; | |||
using BPASmartClient.EventBus; | |||
using static BPASmartClient.EventBus.EventBus; | |||
using BPASmartClient.Model.PLC; | |||
using BPASmartClient.Model.单片机; | |||
using BPASmartClient.Business; | |||
using BPASmartClient.KLMCoffee.Protocal; | |||
using BPASmartClient.Message; | |||
namespace BPASmartClient.MorkTSingle | |||
{ | |||
/* | |||
* 冰淇淋咖啡机组合套装 | |||
* 物料位置: | |||
* 1:冰淇料 | |||
* 2:冰淇淋杯 | |||
* 5:咖啡 | |||
* 6:咖啡杯 | |||
* 9: 茶 | |||
* 10: 茶杯 | |||
*/ | |||
public class Control_MORKJC : BaseDevice | |||
{ | |||
public override global::BPA.Message.Enum.DeviceClientType DeviceType { get { return BPA.Message.Enum.DeviceClientType.MORKT; } } | |||
GVL_MORKJC morkT = new GVL_MORKJC(); | |||
//物料存放位置 | |||
private Dictionary<string, PolymerBatching> batchings = new Dictionary<string, PolymerBatching>(); | |||
//容器位置 | |||
private string holderLoc; | |||
//主料位置 | |||
private string mainMaterialLoc; | |||
/// <summary> | |||
/// 果汁机做法,true:热饮,false:冷饮 | |||
/// </summary> | |||
private bool GuMake = false; | |||
private void OrderChange(string subid, ORDER_STATUS oRDER_STATUS) | |||
{ | |||
EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent() { Status = oRDER_STATUS, SubOrderId = subid, deviceClientType = DeviceType }); | |||
} | |||
//private SerialPortClient commProxy; | |||
public void ConnectOk() | |||
{ | |||
} | |||
ConcurrentQueue<MorkOrderPush> morkOrderPushes = new ConcurrentQueue<MorkOrderPush>(); | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="batchingLoc">物料位置</param> | |||
private GOODS_TYPE ValidateGoodsByBatching(string batchingLoc) | |||
{ | |||
if (batchings.ContainsKey(batchingLoc)) | |||
return batchings[batchingLoc].GoodsType; | |||
return GOODS_TYPE.NEITHER; | |||
} | |||
private AutoResetEvent are = new AutoResetEvent(false); | |||
private void GetStatus(string key, Action<object> action) | |||
{ | |||
if (peripheralStatus.ContainsKey(key)) | |||
{ | |||
if (peripheralStatus[key] != null) | |||
{ | |||
action?.Invoke(peripheralStatus[key]); | |||
} | |||
} | |||
} | |||
DateTime delayTimeOut_Coffee; | |||
private void DoCoffee() | |||
{ | |||
if (IsHealth && morkT.morkOrderPushesCoffee.Count > 0 && !morkT.IsCoffeeMake /*&& morkT.coffeeState== K95SysTemStatus.空闲状态*/) | |||
{ | |||
Thread.Sleep(1000); | |||
OrderChange(morkT.morkOrderPushesCoffee.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COOKING); | |||
new KLMCoffee_MakeCoffeeEvent() { DeviceId=DeviceId, KLMDrinkFaultCode = (KLMDrinkFaultType)(morkT.morkOrderPushesCoffee.ElementAt(0).Loc) }.Publish(); //接咖啡控制 //DrCoffeeDrinksCode.热水 | |||
morkT.IsCoffeeMake = true; | |||
} | |||
else if (morkT.MakeCoffeeFinish && IsHealth && morkT.morkOrderPushesCoffee.Count > 0 && morkT.IsCoffeeMake) | |||
{ | |||
OrderChange(morkT.morkOrderPushesCoffee.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_TAKE); | |||
DeviceProcessLogShow($"{morkT.morkOrderPushesCoffee.ElementAt(0).GoodName}制作完成"); | |||
if (morkT.morkOrderPushesCoffee.TryDequeue(out OrderLocInfo orderloc)) | |||
{ | |||
morkT.IsCoffeeMake = false; | |||
morkT.MakeCoffeeFinish = false; | |||
Thread.Sleep(1000); | |||
}; | |||
} | |||
} | |||
private T McuRead<T>(string tagName, object par) | |||
{ | |||
new ReadMcu() { DeviceId = DeviceId, TagName = tagName, ReadPar = par }; | |||
if (peripheralStatus.ContainsKey(tagName)) | |||
{ | |||
if (peripheralStatus[tagName] != null) | |||
{ | |||
return (T)peripheralStatus[tagName]; | |||
} | |||
} | |||
return default; | |||
} | |||
public void SimOrder<T>(T simOrder) | |||
{ | |||
} | |||
public override void DoMain() | |||
{ | |||
if (Json<KeepDataBase>.Data.IsVerify) | |||
{ | |||
IsHealth = true; | |||
} | |||
IsHealth = true; | |||
serverInit(); | |||
DataParse(); | |||
} | |||
private void serverInit() | |||
{ | |||
EventBus.EventBus.GetInstance().Subscribe<MaterialDeliveryEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack) | |||
{ | |||
if (@event == null) return; | |||
if (@event is MaterialDeliveryEvent material) | |||
{ | |||
orderMaterialDelivery = material.orderMaterialDelivery; | |||
} | |||
}); | |||
} | |||
private void DataParse() | |||
{ | |||
EventBus.EventBus.GetInstance().Subscribe<DoOrderEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBackHandle) | |||
{ | |||
if (@event == null) return; | |||
if (@event is DoOrderEvent order) | |||
{ | |||
if (order.MorkOrder.GoodBatchings == null) return; | |||
OrderCount++; | |||
DeviceProcessLogShow($"接收到{OrderCount}次订单"); | |||
batchings = PolymerBatching.BuildAll(); | |||
//商品类型 | |||
GOODS_TYPE currentGoodsType = GOODS_TYPE.NEITHER; | |||
foreach (var item in order.MorkOrder.GoodBatchings) | |||
{ | |||
var res = orderMaterialDelivery?.BatchingInfo?.FirstOrDefault(p => p.BatchingId == item.BatchingId); | |||
if (res != null) | |||
{ | |||
//验证商品是做的某种饮料 | |||
if (ValidateGoodsByBatching(res.BatchingLoc) != GOODS_TYPE.NEITHER) | |||
{ | |||
//获取当前物料所属商品类型 | |||
currentGoodsType = ValidateGoodsByBatching(res.BatchingLoc); | |||
} | |||
switch (batchings[res.BatchingLoc].BatchingClass) | |||
{ | |||
case BATCHING_CLASS.HOLDER: | |||
holderLoc = res.BatchingLoc; | |||
break; | |||
case BATCHING_CLASS.MAIN_MATERIAL: | |||
mainMaterialLoc = res.BatchingLoc; | |||
break; | |||
} | |||
//根据商品类型执行具体制作流程 | |||
switch (currentGoodsType) | |||
{ | |||
case GOODS_TYPE.COFFEE: | |||
if (morkT.morkOrderPushesCoffee.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null) | |||
{ | |||
morkT.morkOrderPushesCoffee.Enqueue(new OrderLocInfo() | |||
{ | |||
SuborderId = order.MorkOrder.SuborderId, | |||
BatchingId = res.BatchingId, | |||
Loc = ushort.Parse(mainMaterialLoc), | |||
GoodName = order.MorkOrder.GoodsName, | |||
}); | |||
} | |||
break; | |||
case GOODS_TYPE.NEITHER: | |||
DeviceProcessLogShow("未知的商品类型"); | |||
break; | |||
} | |||
} | |||
} | |||
} | |||
}); | |||
} | |||
public override void Stop() | |||
{ | |||
} | |||
public override void ReadData() | |||
{ | |||
} | |||
private bool bFirstTrig_Coffee = false; | |||
public override void MainTask() | |||
{ | |||
GetStatus("CoffeeStatus", new Action<object>((o) => | |||
{ | |||
if (o is int b) | |||
{ | |||
morkT.coffeeState = (K95SysTemStatus)b; | |||
} | |||
})); | |||
GetStatus("CoffeeIsConnected", new Action<object>((o) => | |||
{ | |||
if (o is bool b) | |||
{ | |||
morkT.KLMCoffeeIsConnected = b; | |||
} | |||
})); | |||
if ( morkT.morkOrderPushesCoffee.Count > 0) { | |||
if (morkT.KLMCoffeeIsConnected) | |||
{ | |||
if (morkT.IsCoffeeMake) | |||
{ | |||
EventBus.EventBus.GetInstance().Subscribe<KLMCoffee_CoffeEndCookEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack) | |||
{ | |||
bFirstTrig_Coffee = false; | |||
morkT.MakeCoffeeFinish = true; | |||
}); | |||
if (morkT.MakeCoffeeFinish != true && morkT.MakeCoffeeFinish == false) | |||
{ | |||
if (!bFirstTrig_Coffee) | |||
{ | |||
bFirstTrig_Coffee = true; | |||
delayTimeOut_Coffee = DateTime.Now; | |||
} | |||
else if (DateTime.Now.Subtract(delayTimeOut_Coffee).TotalSeconds > 60 && bFirstTrig_Coffee == true) | |||
{ | |||
DeviceProcessLogShow("接咖啡超时,接咖啡结束,等待取咖啡"); | |||
bFirstTrig_Coffee = false; | |||
morkT.MakeCoffeeFinish = true; | |||
} | |||
} | |||
} | |||
DoCoffee(); | |||
} | |||
else | |||
{ | |||
MessageLog.GetInstance.ShowEx("未读取到咖啡机设备心跳"); | |||
} | |||
} | |||
} | |||
public override void ResetProgram() | |||
{ | |||
} | |||
public override void SimOrder() | |||
{ | |||
EventBus.EventBus.GetInstance().Subscribe<MorkTSimOrder>(0, delegate (IEvent @event, EventCallBackHandle callBackHandle) | |||
{ | |||
string guid = Guid.NewGuid().ToString(); | |||
if (@event != null && @event is MorkTSimOrder msm) | |||
{ | |||
DeviceProcessLogShow("----开始模拟订单----"); | |||
morkT.morkOrderPushesCoffee.Enqueue(new OrderLocInfo() { Loc = (ushort)msm.KLMDrinkFaultCode, SuborderId = guid, GoodName = "模拟咖啡订单" }); | |||
} | |||
}); | |||
/* | |||
string aa = calLrcCommon("01" + "05" + "0000000D"); | |||
string bb = ":01010001" + aa + "\r\n";*/ | |||
} | |||
public static string calLrcCommon(string data) | |||
{ | |||
try | |||
{ | |||
if (data.Length % 2 != 0) | |||
{ | |||
data = data + "0"; | |||
} | |||
int total = 0; | |||
int len = data.Length; | |||
int num = 0; | |||
while (num < len) | |||
{ | |||
string s = data.Substring(num, 2); | |||
total += Convert.ToInt32(s, 16); | |||
num += 2; | |||
} | |||
total = ~total + 1; | |||
string checkSum = (total & 255).ToString("x").ToUpper(); | |||
while (checkSum.Length < 2) | |||
{ | |||
checkSum = "0" + checkSum; | |||
} | |||
return checkSum; | |||
} | |||
catch (Exception) | |||
{ | |||
} | |||
return ""; | |||
} | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
using BPASmartClient.Device; | |||
using System.Collections.Concurrent; | |||
using System.Collections.Generic; | |||
using System.Collections.ObjectModel; | |||
using BPASmartClient.KLMCoffee.Protocal; | |||
namespace BPASmartClient.MorkTSingle | |||
{ | |||
public class GVL_MORKJC : IStatus | |||
{ | |||
/// <summary> | |||
/// 咖啡机订单队列 | |||
/// </summary> | |||
public ConcurrentQueue<OrderLocInfo> morkOrderPushesCoffee = new ConcurrentQueue<OrderLocInfo>(); | |||
public bool MakeCoffeeFinish = false; | |||
public bool IsCoffeeMake = false; | |||
public K95SysTemStatus coffeeState { get; set; } | |||
/// <summary> | |||
/// 咖乐美咖啡机心跳 | |||
/// </summary> | |||
public bool KLMCoffeeIsConnected = false; | |||
} | |||
} |
@@ -4,15 +4,15 @@ using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTM | |||
namespace BPASmartClient.MorkTSingle | |||
{ | |||
public class OrderLocInfo | |||
{ | |||
public string SuborderId { get; set; } | |||
public ushort Loc { get; set; } | |||
public ushort RecipeNumber { get; set; } | |||
public int BatchingId { get; set; } | |||
public string GoodName { get; set; } | |||
public Dictionary<string, int> GoodPushes { get; set; } | |||
public string makeID { get; set; } | |||
} | |||
} |
@@ -4,7 +4,7 @@ using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
namespace BPASmartClient.MorkTJuicer | |||
namespace BPASmartClient.MorkTSingle | |||
{ | |||
internal enum GOODS_TYPE | |||
{ | |||
@@ -13,6 +13,10 @@ namespace BPASmartClient.MorkTJuicer | |||
/// </summary> | |||
NEITHER, | |||
/// <summary> | |||
/// 咖啡 | |||
/// </summary> | |||
COFFEE, | |||
/// <summary> | |||
/// 果汁 | |||
/// </summary> | |||
JUICE | |||
@@ -26,17 +30,30 @@ namespace BPASmartClient.MorkTJuicer | |||
internal class PolymerBatching | |||
{ | |||
internal const string Juicer_MAIN_BATCHIN1_LOC = "52"; | |||
internal const string Juicer_MAIN_BATCHIN2_LOC = "53"; | |||
internal const string Juicer_MAIN_BATCHIN3_LOC = "54"; | |||
internal const string Juicer_MAIN_BATCHIN4_LOC = "55"; | |||
internal const string COFFEE_HOLDER_LOC = "30"; | |||
internal const string TEA_HOLDER_LOC = "51"; | |||
public static Dictionary<string, GOODS_TYPE> GOODS_TYPES = new Dictionary<string, GOODS_TYPE>() { | |||
{Juicer_MAIN_BATCHIN1_LOC,GOODS_TYPE.JUICE}, | |||
{Juicer_MAIN_BATCHIN2_LOC,GOODS_TYPE.JUICE}, | |||
{Juicer_MAIN_BATCHIN3_LOC,GOODS_TYPE.JUICE}, | |||
{Juicer_MAIN_BATCHIN4_LOC,GOODS_TYPE.JUICE}, | |||
{"1", GOODS_TYPE.COFFEE}, | |||
{"2", GOODS_TYPE.COFFEE}, | |||
{"3", GOODS_TYPE.COFFEE}, | |||
{"4", GOODS_TYPE.COFFEE}, | |||
{"5", GOODS_TYPE.COFFEE}, | |||
{"6", GOODS_TYPE.COFFEE}, | |||
{"9", GOODS_TYPE.COFFEE}, | |||
{"10", GOODS_TYPE.COFFEE}, | |||
{"11", GOODS_TYPE.COFFEE}, | |||
{"12", GOODS_TYPE.COFFEE}, | |||
{"13", GOODS_TYPE.COFFEE}, | |||
{"14", GOODS_TYPE.COFFEE}, | |||
{"51", GOODS_TYPE.COFFEE}, | |||
{"52", GOODS_TYPE.COFFEE}, | |||
{"53", GOODS_TYPE.COFFEE}, | |||
{"54", GOODS_TYPE.COFFEE}, | |||
{"55", GOODS_TYPE.COFFEE}, | |||
{"56", GOODS_TYPE.COFFEE}, | |||
{"57", GOODS_TYPE.COFFEE}, | |||
{"58", GOODS_TYPE.COFFEE}, | |||
{"59", GOODS_TYPE.COFFEE}, | |||
{"7", GOODS_TYPE.COFFEE}, | |||
{"8", GOODS_TYPE.COFFEE}, | |||
}; | |||
public GOODS_TYPE GoodsType { get; set; } | |||
@@ -53,10 +70,6 @@ namespace BPASmartClient.MorkTJuicer | |||
GoodsType = GOODS_TYPES[loc]; | |||
switch (loc) | |||
{ | |||
case COFFEE_HOLDER_LOC: | |||
case TEA_HOLDER_LOC: | |||
BatchingClass = BATCHING_CLASS.HOLDER; | |||
break; | |||
default: | |||
BatchingClass = BATCHING_CLASS.MAIN_MATERIAL; | |||
break; |
@@ -0,0 +1,39 @@ | |||
<UserControl x:Class="BPASmartClient.MorkTSingle.View.DebugView" | |||
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:vm="clr-namespace:BPASmartClient.MorkTSingle.ViewModel" | |||
mc:Ignorable="d" | |||
d:DesignHeight="450" d:DesignWidth="800"> | |||
<UserControl.DataContext> | |||
<vm:DebugViewModel/> | |||
</UserControl.DataContext> | |||
<UserControl.Resources> | |||
<ResourceDictionary> | |||
<ResourceDictionary.MergedDictionaries> | |||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||
</ResourceDictionary.MergedDictionaries> | |||
</ResourceDictionary> | |||
</UserControl.Resources> | |||
<Grid> | |||
<Grid.ColumnDefinitions> | |||
<ColumnDefinition Width="10*"/> | |||
<ColumnDefinition Width="10*"/> | |||
</Grid.ColumnDefinitions> | |||
<Grid.RowDefinitions> | |||
<RowDefinition Height="10*"/> | |||
<RowDefinition Height="10*"/> | |||
<RowDefinition Height="15*"/> | |||
</Grid.RowDefinitions> | |||
<StackPanel Orientation="Horizontal"> | |||
<TextBlock>咖啡:</TextBlock> | |||
<ComboBox Margin="10,0" | |||
Width="100" | |||
ItemsSource="{Binding Coffees}" | |||
SelectedItem="{Binding SimOrderCoffeeList}" /> | |||
<Button Command="{Binding SimOrderMakeCoffee}">制作</Button> | |||
</StackPanel> | |||
</Grid> | |||
</UserControl> |
@@ -13,14 +13,14 @@ using System.Windows.Media.Imaging; | |||
using System.Windows.Navigation; | |||
using System.Windows.Shapes; | |||
namespace BPASmartClient.MorkTM.View | |||
namespace BPASmartClient.MorkTSingle.View | |||
{ | |||
/// <summary> | |||
/// Debug.xaml 的交互逻辑 | |||
/// DebugView.xaml 的交互逻辑 | |||
/// </summary> | |||
public partial class Debug : UserControl | |||
public partial class DebugView : UserControl | |||
{ | |||
public Debug() | |||
public DebugView() | |||
{ | |||
InitializeComponent(); | |||
} |
@@ -0,0 +1,47 @@ | |||
using BPASmartClient.Business; | |||
using BPASmartClient.Device; | |||
using BPASmartClient.EventBus; | |||
using BPASmartClient.Helper; | |||
using BPASmartClient.Message; | |||
using BPASmartClient.Model; | |||
using BPASmartClient.Model.乐白机器人; | |||
using BPASmartClient.Model.冰淇淋.Enum; | |||
using BPASmartClient.Model.单片机; | |||
using BPASmartClient.Model.单片机.Enum; | |||
using BPASmartClient.Model.咖啡机.Enum; | |||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||
using Microsoft.Toolkit.Mvvm.Input; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Collections.ObjectModel; | |||
using System.Linq; | |||
using System.Threading; | |||
namespace BPASmartClient.MorkTSingle.ViewModel; | |||
public class DebugViewModel : ObservableObject | |||
{ | |||
public RelayCommand SimOrderMakeCoffee { get; set; } | |||
/// <summary> | |||
/// 设备ID | |||
/// </summary> | |||
public int DeviceId { get; set; } | |||
/// <summary> | |||
/// 设备数据 | |||
/// </summary> | |||
public ObservableCollection<VariableMonitor> variableMonitors { get; set; } | |||
public List<string> Coffees { get; set; } = new List<string>(); | |||
public string SimOrderCoffeeList { get { return _simOrderCoffeeList; } set { _simOrderCoffeeList = value; OnPropertyChanged(); } } | |||
public string _simOrderCoffeeList { get; set; } | |||
public DebugViewModel() | |||
{ | |||
foreach (KLMDrinkFaultType code in Enum.GetValues(typeof(KLMDrinkFaultType))) | |||
{ | |||
Coffees.Add(code.ToString()); | |||
} | |||
SimOrderCoffeeList = Coffees[0]; | |||
SimOrderMakeCoffee = new RelayCommand(() => | |||
{ | |||
new MorkTSimOrder() {KLMDrinkFaultCode = (KLMDrinkFaultType)Enum.Parse(typeof(KLMDrinkFaultType), SimOrderCoffeeList) }.Publish(); | |||
}); | |||
} | |||
} | |||
@@ -503,7 +503,7 @@ namespace BPASmartClient.MorkT_Container | |||
new LebaiRobot_SetValueEvent { DeviceId = DeviceId, RobotSetValue = 0 }.Publish(); | |||
Sence(GVL_MorkT.接咖啡); | |||
//Wait(); | |||
new DRCoffee_MakeCoffeeEvent() { DrinkCode = (DrCoffeeDrinksCode)(morkTLebaiJC.morkOrderPushesCoffee.ElementAt(0).Loc)}.Publish(); //接咖啡控制 //DrCoffeeDrinksCode.热水 | |||
new DRCoffee_MakeCoffeeEvent() { DeviceId=DeviceId, DrinkCode = (DrCoffeeDrinksCode)(morkTLebaiJC.morkOrderPushesCoffee.ElementAt(0).Loc)}.Publish(); //接咖啡控制 //DrCoffeeDrinksCode.热水 | |||
} | |||
else | |||
{ | |||
@@ -21,7 +21,7 @@ namespace BPASmartClient.MorkT_Container | |||
public const int 取纸杯 = 10005;//安全位---取杯位 | |||
public const int 二次取杯 = 10008;//取纸杯检测位---二次取杯位 | |||
public const int 取纸杯检测 = 10006;//取杯位---取杯检测位 | |||
public const int 取杯位_机器人安全位 = 10002;//取杯检测位---安全位 | |||
public const int 取杯位_机器人安全位 = 10002;//取杯检测位---模组移动安全位 | |||
public const int 接咖啡 = 10010;//安全位---接咖啡位 | |||
@@ -30,7 +30,7 @@ namespace BPASmartClient.MorkT_Container | |||
public const int 接果汁2 = 10012;//接果汁过渡位---果汁2位 | |||
public const int 接果汁3 = 10013;//接果汁过渡位---果汁3位 | |||
public const int 接果汁4 = 10014;//接果汁过渡位---果汁4位 | |||
public const int 接果汁_机器人安全位 = 10002;//接果汁过渡位---安全位 | |||
public const int 接果汁_机器人安全位 = 10002;//接果汁过渡位---模组移动安全位 | |||
public const int 接茶叶 = 10015; | |||
public const int 接茶水 = 10016; | |||
@@ -152,7 +152,11 @@ namespace BPASmartClient.SerialPort | |||
{ | |||
lock (lck4Serial) | |||
{ | |||
if (!IsHavePort) return; | |||
if (!IsHavePort) | |||
{ | |||
MessageLog.GetInstance.Show("咖乐美咖啡机连接失败"); | |||
return; | |||
} | |||
if (comPort.IsOpen) comPort.Close(); | |||
comPort.PortName = portName; | |||
comPort.BaudRate = (int)baudRate; | |||
@@ -160,6 +164,7 @@ namespace BPASmartClient.SerialPort | |||
comPort.DataBits = (int)dataBits; | |||
comPort.StopBits = stopBits; | |||
comPort.Open(); | |||
MessageLog.GetInstance.Show("咖乐美咖啡机连接成功"); | |||
} | |||
} | |||
@@ -224,12 +229,15 @@ namespace BPASmartClient.SerialPort | |||
Close(); | |||
} | |||
private static readonly object objLock = new object(); | |||
/// <summary> | |||
/// 发送数据 | |||
/// </summary> | |||
/// <param name="data">发送数据</param> | |||
public void SendData(byte[] data) | |||
{ | |||
lock(objLock) | |||
Write(data, 0, data.Length); | |||
} | |||
@@ -7,14 +7,14 @@ | |||
<add key="IsEnableTest" value="false"/> | |||
<!--开发环境--> | |||
<add key="apollouri" value="http://10.2.1.21:28080/"/> | |||
<!--add key="apollouri" value="http://10.2.1.21:28080/"/> | |||
<add key="AppId" value="dev1_common"/> | |||
<add key ="Namespaces" value="DEV.Config"/> | |||
<add key ="Namespaces" value="DEV.Config"/>--> | |||
<!--正式环境--> | |||
<!--<add key="apollouri" value="http://47.108.65.220:28080/"/> | |||
<add key="apollouri" value="http://47.108.65.220:28080/"/> | |||
<add key="AppId" value="order"/> | |||
<add key ="Namespaces" value="TEST1.Config"/>--> | |||
<add key ="Namespaces" value="TEST1.Config"/> | |||
<!--阿里云上报启动方式:API 或者 LOCAL--> | |||
<!--API :通过客户端ID,调用接口查询“设备连接信息”--> | |||
@@ -35,9 +35,10 @@ | |||
<ProjectReference Include="..\BPASmartClient.MorkS\BPASmartClient.MorkS.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.Morkt.JAKA.JC\BPASmartClient.MorkTJAKAJC.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkT.Lebai.JC\BPASmartClient.MorkTLebaiJC.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkTJuicer\BPASmartClient.MorkTJuicer.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkTM\BPASmartClient.MorkTM.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkTSingle\BPASmartClient.MorkTSingle.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkT\BPASmartClient.MorkT.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkT_BarCounter\BPASmartClient.MorkT_BarCounter.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkT_Container\BPASmartClient.MorkT_Container.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.MorkT_HQ\BPASmartClient.MorkTHQ.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.SCChip\BPASmartClient.SCChip.csproj" /> | |||
<ProjectReference Include="..\BPASmartClient.ViewModel\BPASmartClient.ViewModel.csproj" /> | |||
@@ -96,8 +96,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MorkTHQ", "B | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.DosingSystem", "DosingSystem\BPASmartClient.DosingSystem.csproj", "{4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MorkTJuicer", "BPASmartClient.MorkTJuicer\BPASmartClient.MorkTJuicer.csproj", "{724087A3-E7E7-4494-B844-414FF5CD1D40}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.AGV", "BPASmartClient.AGV\BPASmartClient.AGV.csproj", "{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}" | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.IceMaker", "BPASmartClient.IceMaker\BPASmartClient.IceMaker.csproj", "{F61AC179-156D-4075-BFEB-355862231F48}" | |||
@@ -116,6 +114,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDemo", "TestDemo\TestDe | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.HubHelper", "BPASmartClient.HubHelper\BPASmartClient.HubHelper.csproj", "{099E047C-F40E-47A3-A5BA-81FC1500D5E8}" | |||
EndProject | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BPASmartClient.MorkTSingle", "BPASmartClient.MorkTSingle\BPASmartClient.MorkTSingle.csproj", "{84B7D506-C720-4E67-A161-1E9A8E94B6EF}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
@@ -890,26 +890,6 @@ Global | |||
{4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB}.Release|x64.Build.0 = Release|Any CPU | |||
{4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB}.Release|x86.ActiveCfg = Release|Any CPU | |||
{4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB}.Release|x86.Build.0 = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|ARM.ActiveCfg = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|ARM.Build.0 = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|ARM64.ActiveCfg = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|ARM64.Build.0 = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|x64.ActiveCfg = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|x64.Build.0 = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Debug|x86.Build.0 = Debug|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|ARM.ActiveCfg = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|ARM.Build.0 = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|ARM64.ActiveCfg = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|ARM64.Build.0 = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|x64.ActiveCfg = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|x64.Build.0 = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|x86.ActiveCfg = Release|Any CPU | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40}.Release|x86.Build.0 = Release|Any CPU | |||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Debug|ARM.ActiveCfg = Debug|Any CPU | |||
@@ -1090,6 +1070,26 @@ Global | |||
{099E047C-F40E-47A3-A5BA-81FC1500D5E8}.Release|x64.Build.0 = Release|Any CPU | |||
{099E047C-F40E-47A3-A5BA-81FC1500D5E8}.Release|x86.ActiveCfg = Release|Any CPU | |||
{099E047C-F40E-47A3-A5BA-81FC1500D5E8}.Release|x86.Build.0 = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|ARM.ActiveCfg = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|ARM.Build.0 = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|ARM64.ActiveCfg = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|ARM64.Build.0 = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|x64.ActiveCfg = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|x64.Build.0 = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Debug|x86.Build.0 = Debug|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|Any CPU.Build.0 = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|ARM.ActiveCfg = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|ARM.Build.0 = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|ARM64.ActiveCfg = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|ARM64.Build.0 = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|x64.ActiveCfg = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|x64.Build.0 = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|x86.ActiveCfg = Release|Any CPU | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF}.Release|x86.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
@@ -1133,7 +1133,6 @@ Global | |||
{C28A88B1-E449-484C-AC67-B5038FF2CA79} = {666CB1A9-562E-453A-A2C7-FD9D77CFDFDD} | |||
{00C17D87-A323-4A97-BC21-7039E55614DE} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F} | |||
{4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB} = {8712125E-14CD-4E1B-A1CE-4BDE03805942} | |||
{724087A3-E7E7-4494-B844-414FF5CD1D40} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F} | |||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625} | |||
{F61AC179-156D-4075-BFEB-355862231F48} = {666CB1A9-562E-453A-A2C7-FD9D77CFDFDD} | |||
{048FED78-4BFA-4FCD-8FF2-905E9CA4D7DD} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F} | |||
@@ -1143,6 +1142,7 @@ Global | |||
{E7168B03-68E5-4285-BB95-5660F877577A} = {8712125E-14CD-4E1B-A1CE-4BDE03805942} | |||
{A49E1C5A-9489-451C-9CE6-CEA586234B84} = {8712125E-14CD-4E1B-A1CE-4BDE03805942} | |||
{099E047C-F40E-47A3-A5BA-81FC1500D5E8} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625} | |||
{84B7D506-C720-4E67-A161-1E9A8E94B6EF} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F} | |||
EndGlobalSection | |||
GlobalSection(ExtensibilityGlobals) = postSolution | |||
SolutionGuid = {9AEC9B81-0222-4DE9-B642-D915C29222AC} | |||