You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

453 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
/// <summary>
/// 数据有效时间。单位秒
/// </summary>
static int DataTimeSeconds = 20;
/// <summary>
/// 数据刷新时间
/// </summary>
public static DateTime DataValidityTime = DateTime.Now;
public static void Init()
{
if (PlcClient == null)
{
PlcClient = AppInfo.Container.Resolve<PlcClient>();
}
Task.Run(() => PlcClient.Connect());
}
/// <summary>
/// 写入口灯
/// 红灯1020
/// 绿灯1000
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool WriteEntranceLamp(ushort value)
{
if (PlcClient != null)
{
HostToPlcData.LightIn.Value = value;
return PlcClient.WriteValue(HostToPlcData.LightIn);
}
return false;
}
/// <summary>
/// 拍照准备
/// </summary>
/// <returns></returns>
public static bool PhotoPreparation()
{
if (PlcClient != null)
{
HostToPlcData.PhotoPreparation.Value = 1000;
return PlcClient.WriteValue(HostToPlcData.PhotoPreparation);
}
return false;
}
/// <summary>
/// 车辆在拍照位
/// </summary>
/// <returns></returns>
public static bool TakePhoto()
{
if (PlcClient != null)
{
HostToPlcData.StartPhoto.Value = 1000;
return PlcClient.WriteValue(HostToPlcData.StartPhoto);
}
return false;
}
/// <summary>
/// 拍照
/// </summary>
/// <returns></returns>
public static bool CarInPhotoPosition()
{
if (PlcClient != null)
{
return PlcToHostData.CarInPhotoPosition.Value == 1000;
}
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;
}
/// <summary>
/// 是否远程模式
/// </summary>
/// <returns></returns>
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;
}
}
/// <summary>
/// 入口雷达检测
/// </summary>
/// <returns></returns>
public static bool EntranceRadar()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.RadarStatesIn.Value == 1000 ? true : false;
}
else
{
return false;
}
}
/// <summary>
/// 出口雷达检测
/// </summary>
/// <returns></returns>
public static bool ExitRadar()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.RadarStatesOut.Value == 1000 ? true : false;
}
else
{
return false;
}
}
/// <summary>
/// 写出口灯
/// 红灯1020
/// 绿灯1000
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 下发选包
/// </summary>
/// <param name="inBinNo">入仓位,仓位号</param>
/// <param name="outBinNo">出仓位,仓位号</param>
/// <returns></returns>
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;
}
/// <para>0.无任务 (不允许换电)</para>
/// <para>1.换电任务</para>
/// <para>2.移舱任务</para>
/// <para>3.移出任务</para>
/// <para>4.移入任务</para>
/// <para>5.消防任务</para>
public static bool ReadTaskStatus(ushort taskNo)
{
if (PlcClient != null)
{
ResetPlc();
switch (taskNo)
{
case 1:
if (PlcToHostData.StatusPowerChangeProcess.Value != 0 &&
PlcToHostData.StatusPowerChangeProcess.Value != 1000)
{
return true;
}
return false;
case 2:
return PlcToHostData.MovingCondition.Value == 1001;
case 5:
return PlcToHostData.FireFightingTaskStatus.Value == 1000;
default:
return false;
}
}
return false;
}
public static bool ReadSwapReady()
{
return PlcToHostData.WhetherAllowPowerChange.Value == 1010;
}
/// <summary>
/// plc上使能 1换电2移仓3消防
/// </summary>
/// <returns></returns>
public static bool HoldOn(int taskType)
{
HostToPlc writeHostToPlc = new HostToPlc();
switch (taskType)
{
case 1:
writeHostToPlc.StartTaskSwap.Value = 1000;
return PlcClient.WriteValue(writeHostToPlc.StartTaskSwap);
case 2:
writeHostToPlc.StartTaskMove.Value = 1000;
return PlcClient.WriteValue(writeHostToPlc.StartTaskMove);
case 3:
writeHostToPlc.StartTaskFire.Value = 1000;
return PlcClient.WriteValue(writeHostToPlc.StartTaskFire);
default:
return false;
}
}
/// <summary>
/// 下发任务 plc 需要一起下发
/// </summary>
/// <returns></returns>
public static bool DistributeTask(ushort inBinNo, ushort outBinNo, ushort taskNo)
{
DistributeTask distributeTask = new()
{
InBinNo = inBinNo,
OutBinNo = outBinNo,
};
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;4", encode);
return operateResult.IsSuccess;
}
/// <summary>
/// 查看拍照状态
/// </summary>
/// <returns></returns>
public static ushort ChannelStatus()
{
if (PlcClient != null)
{
return PlcToHostData.ChannelLocationState.Value;
}
return 0;
}
/// <summary>
/// 行车回归安全位置
/// </summary>
/// <returns></returns>
public static bool PlcCarInit()
{
if (PlcClient != null)
{
HostToPlcData.Regression.Value = 1000;
return PlcClient.WriteValue(HostToPlcData.Regression);
}
return false;
}
/// <summary>
/// 重新读
/// </summary>
public static void ResetPlc()
{
PlcClient.Reset();
}
/// <summary>
/// 读取换电任务状态
/// </summary>
/// <returns></returns>
public static int ReadSwapStatus()
{
if (PlcClient != null)
{
return PlcToHostData.StatusPowerChangeProcess.Value;
}
return (-1);
}
/// <summary>
/// 读取消防任务状态
/// </summary>
/// <returns></returns>
public static int ReadFireStatus()
{
if (PlcClient != null)
{
return PlcToHostData.FireFightingTaskStatus.Value;
}
return (-1);
}
/// <summary>
/// 读取移仓任务状态
/// </summary>
/// <returns></returns>
public static int ReadMoveStatus()
{
if (PlcClient != null)
{
return PlcToHostData.MovingCondition.Value;
}
return (-1);
}
/// <summary>
/// 灯光控制:全部打开
/// </summary>
/// <returns></returns>
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 bool ZPushUp()
{
if (PlcClient != null)
{
HostToPlcData.BatteryUnlockedState.Value = 1000;
return PlcClient.WriteValue(HostToPlcData.BatteryUnlockedState);
}
return false;
}
/// <summary>
/// 获取当前灯光状态
/// </summary>
/// <returns></returns>
public static ushort GetNowLightsOn()
{
if (PlcClient != null)
{
return PlcToHostData.LightStatus.Value;
}
return default;
}
/// <summary>
/// 灯光控制:全部关闭
/// </summary>
/// <returns></returns>
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;
}
}