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