335 lines
14 KiB
C#
335 lines
14 KiB
C#
using MesServerWork;
|
||
using MisDataFunDll;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Threading;
|
||
using System.Xml.Linq;
|
||
|
||
namespace MesServerFunctions
|
||
{
|
||
public partial class FunctionMES
|
||
{
|
||
private readonly object lockFunWork = new object();
|
||
//public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
public void FunWork(string recData)
|
||
{
|
||
|
||
|
||
lock (lockFunWork)
|
||
{
|
||
List<string> dataArray = MisDataFun.GetCmdStringList(recData);
|
||
//string[] dataArray = recData.Split('|');
|
||
//if (dataArray.Count != 4)
|
||
//return;
|
||
//消息来源
|
||
string m_Source = dataArray[0].ToString();
|
||
//消息类型 Barcode
|
||
string m_Command = dataArray[1].ToString();
|
||
//工位号
|
||
string m_OpName = dataArray[2].ToString();
|
||
//消息参数
|
||
string m_Value = dataArray[3].ToString();
|
||
|
||
DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceDriver_BasicData.CustomeEvetnArgs>(m_Value);
|
||
string tagValue;
|
||
string OpName = m_OpName;
|
||
switch (m_Source)
|
||
{
|
||
case "PLC":
|
||
e = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceDriver_BasicData.CustomeEvetnArgs>(m_Value);
|
||
switch (e.TagValue.ToString().ToLower())
|
||
{
|
||
case "false":
|
||
tagValue = "0";
|
||
break;
|
||
case "true":
|
||
tagValue = "1";
|
||
break;
|
||
default:
|
||
tagValue = e.TagValue.ToString();
|
||
break;
|
||
}
|
||
e.TagValue = tagValue;
|
||
switch (e.TagTypeCodeID.ToString())
|
||
{
|
||
// AGV相关变量类型代码处理说明:
|
||
// 301:AGV请求进入
|
||
// 302:AGV器具放置完毕
|
||
// 303:AGV退出光栅
|
||
// 304:送料信息验证完成
|
||
// 305:送料信息验证结果
|
||
// 305:任务发送状态 0 没有 1 发送 2 失败
|
||
// 311:请求叫料
|
||
// 312:请求退空
|
||
// 313:请求退料
|
||
// 314:允许AGV进入
|
||
// 315:允许AGV离开
|
||
// 316:器具码扫描完毕
|
||
// 317:退回并重新配送
|
||
// 318:器具号
|
||
// 319:请求上料机型
|
||
// 320:收到状态反馈点
|
||
// 321:转序
|
||
// 322:下空托盘
|
||
// 323:上空托盘
|
||
// 324:点对点
|
||
// 500:AGV请求下降
|
||
// 501:AGV请求举升
|
||
// 550:允许AGV下降
|
||
// 551:允许AGV举升
|
||
|
||
// 请求叫料
|
||
case "311":
|
||
fun_CallMaterials(e);
|
||
break;
|
||
// 请求退空
|
||
case "312":
|
||
fun_RequestReturns(e);
|
||
break;
|
||
// 请求退料
|
||
case "313":
|
||
fun_RequestReturnMaterial(e);
|
||
break;
|
||
// 允许AGV进入
|
||
case "314":
|
||
fun_AllowAGVEnter(e);
|
||
break;
|
||
// 允许AGV离开
|
||
case "315":
|
||
fun_AllowAGVLeave(e);
|
||
break;
|
||
// 器具码扫描完毕
|
||
case "316":
|
||
fun_ToolCodeScanOver(e);
|
||
break;
|
||
// 退回并重新配送
|
||
case "317":
|
||
fun_ReturnAndRedispatch(e);
|
||
break;
|
||
// 收到任务状态握手
|
||
case "320":
|
||
//MIS_BASE.WritePLC(306, m_OpName, 0);
|
||
break;
|
||
// 转序
|
||
case "321":
|
||
fun_TransferSequence(e);
|
||
break;
|
||
// 下空托盘
|
||
case "322":
|
||
fun_UnloadEmptyTray(e);
|
||
break;
|
||
// 上空托盘
|
||
case "323":
|
||
fun_LoadEmptyTray(e);
|
||
break;
|
||
// 允许AGV下降
|
||
case "550":
|
||
fun_AllowAGVLower(e);
|
||
break;
|
||
// 允许AGV举升
|
||
case "551":
|
||
fun_AllowAGVRaise(e);
|
||
break;
|
||
// AGV插头完成
|
||
case "400":
|
||
break;
|
||
// AGV拔插头完成
|
||
case "401":
|
||
break;
|
||
// MES允许开始磨合
|
||
case "402":
|
||
break;
|
||
// MES反馈磨合结束
|
||
case "403":
|
||
break;
|
||
// 托盘压紧气缸压紧
|
||
case "404":
|
||
if (tagValue == "1") MIS_BASE.WritePLC(405, OpName, false);
|
||
break;
|
||
// 托盘压紧气缸松开
|
||
case "405":
|
||
if (tagValue == "1") MIS_BASE.WritePLC(404, OpName, false);
|
||
break;
|
||
// 插头推靠气缸推靠
|
||
case "406":
|
||
if (tagValue == "1") MIS_BASE.WritePLC(407, OpName, false);
|
||
break;
|
||
// 插头推靠气缸退回
|
||
case "407":
|
||
if (tagValue == "1") MIS_BASE.WritePLC(406, OpName, false);
|
||
break;
|
||
// 自动模式
|
||
case "408":
|
||
if (tagValue == "1") MIS_BASE.WritePLC(409, OpName, false); // 自动掉手动模式
|
||
break;
|
||
// 手动模式
|
||
case "409":
|
||
if (tagValue == "1") MIS_BASE.WritePLC(408, OpName, false); // 自动掉自动模式
|
||
break;
|
||
// 请求上线
|
||
case "450":
|
||
MisDataFun.Rrunning_UpdateOpCallStatus(OpName, Convert.ToInt32(tagValue)); // 更新至数据库库位状态
|
||
break;
|
||
// 请求下线
|
||
case "451":
|
||
break;
|
||
// 请求插插头
|
||
case "452":
|
||
if (tagValue == "1")
|
||
fun_TcsAgvDispatch(e, "插");
|
||
else
|
||
MIS_BASE.WritePLC(400, OpName, false);
|
||
break;
|
||
// 请求拔插头
|
||
case "453":
|
||
if (tagValue == "1")
|
||
fun_TcsAgvDispatch(e, "拔");
|
||
else
|
||
MIS_BASE.WritePLC(401, OpName, false);
|
||
break;
|
||
// 开始磨合
|
||
case "454":
|
||
break;
|
||
// 磨合完成
|
||
case "455":
|
||
break;
|
||
// 推靠气缸原位
|
||
case "456":
|
||
break;
|
||
// 推靠气缸到位
|
||
case "457":
|
||
break;
|
||
// 压紧气缸原位
|
||
case "458":
|
||
break;
|
||
// 压紧气缸到位
|
||
case "459":
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 叫料流程
|
||
// 1.请求叫料 收到请求叫料后 调用叫料接口 后续收到AGV的
|
||
// 2.收到工厂 请求进入接口(工厂未开发 跳过) 发给PLC AGV请求进入
|
||
// 3.收到允许AGV进入 调用接口(未开发 跳过) 允许进入
|
||
// 4.收到 器具码扫码完成 根据318器具号 调用器具号查询接口 得出校验结果
|
||
// 5.若器具码校验通过 调用 确认物料配送接口 调用成功后 给PLC发送 送料信息验证结果(1 合格 2 不合格) 和 送料信息验证完成
|
||
// 6.收到AGV请求离开接口后(未开发 跳过) 发送给PLC请求离开点位
|
||
// 7.收到PLC允许离开信号后 调用AGV允许离开接口(未开发 跳过)
|
||
|
||
// 退空托流程
|
||
// 1.收到请求退空 调用退空托接口
|
||
// 2.如叫料AGV请求进入 请求离开。。。。 只不过不需要扫描器具码部分
|
||
|
||
|
||
// AGV相关方法声明(PLC触发的信号)
|
||
/// <summary>
|
||
/// 请求叫料
|
||
/// </summary>
|
||
public void fun_CallMaterials(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(CallMaterials, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 请求退空
|
||
/// </summary>
|
||
public void fun_RequestReturns(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(RequestReturns, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 请求退料
|
||
/// </summary>
|
||
public void fun_RequestReturnMaterial(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(RequestReturnMaterial, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 允许AGV进入
|
||
/// </summary>
|
||
public void fun_AllowAGVEnter(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(AllowAGVEnter, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 允许AGV离开
|
||
/// </summary>
|
||
public void fun_AllowAGVLeave(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(AllowAGVLeave, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 允许AGV下降
|
||
/// </summary>
|
||
public void fun_AllowAGVLower(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(AllowAGVLower, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 允许AGV举升
|
||
/// </summary>
|
||
public void fun_AllowAGVRaise(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(AllowAGVRaise, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 器具码扫描完毕
|
||
/// </summary>
|
||
public void fun_ToolCodeScanOver(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(ToolCodeScanOver, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 退回并重新配送
|
||
/// </summary>
|
||
public void fun_ReturnAndRedispatch(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(ReturnAndRedispatch, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 转序
|
||
/// </summary>
|
||
public void fun_TransferSequence(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(TransferSequence, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 下空托盘
|
||
/// </summary>
|
||
public void fun_UnloadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(UnloadEmptyTray, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 上空托盘
|
||
/// </summary>
|
||
public void fun_LoadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(LoadEmptyTray, e);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 点对点
|
||
/// </summary>
|
||
public void fun_PointToPoint(DeviceDriver_BasicData.CustomeEvetnArgs e)
|
||
{
|
||
ThreadPool.QueueUserWorkItem(PointToPoint, e);
|
||
}
|
||
|
||
}
|
||
}
|