|
|
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;
|
|
|
}
|
|
|
} |