| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | 
							- using System.Collections.Concurrent;
 
- using System.Net.NetworkInformation;
 
- namespace WCS.Core;
 
- public class PLC : EntityEx<PLCInfo>
 
- {
 
-     public PLC(PLCInfo ent, World world) : base(ent)
 
-     {
 
-         if (Configs.PLCAccessorCreater != null) Accessor = Configs.PLCAccessorCreater.Create(ent);
 
-         else throw new Exception("Configs.PLCAccessorCreater未赋值");
 
-         IPDetection.AddIP(Entity.IP);
 
-     }
 
-     public bool Ping { get => IPDetection.GetIpStatus(Entity.IP); }
 
-     public IPLCAccessor Accessor { get; private set; }
 
- }
 
- public class IPDetection
 
- {
 
-     /// <summary>
 
-     ///  需要检测的IP组,使用线程安全的字典
 
-     /// </summary>
 
-     private static ConcurrentDictionary<string, bool> _ipDetection = new ConcurrentDictionary<string, bool>();
 
-     /// <summary>
 
-     ///  是否启动检测器
 
-     /// </summary>
 
-     private static bool isStart = false;
 
-     /// <summary>
 
-     /// 取消标记,用于停止检测任务
 
-     /// </summary>
 
-     private static CancellationTokenSource cancellationTokenSource;
 
-     /// <summary>
 
-     /// 添加IP进行检测
 
-     /// </summary>
 
-     /// <param name="ip"></param>
 
-     public static void AddIP(string ip)
 
-     {
 
-         if (!_ipDetection.ContainsKey(ip))
 
-         {
 
-             _ipDetection[ip] = false; // 默认为不在线
 
-         }
 
-         if (!isStart)
 
-         {
 
-             isStart = true;
 
-             Start();
 
-         }
 
-     }
 
-     /// <summary>
 
-     /// 获取指定IP的状态
 
-     /// </summary>
 
-     /// <param name="ip"></param>
 
-     /// <returns></returns>
 
-     public static bool GetIpStatus(string ip)
 
-     {
 
-         return _ipDetection.ContainsKey(ip) && _ipDetection[ip];
 
-     }
 
-     /// <summary>
 
-     /// 启动IP检测任务
 
-     /// </summary>
 
-     private static void Start()
 
-     {
 
-         cancellationTokenSource = new CancellationTokenSource();
 
-         Task.Run(async () =>
 
-         {
 
-             while (!cancellationTokenSource.Token.IsCancellationRequested)
 
-             {
 
-                 await CheckIpsAsync();
 
-                 await Task.Delay(1000); // 等待 1 秒
 
-             }
 
-         }, cancellationTokenSource.Token);
 
-     }
 
-     /// <summary>
 
-     /// 停止IP检测任务
 
-     /// </summary>
 
-     public static void Stop()
 
-     {
 
-         cancellationTokenSource?.Cancel();
 
-         isStart = false;
 
-     }
 
-     /// <summary>
 
-     /// 检测所有IP的状态
 
-     /// </summary>
 
-     /// <returns></returns>
 
-     private static async Task CheckIpsAsync()
 
-     {
 
-         var tasks = new List<Task>();
 
-         foreach (var ip in _ipDetection.Keys.ToList()) // 使用 ToList 防止遍历时修改字典
 
-         {
 
-             tasks.Add(Task.Run(async () =>
 
-             {
 
-                 bool isOnline = await PingAsync(ip);
 
-                 _ipDetection[ip] = isOnline;
 
-             }));
 
-         }
 
-         await Task.WhenAll(tasks);
 
-     }
 
-     /// <summary>
 
-     /// pingIp
 
-     /// </summary>
 
-     /// <param name="ip"></param>
 
-     /// <returns></returns>
 
-     private static async Task<bool> PingAsync(string ip)
 
-     {
 
-         try
 
-         {
 
-             if (ip == "1") return false;
 
-             Ping ping = new Ping();
 
-             PingReply reply = await ping.SendPingAsync(ip, 300); // 设置超时时间为300毫秒
 
-             return reply.Status == IPStatus.Success;
 
-         }
 
-         catch
 
-         {
 
-             // 如果出现异常,认为该IP不可用
 
-             return false;
 
-         }
 
-     }
 
- }
 
- public interface IPLCAccessorCreater
 
- {
 
-     IPLCAccessor Create(PLCInfo data);
 
- }
 
- public interface IPLCAccessor
 
- {
 
-     void WriteBytes(ushort db, ushort address, byte[] data);
 
-     byte[] ReadBytes(ushort db, ushort address, ushort length);
 
- }
 
 
  |