Bladeren bron

1. 移除S7非标服务端
2. 移除Modbus 非标服务端

Shun 2 jaren geleden
bovenliggende
commit
e2ab544ef2
35 gewijzigde bestanden met toevoegingen van 221 en 1586 verwijderingen
  1. 1 1
      src/YSAI.DAQ/YSAI.Beckhoff/YSAI.Beckhoff.csproj
  2. 1 1
      src/YSAI.DAQ/YSAI.Can/YSAI.Can.csproj
  3. 1 1
      src/YSAI.DAQ/YSAI.DB/YSAI.DB.csproj
  4. 1 1
      src/YSAI.DAQ/YSAI.DaqManage/YSAI.DaqManage.csproj
  5. 1 1
      src/YSAI.DAQ/YSAI.Kafka/YSAI.Kafka.csproj
  6. 4 4
      src/YSAI.DAQ/YSAI.Modbus.Pack/Program.cs
  7. 2 2
      src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientData.cs
  8. 15 15
      src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientOperate.cs
  9. 1 1
      src/YSAI.DAQ/YSAI.Modbus/YSAI.Modbus.csproj
  10. 0 58
      src/YSAI.DAQ/YSAI.Modbus/service/Common/CRC16.cs
  11. 0 134
      src/YSAI.DAQ/YSAI.Modbus/service/Common/DataConvert.cs
  12. 0 111
      src/YSAI.DAQ/YSAI.Modbus/service/Common/DataPersist.cs
  13. 0 51
      src/YSAI.DAQ/YSAI.Modbus/service/Common/LRC.cs
  14. 0 41
      src/YSAI.DAQ/YSAI.Modbus/service/Common/ServerSocketBase.cs
  15. 0 171
      src/YSAI.DAQ/YSAI.Modbus/service/ModBusAsciiServer.cs
  16. 0 133
      src/YSAI.DAQ/YSAI.Modbus/service/ModBusRtuServer.cs
  17. 0 200
      src/YSAI.DAQ/YSAI.Modbus/service/ModBusTcpServer.cs
  18. 1 1
      src/YSAI.DAQ/YSAI.Mqtt/YSAI.Mqtt.csproj
  19. 1 1
      src/YSAI.DAQ/YSAI.Netty/YSAI.Netty.csproj
  20. 1 1
      src/YSAI.DAQ/YSAI.Opc/YSAI.Opc.csproj
  21. 27 18
      src/YSAI.DAQ/YSAI.Pack.Param/Program.cs
  22. 1 1
      src/YSAI.DAQ/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj
  23. 1 1
      src/YSAI.DAQ/YSAI.RelayManage/YSAI.RelayManage.csproj
  24. 4 4
      src/YSAI.DAQ/YSAI.S7.Pack/Program.cs
  25. 8 6
      src/YSAI.DAQ/YSAI.S7/client/S7ClientData.cs
  26. 23 14
      src/YSAI.DAQ/YSAI.S7/client/S7ClientOperate.cs
  27. 1 1
      src/YSAI.DAQ/YSAI.S7/YSAI.S7.csproj
  28. 0 134
      src/YSAI.DAQ/YSAI.S7/service/Common/DataConvert.cs
  29. 0 111
      src/YSAI.DAQ/YSAI.S7/service/Common/DataPersist.cs
  30. 0 41
      src/YSAI.DAQ/YSAI.S7/service/Common/ServerSocketBase.cs
  31. 0 73
      src/YSAI.DAQ/YSAI.S7/service/Common/SiemensConstant.cs
  32. 0 246
      src/YSAI.DAQ/YSAI.S7/service/S7Service.cs
  33. 1 1
      src/YSAI.DAQ/YSAI.Test/YSAI.Test.csproj
  34. 124 5
      src/YSAI.DAQ/YSAI.Unility/ByteTool.cs
  35. 1 1
      src/YSAI.DAQ/YSAI.Unility/YSAI.Unility.csproj

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

@@ -14,7 +14,7 @@
 
 	<ItemGroup>
 		<PackageReference Include="Beckhoff.TwinCAT.Ads" Version="6.1.86" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
 	</ItemGroup>
 
 	<!--<ItemGroup>

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

@@ -17,7 +17,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
   <ItemGroup>

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

@@ -18,7 +18,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.65" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
 	</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>
 		<FrameworkReference Include="Microsoft.AspNetCore.App" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
 	</ItemGroup>
 
 	<!--<ItemGroup>

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

@@ -14,7 +14,7 @@
 
   <ItemGroup>
     <PackageReference Include="Confluent.Kafka" Version="2.3.0" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 	
 	<!--<ItemGroup>

+ 4 - 4
src/YSAI.DAQ/YSAI.Modbus.Pack/Program.cs

@@ -1,11 +1,11 @@
-using YSAI.Modbus.client;
+using YSAI.Modbus;
 using YSAI.Unility;
 
 namespace YSAI.Modbus.Pack
 {
     internal class Program
     {
-        static void Main(string[] args)
+        private static void Main(string[] args)
         {
             string FileDirectory = string.Empty;
             string[] paths = AppDomain.CurrentDomain.BaseDirectory.Split('\\');
@@ -21,8 +21,8 @@ namespace YSAI.Modbus.Pack
             {
                 Directory.CreateDirectory(FileDirectory);
             }
-            FileTool.StringToFile(ParamFile, new ModbusClientData.Basics().ToJson().JsonFormatting());
-            FileTool.StringToFile(ParamDetailsFile, ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>().ToJson().JsonFormatting());
+            FileTool.StringToFile(ParamFile, new ModbusData.Basics().ToJson().JsonFormatting());
+            FileTool.StringToFile(ParamDetailsFile, ReflexTool.GetClassAllPropertyData<ModbusData.Basics>().ToJson().JsonFormatting());
         }
     }
 }

+ 2 - 2
src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientData.cs

@@ -5,9 +5,9 @@ using System.IO.Ports;
 using YSAI.Core.subscription;
 using YSAI.Unility;
 
