Files
16-Xikai-MesProjectNew/MisDataFunction/Function1054/MesServerFunction/Fun_1054.cs
2026-05-29 09:34:04 +08:00

329 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using MesServerWork;
using MisDataFunDll;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Xml.Linq;
namespace MesServerFunctions
{
public partial class FunctionMES
{
object lockFunWork;
//public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e)
public void FunWork(string recData)
{
lockFunWork = new object();
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相关变量类型代码处理说明
// 301AGV请求进入
// 302AGV器具放置完毕
// 303AGV退出光栅
// 304送料信息验证完成
// 305送料信息验证结果
// 305任务发送状态 0 没有 1 发送 2 失败
// 311请求叫料
// 312请求退空
// 313请求退料
// 314允许AGV进入
// 315允许AGV离开
// 316器具码扫描完毕
// 317退回并重新配送
// 318器具号
// 319请求上料机型
// 320收到状态反馈点
// 321转序
// 322下空托盘
// 323上空托盘
// 324点对点
// 500AGV请求下降
// 501AGV请求举升
// 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":
// 需要调用AGV插插头接口 去插
break;
// 请求拔插头
case "453":
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);
}
}
}