hutongqing
2024-10-15 0d07b90fd906e52ce486484aa53a6850983b1325
WIDESEAWCS_Server/WIDESEAWCS_Communicator/Siemens/SiemensS7Communicator.cs
@@ -27,6 +27,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@@ -38,7 +39,7 @@
    /// 西门子S7通讯类
    /// </summary>
    [Description("西门子S7")]
    public class SiemensS7 : BaseCommunicator, IDisposable
    public class SiemensS7 : BaseCommunicator
    {
        #region Private Member
        /// <summary>
@@ -67,6 +68,8 @@
        private string _name;
        private ILogNet _logNet;
        private bool _isPing = true;
        #endregion Private Member
        #region Public Member
@@ -89,10 +92,11 @@
        /// </summary>
        /// <param name="ipAddress">设备的IP地址</param>
        /// <param name="port">连接使用的端口号</param>
        /// <param name="name">设备名称</param>
        public SiemensS7(string ipAddress, int port, string name)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + $"Log_PLCReadWrite\\{name}";
            _logNet = new LogNetFileSize(path, 3 * 1024 * 1024, 100);
            _logNet = new LogNetFileSize(path, 10 * 1024 * 1024, 100);
            bool ipCheck = IPAddress.TryParse(ipAddress, out IPAddress? address);
            if (!ipCheck)
@@ -272,6 +276,29 @@
                throw new CommunicationException($"读取数据异常,错误信息:{ex.Message}", CommunicationErrorType.ReadException, innerException: ex);
            }
        }
        private void Ping()
        {
            Task.Run(() =>
            {
                while (_isPing)
                {
                    try
                    {
                        IPStatus status = plc.IpAddressPing();
                        if (status == IPStatus.Success)
                            _connected = true;
                        else
                            _connected = false;
                    }
                    finally
                    {
                        Thread.Sleep(100);
                    }
                }
            });
        }
        #endregion
        #region Public Method
@@ -284,6 +311,7 @@
        {
            try
            {
                //实例化一个西门子的S7协议的通讯对象
                plc = new SiemensS7Net(SiemensPLCS.S1500)
                {
@@ -297,7 +325,7 @@
                    LogNet.WriteInfo(Name, string.Format(CommunicationInfoMessage.ConnectSuccess, _ipAddress, _port));
                else
                    LogNet.WriteError(Name, string.Format(CommunicationExceptionMessage.ConnectFaild, _ipAddress, _port, operateResult.Message));
                Ping();
                return operateResult.IsSuccess;
            }
            catch (Exception ex)
@@ -625,9 +653,11 @@
        #endregion
        // 显式实现IDisposable接口以提供垃圾回收时的清理  
        public void Dispose()
        public override void Dispose()
        {
            _isPing = false;
            Disconnect();
            plc.Dispose();
            GC.SuppressFinalize(this);
        }