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<int> oldHandShake = new List<int> { 0, 0, 0, 0 };
|
List<int> times = new List<int> { 0, 0, 0, 0 };
|
|
/// <summary>发送RGV任务
|
///
|
/// </summary>
|
/// <param name="deviceId"></param>
|
/// <param name="taskId"></param>
|
/// <param name="sourcePlce"></param>
|
/// <param name="toPlace"></param>
|
/// <param name="taskType"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>发送立库Rgv任务删除,参数:rgvId--Rgv编号)
|
///
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <param name="taskId"></param>
|
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;
|
|
}
|
|
///// <summary>
|
///// 关联删除
|
///// </summary>
|
///// <param name="rgvId"></param>
|
///// <returns></returns>
|
//public int SendRgvDeleteAll(int rgvId)
|
//{
|
// List<int> tranDoingId = new List<int>();
|
// List<int> rgvDoingId = new List<int>();
|
// List<int> srmDoingId = new List<int>();
|
|
// 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;
|
// }
|
//}
|
|
/// <summary>发送立库Rgv解警,参数:rgvId--Rgv编号)
|
///
|
/// </summary>
|
/// <param name="rgvId"></param>
|
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;
|
}
|
|
|
/// <summary> 发送Rgv任务完成确认,参数:rgvId--Rgv编号)
|
///
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 获取RGV当前坐标
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>根据RgvEntity 数据结构获取当前设备号对应的设备信息
|
///
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 更新PLC数据
|
/// </summary>
|
/// <param name="rgvId"></param>
|
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);
|
|
}
|
|
}
|
|
/// <summary>
|
/// 设备是否故障(或者非自动)
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// RGV是否被禁用(可用)
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
/// <summary>任务是否完成
|
///
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 获取任务完成编号
|
/// </summary>
|
/// <param name="rgvId"></param>
|
/// <returns></returns>
|
public int FinishTask(int rgvId)
|
{
|
//GetRgvInfo(rgvId);
|
int taskid = Rgv_CacheEntity.Rgvs[rgvId - 1].taskId;
|
return taskid;
|
}
|
|
/// <summary>急停
|
///
|
/// </summary>
|
/// <param name="rgvId"></param>
|
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;
|
}
|
|
/// <summary>
|
/// 切换RGV可用状态
|
/// </summary>
|
/// <returns></returns>
|
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;
|
}
|
}
|
}
|