From 1d323f5377dd5f9a58d01954a6c12b9d5bd8a766 Mon Sep 17 00:00:00 2001
From: hwh <332078369@qq.com>
Date: 星期四, 05 九月 2024 14:33:40 +0800
Subject: [PATCH] 控制台位置实时通讯

---
 Admin.NET/WCS.Application/PLC/PLCUtil.cs |  178 +++++++++++++++++++++++++++++++---------------------------
 1 files changed, 95 insertions(+), 83 deletions(-)

diff --git a/Admin.NET/WCS.Application/PLC/PLCUtil.cs b/Admin.NET/WCS.Application/PLC/PLCUtil.cs
index 69442c6..481080c 100644
--- a/Admin.NET/WCS.Application/PLC/PLCUtil.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCUtil.cs
@@ -1,4 +1,5 @@
 锘縰sing DocumentFormat.OpenXml.Bibliography;
+using DocumentFormat.OpenXml.Drawing;
 using Elastic.Clients.Elasticsearch;
 using IoTClient;
 using IoTClient.Clients.Modbus;
@@ -11,19 +12,21 @@
 public class PLCUtil
 {
     public readonly long PlcId;
+    public readonly string PlcIP;
     private SiemensClient _client;
     private WcsPlc _modPlc;
-
+    private readonly object OLock = new object();
     public PLCUtil(WcsPlc modPlc)
     {
         PlcId = modPlc.Id;
+        PlcIP = modPlc.IP;
         _modPlc = modPlc;
         _client = new SiemensClient((SiemensVersion)modPlc.PLCType, modPlc.IP, modPlc.Port);
         _client.Open();
     }
-    public bool Connected()
+    public bool Connected
     {
-        return _client.Connected;
+        get { return _client.Connected; }
     }
     public IoTClient.Result Open()
     {
@@ -42,49 +45,55 @@
     /// <returns></returns>
     public (IoTClient.Result, dynamic value) GetPlcDBValue(PLCDataTypeEnum PosType, string DbNumber, string Pos)
     {
-        string address;
-        if (DbNumber.StartsWith("DB"))
-            address = DbNumber + "." + Pos;
-        else
-            address = DbNumber + Pos;
-        dynamic result = null;
-        switch (PosType)
+        lock (OLock)
         {
-            case PLCDataTypeEnum.Bit:
-                result = _client.ReadBoolean(address);
-                break;
-            case PLCDataTypeEnum.Byte:
-                result = _client.ReadByte(address);
-                break;
-            case PLCDataTypeEnum.Short:
-                result = _client.ReadInt16(address);
-                break;
-            case PLCDataTypeEnum.UShort:
-                result = _client.ReadUInt16(address);
-                break;
-            case PLCDataTypeEnum.Int:
-                result = _client.ReadInt32(address);
-                break;
-            case PLCDataTypeEnum.UInt:
-                result = _client.ReadUInt32(address);
-                break;
-            case PLCDataTypeEnum.Long:
-                result = _client.ReadInt64(address);
-                break;
-            case PLCDataTypeEnum.ULong:
-                result = _client.ReadUInt64(address);
-                break;
-            case PLCDataTypeEnum.Float:
-                result = _client.ReadFloat(address);
-                break;
-            case PLCDataTypeEnum.Double:
-                result = _client.ReadDouble(address);
-                break;
-            default:
-                result = new IoTClient.Result<object>();
-                break;
+            string address;
+            if (DbNumber.StartsWith("DB"))
+                address = DbNumber + "." + Pos;
+            else
+                address = DbNumber + Pos;
+            dynamic result = null;
+            switch (PosType)
+            {
+                case PLCDataTypeEnum.Bit:
+                    result = _client.ReadBoolean(address);
+                    break;
+                case PLCDataTypeEnum.Byte:
+                    result = _client.ReadByte(address);
+                    break;
+                case PLCDataTypeEnum.Short:
+                    result = _client.ReadInt16(address);
+                    break;
+                case PLCDataTypeEnum.UShort:
+                    result = _client.ReadUInt16(address);
+                    break;
+                case PLCDataTypeEnum.Int:
+                    result = _client.ReadInt32(address);
+                    break;
+                case PLCDataTypeEnum.UInt:
+                    result = _client.ReadUInt32(address);
+                    break;
+                case PLCDataTypeEnum.Long:
+                    result = _client.ReadInt64(address);
+                    break;
+                case PLCDataTypeEnum.ULong:
+                    result = _client.ReadUInt64(address);
+                    break;
+                case PLCDataTypeEnum.Float:
+                    result = _client.ReadFloat(address);
+                    break;
+                case PLCDataTypeEnum.Double:
+                    result = _client.ReadDouble(address);
+                    break;
+                case PLCDataTypeEnum.String:
+                    result = _client.ReadString(address);
+                    break;
+                default:
+                    result = new IoTClient.Result<object>();
+                    break;
+            }
+            return (result, result.Value);
         }
-        return (result, result.Value);
     }
     /// <summary>
     /// 鎵归噺璇诲彇PLC鍊�
@@ -92,49 +101,52 @@
     /// <returns></returns>
     public Result<Dictionary<string, object>> GetPlcBatchDBValue(Dictionary<string, PLCDataTypeEnum> listaddress)
     {
-        Dictionary<string, DataTypeEnum> addresses = new Dictionary<string, DataTypeEnum>();
-        foreach (var address in listaddress)
+        lock (OLock)
         {
-            switch (address.Value)
+            Dictionary<string, DataTypeEnum> addresses = new Dictionary<string, DataTypeEnum>();
+            foreach (var address in listaddress)
             {
-                case PLCDataTypeEnum.Bit:
-                    addresses.Add(address.Key, DataTypeEnum.Bool);
-                    break;
-                case PLCDataTypeEnum.Byte:
-                    addresses.Add(address.Key, DataTypeEnum.Byte);
-                    break;
-                case PLCDataTypeEnum.Short:
-                    addresses.Add(address.Key, DataTypeEnum.Int16);
-                    break;
-                case PLCDataTypeEnum.UShort:
-                    addresses.Add(address.Key, DataTypeEnum.UInt16);
-                    break;
-                case PLCDataTypeEnum.Int:
-                    addresses.Add(address.Key, DataTypeEnum.Int32);
-                    break;
-                case PLCDataTypeEnum.UInt:
-                    addresses.Add(address.Key, DataTypeEnum.UInt32);
-                    break;
-                case PLCDataTypeEnum.Long:
-                    addresses.Add(address.Key, DataTypeEnum.Int64);
-                    break;
-                case PLCDataTypeEnum.ULong:
-                    addresses.Add(address.Key, DataTypeEnum.UInt64);
-                    break;
-                case PLCDataTypeEnum.Float:
-                    addresses.Add(address.Key, DataTypeEnum.Float);
-                    break;
-                case PLCDataTypeEnum.Double:
-                    addresses.Add(address.Key, DataTypeEnum.Double);
-                    break;
-                case PLCDataTypeEnum.String:
-                    addresses.Add(address.Key, DataTypeEnum.String);
-                    break;
-                default:
-                    break;
+                switch (address.Value)
+                {
+                    case PLCDataTypeEnum.Bit:
+                        addresses.Add(address.Key, DataTypeEnum.Bool);
+                        break;
+                    case PLCDataTypeEnum.Byte:
+                        addresses.Add(address.Key, DataTypeEnum.Byte);
+                        break;
+                    case PLCDataTypeEnum.Short:
+                        addresses.Add(address.Key, DataTypeEnum.Int16);
+                        break;
+                    case PLCDataTypeEnum.UShort:
+                        addresses.Add(address.Key, DataTypeEnum.UInt16);
+                        break;
+                    case PLCDataTypeEnum.Int:
+                        addresses.Add(address.Key, DataTypeEnum.Int32);
+                        break;
+                    case PLCDataTypeEnum.UInt:
+                        addresses.Add(address.Key, DataTypeEnum.UInt32);
+                        break;
+                    case PLCDataTypeEnum.Long:
+                        addresses.Add(address.Key, DataTypeEnum.Int64);
+                        break;
+                    case PLCDataTypeEnum.ULong:
+                        addresses.Add(address.Key, DataTypeEnum.UInt64);
+                        break;
+                    case PLCDataTypeEnum.Float:
+                        addresses.Add(address.Key, DataTypeEnum.Float);
+                        break;
+                    case PLCDataTypeEnum.Double:
+                        addresses.Add(address.Key, DataTypeEnum.Double);
+                        break;
+                    case PLCDataTypeEnum.String:
+                        addresses.Add(address.Key, DataTypeEnum.String);
+                        break;
+                    default:
+                        break;
+                }
             }
+            return _client.BatchRead(addresses);
         }
-        return _client.BatchRead(addresses);
     }
     /// <summary>
     /// 鍐欏叆PLC鍊�

--
Gitblit v1.8.0