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();
}
}
///
/// 获取每个堆垛机状态
///
/// 需要获取状态的堆垛机
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);
}
}
///
/// 点击告警触发的事件
///
///
///
private void button1_Click(object sender, EventArgs e)
{
Stacker.WAlarm = 1;
Stacker.WAlarmNumber = int.Parse(tbCode.Text.Trim());
}
}
}