-namespace YSAI.Modbus.client
+namespace YSAI.Modbus
 {
-    public class ModbusClientData
+    public class ModbusData
     {
         /// <summary>
         /// 只用于连续读取的返回参数

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

@@ -11,16 +11,16 @@ using YSAI.Core.@interface;
 using YSAI.Core.subscription;
 using YSAI.Core.virtualAddress;
 using YSAI.Unility;
-using static YSAI.Modbus.client.ModbusClientData;
+using static YSAI.Modbus.ModbusData;
 
-namespace YSAI.Modbus.client
+namespace YSAI.Modbus
 {
     /// <summary>
     /// modbus 操作
     /// </summary>
-    public sealed class ModbusClientOperate : IBaseAbstract, IDaq
+    public sealed class ModbusOperate : IBaseAbstract, IDaq
     {
-        protected override string TAG => "ModbusClientOperate";
+        protected override string TAG => "ModbusOperate";
 
         /// <summary>
         /// 锁
@@ -30,19 +30,19 @@ namespace YSAI.Modbus.client
         /// <summary>
         /// 自身对象集合
         /// </summary>
-        private static List<ModbusClientOperate> ThisObjList = new List<ModbusClientOperate>(); //自身对象集合
+        private static List<ModbusOperate> ThisObjList = new List<ModbusOperate>(); //自身对象集合
 
         /// <summary>
         /// 单例模式
         /// </summary>
         /// <returns></returns>
-        public static ModbusClientOperate Instance(Basics basics)
+        public static ModbusOperate Instance(Basics basics)
         {
             if (ThisObjList.Count >= MaxInstanceCount)
             {
                 throw new Exception(ExceedMaxInstanceCountTips);
             }
-            ModbusClientOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Comparer(basics).result);
+            ModbusOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Comparer(basics).result);
             if (exp == null)
             {
                 lock (Lock)
@@ -53,7 +53,7 @@ namespace YSAI.Modbus.client
                     }
                     else
                     {
-                        ModbusClientOperate exp2 = new ModbusClientOperate(basics);
+                        ModbusOperate exp2 = new ModbusOperate(basics);
                         ThisObjList.Add(exp2);
                         return exp2;
                     }
@@ -66,7 +66,7 @@ namespace YSAI.Modbus.client
         /// 构造函数
         /// </summary>
         /// <param name="basics"></param>
-        public ModbusClientOperate(Basics basics)
+        public ModbusOperate(Basics basics)
         {
             this.basics = basics;
         }
@@ -295,8 +295,8 @@ namespace YSAI.Modbus.client
 
                 switch (basics.ProtocolType)
                 {
-                    case ModbusClientData.ProtocolType.Rtu:
-                    case ModbusClientData.ProtocolType.Ascii:
+                    case ModbusData.ProtocolType.Rtu:
+                    case ModbusData.ProtocolType.Ascii:
 
                         if (string.IsNullOrWhiteSpace(basics.PortName))
                         {
@@ -319,20 +319,20 @@ namespace YSAI.Modbus.client
                         SerialPortAdapter serialPortAdapter = new SerialPortAdapter(serialPort);
 
                         //Ascii
-                        if (basics.ProtocolType.Equals(ModbusClientData.ProtocolType.Ascii))
+                        if (basics.ProtocolType.Equals(ModbusData.ProtocolType.Ascii))
                         {
                             //创建对象
                             modbusMaster = modbusFactory.CreateAsciiMaster(serialPortAdapter);
                         }
                         //Rtu
-                        if (basics.ProtocolType.Equals(ModbusClientData.ProtocolType.Rtu))
+                        if (basics.ProtocolType.Equals(ModbusData.ProtocolType.Rtu))
                         {
                             //创建对象
                             modbusMaster = modbusFactory.CreateRtuMaster(serialPortAdapter);
                         }
                         break;
 
-                    case ModbusClientData.ProtocolType.Tcp:
+                    case ModbusData.ProtocolType.Tcp:
                         if (string.IsNullOrWhiteSpace(basics.Ip))
                         {
                             return Break("On", false, $"IP不能为空");
@@ -361,7 +361,7 @@ namespace YSAI.Modbus.client
                         modbusMaster = modbusFactory.CreateMaster(tcpClient);
                         break;
 
-                    case ModbusClientData.ProtocolType.Udp:
+                    case ModbusData.ProtocolType.Udp:
                         if (string.IsNullOrWhiteSpace(basics.Ip))
                         {
                             return Break("On", false, $"IP不能为空");

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

@@ -15,7 +15,7 @@
 	<ItemGroup>
     <PackageReference Include="NModbus" Version="3.0.80" />
     <PackageReference Include="NModbus.Serial" Version="3.0.80" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
 	<!--<ItemGroup>

+ 0 - 58
src/YSAI.DAQ/YSAI.Modbus/service/Common/CRC16.cs

@@ -1,58 +0,0 @@
-namespace YSAI.Modbus.service.Common
-{
-    /// <summary>
-    /// CRC16验证
-    /// </summary>
-    public class CRC16
-    {
-        /// <summary>
-        /// 验证CRC16校验码
-        /// </summary>
-        /// <param name="value">校验数据</param>
-        /// <param name="poly">多项式码</param>
-        /// <param name="crcInit">校验码初始值</param>
-        /// <returns></returns>
-        public static bool CheckCRC16(byte[] value, ushort poly = 0xA001, ushort crcInit = 0xFFFF)
-        {
-            if (value == null || !value.Any())
-                throw new ArgumentException("生成CRC16的入参有误");
-
-            var crc16 = GetCRC16(value, poly, crcInit);
-            if (crc16[crc16.Length - 2] == crc16[crc16.Length - 1] && crc16[crc16.Length - 1] == 0)
-                return true;
-            return false;
-        }
-
-        /// <summary>
-        /// 计算CRC16校验码
-        /// </summary>
-        /// <param name="value">校验数据</param>
-        /// <param name="poly">多项式码</param>
-        /// <param name="crcInit">校验码初始值</param>
-        /// <returns></returns>
-        public static byte[] GetCRC16(byte[] value, ushort poly = 0xA001, ushort crcInit = 0xFFFF)
-        {
-            if (value == null || !value.Any())
-                throw new ArgumentException("生成CRC16的入参有误");
-
-            //运算
-            ushort crc = crcInit;
-            for (int i = 0; i < value.Length; i++)
-            {
-                crc = (ushort)(crc ^ value[i]);
-                for (int j = 0; j < 8; j++)
-                {
-                    crc = (crc & 1) != 0 ? (ushort)(crc >> 1 ^ poly) : (ushort)(crc >> 1);
-                }
-            }
-            byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
-            byte lo = (byte)(crc & 0x00FF);         //低位置
-
-            byte[] buffer = new byte[value.Length + 2];
-            value.CopyTo(buffer, 0);
-            buffer[buffer.Length - 1] = hi;
-            buffer[buffer.Length - 2] = lo;
-            return buffer;
-        }
-    }
-}

+ 0 - 134
src/YSAI.DAQ/YSAI.Modbus/service/Common/DataConvert.cs

@@ -1,134 +0,0 @@
-using System.Text;
-
-namespace YSAI.Modbus.service.Common
-{
-    /// <summary>
-    /// 数据转换
-    /// </summary>
-    public static class DataConvert
-    {
-        /// <summary>
-        /// 字节数组转16进制字符
-        /// </summary>
-        /// <param name="byteArray"></param>
-        /// <returns></returns>
-        public static string ByteArrayToString(this byte[] byteArray)
-        {
-            return string.Join(" ", byteArray.Select(t => t.ToString("X2")));
-        }
-
-        /// <summary>
-        /// 16进制字符串转字节数组
-        /// </summary>
-        /// <param name="str"></param>
-        /// <param name="strict">严格模式(严格按两个字母间隔一个空格)</param>
-        /// <returns></returns>
-        public static byte[] StringToByteArray(this string str, bool strict = true)
-        {
-            if (string.IsNullOrWhiteSpace(str) || str.Trim().Replace(" ", "").Length % 2 != 0)
-                throw new ArgumentException("请传入有效的参数");
-
-            if (strict)
-            {
-                return str.Split(' ').Where(t => t?.Length == 2).Select(t => Convert.ToByte(t, 16)).ToArray();
-            }
-            else
-            {
-                str = str.Trim().Replace(" ", "");
-                var list = new List<byte>();
-                for (int i = 0; i < str.Length; i++)
-                {
-                    var string16 = str[i].ToString() + str[++i].ToString();
-                    list.Add(Convert.ToByte(string16, 16));
-                }
-                return list.ToArray();
-            }
-        }
-
-        /// <summary>
-        /// Asciis字符串数组字符串装字节数组
-        /// </summary>
-        /// <param name="str"></param>
-        /// <param name="strict"></param>
-        /// <returns></returns>
-        public static byte[] AsciiStringToByteArray(this string str, bool strict = true)
-        {
-            if (string.IsNullOrWhiteSpace(str) || str.Trim().Replace(" ", "").Length % 2 != 0)
-                throw new ArgumentException("请传入有效的参数");
-
-            if (strict)
-            {
-                List<string> stringList = new List<string>();
-                foreach (var item in str.Split(' '))
-                {
-                    stringList.Add(((char)Convert.ToByte(item, 16)).ToString());
-                }
-                return string.Join("", stringList).StringToByteArray(false);
-            }
-            else
-            {
-                str = str.Trim().Replace(" ", "");
-                var stringList = new List<string>();
-                for (int i = 0; i < str.Length; i++)
-                {
-                    var stringAscii = str[i].ToString() + str[++i].ToString();
-                    stringList.Add(((char)Convert.ToByte(stringAscii, 16)).ToString());
-                }
-                return string.Join("", stringList).StringToByteArray(false);
-            }
-        }
-
-        /// <summary>
-        /// Asciis数组字符串装字节数组
-        /// 如:30 31 =》 00 01
-        /// </summary>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        public static byte[] AsciiArrayToByteArray(this byte[] str)
-        {
-            if (!str?.Any() ?? true)
-                throw new ArgumentException("请传入有效的参数");
-
-            List<string> stringList = new List<string>();
-            foreach (var item in str)
-            {
-                stringList.Add(((char)item).ToString());
-            }
-            return string.Join("", stringList).StringToByteArray(false);
-        }
-
-        /// <summary>
-        /// 字节数组转换成Ascii字节数组
-        /// 如:00 01 => 30 31
-        /// </summary>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        public static byte[] ByteArrayToAsciiArray(this byte[] str)
-        {
-            return Encoding.ASCII.GetBytes(string.Join("", str.Select(t => t.ToString("X2"))));
-        }
-
-        /// <summary>
-        /// Int转二进制
-        /// </summary>
-        /// <param name="value"></param>
-        /// <param name="minLength">补0长度</param>
-        /// <returns></returns>
-        public static string IntToBinaryArray(this int value, int minLength = 0)
-        {
-            //Convert.ToString(12,2); // 将12转为2进制字符串,结果 “1100”
-            return Convert.ToString(value, 2).PadLeft(minLength, '0');
-        }
-
-        /// <summary>
-        /// 二进制转Int
-        /// </summary>
-        /// <param name="value"></param>
-        /// <returns></returns>
-        public static int BinaryArrayToInt(this string value)
-        {
-            //Convert.ToInt("1100",2); // 将2进制字符串转为整数,结果 12
-            return Convert.ToInt32(value, 2);
-        }
-    }
-}

+ 0 - 111
src/YSAI.DAQ/YSAI.Modbus/service/Common/DataPersist.cs

@@ -1,111 +0,0 @@
-using Newtonsoft.Json;
-using System.Collections.Concurrent;
-
-namespace YSAI.Modbus.service.Common
-{
-    public class DataPersist
-    {
-        private string prefix;
-        private static ConcurrentDictionary<string, string> data = new ConcurrentDictionary<string, string>();
-
-        /// <summary>
-        ///
-        /// </summary>
-        /// <param name="prefix">前缀</param>
-        public DataPersist(string prefix)
-        {
-            this.prefix = $"iot_{prefix}_";
-        }
-
-        /// <summary>
-        /// 读
-        /// </summary>
-        /// <param name="key"></param>
-        /// <returns></returns>
-        public string Read(string key)
-        {
-            key = prefix + key;
-            if (data.ContainsKey(key))
-            {
-                return data[key];
-            }
-            return string.Empty;
-        }
-
-        public string Read(int key)
-        {
-            return Read(key.ToString());
-        }
-
-        /// <summary>
-        /// 写
-        /// </summary>
-        /// <param name="key"></param>
-        /// <param name="value"></param>
-        public void Write(string key, string value)
-        {
-            key = prefix + key;
-            if (data.ContainsKey(key))
-            {
-                data[key] = value;
-            }
-            else
-            {
-                data.TryAdd(key, value);
-            }
-        }
-
-        public void Write(int key, string value)
-        {
-            Write(key.ToString(), value);
-        }
-
-        /// <summary>
-        /// 清空
-        /// </summary>
-        public static void Clear()
-        {
-            data = new ConcurrentDictionary<string, string>();
-
-            var filePath = @"C:\IoTClient\ConnectionConfig.Data";
-            if (File.Exists(filePath)) File.Delete(filePath);
-        }
-
-        /// <summary>
-        /// 保存数据
-        /// </summary>
-        public static void SaveData()
-        {
-            var path = @"C:\IoTClient";
-            var filePath = path + @"\IoTClient.Data";
-            var dataString = JsonConvert.SerializeObject(data);
-            using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
-            {
-                using (StreamWriter sw = new StreamWriter(fileStream))
-                {
-                    sw.Write(dataString);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 初始化加载数据
-        /// </summary>
-        public static void LoadData()
-        {
-            var dataString = string.Empty;
-            var path = @"C:\IoTClient";
-            var filePath = path + @"\IoTClient.Data";
-            if (File.Exists(filePath))
-                dataString = File.ReadAllText(filePath);
-            else
-            {
-                if (!Directory.Exists(path))
-                    Directory.CreateDirectory(path);
-                File.SetAttributes(path, FileAttributes.Hidden);
-            }
-            if (!string.IsNullOrWhiteSpace(dataString))
-                data = JsonConvert.DeserializeObject<ConcurrentDictionary<string, string>>(dataString);
-        }
-    }
-}

+ 0 - 51
src/YSAI.DAQ/YSAI.Modbus/service/Common/LRC.cs

@@ -1,51 +0,0 @@
-namespace YSAI.Modbus.service.Common
-{
-    /// <summary>
-    /// LRC验证
-    /// </summary>
-    public class LRC
-    {
-        /// <summary>
-        ///
-        /// </summary>
-        /// <param name="value"></param>
-        /// <returns></returns>
-        public static byte[] GetLRC(byte[] value)
-        {
-            if (value == null) return null;
-
-            int sum = 0;
-            for (int i = 0; i < value.Length; i++)
-            {
-                sum += value[i];
-            }
-
-            sum = sum % 256;
-            sum = 256 - sum;
-
-            byte[] LRC = new byte[] { (byte)sum };
-            return value.Concat(LRC).ToArray();
-        }
-
-        /// <summary>
-        ///
-        /// </summary>
-        /// <param name="value"></param>
-        /// <returns></returns>
-        public static bool CheckLRC(byte[] value)
-        {
-            if (value == null) throw new ArgumentNullException("参数为null");
-
-            int length = value.Length;
-            byte[] buffer = new byte[length - 1];
-            Array.Copy(value, 0, buffer, 0, buffer.Length);
-
-            byte[] LRCbuf = GetLRC(buffer);
-            if (LRCbuf[length - 1] == value[length - 1])
-            {
-                return true;
-            }
-            return false;
-        }
-    }
-}

+ 0 - 41
src/YSAI.DAQ/YSAI.Modbus/service/Common/ServerSocketBase.cs

@@ -1,41 +0,0 @@
-using System.Net.Sockets;
-
-namespace YSAI.Modbus.service.Common
-{
-    /// <summary>
-    /// ServerSocket基类
-    /// </summary>
-    public class ServerSocketBase
-    {
-        /// <summary>
-        /// 分批缓冲区大小
-        /// </summary>
-        protected const int BufferSize = 4096;
-
-        /// <summary>
-        /// 读取
-        /// </summary>
-        /// <param name="socket">socket</param>
-        /// <param name="receiveCount">读取长度</param>
-        /// <returns></returns>
-        protected byte[] SocketRead(Socket socket, int receiveCount)
-        {
-            byte[] receiveBytes = new byte[receiveCount];
-            int receiveFinish = 0;
-            while (receiveFinish < receiveCount)
-            {
-                // 分批读取
-                int receiveLength = receiveCount - receiveFinish >= BufferSize ? BufferSize : receiveCount - receiveFinish;
-                var readLeng = socket.Receive(receiveBytes, receiveFinish, receiveLength, SocketFlags.None);
-                if (readLeng == 0)
-                {
-                    if (socket.Connected) socket.Shutdown(SocketShutdown.Both);
-                    socket.Close();
-                    throw new Exception("连接已断开");
-                }
-                receiveFinish += readLeng;
-            }
-            return receiveBytes;
-        }
-    }
-}

+ 0 - 171
src/YSAI.DAQ/YSAI.Modbus/service/ModBusAsciiServer.cs

@@ -1,171 +0,0 @@
-using Newtonsoft.Json;
-using System.IO.Ports;
-using System.Text;
-using YSAI.Modbus.service.Common;
-
-namespace YSAI.Modbus.service
-{
-    /// <summary>
-    /// ModbusAscii 服务端模拟
-    /// </summary>
-    public class ModbusAsciiServer
-    {
-        private SerialPort serialPort;
-        private DataPersist dataPersist;
-
-        public ModbusAsciiServer(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity, int timeout = 1500)
-        {
-            if (serialPort == null) serialPort = new SerialPort();
-            serialPort.PortName = portName;
-            serialPort.BaudRate = baudRate;
-            serialPort.DataBits = dataBits;
-            serialPort.StopBits = stopBits;
-            serialPort.Encoding = Encoding.ASCII;
-            serialPort.Parity = parity;
-
-            serialPort.ReadTimeout = timeout;
-            serialPort.WriteTimeout = timeout;
-            serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
-            dataPersist = new DataPersist("ModbusTcpServer");
-        }
-
-        /// <summary>
-        /// 启动服务
-        /// </summary>
-        public void Start()
-        {
-            serialPort.Open();
-        }
-
-        /// <summary>
-        /// 停止服务
-        /// </summary>
-        public void Stop()
-        {
-            serialPort.Close();
-            serialPort.Dispose();
-        }
-
-        /// <summary>
-        /// 接收数据回调用
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
-        {
-            try
-            {
-                byte[] requetData = new byte[serialPort.BytesToRead];
-                serialPort.Read(requetData, 0, requetData.Length);
-                var address = $"{requetData[5]}-{requetData[6]}-{requetData[7]}-{requetData[8]}";
-
-                byte[] tempData = new byte[requetData.Length - 3];
-                Buffer.BlockCopy(requetData, 1, tempData, 0, tempData.Length);
-                var requetAsciiData = tempData.AsciiArrayToByteArray();
-
-                var type = $"{requetData[3].ToString("X2")}{requetData[4].ToString("X2")}";
-                switch (type)
-                {
-                    //读取线圈
-                    case "3031":
-                        {
-                            var value = dataPersist.Read(address);
-                            var bytes = JsonConvert.DeserializeObject<byte[]>(value);
-                            byte[] data = null;
-                            //没有存储过的数据的,默认响应false
-                            if (bytes == null)
-                            {
-                                data = "01 01 01 00".StringToByteArray();
-                            }
-                            else
-                            {
-                                if (bytes[0].ToString("X2") != "3A" ||
-                                    bytes[bytes.Length - 2].ToString("X2") != "0D" ||
-                                    bytes[bytes.Length - 1].ToString("X2") != "0A")
-                                {
-                                    throw new Exception("标记验证失败");
-                                }
-
-                                byte[] asciiData = new byte[bytes.Length - 3];
-                                Buffer.BlockCopy(bytes, 1, asciiData, 0, asciiData.Length);
-                                var byteDataArray = asciiData.AsciiArrayToByteArray();
-
-                                //true
-                                if (byteDataArray[4].ToString("X2") == "FF" && byteDataArray[5].ToString("X2") == "00")
-                                    data = "01 01 01 01".StringToByteArray();
-                                else//false
-                                    data = "01 01 01 00".StringToByteArray();
-                            }
-
-                            var dataString = string.Join("", LRC.GetLRC(data).Select(t => t.ToString("X2")));
-                            var databyte = Encoding.ASCII.GetBytes(dataString);
-                            var responseData = new byte[databyte.Length + 3];
-                            Buffer.BlockCopy(databyte, 0, responseData, 1, databyte.Length);
-                            responseData[0] = 0x3A;
-                            responseData[responseData.Length - 2] = 0x0D;
-                            responseData[responseData.Length - 1] = 0x0A;
-
-                            serialPort.Write(responseData, 0, responseData.Length);
-                        }
-                        break;
-                    //写入线圈
-                    case "3035":
-                        {
-                            dataPersist.Write(address, JsonConvert.SerializeObject(requetData));
-                            serialPort.Write(requetData, 0, requetData.Length);
-                        }
-                        break;
-                    //读取
-                    case "3033":
-                        {
-                            var value = dataPersist.Read(address);
-                            var bytes = JsonConvert.DeserializeObject<byte[]>(value);
-                            byte[] data = null;
-                            if (bytes == null)
-                            {
-                                data = new byte[2 + 3];
-                                data[2] = 2;//数据长度
-                            }
-                            else
-                            {
-                                if (bytes[0].ToString("X2") != "3A" ||
-                                    bytes[bytes.Length - 2].ToString("X2") != "0D" ||
-                                    bytes[bytes.Length - 1].ToString("X2") != "0A")
-                                {
-                                    throw new Exception("标记验证失败");
-                                }
-
-                                byte[] asciiData = new byte[bytes.Length - 3];
-                                Buffer.BlockCopy(bytes, 1, asciiData, 0, asciiData.Length);
-                                var byteDataArray = asciiData.AsciiArrayToByteArray();
-                                data = new byte[byteDataArray[6] + 3];
-                                data[2] = byteDataArray[6];//数据长度
-                                Buffer.BlockCopy(byteDataArray, 7, data, 3, data.Length - 3);
-                            }
-                            data[0] = requetAsciiData[0];//站号
-                            data[1] = 0x03;//功能码
-
-                            var dataString = string.Join("", LRC.GetLRC(data).Select(t => t.ToString("X2")));
-                            var databyte = Encoding.ASCII.GetBytes(dataString);
-                            var responseData = new byte[databyte.Length + 3];
-                            Buffer.BlockCopy(databyte, 0, responseData, 1, databyte.Length);
-                            responseData[0] = 0x3A;
-                            responseData[responseData.Length - 2] = 0x0D;
-                            responseData[responseData.Length - 1] = 0x0A;
-
-                            serialPort.Write(responseData, 0, responseData.Length);
-                        }
-                        break;
-                    //写入3130 对应十进制16 十六进制 10
-                    case "3130":
-                        {
-                            dataPersist.Write(address, JsonConvert.SerializeObject(requetData));
-                            serialPort.Write(requetData, 0, requetData.Length);
-                        }
-                        break;
-                }
-            }
-            catch { }
-        }
-    }
-}

+ 0 - 133
src/YSAI.DAQ/YSAI.Modbus/service/ModBusRtuServer.cs

@@ -1,133 +0,0 @@
-using Newtonsoft.Json;
-using System.IO.Ports;
-using System.Text;
-using YSAI.Modbus.service.Common;
-
-namespace YSAI.Modbus.service
-{
-    /// <summary>
-    /// ModbusRtu 服务端模拟
-    /// </summary>
-    public class ModbusRtuServer
-    {
-        private SerialPort serialPort;
-        private DataPersist dataPersist;
-
-        public ModbusRtuServer(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity, int timeout = 1500)
-        {
-            if (serialPort == null) serialPort = new SerialPort();
-            serialPort.PortName = portName;
-            serialPort.BaudRate = baudRate;
-            serialPort.DataBits = dataBits;
-            serialPort.StopBits = stopBits;
-            serialPort.Encoding = Encoding.ASCII;
-            serialPort.Parity = parity;
-
-            serialPort.ReadTimeout = timeout;
-            serialPort.WriteTimeout = timeout;
-            serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
-            dataPersist = new DataPersist("ModbusTcpServer");
-        }
-
-        /// <summary>
-        /// 启动服务
-        /// </summary>
-        public void Start()
-        {
-            serialPort.Open();
-        }
-
-        /// <summary>
-        /// 停止服务
-        /// </summary>
-        public void Stop()
-        {
-            serialPort.Close();
-            serialPort.Dispose();
-        }
-
-        /// <summary>
-        /// 接收数据回调用
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
-        {
-            try
-            {
-                byte[] requetData = new byte[serialPort.BytesToRead];
-                serialPort.Read(requetData, 0, requetData.Length);
-                var address = requetData[2] * 256 + requetData[3];
-
-                var stationNumberKey = $"{requetData[0]}-key";//站号
-                switch (requetData[1])
-                {
-                    //读取线圈
-                    case 1:
-                        {
-                            var value = dataPersist.Read(stationNumberKey + "-Coil");
-                            var byteArray = JsonConvert.DeserializeObject<byte[]>(value) ?? new byte[65536];
-                            var registerLenght = requetData[4] * 256 + requetData[5];
-                            var blenght = (byte)Math.Ceiling(registerLenght / 8f);
-                            var tempData = new byte[registerLenght];
-                            Buffer.BlockCopy(byteArray, address, tempData, 0, tempData.Length);
-                            var rData = new byte[3 + registerLenght];
-                            rData[0] = 1;
-                            rData[1] = 1;
-                            rData[2] = (byte)registerLenght;
-                            for (int i = 0; i < blenght; i++)
-                            {
-                                rData[3 + i] = (byte)string.Join("", tempData.Skip(i * 8).Take(8).Reverse()).BinaryArrayToInt();
-                            }
-                            var responseData = CRC16.GetCRC16(rData);
-                            serialPort.Write(responseData, 0, responseData.Length);
-                        }
-                        break;
-                    //写入线圈
-                    case 5:
-                        {
-                            var value = new byte[2];
-                            Buffer.BlockCopy(requetData, requetData.Length - 4, value, 0, value.Length);
-                            var byteArray = JsonConvert.DeserializeObject<byte[]>(dataPersist.Read(stationNumberKey + "-Coil")) ?? new byte[65536];
-                            if (value[0] == 0 && value[1] == 0)
-                                byteArray[address] = 0;
-                            else
-                                byteArray[address] = 1;
-                            dataPersist.Write(stationNumberKey + "-Coil", JsonConvert.SerializeObject(byteArray));
-                            serialPort.Write(requetData, 0, requetData.Length);
-                        }
-                        break;
-                    //读取
-                    case 3:
-                        {
-                            var value = dataPersist.Read(stationNumberKey);
-                            var byteArray = JsonConvert.DeserializeObject<byte[]>(value) ?? new byte[65536];
-                            var dlength = requetData[4] * 256 + requetData[5];
-                            var dataHead = new byte[] { 1, 3, (byte)(dlength * 2) };
-                            var dataContent = new byte[dlength * 2];
-                            Buffer.BlockCopy(byteArray, address * 2, dataContent, 0, dataContent.Length);
-                            var tempData = dataHead.Concat(dataContent).ToArray();
-                            var responseData = CRC16.GetCRC16(tempData);
-                            serialPort.Write(responseData, 0, responseData.Length);
-                        }
-                        break;
-                    //写入
-                    case 16:
-                        {
-                            var value = new byte[requetData[6]];
-                            Buffer.BlockCopy(requetData, 7, value, 0, value.Length);
-                            var byteArray = JsonConvert.DeserializeObject<byte[]>(dataPersist.Read(stationNumberKey)) ?? new byte[65536];
-                            value.CopyTo(byteArray, address * 2);
-                            dataPersist.Write(stationNumberKey, JsonConvert.SerializeObject(byteArray));
-                            var tempData = new byte[6];
-                            Buffer.BlockCopy(requetData, 0, tempData, 0, tempData.Length);
-                            var responseData = CRC16.GetCRC16(tempData);
-                            serialPort.Write(responseData, 0, responseData.Length);
-                        }
-                        break;
-                }
-            }
-            catch { }
-        }
-    }
-}

+ 0 - 200
src/YSAI.DAQ/YSAI.Modbus/service/ModBusTcpServer.cs

@@ -1,200 +0,0 @@
-using Newtonsoft.Json;
-using System.Net;
-using System.Net.Sockets;
-using YSAI.Modbus.service.Common;
-
-namespace YSAI.Modbus.service
-{
-    /// <summary>
-    /// ModbusTcp 服务端模拟
-    /// </summary>
-    public class ModbusTcpServer : ServerSocketBase
-    {
-        private Socket socketServer;
-        private string ip;
-        private int port;
-        private DataPersist dataPersist;
-        private List<Socket> sockets = new List<Socket>();
-
-        public ModbusTcpServer(int port, string ip = null)
-        {
-            this.ip = ip;
-            this.port = port;
-            dataPersist = new DataPersist("ModbusTcpServer");
-        }
-
-        /// <summary>
-        /// 启动服务
-        /// </summary>
-        public void Start()
-        {
-            //1 创建Socket对象
-            socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
-            //2 绑定ip和端口
-            var ipaddress = string.IsNullOrWhiteSpace(ip) ? IPAddress.Any : IPAddress.Parse(ip);
-            IPEndPoint ipEndPoint = new IPEndPoint(ipaddress, port);
-            socketServer.Bind(ipEndPoint);
-
-            //3、开启侦听(等待客户机发出的连接),并设置最大客户k端连接数为10
-            socketServer.Listen(10);
-
-            Task.Run(() => { Accept(socketServer); });
-        }
-
-        /// <summary>
-        /// 停止服务
-        /// </summary>
-        public void Stop()
-        {
-            if (socketServer?.Connected ?? false) socketServer.Shutdown(SocketShutdown.Both);
-            socketServer?.Close();
-        }
-
-        /// <summary>
-        /// 客户端连接到服务端
-        /// </summary>
-        /// <param name="socket"></param>
-        private void Accept(Socket socket)
-        {
-            while (true)
-            {
-                try
-                {
-                    Socket newSocket = null;
-                    try
-                    {
-                        //阻塞等待客户端连接
-                        newSocket = socket.Accept();
-                        sockets.Add(newSocket);
-                    }
-                    catch (SocketException ex)
-                    {
-                        foreach (var item in sockets)
-                        {
-                            if (item.Connected) item.Shutdown(SocketShutdown.Both);
-                            item.Close();
-                        }
-                    }
-                    Task.Run(() => { Receive(newSocket); });
-                }
-                catch (SocketException ex)
-                {
-                    if (ex.SocketErrorCode != SocketError.Interrupted)
-                        throw ex;
-                }
-            }
-        }
-
-        /// <summary>
-        /// 接收客户端发送的消息
-        /// </summary>
-        /// <param name="newSocket"></param>
-        private void Receive(Socket newSocket)
-        {
-            while (newSocket.Connected)
-            {
-                try
-                {
-                    byte[] requetData1 = new byte[8];
-                    //读取客户端发送过来的数据
-                    requetData1 = SocketRead(newSocket, requetData1.Length);
-                    byte[] requetData2 = new byte[requetData1[5] - 2];
-                    requetData2 = SocketRead(newSocket, requetData2.Length);
-                    var requetData = requetData1.Concat(requetData2).ToArray();
-                    byte[] responseData1 = new byte[8];
-                    //复制请求报文中的报文头
-                    Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length);
-                    var addressKey = $"{requetData[6]}-{requetData[8] * 256 + requetData[9]}";//站号-寄存器地址
-                    var stationNumberKey = $"{requetData[6]}-key";//站号
-                    var address = requetData[8] * 256 + requetData[9];//寄存器地址
-                    var registerLenght = requetData[10] * 256 + requetData[11];//寄存器的长度
-                    switch (requetData[7])
-                    {
-                        //读取线圈
-                        case 1:
-                            {
-                                var value = dataPersist.Read(stationNumberKey + "-Coil");// 数据存在 8、9
-                                var byteArray = JsonConvert.DeserializeObject<byte[]>(value) ?? new byte[65536];
-
-                                var blenght = (byte)Math.Ceiling(registerLenght / 8f);
-                                //当前位置到最后的长度
-                                responseData1[5] = (byte)(3 + blenght);
-                                byte[] responseData2 = new byte[1 + blenght];
-
-                                var tempData = new byte[registerLenght];
-                                Buffer.BlockCopy(byteArray, address, tempData, 0, tempData.Length);
-                                responseData2[0] = blenght;//显示数据所占长度
-                                for (int i = 0; i < blenght; i++)
-                                {
-                                    responseData2[1 + i] = (byte)string.Join("", tempData.Skip(i * 8).Take(8).Reverse()).BinaryArrayToInt();
-                                }
-                                var responseData = responseData1.Concat(responseData2).ToArray();
-                                newSocket.Send(responseData);
-                            }
-                            break;
-                        //写入线圈
-                        case 5:
-                            {
-                                var value = new byte[2];
-                                Buffer.BlockCopy(requetData, 10, value, 0, value.Length);
-                                var byteArray = JsonConvert.DeserializeObject<byte[]>(dataPersist.Read(stationNumberKey + "-Coil")) ?? new byte[65536];
-                                if (value[0] == 0 && value[1] == 0)
-                                    byteArray[address] = 0;
-                                else
-                                    byteArray[address] = 1;
-                                dataPersist.Write(stationNumberKey + "-Coil", JsonConvert.SerializeObject(byteArray));
-                                var responseData = new byte[10];
-                                Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length);
-                                responseData[5] = 4;//后面的长度
-                                newSocket.Send(responseData);
-                            }
-                            break;
-                        //读取
-                        case 3:
-                            {
-                                var value = dataPersist.Read(stationNumberKey);// 数据存在 8、9
-                                var byteArray = JsonConvert.DeserializeObject<byte[]>(value) ?? new byte[65536];
-                                //当前位置到最后的长度
-                                responseData1[4] = (byte)((3 + registerLenght * 2) / 256);
-                                responseData1[5] = (byte)((3 + registerLenght * 2) % 256);
-                                byte[] responseData2 = new byte[1 + registerLenght * 2];
-                                responseData2[0] = (byte)(registerLenght * 2);
-                                Buffer.BlockCopy(byteArray, address * 2, responseData2, 1, registerLenght * 2);
-                                var responseData = responseData1.Concat(responseData2).ToArray();
-                                newSocket.Send(responseData);
-                            }
-                            break;
-                        //写入
-                        case 16:
-                            {
-                                var value = new byte[requetData[12]];
-                                Buffer.BlockCopy(requetData, 13, value, 0, value.Length);
-                                var byteArray = JsonConvert.DeserializeObject<byte[]>(dataPersist.Read(stationNumberKey)) ?? new byte[65536];
-                                value.CopyTo(byteArray, address * 2);
-                                dataPersist.Write(stationNumberKey, JsonConvert.SerializeObject(byteArray));
-                                var responseData = new byte[12];
-                                Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length);
-                                responseData[5] = 6;//后面的长度
-                                newSocket.Send(responseData);
-                            }
-                            break;
-                        //读离散
-                        case 2:
-                            {
-                                //只返回false
-                                var bytes = new byte[2];
-                                //当前位置到最后的长度
-                                responseData1[5] = (byte)(2 + bytes.Length);
-                                byte[] responseData2 = new byte[2] { bytes[1], bytes[0] };
-                                var responseData = responseData1.Concat(responseData2).ToArray();
-                                newSocket.Send(responseData);
-                            }
-                            break;
-                    }
-                }
-                catch { }
-            }
-        }
-    }
-}

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

@@ -15,7 +15,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.65" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
 	<!--<ItemGroup>

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

@@ -14,6 +14,6 @@
 	<ItemGroup>
 		<PackageReference Include="DotNetty.Handlers" Version="0.7.5" />
 		<PackageReference Include="DotNetty.Transport" Version="0.7.5" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
 	</ItemGroup>
 </Project>

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

@@ -13,7 +13,7 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="OPCFoundation.NetStandard.Opc.Ua" Version="1.4.372.76" />
-	<PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+	<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
 

+ 27 - 18
src/YSAI.DAQ/YSAI.Pack.Param/Program.cs

@@ -4,14 +4,14 @@ using YSAI.Beckhoff;
 using YSAI.Can;
 using YSAI.DB;
 using YSAI.Kafka;
-using YSAI.Modbus.client;
+using YSAI.Modbus;
 using YSAI.Mqtt.client;
 using YSAI.Netty.client;
 using YSAI.Opc.da.client;
 using YSAI.Opc.da.http;
 using YSAI.Opc.ua.client;
 using YSAI.RabbitMQ;
-using YSAI.S7.client;
+using YSAI.S7;
 using YSAI.Unility;
 using static YSAI.Pack.Param.Program.BodyParam.subset;
 using static YSAI.Unility.ReflexTool;
@@ -20,7 +20,7 @@ namespace YSAI.Pack.Param
 {
     internal class Program
     {
-        static void Main(string[] args)
+        private static void Main(string[] args)
         {
             string FileDirectory = string.Empty;
             string[] paths = AppDomain.CurrentDomain.BaseDirectory.Split('\\');
@@ -29,17 +29,16 @@ namespace YSAI.Pack.Param
                 FileDirectory += $"{paths[i]}//";
             }
 
-
             BodyHandler body1 = new BodyHandler { Body = new CanData.Basics(), FileName = "Can.json", Namespace = "YSAI.Can.CanOperator" };
             BodyHandler body2 = new BodyHandler { Body = new DBData.Basics(), FileName = "DB.json", Namespace = "YSAI.DB.DBOperate" };
             BodyHandler body3 = new BodyHandler { Body = new KafkaData.Basics(), FileName = "Kafka.json", Namespace = "YSAI.Kafka.KafkaOperate" };
-            BodyHandler body4 = new BodyHandler { Body = new ModbusClientData.Basics(), FileName = "Modbus.json", Namespace = "YSAI.Modbus.client.ModbusClientOperate" };
+            BodyHandler body4 = new BodyHandler { Body = new ModbusData.Basics(), FileName = "Modbus.json", Namespace = "YSAI.Modbus.ModbusOperate" };
             BodyHandler body5 = new BodyHandler { Body = new MqttClientData.Basics(), FileName = "Mqtt.json", Namespace = "YSAI.Mqtt.client.MqttClientOperate" };
             BodyHandler body6 = new BodyHandler { Body = new OpcDaClientData.Basics(), FileName = "OpcDa.json", Namespace = "YSAI.Opc.da.client.OpcDaClientOperate" };
             BodyHandler body7 = new BodyHandler { Body = new OpcDaHttpData.Basics(), FileName = "OpcDaHttp.json", Namespace = "YSAI.Opc.da.http.OpcDaHttpOperate" };
             BodyHandler body8 = new BodyHandler { Body = new OpcUaClientData.Basics(), FileName = "OpcUa.json", Namespace = "YSAI.Opc.ua.client.OpcUaClientOperate" };
             BodyHandler body9 = new BodyHandler { Body = new RabbitMQData.Basics(), FileName = "RabbitMQ.json", Namespace = "YSAI.RabbitMQ.RabbitMQOperate" };
-            BodyHandler body10 = new BodyHandler { Body = new S7ClientData.Basics(), FileName = "S7.json", Namespace = "YSAI.S7.client.S7ClientOperate" };
+            BodyHandler body10 = new BodyHandler { Body = new S7Data.Basics(), FileName = "S7.json", Namespace = "YSAI.S7.S7Operate" };
             BodyHandler body11 = new BodyHandler { Body = new NettyClientData.Basics(), FileName = "Netty.json", Namespace = "YSAI.Netty.client.NettyClientOperate" };
             BodyHandler body12 = new BodyHandler { Body = new BeckhoffData.Basics(), FileName = "Beckhoff.json", Namespace = "YSAI.Beckhoff.BeckhoffOperate" };
 
@@ -57,36 +56,47 @@ namespace YSAI.Pack.Param
                     case "CanData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<CanData.Basics>();
                         break;
+
                     case "DBData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<DBData.Basics>();
                         break;
+
                     case "KafkaData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<KafkaData.Basics>();
                         break;
-                    case "ModbusClientData.Basics":
-                        libInstanceParams = ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>();
+
+                    case "ModbusData.Basics":
+                        libInstanceParams = ReflexTool.GetClassAllPropertyData<ModbusData.Basics>();
                         break;
+
                     case "MqttClientData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<MqttClientData.Basics>();
                         break;
+
                     case "OpcDaClientData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<OpcDaClientData.Basics>();
                         break;
+
                     case "OpcDaHttpData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<OpcDaHttpData.Basics>();
                         break;
+
                     case "OpcUaClientData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<OpcUaClientData.Basics>();
                         break;
+
                     case "RabbitMQData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<RabbitMQData.Basics>();
                         break;
-                    case "S7ClientData.Basics":
-                        libInstanceParams = ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>();
+
+                    case "S7Data.Basics":
+                        libInstanceParams = ReflexTool.GetClassAllPropertyData<S7Data.Basics>();
                         break;
+
                     case "NettyClientData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<NettyClientData.Basics>();
                         break;
+
                     case "BeckhoffData.Basics":
                         libInstanceParams = ReflexTool.GetClassAllPropertyData<BeckhoffData.Basics>();
                         break;
@@ -102,7 +112,6 @@ namespace YSAI.Pack.Param
                         Subset = new List<BodyParam.subset>()
                     };
 
-
                     for (int i = 0; i < strings.Length; i++)
                     {
                         bodyParam.Subset.Add(new BodyParam.subset
@@ -119,7 +128,6 @@ namespace YSAI.Pack.Param
                                 PropertyName = lib.Name,
                                 Description = lib.Describe,
                                 IsShow = true,
-
                             };
 
                             if (lib.ParamType.Equals("Enum"))
@@ -170,6 +178,7 @@ namespace YSAI.Pack.Param
                             case "Modbus-Udp":
                                 bodyParam.Subset[i].Propertie.RemoveRange(10, 5);
                                 break;
+
                             case "Modbus-Rtu":
                             case "Modbus-Ascii":
                                 bodyParam.Subset[i].Propertie.RemoveRange(7, 3);
@@ -185,7 +194,6 @@ namespace YSAI.Pack.Param
                             Value = item.Namespace,
                             DataCate = propertie.dataCate.text
                         });
-
                     }
                 }
                 else
@@ -206,10 +214,8 @@ namespace YSAI.Pack.Param
                         }
                     };
 
-
                     foreach (var lib in libInstanceParams)
                     {
-
                         BodyParam.subset.propertie propertie = new BodyParam.subset.propertie
                         {
                             PropertyName = lib.Name,
@@ -256,7 +262,6 @@ namespace YSAI.Pack.Param
                             });
                         }
 
-
                         bodyParam.Subset[0].Propertie.Add(propertie);
                     }
 
@@ -288,6 +293,7 @@ namespace YSAI.Pack.Param
                 FileTool.StringToFile(path, bodyParam.ToJson().JsonFormatting());
             }
         }
