using iWareSda_QQJF.RgvModel; using iWareSda_QQJF.RGV.RgvModel; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using Newtonsoft.Json; using logtxtWrite; using System.Threading; using iWareSda_QQJF.WCSNEW.EDM; namespace iWareSda_QQJF.RGV.RgvService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“RgvService”。 public class RgvService : IRgvService { List oldHandShake = new List { 0, 0, 0, 0 }; List times = new List { 0, 0, 0, 0 }; /// 发送RGV任务 /// /// /// /// /// /// /// /// public int SendRgvTask(int deviceId = 0, int taskId = 0, int sourcePlace = 0, int toPlace = 0, int taskType = 0, int palletType = 0, int fatherid = 0) { if (deviceId < 1 || deviceId > 4 || taskId < 1 || sourcePlace < 1 || toPlace < 1 || taskType > 2 || taskType < 1) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvTask(RGV发送任务)/ deviceId:" + deviceId.ToString() + "taskId" + taskId.ToString() + "sourcePlace" + sourcePlace.ToString() + "toPlace" + toPlace.ToString() + "taskType" + taskType.ToString() , 0); return 0; } try { FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].rgvNoW, deviceId); FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].taskIdW, taskId); FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].endPosW, toPlace); FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].palletType, palletType); FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].rgvfatheridW, fatherid); if (taskType == 1) { FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].starPosW, sourcePlace); FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].cmdW, taskType); } else { FormMain.rgvgs[deviceId - 1].WriteValuePoint(FormMain.rgvDBs[deviceId - 1].cmdW, taskType); } logtxt.txtWrite("类名:RgvService/函数名:SendRgvTask(RGV发送任务)/ deviceId:" + deviceId.ToString() + "taskId" + taskId.ToString() + "sourcePlace" + sourcePlace.ToString() + "toPlace" + toPlace.ToString() + "taskType" + taskType.ToString() , 1); } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvTask(RGV发送任务)/ deviceId:" + deviceId.ToString() + "taskId" + taskId.ToString() + "sourcePlace" + sourcePlace.ToString() + "toPlace" + toPlace.ToString() + "taskType" + taskType.ToString() + logtxt.oneRow(ex.ToString()), 2); return 2; } return 1; } /// 发送立库Rgv任务删除,参数:rgvId--Rgv编号) /// /// /// /// public int SendRgvDelete(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvDelete(删除任务)/rgvId:" + rgvId.ToString(), 0); return 0; } try { FormMain.rgvgs[rgvId - 1].WriteValuePoint(FormMain.rgvDBs[rgvId - 1].cmdW, 3); logtxt.txtWrite("类名:RgvService/函数名:SendRgvDelete(删除任务)/ rgvId:" + rgvId.ToString(), 1); } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvDelete(删除任务)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return 0; } return 1; } ///// ///// 关联删除 ///// ///// ///// //public int SendRgvDeleteAll(int rgvId) //{ // List tranDoingId = new List(); // List rgvDoingId = new List(); // List srmDoingId = new List(); // int rgvTaskId = Rgv_CacheEntity.Rgvs[rgvId - 1].taskId; // //删除未执行的任务和删除已执行的任务 // bool result = WCS.Helper.DeleteAllByRgvTaskId(rgvTaskId, out tranDoingId, out rgvDoingId, out srmDoingId); // //删除设备任务 // foreach (var i in rgvDoingId) // { // SendRgvDelete(i); // } // foreach (var i in tranDoingId) // { // SRMTRAN.SrmTranService.SrmTranService srv = new SRMTRAN.SrmTranService.SrmTranService(); // srv.SendTranDelete(i); // } // foreach (var i in srmDoingId) // { // SRM.SrmService.SrmService srv = new SRM.SrmService.SrmService(); // srv.SendSrmDelete(i); // } // if (result) // { // return 1; // } // else // { // return 0; // } //} /// 发送立库Rgv解警,参数:rgvId--Rgv编号) /// /// /// public int SendRgvRlsAlert(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvRlsAlert(RGV解警)/rgvId:" + rgvId.ToString(), 0); return 0; } try { FormMain.rgvgs[rgvId - 1].WriteValuePoint(FormMain.rgvDBs[rgvId - 1].resetW, 1); logtxt.txtWrite("类名:RgvService/函数名:SendRgvRlsAlert(RGV解警)/rgvId:" + rgvId.ToString(), 1); } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvRlsAlert(RGV解警)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return 0; } return 1; } /// 发送Rgv任务完成确认,参数:rgvId--Rgv编号) /// /// /// /// public bool SendRgvFinishConfirm(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvFinishConfirm(任务确认)/rgvId:" + rgvId.ToString(), 0); return false; } try { FormMain.rgvgs[rgvId - 1].WriteValuePoint(FormMain.rgvDBs[rgvId - 1].ackTaskFinishW, 1); logtxt.txtWrite("类名:RgvService/函数名:SendRgvFinishConfirm(任务确认)/rgvId:" + rgvId.ToString(), 1); } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvFinishConfirm(任务确认)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return false; } return true; } /// /// 获取RGV当前坐标 /// /// /// public long GetRgvPosation(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:GetRgvPos(返回RGV状态)/rgvId:" + rgvId.ToString(), 0); return 0; } try { Rgv_CacheEntity.Rgvs[rgvId - 1].posation = Rgv_CacheEntity.Rgvs[rgvId - 1].posation; } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:GetRgvPos(返回RGV状态)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return 0; } return Rgv_CacheEntity.Rgvs[rgvId - 1].posation; } /// 根据RgvEntity 数据结构获取当前设备号对应的设备信息 /// /// /// /// public string GetRgvInfo(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:GetRgvInfo(返回RGV状态)/rgvId:" + rgvId.ToString(), 0); return "ID号超出范围"; } EntityRgvView rgv = new EntityRgvView(); //中间显示类转换任务ID try { rgv.RgvName = Rgv_CacheEntity.Rgvs[rgvId - 1].RgvName; rgv.Rgvid = Rgv_CacheEntity.Rgvs[rgvId - 1].Rgvid; rgv.getFinish = Rgv_CacheEntity.Rgvs[rgvId - 1].getFinish; rgv.putFinish = Rgv_CacheEntity.Rgvs[rgvId - 1].putFinish; rgv.onLine = Rgv_CacheEntity.Rgvs[rgvId - 1].onLine; rgv.ararm = Rgv_CacheEntity.Rgvs[rgvId - 1].ararm; rgv.taskFinish = Rgv_CacheEntity.Rgvs[rgvId - 1].taskFinish; rgv.loaded = Rgv_CacheEntity.Rgvs[rgvId - 1].loaded; rgv.alarmCode = Rgv_CacheEntity.Rgvs[rgvId - 1].alarmCode; rgv.state = Rgv_CacheEntity.Rgvs[rgvId - 1].state; rgv.pos = Rgv_CacheEntity.Rgvs[rgvId - 1].pos; rgv.deviceTaskId = Rgv_CacheEntity.Rgvs[rgvId - 1].taskId; rgv.taskId = Rgv_CacheEntity.Rgvs[rgvId - 1].taskId; rgv.handShake = Rgv_CacheEntity.Rgvs[rgvId - 1].handShake; rgv.posation = Rgv_CacheEntity.Rgvs[rgvId - 1].posation; rgv.total = Rgv_CacheEntity.Rgvs[rgvId - 1].total; rgv.useful = Rgv_CacheEntity.Rgvs[rgvId - 1].useful; using (Model edm = new Model()) { if (rgv.taskId != 0) { rgv.taskId = edm.RgvTask.OrderByDescending(x => x.ID).FirstOrDefault(x => (x.ID % 32767) + 1 == rgv.taskId).TASK_TASK.ID; } } } catch { } return JsonConvert.SerializeObject(rgv); } /// /// 更新PLC数据 /// /// public void ReadPlc(int rgvId) { try { Rgv_CacheEntity.Rgvs[rgvId - 1].handShake = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].handShskeR)); if (Rgv_CacheEntity.Rgvs[rgvId - 1].handShake == oldHandShake[rgvId - 1]) { times[rgvId - 1]++; } else { times[rgvId - 1] = 0; } if (times[rgvId - 1] > 3) { //断线重连 FormMain.rgvgs[rgvId - 1].Close(); Thread.Sleep(1000); FormMain.rgvgs[rgvId - 1].Open(); } oldHandShake[rgvId - 1] = Rgv_CacheEntity.Rgvs[rgvId - 1].handShake; if (FormMain.rgvgs[rgvId - 1].IsConnected) { int getFinish = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].getFinishR)); int putFinish = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].putFinishR)); int onLine = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].onLineR)); int ararm = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].alarmR)); int taskFinish = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].taskFinishR)); int loaded = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].loadedR)); int alarmCode = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].alarmCodeR)); int state = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].stateR)); int pos = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].posR)); int taskId = Convert.ToInt32(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].taskIdR)); long posation = Convert.ToInt64(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].posationR)); long total = Convert.ToInt64(FormMain.rgvgs[rgvId - 1].ReadValuePoint(FormMain.rgvDBs[rgvId - 1].totalR)); //校验信号 long myTotal = getFinish + putFinish + onLine + ararm + taskFinish + loaded + alarmCode + state + pos + taskId + posation + rgvId ; if (total == myTotal) { //信号无误则统一赋值 Rgv_CacheEntity.Rgvs[rgvId - 1].getFinish = getFinish; Rgv_CacheEntity.Rgvs[rgvId - 1].putFinish = putFinish; Rgv_CacheEntity.Rgvs[rgvId - 1].onLine = onLine; Rgv_CacheEntity.Rgvs[rgvId - 1].ararm = ararm; Rgv_CacheEntity.Rgvs[rgvId - 1].taskFinish = taskFinish; Rgv_CacheEntity.Rgvs[rgvId - 1].loaded = loaded; Rgv_CacheEntity.Rgvs[rgvId - 1].alarmCode = alarmCode; Rgv_CacheEntity.Rgvs[rgvId - 1].state = state; Rgv_CacheEntity.Rgvs[rgvId - 1].pos = pos; Rgv_CacheEntity.Rgvs[rgvId - 1].taskId = taskId; //Rgv_CacheEntity.Rgvs[rgvId - 1].handShake = handShake; Rgv_CacheEntity.Rgvs[rgvId - 1].posation = posation; } } } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:GetRgvInfo(返回RGV状态)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); } } /// /// 设备是否故障(或者非自动) /// /// /// public bool IsRgvAlert(int rgvId) { //GetRgvInfo(rgvId); if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:IsRgvAlert(返回RGV状态)/rgvId:" + rgvId.ToString(), 0); return false; } try { int onLine = Rgv_CacheEntity.Rgvs[rgvId - 1].onLine; int ararm = Rgv_CacheEntity.Rgvs[rgvId - 1].ararm; if (onLine == 3 && ararm == 0) { return false; } else { return true; } } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:IsRgvAlert(返回RGV状态)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return true; } } /// /// RGV是否被禁用(可用) /// /// /// public bool IsRgvUseful(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:IsRgvUseful(返回RGV状态)/rgvId:" + rgvId.ToString(), 0); return true;//默认可用 } try { bool useful = Rgv_CacheEntity.Rgvs[rgvId - 1].useful; return useful; } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:IsRgvUseful(返回RGV状态)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return true; } } public bool IsRgvReady(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:IsRgvReady(返回RGV状态)/rgvId:" + rgvId.ToString(), 0); return false; } try { int onLine = Rgv_CacheEntity.Rgvs[rgvId - 1].onLine; int ararm = Rgv_CacheEntity.Rgvs[rgvId - 1].ararm; int state = Rgv_CacheEntity.Rgvs[rgvId - 1].state; int taskFinish = Rgv_CacheEntity.Rgvs[rgvId - 1].taskFinish; int load = Rgv_CacheEntity.Rgvs[rgvId - 1].loaded; bool useful = Rgv_CacheEntity.Rgvs[rgvId - 1].useful; if (onLine == 3 && ararm == 0 && state == 0 && taskFinish == 0 && load == 0 && useful) { return true; } else { return false; } } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:IsRgvReady(返回RGV状态)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return false; } } /// 任务是否完成 /// /// /// /// public bool IsTaskFinish(int rgvId) { //GetRgvInfo(rgvId); int taskFinishR = Rgv_CacheEntity.Rgvs[rgvId - 1].taskFinish; int onLine = Rgv_CacheEntity.Rgvs[rgvId - 1].onLine; if (onLine != 3) { return false; } if (rgvId < 1 || rgvId > 4 || taskFinishR != 1) { logtxt.txtWrite("类名:RgvService/函数名:IsTaskFinish(是否完成)/rgvId:" + rgvId.ToString(), 0); return false; } return true; } /// /// 获取任务完成编号 /// /// /// public int FinishTask(int rgvId) { //GetRgvInfo(rgvId); int taskid = Rgv_CacheEntity.Rgvs[rgvId - 1].taskId; return taskid; } /// 急停 /// /// /// public int SendRgvStop(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvStop(RGV急停)/rgvId:" + rgvId.ToString(), 0); return 0; } try { FormMain.rgvgs[rgvId - 1].WriteValuePoint(FormMain.rgvDBs[rgvId - 1].estopW, 1); logtxt.txtWrite("类名:RgvService/函数名:SendRgvStop(RGV急停)/rgvId:" + rgvId.ToString(), 1); } catch (Exception ex) { logtxt.txtWrite("类名:RgvService/函数名:SendRgvStop(RGV急停)/rgvId:" + rgvId.ToString() + logtxt.oneRow(ex.ToString()), 2); return 0; } return 1; } /// /// 切换RGV可用状态 /// /// public bool ChangeUseful(int rgvId) { if (rgvId < 1 || rgvId > 4) { logtxt.txtWrite("类名:RgvService/函数名:ChangeUseful(RGV切换可用)/rgvId:" + rgvId.ToString(), 0); return false; } Rgv_CacheEntity.Rgvs[rgvId - 1].useful = !Rgv_CacheEntity.Rgvs[rgvId - 1].useful; //同时更新坐标锁定状态 WCSNEW.Helper.ResetTranLocal(rgvId); return true; } } }