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