diff --git a/Library/Utils/SereinIoc.cs b/Library/Utils/SereinIoc.cs index 06f4a13..25ecab9 100644 --- a/Library/Utils/SereinIoc.cs +++ b/Library/Utils/SereinIoc.cs @@ -263,7 +263,6 @@ namespace Serein.Library.Utils { var current = queue.Dequeue(); creationOrder.Add(current); - foreach (var neighbor in graph[current]) { indegree[neighbor]--; @@ -273,7 +272,17 @@ namespace Serein.Library.Utils } } } - + + var tmpList = indegree.Where(kv => kv.Value > 0).Select(kv => kv.Key).ToList(); + if (tmpList.Count > 0) + { + Console.WriteLine("以下类型可能产生循环依赖,请避免循环依赖,如果确实需要循环引用,请使用 [AutoInjection] 特性注入属性"); + foreach (var kv in tmpList) + { + Console.WriteLine($"Class Name : {kv}"); + } + } + return creationOrder; } @@ -296,7 +305,8 @@ namespace Serein.Library.Utils args[i] = argObj; } var value = Activator.CreateInstance(type, args); - + InjectDependencies(value); // 完成创建后注入实例需要的特性依赖项 + return value; } @@ -403,7 +413,7 @@ namespace Serein.Library.Utils { property.SetValue(instance, dependencyInstance); // 尝试写入到目标实例的属性中 } - else if(isRecord) + else if( isRecord ) { // 存在依赖项,但目标类型的实例暂未加载,需要等待需要实例完成注册 var unfinishedDependenciesList = _unfinishedDependencies.GetOrAdd(propertyType.FullName, _ = new List<(object, PropertyInfo)>()); diff --git a/Net462DllTest/LogicControl/PlcLogicControl.cs b/Net462DllTest/LogicControl/PlcLogicControl.cs index d7a575e..a795463 100644 --- a/Net462DllTest/LogicControl/PlcLogicControl.cs +++ b/Net462DllTest/LogicControl/PlcLogicControl.cs @@ -1,6 +1,7 @@ using IoTClient.Clients.PLC; using IoTClient.Common.Enums; using Net462DllTest.Enums; +using Net462DllTest.Model; using Net462DllTest.Signal; using Net462DllTest.Trigger; using Net462DllTest.Web; @@ -34,10 +35,13 @@ namespace Net462DllTest.LogicControl public class PlcLogicControl { private readonly SiemensPlcDevice MyPlc; + private readonly PlcVarModelDataProxy plcVarModelDataProxy; - public PlcLogicControl(SiemensPlcDevice MyPlc) + public PlcLogicControl(SiemensPlcDevice MyPlc, + PlcVarModelDataProxy plcVarModelDataProxy) { this.MyPlc = MyPlc; + this.plcVarModelDataProxy = plcVarModelDataProxy; } #region 初始化、初始化完成以及退出的事件 @@ -153,35 +157,17 @@ namespace Net462DllTest.LogicControl } [NodeAction(NodeType.Action, "PLC获取变量")] - public object ReadVar(PlcVarName plcVarEnum) + public object ReadVar(PlcVarName varName) { - var varInfo = plcVarEnum.ToVarInfo(); - var result = MyPlc.Read(varInfo); - Console.WriteLine($"获取变量成功:({varInfo})\t result = {result}"); + var result = MyPlc.Read(varName); + Console.WriteLine($"获取变量成功:({varName})\t result = {result}"); return result; } [NodeAction(NodeType.Action, "PLC写入变量")] public SiemensPlcDevice WriteVar(object value, PlcVarName varName) { - var varInfo = varName.ToVarInfo(); - if (MyPlc.State == PlcState.Runing) - { - if (varInfo.IsReadOnly) - { - Console.WriteLine($"PLC变量{varInfo}当前禁止写入"); - } - else - { - - MyPlc.Write(varInfo, value); - Console.WriteLine($"PLC变量{varInfo}写入数据:{value}"); - } - } - else - { - Console.WriteLine($"PLC处于非预期状态{MyPlc.State}"); - } + MyPlc.Write(varName, value); // 新数据 return MyPlc; } diff --git a/Net462DllTest/Model/PlcVarModel.cs b/Net462DllTest/Model/PlcVarModel.cs index 90ac957..01a28aa 100644 --- a/Net462DllTest/Model/PlcVarModel.cs +++ b/Net462DllTest/Model/PlcVarModel.cs @@ -1,4 +1,5 @@ using Net462DllTest.Enums; +using Net462DllTest.LogicControl; using Net462DllTest.Trigger; using Serein.Library.Attributes; using System; @@ -126,4 +127,109 @@ namespace Net462DllTest.Model } + + /// + /// 数据代理,防止View修改 + /// + [AutoRegister] + public class PlcVarModelDataProxy + { + private readonly PlcVarModel plcVarModel; + public PlcVarModelDataProxy(PlcVarModel plcVarModel) + { + this.plcVarModel = plcVarModel; + } + /// + /// 车位号 + /// + public Int16 SpaceNum { get => plcVarModel.SpaceNum; } + + /// + /// 上位机指令 + /// + public Int16 CmdForPLC { get => plcVarModel.CmdForPLC; } + + /// + /// PLC当前存取车位号 + /// + public Int16 DoingSpaceNum { get => plcVarModel.DoingSpaceNum; } + + /// + /// 下位机状态 + /// + public Int16 PLCState { get => plcVarModel.PLCState; } + + /// + /// 门1正常待机车位号,存车完成地面车位0 + /// + public Int16 Door1CurSpaceNum { get => plcVarModel.Door1CurSpaceNum; } + + /// + /// 门2正常待机车位号,存车完成地面车位0 + /// + public Int16 Door2CurSpaceNum { get => plcVarModel.Door2CurSpaceNum; } + + /// + /// 下位机运行模式 + /// + public Int16 PLCRunMode { get => plcVarModel.PLCRunMode; } + + /// + /// 执行的门号 + /// + public Int16 DoorVar { get => plcVarModel.DoorVar; } + + /// + /// 门1是否开到位 + /// + public bool IsDoor1OpenDone { get => plcVarModel.IsDoor1OpenDone; } + + /// + /// 门1是否关到位 + /// + public bool IsDoor1ClosedDone { get => plcVarModel.IsDoor1ClosedDone; } + + + /// + /// 门2是否开到位 + /// + public bool IsDoor2OpenDone { get => plcVarModel.IsDoor2OpenDone; } + + /// + /// 门2是否关到位 + /// + public bool IsDoor2ClosedDone { get => plcVarModel.IsDoor2ClosedDone; } + + /// + /// 通道1是否有车 + /// + public bool HasCarInTone1 { get => plcVarModel.HasCarInTone1; } + + /// + /// 通道2是否有车 + /// + public bool HasCarInTone2 { get => plcVarModel.HasCarInTone2; } + + /// + /// 下位机异常代码 + /// + public Int16 ErrorCode { get => plcVarModel.ErrorCode; } + + /// + /// 2层以上的空板是否在待机 + /// + public bool IsOver2FlowStanded { get => plcVarModel.IsOver2FlowStanded; } + + /// + /// 1号门指示灯 + /// + public bool Gate1Light { get => plcVarModel.Gate1Light; } + + /// + /// 2号门指示灯 + /// + public bool Gate2Light { get => plcVarModel.Gate2Light; } + } + + } diff --git a/Net462DllTest/Trigger/SiemensPlcDevice.cs b/Net462DllTest/Trigger/SiemensPlcDevice.cs index e2b075a..cccb035 100644 --- a/Net462DllTest/Trigger/SiemensPlcDevice.cs +++ b/Net462DllTest/Trigger/SiemensPlcDevice.cs @@ -89,33 +89,35 @@ namespace Net462DllTest.Trigger Client = null; } - public void Write(PlcVarInfo varInfo, object value) + public void Write(PlcVarName varName, object value) { - try + var varInfo = varName.ToVarInfo(); + if (this.State == PlcState.Runing) { - Client.WriteVar(varInfo, value); // 尝试写入PLC - Model.Set(varInfo.Name, value); // 新数据 + if (varInfo.IsReadOnly) + { + throw new Exception($"PLC变量{varInfo}当前禁止写入"); + } + else + { + + Client.WriteVar(varInfo, value); // 尝试写入PLC + Model.Set(varName, value); + Console.WriteLine($"PLC变量{varInfo}写入数据:{value}"); + } } - catch (Exception ex) + else { - Console.WriteLine($"写入出错:{this}{varInfo}。{ex.Message}"); - throw; + throw new Exception($"PLC处于非预期状态{this.State}"); } } - public object Read(PlcVarInfo varInfo) + public object Read(PlcVarName varName) { - try - { - var result = Client.ReadVar(varInfo);// 尝试读取数据 - Model.Set(varInfo.Name, result);// 缓存读取的数据 - return result; - } - catch (Exception ex) - { - Console.WriteLine($"读取出错:{this}{varInfo}。{ex.Message}"); - throw; - } + var varInfo = varName.ToVarInfo(); + var result = Client.ReadVar(varInfo);// 尝试读取数据 + Model.Set(varName, result); // 缓存读取的数据 + return result; } @@ -123,7 +125,7 @@ namespace Net462DllTest.Trigger { foreach(var varInfo in VarInfos) { - Read(varInfo); // 无条件批量读取 + Read(varInfo.Name); // 无条件批量读取 } } @@ -186,7 +188,7 @@ namespace Net462DllTest.Trigger if (!IsTimedRefresh || Client is null) break; oldData = Model.Get(signal); // 暂存旧数据 - newData = Read(varInfo); // 获取新数据 + newData = Read(signal); // 获取新数据 if (varInfo.NotificationType == PlcVarInfo.OnNotificationType.OnRefresh) { isNotification = true; // 无条件触发通知 diff --git a/Net462DllTest/ViewModel/FromWorkBenchViewModel.cs b/Net462DllTest/ViewModel/FromWorkBenchViewModel.cs index fe14029..76cd2b5 100644 --- a/Net462DllTest/ViewModel/FromWorkBenchViewModel.cs +++ b/Net462DllTest/ViewModel/FromWorkBenchViewModel.cs @@ -12,6 +12,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Net462DllTest.LogicControl; +using Net462DllTest.Model; namespace Net462DllTest.ViewModel { @@ -19,12 +20,18 @@ namespace Net462DllTest.ViewModel { private readonly SiemensPlcDevice Device; private readonly ViewManagement viewManagement; - public FromWorkBenchViewModel(SiemensPlcDevice Device,ViewManagement viewManagement) + private readonly PlcVarModelDataProxy plcVarModelDataProxy; + public FromWorkBenchViewModel(SiemensPlcDevice Device, + ViewManagement viewManagement, + PlcVarModelDataProxy plcVarModelDataProxy) { this.Device = Device; this.viewManagement = viewManagement; - InitCommand(); - + this.plcVarModelDataProxy = plcVarModelDataProxy; + + + + InitCommand(); } diff --git a/NodeFlow/Base/NodeModelBaseFunc.cs b/NodeFlow/Base/NodeModelBaseFunc.cs index d5df6d3..34506ac 100644 --- a/NodeFlow/Base/NodeModelBaseFunc.cs +++ b/NodeFlow/Base/NodeModelBaseFunc.cs @@ -211,7 +211,7 @@ namespace Serein.NodeFlow.Base bool isTaskHaveResult = taskResult is not null; object? result; - Console.WriteLine($"(isTask, isTaskHaveResult):{(isTask, isTaskHaveResult)}"); + //Console.WriteLine($"(isTask, isTaskHaveResult):{(isTask, isTaskHaveResult)}"); try { // Action/Func([方法作用的实例],[可能的参数值],[可能的返回值]) diff --git a/NodeFlow/FlowStarter.cs b/NodeFlow/FlowStarter.cs index 5676333..dc10b97 100644 --- a/NodeFlow/FlowStarter.cs +++ b/NodeFlow/FlowStarter.cs @@ -177,7 +177,11 @@ namespace Serein.NodeFlow IsStopStart = true; } } - CheckStartState(); // 初始化IOC后检查状态 + + if (IsStopStart) + { + return;// 初始化类型后检查状态 + } env.IOC.Build(); // 流程启动前的初始化 @@ -190,8 +194,11 @@ namespace Serein.NodeFlow IsStopStart = true; } } + if (IsStopStart) + { + return;// 调用节点初始化后检查状态 + } - CheckStartState();// 调用节点初始化后检查状态 #endregion