+
         /// <summary>
         /// 处理的结构
         /// </summary>
@@ -308,21 +314,25 @@ namespace YSAI.Pack.Param
             public string Name { get; set; }
             public string Description { get; set; }
             public List<subset> Subset { get; set; }
+
             public class subset
             {
                 public string Name { get; set; }
                 public string Description { get; set; }
                 public List<propertie> Propertie { get; set; }
+
                 public class propertie
                 {
                     [JsonConverter(typeof(StringEnumConverter))]
                     public dataCate DataCate { get; set; }
+
                     public enum dataCate
                     {
                         text,
                         select,
                         radio
                     }
+
                     public string Default { get; set; }
                     public string Description { get; set; }
                     public string PropertyName { get; set; }
@@ -330,13 +340,12 @@ namespace YSAI.Pack.Param
                     public bool IsShow { get; set; }
                     public bool IsMust { get; set; }
                     public List<options>? Options { get; set; } = null;
+
                     public class options
                     {
                         public string Key { get; set; }
                         public object Value { get; set; }
                     }
-
-
                 }
             }
         }

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

@@ -14,7 +14,7 @@
 
   <ItemGroup>
     <PackageReference Include="RabbitMQ.Client" Version="6.6.0" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
   <ItemGroup>

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

@@ -9,7 +9,7 @@
 	<ItemGroup>
 		<PackageReference Include="RabbitMQ.Client" Version="6.6.0" />
 		<PackageReference Include="Confluent.Kafka" Version="2.3.0" />
