SiemensS7Communication.cs 10.4 KB
using DataAcquisitionServer.Common.Enums;
using DataAcquisitionServer.Common.Utils;
using DataAcquisitionServer.Models;
using HslCommunication;
using HslCommunication.Profinet.Siemens;
using System.Text;

namespace DataAcquisitionServer.Common.Communications
{
    /// <summary>
    /// 西门子通信
    /// </summary>
    public class SiemensS7Communication : ICommunication
    {
        public readonly SiemensS7Net Siemens = null!;
        private readonly SystemLog systemLog = SystemLog.Instance;

        public string IpAddress => Siemens.IpAddress;

        public int CommunicationId { get; set; }

        private SiemensS7Communication() { }

        public SiemensS7Communication(int communicationId, SiemensPLCS siemens, string ipAddress) : this()
        {
            CommunicationId = communicationId;
            Siemens = new SiemensS7Net(siemens, ipAddress);
            Siemens.SetPersistentConnection();
        }

        public OperateResult ConnectServer() => Siemens.ConnectServer();

        public OperateResult ConnectClose() => Siemens.ConnectClose();

        public void Read(IEnumerable<EquipmentProperty> equipmentProperties)
        {
            try
            {
                foreach (var item in equipmentProperties)
                {
                    switch (item.DataType)
                    {
                        case DataTypeConst.Bool:
                            var boolDataResult = Siemens.ReadBool(item.DataAddress);
                            if (!boolDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{boolDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = boolDataResult.Content.ToString();
                            break;
                        case DataTypeConst.Byte:
                            var byteDataResult = Siemens.ReadByte(item.DataAddress);
                            if (!byteDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{byteDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = byteDataResult.Content.ToString();
                            break;
                        case DataTypeConst.Int16:
                            var shortDataResult = Siemens.ReadInt16(item.DataAddress);
                            if (!shortDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{shortDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = shortDataResult.Content.ToString();
                            break;
                        case DataTypeConst.UInt16:
                            var ushortDataResult = Siemens.ReadUInt16(item.DataAddress);
                            if (!ushortDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{ushortDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = ushortDataResult.Content.ToString();
                            break;
                        case DataTypeConst.Int32:
                            var intDataResult = Siemens.ReadInt32(item.DataAddress);
                            if (!intDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{intDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = intDataResult.Content.ToString();
                            break;
                        case DataTypeConst.UInt32:
                            var uintDataResult = Siemens.ReadUInt32(item.DataAddress);
                            if (!uintDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{uintDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = uintDataResult.Content.ToString();
                            break;
                        case DataTypeConst.Int64:
                            var longDataResult = Siemens.ReadInt64(item.DataAddress);
                            if (!longDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{longDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = longDataResult.Content.ToString();
                            break;
                        case DataTypeConst.UInt64:
                            var ulongDataResult = Siemens.ReadUInt64(item.DataAddress);
                            if (!ulongDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{ulongDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = string.Empty;
                            break;
                        case DataTypeConst.Real:
                            var floatDataResult = Siemens.ReadFloat(item.DataAddress);
                            if (!floatDataResult.IsSuccess)
                            {
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{floatDataResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = floatDataResult.Content.ToString();
                            break;
                        //case "double":
                        //    var doubleDataResult = Siemens.ReadDouble(item.DataAddress);
                        //    if (!doubleDataResult.IsSuccess)
                        //    {
                        //        item.Value = string.Empty;
                        //        systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{doubleDataResult.Message}");
                        //        return;
                        //    }
                        //    item.Value = doubleDataResult.Content.ToString();
                        //    break;
                        case DataTypeConst.String:
                            var stringDataResult = Siemens.ReadString(item.DataAddress);
                            if (!stringDataResult.IsSuccess)
                            {
                                item.Value = string.Empty;
                                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}出现异常:{stringDataResult.Message}");
                                return;
                            }
                            item.Value = stringDataResult.Content.ToString();
                            break;
                        default:
                            systemLog.LogError($"读取PLC[{Siemens.IpAddress}]地址{item.DataAddress}失败:不支持“{item.DataType}”数据类型");
                            return;
                    }
                    item.UpdateTime = DateTime.Now;
                }
            }
            catch (Exception ex)
            {
                systemLog.LogError($"读取PLC[{Siemens.IpAddress}]数据出现异常:{ex.Message}");
            }
        }

        public void Read(EquipmentProperty equipmentProperty)
        {
            Read(new List<EquipmentProperty> { equipmentProperty });
        }

        public void Write(IEnumerable<EquipmentProperty> equipmentProperties)
        {
            try
            {
                var result = new OperateResult();
                foreach (var item in equipmentProperties)
                {
                    if (item.DataType == DataTypeConst.Bool)
                    {
                        _ = bool.TryParse(item.Value, out bool val);
                        result = Siemens.Write(item.DataAddress, val);
                    }
                    else if (item.DataType == DataTypeConst.Int16)
                    {
                        _ = ushort.TryParse(item.Value, out ushort val);
                        Siemens.Write(item.DataAddress, val);
                    }
                    else if (item.DataType == DataTypeConst.Real)
                    {
                        _ = float.TryParse(item.DataAddress, out var val);
                        Siemens.Write(item.DataAddress, val);
                    }
                    else
                    {
                        var bytes = Encoding.Default.GetBytes(item.Value);
                        result = Siemens.Write(item.DataAddress, bytes);
                    }
                    if (!result.IsSuccess)
                    {
                        systemLog.LogError($"写入PLC[{Siemens.IpAddress}]_{item.DataAddress}地址数据失败:{result.Message}");
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                systemLog.LogError($"写入PLC[{Siemens.IpAddress}]数据出现异常:{ex.Message}");
            }
        }

        public void Write(EquipmentProperty equipmentProperty)
        {
            Write(new List<EquipmentProperty> { equipmentProperty });
        }
    }
}