using Autofac; using HslCommunication; using HybirdFrameworkCore.Autofac; using HybirdFrameworkCore.Utils; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using Repository.Station; using Service.Execute.Model; using Service.Plc.Msg; namespace Service.Plc.Client; public class PlcMgr { public static PlcClient? PlcClient; public static readonly HostToPlc HostToPlcData = new HostToPlc(); public static readonly PlcToHost PlcToHostData = new PlcToHost(); public static PlcFault LastPlcFaultData = new PlcFault(); public static readonly PlcFault PlcFaultData = new PlcFault(); public /// /// 数据有效时间。单位秒 /// static int DataTimeSeconds = 20; /// /// 数据刷新时间 /// public static DateTime DataValidityTime = DateTime.Now; public static void Init() { if (PlcClient == null) { PlcClient = AppInfo.Container.Resolve(); } Task.Run(() => PlcClient.Connect()); } /// /// 写入口灯 /// 红灯:1020 /// 绿灯:1000 /// /// /// public static bool WriteEntranceLamp(ushort value) { if (PlcClient != null) { HostToPlcData.LightIn.Value = value; return PlcClient.WriteValue(HostToPlcData.LightIn); } return false; } public static bool AirBlowerControl(ushort value) { if (PlcClient != null) { HostToPlcData.ExhaustFanControl.Value = value; return PlcClient.WriteValue(HostToPlcData.ExhaustFanControl); } return false; } public static ushort BlowerStatus() { if (PlcClient != null) { return PlcToHostData.ExhaustFanStatus.Value; } return 0; } /// /// 是否远程模式 /// /// public static bool IsRemote() { if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) { return PlcToHostData.RemoteLocalControlState.Value == 1010; } else { return false; } } public static bool IsAuto() { if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) { return PlcToHostData.ModeControl.Value == 1010; } else { return false; } } /// /// 入口雷达检测 /// /// public static bool EntranceRadar() { if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) { return PlcToHostData.RadarStatesIn.Value == 1000 ? true : false; } else { return false; } } /// /// 出口雷达检测 /// /// public static bool ExitRadar() { if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) { return PlcToHostData.RadarStatesOut.Value == 1000 ? true : false; } else { return false; } } /// /// 写出口灯 /// 红灯:1020 /// 绿灯:1000 /// /// /// public static bool WriteExistLamp(int data) { if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.LightOut.Value = (ushort)data; return PlcClient.WriteValue(writeHostToPlc.LightOut); } return false; } /// /// 下发选包 /// /// 入仓位,仓位号 /// 出仓位,仓位号 /// public static bool DistributeBinNo(string inBinNo, string outBinNo) { if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.EntrySelection.Value = Convert.ToUInt16(inBinNo); writeHostToPlc.ExitSelection.Value = Convert.ToUInt16(outBinNo); bool write1 = PlcClient.WriteValue(writeHostToPlc.EntrySelection); bool write2 = PlcClient.WriteValue(writeHostToPlc.ExitSelection); return write1 && write2; } return false; } public static bool ReadTaskStatus(ushort taskNo) { if (PlcClient != null) { ResetPlc(); return PlcToHostData.TaskType.Value == taskNo; } return false; } /// /// plc上使能 /// /// public static bool HoldOn() { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.TaskEnablement.Value = 1000; return PlcClient.WriteValue(writeHostToPlc.TaskEnablement); } /// /// 下发任务 plc 需要一起下发 /// /// public static bool DistributeTask(ushort inBinNo, ushort outBinNo, ushort taskNo) { DistributeTask distributeTask = new() { TaskNo = taskNo, InBinNo = inBinNo, OutBinNo = outBinNo, BatteryPackType = 0, }; byte[] encode = ModelConvert.Encode(distributeTask); //TODO::現在手動處理encode for (int i = 0; i < encode.Length; i++) { if (i % 2 == 0) { var temp = encode[i + 1]; encode[i + 1] = encode[i]; encode[i] = temp; } } //需要将数据转换成byte数组 OperateResult operateResult = PlcClient.Write("x=16;111", encode); return operateResult.IsSuccess; } /// /// 下发换电任务以外的任务 6:调库 7:消防 /// /// 入仓位 /// 出仓位 /// 任务类型 /// public static bool StartSwapping(ushort inBinNo, ushort outBinNo, ushort taskNo) { if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.TaskType.Value = taskNo; writeHostToPlc.EntrySelection2.Value = inBinNo; writeHostToPlc.ExitSelection2.Value = outBinNo; //writeHostToPlc.TaskEnablement.Value = (ushort)1000; bool write1 = PlcClient.WriteValue(writeHostToPlc.TaskType); //bool write2 = PlcClient.WriteValue(writeHostToPlc.TaskEnablement); return write1; } return false; } static bool heart = false; private static BinInfoRepository BinInfoRepository = AppInfo.Container.Resolve(); /// /// 查看拍照状态 /// /// 位置 1:左侧 2:右侧 /// public static ushort ChannelStatus(int location) { if (PlcClient != null) { if (location==1) { return PlcToHostData.ChannelLocationState2.Value; } else { return PlcToHostData.ChannelLocationState.Value; } } return 0; } /// /// 重新读 /// public static void ResetPlc() { PlcClient.Reset(); } /// /// 读plc任务状态 /// /// 6未连接 public static int ReadPlcTaskStatus() { if (PlcClient != null) { return PlcToHostData.TaskStates.Value; } return (-1); } /// /// 灯光控制:全部打开 /// /// public static bool AllLightsOn() { bool bResult = false; if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.LightingControl.Value = 1000; bResult = PlcClient.WriteValue(writeHostToPlc.LightingControl); } return bResult; } /// /// 获取当前灯光状态 /// /// public static ushort GetNowLightsOn() { if (PlcClient != null) { return PlcToHostData.LightStatus.Value; } return default; } /// /// 灯光控制:全部关闭 /// /// public static bool AllLightsOff() { bool bResult = false; if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.LightingControl.Value = 1010; bResult = PlcClient.WriteValue(writeHostToPlc.LightingControl); } return bResult; } /// /// 写电池包锁止状态 /// /// public static bool WriteStopCommand(ushort lockStatus) { bool bResult = false; if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.StopCommand.Value = lockStatus; bResult = PlcClient.WriteValue(writeHostToPlc.StopCommand); } return bResult; } /// /// 下发车辆驻车状态 /// /// /// public static bool WriteVehicleParkingStatus(ushort vehicleParkingStatus) { bool bResult = false; if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.VehicleParkingStatus.Value = vehicleParkingStatus; bResult = PlcClient.WriteValue(writeHostToPlc.VehicleParkingStatus); } return bResult; } /// /// 控制卷帘门 /// 0:无操作 ///1000:请求开启 ///1010:请求关闭 /// /// /// public static bool WriteRollerShutter(ushort pollerShutter) { bool bResult = false; if (PlcClient != null) { HostToPlc writeHostToPlc = new HostToPlc(); writeHostToPlc.RollerShutter.Value = pollerShutter; bResult = PlcClient.WriteValue(writeHostToPlc.RollerShutter); } return bResult; } /// /// 卷帘门是否开启 /// /// public static bool RollerShutterRadar() { if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) { return PlcToHostData.RollerShutter.Value == 1000 ? true : false; } else { return false; } } /// /// 实体按钮是否拍下 /// /// public static bool PhysicalButtonStateRadar() { if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) { return PlcToHostData.PhysicalButtonState.Value == 1000 ? true : false; } else { return false; } } }