using HslCommunication.ModBus; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric; using Quartz; using System; using System.Collections.Generic; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using WIDESEA_Common; using WIDESEA_Common.DBHelper; using WIDESEA_Common.Tools; using WIDESEA_Entity.DomainModels.Equipment; using WIDESEA_Entity.DomainModels; using WIDESEA_WCS.Jobs; using WIDESEA_WCS.SchedulerExecute.AGV; using WIDESEA_WCS.WCSClient; using System.IO; using System.Linq; using HslCommunication; using SqlSugar; using WIDESEA_Core.Extensions; namespace WIDESEA_WCS { [DisallowConcurrentExecution] /// /// 缓存架信号Job /// public class AluminumCaseJob : JobBase, IJob { FreeDB freeDB = new FreeDB(); static List centerEqDBList; private static object createTaskObj = new object(); public Task Execute(IJobExecutionContext context) { try { ExecuteJob(context, DoAction); } catch (Exception) { } return Task.FromResult(string.Empty); } private void DoAction(IJobExecutionContext context) { var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient; // //Console.WriteLine($"{client}"); if (!client.IsConnected) { client.Connect(); return; } //铝壳缓存架业务作业 LKHCJdispatch(); } private void LKHCJdispatch() { //铝壳缓存架搬运 PLCClient pLCClient1F = WCSService.Clients.Find(V => V.PLCName.Equals(PLCConst.PLCName1FLKHCJ)); PLCClient pLCClient2F = WCSService.Clients.Find(V => V.PLCName.Equals(PLCConst.PLCName2FLKHCJ)); if (pLCClient1F != null && pLCClient2F != null) { string tsjJson = File.ReadAllText(AppContext.BaseDirectory + "/Config/铝壳缓存架.json", Encoding.UTF8); centerEqDBList = JsonConvert.DeserializeObject>(tsjJson); if (centerEqDBList == null) { return; } PLCClient agvzzplc = WCSService.Clients.Find(v => v.PLCName == "组装AGV调度"); AGVTransfershelfstatus(agvzzplc); UpdateHCJInfoByRealTime(pLCClient2F); UpdateHCJInfoByRealTime(pLCClient1F); #region 二楼铝壳缓存架满托搬运一楼铝壳空位缓存架 List stationListGYKTSL = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => t.LampGreen) .Where(t => t.tpgd) .Where(t => t.wlgd) .Where(t => t.stationType == "2楼铝壳缓存架") .ToList(); if (stationListGYKTSL != null) { foreach (var fcStation in stationListGYKTSL) { lock (createTaskObj) { dt_agvtask dt_Agvtask = freeDB.Select().Where(t => t.agv_fromaddress == fcStation.stationCode).First(); if (dt_Agvtask != null) { continue; } //铝壳库还有空闲的满料代表库房送料到产线,二楼送料到库房(除非库房没空位就往产线送) List stationListGMKHCJlistbeg = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => t.tpgd) .Where(t => t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => t.remark.Contains("一楼隔膜库3缓存架")) .Where(@"not EXISTS (select * from dt_agvtask where agv_fromaddress = a.stationCode)") .ToList(); List stationListGMKHCJlistend = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => !t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => t.remark.Contains("一楼隔膜库3缓存架")) .Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)") .ToList(); if (stationListGMKHCJlistbeg.Count > 0 && stationListGMKHCJlistend.Count > 0) { //Console.WriteLine(stationListGMKHCJlistbeg.Count); //Console.WriteLine(stationListGMKHCJlistend.Count); //Console.WriteLine(9); //Console.WriteLine("cccccccccccccc"); dt_stationinfo stationListGMHCJ = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => !t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => t.remark.Contains("一楼隔膜库3缓存架")) .Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)") //查找的目的地址不应该在任务中,也不能是任务的终点 //.Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)") .First(); if (stationListGMHCJ != null) { Console.WriteLine(11); string agv_remark = "二楼铝壳缓存架任务下料"; string begin = fcStation.stationCode; string end = stationListGMHCJ.stationCode; agvtaskAdd(agv_remark, begin, end, true); } else { Console.WriteLine("null"); } } //库房中没有可搬运的满料 else if (stationListGMKHCJlistbeg.Count == 0) { dt_stationinfo stationListGMHCJ = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => t.LampGreen) .Where(t => !t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => !t.remark.Contains("一楼隔膜库3缓存架")) //查找的目的地址不应该在任务中,也不能是任务的终点 .Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress =a.stationCode)") .First(); //产线无呼叫,一楼库中有空位就直接二楼送料到库房 if (stationListGMHCJ == null) { if (stationListGMKHCJlistend != null) { dt_stationinfo stationListGMHCJku = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => !t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => t.remark.Contains("一楼隔膜库3缓存架")) .Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)").First(); if (stationListGMHCJku != null) { string agv_remark = "二楼铝壳缓存架任务下料"; string begin = fcStation.stationCode; string end = stationListGMHCJku.stationCode; agvtaskAdd(agv_remark, begin, end, true); } } } //产线呼叫,二楼直接送料到产线 else { string agv_remark = "二楼铝壳缓存架任务下料"; string begin = fcStation.stationCode; string end = stationListGMHCJ.stationCode; agvtaskAdd(agv_remark, begin, end, true); } } } } } #endregion #region 一楼线边空位铝壳缓存架呼叫隔膜库3满托铝壳缓存架 //二楼铝壳没有呼叫,进入产线直接呼叫库房满料进行搬运 //var dt_Stationinfo= freeDB.Select() // .Where(t => t.enable == true) // .Where(t => !t.connect) // .Where(t => t.LampGreen) // .Where(t => t.tpgd) // .Where(t => t.wlgd) // .Where(t => t.stationType == "2楼铝壳缓存架") // .Where(@"not EXISTS (select * from dt_agvtask where agv_fromaddress = a.stationCode)") // .Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)").First(); //if (stationListGYKTSL==null) //{ List stationList1XBLKSL = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => t.LampGreen) .Where(t => !t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => !t.remark.Contains("一楼隔膜库3缓存架")) .ToList(); if (stationList1XBLKSL != null) { foreach (var fcStation in stationList1XBLKSL) { lock (createTaskObj) { dt_agvtask dt_Agvtask = freeDB.Select().Where(t => t.agv_toaddress == fcStation.stationCode).First(); if (dt_Agvtask != null) { continue; } dt_stationinfo stationListGMHCJ = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => t.tpgd) .Where(t => t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => t.remark.Contains("一楼隔膜库3缓存架")) .Where(@"not EXISTS (select * from dt_agvtask where agv_fromaddress = a.stationCode)") //查找的目的地址不应该在任务中,也不能是任务的终点 //.Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)") .First(); if (stationListGMHCJ != null) { string agv_remark = "一楼线边铝壳缓存架任务叫料"; string begin = stationListGMHCJ.stationCode; string end = fcStation.stationCode; agvtaskAdd(agv_remark, begin, end, false); } } } } #endregion #region 二楼空位铝壳缓存架呼叫一楼线边空托缓存架回流 List stationList2FLKSL = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => !t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "2楼铝壳缓存架") .ToList(); foreach (var fcStation in stationList2FLKSL) { //Console.WriteLine("线边空托缓存架回流0"); lock (createTaskObj) { dt_agvtask dt_Agvtask = freeDB.Select().Where(t => t.agv_toaddress == fcStation.stationCode).First(); if (dt_Agvtask != null) { continue; } dt_stationinfo stationListGMHCJ = freeDB.Select() .Where(t => t.enable == true) .Where(t => !t.connect) .Where(t => t.LampGreen) .Where(t => t.tpgd) .Where(t => !t.wlgd) .Where(t => t.stationType == "1楼铝壳缓存架") .Where(t => !t.remark.Contains("一楼隔膜库3缓存架")) .Where(@"not EXISTS (select * from dt_agvtask where agv_fromaddress = a.stationCode)") //查找的目的地址不应该在任务中,也不能是任务的终点 //.Where(@"not EXISTS (select * from dt_agvtask where agv_toaddress = a.stationCode)") .First(); if (stationListGMHCJ != null) { string agv_remark = "铝壳缓存架任务空托回流"; string begin = stationListGMHCJ.stationCode; string end = fcStation.stationCode; //UpdateLightInfo(task, true); agvtaskAdd(agv_remark, begin, end, true); } } } #endregion } } /// /// 铝壳缓存架状态传递agv /// /// private void AGVTransfershelfstatus(PLCClient agvzzplc) { double comErr_2f = 8700.0;//是否掉线 double doorCode_2f = 8702.0;//缓存架ID double doorState_2f = 8724.0;//缓存架物料状态(1:空位,2:空托盘,3:满托盘) double gdState_2f = 8726.0;//预留 var dt_stationinfo_2f = freeDB.Select().Where(d => d.area == "2F" && d.remark.Contains("二楼铝壳缓存架")) .OrderBy(t => t.sort) .ToList(); foreach (var item in dt_stationinfo_2f) { if (item.connect == true) { //掉线 } else { if (item.tpgd == true && item.wlgd == true) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_2f, Convert.ToInt16(3)); } else if (item.tpgd == true && item.wlgd == false) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_2f, Convert.ToInt16(2)); } else { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_2f, Convert.ToInt16(1)); } } OperateResult W_HCJ_StationCode = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorCode_2f, item.stationCode.ToString()); OperateResult W_HCJ_ComErr = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + comErr_2f, item.connect); comErr_2f += 30; doorCode_2f += 30; doorState_2f += 30; } double comErr_1f_kf = 8820;//是否掉线 double doorCode_1f_kf = 8822.0;//缓存架ID double doorState_1f_kf = 8844.0;//缓存架物料状态(1:空位,2:空托盘,3:满托盘) double gdState_1f_kf = 8846.0;//预留 var dt_stationinfo_1f_kf = freeDB.Select().Where(d => d.area == "1F" && d.remark.Contains("一楼隔膜库3缓存架")).OrderBy(t => t.sort) .ToList(); foreach (var item in dt_stationinfo_1f_kf) { if (item.connect == true ) { //掉线 } else { if (item.tpgd == true && item.wlgd == true) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_1f_kf, Convert.ToInt16(3)); } else if (item.tpgd == true && item.wlgd == false) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_1f_kf, Convert.ToInt16(2)); } else { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_1f_kf, Convert.ToInt16(1)); } } OperateResult W_HCJ_StationCode = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorCode_1f_kf, item.stationCode.ToString()); OperateResult W_HCJ_ComErr = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + comErr_1f_kf, item.connect); comErr_1f_kf += 30; doorCode_1f_kf += 30; doorState_1f_kf += 30; } double comErr_1f_cx = 9090;//是否掉线 double doorCode_1f_cx = 9092.0;//缓存架ID double doorState_1f_cx = 9114;//缓存架物料状态(1:空位,2:空托盘,3:满托盘) double gdState_1f_cx = 9116;//预留 var dt_stationinfo_1f_cx = freeDB.Select().Where(d=>d.area== "1F"&&d.remark.Contains("铝盒缓存架")) .OrderBy(t => t.sort) .ToList(); foreach (var item in dt_stationinfo_1f_cx) { if (item.connect == true) { //掉线 } else { if (item.tpgd == true && item.wlgd == true) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_1f_cx, Convert.ToInt16(3)); } else if (item.tpgd == true && item.wlgd == false) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_1f_cx, Convert.ToInt16(2)); } else { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_1f_cx, Convert.ToInt16(1)); } } OperateResult W_HCJ_StationCode = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorCode_1f_cx, item.stationCode.ToString()); OperateResult W_HCJ_ComErr = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + comErr_1f_cx, item.connect); comErr_1f_cx += 30; doorCode_1f_cx += 30; doorState_1f_cx += 30; } //入壳缓存架 double comErr_rk = 9450.0;//是否掉线 double doorCode_rk = 9452.0;//缓存架ID double doorState_rk = 9474.0;//缓存架物料状态(1:空位,2:空托盘,3:满托盘) var dt_stationinfo_rk = freeDB.Select().Where(d => d.stationType == "入壳缓存架").OrderBy(t => t.sort).ToList(); foreach (var item in dt_stationinfo_rk) { if (item.connect == true) { //掉线 } else { if (item.tpgd == true && item.wlgd == true) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_rk, Convert.ToInt16(3)); } else if (item.tpgd == true && item.wlgd == false) { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_rk, Convert.ToInt16(2)); } else { OperateResult W_HCJ_FullState = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorState_rk, Convert.ToInt16(1)); } } OperateResult W_HCJ_StationCode = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + doorCode_rk, item.stationCode.ToString()); OperateResult W_HCJ_ComErr = agvzzplc.SiemensPLCClient.SiemensS7NetClient.Write("DB1003." + comErr_rk, item.connect); comErr_1f_cx += 30; doorCode_1f_cx += 30; doorState_1f_cx += 30; } } private void agvtaskAdd(string agv_remark, string begin, string end,bool communi) { dt_agvtask agvtask = new dt_agvtask { agv_id = Guid.NewGuid(), agv_tasknum = "KH-" + IdenxManager.GetTaskNo(), agv_fromaddress = begin, agv_toaddress = end, agv_code = "组装AGV调度", agv_remark = agv_remark, agv_taskstate = AGVTaskStateEnum.Create.ToString(), agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(), agv_worktype = 1,//工作类型 agv_materielid = "", agv_qty = 1, agv_createtime = DateTime.Now, agv_grade = 0,//任务优先级 agv_userid = "WCS", agv_barcode = "" }; UpdateLightInfo(agvtask, communi); int A= freeDB.Add(agvtask); } /// /// 实时轮询更新缓存架的状态 /// private void UpdateHCJInfoByRealTime(PLCClient client) { ModbusTcpNet ModbusPLCClient = client.ModbusPLCClient.ModbusTcpNetClient; var stationList = centerEqDBList.FirstOrDefault(t => t.HCJCenterName == client.PLCName); foreach (var item in stationList.stationInfos) { dt_stationinfo station = freeDB.Select() .Where(x => x.stationCode == item.HCJCode) .First(); ////Console.WriteLine($"{station.stationCode}------{DateTime.Now}"); if (station == null) { continue; } if (stationList.HCJCenterName == "铝壳缓存架二楼") { string ButtonEnsureDB = item.RPLCDB[0];//确认按钮(绿色)信号点位 string tpgdstateDB = item.RPLCDB[1];//托盘光电状态信号点位 string wlgdstateDB = item.RPLCDB[2];//物料光电状态信号点位 ////确认按钮(绿色) OperateResult R_TBR_XT = ModbusPLCClient.ReadBool(ButtonEnsureDB); if (!R_TBR_XT.IsSuccess) { //Console.WriteLine($"-{ModbusPLCClient.IpAddress}---{station.stationCode}----{ButtonEnsureDB}--------false--{R_TBR_XT.Message}----------------"); station.connect = true; var stationoff = freeDB.Update(station).UpdateColumns(t => new { t.connect }).ExecuteAffrows(); continue; } bool ButtonEnsure = ModbusPLCClient.ReadBool(ButtonEnsureDB).Content; //托盘光电状态 bool pgdstate = ModbusPLCClient.ReadBool(tpgdstateDB).Content; //物料光电状态 bool wlgdstate = ModbusPLCClient.ReadBool(wlgdstateDB).Content; //根据读到的PLC信息,轮询更新数据库信息 station.getLastTime = DateTime.Now; station.greenbutton = ButtonEnsure; station.tpgd = pgdstate; station.wlgd = wlgdstate; string LampYellowDB = item.WPLCDB[0];//黄灯信号点位 string LampGreenDB = item.WPLCDB[1];//绿灯信号点位 string LampRedDB = item.WPLCDB[2];//红灯信号点位 //货架存在任务任务时 if (station.task) { if (station.LampYellow) { ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // Console.WriteLine($"{station.stationCode}---亮---{DateTime.Now}"); station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } else { ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // Console.WriteLine($"{station.stationCode}---灭---{DateTime.Now}"); station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } } else { //当有人按下绿色按钮时: //将缓存架的灯光亮绿灯 if (ButtonEnsure && pgdstate && wlgdstate) { DateTime date = DateTime.Now; DateTime time2 = station.greenbuttontime; Double STAMP = (date - time2).TotalSeconds; Console.WriteLine(STAMP); if (STAMP > 4) { if (station.LampGreen) { Console.WriteLine($"{station.stationCode}---------false"); ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampGreen = false; } else { Console.WriteLine($"{station.stationCode}---------true"); ModbusPLCClient.Write(LampGreenDB, true); //绿灯 station.LampGreen = true; } //ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 //station.LampRed = false; station.LampYellow = false; station.greenbuttontime = DateTime.Now; } } else if (station.LampGreen && (!pgdstate || !wlgdstate)) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } //检测托盘光电有料,但未按确认按钮,亮黄灯 else if (!station.LampGreen && pgdstate) { // ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } else if (!station.LampGreen && !pgdstate&&!wlgdstate) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } //else //{ // Console.WriteLine("elsel11111111111"); // ModbusPLCClient.Write(LampRedDB, false); //红灯 // ModbusPLCClient.Write(LampYellowDB, false); //黄灯 // ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // station.LampRed = false; // station.LampYellow = false; // station.LampGreen = false; //} } station.connect = false; var executeAffrows = freeDB.Update(station).UpdateColumns(t => new { t.connect, t.getLastTime, t.greenbutton, t.tpgd, t.wlgd, t.LampRed, t.LampGreen, t.LampYellow }).ExecuteAffrows(); } else if (stationList.HCJCenterName == "铝壳缓存架一楼" && !item.HCJName.Contains("入壳缓存架")) { string ButtonResetDB = item.RPLCDB[0]; //复位按钮(黄色)信号点位 string ButtonEnsureDB = item.RPLCDB[1];//确认按钮(绿色)信号点位 string ButtonAlarmDB = item.RPLCDB[2];//报警按钮(红色))信号点位 string tpgdstateDB = item.RPLCDB[3];//托盘光电状态信号点位 string wlgdstateDB = item.RPLCDB[4];//物料光电状态信号点位 OperateResult R_TBR_XT = ModbusPLCClient.ReadBool(ButtonResetDB); if (!R_TBR_XT.IsSuccess) { //Console.WriteLine($"-{ModbusPLCClient.IpAddress}----{station.stationCode}--{ButtonEnsureDB}--------false--{R_TBR_XT.Message}----------------"); station.connect = true; var stationoff = freeDB.Update(station).UpdateColumns(t => new { t.connect }).ExecuteAffrows(); continue; } //复位按钮(黄色) var ButtonReset = ModbusPLCClient.ReadBool(ButtonResetDB).Content; //确认按钮(绿色) var ButtonEnsure = ModbusPLCClient.ReadBool(ButtonEnsureDB).Content; //报警按钮(红色) var ButtonAlarm = ModbusPLCClient.ReadBool(ButtonAlarmDB).Content; //托盘光电状态 var pgdstate = ModbusPLCClient.ReadBool(tpgdstateDB).Content; //物料光电状态 var wlgdstate = ModbusPLCClient.ReadBool(wlgdstateDB).Content; //根据读到的PLC信息,轮询更新数据库信息 station.getLastTime = DateTime.Now; station.YellowButton = ButtonReset; station.greenbutton = ButtonEnsure; station.RedButton = ButtonAlarm; station.tpgd = pgdstate; station.wlgd = wlgdstate; string LampRedDB = item.WPLCDB[2];//红灯信号点位 string LampGreenDB = item.WPLCDB[1];//绿灯信号点位 string LampYellowDB = item.WPLCDB[0];//黄灯信号点位 //货架存在任务任务时 if (station.task) { if (station.LampYellow) { ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // Console.WriteLine($"{station.stationCode}---亮---{DateTime.Now}"); station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } else { ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // Console.WriteLine($"{station.stationCode}---灭---{DateTime.Now}"); station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } } else { if (!item.HCJName.Contains("一楼隔膜库3缓存柜")) { //当有人按下绿色按钮时: //将缓存架的灯光亮绿灯(1.空位按绿按钮亮绿灯,2.空托盘按黄色按钮亮绿灯) if ((ButtonEnsure && !pgdstate && !wlgdstate)||(ButtonReset && pgdstate && !wlgdstate)) { DateTime date= DateTime.Now; DateTime time2 = station.greenbuttontime; Double STAMP = (date - time2).TotalSeconds; // Console.WriteLine(STAMP); if (STAMP>3) { if (station.LampGreen) { ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampGreen = false; //Console.WriteLine(station.stationCode); //Console.WriteLine(station.LampGreen); //Console.WriteLine(false); } else { ModbusPLCClient.Write(LampGreenDB, true); //绿灯 station.LampGreen = true; //Console.WriteLine(station.stationCode); //Console.WriteLine(station.LampGreen); //Console.WriteLine(true); } station.greenbuttontime = DateTime.Now; ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 station.LampRed = false; station.LampYellow = false; } }//检测托盘光电有料,但未按确认按钮,亮黄灯 else if (!station.LampGreen && pgdstate) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } else if (station.LampGreen && pgdstate && wlgdstate) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } else if (!station.LampGreen && !pgdstate && !wlgdstate) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } //else //{ // ModbusPLCClient.Write(LampRedDB, false); //红灯 // ModbusPLCClient.Write(LampYellowDB, false); //黄灯 // ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // station.LampRed = false; // station.LampYellow = false; // station.LampGreen = false; //} } else { if (pgdstate) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } else { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } } } station.connect = false; var executeAffrows = freeDB.Update(station).UpdateColumns(t => new { t.connect, t.getLastTime, t.greenbuttontime, t.YellowButton, t.greenbutton, t.RedButton, t.tpgd, t.wlgd, t.LampRed, t.LampGreen, t.LampYellow }).ExecuteAffrows(); } else if (stationList.HCJCenterName == "铝壳缓存架一楼" && item.HCJName.Contains("入壳缓存架")) { string ButtonEnsureDB = item.RPLCDB[0];//确认按钮(绿色)信号点位 string tpgdstateDB = item.RPLCDB[1];//托盘光电状态信号点位 string wlgdstateDB = item.RPLCDB[2];//物料光电状态信号点位 ////确认按钮(绿色) OperateResult R_TBR_XT = ModbusPLCClient.ReadBool(ButtonEnsureDB); WriteLog.GetLog().Write($"{item.HCJName}缓存架,连接{R_TBR_XT.IsSuccess}", "入壳缓存架"); if (!R_TBR_XT.IsSuccess) { //Console.WriteLine($"-{ModbusPLCClient.IpAddress}---{station.stationCode}----{ButtonEnsureDB}--------false--{R_TBR_XT.Message}----------------"); station.connect = true; var stationoff = freeDB.Update(station).UpdateColumns(t => new { t.connect }).ExecuteAffrows(); continue; } bool ButtonEnsure = ModbusPLCClient.ReadBool(ButtonEnsureDB).Content; //托盘光电状态 bool pgdstate = ModbusPLCClient.ReadBool(tpgdstateDB).Content; //物料光电状态 bool wlgdstate = ModbusPLCClient.ReadBool(wlgdstateDB).Content; //根据读到的PLC信息,轮询更新数据库信息 station.getLastTime = DateTime.Now; station.greenbutton = ButtonEnsure; station.tpgd = pgdstate; station.wlgd = wlgdstate; string LampYellowDB = item.WPLCDB[0];//黄灯信号点位 string LampGreenDB = item.WPLCDB[1];//绿灯信号点位 string LampRedDB = item.WPLCDB[2];//红灯信号点位 //货架存在任务任务时 if (station.task) { if (station.LampYellow) { ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // Console.WriteLine($"{station.stationCode}---亮---{DateTime.Now}"); station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } else { ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // Console.WriteLine($"{station.stationCode}---灭---{DateTime.Now}"); station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } } else { //当有人按下绿色按钮时: //将缓存架的灯光亮绿灯 if (ButtonEnsure && pgdstate && wlgdstate) { DateTime date = DateTime.Now; DateTime time2 = station.greenbuttontime; Double STAMP = (date - time2).TotalSeconds; if (STAMP > 4) { if (station.LampGreen) { ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampGreen = false; } else { ModbusPLCClient.Write(LampGreenDB, true); //绿灯 station.LampGreen = true; } //ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 //station.LampRed = false; station.LampYellow = false; station.greenbuttontime = DateTime.Now; } } else if (station.LampGreen && (!pgdstate || !wlgdstate)) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } //检测托盘光电有料,但未按确认按钮,亮黄灯 else if (!station.LampGreen && pgdstate) { // ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, true); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 // station.LampRed = false; station.LampYellow = true; station.LampGreen = false; } else if (!station.LampGreen && !pgdstate && !wlgdstate) { ModbusPLCClient.Write(LampRedDB, false); //红灯 ModbusPLCClient.Write(LampYellowDB, false); //黄灯 ModbusPLCClient.Write(LampGreenDB, false); //绿灯 station.LampRed = false; station.LampYellow = false; station.LampGreen = false; } } station.connect = false; var executeAffrows = freeDB.Update(station).UpdateColumns(t => new { t.connect, t.getLastTime, t.greenbutton, t.tpgd, t.wlgd, t.LampRed, t.LampGreen, t.LampYellow }).ExecuteAffrows(); } } } /// /// 更新缓存架灯光等信息(任务创建时) /// /// 此时的agv任务 private void UpdateLightInfo(dt_agvtask task, bool state) { var fromStation = freeDB.Select().Where(t => t.stationCode == task.agv_fromaddress) .First(); var toStation = freeDB.Select().Where(t => t.stationCode == task.agv_toaddress).First(); if (fromStation != null && toStation != null) { if (state) { PLCClient pLCClient1F = WCSService.Clients.Find(V => V.PLCName.Equals(PLCConst.PLCName1FLKHCJ)); PLCClient pLCClient2F = WCSService.Clients.Find(V => V.PLCName.Equals(PLCConst.PLCName2FLKHCJ)); if (pLCClient1F != null && pLCClient2F != null) { ModbusTcpNet ModbusPLCClient1F = pLCClient1F.ModbusPLCClient.ModbusTcpNetClient; ModbusTcpNet ModbusPLCClient2F = pLCClient2F.ModbusPLCClient.ModbusTcpNetClient; var stationList1F = centerEqDBList.FirstOrDefault(t => t.HCJCenterName == pLCClient1F.PLCName); var stationList2F = centerEqDBList.FirstOrDefault(t => t.HCJCenterName == pLCClient2F.PLCName); hcjStationInfo toaddress; hcjStationInfo fromaddress; if (task.agv_remark.Contains("铝壳缓存架任务空托回流")) { toaddress = stationList1F.stationInfos.Where(d => d.HCJCode == task.agv_fromaddress).First(); fromaddress = stationList2F.stationInfos.Where(d => d.HCJCode == task.agv_toaddress).First(); } else { fromaddress = stationList2F.stationInfos.Where(d => d.HCJCode == task.agv_fromaddress).First(); toaddress = stationList1F.stationInfos.Where(d => d.HCJCode == task.agv_toaddress).First(); } //起点货架三色灯信号点位 string beginLampYellowDB = fromaddress.WPLCDB[0];//黄灯信号点位 string beginLampGreenDB = fromaddress.WPLCDB[1];//绿灯信号点位 string beginLampRedDB = fromaddress.WPLCDB[2];//红灯信号点位 //终点货架三色灯信号点位 string endLampYellowDB = toaddress.WPLCDB[0];//黄灯信号点位 string endLampGreenDB = toaddress.WPLCDB[1];//绿灯信号点位 string endLampRedDB = toaddress.WPLCDB[2];//红灯信号点位 ModbusPLCClient2F.Write(beginLampYellowDB, true); //黄灯 ModbusPLCClient2F.Write(beginLampGreenDB, false); //绿灯 ModbusPLCClient2F.Write(beginLampRedDB, false); //红灯 ModbusPLCClient1F.Write(endLampYellowDB, true); //黄灯 ModbusPLCClient1F.Write(endLampGreenDB, false); //绿灯 ModbusPLCClient1F.Write(endLampRedDB, false); //红灯 fromStation.LampRed = false; fromStation.LampGreen = false; fromStation.LampYellow = true; fromStation.task = true; fromStation.lastUpdateTime = DateTime.Now; toStation.LampRed = false; toStation.LampGreen = false; toStation.LampYellow = true; toStation.task = true; toStation.lastUpdateTime = DateTime.Now; } freeDB.Update(fromStation) .UpdateColumns(t => new { t.LampRed, t.LampGreen, t.LampYellow, t.task, t.lastUpdateTime }) .ExecuteAffrows(); freeDB.Update(toStation) .UpdateColumns(t => new { t.LampRed, t.LampGreen, t.LampYellow, t.task, t.lastUpdateTime }) .ExecuteAffrows(); } else { PLCClient pLCClient1F = WCSService.Clients.Find(V => V.PLCName.Equals(PLCConst.PLCName1FLKHCJ)); if (pLCClient1F != null) { ModbusTcpNet ModbusPLCClient1F = pLCClient1F.ModbusPLCClient.ModbusTcpNetClient; var stationList1F = centerEqDBList.FirstOrDefault(t => t.HCJCenterName == pLCClient1F.PLCName); var toaddress = stationList1F.stationInfos.Where(d => d.HCJCode == task.agv_toaddress).First(); var fromaddress = stationList1F.stationInfos.Where(d => d.HCJCode == task.agv_fromaddress).First(); //起点货架三色灯信号点位 string beginLampYellowDB = fromaddress.WPLCDB[0];//黄灯信号点位 string beginLampGreenDB = fromaddress.WPLCDB[1];//绿灯信号点位 string beginLampRedDB = fromaddress.WPLCDB[2];//红灯信号点位 //终点货架三色灯信号点位 string endLampYellowDB = toaddress.WPLCDB[0];//黄灯信号点位 string endLampGreenDB = toaddress.WPLCDB[1];//绿灯信号点位 string endLampRedDB = toaddress.WPLCDB[2];//红灯信号点位 ModbusPLCClient1F.Write(beginLampYellowDB, true); //黄灯 ModbusPLCClient1F.Write(beginLampGreenDB, false); //绿灯 ModbusPLCClient1F.Write(beginLampRedDB, false); //红灯 ModbusPLCClient1F.Write(endLampYellowDB, true); //黄灯 ModbusPLCClient1F.Write(endLampGreenDB, false); //绿灯 ModbusPLCClient1F.Write(endLampRedDB, false); //红灯 fromStation.LampRed = false; fromStation.LampGreen = false; fromStation.LampYellow = true; fromStation.task = true; fromStation.lastUpdateTime = DateTime.Now; toStation.LampRed = false; toStation.LampGreen = false; toStation.LampYellow = true; toStation.task = true; toStation.lastUpdateTime = DateTime.Now; } freeDB.Update(fromStation) .UpdateColumns(t => new { t.LampRed, t.LampGreen, t.LampYellow, t.task, t.lastUpdateTime }) .ExecuteAffrows(); freeDB.Update(toStation) .UpdateColumns(t => new { t.LampRed, t.LampGreen, t.LampYellow, t.task, t.lastUpdateTime }) .ExecuteAffrows(); } } } } }