-		<PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+		<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
 		<FrameworkReference Include="Microsoft.AspNetCore.App" />
 	</ItemGroup>
 

+ 4 - 4
src/YSAI.DAQ/YSAI.S7.Pack/Program.cs

@@ -1,11 +1,11 @@
-using YSAI.S7.client;
+using YSAI.S7;
 using YSAI.Unility;
 
 namespace YSAI.S7.Pack
 {
     internal class Program
     {
-        static void Main(string[] args)
+        private static void Main(string[] args)
         {
             string FileDirectory = string.Empty;
             string[] paths = AppDomain.CurrentDomain.BaseDirectory.Split('\\');
@@ -21,8 +21,8 @@ namespace YSAI.S7.Pack
             {
                 Directory.CreateDirectory(FileDirectory);
             }
-            FileTool.StringToFile(ParamFile, new S7ClientData.Basics().ToJson().JsonFormatting());
-            FileTool.StringToFile(ParamDetailsFile, ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>().ToJson().JsonFormatting());
+            FileTool.StringToFile(ParamFile, new S7Data.Basics().ToJson().JsonFormatting());
+            FileTool.StringToFile(ParamDetailsFile, ReflexTool.GetClassAllPropertyData<S7Data.Basics>().ToJson().JsonFormatting());
         }
     }
 }

