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
|
{
|
/// <summary>
|
/// 1Srm编号
|
/// </summary>
|
|
private int wSrmNo = -1;
|
|
public int WSrmNo
|
{
|
get { return wSrmNo; }
|
set { SetProperty(ref wSrmNo, value); }
|
}
|
|
/// <summary>
|
/// 2运行模式
|
/// </summary>
|
private int wMode = -1;
|
|
public int WMode
|
{
|
get { return wMode; }
|
set { SetProperty(ref wMode, value); }
|
}
|
|
|
/// <summary>
|
/// 3告警信号
|
/// </summary>
|
|
private int wAlarm = -1;
|
|
public int WAlarm
|
{
|
get { return wAlarm; }
|
set { SetProperty(ref wAlarm, value); }
|
}
|
|
|
/// <summary>
|
/// 4载货工位是否有货
|
/// </summary>
|
private int wLiftFull = -1;
|
|
public int WLiftFull
|
{
|
get { return wLiftFull; }
|
set { SetProperty(ref wLiftFull, value); }
|
}
|
|
|
/// <summary>
|
/// 5当前列
|
/// </summary>
|
private int wPosX = -1;
|
|
public int WPosX
|
{
|
get { return wPosX; }
|
set { SetProperty(ref wPosX, value); }
|
}
|
|
/// <summary>
|
/// 6当前层
|
/// </summary>
|
private int wPosY = -1;
|
|
public int WPosY
|
{
|
get { return wPosY; }
|
set { SetProperty(ref wPosY, value); }
|
}
|
|
|
/// <summary>
|
/// 7货叉位置
|
/// </summary>
|
private int wPosZ = -1;
|
|
public int WPosZ
|
{
|
get { return wPosZ; }
|
set { SetProperty(ref wPosZ, value); }
|
}
|
|
|
/// <summary>
|
/// 8当前列坐标
|
/// </summary>
|
private int wPosXmm = -1;
|
|
public int WPosXmm
|
{
|
get { return wPosXmm; }
|
set { SetProperty(ref wPosXmm, value); }
|
}
|
|
|
/// <summary>
|
/// 9当前层坐标
|
/// </summary>
|
private int wPosYmm = -1;
|
|
public int WPosYmm
|
{
|
get { return wPosYmm; }
|
set { SetProperty(ref wPosYmm, value); }
|
}
|
|
|
/// <summary>
|
/// 10当前货叉坐标
|
/// </summary>
|
private int wPosZmm = -1;
|
|
public int WPosZmm
|
{
|
get { return wPosZmm; }
|
set { SetProperty(ref wPosZmm, value); }
|
}
|
|
|
/// <summary>
|
/// 11完成取货信号
|
/// </summary>
|
private int wPickFinish = -1;
|
|
public int WPickFinish
|
{
|
get { return wPickFinish; }
|
set { SetProperty(ref wPickFinish, value); }
|
}
|
|
|
/// <summary>
|
/// 12完成放货信号
|
/// </summary>
|
private int wDeliveryFinish = -1;
|
|
public int WDeliveryFinish
|
{
|
get { return wDeliveryFinish; }
|
set { SetProperty(ref wDeliveryFinish, value); }
|
}
|
|
|
/// <summary>
|
/// 13任务完成
|
/// </summary>
|
private int wTaskFinish = -1;
|
|
public int WTaskFinish
|
{
|
get { return wTaskFinish; }
|
set { SetProperty(ref wTaskFinish, value); }
|
}
|
|
|
/// <summary>
|
/// 14任务号
|
/// </summary>
|
private int wTaskNo = -1;
|
|
public int WTaskNo
|
{
|
get { return wTaskNo; }
|
set { SetProperty(ref wTaskNo, value); }
|
}
|
|
|
/// <summary>
|
/// 15运行状态
|
/// </summary>
|
private int wState = -1;
|
|
public int WState
|
{
|
get { return wState; }
|
set { SetProperty(ref wState, value); }
|
}
|
|
|
|
/// <summary>
|
/// 16当前巷道号
|
/// </summary>
|
|
private int wActualLane = -1;
|
|
public int WActualLane
|
{
|
get { return wActualLane; }
|
set { SetProperty(ref wActualLane, value); }
|
}
|
|
/// <summary>
|
/// 17告警代码
|
/// </summary>
|
|
private int wAlarmNumber = -1;
|
|
public int WAlarmNumber
|
{
|
get { return wAlarmNumber; }
|
set { SetProperty(ref wAlarmNumber, value); }
|
}
|
|
|
/// <summary>
|
/// 18心跳
|
/// </summary>
|
private int wHandShake = -1;
|
|
public int WHandShake
|
{
|
get { return wHandShake; }
|
set { SetProperty(ref wHandShake, value); }
|
}
|
|
/// <summary>
|
/// 1Srm编号
|
/// </summary>
|
|
private int srmNo;
|
|
public int SrmNo
|
{
|
get { return srmNo; }
|
set { SetProperty(ref srmNo, value); }
|
}
|
|
|
/// <summary>
|
/// 2任务号
|
/// </summary>
|
private int taskNo;
|
|
public int TaskNo
|
{
|
get { return taskNo; }
|
set { SetProperty(ref taskNo, value); }
|
}
|
|
/// <summary>
|
/// 3源列
|
/// </summary>
|
private int sourcePosX;
|
|
public int SourcePosX
|
{
|
get { return sourcePosX; }
|
set { SetProperty(ref sourcePosX, value); }
|
}
|
|
/// <summary>
|
/// 4源层
|
/// </summary>
|
private int sourcePosY;
|
|
public int SourcePosY
|
{
|
get { return sourcePosY; }
|
set { SetProperty(ref sourcePosY, value); }
|
}
|
|
/// <summary>
|
/// /5源排
|
/// </summary>
|
private int sourcePosZ;
|
|
public int SourcePosZ
|
{
|
get { return sourcePosZ; }
|
set { SetProperty(ref sourcePosZ, value); }
|
}
|
|
/// <summary>
|
/// 6宿列
|
/// </summary>
|
private int destinationPosX;
|
|
public int DestinationPosX
|
{
|
get { return destinationPosX; }
|
set { SetProperty(ref destinationPosX, value); }
|
}
|
|
/// <summary>
|
/// 7宿层
|
/// </summary>
|
private int destinationPosY;
|
|
public int DestinationPosY
|
{
|
get { return destinationPosY; }
|
set { SetProperty(ref destinationPosY, value); }
|
}
|
|
|
/// <summary>
|
/// 8宿排
|
/// </summary>
|
private int destinationPosZ;
|
|
public int DestinationPosZ
|
{
|
get { return destinationPosZ; }
|
set { SetProperty(ref destinationPosZ, value); }
|
}
|
|
/// <summary>
|
/// 9发送命令
|
/// </summary>
|
private int command;
|
|
public int Command
|
{
|
get { return command; }
|
set { SetProperty(ref command, value); }
|
}
|
|
/// <summary>
|
/// 10紧急停止
|
/// </summary>
|
private int emergencyStop;
|
|
public int EmergencyStop
|
{
|
get { return emergencyStop; }
|
set { SetProperty(ref emergencyStop, value); }
|
}
|
|
/// <summary>
|
/// 11解除告警
|
/// </summary>
|
private int alarmAck;
|
|
public int AlarmAck
|
{
|
get { return alarmAck; }
|
set { SetProperty(ref alarmAck, value); }
|
}
|
|
/// <summary>
|
/// 12WCS通讯位
|
/// </summary>
|
private int stb;
|
|
public int Stb
|
{
|
get { return stb; }
|
set { SetProperty(ref stb, value); }
|
}
|
|
///<summary>
|
///13SRM 应答位
|
///</summary>
|
private int ack = -1;
|
|
public int Ack
|
{
|
get { return ack; }
|
set { SetProperty(ref ack, value); }
|
}
|
|
|
/// <summary>
|
/// 14心跳
|
/// </summary>
|
private int handShake;
|
|
public int HandShake
|
{
|
get { return handShake; }
|
set { SetProperty(ref handShake, value); }
|
}
|
|
|
/// <summary>
|
/// 设备实体
|
/// </summary>
|
public string Name { get; private set;}
|
|
/// <summary>
|
/// WCS需要写入的OPC地址
|
/// </summary>
|
public OpcWriteItem OpcWriteItems { get; set; }
|
|
|
/// <summary>
|
/// WCS需要读取的OPC地址
|
/// </summary>
|
public OpcReadItem OpcReadItems { get; set; }
|
|
/// <summary>
|
/// 变换心跳的线程
|
/// </summary>
|
private Thread WriteHandShakeThread;
|
|
public List<TaskEntity> Tasks { get; private set; }
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
/// <param name="equipment">设备实体</param>
|
public StackerEntity(string name)
|
{
|
this.Name = name;
|
|
Tasks = new List<TaskEntity>();
|
|
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);
|
}
|
|
/// <summary>
|
/// 析构函数
|
/// </summary>
|
~StackerEntity()
|
{
|
LogTextHelper.WriteLine(Resources.LogDir, "{0}的析构函数别调用", this.Name);
|
ThreadHelper.CloseThread(WriteHandShakeThread);
|
}
|
|
public void CloseWriteHandShakeThread() { ThreadHelper.CloseThread(WriteHandShakeThread); }
|
|
/// <summary>
|
/// ForkEntity实体属性变化时触发的事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 写入心跳
|
/// </summary>
|
private void WriteHandShake()
|
{
|
while(true)
|
{
|
WHandShake = WHandShake > 999 ? 0 : WHandShake + 1;
|
Thread.Sleep(1000);
|
}
|
}
|
|
|
/// <summary>
|
/// 接收任务
|
/// </summary>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 执行任务
|
/// </summary>
|
/// <param name="msg"></param>
|
/// <returns></returns>
|
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;
|
|
}
|
|
}
|
}
|
|
|
|
|
|
|
|