Shun hace 2 años
padre
commit
c248edf96d

+ 1 - 1
src/YSAI.DAQ/YSAI.Can/YSAI.Can.csproj

@@ -18,7 +18,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 
   <!--<ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/YSAI.Core.csproj

@@ -5,7 +5,7 @@
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.0.15</Version>
+    <Version>1.0.0.16</Version>
     <Authors>Shun</Authors>
     <Company>YSAI</Company>
     <Product>SCADA</Product>

+ 64 - 60
src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs

@@ -153,82 +153,86 @@ namespace YSAI.Core.subscription
                     if (!GoOn) continue;
                     lock (basics.Address)  //锁住不让其他操作
                     {
-                        //执行委托
-                        OperateResult value = basics.Function?.Invoke(basics.Address);
-                        //状态判断
-                        if (value.State)
+                        //数据必须大于0才进行
+                        if (basics.Address.AddressArray.Count > 0)
                         {
-                            //判断数据类型
-                            switch (value.RType)
+                            //执行委托
+                            OperateResult value = basics.Function?.Invoke(basics.Address);
+                            //状态判断
+                            if (value.State)
                             {
-                                case @enum.ResultType.KeyValue:
-                                    ConcurrentDictionary<string, AddressValue>? RData = value.RData as ConcurrentDictionary<string, AddressValue>;
-                                    //做流程处理
-                                    if (basics.DataChangeOut)
-                                    {
+                                //判断数据类型
+                                switch (value.RType)
+                                {
+                                    case @enum.ResultType.KeyValue:
+                                        ConcurrentDictionary<string, AddressValue>? RData = value.RData as ConcurrentDictionary<string, AddressValue>;
+                                        //做流程处理
+                                        if (basics.DataChangeOut)
+                                        {
+                                            //实例化对象
+                                            if (UpParam == null)
+                                            {
+                                                UpParam = new ConcurrentDictionary<string, AddressValue>();
+                                            }
+                                            //空数据不做处理
+                                            if (RData != null && RData.Count > 0)
+                                            {
+                                                //获取到第一次数据,准备节点检测数据是否变化
+                                                if (!ConcurrentDictionaryEquals(UpParam, RData))
+                                                {
+                                                    //当节点数据变化,有一项数据未变化,也把这未变项与变化项一同抛出,在特殊用途中,确保此批点位数据都存在
+                                                    if (basics.SameDataOut)
+                                                    {
+                                                        //抛出差异数据
+                                                        OnEventHandler?.Invoke(this, new EventResult(true, "存在变化数据", RData, value.RType));
+                                                    }
+                                                    else
+                                                    {
+                                                        //如果不一致,就找寻里面不一样的 键、值
+                                                        ConcurrentDictionary<string, AddressValue> data = new ConcurrentDictionary<string, AddressValue>(RData.Except(UpParam).ToDictionary(x => x.Key, x => x.Value));
+                                                        //抛出差异数据
+                                                        OnEventHandler?.Invoke(this, new EventResult(true, "变化数据", data, value.RType));
+                                                    }
+                                                    //把这次新数据 赋值到历史数据中
+                                                    UpParam = RData;
+                                                }
+                                            }
+                                        }
+                                        else
+                                        {
+                                            OnEventHandler?.Invoke(this, new EventResult(true, "实时数据", value.RData, value.RType));
+                                        }
+                                        break;
+                                    case @enum.ResultType.KeyValueArray:
+                                        List<ConcurrentDictionary<string, AddressValue>>? RDataArray = value.RData as List<ConcurrentDictionary<string, AddressValue>>;
                                         //实例化对象
-                                        if (UpParam == null)
+                                        if (UpParamArray == null)
                                         {
-                                            UpParam = new ConcurrentDictionary<string, AddressValue>();
+                                            UpParamArray = new List<ConcurrentDictionary<string, AddressValue>>();
                                         }
                                         //空数据不做处理
-                                        if (RData != null && RData.Count > 0)
+                                        if (RDataArray != null && RDataArray.Count > 0)
                                         {
                                             //获取到第一次数据,准备节点检测数据是否变化
-                                            if (!ConcurrentDictionaryEquals(UpParam, RData))
+                                            if (!ConcurrentDictionaryEquals(UpParamArray, RDataArray))
                                             {
-                                                //当节点数据变化,有一项数据未变化,也把这未变项与变化项一同抛出,在特殊用途中,确保此批点位数据都存在
-                                                if (basics.SameDataOut)
+                                                foreach (var item in RDataArray)
                                                 {
                                                     //抛出差异数据
-                                                    OnEventHandler?.Invoke(this, new EventResult(true, "存在变化数据", RData, value.RType));
-                                                }
-                                                else
-                                                {
-                                                    //如果不一致,就找寻里面不一样的 键、值
-                                                    ConcurrentDictionary<string, AddressValue> data = new ConcurrentDictionary<string, AddressValue>(RData.Except(UpParam).ToDictionary(x => x.Key, x => x.Value));
-                                                    //抛出差异数据
-                                                    OnEventHandler?.Invoke(this, new EventResult(true, "变化数据", data, value.RType));
+                                                    OnEventHandler?.Invoke(this, new EventResult(true, "存在变化数据", RDataArray, value.RType));
                                                 }
                                                 //把这次新数据 赋值到历史数据中
-                                                UpParam = RData;
-                                            }
-                                        }
-                                    }
-                                    else
-                                    {
-                                        OnEventHandler?.Invoke(this, new EventResult(true, "实时数据", value.RData, value.RType));
-                                    }
-                                    break;
-                                case @enum.ResultType.KeyValueArray:
-                                    List<ConcurrentDictionary<string, AddressValue>>? RDataArray = value.RData as List<ConcurrentDictionary<string, AddressValue>>;
-                                    //实例化对象
-                                    if (UpParamArray == null)
-                                    {
-                                        UpParamArray = new List<ConcurrentDictionary<string, AddressValue>>();
-                                    }
-                                    //空数据不做处理
-                                    if (RDataArray != null && RDataArray.Count > 0)
-                                    {
-                                        //获取到第一次数据,准备节点检测数据是否变化
-                                        if (!ConcurrentDictionaryEquals(UpParamArray, RDataArray))
-                                        {
-                                            foreach (var item in RDataArray)
-                                            {
-                                                //抛出差异数据
-                                                OnEventHandler?.Invoke(this, new EventResult(true, "存在变化数据", RDataArray, value.RType));
+                                                UpParamArray = RDataArray;
                                             }
-                                            //把这次新数据 赋值到历史数据中
-                                            UpParamArray = RDataArray;
                                         }
-                                    }
-                                    break;
+                                        break;
+                                }
+                            }
+                            else
+                            {
+                                //当状态为false 说明读取失败,写入日志
+                                OnEventHandler?.Invoke(this, new EventResult(false, $"自定义订阅轮询异常:{value.Message}"));
                             }
-                        }
-                        else
-                        {
-                            //当状态为false 说明读取失败,写入日志
-                            OnEventHandler?.Invoke(this, new EventResult(false, $"自定义订阅轮询异常:{value.Message}"));
                         }
                     }
                 }