+ 8 - 6
src/YSAI.DAQ/YSAI.S7/client/S7ClientData.cs

@@ -5,10 +5,9 @@ using System.ComponentModel;
 using YSAI.Core.subscription;
 using YSAI.Unility;
 
-namespace YSAI.S7.client
+namespace YSAI.S7
 {
-
-    public class S7ClientData
+    public class S7Data
     {
         /// <summary>
         /// 基础数据
@@ -20,22 +19,26 @@ namespace YSAI.S7.client
             /// </summary>
             [Description("唯一标识符")]
             public string? SN { get; set; } = Guid.NewGuid().ToNString();
+
             /// <summary>
             /// ip地址
             /// </summary>
             [Description("IP")]
             public string? Ip { get; set; }
+
             /// <summary>
             /// 端口
             /// </summary>
             [Description("端口")]
             public int Port { get; set; }
+
             /// <summary>
             /// CPU类型
             /// </summary>
             [Description("CPU类型")]
             [JsonConverter(typeof(StringEnumConverter))]
             public CpuType S7CpuType { get; set; }
+
             /// <summary>
             /// PLC的机架,
             /// 通常为0,
@@ -43,6 +46,7 @@ namespace YSAI.S7.client
             /// </summary>
             [Description("PLC机架")]
             public int Rack { get; set; } = 0;
+
             /// <summary>
             /// PLC的CPU插槽,
             /// S7-300/S7-400为2,
@@ -51,7 +55,5 @@ namespace YSAI.S7.client
             [Description("PLCCPU插槽")]
             public int Slot { get; set; } = 0;
         }
-
-
     }
