using Newtonsoft.Json;
|
using Quartz;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common;
|
using WIDESEA_Common.DBHelper;
|
using WIDESEA_Common.Tools;
|
using WIDESEA_Entity.DomainModels;
|
using WIDESEA_Entity.DomainModels.Equipment;
|
using WIDESEA_WCS.Jobs;
|
using WIDESEA_WCS.JobsPart.Public;
|
using WIDESEA_WCS.WCSClient;
|
|
namespace WIDESEA_WCS
|
{
|
/// <summary>
|
/// 提升机调度【西门子】
|
/// </summary>
|
[DisallowConcurrentExecution]
|
public class StackerJob : JobBase, IJob
|
{
|
static List<AGVCenterEqDB> centerEqDBList;
|
static FreeDB freeDB = new FreeDB();
|
|
public StackerJob()
|
{
|
if (centerEqDBList == null || centerEqDBList.Count == 0)
|
{
|
|
string tsjJson = File.ReadAllText(AppContext.BaseDirectory + "/提升机.json", Encoding.UTF8);
|
centerEqDBList = JsonConvert.DeserializeObject<List<AGVCenterEqDB>>(tsjJson);
|
}
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
//return null;//停用提升机调度
|
try
|
{
|
ExecuteJob(context, DoAction);
|
}
|
catch { }
|
return Task.FromResult(string.Empty);
|
}
|
|
|
private void DoAction(IJobExecutionContext context)
|
{
|
PLCClient client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient;
|
if (client==null)
|
{
|
return;
|
}
|
var stationList = centerEqDBList.FirstOrDefault(t => t.tiShenJiName == client.PLCName);
|
if (stationList != null)
|
{
|
foreach (var station in stationList.stationInfos)
|
{
|
var clientData = (byte[])client.ReadDBValue(station.eqDBList[0], 100);
|
TransferData(station, client, clientData);
|
|
try
|
{
|
//入口无料
|
if (station.stationType == "in" && clientData[93] == 0x00)
|
{
|
//提升机入口无料不主动叫料
|
//WCSCommon.CreateTask(station, true);
|
}
|
//出口有料
|
else if (station.stationType == "out" && clientData[93] == 0x01)
|
{
|
//物料类型,传任务号
|
var taskNo = DataTrans.GetStr(clientData, 26) + "_T";
|
WriteLog.GetLog().Write($"【info】任务{taskNo}请求任务完成。" + "\n", client.PLCName);
|
|
if (!string.IsNullOrEmpty(taskNo))
|
{
|
FinshTiShenJiTask(taskNo);
|
}
|
WCSCommon.CreateTask(station, false);
|
}
|
}
|
catch (Exception ex)
|
{
|
WriteLog.GetLog().Write($"【提升机任务请求异常】{client.PLCName},{station.stationCode}口。{ex.Message}" + "\n", client.PLCName);
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 完成提升机任务
|
/// </summary>
|
/// <param name="taskNo">提升机任务号</param>
|
private void FinshTiShenJiTask(string taskNo)
|
{
|
var task = freeDB.Select<dt_agvtask>().Where(t => t.agv_tasknum == taskNo).ToOne();
|
if (task != null)
|
{
|
freeDB.Add(new dt_agvtask_hty()
|
{
|
hty_pkid = Guid.NewGuid(),
|
agv_id = Guid.Empty,
|
agv_tasknum = task.agv_tasknum,
|
agv_materielid = task.agv_materielid,
|
agv_qty = task.agv_qty,
|
agv_createtime = task.agv_createtime,
|
agv_realesstime = task.agv_realesstime,
|
agv_executingBeginTime = task.agv_executingBeginTime,
|
agv_executingEndTime = task.agv_executingEndTime,
|
agv_completeBeginTime = task.agv_completeBeginTime,
|
agv_finishedtime = DateTime.Now,
|
agv_taskstate = AGVTaskStateEnum.Complete1.ToString(),
|
agv_tasktype = task.agv_tasktype,
|
agv_fromaddress = task.agv_fromaddress,
|
agv_toaddress = task.agv_toaddress,
|
agv_operatetype = string.Empty,
|
agv_compeletor = "wcs",
|
agv_completedate = DateTime.Now,
|
agv_grade = task.agv_grade,
|
agv_userid = "wcs",
|
agv_barcode = task.agv_barcode,
|
agv_code = task.agv_code,
|
agv_worktype = task.agv_worktype
|
});
|
freeDB.Remove(task);
|
}
|
}
|
|
/// <summary>
|
/// 中转AGV对接数据
|
/// </summary>
|
/// <param name="station"></param>
|
/// <param name="tsj_Client"></param>
|
/// <param name="tsjData"></param>
|
private void TransferData(StationInfo station, PLCClient tsj_Client, byte[] tsjData)
|
{
|
var agv_Client = WIDESEA_WCS.WCSService.Clients.FirstOrDefault(t => t.PLCName == station.agvCenterName);
|
if (agv_Client != null)
|
{
|
var agvData = (byte[])agv_Client.ReadDBValue(station.agvDBList[0], 200);
|
|
//90,流程步骤非0,开始对接
|
if (agvData[90 + 1] != 0x0 && station.stationType == "in")
|
{
|
//目的地址
|
agvData[96] = (byte)station.tiShenJiEndUniCode;
|
//托盘码
|
OperateDB.WriteData(agvData, 58, "null");
|
}
|
|
////tsj_Client.WriteDBValue(station.eqDBList[1], agvData);
|
/// agv_Client.WriteDBValue(station.agvDBList[1], tsjData);
|
}
|
else
|
{
|
WriteLog.GetLog().Write($"【异常】{station.agvCenterName},读取调度中心PLC失败" + "\n", tsj_Client.PLCName);
|
}
|
}
|
}
|
}
|