+ 1 - 1
src/YSAI.DAQ/YSAI.DB/YSAI.DB.csproj

@@ -12,7 +12,7 @@
 		<PackageReference Include="System.Data.OracleClient" Version="1.0.8" />
 		<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
 		<PackageReference Include="System.Data.SQLite" Version="1.0.118" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.15" />
 	</ItemGroup>
 	<!--<ItemGroup>
 		<ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />

+ 1 - 1
src/YSAI.DAQ/YSAI.DaqManage/YSAI.DaqManage.csproj

@@ -7,7 +7,7 @@
   </PropertyGroup>
 	<ItemGroup>
 		<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.15" />
 	</ItemGroup>
 
 	<!--<ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.Kafka/YSAI.Kafka.csproj

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Confluent.Kafka" Version="2.2.0" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 	
 	<!--<ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.Modbus/YSAI.Modbus.csproj

@@ -7,7 +7,7 @@
   </PropertyGroup>
 
 	<ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 
 	<!--<ItemGroup>

+ 10 - 10
src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientOperate.cs

@@ -520,7 +520,7 @@ namespace YSAI.Modbus.client
         /// </param>
         /// <param name="DataType">返回的数据类型 0:高位在前/1:低位在前/2:字节/3:二进制/4:有符号/5:无转换值</param>
         /// <returns>统一出参</returns>
