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; } } } }