PLCCoreExtension.cs 5.28 KB
using HaHRCS.Rcs.Model.Entities;
using HHECS.BllModel;
using HHECS.Communication;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace HaHRCS.Rcs.Executor.PLC
{
    /// <summary>
    /// PLC读写扩展类
    /// </summary>
    public static class PLCCoreExtension
    {
        public static event Action<EquipmentProp[], long, BllResult> ReadRecord;
        public static event Action<EquipmentProp[], long, BllResult> WriteRecord;
        //
        // 摘要:
        //     扩展单个读取
        //
        // 参数:
        //   equipmentCommunicationHub:
        //
        //   equipmentProp:
        public static BllResult Read(this EquipmentCommunicationHub equipmentCommunicationHub, EquipmentProp equipmentProp)
        {
            try
            {
                EquipmentCommunicationObj equipmentCommunicationObj = new EquipmentCommunicationObj
                {
                    IP = equipmentProp.Equipment.IP,
                    Address = equipmentProp.Address,
                    Value = equipmentProp.Value
                };
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Read(equipmentCommunicationObj);
                stopwatch.Stop();
                equipmentProp.Value = equipmentCommunicationObj.Value;
                ReadRecord?.Invoke(new EquipmentProp[1] { equipmentProp }, stopwatch.ElapsedMilliseconds, bllResult);
                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }
        public static BllResult Writes(this EquipmentCommunicationHub equipmentCommunicationHub, params EquipmentProp[] equipmentProps)
        {
            try
            {
                List<EquipmentCommunicationObj> list = equipmentProps.Select((EquipmentProp t) => new EquipmentCommunicationObj
                {
                    IP = t.Equipment.IP,
                    Address = t.Address,
                    Value = t.Value
                }).ToList();
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Writes(list.ToArray());
                if (!bllResult.Success)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        bllResult = equipmentCommunicationHub.Writes(list.ToArray());
                        if (bllResult.Success)
                        {
                            break;
                        }
                    }
                }

                stopwatch.Stop();
                WriteRecord?.Invoke(equipmentProps, stopwatch.ElapsedMilliseconds, bllResult);
                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }

        public static BllResult Reads(this EquipmentCommunicationHub equipmentCommunicationHub, params EquipmentProp[] equipmentProps)
        {
            try
            {
                List<EquipmentCommunicationObj> list = equipmentProps.Select((EquipmentProp t) => new EquipmentCommunicationObj
                {
                    IP = t.Equipment.IP,
                    Address = t.Address,
                    Value = t.Value
                }).ToList();
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Reads(list.ToArray());
                stopwatch.Stop();
                if (bllResult.Success)
                {
                    list.ForEach(delegate (EquipmentCommunicationObj t)
                    {
                        equipmentProps.First((EquipmentProp a) => a.Equipment.IP == t.IP && a.Address == t.Address).Value = t.Value;
                    });
                }

                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }


        public static BllResult Write(this EquipmentCommunicationHub equipmentCommunicationHub, EquipmentProp equipmentProp)
        {
            try
            {
                EquipmentCommunicationObj equipmentCommunicationObj = new EquipmentCommunicationObj
                {
                    IP = equipmentProp.Equipment.IP,
                    Address = equipmentProp.Address,
                    Value = equipmentProp.Value
                };
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Write(equipmentCommunicationObj);
                if (!bllResult.Success)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        bllResult = equipmentCommunicationHub.Write(equipmentCommunicationObj);
                        if (bllResult.Success)
                        {
                            break;
                        }
                    }
                }

                stopwatch.Stop();

                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }
    }
}