-        public OperateResult ReadHoldingRegisters(Address address, int DataType = 5)
+        public OperateResult ReadHoldingRegisters(Address address, DataType DType = DataType.Value)
         {
             //开始记录运行时间
             Depart("ReadHoldingRegisters");
@@ -555,14 +555,14 @@ namespace YSAI.Modbus.client
                             int index = Dvalue.startAddress;
                             foreach (var item in retvalue)
                             {
-                                DValue.Add(new RetValue { Address = index.ToString(), Value = DataConvert(item, (DataType)DataType) });
+                                DValue.Add(new RetValue { Address = index.ToString(), Value = DataConvert(item, DType) });
                                 index++;
                             }
                             Value = DValue.ToJson();
                         }
                         else
                         {
-                            Value = DataConvert(retvalue[0], (DataType)DataType);
+                            Value = DataConvert(retvalue[0], DType);
                         }
                     }
                     //数据处理
@@ -592,9 +592,9 @@ namespace YSAI.Modbus.client
         /// </param>
         /// <param name="DataType">返回的数据类型 0:高位在前/1:低位在前/2:字节/3:二进制/4:有符号/5:无转换值</param>
         /// <returns>统一出参</returns>
-        public Task<OperateResult> ReadHoldingRegistersAsync(Address address, int DataType = 5)
+        public Task<OperateResult> ReadHoldingRegistersAsync(Address address, DataType DType = DataType.Value)
         {
-            return Task.Run(() => ReadHoldingRegisters(address, DataType));
+            return Task.Run(() => ReadHoldingRegisters(address, DType));
         }
         /// <summary>
         /// 读取输入寄存器的连续块。
@@ -605,7 +605,7 @@ namespace YSAI.Modbus.client
         /// </param>
         /// <param name="DataType">返回的数据类型 0:高位在前/1:低位在前/2:字节/3:二进制/4:有符号/5:无转换值</param>
         /// <returns>统一出参</returns>
-        public OperateResult ReadInputRegisters(Address address, int DataType = 5)
+        public OperateResult ReadInputRegisters(Address address, DataType DType = DataType.Value)
         {
             //开始记录运行时间
             Depart("ReadInputRegisters");
@@ -640,14 +640,14 @@ namespace YSAI.Modbus.client
                             int index = Dvalue.startAddress;
                             foreach (var item in retvalue)
                             {
-                                DValue.Add(new RetValue { Address = index.ToString(), Value = DataConvert(item, (DataType)DataType) });
+                                DValue.Add(new RetValue { Address = index.ToString(), Value = DataConvert(item, DType) });
                                 index++;
                             }
                             Value = DValue.ToJson();
                         }
                         else
                         {
-                            Value = DataConvert(retvalue[0], (DataType)DataType);
+                            Value = DataConvert(retvalue[0], DType);
                         }
                     }
 
@@ -678,9 +678,9 @@ namespace YSAI.Modbus.client
         /// </param>
         /// <param name="DataType">返回的数据类型 0:高位在前/1:低位在前/2:字节/3:二进制/4:有符号/5:无转换值</param>
         /// <returns>统一出参</returns>
-        public Task<OperateResult> ReadInputRegistersAsync(Address address, int DataType = 5)
+        public Task<OperateResult> ReadInputRegistersAsync(Address address, DataType DType = DataType.Value)
         {
-            return Task.Run(() => ReadInputRegisters(address, DataType));
+            return Task.Run(() => ReadInputRegisters(address, DType));
         }
         /// <summary>
         /// 写入单线圈值。

+ 1 - 1
src/YSAI.DAQ/YSAI.Mqtt/YSAI.Mqtt.csproj

@@ -9,7 +9,7 @@
   <ItemGroup>
     <PackageReference Include="MQTTnet" Version="4.3.1.873" />
     <PackageReference Include="MQTTnet.AspNetCore" Version="4.3.1.873" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 
 	<!--<ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.Opc/YSAI.Opc.csproj

@@ -21,7 +21,7 @@
   </ItemGroup>
   <ItemGroup>
     <PackageReference Include="OPCFoundation.NetStandard.Opc.Ua" Version="1.4.372.56" />
-	<PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+	<PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 
 

+ 1 - 1
src/YSAI.DAQ/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="RabbitMQ.Client" Version="6.5.0" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 	<!--<ItemGroup>
 		<ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />

+ 1 - 1
src/YSAI.DAQ/YSAI.RelayManage/YSAI.RelayManage.csproj

@@ -8,7 +8,7 @@
 
 	<ItemGroup>
 		<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.15" />
 	</ItemGroup>
 
 	<!--<ItemGroup>

+ 1 - 1
src/YSAI.DAQ/YSAI.S7/YSAI.S7.csproj

