ModbusTcpCommunication.cs 10.2 KB
using DataAcquisition.Common.Enums;
using DataAcquisition.Common.Utils;
using DataAcquisition.Models;
using HslCommunication;
using HslCommunication.ModBus;

namespace DataAcquisition.Common.Communications
{
    public class ModbusTcpCommunication : ICommunication
    {
        public int CommunicationId { get; set; }

        public string IpAddress => client.IpAddress;

        private readonly ModbusTcpNet client = null!;

        private ModbusTcpCommunication() { }

        private SystemLog log = SystemLog.Instance;

        public ModbusTcpCommunication(int communicationId, string ipAddress, int port)
        {
            CommunicationId = communicationId;
            client = new ModbusTcpNet(ipAddress, port);
            client.SetPersistentConnection();
        }

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

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

        public void Read(IEnumerable<EquipmentProperty> equipmentProperties)
        {
            try
            {
                foreach (var item in equipmentProperties)
                {
                    switch (item.DataType)
                    {
                        case DataTypeConst.Float:
                            var realResult = client.ReadFloat(item.DataAddress);
                            if (!realResult.IsSuccess)
                            {
                                log.LogError($"读取PLC[{client.IpAddress}]地址{item.DataAddress}出现异常:{realResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = realResult.Content.ToString();
                            break;
                        case DataTypeConst.Bool:
                            var boolResult = client.ReadBool(item.DataAddress);
                            if (!boolResult.IsSuccess)
                            {
                                log.LogError($"读取PLC[{client.IpAddress}]地址{item.DataAddress}出现异常:{boolResult.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = boolResult.Content.ToString();
                            break;
                        case DataTypeConst.Byte:
                            break;
                        case DataTypeConst.Int16:
                            var int16Result = client.ReadInt16(item.DataAddress);
                            if (!int16Result.IsSuccess)
                            {
                                log.LogError($"读取PLC[{client.IpAddress}]地址{item.DataAddress}出现异常:{int16Result.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = int16Result.Content.ToString();
                            break;
                        case DataTypeConst.UInt16:
                            var uInt16Result = client.ReadInt16(item.DataAddress);
                            if (!uInt16Result.IsSuccess)
                            {
                                log.LogError($"读取PLC[{client.IpAddress}]地址{item.DataAddress}出现异常:{uInt16Result.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = uInt16Result.Content.ToString();
                            break;
                        case DataTypeConst.Int32:
                            var int32Result = client.ReadInt16(item.DataAddress);
                            if (!int32Result.IsSuccess)
                            {
                                log.LogError($"读取PLC[{client.IpAddress}]地址{item.DataAddress}出现异常:{int32Result.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = int32Result.Content.ToString();
                            break;
                        case DataTypeConst.UInt32:
                            var uInt32Result = client.ReadInt16(item.DataAddress);
                            if (!uInt32Result.IsSuccess)
                            {
                                log.LogError($"读取PLC[{client.IpAddress}]地址{item.DataAddress}出现异常:{uInt32Result.Message}");
                                item.Value = string.Empty;
                                return;
                            }
                            item.Value = uInt32Result.Content.ToString();
                            break;
                        case DataTypeConst.Int64:
                            break;
                        case DataTypeConst.UInt64:
                            break;
                        case DataTypeConst.String:
                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                log.LogError($"读取设备[{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)
                {
                    switch (item.DataType)
                    {
                        case DataTypeConst.Float:
                            _ = float.TryParse(item.Value, out var v1);
                            result = client.Write(item.DataAddress, v1);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.Bool:
                            _ = bool.TryParse(item.Value, out var v2);
                            result = client.Write(item.DataAddress, v2);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.Byte:
                            break;
                        case DataTypeConst.Int16:
                            _ = short.TryParse(item.Value, out var v3);
                            result = client.Write(item.DataAddress, v3);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.UInt16:
                            _ = ushort.TryParse(item.Value, out var v4);
                            result = client.Write(item.DataAddress, v4);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.Int32:
                            _ = int.TryParse(item.Value, out var v5);
                            result = client.Write(item.DataAddress, v5);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.UInt32:
                            _ = uint.TryParse(item.Value, out var v6);
                            result = client.Write(item.DataAddress, v6);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.Int64:
                            _ = long.TryParse(item.Value, out var v7);
                            result = client.Write(item.DataAddress, v7);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.UInt64:
                            _ = ulong.TryParse(item.Value, out var v8);
                            result = client.Write(item.DataAddress, v8);
                            if (!result.IsSuccess)
                            {
                                log.LogError($"写入设备[{IpAddress}]数据失败,{result.Message}");
                                return;
                            }
                            break;
                        case DataTypeConst.String:
                            break;
                        default:
                            break;
                    }
                }
                log.LogSuccess($"写入设备[{IpAddress}]数据成功,数量:{equipmentProperties.Count()}");
            }
            catch (Exception ex)
            {
                log.LogError($"写入设备[{IpAddress}]数据失败:{ex.Message}");
            }
        }

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