using IWareCC.Properties;
using IWareCommon.Enum.Common;
using IWareCommon.Enum.Rgv;
using IWareCommon.Help;
using S7.Net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace IWareCC.RGV.Entity
{
public class RgvEntity
{
private System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
///
/// Rgv名称
///
public string RgvName { get; set; }
///
/// 设备编号
///
public int DeviceId { get; set; }
///
/// 根据心跳判断堆垛机是否在线
///
public bool IsOnline { get; set; }
///
/// 下线次数
///
public int OffLineTimes { get; set; }
///
/// 上一次心跳数
///
public int LastHandShake { get; set; }
///
/// 连接PLC读的对象
///
public PlcS7 RRGVS71200 { get; set; }
///
/// 连接PLC写的对象
///
public PlcS7 WRGVS71200 { get; set; }
#region 写入设备的信息
///
/// 心跳
///
public int WHandShake { get; set; }
///
/// 设备编号
///
public string WRgvNo { get; set; }
///
/// 急停
///
public bool WEStop { get; set; }
///
/// 起始站点
///
public string WStartPos { get; set; }
///
/// 目标站点
///
public string WEndPos { get; set; }
///
/// 任务号
///
public int WTaskNo { get; set; }
///
/// 任务类型
///
public int WRgvCMD { get; set; }
///
/// 任务完成确认
///
public bool WAckTaskFinish { get; set; }
///
/// 设备复位
///
public bool WReset { get; set; }
///
/// 托盘类型
///
public int WPallType { get; set; }
///
/// 任务下完成信号
///
public bool WStb { get; set; }
#endregion
#region 读取设备的信息
///
/// 心跳
///
public int RHandShake { get; set; }
///
/// Rgv编号
///
public string RRgvNo { get; set; }
///
/// 是否有报警
///
public bool RAlarm { get; set; }
///
/// 报警代码
///
public int RAlarmCode { get; set; }
///
/// 是否有货
///
public bool RLoaded { get; set; }
///
/// 任务完成信号
///
public bool RTaskFinish { get; set; }
///
/// 任务号
///
public int RTaskNo { get; set; }
///
/// 起始站点
///
public int RSPos { get; set; }
///
/// 目标站点
///
public int RTPos { get; set; }
///
/// Rgv位置
///
public int RRgvPosition { get; set; }
///
/// Rgv状态
///
public int RState { get; set; }
///
/// Rgv模式
///
public int RMode { get; set; }
///
/// 任务接收成功信号
///
public bool RAck { get; set; }
#endregion
public OpcReadItem OpcReadItems { get; set; }
public OpcWriteItem OpcWriteItems { get; set; }
public RgvEntity() { }
public RgvEntity(string rgvName, int deviceId, PlcS7 plc)
{
this.RgvName = rgvName;
this.DeviceId = deviceId;
this.RRgvNo = deviceId.ToString();
this.WRgvNo = deviceId.ToString();
this.WRGVS71200 = plc;
OpcWriteItems = new OpcWriteItem
{
HandShake = "DB601.DBX8.4",
EStop = "DB601.DBX8.0",
StartPos = "DB601.DBW4",
EndPos = "DB601.DBW6",
TaskNo = "DB601.DBD0",
AckTaskFinish = "DB601.DBX8.3",
Reset = "DB601.DBX8.1",
Stb = "DB601.DBX8.2",
PallType = "DB601.DBW10"
};
OpcReadItems = new OpcReadItem
{
HandShake = "DB600.DBW0",
Alarm = "DB600.DBX8.0",
AlarmCode = "DB600.DBW10",
Loaded = "DB600.DBX4.0",
TaskFinish = "DB600.DBX24.1",
TaskNo = "DB600.DBD12",
SPos = "DB600.DBD16",
TPos = "DB600.DBD20",
RgvPosition = "DB600.DBD26",
State = "DB600.DBW6",
Mode = "DB600.DBW2",
Ack = "DB600.DBX24.0"
};
}
///
/// Rgv任务发送
///
///
///
///
///
///
///
///
public bool SendTask(int deviceId, int taskId, string sourcePlce, string toPlace, int pallType, out string msg)
{
try
{
msg = "";
if (!CanSendTask(deviceId, out msg))
{
return false;
}
bool b2 = this.WriteValue(this.OpcWriteItems.StartPos, sourcePlce);
bool b3 = this.WriteValue(this.OpcWriteItems.EndPos, toPlace);
bool b1 = this.WriteValue(this.OpcWriteItems.TaskNo, taskId);
bool b4 = this.WriteValue(this.OpcWriteItems.PallType, pallType);
bool b5 = this.WriteValue(this.OpcWriteItems.Stb, 1);
if (!(b1 && b2 && b3 && b4 && b5))
{
msg = "写入OPC失败";
return false;
}
return true;
}
catch (Exception ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "SendTask", msg);
return false;
}
}
///
/// 取消报警
///
///
///
///
public bool ResolveRGV(int deviceId, out string msg)
{
try
{
msg = "";
bool confirm_flag = this.WriteValue(this.OpcWriteItems.Reset, true);
if (!confirm_flag)
{
msg = string.Format("向RGV{0}复位失败", RgvName);
return false;
}
return true;
}
catch (Exception ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "ClearAlarm", msg);
return false;
}
}
///
/// 任务删除
///
///
///
///
///
public bool DeleteTask(int deviceId, int taskId, out string msg)
{
try
{
msg = "";
//if (this.RTaskNo != taskId)
//{
// msg = string.Format("RGV当前非执行taskId={0}的任务", taskId);
// return false;
//}
//bool b1 = this.WriteValue(this.OpcWriteItems.TaskNo, taskId);
bool b2 = this.WriteValue(this.OpcWriteItems.Reset, 1);
if (!(b2))
{
msg = string.Format("写入OPC失败", RgvName);
return false;
}
return true;
}
catch (Exception ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "DeleteTask", msg);
return false;
}
}
///
/// 急停
///
///
///
///
public bool EmergencyStop(int deviceId, out string msg)
{
try
{
msg = "";
bool flag = this.WriteValue(this.OpcWriteItems.EStop, 1);
if (!flag)
{
msg = string.Format("向RGV{0}写入急停指令失败", RgvName);
return false;
}
return true;
}
catch (Exception ex)
{
msg = ex.Message;
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "EmergencyStop", msg);
return false;
}
}
///
/// 是否可以发送任务
///
///
///
///
///
public bool CanSendTask(int deviceId, out string msg)
{
msg = "";
if (!IsOnline)
{
msg = "已离线";
return false;
}
if (RMode != (int)ERgvMode.连机自动模式)
{
msg = "当前非自动模式";
return false;
}
if (RState != (int)ERgvState.空闲)
{
msg = "设备状态非空闲,无法执行其他任务";
return false;
}
return true;
}
public bool WriteValue(string addr, object value)
{
string msg = string.Empty;
if (!string.IsNullOrEmpty(addr))
{
try
{
if (!this.WRGVS71200.IsConnected)
{
this.WRGVS71200.Close();
Thread.Sleep(100);
this.WRGVS71200.Open();
}
msg = this.WRGVS71200.Write(addr, value).ToString();
if (msg != "NoError")
{
string msg1 = this.WRGVS71200.Write(addr, value).ToString();
if (msg1 != "NoError")
{
this.WRGVS71200.Close();
Thread.Sleep(100);
this.WRGVS71200.Open();
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), this.RgvName + "WriteValue" + addr, msg);
return false;
}
else
{
return true;
}
}
else
{
return true;
}
}
catch
{
msg = addr + "写入失败 ";
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), this.RgvName + "WriteValue", msg);
return false;
}
}
else
{
msg = addr + "写入失败 ";
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), this.RgvName + "WriteValue", msg);
return false;
}
}
public object ReadValuePoint(string add)
{
try
{
if (!this.WRGVS71200.IsConnected)
{
this.WRGVS71200.Close();
Thread.Sleep(100);
this.WRGVS71200.Open();
}
object MyPlcData = this.WRGVS71200.Read(add);
if (MyPlcData.ToString() == "WrongVarFormat" || MyPlcData.ToString() == "10")
{
MyPlcData = this.WRGVS71200.Read(add);
if (MyPlcData.ToString() == "WrongVarFormat" || MyPlcData.ToString() == "10")
{
MyPlcData = this.WRGVS71200.Read(add);
}
}
return MyPlcData;
}
catch (Exception ex)
{
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), this.RgvName + "ReadValuePoint", ex.Message);
return 0;
}
}
}
}