init: 潍柴发动机线 中央控制程序 项目首次入库
This commit is contained in:
70
SCADA/MES_A95/MIS_Device.cs
Normal file
70
SCADA/MES_A95/MIS_Device.cs
Normal file
@@ -0,0 +1,70 @@
|
||||
using ConverterBytesAndStruct;
|
||||
using DC_A95;
|
||||
using OpcBasic;
|
||||
using OpcData;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using SystemFramework;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
namespace MesWork
|
||||
{
|
||||
/// <summary>
|
||||
/// 设备状态的处理
|
||||
/// </summary>
|
||||
public partial class MesWorkForm
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 设备状态的处理
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
private void MIS_Device(object e)
|
||||
{
|
||||
|
||||
var eState = (OpcData.PlcStateEvetnArgs)e;
|
||||
var ip = eState.IP.ToString();
|
||||
var onLine = eState.OnLine;
|
||||
|
||||
try
|
||||
{
|
||||
if (ht_IP_OnLine.ContainsKey(ip))
|
||||
{
|
||||
ht_IP_OnLine[ip] = onLine;
|
||||
}
|
||||
else
|
||||
{
|
||||
ht_IP_OnLine.Add(ip, onLine);
|
||||
}
|
||||
}
|
||||
catch (Exception err){ }
|
||||
try
|
||||
{
|
||||
if (G_DC_IP_OP.ContainsKey(ip))
|
||||
{
|
||||
var listOp = G_DC_IP_OP[ip];
|
||||
foreach (var op in listOp)
|
||||
{
|
||||
ht_Signal__Station_OffLine[op] = onLine;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception err){ }
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
320
SCADA/MES_A95/MIS_Funtion.cs
Normal file
320
SCADA/MES_A95/MIS_Funtion.cs
Normal file
@@ -0,0 +1,320 @@
|
||||
using DataLinkMesWork;
|
||||
using DC_A95;
|
||||
using SYNC_SAP_MES;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
namespace MesWork
|
||||
{
|
||||
/// <summary>
|
||||
/// 处理MIS逻辑
|
||||
/// </summary>
|
||||
public partial class MesWorkForm
|
||||
{
|
||||
/// <summary>
|
||||
/// 处理MIS逻辑
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
private void MIS_Funtion(object e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (NotHandlerSignal == "1")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var msgEvent = (OpcData.CustomeEvetnArgs)e;
|
||||
if (msgEvent.TagValue == null) return;
|
||||
|
||||
var tagID = msgEvent.TagID.ToString();
|
||||
var opCode = msgEvent.OpName.ToString();//工位号
|
||||
var tagTypeCodeID = (int)msgEvent.TagTypeCodeID;
|
||||
var tagTypeID = (EnumTagTypeID)msgEvent.TagTypeID;
|
||||
var isFirstValue = msgEvent.IsFirstValue.ToString().ToLower();
|
||||
string tagValue;
|
||||
switch (tagTypeID)
|
||||
{
|
||||
case EnumTagTypeID.BOOL:
|
||||
tagValue = (Convert.ToInt32(msgEvent.TagValue)).ToString();
|
||||
break;
|
||||
default:
|
||||
tagValue = msgEvent.TagValue.ToString();
|
||||
break;
|
||||
}
|
||||
|
||||
if (ValueT(isFirstValue))
|
||||
{
|
||||
//不处理第一次变化的值
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
15 系统健康
|
||||
5 传递机型(AMS)
|
||||
66 允许PLC工作(AMS)
|
||||
34 发动机上线报警标志
|
||||
20 AMS保存完数据(AMS)
|
||||
112 发动机上线报警代码
|
||||
73 机型标志(AMS)
|
||||
74 变速箱总成编号(AMS)
|
||||
75 产品型号(AMS)
|
||||
116 缸体打印码
|
||||
117 订单号
|
||||
|
||||
14 系统健康(PLC)
|
||||
2 工件到位(PLC)
|
||||
43 申请零件编号(PLC)
|
||||
44 传递机型(PLC)
|
||||
63 禁用MES(PLC)
|
||||
9 机型标志(PLC)
|
||||
10 变速箱总成编号(PLC)
|
||||
11 产品型号(PLC)
|
||||
80 托盘编号(PLC)
|
||||
22 0空托盘,1合格件,2不合格件(PLC)
|
||||
19 质量数据可以读数据(PLC)
|
||||
21 质量数据工位合格标志(PLC)
|
||||
23 0正常件,1返修件(PLC)
|
||||
39 缸体打印码(PLC)
|
||||
40 订单号(PLC)
|
||||
120 上线缸体码(PLC)
|
||||
*/
|
||||
|
||||
switch (tagTypeCodeID)
|
||||
{
|
||||
case 2://工件到位
|
||||
if (tagValue == "1")
|
||||
{
|
||||
WritePLC_IF(73, opCode, 0);//机型ID
|
||||
WritePLC_IF(74, opCode, "");//发动机流水号(总成编号)
|
||||
WritePLC_IF(75, opCode, "");//产品型号,机型号
|
||||
WritePLC_IF(116, opCode, "");//缸体码
|
||||
WritePLC_IF(117, opCode, "");//订单号
|
||||
WritePLC_IF(118, opCode, 0); // 打印位置
|
||||
MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位
|
||||
MesWorkForm.WritePLC_IF(34, opCode, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位
|
||||
MesWorkForm.WritePLC_IF(34, opCode, false);
|
||||
WritePLC_IF(20, opCode, false); // 保存完成
|
||||
}
|
||||
break;
|
||||
case 14://心跳
|
||||
WritePLC_IF(15, opCode, tagValue);
|
||||
break;
|
||||
case 19://允许保存
|
||||
if (tagValue == "1")
|
||||
{
|
||||
var sortNo_PLC = ReadPLC(9, opCode).ToString();
|
||||
var engineNo_PLC = ReadPLC(10, opCode).ToString();
|
||||
var sortName_PLC = ReadPLC(11, opCode).ToString();
|
||||
var partCode_PLC = ReadPLC(39, opCode).ToString();
|
||||
var orderNo_PLC = ReadPLC(40, opCode).ToString();
|
||||
|
||||
var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString());
|
||||
|
||||
MesWork_QC.ProcessData_PartOff(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC);
|
||||
MesWork_QC.MesRead(opCode, tagValue, tagID);
|
||||
|
||||
|
||||
WritePLC_IF(20, opCode, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePLC_IF(5, opCode, false);
|
||||
WritePLC_IF(66, opCode, false);
|
||||
WritePLC_IF(20, opCode, false);
|
||||
}
|
||||
break;
|
||||
case 43://申请上线
|
||||
if (tagValue == "1")
|
||||
{
|
||||
//1、是否有下发的订单
|
||||
//2、是否申请上线
|
||||
//3、是否满足上线条件
|
||||
//4、缸体码是否符合生产机型
|
||||
|
||||
if (!OPCodes_LineSet.Split(',').Contains(opCode))//非线首
|
||||
{
|
||||
return;
|
||||
}
|
||||
//SyncFunc_From_SAP.SyncDataOperationTask("手动同步");
|
||||
PLC_R.Read_LineSet(opCode, out string partCode, out int palletNo);
|
||||
ExecuteDB.Select_OnLine_Plan_Engine(opCode, partCode, palletNo
|
||||
, out string engineNo, out int sortNo, out string sortName, out string printCode, out string orderNo
|
||||
, out int errCode, out string errMessage, out int printPosition);
|
||||
|
||||
//*******************在此处验证***************************
|
||||
//按规则拆解partCode(缸体二维码),再获取BOM,验证该工位物料中是否存在该型号的缸体
|
||||
//var res_SortType_FromBOM = CALL_Interfalce_WebAPI.Get_BOMs_ByWebAPI(MesWorkForm.LineID_Product, engineNo);
|
||||
|
||||
//**********************************************
|
||||
|
||||
//上线报警代码:errCode
|
||||
//0 - 无错误
|
||||
//1 - PLC逻辑错误,未申请上线
|
||||
//2 - 没有可用订单
|
||||
//3 - 扫描缸体码为空或格式错误
|
||||
//4 - 缸体机型与生产机型不匹配
|
||||
//5 - AMS写入信息与RFID信息验证不一致
|
||||
//255 - 未知错误
|
||||
if (errCode != 0)//获取计划失败
|
||||
{
|
||||
PLC_W.Write_LineSetAlarm(opCode, errCode);
|
||||
LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"发动机上线申请错误:({errCode}){errMessage}");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 复位报警变量
|
||||
//112 发动机上线报警代码
|
||||
//34 发动机上线报警标志
|
||||
MesWorkForm.WritePLC_IF(112, opCode, 0);
|
||||
MesWorkForm.WritePLC_IF(34, opCode, false);
|
||||
|
||||
WritePLC_IF(73, opCode, sortNo);//机型ID
|
||||
WritePLC_IF(74, opCode, engineNo);//发动机流水号(总成编号)
|
||||
WritePLC_IF(75, opCode, sortName);//产品型号,机型号
|
||||
WritePLC_IF(116, opCode, printCode);//缸体码
|
||||
WritePLC_IF(117, opCode, orderNo);//订单号
|
||||
WritePLC_IF(118, opCode, printPosition); // 打印位置
|
||||
WritePLC_IF(5, opCode, true);
|
||||
|
||||
//【PLC读取数据到RFID中,测试用】
|
||||
//WritePLC_IF(9, opCode, sortNo);//机型ID
|
||||
//WritePLC_IF(10, opCode, engineNo);//发动机流水号(总成编号)
|
||||
//WritePLC_IF(11, opCode, sortName);//产品型号,机型号
|
||||
//WritePLC_IF(39, opCode, partCode);//缸体码
|
||||
//WritePLC_IF(40, opCode, orderNo);//订单号
|
||||
|
||||
LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"上线数据写入成功:engineNo={engineNo};sortNo={sortNo};sortName={sortName};printCode={printCode};orderNo={orderNo}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePLC_IF(5, opCode, false);
|
||||
}
|
||||
break;
|
||||
case 44://传递机型
|
||||
if (tagValue == "1")
|
||||
{
|
||||
var sortNo_PLC = ReadPLC(9, opCode).ToString();
|
||||
var engineNo_PLC = ReadPLC(10, opCode).ToString();
|
||||
var sortName_PLC = ReadPLC(11, opCode).ToString();
|
||||
var partCode_PLC = ReadPLC(39, opCode).ToString();
|
||||
var orderNo_PLC = ReadPLC(40, opCode).ToString();
|
||||
|
||||
var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString());
|
||||
|
||||
if (OPCodes_LineSet.Split(',').Contains(opCode))//线首
|
||||
{
|
||||
var sortNo = ReadPLC(73, opCode).ToString();
|
||||
var engineNo = ReadPLC(74, opCode).ToString();
|
||||
var sortName = ReadPLC(75, opCode).ToString();
|
||||
var partCode = ReadPLC(116, opCode).ToString();
|
||||
var orderNo = ReadPLC(117, opCode).ToString();
|
||||
|
||||
var str = $"{sortNo}|{engineNo}|{sortName}|{partCode}|{orderNo}";
|
||||
var str_PLC = $"{sortNo_PLC}|{engineNo_PLC}|{sortName_PLC}|{partCode_PLC}|{orderNo_PLC}";
|
||||
|
||||
if (str != str_PLC)
|
||||
{
|
||||
var errCode = (int)Type_AlarmOnline.Err_RW_Diff;
|
||||
PLC_W.Write_LineSetAlarm(opCode, errCode);
|
||||
LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, opCode, $"发动机上线信息读写校验不一致:({errCode})W:{str},R:{str_PLC}");
|
||||
return;
|
||||
}
|
||||
//上线验证完成,消耗计划
|
||||
ExecuteDB.Update_ExcutePlan_LineSetOK(opCode, engineNo);
|
||||
WritePLC_IF(66, opCode, true);
|
||||
LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"【{tagTypeCodeID}】上线下载数据验证成功,流水号消耗成功!opCode={opCode};engineNo={engineNo}");
|
||||
|
||||
}
|
||||
//保存进站数据
|
||||
MesWork_QC.ProcessData_PartOn(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC);
|
||||
WritePLC_IF(66, opCode, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePLC_IF(66, opCode, false);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, "", $"MIS_Funtion报错!,,{err.Message}+{err.StackTrace}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 数据库记录信号变化
|
||||
/// </summary>
|
||||
/// <param name="msg"></param>
|
||||
private void TagTypeCodeID_TagDataOnChange(object msgEvent)
|
||||
{
|
||||
try
|
||||
{
|
||||
OpcData.CustomeEvetnArgs e = (OpcData.CustomeEvetnArgs)msgEvent;
|
||||
|
||||
string tagValue;
|
||||
if (e.TagValue == null) return;
|
||||
|
||||
switch (e.TagValue.ToString().ToLower())
|
||||
{
|
||||
case "1":
|
||||
case "true":
|
||||
tagValue = "1";
|
||||
break;
|
||||
default:
|
||||
tagValue = "0";
|
||||
break;
|
||||
}
|
||||
|
||||
string TagTypeCodeID;
|
||||
string opName;
|
||||
string TagID;
|
||||
string TagValue;
|
||||
DateTime arrivedTime;
|
||||
DateTime leavedTime;
|
||||
int TimeDiff;
|
||||
opName = e.OpName.ToString();
|
||||
TagValue = tagValue;
|
||||
TagTypeCodeID = e.TagTypeCodeID.ToString();
|
||||
TagID = e.TagID.ToString();
|
||||
leavedTime = Convert.ToDateTime(e.TimeStamp);
|
||||
arrivedTime = Convert.ToDateTime(e.TimeStampBefore);
|
||||
TimeDiff = Convert.ToInt32(e.TagKeepTime);
|
||||
|
||||
if (TagTypeCodeID != "14" && TagTypeCodeID != "15")
|
||||
{
|
||||
string procedureName;
|
||||
procedureName = "测量数据设备状态日志_增加数据";
|
||||
System.Data.SqlClient.SqlParameter[] thisParms = new System.Data.SqlClient.SqlParameter[7];
|
||||
thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName);
|
||||
thisParms[1] = new System.Data.SqlClient.SqlParameter("@信号类型代码", TagTypeCodeID);
|
||||
thisParms[2] = new System.Data.SqlClient.SqlParameter("@TagID", TagID);
|
||||
thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue);
|
||||
thisParms[4] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime);
|
||||
thisParms[5] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime);
|
||||
thisParms[6] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff);
|
||||
DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms);
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
132
SCADA/MES_A95/MIS_ImmediateParam.cs
Normal file
132
SCADA/MES_A95/MIS_ImmediateParam.cs
Normal file
@@ -0,0 +1,132 @@
|
||||
using DC_A95;
|
||||
using Opc.Ua;
|
||||
using OpcBasic;
|
||||
using Rhino.DocObjects;
|
||||
using SlMesDbIterface;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using SystemFramework;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
namespace MesWork
|
||||
{
|
||||
/// <summary>
|
||||
/// 即时数据的处理
|
||||
/// </summary>
|
||||
public partial class MesWorkForm
|
||||
{
|
||||
/// <summary>
|
||||
/// 即时数据的处理
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
private void MIS_ImmediateParam(object e)
|
||||
{
|
||||
try
|
||||
{
|
||||
var msgEvent = (OpcData.CustomeEvetnArgs)e;
|
||||
if (msgEvent.TagValue == null) return;
|
||||
|
||||
var tagID = msgEvent.TagID.ToString();
|
||||
var opName = msgEvent.OpName.ToString();
|
||||
var tagTypeCodeID = (int)msgEvent.TagTypeCodeID;
|
||||
var tagTypeID = (EnumTagTypeID)msgEvent.TagTypeID;
|
||||
// var TagTypeCodeID = (EnumTagTypeCodeID)tagTypeCodeID;
|
||||
string tagValue;
|
||||
switch (tagTypeID)
|
||||
{
|
||||
case EnumTagTypeID.BOOL:
|
||||
tagValue = (Convert.ToInt32(msgEvent.TagValue)).ToString();
|
||||
break;
|
||||
default:
|
||||
tagValue = msgEvent.TagValue.ToString();
|
||||
break;
|
||||
}
|
||||
|
||||
switch (tagTypeCodeID)
|
||||
{
|
||||
case 100000://自动模式
|
||||
case 100001://运行中
|
||||
case 100002://手动模式
|
||||
case 100004://故障
|
||||
case 100005://警告
|
||||
case 100006://堵料
|
||||
case 100007://缺料
|
||||
ExecuteDB.Update_ImmediateParam(opName, tagTypeCodeID, tagValue, tagID);
|
||||
|
||||
if (tagTypeCodeID == 100000)
|
||||
{
|
||||
ht_Signal__Station_Auto[opName] = tagValue;
|
||||
}
|
||||
if (tagTypeCodeID == 100001)
|
||||
{
|
||||
ht_Signal__Station_Running[opName] = tagValue;
|
||||
}
|
||||
if (tagTypeCodeID == 100002)
|
||||
{
|
||||
ht_Signal__Station_Manual[opName] = tagValue;
|
||||
}
|
||||
if (tagTypeCodeID == 100004)
|
||||
{
|
||||
ht_Signal__Station_Alarm[opName] = tagValue;
|
||||
}
|
||||
|
||||
break;
|
||||
case 200001://工件离开,这个时候复位信号
|
||||
if (tagValue == "1")
|
||||
{
|
||||
/*
|
||||
//100060 当前循环时间
|
||||
//100080 上一工件的循环时间
|
||||
//100100 平均循环时间
|
||||
//100120 总计数(当前班次)
|
||||
//100160 合格工件计数(总计)
|
||||
//100200 不合格工件计数(总计)
|
||||
*/
|
||||
var list = new List<Int32>() { 100060, 100080, 100100, 100120, 100160, 100200 };
|
||||
foreach (var _TagTypeCodeID in list)
|
||||
{
|
||||
if (int.Parse(opName.Replace("OP", "")) > 4000 && int.Parse(opName.Replace("OP", "")) < 4100)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
var _Value = ReadPLC(_TagTypeCodeID, opName).ToString();
|
||||
ExecuteDB.Update_ImmediateParam(opName, _TagTypeCodeID, _Value, $"{opName}_{_TagTypeCodeID}");
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception err)
|
||||
{ }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
903
SCADA/MES_A95/MIS_Save_QC.cs
Normal file
903
SCADA/MES_A95/MIS_Save_QC.cs
Normal file
@@ -0,0 +1,903 @@
|
||||
using BasicData;
|
||||
using ConverterBytesAndStruct;
|
||||
using DataLinkMesWork;
|
||||
using DC_A95;
|
||||
using DC_A95.MES_A95;
|
||||
using ExternalDataSync;
|
||||
using HslCommunication.WebSocket;
|
||||
using Newtonsoft.Json;
|
||||
using NPOI.HSSF.Record.Chart;
|
||||
using NPOI.OpenXmlFormats.Dml.Diagram;
|
||||
using NPOI.SS.Formula.Functions;
|
||||
using NPOI.Util;
|
||||
using Opc.Ua;
|
||||
using OpcBasic;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Reflection.Emit;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web.Script.Serialization;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml;
|
||||
using SystemFramework;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
namespace MesWork
|
||||
{
|
||||
/// <summary>
|
||||
/// 质量数据的拆解和存储
|
||||
/// </summary>
|
||||
public class MesWork_QC
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 全部数据列表
|
||||
/// </summary>
|
||||
public static DataTable BasicDataTagValue;
|
||||
/// <summary>
|
||||
/// MES_基本数据_测量范围
|
||||
/// </summary>
|
||||
public static DataTable BasicDataTagValueUpDown;
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// MOM接口:保存过点数据(进站)
|
||||
/// </summary>
|
||||
/// <param name="opCode">工位名称</param>
|
||||
/// <param name="DataFlag">1、进站,2、离站</param>
|
||||
public static void ProcessData_PartOn(string opCode, string engineNo,int palletNo,string sortNo_PLC)
|
||||
{
|
||||
MES_QueryCache.Get_ProductPlan_ByEngineNo(engineNo, out string engineTypeNo, out string orderNum, out int orderNo, out int orderSum, out int if_codetest, out int if_hottest);
|
||||
MES_QueryCache.Get_ProductProcess_ByOP(opCode, out string processCode, out string processName, out string opName, out string AreaName);
|
||||
|
||||
int QualityOk = 0; //合格标志:1-合格;2-不合格
|
||||
int PassStatus = 1; //过站状态:1-正常工作;2-因为前序不合格没工作放行过去;3-工位被屏蔽
|
||||
var Operator = "";
|
||||
|
||||
var optFlag = OptFlag.AddNew;
|
||||
var passAttr = PassAttr.OPStart;
|
||||
|
||||
var upOrDown = -1;
|
||||
|
||||
|
||||
//保存过点数据
|
||||
ExecuteDB.Save_StationPass_Info(engineNo, engineTypeNo, palletNo, orderNum, orderNo, orderSum, processCode, processName,
|
||||
opCode, opName, passAttr, Operator, QualityOk, PassStatus, upOrDown, optFlag, sortNo_PLC);
|
||||
|
||||
}
|
||||
|
||||
public static void ProcessData_PartOff(string opCode, string engineNo, int palletNo,string sortNo_PLC)
|
||||
{
|
||||
|
||||
MES_QueryCache.Get_ProductPlan_ByEngineNo(engineNo, out string engineTypeNo, out string orderNum, out int orderNo, out int orderSum, out int if_codetest, out int if_hottest);
|
||||
MES_QueryCache.Get_ProductProcess_ByOP(opCode, out string processCode, out string processName, out string opName, out string AreaName);
|
||||
|
||||
var Operator = "";
|
||||
var QualityOk = 1;
|
||||
var PassStatus = 1;
|
||||
var optFlag = OptFlag.AddNew;
|
||||
var passAttr = PassAttr.OPEnd;
|
||||
var upOrDown = 3;
|
||||
//离站信息保存
|
||||
ExecuteDB.Save_StationPass_Info(engineNo, engineTypeNo, palletNo, orderNum, orderNo, orderSum, processCode, processName,
|
||||
opCode, opName, passAttr, Operator, QualityOk, PassStatus, upOrDown, optFlag, sortNo_PLC);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 允许保存(针对半自动和手动压装工位)
|
||||
/// </summary>
|
||||
/// <param name="OpName"></param>
|
||||
/// <param name="tagValue"></param>
|
||||
public static int MesRead(string opName, string tagValue, string tagid, bool isCheck = false)
|
||||
{
|
||||
return SaveQualityData(opName, Convert.ToInt32(tagValue), tagid, isCheck);
|
||||
}
|
||||
|
||||
//public static string GetRealTimeQualityData(string opName)
|
||||
//{
|
||||
// string message = "";
|
||||
// DataTable dt1 = new DataTable();
|
||||
// DataTable dt_WWW;
|
||||
// DataTable dt_WWW_Copy1;
|
||||
// DataTable dt_WWW_Copy2;
|
||||
// Hashtable valueList;
|
||||
// try
|
||||
// {
|
||||
// var tagValues = PLC_R.ReadPLC_OpName(opName);
|
||||
// //过滤出来质量数据 //获得带合格标志的质量数据
|
||||
// valueList = ReadPLC_OpName_Qd(tagValues);
|
||||
// //获得带基本信息的质量数据表
|
||||
// GetQualityDataTable(valueList, opName, BasicDataTagValue, BasicDataTagValueUpDown, out dt_WWW);
|
||||
|
||||
// dt_WWW_Copy1 = dt_WWW.Copy().Select("变量排序 = 1").CopyToDataTable();
|
||||
// DataView dv1 = dt_WWW_Copy1.DefaultView;
|
||||
// dv1.Sort = "列位置 DESC";
|
||||
// dt_WWW_Copy1 = dv1.ToTable();
|
||||
|
||||
// dt_WWW_Copy2 = dt_WWW.Copy().Select("变量排序 = 2").CopyToDataTable();
|
||||
// DataView dv2 = dt_WWW_Copy2.DefaultView;
|
||||
// dv2.Sort = "列位置 DESC";
|
||||
// dt_WWW_Copy2 = dv2.ToTable();
|
||||
|
||||
// dt1.Columns.Add("列位置", System.Type.GetType("System.String"));
|
||||
// dt1.Columns.Add("测量项目1", System.Type.GetType("System.String"));
|
||||
// dt1.Columns.Add("测量项目2", System.Type.GetType("System.String"));
|
||||
// dt1.Columns.Add("合格标志", System.Type.GetType("System.String"));
|
||||
// dt1.Columns.Add("名称", System.Type.GetType("System.String"));
|
||||
|
||||
// for (int i = 0; i < dt_WWW_Copy1.Rows.Count; i++)
|
||||
// {
|
||||
// if (dt_WWW_Copy1.Rows[i]["TagValue"].ToString() != "0" || dt_WWW_Copy2.Rows[i]["TagValue"].ToString() != "0")
|
||||
// {
|
||||
// var dr = dt1.NewRow();
|
||||
// dr["列位置"] = dt_WWW_Copy1.Rows[i]["列位置"].ToString();
|
||||
// dr["测量项目1"] = dt_WWW_Copy1.Rows[i]["TagValue"].ToString();
|
||||
// dr["测量项目2"] = dt_WWW_Copy2.Rows[i]["TagValue"].ToString();
|
||||
// dr["合格标志"] = dt_WWW_Copy1.Rows[i]["IsGoodBad"].ToString();
|
||||
// dr["名称"] = dt_WWW_Copy1.Rows[i]["测量项目"].ToString();
|
||||
// dt1.Rows.Add(dr);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// catch (Exception err)
|
||||
// {
|
||||
// }
|
||||
// message = CreateJsonParameters(dt1);
|
||||
|
||||
// return message;
|
||||
//}
|
||||
|
||||
public static string CreateJsonParameters(DataTable dt)
|
||||
{
|
||||
StringBuilder JsonString = new StringBuilder();
|
||||
//Exception Handling
|
||||
|
||||
if (dt != null)
|
||||
{
|
||||
JsonString.Append("{ ");
|
||||
JsonString.Append("\"rows\":[ ");
|
||||
for (int i = 0; i < dt.Rows.Count; i++)
|
||||
{
|
||||
JsonString.Append("{ ");
|
||||
for (int j = 0; j < dt.Columns.Count; j++)
|
||||
{
|
||||
if (j < dt.Columns.Count - 1)
|
||||
{
|
||||
//if (dt.Rows[i][j] == DBNull.Value) continue;
|
||||
if (dt.Columns[j].DataType == typeof(bool))
|
||||
{
|
||||
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" +
|
||||
dt.Rows[i][j].ToString().ToLower() + ",");
|
||||
}
|
||||
else if (dt.Columns[j].DataType == typeof(string))
|
||||
{
|
||||
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" +
|
||||
ObjectToJson(dt.Rows[i][j]).ToString() + ",");
|
||||
//JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" +
|
||||
// dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\",");
|
||||
}
|
||||
else
|
||||
{
|
||||
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\",");
|
||||
}
|
||||
}
|
||||
else if (j == dt.Columns.Count - 1)
|
||||
{
|
||||
//if (dt.Rows[i][j] == DBNull.Value) continue;
|
||||
if (dt.Columns[j].DataType == typeof(bool))
|
||||
{
|
||||
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" +
|
||||
dt.Rows[i][j].ToString().ToLower());
|
||||
}
|
||||
else if (dt.Columns[j].DataType == typeof(string))
|
||||
{
|
||||
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" +
|
||||
ObjectToJson(dt.Rows[i][j]).ToString());
|
||||
//JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" +
|
||||
// dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\"");
|
||||
}
|
||||
else
|
||||
{
|
||||
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\"");
|
||||
}
|
||||
}
|
||||
}
|
||||
/*end Of String*/
|
||||
if (i == dt.Rows.Count - 1)
|
||||
{
|
||||
JsonString.Append("} ");
|
||||
}
|
||||
else
|
||||
{
|
||||
JsonString.Append("}, ");
|
||||
}
|
||||
}
|
||||
JsonString.Append("]");
|
||||
|
||||
JsonString.Append("}");
|
||||
return JsonString.ToString().Replace("\n", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static string ObjectToJson(object obj)
|
||||
{
|
||||
JavaScriptSerializer js = new JavaScriptSerializer();
|
||||
js.MaxJsonLength = Int32.MaxValue; // 定义JavaScriptSerializer接受字符串的最大长度 hdk 20180524
|
||||
try
|
||||
{
|
||||
return js.Serialize(obj);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
|
||||
throw new Exception(exception.Message);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 返回合格标志
|
||||
/// </summary>
|
||||
/// <param name="opName"></param>
|
||||
/// <param name="tagValue"></param>
|
||||
/// <param name="tagID"></param>
|
||||
/// <returns></returns>
|
||||
private static int SaveQualityData(string opName, int tagValue, string tagID, bool isCheck = false)
|
||||
{
|
||||
int id_tagCF;
|
||||
int qualityMask = 0;
|
||||
int engineTypeID = 0;
|
||||
string engineID = "";
|
||||
string engineType = "";
|
||||
string partPallet = "";
|
||||
string orderFormPlc = "";
|
||||
DataTable dt_WWW;
|
||||
Hashtable valueList;
|
||||
try
|
||||
{
|
||||
var tagValues = PLC_R.ReadPLC_OpName(opName);
|
||||
//过滤出来质量数据 //获得带合格标志的质量数据
|
||||
valueList = ReadPLC_OpName_Qd(tagValues);
|
||||
|
||||
engineTypeID = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineTypeID)));
|
||||
engineID = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineID)).ToString();
|
||||
engineType = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineType)).ToString();
|
||||
orderFormPlc = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.OrderFormPLC)).ToString();
|
||||
qualityMask = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.QualityMask)));
|
||||
|
||||
//获得带基本信息的质量数据表
|
||||
GetQualityDataTable(valueList, opName, BasicDataTagValue,BasicDataTagValueUpDown, out dt_WWW);
|
||||
|
||||
DateTime lastupdatetime = DateTime.Now;
|
||||
//保存质量数
|
||||
BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF);
|
||||
BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineType, engineID, opName, dt_WWW, isCheck);
|
||||
MesWork_QC_upload.SyncTask_UploadMeasureData(id_tagCF.ToString());
|
||||
|
||||
Material_Insert(opName, 1);
|
||||
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, "", $"SaveQualityData 报错!,,{err.Message}+{err.StackTrace }");
|
||||
}
|
||||
return qualityMask;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// AMES_MES_装配数据_零部件追溯_增加
|
||||
/// </summary>
|
||||
/// <param name="opName"></param>
|
||||
/// <param name="m_ConfirmOkGo"></param>
|
||||
/// <returns></returns>
|
||||
public static bool Material_Insert(string opName, int m_ConfirmOkGo)
|
||||
{
|
||||
string produceName = "MES_装配数据_零部件追溯_增加";
|
||||
SqlParameter[] thisParms = new SqlParameter[2];
|
||||
thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName);
|
||||
thisParms[1] = new System.Data.SqlClient.SqlParameter("@放行方式", m_ConfirmOkGo);
|
||||
return DataAccess.ExecuteStoredProcedure(produceName, ref thisParms);
|
||||
}
|
||||
|
||||
|
||||
static public void GetQualityDataTable(Hashtable valuList, string opName, DataTable BasicDataTagValue, DataTable BasicDataTagValueUpDown, out DataTable dt)
|
||||
{
|
||||
//78 0:屏蔽MES;1:启用MES(必须MIS)
|
||||
//79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线;0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS)
|
||||
//41 机体流向标志(1 BYTE):0普通工位:1:上线(发动机上线);2:下线(发动机下线);(必须PLC)
|
||||
//51 返修工位,修改后的数据MES将数据写入PLC ,MES通知PLC数据修改完成。(YN)
|
||||
//8 只要返修,必须由mes发送此信号,plc接收此信号后才能放行
|
||||
//(暂时没用)用于有扳手拧紧工位。通知设备螺钉拧紧完成。PC已经将数据保存到数据库中。(B5A)
|
||||
|
||||
QualityDataType qualityData;
|
||||
//是否有数据
|
||||
//bool isUsing;
|
||||
|
||||
DataRow dr;
|
||||
DataRow[] dr_WWW;
|
||||
//MES_基本数据_测量范围
|
||||
DataRow[] dr_WWW_UpDown;
|
||||
|
||||
dt = BuildDataTables_WWW();
|
||||
|
||||
//测量位置
|
||||
string shaftID;
|
||||
//测量项目
|
||||
string item;
|
||||
//测量单位
|
||||
string unit;
|
||||
//机体类型
|
||||
//原始数据中的机型代码
|
||||
int engineTypeID_Source;
|
||||
//上限值
|
||||
string tagValueUp;
|
||||
//下限值
|
||||
string tagValueDown;
|
||||
//理论值
|
||||
string tagValeNormal;
|
||||
//TagValue
|
||||
// 合格标志
|
||||
//string IsGoodBad;
|
||||
|
||||
foreach (DictionaryEntry valueItem in valuList) //ht为一个Hashtable实例
|
||||
{
|
||||
try
|
||||
{
|
||||
qualityData = (QualityDataType)valueItem.Value;
|
||||
|
||||
|
||||
//if ((qualityData.tagProperty != 2) || (qualityData.tagProperty != 6))
|
||||
//{
|
||||
// continue ;
|
||||
//}
|
||||
//if ((qualityData.tagProperty == 2) || (qualityData.tagProperty == 6))
|
||||
{
|
||||
//if (engineTypeID == 0)
|
||||
//{
|
||||
// engineTypeID = 1;
|
||||
//}
|
||||
dr_WWW = BasicDataTagValue.Select("TagID = " + qualityData.tagID);
|
||||
try
|
||||
{
|
||||
dr_WWW_UpDown = BasicDataTagValueUpDown.Select("TagID = " + qualityData.tagID);
|
||||
}
|
||||
catch { dr_WWW_UpDown = null; }
|
||||
|
||||
|
||||
//if (dr_WWW.Length > 0)
|
||||
//{
|
||||
// {
|
||||
// engineTypeID_Source = Convert.ToInt32(dr_WWW[0]["机体类型"]);
|
||||
// int temp;
|
||||
// temp = engineTypeID_Source & engineTypeID;
|
||||
// if (temp == 0)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// if (qualityData.isGoodBad == -1)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// continue;
|
||||
|
||||
//}
|
||||
|
||||
try
|
||||
{
|
||||
shaftID = dr_WWW[0]["测量位置"].ToString();
|
||||
}
|
||||
catch
|
||||
{
|
||||
shaftID = "";
|
||||
}
|
||||
try
|
||||
{
|
||||
item = dr_WWW[0]["测量项目"].ToString();
|
||||
}
|
||||
catch
|
||||
{
|
||||
item = "";
|
||||
}
|
||||
try
|
||||
{
|
||||
unit = dr_WWW[0]["测量单位"].ToString();
|
||||
}
|
||||
catch
|
||||
{
|
||||
unit = "";
|
||||
}
|
||||
try
|
||||
{
|
||||
tagValueUp = "";
|
||||
if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0)
|
||||
{
|
||||
tagValueUp = dr_WWW_UpDown[0]["值上限"].ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
tagValueUp = "";
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
tagValueUp = "";
|
||||
}
|
||||
try
|
||||
{
|
||||
tagValueDown = "";
|
||||
if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0)
|
||||
{
|
||||
tagValueDown = dr_WWW_UpDown[0]["值下限"].ToString();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
tagValueDown = "";
|
||||
}
|
||||
try
|
||||
{
|
||||
tagValeNormal = "";
|
||||
if (dr_WWW_UpDown != null && dr_WWW_UpDown.Length > 0)
|
||||
{
|
||||
tagValeNormal = dr_WWW_UpDown[0]["理论值"].ToString();
|
||||
}
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
tagValeNormal = "";
|
||||
}
|
||||
|
||||
dr = dt.NewRow();
|
||||
|
||||
dr["TagID"] = qualityData.tagID;
|
||||
dr["测量位置"] = shaftID;
|
||||
dr["测量项目"] = item;
|
||||
dr["测量单位"] = unit;
|
||||
dr["上限值"] = tagValueUp;
|
||||
dr["下限值"] = tagValueDown;
|
||||
dr["理论值"] = tagValeNormal;
|
||||
dr["工位号"] = opName;
|
||||
dr["列位置"] = qualityData.tagOrderBy;
|
||||
dr["变量排序"] = qualityData.tagItemOrderBy;
|
||||
|
||||
dr["IsGoodBad"] = qualityData.isGoodBad;
|
||||
|
||||
switch (qualityData.tagTypeID)//
|
||||
{
|
||||
//合格标志数组
|
||||
case 8203:
|
||||
dr["TagValue"] = GetQualityData_GoodBad_String((bool[])qualityData.tagValue);
|
||||
break;
|
||||
case 8209:
|
||||
dr["TagValue"] = "";
|
||||
break;
|
||||
//非标准REAL
|
||||
case 8210:
|
||||
dr["TagValue"] = GetNoNormalReal(qualityData.tagValue);
|
||||
dt.Rows.Add(dr);
|
||||
break;
|
||||
default:
|
||||
dr["TagValue"] = Convert.ToString(qualityData.tagValue);
|
||||
dt.Rows.Add(dr);
|
||||
break;
|
||||
}
|
||||
|
||||
//福田对质量数据特殊处理,MA20保留4位小数点,其余保留两位
|
||||
if (opName == "J07MA020")
|
||||
{
|
||||
dr["TagValue"] = Convert.ToDouble(dr["TagValue"]).ToString("0.####");
|
||||
}
|
||||
else
|
||||
{
|
||||
dr["TagValue"] = Convert.ToDouble(dr["TagValue"]).ToString("0.##");
|
||||
}
|
||||
|
||||
if (opName == "J07MA150")
|
||||
{
|
||||
dr["变量排序"] = 1;
|
||||
dr["IsGoodBad"] = 1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
//ApplicationLog.WriteLog(err, err.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 29 工位具体零件合格标志
|
||||
/// </summary>
|
||||
/// <param name="QualityData_GoodBad"></param>
|
||||
static public string GetQualityData_GoodBad_String(bool[] QualityData_GoodBad)
|
||||
{
|
||||
string str;
|
||||
str = "";
|
||||
if (QualityData_GoodBad != null)
|
||||
{
|
||||
|
||||
for (int i = 0; i < QualityData_GoodBad.Length; i++)
|
||||
{
|
||||
str = str + (Convert.ToInt32(QualityData_GoodBad[i])).ToString() + "|";
|
||||
}
|
||||
|
||||
}
|
||||
return str;
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 返回非标准real
|
||||
/// </summary>
|
||||
/// <param name="vDataValue"></param>
|
||||
/// <returns></returns>
|
||||
static public string GetNoNormalReal(object vDataValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
string real_a;
|
||||
string real_b;
|
||||
string groupValueString;
|
||||
int length;
|
||||
|
||||
//int real_b_Int;
|
||||
|
||||
length = ((System.Array)(vDataValue)).Length;
|
||||
groupValueString = "";
|
||||
if (length != 2)
|
||||
return "0.0";
|
||||
|
||||
real_a = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(0))).ToString();
|
||||
real_b = Convert.ToUInt16((((System.Array)(vDataValue)).GetValue(1))).ToString("00");
|
||||
groupValueString = real_a + "." + real_b;
|
||||
return groupValueString;
|
||||
}
|
||||
catch
|
||||
{
|
||||
////ApplicationLog.WriteLog(err, "GetNoNormalReal");
|
||||
return "0.0";
|
||||
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 数据表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
static public DataTable BuildDataTables_WWW()
|
||||
{
|
||||
DataTable table;
|
||||
DataColumnCollection columns;
|
||||
table = new DataTable();
|
||||
columns = table.Columns;
|
||||
table.Columns.Add("TagID", typeof(System.String));
|
||||
table.Columns.Add("TagValue", typeof(System.String));
|
||||
table.Columns.Add("IsGoodBad", typeof(System.Int32));
|
||||
table.Columns.Add("测量位置", typeof(System.String));
|
||||
table.Columns.Add("测量项目", typeof(System.String));
|
||||
table.Columns.Add("工位号", typeof(System.String));
|
||||
table.Columns.Add("理论值", typeof(System.String));
|
||||
table.Columns.Add("上限值", typeof(System.String));
|
||||
table.Columns.Add("下限值", typeof(System.String));
|
||||
table.Columns.Add("测量单位", typeof(System.String));
|
||||
table.Columns.Add("列位置", typeof(System.Int32));
|
||||
table.Columns.Add("变量排序", typeof(System.Int32));
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 数据表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static object GetValueByTagTypeCodeID(ConcurrentDictionary<string, TagFormat> opTagList, int TagTypeCodeID)
|
||||
{
|
||||
try
|
||||
{
|
||||
return opTagList.Where(x => x.Value.TagTypeCodeID == TagTypeCodeID).ToList()[0].Value.TagValue;
|
||||
}
|
||||
catch (Exception err) { return "-3"; }
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据工位名称,读取工位对应的质量数据,带合格标志
|
||||
/// </summary>
|
||||
/// <param name="opName"></param>
|
||||
/// <returns></returns>
|
||||
public static Hashtable ReadPLC_OpName_Qd(ConcurrentDictionary<string, TagFormat> tagValues)
|
||||
{
|
||||
//lock (l)
|
||||
{
|
||||
|
||||
//var tagValues = DtWebApi.ReadWritePLC.ReadPLC_OpName(opName); //GetDbAndMaxLengthByOpNameByBytes(opName);
|
||||
|
||||
var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
|
||||
|
||||
TagFormat tagFormatTemp;
|
||||
int tagIndex = 1;
|
||||
int isOK = 0;
|
||||
|
||||
Hashtable ht = new Hashtable();
|
||||
|
||||
|
||||
foreach (KeyValuePair<string, TagFormat> _cd in keyValues)
|
||||
{
|
||||
if (_cd.Key.ToString()[0].ToString() == "7")
|
||||
{
|
||||
tagFormatTemp = _cd.Value;
|
||||
if (tagIndex % 3 == 1)
|
||||
{
|
||||
isOK = Convert.ToInt32(tagFormatTemp.TagValue);
|
||||
}
|
||||
else if (tagIndex % 3 == 2)
|
||||
{
|
||||
var TF = _cd.Value;
|
||||
|
||||
QualityDataType qualityDataType;
|
||||
qualityDataType = GetQualityDataType(TF);
|
||||
qualityDataType.isGoodBad = isOK;
|
||||
ht.Add(qualityDataType.tagID, qualityDataType);
|
||||
}
|
||||
else if (tagIndex % 3 == 0)
|
||||
{
|
||||
var TF = (TagFormat)_cd.Value;
|
||||
|
||||
QualityDataType qualityDataType;
|
||||
qualityDataType = GetQualityDataType(TF);
|
||||
qualityDataType.isGoodBad = isOK;
|
||||
ht.Add(qualityDataType.tagID, qualityDataType);
|
||||
}
|
||||
|
||||
tagIndex++;
|
||||
}
|
||||
//Console.WriteLine($"key:{kv.Key} value:{kv.Value}");
|
||||
}
|
||||
return ht;
|
||||
}
|
||||
}
|
||||
|
||||
public static QualityDataType GetQualityDataType(TagFormat TF)
|
||||
{
|
||||
QualityDataType qualityDataType;
|
||||
|
||||
qualityDataType = new QualityDataType();
|
||||
|
||||
qualityDataType.tagID = TF.TagID;
|
||||
qualityDataType.tagTypeID = TF.TagTypeID;//变量类型
|
||||
qualityDataType.opName = TF.OpName;
|
||||
// int.TryParse(TF.TagQuality.ToString(), out int TagQuality);
|
||||
var TagQuality = 192;
|
||||
qualityDataType.tagQuality = TagQuality;
|
||||
qualityDataType.tagValueType = TF.TagTypeCodeID;
|
||||
int.TryParse(TF.TagOrderBy, out int TagOrderBy);
|
||||
qualityDataType.tagOrderBy = TagOrderBy;
|
||||
int.TryParse(TF.TagItemOrderBy, out int TagItemOrderBy);
|
||||
qualityDataType.tagItemOrderBy = TagItemOrderBy;
|
||||
qualityDataType.tagProperty = Convert.ToInt32(TF.TagProperty);//变量特点
|
||||
qualityDataType.tagValue = TF.TagValue;//变量值
|
||||
|
||||
return qualityDataType;
|
||||
}
|
||||
|
||||
public static bool BaseData_tagTable_QualityData_B5A_IndexInsert(string EngineID, string tagID, string EngineType, int EngineTypeID, string opName, int isGoodBad, string PartPalletCode, out int Id_tagCF)
|
||||
{
|
||||
string procedureName;
|
||||
procedureName = "测量数据合格索引_增加";
|
||||
Id_tagCF = 0;
|
||||
SqlParameter[] thisParms = new SqlParameter[8];
|
||||
thisParms[0] = new System.Data.SqlClient.SqlParameter("@EngineID", EngineID);
|
||||
thisParms[1] = new System.Data.SqlClient.SqlParameter("@TagID_CF", Convert.ToInt32(tagID));
|
||||
thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", EngineType);
|
||||
thisParms[3] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", EngineTypeID);
|
||||
thisParms[4] = new System.Data.SqlClient.SqlParameter("@工位号", opName);
|
||||
thisParms[5] = new System.Data.SqlClient.SqlParameter("@托盘编号", PartPalletCode);
|
||||
thisParms[6] = new System.Data.SqlClient.SqlParameter("@合格标志", isGoodBad);
|
||||
thisParms[7] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF)
|
||||
{ Direction = ParameterDirection.Output };
|
||||
|
||||
if (DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms))
|
||||
{
|
||||
Id_tagCF = Convert.ToInt32(thisParms[7].Value.ToString());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public static bool BaseData_tagTable_QualityData_B5A_Insert(int Id_tagCF, int engineTypeID, string engineType, string engineID, string opName, DataTable dt, bool IsCheck = false)
|
||||
{
|
||||
string procedureName;
|
||||
procedureName = "测量数据合格_增加";
|
||||
SqlParameter[] thisParms = new SqlParameter[7];
|
||||
thisParms[0] = new System.Data.SqlClient.SqlParameter("@Id_tagCF", Id_tagCF);
|
||||
thisParms[1] = new System.Data.SqlClient.SqlParameter("@EngineTypeID", engineTypeID);
|
||||
//thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineType", engineType);
|
||||
thisParms[2] = new System.Data.SqlClient.SqlParameter("@EngineID", engineID);
|
||||
thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagID", SqlDbType.Int, 4, "TagID");
|
||||
thisParms[4] = new System.Data.SqlClient.SqlParameter("@TagValue", SqlDbType.NVarChar, 100, "TagValue");
|
||||
thisParms[5] = new System.Data.SqlClient.SqlParameter("@IsGoodBad", SqlDbType.Int, 4, "IsGoodBad");
|
||||
//是否保存无合格标志数据数据
|
||||
thisParms[6] = new System.Data.SqlClient.SqlParameter("@IsCheck", IsCheck);
|
||||
//thisParms[6] = new System.Data.SqlClient.SqlParameter("@测量位置", SqlDbType.NVarChar, 50, "测量位置");
|
||||
//thisParms[7] = new System.Data.SqlClient.SqlParameter("@测量项目", SqlDbType.NVarChar, 50, "测量项目");
|
||||
//thisParms[8] = new System.Data.SqlClient.SqlParameter("@工位号", opName); //为了给J07MA020 保留四位精度而设置
|
||||
//thisParms[9] = new System.Data.SqlClient.SqlParameter("@理论值", SqlDbType.NVarChar, 50, "理论值");
|
||||
//thisParms[10] = new System.Data.SqlClient.SqlParameter("@上限值", SqlDbType.NVarChar, 50, "上限值");
|
||||
//thisParms[11] = new System.Data.SqlClient.SqlParameter("@下限值", SqlDbType.NVarChar, 50, "下限值");
|
||||
//thisParms[12] = new System.Data.SqlClient.SqlParameter("@测量单位", SqlDbType.NVarChar, 50, "测量单位");
|
||||
//thisParms[13] = new System.Data.SqlClient.SqlParameter("@列位置", SqlDbType.Int, 4, "列位置");
|
||||
//thisParms[14] = new System.Data.SqlClient.SqlParameter("@变量排序", SqlDbType.Int, 4, "变量排序");
|
||||
//table.Columns.Add("TagID", typeof(System.Int32));
|
||||
//table.Columns.Add("TagValue", typeof(System.String));
|
||||
//table.Columns.Add("IsGoodBad", typeof(System.Int32));
|
||||
//table.Columns.Add("测量位置", typeof(System.String));
|
||||
//table.Columns.Add("测量项目", typeof(System.String));
|
||||
//table.Columns.Add("工位号", typeof(System.String));
|
||||
//table.Columns.Add("理论值", typeof(System.String));
|
||||
//table.Columns.Add("上限值", typeof(System.String));
|
||||
//table.Columns.Add("下限值", typeof(System.String));
|
||||
//table.Columns.Add("测量单位", typeof(System.String));
|
||||
//table.Columns.Add("列位置", typeof(System.Int32));
|
||||
//table.Columns.Add("变量排序", typeof(System.Int32));
|
||||
return DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, dt);
|
||||
}
|
||||
|
||||
|
||||
//public static int MesRead_J07MA150(string opName, string tagValue, string tagid)
|
||||
//{
|
||||
// int qualityMask = 0;
|
||||
|
||||
// if (tagValue == "0")
|
||||
// {
|
||||
// MIS_BASE.Write_TagTypeID(20, opName, false);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// qualityMask = SaveQualityData_J07MA150(opName, Convert.ToInt32(tagValue), tagid);
|
||||
// MIS_BASE.Write_TagTypeID(20, opName, true);
|
||||
// }
|
||||
// return qualityMask;
|
||||
//}
|
||||
/// <summary>
|
||||
/// 返回合格标志, 注油工位 质量数据为字符串,读取备用点 变量类型代码 = 41
|
||||
/// </summary>
|
||||
/// <param name="opName"></param>
|
||||
/// <param name="tagValue"></param>
|
||||
/// <param name="tagID"></param>
|
||||
/// <returns></returns>
|
||||
private static int SaveQualityData_J07MA150(string opName, int tagValue, string tagID)
|
||||
{
|
||||
int id_tagCF;
|
||||
int qualityMask = 0;
|
||||
int engineTypeID = 0;
|
||||
string engineID = "";
|
||||
string engineType = "";
|
||||
string partPallet = "";
|
||||
string orderFormPlc = "";
|
||||
DataTable dt_WWW;
|
||||
Hashtable valueList;
|
||||
try
|
||||
{
|
||||
|
||||
//过滤出来质量数据 //获得带合格标志的质量数据
|
||||
var tagValues = PLC_R.ReadPLC_OpName(opName);
|
||||
valueList = ReadPLC_OpName_Qd_J07MA150(tagValues);
|
||||
//valueList = ReadPLC_OpName_Qd(tagValues);
|
||||
|
||||
engineTypeID = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineTypeID)));
|
||||
engineID = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineID)).ToString();
|
||||
engineType = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineType)).ToString();
|
||||
orderFormPlc = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.OrderFormPLC)).ToString();
|
||||
engineID = GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.EngineID)).ToString();
|
||||
qualityMask = Convert.ToInt32(GetValueByTagTypeCodeID(tagValues, Convert.ToInt32(EnumTagTypeCodeID.QualityMask)));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//获得带基本信息的质量数据表
|
||||
GetQualityDataTable(valueList, opName, BasicDataTagValue,
|
||||
BasicDataTagValueUpDown, out dt_WWW);
|
||||
|
||||
|
||||
DateTime lastupdatetime = DateTime.Now;
|
||||
//保存质量数
|
||||
BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF);
|
||||
BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineType, engineID, opName, dt_WWW);
|
||||
|
||||
// }
|
||||
Material_Insert(opName, 1);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
}
|
||||
return qualityMask;
|
||||
}
|
||||
public static Hashtable ReadPLC_OpName_Qd_J07MA150(ConcurrentDictionary<string, TagFormat> tagValues)
|
||||
{
|
||||
//lock (l)
|
||||
{
|
||||
|
||||
//var tagValues = DtWebApi.ReadWritePLC.ReadPLC_OpName(opName); //GetDbAndMaxLengthByOpNameByBytes(opName);
|
||||
|
||||
var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value);
|
||||
|
||||
TagFormat tagFormatTemp;
|
||||
int tagIndex = 1;
|
||||
int isOK = 1;
|
||||
|
||||
Hashtable ht = new Hashtable();
|
||||
|
||||
|
||||
//var TF = _cd.Value;
|
||||
////var TF = Read_TagTypeID(39, opName, out OrderForm);
|
||||
|
||||
//QualityDataType qualityDataType;
|
||||
//qualityDataType = GetQualityDataType(TF);
|
||||
//qualityDataType.isGoodBad = isOK;
|
||||
//ht.Add(qualityDataType.tagID, qualityDataType);
|
||||
|
||||
|
||||
foreach (KeyValuePair<string, TagFormat> _cd in keyValues)
|
||||
{
|
||||
|
||||
if (_cd.Value.TagTypeCodeID.ToString() == "41")
|
||||
{
|
||||
tagFormatTemp = _cd.Value;
|
||||
|
||||
var TF = _cd.Value;
|
||||
|
||||
QualityDataType qualityDataType;
|
||||
qualityDataType = GetQualityDataType(TF);
|
||||
qualityDataType.isGoodBad = isOK;
|
||||
qualityDataType.tagItemOrderBy = 1;
|
||||
qualityDataType.tagOrderBy = 1;
|
||||
ht.Add(qualityDataType.tagID, qualityDataType);
|
||||
}
|
||||
//Console.WriteLine($"key:{kv.Key} value:{kv.Value}");
|
||||
}
|
||||
return ht;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
48
SCADA/MES_A95/MIS_Statement.cs
Normal file
48
SCADA/MES_A95/MIS_Statement.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DC_A95.MES_A95
|
||||
{
|
||||
public class OptFlag
|
||||
{
|
||||
public static int AddNew = 1;
|
||||
public static int Modify = 2;
|
||||
public static int Delete = 3;
|
||||
|
||||
}
|
||||
public class PassAttr
|
||||
{
|
||||
//真的是:4-进站,1-出站,5-上在制
|
||||
public static int OPStart = 4;
|
||||
public static int OPEnd = 1;
|
||||
}
|
||||
public class PlanExec_State
|
||||
{
|
||||
//1-未开始,2-已上线
|
||||
public static int Waiting = 1;
|
||||
public static int HasExec = 2;
|
||||
}
|
||||
public class TaskTypeInfo
|
||||
{
|
||||
public short TaskTypeID;
|
||||
|
||||
public string TaskTypeName;
|
||||
|
||||
public int QCDataCount;
|
||||
|
||||
public string DataName1;
|
||||
public string DataUnit1;
|
||||
|
||||
public string DataName2;
|
||||
public string DataUnit2;
|
||||
|
||||
public string DataName3;
|
||||
public string DataUnit3;
|
||||
|
||||
public string DataName4;
|
||||
public string DataUnit4;
|
||||
}
|
||||
}
|
||||
202
SCADA/MES_A95/MIS_upload_QC.cs
Normal file
202
SCADA/MES_A95/MIS_upload_QC.cs
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
using CentralControl;
|
||||
using DataLinkMesWork;
|
||||
using Newtonsoft.Json;
|
||||
using SlMesDbIterface;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Threading;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
namespace MesWork
|
||||
{
|
||||
/// <summary>
|
||||
/// 质量数据的拆解和存储
|
||||
/// </summary>
|
||||
public class MesWork_QC_upload
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 同步执行任务
|
||||
/// </summary>
|
||||
public static void SyncTask_UploadMeasureData(string id_tagCF)
|
||||
{
|
||||
new Thread(new ThreadStart(delegate ()
|
||||
{
|
||||
string msg = "";
|
||||
try
|
||||
{
|
||||
// 查询质量数据
|
||||
bool isUploadOk = false;
|
||||
var sql_AMS_Plan = $"SELECT * FROM 质量数据上传_视图" +
|
||||
$" where [接口输出] != 1 and id_tagCF = {id_tagCF} order by [工位号],[TagID] ";
|
||||
bool isOk = SqlOperation.ExecuteSql(sql_AMS_Plan, out DataTable dt_MeasureData, out string err1);
|
||||
if (isOk)
|
||||
{
|
||||
if(dt_MeasureData.Rows.Count > 0)
|
||||
{
|
||||
isUploadOk = upLoadData(dt_MeasureData, out msg);
|
||||
}
|
||||
}
|
||||
if(isUploadOk)
|
||||
{
|
||||
upLoadUpdate(id_tagCF, 1, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
upLoadUpdate(id_tagCF, 2, msg);
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
msg = err.Message;
|
||||
upLoadUpdate(id_tagCF, 2, msg);
|
||||
}
|
||||
}))
|
||||
{ IsBackground = true }.Start();
|
||||
}
|
||||
|
||||
public static bool upLoadData(DataTable dt, out string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<SapMeasureData> SapMeasureDataList = new List<SapMeasureData>();
|
||||
string dateShort = new DateTime().ToString("yyyyMMdd");
|
||||
for (int i = 0; i < dt.Rows.Count; i++)
|
||||
{
|
||||
SapMeasureData sapMeasureData = new SapMeasureData();
|
||||
sapMeasureData.ID = dt.Rows[i]["Id"].ToString();
|
||||
sapMeasureData.operationCode = dt.Rows[i]["工位代码"].ToString();
|
||||
sapMeasureData.itemCode = dt.Rows[i]["订货号"].ToString();
|
||||
sapMeasureData.productCode = dt.Rows[i]["EngineID"].ToString();
|
||||
sapMeasureData.characterName = dt.Rows[i]["测量位置"].ToString() + dt.Rows[i]["测量项目"].ToString();
|
||||
sapMeasureData.content = "";
|
||||
sapMeasureData.cNumber = "";
|
||||
sapMeasureData.positionNumber = dt.Rows[i]["列位置"].ToString();
|
||||
sapMeasureData.specialCategory = "";
|
||||
sapMeasureData.cImportance = "";
|
||||
sapMeasureData.unit = dt.Rows[i]["测量单位"].ToString();
|
||||
sapMeasureData.normalMin = Convert.ToInt32(dt.Rows[i]["下限值"]);
|
||||
sapMeasureData.normalMax = Convert.ToInt32(dt.Rows[i]["上限值"]);
|
||||
sapMeasureData.checkInput = dt.Rows[i]["TagValue"].ToString();
|
||||
sapMeasureData.isNormal = Convert.ToInt32(dt.Rows[i]["IsGoodBad"]);
|
||||
sapMeasureData.checkToolNumber = "";
|
||||
sapMeasureData.checkToolName = "";
|
||||
sapMeasureData.machineNumber = "";
|
||||
sapMeasureData.machineSpindleNumber = "";
|
||||
sapMeasureData.machineClampingNumber = "";
|
||||
sapMeasureData.inputDate = dt.Rows[i]["操作时间"].ToString();
|
||||
sapMeasureData.reMarks = "";
|
||||
SapMeasureDataList.Add(sapMeasureData);
|
||||
}
|
||||
ResponseBody_WebAPI_Boms res = CALL_Interfalce_WebAPI.RequestPost_UploadMeasureData_To_SAP(JsonConvert.SerializeObject(SapMeasureDataList));
|
||||
|
||||
if (res.code == "200")
|
||||
{
|
||||
msg = res.message;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = res.message;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
msg = err.Message;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void upLoadUpdate(string id_tagCF, int isOk, string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var sql_AMS_Plan = $"UPDATE [dbo].[测量数据合格] SET [接口输出] = {isOk},数据说明 = '{msg}'" +
|
||||
$" where [id_tagCF] = '{id_tagCF}'";
|
||||
DataAccess.ExecuteDataTable(sql_AMS_Plan, out DataTable dt_MeasureData);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
class SapMeasureData
|
||||
{
|
||||
/*
|
||||
id number(12) id
|
||||
line_id varchar2(10) y 生产线id
|
||||
operation_code varchar2(10) y 工位编码
|
||||
item_code varchar2(255) y 物料编码
|
||||
product_code varchar2(16) y 序列号
|
||||
character_name varchar2(255) y 特性名称
|
||||
content varchar2(255) y 特性内容(产品/过程规格/公差)φ是大写
|
||||
c_number varchar2(40) y 特性编号
|
||||
position_number varchar2(40) y 位置编号
|
||||
special_category varchar2(10) y 特殊特性分类
|
||||
c_importance varchar2(10) y 特性重要度
|
||||
unit varchar2(10) y 单位
|
||||
normal_min number y 合格下限
|
||||
normal_max number y 合格上限
|
||||
check_input varchar2(255) y 质检结果
|
||||
isnormal number(1) y 是否合格(0:否;1:是;)
|
||||
check_tool_number varchar2(30) y 测量设备编号
|
||||
check_tool_name varchar2(80) y 测量设备名称
|
||||
machine_number varchar2(40) y null 加工设备编号
|
||||
machine_spindle_number varchar2(40) y null 加工设备主轴编号
|
||||
machine_clamping_number varchar2(40) y 加工设备工装编号
|
||||
input_date date y 录入时间
|
||||
remarks varchar2(255) y 备注
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
public string ID;
|
||||
public string lineId = MesWorkForm.LineID_Product;
|
||||
public string operationCode;
|
||||
public string itemCode;
|
||||
public string productCode;
|
||||
public string characterName;
|
||||
public string content;
|
||||
public string cNumber;
|
||||
public string positionNumber;
|
||||
public string specialCategory;
|
||||
public string cImportance;
|
||||
public string unit;
|
||||
public int normalMin;
|
||||
public int normalMax;
|
||||
public string checkInput;
|
||||
public int isNormal;
|
||||
public string checkToolNumber;
|
||||
public string checkToolName;
|
||||
public string machineNumber;
|
||||
public string machineSpindleNumber;
|
||||
public string machineClampingNumber;
|
||||
public string inputDate;
|
||||
public string reMarks;
|
||||
|
||||
|
||||
}
|
||||
class SapMeasureDataResult
|
||||
{
|
||||
public List<SapMeasureData> SapMeasureDataList;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user