-}
+}

+ 23 - 14
src/YSAI.DAQ/YSAI.S7/client/S7ClientOperate.cs

@@ -1,5 +1,4 @@
-
-using S7.Net;
+using S7.Net;
 using S7.Net.Types;
 using System.Collections.Concurrent;
 using System.Text;
@@ -9,34 +8,36 @@ using YSAI.Core.subscription;
 using YSAI.Core.virtualAddress;
 using YSAI.Unility;
 
-namespace YSAI.S7.client
+namespace YSAI.S7
 {
     /// <summary>
     /// s7操作
     /// </summary>
-    public sealed class S7ClientOperate : IBaseAbstract, IDaq
+    public sealed class S7Operate : IBaseAbstract, IDaq
     {
-        protected override string TAG => "S7ClientOperate";
+        protected override string TAG => "S7Operate";
+
         /// <summary>
         /// 锁
         /// </summary>
         private static readonly object Lock = new object();
+
         /// <summary>
         /// 自身对象集合
         /// </summary>
-        private static List<S7ClientOperate> ThisObjList = new List<S7ClientOperate>();
+        private static List<S7Operate> ThisObjList = new List<S7Operate>();
 
         /// <summary>
         /// 单例模式
         /// </summary>
         /// <returns></returns>
-        public static S7ClientOperate Instance(S7ClientData.Basics basics)
+        public static S7Operate Instance(S7Data.Basics basics)
         {
             if (ThisObjList.Count >= MaxInstanceCount)
             {
                 throw new Exception(ExceedMaxInstanceCountTips);
             }
-            S7ClientOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Comparer(basics).result);
+            S7Operate? exp = ThisObjList.FirstOrDefault(c => c.basics.Comparer(basics).result);
             if (exp == null)
             {
                 lock (Lock)
@@ -47,7 +48,7 @@ namespace YSAI.S7.client
                     }
                     else
                     {
-                        S7ClientOperate exp2 = new S7ClientOperate(basics);
+                        S7Operate exp2 = new S7Operate(basics);
                         ThisObjList.Add(exp2);
                         return exp2;
                     }
@@ -60,7 +61,7 @@ namespace YSAI.S7.client
         /// 构造函数
         /// </summary>
         /// <param name="basics"></param>
-        public S7ClientOperate(S7ClientData.Basics basics)
+        public S7Operate(S7Data.Basics basics)
         {
             this.basics = basics;
         }
@@ -68,7 +69,8 @@ namespace YSAI.S7.client
         /// <summary>
         /// 基础数据
         /// </summary>
-        private S7ClientData.Basics basics { get; set; }
+        private S7Data.Basics basics { get; set; }
+
         /// <summary>
         /// 虚拟地址
         /// </summary>
@@ -241,26 +243,33 @@ namespace YSAI.S7.client
                                 case Core.@enum.DataType.Bool:
                                     Value = ((bool)PlcS7.ReadAsync(item.AddressName).Result).ToString();
                                     break;
+
                                 case Core.@enum.DataType.String:
                                     byte[]? head = PlcS7?.ReadBytes(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, 2);
                                     byte[]? bytes = PlcS7?.ReadBytes(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr + 2, head[1]);
                                     Value = Encoding.ASCII.GetString(bytes).TrimEnd(new char[] { '\0' });
                                     break;
+
                                 case Core.@enum.DataType.Byte:
                                     Value = ((byte)PlcS7.ReadAsync(item.AddressName).Result).ToString();
                                     break;
+
                                 case Core.@enum.DataType.Double:
                                     Value = ((ushort)PlcS7.ReadAsync(item.AddressName).Result).ToDouble().ToString();
                                     break;
+
                                 case Core.@enum.DataType.Float:
                                     Value = ((uint)PlcS7.ReadAsync(item.AddressName).Result).ConvertToFloat().ToString();
                                     break;
+
                                 case Core.@enum.DataType.Int:
                                     Value = ((uint)PlcS7.ReadAsync(item.AddressName).Result).ConvertToInt().ToString();
                                     break;
+
                                 case Core.@enum.DataType.Uint:
                                     Value = ((int)PlcS7.ReadAsync(item.AddressName).Result).ConvertToUInt().ToString();
                                     break;
+
                                 default:
                                     Value = $"不支持{item.AddressDataType}类型读取";
                                     break;
@@ -297,7 +306,7 @@ namespace YSAI.S7.client
                     }
                     if (param.Count > 0)
                     {
-                        //返回读取的数据 
+                        //返回读取的数据
                         return Break("Read", true, RData: param, RType: Core.@enum.ResultType.KeyValue);
                     }
                     else
@@ -372,7 +381,6 @@ namespace YSAI.S7.client
             }
         }
 
-
         /// <summary>
         /// 实现订阅功能
         /// </summary>
@@ -411,6 +419,7 @@ namespace YSAI.S7.client
                 return Break("Subscribe", false, ex.Message, Exception: ex);
             }
         }
+
         public Task<OperateResult> SubscribeAsync(Address address)
         {
             return Task.Run(() => Subscribe(address));
@@ -470,4 +479,4 @@ namespace YSAI.S7.client
             return Task.Run(() => GetStatus());
         }
     }
-}
+}

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

@@ -14,7 +14,7 @@
 
 	<ItemGroup>
     <PackageReference Include="S7netplus" Version="0.20.0" />
-    <PackageReference Include="YSAI.Core" Version="1.0.0.65" />
+    <PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
 	<!--<ItemGroup>

+ 0 - 134
src/YSAI.DAQ/YSAI.S7/service/Common/DataConvert.cs

@@ -1,134 +0,0 @@
-using System.Text;
-
-namespace YSAI.S7.service.Common
-{
-    /// <summary>
-    /// 数据转换
-    /// </summary>
-    public static class DataConvert
-    {
-        /// <summary>
-        /// 字节数组转16进制字符
-        /// </summary>
-        /// <param name="byteArray"></param>
-        /// <returns></returns>
-        public static string ByteArrayToString(this byte[] byteArray)
-        {
-            return string.Join(" ", byteArray.Select(t => t.ToString("X2")));
-        }
-
-        /// <summary>
-        /// 16进制字符串转字节数组
-        /// </summary>
-        /// <param name="str"></param>
-        /// <param name="strict">严格模式(严格按两个字母间隔一个空格)</param>
-        /// <returns></returns>
-        public static byte[] StringToByteArray(this string str, bool strict = true)
-        {
-            if (string.IsNullOrWhiteSpace(str) || str.Trim().Replace(" ", "").Length % 2 != 0)
-                throw new ArgumentException("请传入有效的参数");
-
-            if (strict)
-            {
-                return str.Split(' ').Where(t => t?.Length == 2).Select(t => Convert.ToByte(t, 16)).ToArray();
-            }
-            else
-            {
-                str = str.Trim().Replace(" ", "");
-                var list = new List<byte>();
-                for (int i = 0; i < str.Length; i++)
-                {
-                    var string16 = str[i].ToString() + str[++i].ToString();
-                    list.Add(Convert.ToByte(string16, 16));
-                }
-                return list.ToArray();
-            }
-        }
-
-        /// <summary>
-        /// Asciis字符串数组字符串装字节数组
-        /// </summary>
-        /// <param name="str"></param>
-        /// <param name="strict"></param>
-        /// <returns></returns>
-        public static byte[] AsciiStringToByteArray(this string str, bool strict = true)
-        {
-            if (string.IsNullOrWhiteSpace(str) || str.Trim().Replace(" ", "").Length % 2 != 0)
-                throw new ArgumentException("请传入有效的参数");
-
-            if (strict)
-            {
-                List<string> stringList = new List<string>();
-                foreach (var item in str.Split(' '))
-                {
-                    stringList.Add(((char)Convert.ToByte(item, 16)).ToString());
-                }
-                return string.Join("", stringList).StringToByteArray(false);
-            }
-            else
-            {
-                str = str.Trim().Replace(" ", "");
-                var stringList = new List<string>();
-                for (int i = 0; i < str.Length; i++)
-                {
-                    var stringAscii = str[i].ToString() + str[++i].ToString();
-                    stringList.Add(((char)Convert.ToByte(stringAscii, 16)).ToString());
-                }
-                return string.Join("", stringList).StringToByteArray(false);
-            }
-        }
-
-        /// <summary>
-        /// Asciis数组字符串装字节数组
-        /// 如:30 31 =》 00 01
-        /// </summary>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        public static byte[] AsciiArrayToByteArray(this byte[] str)
-        {
-            if (!str?.Any() ?? true)
-                throw new ArgumentException("请传入有效的参数");
-
-            List<string> stringList = new List<string>();
-            foreach (var item in str)
-            {
-                stringList.Add(((char)item).ToString());
-            }
-            return string.Join("", stringList).StringToByteArray(false);
-        }
-
-        /// <summary>
-        /// 字节数组转换成Ascii字节数组
-        /// 如:00 01 => 30 31
-        /// </summary>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        public static byte[] ByteArrayToAsciiArray(this byte[] str)
-        {
-            return Encoding.ASCII.GetBytes(string.Join("", str.Select(t => t.ToString("X2"))));
-        }
-
-        /// <summary>
-        /// Int转二进制
-        /// </summary>
-        /// <param name="value"></param>
-        /// <param name="minLength">补0长度</param>
-        /// <returns></returns>
-        public static string IntToBinaryArray(this int value, int minLength = 0)
-        {
-            //Convert.ToString(12,2); // 将12转为2进制字符串,结果 “1100”
-            return Convert.ToString(value, 2).PadLeft(minLength, '0');
-        }
-
-        /// <summary>
-        /// 二进制转Int
-        /// </summary>
-        /// <param name="value"></param>
-        /// <returns></returns>
-        public static int BinaryArrayToInt(this string value)
-        {
-            //Convert.ToInt("1100",2); // 将2进制字符串转为整数,结果 12
-            return Convert.ToInt32(value, 2);
-        }
-    }
-}

+ 0 - 111
src/YSAI.DAQ/YSAI.S7/service/Common/DataPersist.cs

