From 737dec3c384f394fd6f9849b4480b697d1ba35d5 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 17 三月 2026 09:16:44 +0800
Subject: [PATCH] chore: 提交所有当前改动

---
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Server/S7ServerInstance.cs |   52 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Server/S7ServerInstance.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Server/S7ServerInstance.cs
index 44e078b..59c6aa3 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Server/S7ServerInstance.cs
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Server/S7ServerInstance.cs
@@ -1,4 +1,4 @@
-using System.Collections.Concurrent;
+锘縰sing System.Collections.Concurrent;
 using System.Linq;
 using System.Net.NetworkInformation;
 using HslCommunication;
@@ -263,11 +263,11 @@
                     }
 
                     // 娓呯┖DB鍧�
-                    for (ushort db = 1; db <= Config.MemoryConfig.DBBlockCount; db++)
+                    foreach (var db in ResolveConfiguredDbNumbers())
                     {
                         for (int i = 0; i < 10; i++)
                         {
-                            _server.Write($"DB{db}.DBD{i}", (byte)0);
+                            _server.Write($"DB{db}.DBB{i}", (byte)0);
                         }
                     }
                 }
@@ -318,7 +318,7 @@
             try
             {
                 // 鏍规嵁閰嶇疆娣诲姞DB鍧�
-                for (ushort i = 1; i <= Config.MemoryConfig.DBBlockCount; i++)
+                foreach (var i in ResolveConfiguredDbNumbers())
                 {
                     _server.AddDbBlock(i, Config.MemoryConfig.DBBlockSize);
                     _logger.LogDebug("宸叉坊鍔燚B鍧�: DB{DbNumber}, 澶у皬: {Size}", i, Config.MemoryConfig.DBBlockSize);
@@ -377,14 +377,18 @@
                 {
                     var dbBytes = data["DB"];
                     int offset = 0;
-                    for (ushort db = 1; db <= Config.MemoryConfig.DBBlockCount; db++)
+                    foreach (var db in ResolveConfiguredDbNumbers())
                     {
-                        int blockSize = Math.Min(Config.MemoryConfig.DBBlockSize, dbBytes.Length - offset);
+                        int blockSize = Math.Min(Config.MemoryConfig.DBBlockSize, Math.Max(0, dbBytes.Length - offset));
                         for (int i = 0; i < blockSize; i++)
                         {
-                            _server.Write($"DB{db}.DBD{i}", dbBytes[offset + i]);
+                            _server.Write($"DB{db}.DBB{i}", dbBytes[offset + i]);
                         }
                         offset += Config.MemoryConfig.DBBlockSize;
+                        if (offset >= dbBytes.Length)
+                        {
+                            break;
+                        }
                     }
                 }
 
@@ -431,12 +435,22 @@
 
                 // 璇诲彇DB鍖�
                 var dbBytes = new List<byte>();
-                for (ushort db = 1; db <= Config.MemoryConfig.DBBlockCount; db++)
+                foreach (var db in ResolveConfiguredDbNumbers())
                 {
-                    var dbResult = _server.Read($"DB{db}.DBD0", (ushort)Config.MemoryConfig.DBBlockSize);
-                    if (dbResult.IsSuccess)
+                    var remaining = Config.MemoryConfig.DBBlockSize;
+                    var blockOffset = 0;
+                    while (remaining > 0)
                     {
+                        var chunkLen = Math.Min(ushort.MaxValue, remaining);
+                        var dbResult = _server.Read($"DB{db}.DBB{blockOffset}", (ushort)chunkLen);
+                        if (!dbResult.IsSuccess)
+                        {
+                            break;
+                        }
+
                         dbBytes.AddRange(dbResult.Content);
+                        blockOffset += chunkLen;
+                        remaining -= chunkLen;
                     }
                 }
                 data["DB"] = dbBytes.ToArray();
@@ -524,6 +538,24 @@
         /// <summary>
         /// 澧炲姞璇锋眰璁℃暟骞舵洿鏂版椿鍔ㄦ椂闂�
         /// </summary>
+        private IReadOnlyList<ushort> ResolveConfiguredDbNumbers()
+        {
+            if (Config.MemoryConfig.DBBlockNumbers != null && Config.MemoryConfig.DBBlockNumbers.Count > 0)
+            {
+                return Config.MemoryConfig.DBBlockNumbers
+                    .Where(x => x > 0 && x <= ushort.MaxValue)
+                    .Distinct()
+                    .OrderBy(x => x)
+                    .Select(x => (ushort)x)
+                    .ToList();
+            }
+
+            var count = Math.Max(1, Config.MemoryConfig.DBBlockCount);
+            return Enumerable.Range(1, count)
+                .Select(x => (ushort)x)
+                .ToList();
+        }
+
         private void IncrementRequestCount()
         {
             State.TotalRequests++;

--
Gitblit v1.9.3