using System;
|
using System.Threading;
|
using System.Windows.Forms;
|
using VirtualSrm.Cache.Entity;
|
using VirtualSrm.Properties;
|
using VirtualSrm.Srm.Entity;
|
using VirtualSrm.Srm.EnumType;
|
using VirtualSrm.Utils;
|
|
namespace VirtualSrm.View.Srm
|
{
|
public partial class StackerForm : Form
|
{
|
private StackerEntity Stacker;
|
|
private Thread GetStackerStateThread;
|
|
private Thread ReceiveTaskThread;
|
|
private Thread DoTaskThread;
|
|
private Thread AlarmAckThread;
|
|
public StackerForm(string name)
|
{
|
Stacker = new StackerEntity(name);
|
|
Stacker.WSrmNo = name == "stacker1" ? 1 : 2; ;
|
Stacker.WMode = (int)ESrmMode.自动模式;
|
Stacker.WAlarm = 0;
|
Stacker.WLiftFull = 0;
|
Stacker.WPosX = 0;
|
Stacker.WPosY = 0;
|
Stacker.WPosZ = 0;
|
Stacker.WPosXmm = 0;
|
Stacker.WPosYmm = 0;
|
Stacker.WPosZmm = 0;
|
Stacker.WPickFinish = 0;
|
Stacker.WDeliveryFinish = 0;
|
Stacker.WTaskFinish = 0;
|
Stacker.WTaskNo = 0;
|
Stacker.WState = (int)ESrmState.堆垛机空闲;
|
Stacker.WActualLane = name == "stacker1" ? 1 : 2;
|
Stacker.WAlarmNumber = 0;
|
Stacker.WHandShake = 0;
|
Stacker.Ack = 0;
|
|
CacheEntity.OpcWcfServiceClient.WriteValues(new string[] { Stacker.OpcReadItems.SrmNo, Stacker.OpcReadItems.TaskNo, Stacker.OpcReadItems.Stb,
|
Stacker.OpcReadItems.SourcePosX, Stacker.OpcReadItems.SourcePosY, Stacker.OpcReadItems.SourcePosZ,
|
Stacker.OpcReadItems.DestinationPosX, Stacker.OpcReadItems.DestinationPosY, Stacker.OpcReadItems.DestinationPosZ,
|
Stacker.OpcReadItems.Command, Stacker.OpcReadItems.EmergencyStop, Stacker.OpcReadItems.AlarmAck
|
}, new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
|
|
InitializeComponent();
|
}
|
|
private void StackerForm_Load(object sender, EventArgs e)
|
{
|
CheckForIllegalCrossThreadCalls = false;
|
this.Text = Stacker.Name;
|
|
this.tbSrmNo.DataBindings.Add("Text",Stacker,"SrmNo");
|
this.tbTaskNo.DataBindings.Add("Text", Stacker, "TaskNo");
|
this.tbSourcePosZ.DataBindings.Add("Text", Stacker, "SourcePosZ");
|
this.tbSourcePosX.DataBindings.Add("Text", Stacker, "SourcePosX");
|
this.tbSourcePosY.DataBindings.Add("Text", Stacker, "SourcePosY");
|
this.tbDestinationPosZ.DataBindings.Add("Text", Stacker, "DestinationPosZ");
|
this.tbDestinationPosX.DataBindings.Add("Text", Stacker, "DestinationPosX");
|
this.tbDestinationPosY.DataBindings.Add("Text", Stacker, "DestinationPosY");
|
this.tbCommand.DataBindings.Add("Text", Stacker, "Command");
|
this.tbEmergencyStop.DataBindings.Add("Text", Stacker, "EmergencyStop");
|
this.tbAlarmAck.DataBindings.Add("Text", Stacker, "AlarmAck");
|
this.tbStb.DataBindings.Add("Text", Stacker, "Stb");
|
this.tbAck.DataBindings.Add("Text", Stacker, "Ack");
|
this.tbHandShake.DataBindings.Add("Text", Stacker, "HandShake");
|
|
this.tbWSrmNo.DataBindings.Add("Text", Stacker, "WSrmNo");
|
this.tbWMode.DataBindings.Add("Text", Stacker, "WMode");
|
this.tbWAlarm.DataBindings.Add("Text", Stacker, "WAlarm");
|
this.tbWLiftFull.DataBindings.Add("Text", Stacker, "WLiftFull");
|
this.tbWPosX.DataBindings.Add("Text", Stacker, "WPosX");
|
this.tbWPosY.DataBindings.Add("Text", Stacker, "WPosY");
|
this.tbWPosZ.DataBindings.Add("Text", Stacker, "WPosZ");
|
this.tbWPosXmm.DataBindings.Add("Text", Stacker, "WPosXmm");
|
this.tbWPosYmm.DataBindings.Add("Text", Stacker, "WPosYmm");
|
this.tbWPosZmm.DataBindings.Add("Text", Stacker, "WPosZmm");
|
this.tbWPickFinish.DataBindings.Add("Text", Stacker, "WPickFinish");
|
this.tbWDeliveryFinish.DataBindings.Add("Text", Stacker, "WDeliveryFinish");
|
this.tbWTaskFinish.DataBindings.Add("Text", Stacker, "WTaskFinish");
|
this.tbWTaskNo.DataBindings.Add("Text", Stacker, "WTaskNo");
|
this.tbWState.DataBindings.Add("Text", Stacker, "WState");
|
this.tbWActualLane.DataBindings.Add("Text", Stacker, "WActualLane");
|
this.tbWAlarmNumber.DataBindings.Add("Text", Stacker, "WAlarmNumber");
|
this.tbWHandShake.DataBindings.Add("Text", Stacker, "WHandShake");
|
|
|
GetStackerStateThread = new Thread(new ThreadStart(GetStackerState));
|
ThreadHelper.StartThread(GetStackerStateThread);
|
|
ReceiveTaskThread = new Thread(new ThreadStart(ReceiveTask));
|
ThreadHelper.StartThread(ReceiveTaskThread);
|
|
DoTaskThread = new Thread(new ThreadStart(DoTask));
|
ThreadHelper.StartThread(DoTaskThread);
|
|
AlarmAckThread = new Thread(new ThreadStart(AlarmAck));
|
ThreadHelper.StartThread(AlarmAckThread);
|
}
|
|
private void StackerForm_FormClosing(object sender, FormClosingEventArgs e)
|
{
|
ThreadHelper.CloseThread(GetStackerStateThread);
|
ThreadHelper.CloseThread(ReceiveTaskThread);
|
ThreadHelper.CloseThread(DoTaskThread);
|
ThreadHelper.CloseThread(AlarmAckThread);
|
if(Stacker != null)
|
{
|
Stacker.CloseWriteHandShakeThread();
|
//Stacker = null;
|
// GC.Collect();
|
}
|
|
}
|
|
/// <summary>
|
/// 获取每个堆垛机状态
|
/// </summary>
|
/// <param name="stacker">需要获取状态的堆垛机</param>
|
private void GetStackerState()
|
{
|
var items = new string[]
|
{
|
//Stacker.OpcWriteItems.SrmNo,// 1Srm编号
|
//Stacker.OpcWriteItems.Mode,// 2任务号
|
//Stacker.OpcWriteItems.Alarm,// 3告警
|
//Stacker.OpcWriteItems.LiftFull, // 4载货工位是否有货
|
//Stacker.OpcWriteItems.PosX,// 5当前列
|
//Stacker.OpcWriteItems.PosY,// 6当前层
|
//Stacker.OpcWriteItems.PosZ,//7货叉位置
|
//Stacker.OpcWriteItems.PosXmm,// 8当前列坐标
|
//Stacker.OpcWriteItems.PosYmm,// 9当前层坐标
|
//Stacker.OpcWriteItems.PosZmm,// 10当前货叉标
|
//Stacker.OpcWriteItems.PickFinish,// 11完成取货信号
|
//Stacker.OpcWriteItems.DeliveryFinish,//// 12完成放货信号
|
//Stacker.OpcWriteItems.TaskFinish,// 13任务完成
|
//Stacker.OpcWriteItems.TaskNo,// 14当前任务号
|
//Stacker.OpcWriteItems.State,// 15当前任务执行状态
|
//Stacker.OpcWriteItems.ActualLane,// 16当前巷道号
|
//Stacker.OpcWriteItems.AlarmNumber,// 17告警代码
|
//Stacker.OpcWriteItems.HandShake,// 18心跳
|
|
Stacker.OpcReadItems.SrmNo,// 1Srm编号
|
Stacker.OpcReadItems.TaskNo,// 2任务号
|
Stacker.OpcReadItems.SourcePosX,// 3源列
|
Stacker.OpcReadItems.SourcePosY,// 4源层
|
Stacker.OpcReadItems.SourcePosZ,//5源排
|
Stacker.OpcReadItems.DestinationPosX,// 6宿列
|
Stacker.OpcReadItems.DestinationPosY,// 7宿层
|
Stacker.OpcReadItems.DestinationPosZ,// 8宿排
|
Stacker.OpcReadItems.Command,// 9发送命令
|
Stacker.OpcReadItems.EmergencyStop,// 10紧急停止
|
Stacker.OpcReadItems.AlarmAck,// 11解除告警
|
Stacker.OpcReadItems.Stb,// 12WCS通讯
|
//Stacker.OpcReadItems.Ack,// 13SRM 应答位
|
Stacker.OpcReadItems.HandShake// 14心跳
|
};
|
while (true)
|
{
|
try
|
{
|
var opcs = CacheEntity.OpcWcfServiceClient.ReadValues(items);
|
if (opcs == null || opcs.Length <= 0)
|
{
|
Thread.Sleep(1000);
|
continue;
|
}
|
var i = 0;
|
//Stacker.WSrmNo = int.Parse(opcs[i++].ToString());
|
//Stacker.WMode = int.Parse(opcs[i++].ToString());
|
//Stacker.WAlarm = int.Parse(opcs[i++].ToString());
|
//Stacker.WLiftFull = int.Parse(opcs[i++].ToString());
|
//Stacker.WPosX = int.Parse(opcs[i++].ToString());
|
//Stacker.WPosY = int.Parse(opcs[i++].ToString());
|
//Stacker.WPosZ = int.Parse(opcs[i++].ToString());
|
//Stacker.WPosXmm = int.Parse(opcs[i++].ToString());
|
//Stacker.WPosYmm = int.Parse(opcs[i++].ToString());
|
//Stacker.WPosZmm = int.Parse(opcs[i++].ToString());
|
//Stacker.WPickFinish = int.Parse(opcs[i++].ToString());
|
//Stacker.WDeliveryFinish = int.Parse(opcs[i++].ToString());
|
//Stacker.WTaskFinish = int.Parse(opcs[i++].ToString());
|
//Stacker.WTaskNo = int.Parse(opcs[i++].ToString());
|
//Stacker.WState = int.Parse(opcs[i++].ToString());
|
//Stacker.WActualLane = int.Parse(opcs[i++].ToString());
|
//Stacker.WAlarmNumber = int.Parse(opcs[i++].ToString());
|
//Stacker.WHandShake = int.Parse(opcs[i++].ToString());
|
|
Stacker.SrmNo = int.Parse(opcs[i++].ToString());
|
Stacker.TaskNo = int.Parse(opcs[i++].ToString());
|
Stacker.SourcePosX = int.Parse(opcs[i++].ToString());
|
Stacker.SourcePosY = int.Parse(opcs[i++].ToString());
|
Stacker.SourcePosZ = int.Parse(opcs[i++].ToString());
|
Stacker.DestinationPosX = int.Parse(opcs[i++].ToString());
|
Stacker.DestinationPosY = int.Parse(opcs[i++].ToString());
|
Stacker.DestinationPosZ = int.Parse(opcs[i++].ToString());
|
Stacker.Command = int.Parse(opcs[i++].ToString());
|
Stacker.EmergencyStop = int.Parse(opcs[i++].ToString());
|
Stacker.AlarmAck = int.Parse(opcs[i++].ToString());
|
Stacker.Stb = int.Parse(opcs[i++].ToString());
|
//Stacker.Ack = int.Parse(opcs[i++].ToString());
|
Stacker.HandShake = int.Parse(opcs[i++].ToString());
|
}
|
catch (Exception ex)
|
{
|
LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}读取状态失败:{1}", Stacker.Name, ex.Message);
|
}
|
finally
|
{
|
Thread.Sleep(1000);
|
}
|
}
|
}
|
|
private void ReceiveTask()
|
{
|
string msg;
|
while(true)
|
{
|
var flag = Stacker.ReceiveTask(out msg);
|
if (!flag)
|
{
|
//LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务失败:{1}", Stacker.Name, msg);
|
}
|
else
|
{
|
LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务成功:{1}", Stacker.Name, Stacker.TaskNo);
|
}
|
|
Thread.Sleep(1000);
|
}
|
}
|
|
private void DoTask()
|
{
|
string msg;
|
while (true)
|
{
|
var flag = Stacker.DoTask(out msg);
|
if (!flag)
|
{
|
//LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}执行任务失败:{1}", Stacker.Name, msg);
|
}
|
else
|
{
|
LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}执行任务成功:{1}", Stacker.Name, Stacker.TaskNo);
|
}
|
|
Thread.Sleep(1000);
|
}
|
}
|
|
private void AlarmAck()
|
{
|
while (true)
|
{
|
if(Stacker.AlarmAck == 1)
|
{
|
Stacker.WAlarm = 0;
|
Stacker.WAlarmNumber = 0;
|
CacheEntity.OpcWcfServiceClient.WriteValue(Stacker.OpcReadItems.AlarmAck, 0);
|
}
|
|
|
Thread.Sleep(1000);
|
}
|
}
|
|
|
/// <summary>
|
/// 点击告警触发的事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void button1_Click(object sender, EventArgs e)
|
{
|
Stacker.WAlarm = 1;
|
Stacker.WAlarmNumber = int.Parse(tbCode.Text.Trim());
|
|
|
}
|
|
|
|
}
|
}
|