|
|
@@ -977,7 +977,7 @@ namespace TeamAAS_VP.Core
|
|
|
try
|
|
|
{
|
|
|
await WriteSystemParameterToPlcAsync(_configService.GetSystemConfiguration());
|
|
|
- await WritePositionToPlcAsync();
|
|
|
+ await WriteParameterToPlcExAsync();
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
@@ -1187,6 +1187,17 @@ namespace TeamAAS_VP.Core
|
|
|
plc.SubscribeNodes("AutoSensor", monitorNodeIds, PlcCommandTrigger);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 将产品的参数统一写入PLC
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task WriteParameterToPlcExAsync()
|
|
|
+ {
|
|
|
+ await WritePositionToPlcAsync();// 写入点位信息给PLC
|
|
|
+ //await WriteParameterToPlcAsync();// 写入组装上下限给PLC
|
|
|
+ await WriteProductLoadModeToPLC();//把当前产品型号,写入PLC
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 写入点位信息给PLC
|
|
|
/// </summary>
|
|
|
@@ -1267,6 +1278,38 @@ namespace TeamAAS_VP.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 将当前产品类型写入PLC
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="mode"></param>
|
|
|
+ public async Task WriteProductLoadModeToPLC(int modeIndex)
|
|
|
+ {
|
|
|
+ var addressConfig = _configService.GetPlcAddresses();
|
|
|
+ var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
|
|
|
+ if (plc == null || !plc.IsConnected) return;
|
|
|
+
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_ProductLoadMode.Address, (Int16)modeIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 将当前产品类型写入PLC
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="mode"></param>
|
|
|
+ public async Task WriteProductLoadModeToPLC()
|
|
|
+ {
|
|
|
+ var addressConfig = _configService.GetPlcAddresses();
|
|
|
+ var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
|
|
|
+ if (plc == null || !plc.IsConnected) return;
|
|
|
+
|
|
|
+ var current = _productService.GetCurrentProduct();
|
|
|
+ if (current == null) return;
|
|
|
+
|
|
|
+ var qMes = await _systemDatabaseService.QueryProductFromMesAsync(current.Name);
|
|
|
+ if (qMes == null) return;
|
|
|
+
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_ProductLoadMode.Address, (Int16)qMes.ProductLoadMode);
|
|
|
+ }
|
|
|
+
|
|
|
PointF[] DowmCameraResults = new PointF[10];
|
|
|
PointF[] UpCameraPutResults = new PointF[10];
|
|
|
|
|
|
@@ -1290,6 +1333,9 @@ namespace TeamAAS_VP.Core
|
|
|
string[] model_num { get; set; } = new string[10];//产品model_num
|
|
|
string[] wo { get; set; } = new string[10];//产品wo
|
|
|
string[] color { get; set; } = new string[10];//产品color
|
|
|
+ string[] ppid { get; set; } = new string[10];//产品ppid
|
|
|
+ string[] revision { get; set; } = new string[10];//产品revision
|
|
|
+
|
|
|
Dictionary<string, string> dataToMes = new Dictionary<string, string>();//上传mes的数据
|
|
|
List<string> resultToMes = new List<string>();//上传mes的数据
|
|
|
/// <summary>
|
|
|
@@ -2232,7 +2278,8 @@ namespace TeamAAS_VP.Core
|
|
|
SendTaskMessage($"收到{i}过站检查请求(当站是否生产)...", MessageLevel.Debug);
|
|
|
}
|
|
|
|
|
|
- _LastMesCheckTime[i] = DateTime.Now;
|
|
|
+ //获取过站时间
|
|
|
+ _LastMesCheckTime[i] = (await _mesService.GetServerTimeAsync(i, code, 2)).Now;
|
|
|
LogHelper.WriteLogMes($"【mes开始QUERY】");
|
|
|
SendTaskMessage($"mes开始QUERY", MessageLevel.Info);
|
|
|
dataToMes.Clear();
|
|
|
@@ -2245,12 +2292,13 @@ namespace TeamAAS_VP.Core
|
|
|
string ProductMainSN_Temp = "";
|
|
|
LogHelper.WriteLogMes($"询问mes成功");
|
|
|
SendTaskMessage($"询问mes成功:{response}", MessageLevel.Debug);
|
|
|
-
|
|
|
string[] item = response.Split('\n');
|
|
|
- if (item[2].Contains("sn="))
|
|
|
+ //获取过度件sn
|
|
|
+ string snItem = item.FirstOrDefault(f => f.Contains("sn="));
|
|
|
+ if (snItem != null)
|
|
|
{
|
|
|
- ProductMainSN_Temp = item[2].Replace("sn=", "");
|
|
|
- SendTaskMessage($"流程sn:{ProductMainSN_Temp}", MessageLevel.Info);
|
|
|
+ ProductMainSN_Temp = snItem.Replace("sn=", "").Trim();
|
|
|
+ SendTaskMessage($"过度件sn:{ProductMainSN_Temp}", MessageLevel.Info);
|
|
|
}
|
|
|
|
|
|
LogHelper.WriteLogMes($"询问mes成功");
|
|
|
@@ -2264,28 +2312,43 @@ namespace TeamAAS_VP.Core
|
|
|
SendTaskMessage($"询问mes成功:{response2}", MessageLevel.Debug);
|
|
|
|
|
|
item = response2.Split('\n');
|
|
|
-
|
|
|
- if (item[1].Contains("color="))
|
|
|
+ snItem = item.FirstOrDefault(f => f.Contains("sn="));
|
|
|
+ if (snItem != null)
|
|
|
{
|
|
|
- color[i] = item[1].Replace("color=", "");
|
|
|
- SendTaskMessage($"产品color:{color[i]}", MessageLevel.Info);
|
|
|
+ ProductMainSN[i] = snItem.Replace("sn=", "").Trim();
|
|
|
+ _productService.CurrentProductCode = ProductMainSN[i];
|
|
|
+ _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
|
|
|
+ SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
- if (item[3].Contains("model_num="))
|
|
|
+ string woItem = item.FirstOrDefault(f => f.Contains("wo="));
|
|
|
+ if (woItem != null)
|
|
|
{
|
|
|
- model_num[i] = item[3].Replace("model_num=", "");
|
|
|
- SendTaskMessage($"产品model_num:{model_num[i]}", MessageLevel.Info);
|
|
|
+ wo[i] = woItem.Replace("wo=", "").Trim();
|
|
|
+ SendTaskMessage($"工单信息:{wo[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
- if (item[4].Contains("sn="))
|
|
|
+ string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
|
|
|
+ if (modelItem != null)
|
|
|
{
|
|
|
- ProductMainSN[i] = item[4].Replace("sn=", "");
|
|
|
- SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
|
|
|
- _productService.CurrentProductCode = ProductMainSN[i];
|
|
|
- _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
|
|
|
+ model_num[i] = modelItem.Replace("model_num=", "").Trim();
|
|
|
+ SendTaskMessage($"model_num:{model_num[i]}", MessageLevel.Info);
|
|
|
+ }
|
|
|
+ string colorItem = item.FirstOrDefault(f => f.Contains("color="));
|
|
|
+ if (colorItem != null)
|
|
|
+ {
|
|
|
+ color[i] = colorItem.Replace("color=", "").Trim();
|
|
|
+ SendTaskMessage($"color:{color[i]}", MessageLevel.Info);
|
|
|
+ }
|
|
|
+ string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
|
|
|
+ if (ppidItem != null)
|
|
|
+ {
|
|
|
+ ppid[i] = ppidItem.Replace("ppid=", "").Trim();
|
|
|
+ SendTaskMessage($"ppid:{ppid[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
- if (item[5].Contains("wo="))
|
|
|
+ string revisionItem = item.FirstOrDefault(f => f.Contains("revision="));
|
|
|
+ if (revisionItem != null)
|
|
|
{
|
|
|
- wo[i] = item[5].Replace("wo=", "");
|
|
|
- SendTaskMessage($"产品主wo:{wo[i]}", MessageLevel.Info);
|
|
|
+ revision[i] = revisionItem.Replace("revision=", "").Trim();
|
|
|
+ SendTaskMessage($"revision:{revision[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
|
|
|
LogHelper.WriteLogMes($"第二次询问mes成功");
|
|
|
@@ -2295,13 +2358,13 @@ namespace TeamAAS_VP.Core
|
|
|
if (i == 0)//i=0时才会切换产品
|
|
|
{
|
|
|
var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[i], color[i]);
|
|
|
- if (!string.IsNullOrEmpty(q))
|
|
|
+ if (q != null && !string.IsNullOrEmpty(q.ProductName))
|
|
|
{
|
|
|
ProductList = new ObservableCollection<ProductModel>(_productService.GetAllProducts());
|
|
|
Guid productId = Guid.Empty;
|
|
|
foreach (var itt in ProductList)
|
|
|
{
|
|
|
- if (itt.Name == q)
|
|
|
+ if (itt.Name == q.ProductName)
|
|
|
{
|
|
|
productId = itt.ID;
|
|
|
break;
|
|
|
@@ -2310,9 +2373,9 @@ namespace TeamAAS_VP.Core
|
|
|
if (currentProduct.ID != productId)
|
|
|
{
|
|
|
//切换产品
|
|
|
- _productService.LoadProduct(productId);
|
|
|
+ await _productService.LoadProductAsync(productId);
|
|
|
_productService.SetCurrentProduct(productId);
|
|
|
- await WritePositionToPlcAsync();
|
|
|
+ await WriteParameterToPlcExAsync();
|
|
|
SendTaskMessage($"切换产品成功", MessageLevel.Debug);
|
|
|
}
|
|
|
}
|
|
|
@@ -2353,41 +2416,56 @@ namespace TeamAAS_VP.Core
|
|
|
SendTaskMessage($"询问mes成功:{response}", MessageLevel.Debug);
|
|
|
|
|
|
var item = response.Split('\n');
|
|
|
-
|
|
|
- if (item[1].Contains("color="))
|
|
|
+ string snItem = item.FirstOrDefault(f => f.Contains("sn="));
|
|
|
+ if (snItem != null)
|
|
|
{
|
|
|
- color[i] = item[1].Replace("color=", "");
|
|
|
- SendTaskMessage($"产品color:{color[i]}", MessageLevel.Info);
|
|
|
+ ProductMainSN[i] = snItem.Replace("sn=", "").Trim();
|
|
|
+ _productService.CurrentProductCode = ProductMainSN[i];
|
|
|
+ _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
|
|
|
+ SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
- if (item[3].Contains("model_num="))
|
|
|
+ string woItem = item.FirstOrDefault(f => f.Contains("wo="));
|
|
|
+ if (woItem != null)
|
|
|
{
|
|
|
- model_num[i] = item[3].Replace("model_num=", "");
|
|
|
- SendTaskMessage($"产品model_num:{model_num[i]}", MessageLevel.Info);
|
|
|
+ wo[i] = woItem.Replace("wo=", "").Trim();
|
|
|
+ SendTaskMessage($"工单信息:{wo[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
- if (item[4].Contains("sn="))
|
|
|
+ string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
|
|
|
+ if (modelItem != null)
|
|
|
{
|
|
|
- ProductMainSN[i] = item[4].Replace("sn=", "");
|
|
|
- SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
|
|
|
- _productService.CurrentProductCode = ProductMainSN[i];
|
|
|
- _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
|
|
|
+ model_num[i] = modelItem.Replace("model_num=", "").Trim();
|
|
|
+ SendTaskMessage($"model_num:{model_num[i]}", MessageLevel.Info);
|
|
|
+ }
|
|
|
+ string colorItem = item.FirstOrDefault(f => f.Contains("color="));
|
|
|
+ if (colorItem != null)
|
|
|
+ {
|
|
|
+ color[i] = colorItem.Replace("color=", "").Trim();
|
|
|
+ SendTaskMessage($"color:{color[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
- if (item[5].Contains("wo="))
|
|
|
+ string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
|
|
|
+ if (ppidItem != null)
|
|
|
{
|
|
|
- wo[i] = item[5].Replace("wo=", "");
|
|
|
- SendTaskMessage($"产品主wo:{wo[i]}", MessageLevel.Info);
|
|
|
+ ppid[i] = ppidItem.Replace("ppid=", "").Trim();
|
|
|
+ SendTaskMessage($"ppid:{ppid[i]}", MessageLevel.Info);
|
|
|
+ }
|
|
|
+ string revisionItem = item.FirstOrDefault(f => f.Contains("revision="));
|
|
|
+ if (revisionItem != null)
|
|
|
+ {
|
|
|
+ revision[i] = revisionItem.Replace("revision=", "").Trim();
|
|
|
+ SendTaskMessage($"revision:{revision[i]}", MessageLevel.Info);
|
|
|
}
|
|
|
|
|
|
//切换产品
|
|
|
if (i == 0)//i=0时才会切换产品
|
|
|
{
|
|
|
var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[i], color[i]);
|
|
|
- if (!string.IsNullOrEmpty(q))
|
|
|
+ if (q != null && !string.IsNullOrEmpty(q.ProductName))
|
|
|
{
|
|
|
ProductList = new ObservableCollection<ProductModel>(_productService.GetAllProducts());
|
|
|
Guid productId = Guid.Empty;
|
|
|
foreach (var itt in ProductList)
|
|
|
{
|
|
|
- if (itt.Name == q)
|
|
|
+ if (itt.Name == q.ProductName)
|
|
|
{
|
|
|
productId = itt.ID;
|
|
|
break;
|
|
|
@@ -2396,9 +2474,9 @@ namespace TeamAAS_VP.Core
|
|
|
if (currentProduct.ID != productId)
|
|
|
{
|
|
|
//切换产品
|
|
|
- _productService.LoadProduct(productId);
|
|
|
+ await _productService.LoadProductAsync(productId);
|
|
|
_productService.SetCurrentProduct(productId);
|
|
|
- await WritePositionToPlcAsync();
|
|
|
+ await WriteParameterToPlcExAsync();
|
|
|
SendTaskMessage($"切换产品成功", MessageLevel.Debug);
|
|
|
}
|
|
|
}
|
|
|
@@ -2441,7 +2519,7 @@ namespace TeamAAS_VP.Core
|
|
|
{
|
|
|
if (_configService.GetDeviceInfo().EnableMES == true)
|
|
|
{
|
|
|
- DFC.Clear();
|
|
|
+ DFC.Clear();//CTQ数据集合
|
|
|
|
|
|
//获取当前工位的配置
|
|
|
var stationConfig = _configService.GetDeviceInfo(0);
|
|
|
@@ -2520,9 +2598,13 @@ namespace TeamAAS_VP.Core
|
|
|
turnRes = true;
|
|
|
}
|
|
|
else turnRes = false;
|
|
|
+
|
|
|
+ string midValue = "", saveppid = "";
|
|
|
+ if (stationConfig.SaveCsvPPID) saveppid = ppid[i];
|
|
|
+ midValue = ((lockResult.TargetTorqueLowerLimit + lockResult.TargetTorqueUpperLimit) / 2).ToString("F3");
|
|
|
DFC.Add(new DataFormCtq
|
|
|
{
|
|
|
- PPID = ProductMainSN[i],
|
|
|
+ PPID = saveppid,
|
|
|
ScrewNum = lockResult.Number,
|
|
|
PROCESS_NAME = stationConfig.DataInfo.PROCESS_NAME,
|
|
|
PROCESS_START_TIME = _LastMesCheckTime[i].ToString("yyyy-MM-ddTHH:mm:ss.fffffff") + "+08:00",
|
|
|
@@ -2540,11 +2622,17 @@ namespace TeamAAS_VP.Core
|
|
|
PROCESS_OUTCOME = torqueRes ? "PASS" : "FAIL",
|
|
|
PROCESS_MACHINE_ID = stationConfig.DataInfo.PROCESS_MACHINE_ID,
|
|
|
CTQ_UNIT_OF_MEASURE = "kgf.cm",
|
|
|
- ERROR_MESSAGE = torqueRes ? "" : "Torque_Spec OOS"
|
|
|
+ ERROR_MESSAGE = torqueRes ? "" : "Torque_Spec OOS",
|
|
|
+ PD_ATTR_01 = midValue,
|
|
|
+ PD_ATTR_02 = ProductMainSN[i],
|
|
|
+ PD_ATTR_03 = "",
|
|
|
+ PD_ATTR_04 = "",
|
|
|
+ PD_ATTR_05 = "",
|
|
|
});
|
|
|
+ midValue = ((lockResult.TargetTurnsLowerLimit + lockResult.TargetTurnsUpperLimit) / 2).ToString("F3");
|
|
|
DFC.Add(new DataFormCtq
|
|
|
{
|
|
|
- PPID = ProductMainSN[i],
|
|
|
+ PPID = saveppid,
|
|
|
ScrewNum = lockResult.Number,
|
|
|
PROCESS_NAME = stationConfig.DataInfo.PROCESS_NAME,
|
|
|
PROCESS_START_TIME = _LastMesCheckTime[i].ToString("yyyy-MM-ddTHH:mm:ss.fffffff") + "+08:00",
|
|
|
@@ -2562,11 +2650,17 @@ namespace TeamAAS_VP.Core
|
|
|
PROCESS_OUTCOME = turnRes ? "PASS" : "FAIL",
|
|
|
PROCESS_MACHINE_ID = stationConfig.DataInfo.PROCESS_MACHINE_ID,
|
|
|
CTQ_UNIT_OF_MEASURE = "圈",
|
|
|
- ERROR_MESSAGE = turnRes ? "" : "Turn_Spec OOS"
|
|
|
+ ERROR_MESSAGE = turnRes ? "" : "Turn_Spec OOS",
|
|
|
+ PD_ATTR_01 = midValue,
|
|
|
+ PD_ATTR_02 = ProductMainSN[i],
|
|
|
+ PD_ATTR_03 = "",
|
|
|
+ PD_ATTR_04 = "",
|
|
|
+ PD_ATTR_05 = "",
|
|
|
});
|
|
|
+ midValue = ((stationConfig.DataInfo.CTQ_LSL_Pressure + stationConfig.DataInfo.CTQ_USL_Pressure) / 2).ToString("F3");
|
|
|
DFC.Add(new DataFormCtq
|
|
|
{
|
|
|
- PPID = ProductMainSN[i],
|
|
|
+ PPID = saveppid,
|
|
|
ScrewNum = lockResult.Number,
|
|
|
PROCESS_NAME = stationConfig.DataInfo.PROCESS_NAME,
|
|
|
PROCESS_START_TIME = _LastMesCheckTime[i].ToString("yyyy-MM-ddTHH:mm:ss.fffffff") + "+08:00",
|
|
|
@@ -2584,7 +2678,12 @@ namespace TeamAAS_VP.Core
|
|
|
PROCESS_OUTCOME = pressureRes ? "PASS" : "FAIL",
|
|
|
PROCESS_MACHINE_ID = stationConfig.DataInfo.PROCESS_MACHINE_ID,
|
|
|
CTQ_UNIT_OF_MEASURE = "N",
|
|
|
- ERROR_MESSAGE = pressureRes ? "" : "Pressure_Spec OOS"
|
|
|
+ ERROR_MESSAGE = pressureRes ? "" : "Pressure_Spec OOS",
|
|
|
+ PD_ATTR_01 = midValue,
|
|
|
+ PD_ATTR_02 = ProductMainSN[i],
|
|
|
+ PD_ATTR_03 = "",
|
|
|
+ PD_ATTR_04 = "",
|
|
|
+ PD_ATTR_05 = "",
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
@@ -3280,7 +3379,7 @@ namespace TeamAAS_VP.Core
|
|
|
if (!File.Exists(fullPath))
|
|
|
{
|
|
|
sb.Append("PPID,Screw_Number,PROCESS_NAME,PROCESS_START_TIME,CTQ_NAME,CTQ_VALUE,CTQ_LSL,CTQ_USL,PROCESS_END_TIME,SUPPLIER_NAME,COMMODITY_TYPE,REVISION,WO#,MFG_LOT#," +
|
|
|
- "MFG_ASSY_LINE,PROCESS_OUTCOME,PROCESS_MACHINE_ID,CTQ_UNIT_OF_MEASURE,ERROR_MESSAGE");
|
|
|
+ "MFG_ASSY_LINE,PROCESS_OUTCOME,PROCESS_MACHINE_ID,CTQ_UNIT_OF_MEASURE,ERROR_MESSAGE,PD_ATTR_01,PD_ATTR_02,PD_ATTR_03,PD_ATTR_04,PD_ATTR_05");
|
|
|
sb.AppendLine();
|
|
|
}
|
|
|
if (dfcs == null || dfcs.Count() == 0)
|
|
|
@@ -3289,7 +3388,7 @@ namespace TeamAAS_VP.Core
|
|
|
}
|
|
|
foreach (var dfc in dfcs)
|
|
|
{
|
|
|
- sb.Append($"{dfc.PPID},{dfc.ScrewNum},{dfc.PROCESS_NAME},{dfc.PROCESS_START_TIME},{dfc.CTQ_NAME},{dfc.CTQ_VALUE:F3},{dfc.CTQ_LSL:F3},{dfc.CTQ_USL:F3},{dfc.PROCESS_END_TIME},{dfc.SUPPLIER_NAME},{dfc.COMMODITY_TYPE},{dfc.REVISION},{dfc.WO},{dfc.MFG_LOT},{dfc.MFG_ASSY_LINE},{dfc.PROCESS_OUTCOME},{dfc.PROCESS_MACHINE_ID},{dfc.CTQ_UNIT_OF_MEASURE},{dfc.ERROR_MESSAGE}");
|
|
|
+ sb.Append($"{dfc.PPID},{dfc.ScrewNum},{dfc.PROCESS_NAME},{dfc.PROCESS_START_TIME},{dfc.CTQ_NAME},{dfc.CTQ_VALUE:F3},{dfc.CTQ_LSL:F3},{dfc.CTQ_USL:F3},{dfc.PROCESS_END_TIME},{dfc.SUPPLIER_NAME},{dfc.COMMODITY_TYPE},{dfc.REVISION},{dfc.WO},{dfc.MFG_LOT},{dfc.MFG_ASSY_LINE},{dfc.PROCESS_OUTCOME},{dfc.PROCESS_MACHINE_ID},{dfc.CTQ_UNIT_OF_MEASURE},{dfc.ERROR_MESSAGE},{dfc.PD_ATTR_01},{dfc.PD_ATTR_02},{dfc.PD_ATTR_03},{dfc.PD_ATTR_04},{dfc.PD_ATTR_05}");
|
|
|
sb.AppendLine();
|
|
|
}
|
|
|
// 使用 StreamWriter 以追加模式打开文件
|