wanshenmean
2026-03-17 737dec3c384f394fd6f9849b4480b697d1ba35d5
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Server/S7ServerInstance.cs
@@ -1,4 +1,4 @@
using System.Collections.Concurrent;
using 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("已添加DB块: 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++;