using Flurl.Util;
using Furion.DatabaseAccessor;
using Furion.Logging;
using IoTClient;
using StackExchange.Redis;
using System.Data;
namespace WCS.Application;
public static class PLCService
{
private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
public static void OnChangeEvent(object sender, EventArgs e)
{
try
{
var mod = sender as WcsDeviceDto;
Console.WriteLine("PLC值为" + mod.Value);
switch (mod.Type)
{
case PLCTypeEnum.StackingMachine:
StackingMachine(mod);
break;
case PLCTypeEnum.ConveyorLine:
ConveyorLine(mod);
break;
case PLCTypeEnum.AGV:
AGV(mod);
break;
case PLCTypeEnum.PalletMachine:
PalletMachine(mod);
break;
default:
break;
}
}
catch (Exception ex)
{
Log.Error(ex.Message, ex);
}
}
///
/// 跺机业务处理
///
///
private static void StackingMachine(WcsDeviceDto modDevice)
{
var plcConn = modDevice.PLCUtil;
switch (modDevice.ToString())
{
case "820":
var modTask = _db.Queryable().First(s => s.Status == TaskStatusEnum.Wait && s.TaskType == TaskTypeEnum.Out && s.StartRoadway == modDevice.StationNum);
if (modTask == null)
{
break;
}
var modTaskMonitor = new WcsTaskMonitor()
{
TaskNo = modTask.TaskNo,
StartLocat = modTask.StartLocate,
EndLocat = modTask.EndLocate,
PalletNo = modTask.PalletNo,
};
// 根据跺机号确认放货工位
string outStationNum = "0";
string endRow = "", endColumn = "", endStorey = "";
switch (modDevice.StationNum)
{
case "R01":
outStationNum = "11";
endRow = "1";
endColumn = "100";
endStorey = "1";
break;
case "R02":
outStationNum = "7";
endRow = "1";
endColumn = "100";
endStorey = "1";
break;
default: break;
}
var modD = modDevice.listDevice.FirstOrDefault();
if (modD == null)
{
Log.Error($"IP{modDevice.PlcId}.设备id:{modDevice.Id}缺少工位级别设备信息");
break;
}
var (result, value) = plcConn.GetPlcDBValue(modD.PosType.Value, modD.DbNumber, modD.PlcPos);
if (result.IsSucceed)
{
if (value == 120)// 放货工位空闲 可放货
{
if (int.Parse(outStationNum) > 0)
{
var row = int.Parse(modTaskMonitor.StartLocat.Substring(0, 2)).ToString();
var column = int.Parse(modTaskMonitor.StartLocat.Substring(2, 2)).ToString();
var layer = int.Parse(modTaskMonitor.StartLocat.Substring(4, 2)).ToString();
var deep = int.Parse(modTaskMonitor.StartLocat.Substring(6, 2)).ToString();
if (int.Parse(row) > 2) //大于4
{
row = (int.Parse(row) - 2).ToString();
}
else
{
// 起始储位地址为空,跳过 写入任务明细表
modTaskMonitor.StartLocat = "";
modTaskMonitor.InteractiveMsg = "起始储位为空!";
_db.Insertable(modTaskMonitor).ExecuteCommand();
// 通知任务界面任务已存在更新 请更新界面
//if (TaskAction.refresh)
//{
// wSChat.AlarmInformation("1");
//}
break;
}
//给PLC写入任务数据
var listResult = new List();
//任务号
var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "TaskNo");
listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType.Value, modDevice.DbNumber, modPosTask.PlcPos, modTaskMonitor.TaskNo));
//托盘号
var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "PalletNo");
listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType.Value, modDevice.DbNumber, modPosPalletNo.PlcPos, modTaskMonitor.PalletNo));
//起始排
var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "StartRow");
listResult.Add(plcConn.SetPlcDBValue(modPosRow.PosType.Value, modDevice.DbNumber, modPosRow.PlcPos, row));
// 起始列
var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "StartColumn");
listResult.Add(plcConn.SetPlcDBValue(modPosColumn.PosType.Value, modDevice.DbNumber, modPosColumn.PlcPos, column));
// 起始层
var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "StartLayer");
listResult.Add(plcConn.SetPlcDBValue(modPosStorey.PosType.Value, modDevice.DbNumber, modPosStorey.PlcPos, layer));
// 目标放货工位
var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "EndRow");
listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType.Value, modDevice.DbNumber, modPosEndRow.PlcPos, endRow));
var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "EndColumn");
listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType.Value, modDevice.DbNumber, modPosEndColumn.PlcPos, endColumn));
var modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "EndLayer");
listResult.Add(plcConn.SetPlcDBValue(modPosEndStorey.PosType.Value, modDevice.DbNumber, modPosEndStorey.PlcPos, endColumn));
//全部写入成功
if (listResult.All(s => s.IsSucceed))
{
// 写入跺机任务下发完成
plcConn.SetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.WcsPos, "10");
// 将出库任务待执行改为正在执行
_db.Updateable()
.SetColumns(s => s.FinishDate == DateTime.Now)
.SetColumns(s => s.Status == TaskStatusEnum.Doing)
.SetColumns(s => s.Levels == 2)
.Where(s => s.Id == modTask.Id)
.ExecuteCommand();
var modInsertTaskMonitor = new WcsTaskMonitor()
{
TaskNo = modTask.TaskNo,
PlcId = modDevice.Id,
PlcName = modDevice.Text,
InteractiveMsg = $"写入指令:{modTask.StartLocate}储位====》{outStationNum}工位",
PalletNo = modTask.PalletNo,
Status = TaskStatusEnum.Complete,
StartLocat = modTask.StartLocate,
EndLocat = outStationNum,
};
_db.Insertable(modInsertTaskMonitor).ExecuteCommand();
// 通知任务界面任务已存在更新 请更新界面
//if (TaskAction.refresh)
//{
// wSChat.AlarmInformation("1");
//}
//修改led屏信息
//LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
}
}
}
}
else
{
Log.Error(string.Join(',', result.ErrList));
}
break;
default:
break;
}
}
///
/// 输送线业务处理
///
///
private static void ConveyorLine(WcsDeviceDto modDevice)
{
}
///
/// AGV业务处理
///
///
private static void AGV(WcsDeviceDto modDevice)
{
}
///
/// 叠托机业务处理
///
///
private static void PalletMachine(WcsDeviceDto modDevice)
{
}
private static void Test(WcsDeviceDto modDevice)
{
//写死测试读string
var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64");
Console.WriteLine("DB100.64----" + val);
//测试批量读取
Dictionary listaddress = new Dictionary();
foreach (var modStation in modDevice.listStation)
{
listaddress.Add(modStation.PlcPos, modStation.PosType.Value);
}
var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress);
if (result.Value.Count > 0)
{
foreach (var value in result.Value)
{
Console.WriteLine("地址" + value.Key + "----值" + value, value);
}
}
if (!result.IsSucceed)
{
foreach (var err in result.ErrList)
{
Console.WriteLine(err);
}
if (result.Value.Count > 0)//有错误的也有成功的
{
}
}
if (modDevice.Value == 820)
{
//测试写入830
//var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830");
////写入是否成功
//if (result.IsSucceed)
//{
//}
}
else if (modDevice.Value == 840)
{
}
else if (modDevice.Value == 860)
{
}
}
}