| | |
| | | using System.Collections.Concurrent; |
| | | using System.Collections.Concurrent; |
| | | using System.Linq; |
| | | using System.Net.NetworkInformation; |
| | | using HslCommunication; |
| | |
| | | } |
| | | |
| | | // 清空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); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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); |
| | |
| | | { |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | // 读取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(); |
| | |
| | | /// <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++; |