@@ -1,111 +0,0 @@
-using Newtonsoft.Json;
-using System.Collections.Concurrent;
-
-namespace YSAI.S7.service.Common
-{
-    public class DataPersist
-    {
-        string prefix;
-        static ConcurrentDictionary<string, string> data = new ConcurrentDictionary<string, string>();
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="prefix">前缀</param> 
-        public DataPersist(string prefix)
-        {
-            this.prefix = $"iot_{prefix}_";
-        }
-
-        /// <summary>
-        /// 读
-        /// </summary>
-        /// <param name="key"></param>
-        /// <returns></returns>
-        public string Read(string key)
-        {
-            key = prefix + key;
-            if (data.ContainsKey(key))
-            {
-                return data[key];
-            }
-            return string.Empty;
-        }
-
-        public string Read(int key)
-        {
-            return Read(key.ToString());
-        }
-
-        /// <summary>
-        /// 写
-        /// </summary>
-        /// <param name="key"></param>
-        /// <param name="value"></param>
-        public void Write(string key, string value)
-        {
-            key = prefix + key;
-            if (data.ContainsKey(key))
-            {
-                data[key] = value;
-            }
-            else
-            {
-                data.TryAdd(key, value);
-            }
-        }
-
-        public void Write(int key, string value)
-        {
-            Write(key.ToString(), value);
-        }
-
-        /// <summary>
-        /// 清空
-        /// </summary>
-        public static void Clear()
-        {
-            data = new ConcurrentDictionary<string, string>();
-
-            var filePath = @"C:\IoTClient\ConnectionConfig.Data";
-            if (File.Exists(filePath)) File.Delete(filePath);
-        }
-
-        /// <summary>
-        /// 保存数据
-        /// </summary>
-        public static void SaveData()
-        {
-            var path = @"C:\IoTClient";
-            var filePath = path + @"\IoTClient.Data";
-            var dataString = JsonConvert.SerializeObject(data);
-            using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
-            {
-                using (StreamWriter sw = new StreamWriter(fileStream))
-                {
-                    sw.Write(dataString);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 初始化加载数据
-        /// </summary>
-        public static void LoadData()
-        {
-            var dataString = string.Empty;
-            var path = @"C:\IoTClient";
-            var filePath = path + @"\IoTClient.Data";
-            if (File.Exists(filePath))
-                dataString = File.ReadAllText(filePath);
-            else
-            {
-                if (!Directory.Exists(path))
-                    Directory.CreateDirectory(path);
-                File.SetAttributes(path, FileAttributes.Hidden);
-            }
-            if (!string.IsNullOrWhiteSpace(dataString))
-                data = JsonConvert.DeserializeObject<ConcurrentDictionary<string, string>>(dataString);
-        }
-    }
-}

+ 0 - 41
src/YSAI.DAQ/YSAI.S7/service/Common/ServerSocketBase.cs

@@ -1,41 +0,0 @@
-using System.Net.Sockets;
-
-namespace YSAI.S7.service.Common
-{
-    /// <summary>
-    /// ServerSocket基类
-    /// </summary>
-    public class ServerSocketBase
-    {
-        /// <summary>
-        /// 分批缓冲区大小
-        /// </summary>
-        protected const int BufferSize = 4096;
-
-        /// <summary>
-        /// 读取
-        /// </summary>
-        /// <param name="socket">socket</param>
-        /// <param name="receiveCount">读取长度</param>
-        /// <returns></returns>
-        protected byte[] SocketRead(Socket socket, int receiveCount)
-        {
-            byte[] receiveBytes = new byte[receiveCount];
-            int receiveFinish = 0;
-            while (receiveFinish < receiveCount)
-            {
-                // 分批读取
-                int receiveLength = receiveCount - receiveFinish >= BufferSize ? BufferSize : receiveCount - receiveFinish;
-                var readLeng = socket.Receive(receiveBytes, receiveFinish, receiveLength, SocketFlags.None);
-                if (readLeng == 0)
-                {
-                    if (socket.Connected) socket.Shutdown(SocketShutdown.Both);
-                    socket.Close();
-                    throw new Exception("连接已断开");
-                }
-                receiveFinish += readLeng;
-            }
-            return receiveBytes;
-        }
-    }
-}

+ 0 - 73
src/YSAI.DAQ/YSAI.S7/service/Common/SiemensConstant.cs

@@ -1,73 +0,0 @@
-namespace YSAI.S7.service.Common
-{
-    /// <summary>
-    /// Siemens命令常量
-    /// </summary>
-    public class SiemensConstant
-    {
-        /// <summary>
-        /// Head头读取长度
-        /// </summary>
-        public static readonly ushort InitHeadLength = 4;
-
-        /// <summary>
-        /// 第一次初始化指令交互报文
-        /// </summary>
-        public static readonly byte[] Command1 = new byte[22]
-        {
-            0x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,
-            0x00,0x01,0x00,0xC0,0x01,0x0A,0xC1,0x02,
-            0x01,0x02,0xC2,0x02,0x01,0x00
-        };
-
-        /// <summary>
-        /// 第二次初始化指令交互报文
-        /// </summary>
-        public static readonly byte[] Command2 = new byte[25]
-        {
-            0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,
-            0x01,0x00,0x00,0x04,0x00,0x00,0x08,0x00,
-            0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x01,0xE0
-        };
-
-        /// <summary>
-        /// 第一次初始化指令交互报文
-        /// </summary>
-        public static readonly byte[] Command1_200Smart = new byte[22]
-        {
-            0x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,
-            0x00,0x01,0x00,0xC1,0x02,0x10,0x00,0xC2,
-            0x02,0x03,0x00,0xC0,0x01,0x0A
-        };
-
-        /// <summary>
-        /// 第二次初始化指令交互报文
-        /// </summary>
-        public static readonly byte[] Command2_200Smart = new byte[25]
-        {
-            0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,
-            0x01,0x00,0x00,0xCC,0xC1,0x00,0x08,0x00,
-            0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x03,0xC0
-        };
-
-        /// <summary>
-        /// 第一次初始化指令交互报文
-        /// </summary>
-        public static readonly byte[] Command1_200 = new byte[]
-        {
-            0x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,
-            0x00,0x01,0x00,0xC1,0x02,0x4D,0x57,0xC2,
-            0x02,0x4D,0x57,0xC0,0x01,0x09
-        };
-
-        /// <summary>
-        /// 第二次初始化指令交互报文
-        /// </summary>
-        public static readonly byte[] Command2_200 = new byte[]
-        {
-            0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,
-            0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
-            0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x03,0xC0
-        };
-    }
-}

+ 0 - 246
src/YSAI.DAQ/YSAI.S7/service/S7Service.cs

@@ -1,246 +0,0 @@
-using Newtonsoft.Json;
-using System.Net;
-using System.Net.Sockets;
-using YSAI.S7.service.Common;
-
-namespace IoTServer.Servers.PLC
-{
-    /// <summary>
-    /// 西门子PLC 服务端模拟
-    /// </summary>
-    public class S7Service : ServerSocketBase
-    {
-        private Socket socketServer;
-        private string ip;
-        private int port;
-        List<Socket> sockets = new List<Socket>();
-        DataPersist dataPersist;
-        public S7Service(int port, string ip = null)
-        {
-            this.ip = ip;
-            this.port = port;
-            dataPersist = new DataPersist("SiemensServer");
-        }
-
-        /// <summary>
-        /// 启动服务
-        /// </summary>
-        public void Start()
-        {
-            //1 创建Socket对象
-            socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-
-            //2 绑定ip和端口 
-            var ipaddress = string.IsNullOrWhiteSpace(ip) ? IPAddress.Any : IPAddress.Parse(ip);
-            IPEndPoint ipEndPoint = new IPEndPoint(ipaddress, port);
-            socketServer.Bind(ipEndPoint);
-
-            //3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10
-            socketServer.Listen(100);
-
-            Task.Run(() => { Accept(socketServer); });
-        }
-
-        /// <summary>
-        /// 停止服务
-        /// </summary>
-        public void Stop()
-        {
-            if (socketServer?.Connected ?? false) socketServer.Shutdown(SocketShutdown.Both);
-            socketServer?.Close();
-        }
-
-        /// <summary>
-        /// 客户端连接到服务端
-        /// </summary>
-        /// <param name="socket"></param>
-        void Accept(Socket socket)
-        {
-            while (true)
-            {
-                try
-                {
-                    Socket newSocket = null;
-                    try
-                    {
-                        //阻塞等待客户端连接
-                        newSocket = socket.Accept();
-                        sockets.Add(newSocket);
-                        Task.Run(() => { Receive(newSocket); });
-                    }
-                    catch (SocketException)
-                    {
-                        foreach (var item in sockets)
-                        {
-                            if (item?.Connected ?? false) item.Shutdown(SocketShutdown.Both);
-                            item?.Close();
-                        }
-                    }
-                }
-                catch (SocketException ex)
-                {
-                    if (ex.SocketErrorCode != SocketError.Interrupted)
-                        throw ex;
-                }
-
-            }
-        }
-
-        /// <summary>
-        /// 接收客户端发送的消息
-        /// </summary>
-        /// <param name="newSocket"></param>
-        void Receive(Socket newSocket)
-        {
-            while (newSocket.Connected)
-            {
-                try
-                {
-                    byte[] requetData1 = new byte[4];
-                    //读取客户端发送过来的数据                   
-                    requetData1 = SocketRead(newSocket, requetData1.Length);
-                    byte[] requetData2 = new byte[requetData1[2] * 256 + requetData1[3] - 4];
-                    requetData2 = SocketRead(newSocket, requetData2.Length);
-                    var requetData = requetData1.Concat(requetData2).ToArray();
-
-                    //如果是连接的时候发送的两次初始化指令 则直接跳过
-                    if (requetData[3] == SiemensConstant.Command1_200Smart.Length || requetData[3] == SiemensConstant.Command2_200Smart.Length)
-                    {
-                        newSocket.Send(requetData);
-                        continue;
-                    }
-
-                    switch (requetData[17])
-                    {
-                        //读
-                        case 4:
-                            {
-                                //数据块个数
-                                var dbNumber = requetData[18];
-                                //读取数据总长度
-                                var readLength = 0;
-
-                                for (int i = 0; i < dbNumber; i++)
-                                {
-                                    //访问数据的个数,以byte为单位
-                                    var byteLength = requetData[23 + i * 12] * 256 + requetData[24 + i * 12];
-                                    if (byteLength == 1 && i < dbNumber - 1)//非最后一个bit/byte,需要补全。
-                                        byteLength += 1;
-                                    readLength += byteLength;
-                                }
-
-                                var dataContent = new byte[4 * dbNumber + readLength];//数据报文总长度
-                                var cursor = 0;
-                                for (int i = 0; i < dbNumber; i++)
-                                {
-                                    //DB块的偏移量
-                                    var beginAddress = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12];
-                                    //访问数据的个数
-                                    var byteLength = requetData[23 + i * 12] * 256 + requetData[24 + i * 12];
-                                    if (byteLength == 1 && i < dbNumber - 1)//非最后一个bit/byte,需要补全。
-                                        byteLength += 1;
-                                    //是否是bit类型
-                                    var isBit = requetData[22 + i * 12] == 0x01;
-                                    //访问数据块的类型(V、I、DB...)
-                                    var dbType = requetData[27 + i * 12];
-                                    var dataKey = $"s200-{dbType}";
-                                    var dataValue = dataPersist.Read(dataKey);
-                                    var byteArray = JsonConvert.DeserializeObject<byte[]>(dataValue) ?? new byte[65536];
-
-                                    //DataConvert.StringToByteArray("FF 09 00 04").CopyTo(dataContent, cursor);
-                                    dataContent[0 + cursor] = 0xFF;
-                                    //dataContent[1 + cursor] = readLength == 1 ? (byte)0x03 : (byte)0x04;//04 byte(字节) 03bit(位)
-                                    dataContent[1 + cursor] = isBit ? (byte)0x03 : (byte)0x04;//04 byte(字节) 03bit(位)
-                                    dataContent[2 + cursor] = (byte)(byteLength / 256);//后半截数据数的Length
-                                    dataContent[3 + cursor] = (byte)(byteLength % 256);//后半截数据数的Length
-                                    if (isBit)//按bit
-                                    {
-                                        var bitOffset = beginAddress % 8;
-                                        byte bitOffsetValue = (byte)Math.Pow(2, bitOffset);
-                                        var oldBitValue = byteArray[beginAddress / 8];
-                                        //转成bit的形式所需的返回值
-                                        var bitValue = (oldBitValue & bitOffsetValue) != 0 ? 0x01 : 0x00;
-                                        //[4 + cursor]返回给客户端的数据
-                                        new byte[] { (byte)bitValue }.CopyTo(dataContent, 4 + cursor);
-                                    }
-                                    else
-                                        //[4 + cursor]返回给客户端的数据
-                                        Buffer.BlockCopy(byteArray, beginAddress / 8, dataContent, 4 + cursor, byteLength);
-
-                                    cursor += 4 + byteLength;
-                                }
-
-                                byte[] responseData = new byte[21 + dataContent.Length];
-                                DataConvert.StringToByteArray("03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 00 00 00 04 01").CopyTo(responseData, 0);
-                                responseData[8] = 0x03;//1  客户端发送命令 3 服务器回复命令 
-                                responseData[2] = (byte)(responseData.Length / 256);//返回数据长度
-                                responseData[3] = (byte)(responseData.Length % 256);
-                                responseData[15] = (byte)(requetData.Length / 256);//读取数据长度
-                                responseData[16] = (byte)(requetData.Length % 256);
-                                responseData[20] = requetData[18];//读取数据块个数
-                                dataContent.CopyTo(responseData, 21);
-                                newSocket.Send(responseData);
-                            }
-                            break;
-                        //写
-                        case 5:
-                            {
-                                var writesLength = requetData[18];//写如数据的个数 Item count
-                                int cursor = 0;
-                                for (int i = 0; i < writesLength; i++)
-                                {
-                                    //DB块的偏移量(存储数据的地址)
-                                    var beginAddress = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12];
-                                    //访问数据块的类型(V、I、DB...)
-                                    var dbType = requetData[27 + i * 12];
-                                    var dataKey = $"s200-{dbType}";
-
-                                    //Data之前的下标
-                                    var dataBeforeIndex = 18 + writesLength * 12;
-                                    //[2 + index]是否是bit类型
-                                    var isBit = requetData[dataBeforeIndex + 4 * (i + 1) - 2 + cursor] == 0x03;
-                                    var coefficient = isBit ? 1 : 8;
-                                    //初始化要写入的字节数组长度
-                                    var writeValue = new byte[requetData[dataBeforeIndex + 4 * (i + 1) + cursor] / coefficient];
-                                    //开始写入的地址(报文中的数据的位置)
-                                    var requetBeginLocation = dataBeforeIndex + 4 * (i + 1) + cursor + 1;
-
-                                    //非最后一个bit,需要补全。
-                                    if (writeValue.Length == 1 && i < writesLength - 1)
-                                        cursor++;
-                                    cursor += writeValue.Length;
-                                    //数据赋值到writeValue中
-                                    Buffer.BlockCopy(requetData, requetBeginLocation, writeValue, 0, writeValue.Length);
-
-                                    var byteArray = JsonConvert.DeserializeObject<byte[]>(dataPersist.Read(dataKey)) ?? new byte[65536];
-                                    if (isBit)
-                                    {
-                                        var oldBitValue = byteArray[beginAddress / 8];
-                                        var bitOffset = beginAddress % 8;
-                                        byte bitOffsetValue = (byte)Math.Pow(2, bitOffset);
-                                        if (writeValue[0] == 0x01)//true
-                                            oldBitValue = (byte)(oldBitValue | bitOffsetValue);//组合bitOffsetValue
-                                        else//false
-                                            oldBitValue = (byte)(oldBitValue & ~bitOffsetValue);//去掉bitOffsetValue
-                                        new byte[] { oldBitValue }.CopyTo(byteArray, beginAddress / 8);
-                                    }
-                                    else
-                                        writeValue.CopyTo(byteArray, beginAddress / 8);
-
-                                    //存储字节数据到内存
-                                    dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray));
-                                }
-
-                                byte[] responseData1 = new byte[22];
-                                DataConvert.StringToByteArray("03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF").CopyTo(responseData1, 0);
-                                newSocket.Send(responseData1);
-                            }
-                            break;
-                    }
-                }
-                catch { }
-            }
-        }
-    }
-}
-

