using System; using System.Linq; using System.Collections.Generic; using System.ComponentModel; using System.Threading; using VirtualSrm.Cache.Entity; using VirtualSrm.Common.Entity; using VirtualSrm.Properties; using VirtualSrm.Srm.EnumType; using VirtualSrm.Utils; using VirtualSrm.Srm.Strategy; namespace VirtualSrm.Srm.Entity { public class StackerEntity:BindableBase { /// /// 1Srm编号 /// private int wSrmNo = -1; public int WSrmNo { get { return wSrmNo; } set { SetProperty(ref wSrmNo, value); } } /// /// 2运行模式 /// private int wMode = -1; public int WMode { get { return wMode; } set { SetProperty(ref wMode, value); } } /// /// 3告警信号 /// private int wAlarm = -1; public int WAlarm { get { return wAlarm; } set { SetProperty(ref wAlarm, value); } } /// /// 4载货工位是否有货 /// private int wLiftFull = -1; public int WLiftFull { get { return wLiftFull; } set { SetProperty(ref wLiftFull, value); } } /// /// 5当前列 /// private int wPosX = -1; public int WPosX { get { return wPosX; } set { SetProperty(ref wPosX, value); } } /// /// 6当前层 /// private int wPosY = -1; public int WPosY { get { return wPosY; } set { SetProperty(ref wPosY, value); } } /// /// 7货叉位置 /// private int wPosZ = -1; public int WPosZ { get { return wPosZ; } set { SetProperty(ref wPosZ, value); } } /// /// 8当前列坐标 /// private int wPosXmm = -1; public int WPosXmm { get { return wPosXmm; } set { SetProperty(ref wPosXmm, value); } } /// /// 9当前层坐标 /// private int wPosYmm = -1; public int WPosYmm { get { return wPosYmm; } set { SetProperty(ref wPosYmm, value); } } /// /// 10当前货叉坐标 /// private int wPosZmm = -1; public int WPosZmm { get { return wPosZmm; } set { SetProperty(ref wPosZmm, value); } } /// /// 11完成取货信号 /// private int wPickFinish = -1; public int WPickFinish { get { return wPickFinish; } set { SetProperty(ref wPickFinish, value); } } /// /// 12完成放货信号 /// private int wDeliveryFinish = -1; public int WDeliveryFinish { get { return wDeliveryFinish; } set { SetProperty(ref wDeliveryFinish, value); } } /// /// 13任务完成 /// private int wTaskFinish = -1; public int WTaskFinish { get { return wTaskFinish; } set { SetProperty(ref wTaskFinish, value); } } /// /// 14任务号 /// private int wTaskNo = -1; public int WTaskNo { get { return wTaskNo; } set { SetProperty(ref wTaskNo, value); } } /// /// 15运行状态 /// private int wState = -1; public int WState { get { return wState; } set { SetProperty(ref wState, value); } } /// /// 16当前巷道号 /// private int wActualLane = -1; public int WActualLane { get { return wActualLane; } set { SetProperty(ref wActualLane, value); } } /// /// 17告警代码 /// private int wAlarmNumber = -1; public int WAlarmNumber { get { return wAlarmNumber; } set { SetProperty(ref wAlarmNumber, value); } } /// /// 18心跳 /// private int wHandShake = -1; public int WHandShake { get { return wHandShake; } set { SetProperty(ref wHandShake, value); } } /// /// 1Srm编号 /// private int srmNo; public int SrmNo { get { return srmNo; } set { SetProperty(ref srmNo, value); } } /// /// 2任务号 /// private int taskNo; public int TaskNo { get { return taskNo; } set { SetProperty(ref taskNo, value); } } /// /// 3源列 /// private int sourcePosX; public int SourcePosX { get { return sourcePosX; } set { SetProperty(ref sourcePosX, value); } } /// /// 4源层 /// private int sourcePosY; public int SourcePosY { get { return sourcePosY; } set { SetProperty(ref sourcePosY, value); } } /// /// /5源排 /// private int sourcePosZ; public int SourcePosZ { get { return sourcePosZ; } set { SetProperty(ref sourcePosZ, value); } } /// /// 6宿列 /// private int destinationPosX; public int DestinationPosX { get { return destinationPosX; } set { SetProperty(ref destinationPosX, value); } } /// /// 7宿层 /// private int destinationPosY; public int DestinationPosY { get { return destinationPosY; } set { SetProperty(ref destinationPosY, value); } } /// /// 8宿排 /// private int destinationPosZ; public int DestinationPosZ { get { return destinationPosZ; } set { SetProperty(ref destinationPosZ, value); } } /// /// 9发送命令 /// private int command; public int Command { get { return command; } set { SetProperty(ref command, value); } } /// /// 10紧急停止 /// private int emergencyStop; public int EmergencyStop { get { return emergencyStop; } set { SetProperty(ref emergencyStop, value); } } /// /// 11解除告警 /// private int alarmAck; public int AlarmAck { get { return alarmAck; } set { SetProperty(ref alarmAck, value); } } /// /// 12WCS通讯位 /// private int stb; public int Stb { get { return stb; } set { SetProperty(ref stb, value); } } /// ///13SRM 应答位 /// private int ack = -1; public int Ack { get { return ack; } set { SetProperty(ref ack, value); } } /// /// 14心跳 /// private int handShake; public int HandShake { get { return handShake; } set { SetProperty(ref handShake, value); } } /// /// 设备实体 /// public string Name { get; private set;} /// /// WCS需要写入的OPC地址 /// public OpcWriteItem OpcWriteItems { get; set; } /// /// WCS需要读取的OPC地址 /// public OpcReadItem OpcReadItems { get; set; } /// /// 变换心跳的线程 /// private Thread WriteHandShakeThread; public List Tasks { get; private set; } /// /// 构造函数 /// /// 设备实体 public StackerEntity(string name) { this.Name = name; Tasks = new List(); OpcReadItems = new OpcReadItem { SrmNo = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W0" : "S7:[@LOCALSERVER]DB1,W70",// 1Srm编号 TaskNo = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,DINT6422" : "S7:[@LOCALSERVER]DB1,DINT6430",// 2任务号 SourcePosX = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W4" : "S7:[@LOCALSERVER]DB1,W74",// 3源列 SourcePosY = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W6" : "S7:[@LOCALSERVER]DB1,W76",// 4源层 SourcePosZ = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W8" : "S7:[@LOCALSERVER]DB1,W78",//5源排 DestinationPosX = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W10" : "S7:[@LOCALSERVER]DB1,W80",// 6宿列 DestinationPosY = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W12" : "S7:[@LOCALSERVER]DB1,W82",// 7宿层 DestinationPosZ = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W14" : "S7:[@LOCALSERVER]DB1,W84",// 8宿排 Command = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W16" : "S7:[@LOCALSERVER]DB1,W86",// 9发送命令 EmergencyStop = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W18" : "S7:[@LOCALSERVER]DB1,W88",// 10紧急停止 AlarmAck = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W20" : "S7:[@LOCALSERVER]DB1,W90",// 11解除告警 Stb = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W22" : "S7:[@LOCALSERVER]DB1,W92",// 12WCS通讯位 Ack = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W24" : "S7:[@LOCALSERVER]DB1,W94",// 13SRM 应答位 HandShake = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W26" : "S7:[@LOCALSERVER]DB1,W96"// 14心跳 }; OpcWriteItems = new OpcWriteItem { SrmNo = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W28" : "S7:[@LOCALSERVER]DB1,W98",// 1Srm编号 Mode = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W30" : "S7:[@LOCALSERVER]DB1,W100",// 2模式 Alarm = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W32" : "S7:[@LOCALSERVER]DB1,W102",// 3告警 LiftFull = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W34" : "S7:[@LOCALSERVER]DB1,W104",// 4载货工位是否有货 PosX = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W36" : "S7:[@LOCALSERVER]DB1,W106",// 5当前列 PosY = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W38" : "S7:[@LOCALSERVER]DB1,W108",// 6当前层 PosZ = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W40" : "S7:[@LOCALSERVER]DB1,W110", // 7货叉位置 PosXmm = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,DINT42" : "S7:[@LOCALSERVER]DB1,DINT112",// 8当前列坐标 PosYmm = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,DINT46" : "S7:[@LOCALSERVER]DB1,DINT116",// 9当前层坐标 PosZmm = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,DINT50" : "S7:[@LOCALSERVER]DB1,DINT120",// 10当前货叉坐标 PickFinish = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W54" : "S7:[@LOCALSERVER]DB1,W124",// 11完成取货信号 DeliveryFinish = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W56" : "S7:[@LOCALSERVER]DB1,W126",// 12完成放货信号 TaskFinish = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W58" : "S7:[@LOCALSERVER]DB1,W128",// 13任务完成 TaskNo = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,DINT6426" : "S7:[@LOCALSERVER]DB1,DINT6434",// 14当前任务号 State = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W62" : "S7:[@LOCALSERVER]DB1,W132",// 15当前任务执行状态 ActualLane = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W64" : "S7:[@LOCALSERVER]DB1,W134",// 16当前巷道号 AlarmNumber = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W66" : "S7:[@LOCALSERVER]DB1,W136",// 17告警代码 HandShake = name == "stacker1" ? "S7:[@LOCALSERVER]DB1,W68" : "S7:[@LOCALSERVER]DB1,W138"// 18心跳 }; this.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); WriteHandShakeThread = new Thread(new ThreadStart(WriteHandShake)); ThreadHelper.StartThread(WriteHandShakeThread); } /// /// 析构函数 /// ~StackerEntity() { LogTextHelper.WriteLine(Resources.LogDir, "{0}的析构函数别调用", this.Name); ThreadHelper.CloseThread(WriteHandShakeThread); } public void CloseWriteHandShakeThread() { ThreadHelper.CloseThread(WriteHandShakeThread); } /// /// ForkEntity实体属性变化时触发的事件 /// /// /// private void OnPropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "WSrmNo": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.SrmNo,WSrmNo); break; case "WMode": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.Mode, WMode); break; case "WAlarm": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.Alarm, WAlarm); break; case "WLiftFull": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.LiftFull, WLiftFull); break; case "WPosX": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PosX, WPosX); break; case "WPosY": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PosY, WPosY); break; case "WPosZ": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PosZ, WPosZ); break; case "WPosXmm": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PosXmm, WPosXmm); break; case "WPosYmm": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PosYmm, WPosYmm); break; case "WPosZmm": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PosZmm, WPosZmm); break; case "WPickFinish": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.PickFinish, WPickFinish); break; case "WDeliveryFinish": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.DeliveryFinish, WDeliveryFinish); break; case "WTaskFinish": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.TaskFinish, WTaskFinish); break; case "WTaskNo": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.TaskNo, WTaskNo); break; case "WState": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.State, WState); break; case "WActualLane": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.ActualLane, WActualLane); break; case "WAlarmNumber": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.AlarmNumber, WAlarmNumber); break; case "WHandShake": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcWriteItems.HandShake, WHandShake); break; case "Ack": CacheEntity.OpcWcfServiceClient.WriteValue(this.OpcReadItems.Ack, Ack); break; } } /// /// 写入心跳 /// private void WriteHandShake() { while(true) { WHandShake = WHandShake > 999 ? 0 : WHandShake + 1; Thread.Sleep(1000); } } /// /// 接收任务 /// /// public bool ReceiveTask(out string msg) { msg = ""; if(Stb != 1) { msg = string.Format("堆垛机{0}没有接收到任务",Name); return false; } var task = new TaskEntity { SrmNo = this.SrmNo, TaskNo = this.TaskNo, SourcePosX = this.SourcePosX, SourcePosY = this.SourcePosY, SourcePosZ = this.SourcePosZ, DestinationPosX = this.DestinationPosX, DestinationPosY = this.DestinationPosY, DestinationPosZ = this.DestinationPosZ, Command = this.Command, Status = (int)ETaskStatus.未开始 }; this.Ack = 1; while(Stb != 0) { Thread.Sleep(1000); } this.Ack = 0; Tasks.Add(task); return true; } /// /// 执行任务 /// /// /// public bool DoTask(out string msg) { msg = ""; var task = Tasks.FirstOrDefault(x => x.Status == (int)ETaskStatus.未开始); if(task == null) { msg = string.Format("堆垛机{0}没有待执行的任务", this.Name); return false; } this.WSrmNo = task.SrmNo; this.WTaskNo = task.TaskNo; switch(task.Command) { case (int)ESrmCommand.搬运: new Context(new 执行搬运命令(this, task)).Invoke(); break; } return true; } } }