@@ -7,7 +7,7 @@
   </PropertyGroup>
 
 	<ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 
 	<!--<ItemGroup>

+ 86 - 6
src/YSAI.DAQ/YSAI.Test.Console/Program.cs

@@ -18,6 +18,86 @@ using YSAI.S7.client;
 using YSAI.Unility;
 using ZstdSharp.Unsafe;
 
+
+////点位地址
+//Address address = new Address();
+//address.SN = Guid.NewGuid().ToString();
+//address.CreationTime = DateTime.Now.ToLocalTime();
+//address.AddressArray = new List<AddressDetails>();
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "1",
+//    AddressDataType = YSAI.Core.@enum.DataType.Double,
+//    AddressType = AddressType.Reality,
+//    AddressDescribe = "上一次的湿度"
+//});
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "3",
+//    AddressDataType = YSAI.Core.@enum.DataType.Double,
+//    AddressType = AddressType.Reality,
+//    AddressDescribe = "上一次的密度"
+//});
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "5",
+//    AddressDataType = YSAI.Core.@enum.DataType.Double,
+//    AddressType = AddressType.Reality,
+//    AddressDescribe = "上一次的温度"
+//});
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "7",
+//    AddressDataType = YSAI.Core.@enum.DataType.Double,
+//    AddressType = AddressType.Reality,
+//    AddressDescribe = "实时湿度"
+//});
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "9",
+//    AddressDataType = YSAI.Core.@enum.DataType.Double,
+//    AddressType = AddressType.Reality,
+//    AddressDescribe = "实时密度"
+//});
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "11",
+//    AddressDataType = YSAI.Core.@enum.DataType.Double,
+//    AddressType = AddressType.Reality,
+//    AddressDescribe = "实时温度"
+//});
+//ModbusClientOperate modbusClientOperate = ModbusClientOperate.Instance(new ModbusClientData.Basics
+//{
+//    ProtocolType = ModbusClientData.ProtocolType.Tcp,
+//    Ip = "192.168.150.182",
+//    Port = 502,
+//    MRType = ModbusClientData.ModbusReadType.InputRegisters,
+//    MWType = ModbusClientData.ModbusWriteType.SingleRegister
+//});
+
+//OperateResult operateResult = modbusClientOperate.On();
+//Console.WriteLine(operateResult.ToJson());
+
+
+//operateResult = modbusClientOperate.ReadInputRegisters(address,ModbusClientData.DataType.Signed);
+//Console.WriteLine(operateResult.ToJson());
+
+//modbusClientOperate.OnEvent += ModbusClientOperate_OnEvent;
+
+//operateResult = modbusClientOperate.Subscribe(address);
+//Console.WriteLine(operateResult.ToJson());
+
+//while (true)
+//{
+
+//}
+
+//void ModbusClientOperate_OnEvent(object? sender, EventResult e)
+//{
+//    Console.WriteLine(e.ToJson().JsonFormatting());
+//}
+
+
 //点位地址
 Address address = new Address();
 address.SN = Guid.NewGuid().ToString();
@@ -29,13 +109,13 @@ address.AddressArray.Add(new AddressDetails()
     AddressDataType = YSAI.Core.@enum.DataType.Double,
     AddressType = AddressType.Reality
 });
-ModbusClientOperate modbusClientOperate = ModbusClientOperate.Instance(new ModbusClientData.Basics 
+ModbusClientOperate modbusClientOperate = ModbusClientOperate.Instance(new ModbusClientData.Basics
 {
-    ProtocolType=ModbusClientData.ProtocolType.Tcp,
-    Ip="192.168.2.113",
-    Port=502,
-    MRType=ModbusClientData.ModbusReadType.HoldingRegisters,
-    MWType=ModbusClientData.ModbusWriteType.SingleRegister
+    ProtocolType = ModbusClientData.ProtocolType.Tcp,
+    Ip = "192.168.2.113",
+    Port = 502,
+    MRType = ModbusClientData.ModbusReadType.HoldingRegisters,
+    MWType = ModbusClientData.ModbusWriteType.SingleRegister
 });
 
 OperateResult operateResult = modbusClientOperate.On();

+ 1 - 1
src/YSAI.DAQ/YSAI.Test/YSAI.Test.csproj

@@ -17,7 +17,7 @@
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-	<PackageReference Include="YSAI.Core" Version="1.0.0.14" />
+	<PackageReference Include="YSAI.Core" Version="1.0.0.15" />
   </ItemGroup>
 
   <ItemGroup>