using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Mvc;
|
using System;
|
using System.Linq;
|
using System.Threading.Tasks;
|
using WIDESEA_Core.Utilities;
|
using WIDESEA_Entity.DomainModels;
|
using WIDESEA_WCS;
|
|
namespace WIDESEA_WCSServer.Controllers.ToWMS
|
{
|
[Route("api/ToWMS")]
|
[ApiController]
|
public class ToWMSController : ControllerBase
|
{
|
/// <summary>
|
/// 添加agv任务
|
/// </summary>
|
/// <param name="taskinfo"></param>
|
/// <returns></returns>
|
//[HttpPost, Route("AddAgvTask"), AllowAnonymous]
|
//public WebResponseContent AddAgvTask([FromBody] dt_agvtask task)
|
//{
|
// return new WCSHelpServer().AddAgvTask(task);
|
//}
|
|
/// <summary>
|
/// WMS修改设备状态调用接口同步WCS设备状态并暂停调度
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
[HttpPost, HttpGet, Route("UpdateEquipState"), AllowAnonymous]
|
public async Task<WebResponseContent> UpdateEquipState([FromBody] SaveModel saveModel)
|
{
|
return await Task.Run(() =>
|
{
|
return WCSService.PauseOrResumeJob(saveModel);
|
});
|
}
|
|
[HttpPost, Route("WriteOrReadPLCData"), AllowAnonymous]
|
public object WriteOrReadPLCData([FromBody] PLCInfo info)
|
{
|
try
|
{
|
var client = WIDESEA_WCS.WCSService.Clients?.FirstOrDefault(t => t.PLCName == info.plcName);
|
if (client == null)
|
{
|
throw new Exception("plcName不存在或未连接!");
|
}
|
if (info.type == "r")
|
{
|
if (client.PLCType == "SiemensPLC")
|
{
|
if (info.dataType == "int")
|
{
|
info.value = client.SiemensPLCClient.Read<ushort>(info.address);
|
}
|
else if (info.dataType == "string")
|
{
|
info.value = client.SiemensPLCClient.Read<string>(info.address, info.len);
|
}
|
else if (info.dataType == "bool")
|
{
|
info.value = client.SiemensPLCClient.Read<bool>(info.address);
|
}
|
else if (info.dataType == "byte[]")
|
{
|
info.value = string.Join(',', client.SiemensPLCClient.Read<byte[]>(info.address, info.len).ToArray());
|
}
|
else
|
{
|
throw new Exception($"数据类型{info.dataType},未定义");
|
}
|
}
|
else if (client.PLCType == "OmronPLC")
|
{
|
if (info.dataType == "int")
|
{
|
info.value = client.SiemensPLCClient.Read<ushort>(info.address);
|
}
|
else if (info.dataType == "string")
|
{
|
info.value = client.SiemensPLCClient.Read<string>(info.address, info.len);
|
}
|
else if (info.dataType == "bool")
|
{
|
info.value = client.SiemensPLCClient.Read<bool>(info.address);
|
}
|
else if (info.dataType == "byte[]")
|
{
|
info.value = string.Join(',', client.SiemensPLCClient.Read<byte[]>(info.address, info.len).ToArray());
|
}
|
else
|
{
|
throw new Exception($"操作类型{info.dataType},未定义");
|
}
|
}
|
else
|
{
|
throw new Exception($"PLC类型{client.PLCType},未定义");
|
}
|
}
|
else if (info.type == "w")
|
{
|
throw new Exception("为安全起见,不能进行写操作!");
|
}
|
else
|
{
|
throw new Exception("操作类型不存在!");
|
}
|
}
|
catch (Exception ex)
|
{
|
return info.Error(ex.Message);
|
}
|
return info.Success();
|
}
|
|
|
/// <summary>
|
/// 获取AGV状态
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetAgvStatusData"), AllowAnonymous]
|
public WebResponseContent GetAgvStatusData([FromBody] SaveModel model)
|
{
|
return AGVData.GetAgvStatusData(model);
|
}
|
private static object gvTaskInfozz = new object();
|
/// <summary>
|
/// 树形任务完成量组装
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetAgvTaskInfozz"), AllowAnonymous]
|
public WebResponseContent GetAgvTaskInfozz([FromBody] SaveModel model)
|
{
|
lock (gvTaskInfozz)
|
{
|
return AGVData.GetAgvTaskInfozz(model);
|
}
|
|
}
|
private static object gvTaskInfozj = new object();
|
/// <summary>
|
/// 树形任务完成量组装
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetAgvTaskInfozj"), AllowAnonymous]
|
public WebResponseContent GetAgvTaskInfozj([FromBody] SaveModel model)
|
{
|
lock (gvTaskInfozj)
|
{
|
return AGVData.GetAgvTaskInfozj(model);
|
}
|
|
}
|
private static object gvTaskInfofj = new object();
|
/// <summary>
|
/// 树形任务完成量组装
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetAgvTaskInfofj"), AllowAnonymous]
|
public WebResponseContent GetAgvTaskInfofj([FromBody] SaveModel model)
|
{
|
lock (gvTaskInfofj)
|
{
|
return AGVData.GetAgvTaskInfofj(model);
|
}
|
|
}
|
/// <summary>
|
/// 获取空货位或者有货货位
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetLocationEmptyOrStored"), AllowAnonymous]
|
public WebResponseContent GetLocationEmptyOrStored([FromBody] SaveModel model)
|
{
|
return AGVData.GetLocationEmptyOrStored(model);
|
}
|
|
/// <summary>
|
/// 获取区域货位数据
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetLocationData"), AllowAnonymous]
|
public WebResponseContent GetLocationData([FromBody] SaveModel model)
|
{
|
return AGVData.GetLocationData(model);
|
}
|
|
/// <summary>
|
/// 获取AGV任务
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetAGVTaskData"), AllowAnonymous]
|
public WebResponseContent GetAGVTaskData([FromBody] SaveModel model)
|
{
|
return AGVData.GetAGVTaskData(model);
|
}
|
|
/// <summary>
|
/// 获取提升机信息
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
[HttpPost, Route("GetTSJInfo"), AllowAnonymous]
|
public WebResponseContent GetTSJInfo([FromBody] SaveModel model)
|
{
|
return AGVData.GetTSJInfo(model);
|
}
|
|
/// <summary>
|
/// 获取多个提升机信息
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
//[HttpPost, Route("GetTSJInfos"), AllowAnonymous]
|
//public WebResponseContent GetTSJInfos([FromBody] SaveModel model)
|
//{
|
// return AGVData.GetTSJInfos(model);
|
//}
|
}
|
|
public class PLCInfo
|
{
|
/// <summary>
|
/// 读取r,写入w
|
/// </summary>
|
public string type { get; set; } = "r";
|
|
/// <summary>
|
/// 指令
|
/// </summary>
|
public string address { get; set; }
|
|
public int len { get; set; }
|
|
/// <summary>
|
/// PLC名称
|
/// </summary>
|
public string plcName { get; set; }
|
|
public string dataType { get; set; }
|
|
|
|
|
/// <summary>
|
/// 读取或写入的值
|
/// </summary>
|
public object value { get; set; }
|
|
|
/// <summary>
|
/// 操作结果,和错误信息
|
/// </summary>
|
public string msg { get; set; }
|
|
public PLCInfo Error(string msg)
|
{
|
this.msg = "操作失败," + msg;
|
return this;
|
}
|
|
public PLCInfo Success(string msg = null)
|
{
|
if (msg != null)
|
this.msg = msg;
|
return this;
|
}
|
}
|
}
|