+ 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.65" />
+	<PackageReference Include="YSAI.Core" Version="1.0.0.66" />
   </ItemGroup>
 
   <ItemGroup>

+ 124 - 5
src/YSAI.DAQ/YSAI.Unility/ByteTool.cs

@@ -1,4 +1,5 @@
-using System.Net;
+using System.Collections;
+using System.Net;
 using System.Text;
 
 namespace YSAI.Unility
@@ -470,13 +471,131 @@ namespace YSAI.Unility
         /// <returns></returns>
         public static string ByteArrayToHexString(byte[] data)
         {
-            StringBuilder sb = new StringBuilder(data.Length * 3);
-            foreach (byte b in data)
+            return string.Join(" ", data.Select(t => t.ToString("X2")));
+        }
+
+        /// <summary>
+        /// 字节数组转16进制字符
+        /// </summary>
+        /// <param name="byteArray"></param>
+        /// <returns></returns>
+        public static string ByteArrayToString(this byte[] byteArray)
+        {
+            return string.Join(" ", byteArray.Select(t => t.ToString("X2")));
+        }
+
+        /// <summary>
+        /// 16进制字符串转字节数组
+        /// </summary>
+        /// <param name="str"></param>
+        /// <param name="strict">严格模式(严格按两个字母间隔一个空格)</param>
+        /// <returns></returns>
+        public static byte[] StringToByteArray(this string str, bool strict = true)
+        {
+            if (string.IsNullOrWhiteSpace(str) || str.Trim().Replace(" ", "").Length % 2 != 0)
+                throw new ArgumentException("请传入有效的参数");
+
+            if (strict)
+            {
+                return str.Split(' ').Where(t => t?.Length == 2).Select(t => Convert.ToByte(t, 16)).ToArray();
+            }
+            else
             {
-                sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
+                str = str.Trim().Replace(" ", "");
+                var list = new List<byte>();
+                for (int i = 0; i < str.Length; i++)
+                {
+                    var string16 = str[i].ToString() + str[++i].ToString();
+                    list.Add(Convert.ToByte(string16, 16));
+                }
+                return list.ToArray();
             }
+        }
 
-            return sb.ToString().ToUpper();
+        /// <summary>
+        /// Asciis字符串数组字符串装字节数组
+        /// </summary>
+        /// <param name="str"></param>
+        /// <param name="strict"></param>
+        /// <returns></returns>
+        public static byte[] AsciiStringToByteArray(this string str, bool strict = true)
+        {
+            if (string.IsNullOrWhiteSpace(str) || str.Trim().Replace(" ", "").Length % 2 != 0)
+                throw new ArgumentException("请传入有效的参数");
+
+            if (strict)
+            {
+                List<string> stringList = new List<string>();
+                foreach (var item in str.Split(' '))
+                {
+                    stringList.Add(((char)Convert.ToByte(item, 16)).ToString());
+                }
+                return string.Join("", stringList).StringToByteArray(false);
+            }
+            else
+            {
+                str = str.Trim().Replace(" ", "");
+                var stringList = new List<string>();
+                for (int i = 0; i < str.Length; i++)
+                {
+                    var stringAscii = str[i].ToString() + str[++i].ToString();
+                    stringList.Add(((char)Convert.ToByte(stringAscii, 16)).ToString());
+                }
+                return string.Join("", stringList).StringToByteArray(false);
+            }
+        }
+
+        /// <summary>
+        /// Asciis数组字符串装字节数组
+        /// 如:30 31 =》 00 01
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static byte[] AsciiArrayToByteArray(this byte[] str)
+        {
+            if (!str?.Any() ?? true)
+                throw new ArgumentException("请传入有效的参数");
+
+            List<string> stringList = new List<string>();
+            foreach (var item in str)
+            {
+                stringList.Add(((char)item).ToString());
+            }
+            return string.Join("", stringList).StringToByteArray(false);
+        }
+
+        /// <summary>
+        /// 字节数组转换成Ascii字节数组
+        /// 如:00 01 => 30 31
+        /// </summary>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        public static byte[] ByteArrayToAsciiArray(this byte[] str)
+        {
+            return Encoding.ASCII.GetBytes(string.Join("", str.Select(t => t.ToString("X2"))));
+        }
+
+        /// <summary>
+        /// Int转二进制
+        /// </summary>
+        /// <param name="value"></param>
+        /// <param name="minLength">补0长度</param>
+        /// <returns></returns>
+        public static string IntToBinaryArray(this int value, int minLength = 0)
+        {
+            //Convert.ToString(12,2); // 将12转为2进制字符串,结果 “1100”
+            return Convert.ToString(value, 2).PadLeft(minLength, '0');
+        }
+
+        /// <summary>
+        /// 二进制转Int
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public static int BinaryArrayToInt(this string value)
+        {
+            //Convert.ToInt("1100",2); // 将2进制字符串转为整数,结果 12
+            return Convert.ToInt32(value, 2);
         }
 
         /// <summary>

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

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