using AR;
using Emgu.CV.BgSegm;
using Microsoft.Owin.StaticFiles;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Management;
using System.Net;
using System.Net.NetworkInformation;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Project
{
public static class PUB
{
public static string MCCode = "IB";
public static Class.StatusMessage StatusMessage { get; set; } = new Class.StatusMessage();
public static string[] WaitMessage = new string[] { "", "", "", "", "", "", "", "", "", "", "" };
public static byte[] swPLCBuffer = new byte[16];
//########################################################
// DEVICE DEFINE
//########################################################
public static arDev.DIO.IDIO dio; //Ajin
public static arDev.MOT.IMotion mot; //Ajin
public static arDev.RS232 remocon;
public static arDev.RS232 BarcodeFix;
public static AR.MemoryMap.Client plc;
public static Device.SATOPrinterAPI PrinterL;
public static Device.SATOPrinterAPI PrinterR;
public static arDev.Joystick.JoystickRaw joypad;
public static WatsonWebsocket.WatsonWsClient wsL;
public static WatsonWebsocket.WatsonWsClient wsR;
public static arDev.Joystick.JoystickRaw joystick;
//public static StdLabelPrint.LabelPrint PrinterL = null;
//public static StdLabelPrint.LabelPrint PrinterR = null;
public static Device.KeyenceBarcode keyenceF = null;
public static Device.KeyenceBarcode keyenceR = null;
public static int uploadcount = 0;
public static DateTime BuzzerTime;
public static DateTime MGZRunTime;
public static CounterSetting counter;
//public static Flag flag;
public static MessageWindow popup;
//interlock check
public static CInterLock[] iLock;
public static CInterLock iLockPRL; //printer -left
public static CInterLock iLockPRR; //printer -right
public static CInterLock iLockVS0; //visoin - 0
public static CInterLock iLockVS1; //vision - 1
public static CInterLock iLockVS2; //vision - 2
public static CInterLock iLockCVL;
public static CInterLock iLockCVR;
public static System.Threading.ManualResetEvent LockModel = new System.Threading.ManualResetEvent(true);
///
/// database manager
///
//public static Manager.DatabaseManagerHistory dbmHistory; //트레이기록(날짜기준)
public static Manager.DatabaseManagerCount dbmCount; //수량기록(ID기준)
public static Manager.DatabaseManagerSIDHistory dbmSidHistory;
//public static Manager.DataBaseMSSQL dbSQL;
///
/// model manager
///
public static Manager.ModelManager mdm;
public static System_MotParameter system_mot;
public static SystemSetting system;
public static UserSetting uSetting;
//public static CommonSetting setting;
public static arUtil.Log logVision;
public static arUtil.Log log;
public static arUtil.Log logILStop;
public static arUtil.Log logDbg;
public static arUtil.Log logFlag;
public static arUtil.Log logILock;
public static arUtil.Log logWS;
public static arUtil.Log logKeyence;
// public static arUtil.Log logCV;
public static arUtil.Log logbarcode;
public static DataSet1.UsersDataTable userList;
public static DataSet1.MailRecipientDataTable mailList;
public static DataSet1.MailFormatDataTable mailForm;
public static DateTime LastInputTime = DateTime.Now;
public static CResult Result;
public static double FreeSpace = 0;
//########################################################
// DEVICE DEFINE
//########################################################
public static Device.CStateMachine sm; //상태머신분리 190529
public static Boolean UserAdmin { get { return true; } }
public static bool OPT_CAMERA(eWorkPort target)
{
var retval = VAR.BOOL[eVarBool.Opt_DisableCamera];
if (retval == false)
{
//전체옵션은 사용가능하지만 환경설정의 개별옵션이 꺼진경우에 동작안함
retval = !AR.SETTING.Data.Enable_Unloader_QRValidation;
}
return retval;
}
public static bool OPT_BYPASS()
{
return SETTING.Data.SystemBypass;
}
public static bool OPT_PRINTEROFF(eWorkPort target)
{
var retval = VAR.BOOL[eVarBool.Opt_DisablePrinter];
if (retval == false)
{
//전체옵션은 사용가능하지만 환경설정의 개별옵션이 꺼진경우에 동작안함
if (target == eWorkPort.Left)
retval = AR.SETTING.Data.Disable_PrinterL;
else
retval = AR.SETTING.Data.Disable_PrinterR;
}
return retval;
}
public static void AddDebugLog(string div, string msg, Boolean iserr = false)
{
if (AR.SETTING.Data.Log_Debug == false) return;
if (iserr) PUB.logDbg.AddE(msg);
else PUB.logDbg.Add(div, msg);
}
///
/// SQL Database Connection String
///
///
public static string GetWMSConnectionString()
{
if (SETTING.Data.WMS_DB_PROD)
return Properties.Settings.Default.WMS_PRD;
else
return Properties.Settings.Default.WMS_DEV;
}
public static bool SelectModelM(string modelName, bool bUploadConfig = true)
{
//if (this.InvokeRequired)
//{
// this.Invoke(new SelectModelHandler(SelectModelM), new object[] { modelName, bUploadConfig });
// return;
//}
//초기화
var rlt = PUB.Result.mModel.ReadValue(modelName);
if (rlt && PUB.Result.mModel.isSet)
{
PUB.log.AddAT("모션모델선택완료 : " + PUB.Result.mModel.Title);
//사용한 모델이름을 저장함
if (PUB.uSetting.LastModelM != PUB.Result.mModel.Title)
{
PUB.uSetting.LastModelM = PUB.Result.mModel.Title;
PUB.uSetting.Save();
}
return true;
}
else
{
PUB.log.AddE("모션모델선택실패(없는모델명:" + modelName + ")");
return false;
}
}
public static void AddDebugLog(string msg, Boolean iserr = false)
{
PUB.logDbg.Add("NORMAL", msg, iserr);
}
//public static bool PrintSend(bool left, string zpl)
//{
// var dev = left ? PUB.PrinterL : PUB.PrinterR;
// var tag = left ? COMM.SETTING.Data.PrintL_AddSend : COMM.SETTING.Data.PrintR_AddSend;
// if (dev.IsOpen == false) return false;
// try
// {
// dev.Write(zpl);
// //추가
// if (tag.isEmpty() == false)
// {
// var addbytes = UTIL.ConvertHexStringToByte(tag);
// dev.Write(addbytes);
// }
// return true;
// }
// catch (Exception ex)
// {
// return false;
// }
//}
public static bool UpdateWMS(Class.VisionData Data)
{
return false;
}
public static bool SelectModelV(string modelName, bool bUploadConfig = true)
{
//
//if (this.InvokeRequired)
//{
// this.Invoke(new SelectModelHandler(SelectModelV), new object[] { modelName, bUploadConfig });
// return;
//}
//초기화
PUB.Result.vModel.Title = string.Empty;
var modelVision = PUB.mdm.GetDataV(modelName);
if (modelVision != null)
{
var mv = PUB.Result.vModel;
mv.ReadValue(modelVision); //Util.CopyData(model, Pub.Result.vModel);
PUB.log.AddAT("작업모델선택완료 : " + mv.Title);
//선택한 모델을 저장함
if (PUB.uSetting.LastModelV != mv.Title)
{
PUB.uSetting.LastModelV = mv.Title;
PUB.uSetting.Save();
}
PUB.Result.BCDPattern = PUB.GetPatterns(modelName, false);
PUB.Result.BCDIgnorePattern = PUB.GetPatterns(modelName, true);
PUB.Result.BCDPrintPattern = PUB.GetPrintPatterns(); //220902
PUB.log.Add($"모델패턴로딩:{PUB.Result.BCDPattern.Count}/{PUB.Result.BCDIgnorePattern.Count}");
if (modelVision.Code.isEmpty())
{
//PUB.Result.CustCode = string.Empty;
VAR.STR[eVarString.JOB_CUSTOMER_CODE] = string.Empty;
}
else
{
var codlist = modelVision.Code.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
string custcode = string.Empty;
if (codlist.Length == 1) custcode = codlist[0];
VAR.STR[eVarString.JOB_CUSTOMER_CODE] = custcode;
}
//모든 저장된 바코드를 삭제한ㄷ.
PUB.Result.ItemDataC.Clear("SELCTMODEL");
//바코드설정파일 업데이트
if (bUploadConfig)
{
//SAVE
UpLoadBarcodeConfig(PUB.keyenceF);
UpLoadBarcodeConfig(PUB.keyenceR);
}
return true;
}
else
{
//PUB.Result.CustCode = string.Empty;
VAR.STR[eVarString.JOB_CUSTOMER_CODE] = string.Empty;
PUB.log.AddE("모델선택실패(없는모델명:" + modelName + ")");
return false;
}
}
public static bool UpLoadBarcodeConfig(Device.KeyenceBarcode keyence)
{
if (keyence == null || keyence.IsConnect == false)
{
var tagstr = keyence?.Tag ?? string.Empty;
PUB.log.AddAT($"바코드({tagstr})가 연결되지 않아 설정 파일을 업로드하지 않습니다." +
"신규 작업 시작시 해당 정보는 재 전송 됩니다." +
$"{(tagstr == "F" ? "좌" : "우")}측하단의 바코드 연결을 확인 후 모델을 선택하시면 이 오류가 발생되지 않습니다");
return false;
}
//바코드설정파일 입력
var mv = PUB.Result.vModel;
var configfilenameB = mv.Title;
if (configfilenameB.isEmpty()) configfilenameB = mv.Title;
if (configfilenameB.EndsWith(keyence.Tag) == false) configfilenameB += keyence.Tag;
var configfilenameJ = configfilenameB;
//var jobcode = VAR.STR[eVarString.JOB_TYPE];
//if (jobcode.isEmpty() == false) configfilenameJ += $"_{jobcode}";
//else PUB.log.AddAT($"작업형태값이 없어 모델 기본을 사용 합니다");
if (configfilenameB.ToLower().EndsWith("ptc") == false) configfilenameB += ".ptc";
if (configfilenameJ.ToLower().EndsWith("ptc") == false) configfilenameJ += ".ptc";
var configpathB = System.IO.Path.Combine(UTIL.CurrentPath, "Model", configfilenameB);
var configpathJ = System.IO.Path.Combine(UTIL.CurrentPath, "Model", configfilenameJ);
var configfiB = new System.IO.FileInfo(configpathB);
var configfiJ = new System.IO.FileInfo(configpathJ);
if (configfiB.Exists == false && configfiJ.Exists == false)
{
PUB.log.AddAT($"바코드({keyence.Tag}) 설정파일({configfiB.Name})이 없습니다");
}
else
{
try
{
//접속되어잇ㅇ츠면 끈다
var ip = keyence.Tag == "F" ? SETTING.Data.Keyence_IPF : SETTING.Data.Keyence_IPR;
if (keyence.IsConnect) keyence.Trigger(false);
var ftp = new AR.FTPClient.FTPClient();
ftp.Host = ip;// COMM.SETTING.Data.Keyence_IPF;
ftp.Port = 21;
var UPFileName = @"\CONFIG\CONFIG.PTC";
var fn = configfiJ.Exists ? configfiJ.FullName : configfiB.FullName;
var upOk = ftp.Upload(UPFileName, fn);
if (upOk == false) PUB.log.AddE($"바코드({keyence.Tag}) 설정파일 업로드 실패");
else PUB.log.AddI($"바코드({keyence.Tag}) 설정파일 업로드 완료({fn})");
if (keyence.IsConnect) keyence.Trigger(true);
return true;
}
catch (Exception ex)
{
PUB.log.AddE($"바코드({keyence.Tag}) FTP전송 실패:{ex.Message}");
}
}
return false;
}
public static Task> UpdateSIDInfo()
{
var rlt = Task.Run>(() =>
{
bool result = false;
string message = string.Empty;
int cnt = 0;
int rdy = 0;
System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch();
wat.Restart();
//기존 SID정보에서 데이터를 취합니다.
var mc = AR.SETTING.Data.McName;
PUB.log.AddAT($"환경설정에서 ECS SKIP이 되었습니다 기존 정보에서 데이터를 생성합니다 MC={mc}");
using (var tainfo = new DataSet1TableAdapters.Component_Reel_SID_InformationTableAdapter())
{
var cntd = tainfo.DeleteAll("IB");
PUB.log.AddAT($"{cntd}건의 자료가 삭제됨");
var cnti = tainfo.MakeIBData(mc);
PUB.log.AddAT($"{cnti}건의 자료가 복제됨");
}
message = "ECS-OFF 됨 장비전용 데이터로 진행 함";
result = true;
rdy = 1;
wat.Stop();
PUB.log.Add($"{cnt}건의 sid정보가 추가됨 {wat.ElapsedMilliseconds:N2}ms");
return new Tuple(result, message, rdy);
});
return rlt;
}
///
/// 전체 작업목록을 별도파일에 저장한다
///
///
///
///
public static void AddJobList(string seqdate, string seqno, string file)
{
//해당 차수로 저장된 파일이 잇는지 체크한다.
var savepath = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, "JobData", seqdate.Substring(0, 6), seqdate + "-" + seqno + ".txt");
var fi = new System.IO.FileInfo(savepath);
if (fi.Directory.Exists == false) fi.Directory.Create(); //폴더가 없다면 생성
//신규파일이므로, 해당 내용을 모두 옴겨놓는다(번호는 중요치않다)
List savedList = new List();
if (fi.Exists)
{
var oldlist = System.IO.File.ReadAllLines(fi.FullName, System.Text.Encoding.UTF8);
savedList.AddRange(oldlist);
}
//기존목록을 불러와서 없는 데이터만 추가해준다.
var newbuffer = System.IO.File.ReadAllLines(file, System.Text.Encoding.UTF8);
foreach (var line in newbuffer)
{
if (line.isEmpty() || line.StartsWith("#")) continue;
var buffer = line.Split('\t');
var raw = buffer[3].Trim();
if (savedList.Where(t => t == raw).Count() == 0)
savedList.Add(raw);
}
//전체목록을 저장한다
System.IO.File.WriteAllLines(fi.FullName, savedList.ToArray(), System.Text.Encoding.UTF8);
}
public static bool GetSIDConverDB()
{
//230509
try
{
//sid정보테이블을 다시 불러온다
var taConv = new DataSet1TableAdapters.Component_Reel_SID_ConvertTableAdapter();
PUB.Result.DTSidConvert.Clear();
taConv.Fill(PUB.Result.DTSidConvert);
PUB.Result.DTSidConvert.AcceptChanges();
PUB.Result.DTSidConvertEmptyList.Clear();
PUB.Result.DTSidConvertMultiList.Clear();
PUB.log.Add($"sid변환테이블 {PUB.Result.DTSidConvert.Rows.Count}건 확인");
return true;
}
catch (Exception ex)
{
PUB.log.AddE("SID변환정보 확인실패\n" + ex.Message);
return false;
}
}
public static string SIDCovert(string oldsid, string src, out bool err)
{
err = true;
var retval = string.Empty;
//원본sid가 있어야 한다
if (oldsid.isEmpty())
{
return $"[{src}] 원본SID값이 없습니다";
}
try
{
if (PUB.Result.DTSidConvert.Any() == false)
{
GetSIDConverDB();
if (PUB.Result.DTSidConvert.Any())
{
PUB.log.Add($"[{src}] sid변환테이블조회결과 {PUB.Result.DTSidConvert.Rows.Count}건");
VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] = false;
}
else
{
PUB.log.AddAT($"SId변환테이블에 자료가 없습니다");
VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] = true;
}
}
}
catch (Exception ex)
{
PUB.log.AddE(ex.Message);
}
if (PUB.sm.Step == eSMStep.RUN)
PUB.log.Add($"[{src}] sid변환작업시작 원본:{oldsid}");
var sidconvlist = PUB.Result.DTSidConvert.Where(t => t.SIDFrom.Equals(oldsid));
if (sidconvlist.Any() == false)
{
PUB.Result.DTSidConvertEmptyList.Add(oldsid);
return $"SID변환정보없음({oldsid}) 전체 DB {PUB.Result.DTSidConvert.Rows.Count}건";
}
else
{
if (sidconvlist.Count() != 1)
{
//여러개가 있다면 그 데이터 목록을 반환한다.
PUB.Result.DTSidConvertMultiList.Add(oldsid);
var sb = new System.Text.StringBuilder();
var tolist = sidconvlist.Select(t => t.SIDTo).ToList();
return string.Join("|", tolist);
//foreach(var dr in sidconvlist)
//{
// sb.AppendLine($"{dr.SIDFrom}|{dr.SIDTo}");
//}
//return ($"sid변환테이블정보복수 {sidconvlist.Count()}건 있음");
}
else
{
//1건의 변경정보가 있다.
//sid값의 빈값 및 동일sid값은 db쿼리시에 진행했으니 이곳의 데이터는 꺠긋하다
var sidconvDr = sidconvlist.First();
err = false;
if (PUB.sm.Step == eSMStep.RUN)
PUB.log.AddI($"[{src}] sid변환완료 {oldsid}->{sidconvDr.SIDTo}");
return sidconvDr.SIDTo;
}
}
}
///
/// 바코드값을 비젼버퍼에 기록합니다.
///
///
///
///
/// 바코드 룰에서 신뢰 하도록 됨(amkor std 라벨이 설정되어있음)
///
public static bool SetBCDValue(Class.VisionData vdata, string TargetPos, string Value, bool trust)
{
bool retval = false;
Value = Value.Replace("\r", "").Replace("\n", "").Trim();
//220901 - 특문있으면 추가 제거
var r1 = (char)0x1D;
var r2 = (char)0x1E;
var r3 = (char)0x04;
Value = Value.Replace(r1.ToString(), "");
Value = Value.Replace(r2.ToString(), "");
Value = Value.Replace(r3.ToString(), "");
Value = Value.Replace("\r", "");
Value = Value.Replace("\n", "");
Value = Value.RemoveNoneASCII().Trim();
switch (TargetPos)
{
case "TARGET":
if (vdata.Target != Value) PUB.log.Add($"update target : {vdata.Target} > {Value}");
vdata.Target = Value;
retval = true;
break;
case "MCN":
if (vdata.MCN != Value) PUB.log.Add($"update mcn : {vdata.MCN} > {Value}");
vdata.MCN = Value;
retval = true;
break;
case "SID":
if (vdata.SID.isEmpty())
{
vdata.SID = Value;
vdata.SID_Trust = trust && vdata.SID.Length == 9 && vdata.SID.StartsWith("10");
retval = true;
}
else
{
//이전의 값이있지만 신뢰값이 아닌경우이다
if (vdata.SID_Trust == false)
{
if (trust)
{
vdata.SID = Value;
vdata.SID_Trust = (vdata.SID.Length == 9 && vdata.SID.StartsWith("10"));
retval = true;
}
}
}
break;
case "RID":
if (vdata.RID.isEmpty())
{
vdata.SetRID(Value, "PASER");
vdata.RID_Trust = trust;
retval = true;
}
else
{
//if value is not empty , check trust level and Apply data
if (vdata.RID_Trust == false)
{
if (trust)
{
vdata.SetRID(Value, "PASER");
vdata.RID_Trust = trust;
retval = true;
}
}
else
{
//check newreelid _ old data
if (vdata.RIDNew)
{
if (vdata.RID0.isEmpty())
{
PUB.log.Add($"RID(Org) Set =>{Value}");
vdata.RID0 = Value;
}
}
}
}
break;
case "VLOT":
if (vdata.VLOT.isEmpty())
{
vdata.VLOT = Value;
vdata.VLOT_Trust = trust;
retval = true;
}
else
{
//if value is not empty , check trust level and Apply data
if (vdata.VLOT_Trust == false)
{
if (trust)
{
vdata.VLOT = Value;
vdata.VLOT_Trust = true;
retval = true;
}
}
}
break;
case "VNAME":
if (vdata.VNAME.isEmpty())
{
vdata.VNAME = Value;
vdata.VNAME_Trust = trust;
retval = true;
}
else
{
//if value is not empty , check trust level and Apply data
if (vdata.VNAME_Trust == false)
{
if (trust)
{
vdata.VNAME = Value;
vdata.VNAME_Trust = true;
retval = true;
}
}
}
break;
case "PART":
if (vdata.PARTNO.isEmpty())
{
vdata.PARTNO = Value;
vdata.PARTNO_Trust = trust;
retval = true;
}
else
{
//if value is not empty , check trust level and Apply data
if (vdata.PARTNO_Trust == false)
{
if (trust)
{
vdata.PARTNO = Value;
vdata.PARTNO_Trust = true;
retval = true;
}
}
}
break;
case "MFG":
if (vdata.MFGDATE.isEmpty())
{
vdata.MFGDATE = Value;
vdata.MFGDATE_Trust = trust;
retval = true;
}
else
{
//if value is not empty , check trust level and Apply data
if (vdata.MFGDATE_Trust == false)
{
if (trust)
{
vdata.MFGDATE = Value;
vdata.MFGDATE_Trust = true;
retval = true;
}
}
}
break;
case "QTY":
if (vdata.QTY.isEmpty())
{
vdata.QTY = Value;
vdata.QTY_Trust = trust;
retval = true;
}
else
{
//if value is not empty , check trust level and Apply data
if (vdata.QTY_Trust == false)
{
if (trust)
{
vdata.QTY = Value;
vdata.QTY_Trust = true;
retval = true;
}
}
else
{
//신규발행에의해 신뢰된 자료라면 원본릴아이디에 이 값을 쓴다
if (vdata.QTY0.Equals("NONE") || vdata.QTY0.isEmpty())
{
PUB.log.AddAT($"릴수량(원본)값 적용(신규값적용상태):{Value}");
vdata.QTY0 = Value.Trim();
}
}
}
break;
case "QTYRQ":
if (vdata.QTY.isEmpty())
{
vdata.QTY = Value;
vdata.QTYRQ = true;
vdata.QTY_Trust = trust;
retval = true;
}
else
{
if (trust) //if value is trust,
{
vdata.QTY = Value;
vdata.QTYRQ = true;
vdata.QTY_Trust = true;
retval = true;
}
}
break;
}
return retval;
}
public static List GetPatterns(string custname, bool ignore)
{
var patterns = new List();
if (custname.isEmpty()) custname = "%";
//데이터베이스에서 해당 데이터를 가져온다
if (AR.SETTING.Data.OnlineMode)
{
try
{
using (var ta = new DataSet1TableAdapters.Component_Reel_RegExRuleTableAdapter())
{
ta.ClearBeforeFill = true;
if (ignore) ta.FillIgnore(PUB.mdm.dataSet.Component_Reel_RegExRule, custname);
else ta.Fill(PUB.mdm.dataSet.Component_Reel_RegExRule, custname);
PUB.mdm.dataSet.Component_Reel_RegExRule.AcceptChanges();
}
}
catch (Exception ex)
{
PUB.log.Add(ex.Message);
}
}
//data
foreach (DataSet1.Component_Reel_RegExRuleRow dr in PUB.mdm.dataSet.Component_Reel_RegExRule)
{
if (ignore)
{
if (dr.Pattern.isEmpty()) continue;
}
else
{
if (dr.Groups.isEmpty() || dr.Pattern.isEmpty()) continue;
}
var groupsbuf = dr.Groups.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var Groups = new List();
foreach (var item in groupsbuf)
{
var itembuf = item.Split('=');
Groups.Add(new Class.RegexGroupMatch
{
GroupNo = int.Parse(itembuf[1].Trim()),
TargetPos = itembuf[0].Trim(),
});
}
//add pattern data
patterns.Add(new Class.RegexPattern
{
Seq = dr.Seq,
Customer = dr.CustCode,
Description = dr.Description,
Symbol = dr.Symbol,
Pattern = dr.Pattern,
IsTrust = dr.IsTrust,
IsAmkStd = dr.IsAmkStd,
IsEnable = dr.IsEnable,
Groups = Groups.ToArray(),
});
}
return patterns;
}
public static List GetPrintPatterns()
{
var patterns = new List();
//if (custname.isEmpty()) custname = "%";
//데이터베이스에서 해당 데이터를 가져온다
if (AR.SETTING.Data.OnlineMode)
{
try
{
using (var ta = new DataSet1TableAdapters.Component_Reel_PrintRegExRuleTableAdapter())
{
ta.ClearBeforeFill = true;
ta.Fill(PUB.mdm.dataSet.Component_Reel_PrintRegExRule);
PUB.mdm.dataSet.Component_Reel_RegExRule.AcceptChanges();
}
}
catch (Exception ex)
{
PUB.log.AddE(ex.Message);
}
}
//data
foreach (DataSet1.Component_Reel_PrintRegExRuleRow dr in PUB.mdm.dataSet.Component_Reel_PrintRegExRule)
{
if (dr.Groups.isEmpty() || dr.Pattern.isEmpty()) continue;
var groupsbuf = dr.Groups.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var Groups = new List();
foreach (var item in groupsbuf)
{
var itembuf = item.Split('=');
Groups.Add(new Class.RegexGroupMatch
{
GroupNo = int.Parse(itembuf[1].Trim()),
TargetPos = itembuf[0].Trim(),
});
}
//add pattern data
patterns.Add(new Class.RegexPattern
{
Seq = dr.Seq,
Customer = dr.CustCode,
Description = dr.Description,
Symbol = dr.Symbol,
Pattern = dr.Pattern,
Groups = Groups.ToArray(),
});
}
return patterns;
}
public static int RemoveCache(string basefile)
{
var fi = new System.IO.FileInfo(basefile);
//해당폴더에서 해당 차수의 파일 및 다른 확장자 모두를 삭제한다.
var fisearch = fi.Name.Replace(fi.Extension, ".*");
var delFiles = fi.Directory.GetFiles(fisearch, System.IO.SearchOption.TopDirectoryOnly);
if (delFiles.Count() < 1) return 0;
else
{
//파일을 삭제한다.
var cnt = 0;
try
{
foreach (var delFile in delFiles)
{
PUB.log.Add("보관파일삭제: " + delFile.FullName);
delFile.Delete();
cnt += 1;
}
}
catch (Exception ex)
{
PUB.log.AddE(ex.Message);
}
return cnt;
}
}
//public static class flag
//{
// public static void set(eFlag idx, bool value, string remark)
// {
// VAR.BOOL[(int)idx]
// }
//}
public static class flag
{
public static bool get(eVarBool flag)
{
return VAR.BOOL[(int)flag];
}
public static void set(eVarBool flag, bool value, string remark)
{
VAR.BOOL.Set((int)flag, value, remark);
}
}
public static void initCore()
{
//system parameter
system = new SystemSetting();
system.Load();
system_mot = new System_MotParameter(UTIL.MakePath("System_mot.xml"));
system_mot.Load();
//setting
SETTING.Load();
VAR.Init(LenI32: 128, LenBool: 192);
//flag = new VarDataBool(128);
//user setting
uSetting = new UserSetting();
uSetting.Load();
//counter setting
counter = new CounterSetting();
counter.Load();
//log
log = new arUtil.Log();
logDbg = new arUtil.Log(); logDbg.FileNameFormat = "{yyyyMMdd}_DEBUG";
logFlag = new arUtil.Log(); logFlag.FileNameFormat = "{yyyyMMdd}_FG";
logILock = new arUtil.Log(); logILock.FileNameFormat = "{yyyyMMdd}_IL";
logbarcode = new arUtil.Log(); logbarcode.FileNameFormat = "{yyyyMMdd}_BC";
logWS = new arUtil.Log(); logWS.FileNameFormat = "{yyyyMMdd}_WS";
logKeyence = new arUtil.Log(); logKeyence.FileNameFormat = "{yyyyMMdd}_KEYENCE";
logILStop = new arUtil.Log(); logILStop.FileNameFormat = "{yyyyMMdd}_ILOCK";
logVision = new arUtil.Log(); logVision.FileNameFormat = "{yyyyMMdd}_VISION";
//popupmessage
popup = new MessageWindow();
popup.WindowClose += popup_WindowClose;
popup.WindowOpen += popup_WindowOpen;
//zpl파일 만든다.
var fn = System.IO.Path.Combine(UTIL.CurrentPath, "zpl.txt");
if (System.IO.File.Exists(fn) == false)
{
System.IO.File.WriteAllText(fn, Properties.Settings.Default.ZPL, System.Text.Encoding.Default);
}
}
static void popup_WindowOpen(object sender, EventArgs e)
{
var msgdata = sender as MessageWindow.CMessageData;
Console.WriteLine("window open : " + msgdata.Tag);
}
static void popup_WindowClose(object sender, EventArgs e)
{
var msgdata = sender as MessageWindow.CMessageData;
Console.WriteLine("window close : " + msgdata.Tag);
}
public static void LogFlush()
{
PUB.log.Flush();
PUB.logbarcode.Flush();
PUB.logDbg.Flush();
PUB.logFlag.Flush();
PUB.logILock.Flush();
PUB.logKeyence.Flush();
PUB.logILStop.Flush();
PUB.logVision.Flush();
}
public static void init()
{
Result = new CResult();
//state machine
sm = new Device.CStateMachine();
//database
mdm = new Manager.ModelManager(
UTIL.CurrentPath + "Model\\modelv.csv",
UTIL.CurrentPath + "Model\\modelc.csv",
UTIL.CurrentPath + "Model\\modele.xml",
UTIL.CurrentPath + "Model\\modeli.xml",
UTIL.CurrentPath + "Model\\modelo.xml");
mdm.Load();
//핀정보설정
DIO.Pin = new PinList();
DIO.Pin.SetOutputData(PUB.mdm.dataSet.OutputDescription);
DIO.Pin.SetInputData(PUB.mdm.dataSet.InputDescription);
//dbSQL = new Manager.DataBaseMSSQL();
//dbmHistory = new Manager.DatabaseManagerHistory();
dbmSidHistory = new Manager.DatabaseManagerSIDHistory();
dbmCount = new Manager.DatabaseManagerCount();
dbmCount.dataPath = AR.SETTING.Data.Path_Data; //200113
dio = new arDev.AjinEXTEK.DIO();
mot = new arDev.AjinEXTEK.MOT();
// flag = new Flag();
//모터축에대한 인터락우선추가
var axislist = Enum.GetNames(typeof(eAxis));
iLock = new CInterLock[axislist.Length];
int i = 0;
for (i = 0; i < axislist.Length; i++)
{
var axisname = axislist[i];
iLock[i] = new CInterLock(64, axisname);
iLock[i].idx = i;
}
//프린터관련 인터락추가
iLockPRL = new CInterLock(64, "PRL");
iLockPRR = new CInterLock(64, "PRR");
iLockVS0 = new CInterLock(64, "VS0");
iLockVS1 = new CInterLock(64, "VS1");
iLockVS2 = new CInterLock(64, "VS2");
iLockCVL = new CInterLock(64, "CVL");
iLockCVR = new CInterLock(64, "CVR");
Array.Resize(ref iLock, axislist.Length + 7);
iLock[i++] = iLockPRL;
iLock[i++] = iLockPRR;
iLock[i++] = iLockVS0;
iLock[i++] = iLockVS1;
iLock[i++] = iLockVS2;
iLock[i++] = iLockCVL;
iLock[i++] = iLockCVR;
//default를 해제하면 sps에서 할당제한을 한다
//sps도 같이 체크해야함
for (i = 7; i < iLock.Length; i++)
{
//iLock[i].DefaultLock = false;
iLock[i].idx = i;
}
//language
Lang.Loading(AR.SETTING.Data.Language + ".ini");
LoadDataTable();
//allow list
userList = new DataSet1.UsersDataTable();
string fn = AppDomain.CurrentDomain.BaseDirectory + "users.xml";
if (System.IO.File.Exists(fn)) userList.ReadXml(fn);
else userList.WriteXml(fn, true);
BuzzerTime = DateTime.Parse("1982-11-23");
MGZRunTime = DateTime.Parse("1982-11-23");
LoadSIDList(); //사용자sid목록 가져옴
}
public static string IP { get; set; }
public static string MAC { get; set; }
///
/// 프로그램 사용기록 추가
///
///
///
///
public static void CheckNRegister3(string prgmName, string develop, string prgmVersion)
{
if (prgmName.Length > 50) prgmName = prgmName.Substring(0, 50); //길이제한
var task = Task.Factory.StartNew(() =>
{
try
{
string ip = "";
string mac = "";
// string prgmName = Application.ProductName;
var nif = NetworkInterface.GetAllNetworkInterfaces();
var host = Dns.GetHostEntry(Dns.GetHostName());
string fullname = System.Net.Dns.GetHostEntry("").HostName;
foreach (IPAddress r in host.AddressList)
{
string str = r.ToString();
if (str != "" && str.Substring(0, 3) == "10.")
{
ip = str;
break;
}
}
string rtn = string.Empty;
ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled='TRUE'");
ManagementObjectSearcher query1 = new ManagementObjectSearcher(oq);
foreach (ManagementObject mo in query1.Get())
{
string[] address = (string[])mo["IPAddress"];
if (address[0] == ip && mo["MACAddress"] != null)
{
mac = mo["MACAddress"].ToString();
break;
}
}
if (ip == "" || mac == "")
{
return;
}
SqlConnection conn = new SqlConnection("Data Source=10.131.15.18;Initial Catalog=EE;Persist Security Info=True;User ID=eeuser;Password=Amkor123!");
conn.Open();
string ProcName = "AddPrgmUser3";
SqlCommand cmd = new SqlCommand(ProcName, conn)
{
CommandType = CommandType.StoredProcedure
};
SqlParameter param = cmd.Parameters.Add("@mac", SqlDbType.NVarChar, 50);
param.Value = mac;
param = cmd.Parameters.Add("@ip", SqlDbType.NVarChar, 50);
param.Value = ip;
param = cmd.Parameters.Add("@pgrm", SqlDbType.NVarChar, 50);
param.Value = prgmName;
param = cmd.Parameters.Add("@develop", SqlDbType.NVarChar, 50);
param.Value = develop;
param = cmd.Parameters.Add("@pgver", SqlDbType.NVarChar, 50);
param.Value = prgmVersion;
param = cmd.Parameters.Add("@prgmLogin", SqlDbType.VarChar, 20);
param.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
param = cmd.Parameters.Add("@account", SqlDbType.NVarChar, 50);
param.Value = System.Environment.UserName;
param = cmd.Parameters.Add("@hostname", SqlDbType.NVarChar, 100);
param.Value = fullname;
cmd.ExecuteNonQuery();
conn.Close();
IP = ip;
MAC = mac;
}
catch (Exception ex)
{
PUB.log.AddE(ex.Message);
}
});
}
///
/// 디버깅정보르를 포함한 시스템 로그를 넣습니다.
///
///
///
///
///
public static void AddSystemLog(string prgmVersion, string Screen, string Message,
[CallerFilePath] string filenpath = null,
[CallerLineNumber] int linenumer = -1,
[CallerMemberName] string callMember = null)
{
var stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
string fileName = stackFrame.GetFileName();
if (fileName.isEmpty()) fileName = filenpath;
string methodName = stackFrame.GetMethod().ToString();
if (methodName.isEmpty()) methodName = callMember;
int lineNumber = stackFrame.GetFileLineNumber();
if (linenumer != -1) lineNumber = linenumer;
var maxlen = 100;
if (Screen.Length > maxlen) Screen = Screen.Substring(0, maxlen - 1); //길이제한
maxlen = 255;
if (Message.Length > maxlen) Message = Message.Substring(0, maxlen - 1); //길이제한
maxlen = 3000;
var TraceInfo = stackFrame.ToString();
if (TraceInfo.Length > maxlen) TraceInfo = TraceInfo.Substring(0, maxlen - 1); //길이제한
var task = Task.Factory.StartNew(() =>
{
try
{
string HostName = System.Net.Dns.GetHostEntry("").HostName;
SqlConnection conn = new SqlConnection("Data Source=10.131.15.18;Initial Catalog=EE;Persist Security Info=True;User ID=eeuser;Password=Amkor123!");
conn.Open();
string ProcName = "insert into SystemLog_STDLabelAttach(HostName,Version,Screen,Message,TraceInfo,wdate,FileName,LineNumber) values(@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8)";
SqlCommand cmd = new SqlCommand(ProcName, conn);
cmd.CommandType = CommandType.Text;
var param = cmd.Parameters.Add("@p1", SqlDbType.VarChar, 50);
param.Value = HostName;
param = cmd.Parameters.Add("@p2", SqlDbType.VarChar, 20);
param.Value = prgmVersion;
param = cmd.Parameters.Add("@p3", SqlDbType.VarChar, 100);
param.Value = Screen;
param = cmd.Parameters.Add("@p4", SqlDbType.VarChar, 255);
param.Value = Message;
param = cmd.Parameters.Add("@p5", SqlDbType.VarChar);
param.Value = TraceInfo;
param = cmd.Parameters.Add("@p6", SqlDbType.DateTime);
param.Value = DateTime.Now;
param = cmd.Parameters.Add("@p7", SqlDbType.VarChar, 1000);
param.Value = fileName;
param = cmd.Parameters.Add("@p8", SqlDbType.Int);
param.Value = lineNumber;
var cnt = cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
PUB.log.AddE(ex.Message);
}
});
}
public static Boolean PasswordCheck()
{
var pass = new AR.Dialog.fPassword();
if (pass.ShowDialog() == DialogResult.OK)
{
var p = AR.SETTING.Data.Password_Setup;
if (p.isEmpty()) p = DateTime.Now.ToString("ddMM");
if (pass.tbInput.Text.Trim() != p) return false;
else return true;
}
else return false;
}
public static void LoadDataTable()
{
mailForm = new DataSet1.MailFormatDataTable();
string fn = AppDomain.CurrentDomain.BaseDirectory + "mailForm.xml";
if (System.IO.File.Exists(fn)) mailForm.ReadXml(fn);
else
{
var nr = mailForm.NewMailFormatRow();
nr.subject = "";
nr.content = "";
mailForm.AddMailFormatRow(nr);
mailForm.AcceptChanges();
mailForm.WriteXml(fn, true);
}
mailList = new DataSet1.MailRecipientDataTable();
string fn1 = AppDomain.CurrentDomain.BaseDirectory + "mailList.xml";
if (System.IO.File.Exists(fn1)) mailList.ReadXml(fn1);
else mailList.WriteXml(fn, true);
}
public static Rectangle GetVisionOrientSearchArea(
Rectangle baserect,
int offsetX,
int offsetY,
out string VisionOrientMessage)
{
VisionOrientMessage = "";
var newORectW = baserect.Width + offsetX;
var newORectH = baserect.Height + offsetY;
var newORectX = baserect.X - ((newORectW - baserect.Width) / 2.0);
var newORectY = baserect.Y - ((newORectH - baserect.Height) / 2.0);
if (newORectX < 1)
{
newORectW += (int)newORectY;
newORectX = 1;
}
if (newORectY < 1)
{
newORectH += (int)newORectY;
newORectY = 1;
}
if (newORectW < 4) newORectW = 0;
if (newORectH < 4) newORectH = 0;
var newORect = new Rectangle((int)newORectX, (int)newORectY, (int)newORectW, (int)newORectH);
if (newORect.Width < 1 || newORect.Height < 1)
{
VisionOrientMessage = string.Format("기준영역 크기 오류({0},{1},{2},{3})", newORect.Left, newORect.Top, newORect.Width, newORect.Height);
return Rectangle.Empty;
}
else return newORect;
}
public static void GetJobColor(Class.JobData.ErrorCode result, Color baseBack, out Color fColor, out Color bColor)
{
if (result == Class.JobData.ErrorCode.BarcodeRead)
{
//배출됫엇다면 색상을 변경한다.
fColor = Color.Tomato;
bColor = baseBack;
}
else
{
fColor = Color.WhiteSmoke;
bColor = baseBack;
}
}
public static DataSet1.UserSIDDataTable DTUserSID;
public static void LoadSIDList()
{
if (DTUserSID == null) DTUserSID = new DataSet1.UserSIDDataTable();
else DTUserSID.Clear();
var fi = new System.IO.FileInfo(UTIL.CurrentPath + "Data\\UserSID.csv");
if (fi.Exists == true)
{
string[] lines = null;
try
{
lines = System.IO.File.ReadAllLines(fi.FullName, System.Text.Encoding.UTF8);
}
catch (Exception ex)
{
UTIL.MsgE(ex.Message, true);
lines = new string[] { };
}
foreach (var line in lines)
{
if (line.isEmpty()) continue;
if (line.StartsWith("#")) continue; //주석문
var buffer = line.Split(',');
if (buffer.Length < 2) continue;
var port = buffer[0];
var sid = buffer[1];
if (sid.isEmpty()) continue;
if (port == "0") port = "11";
if (port == "1") port = "12";
if (port == "2") port = "21";
if (port == "3") port = "22";
if (port == "4") port = "31";
if (port == "5") port = "32";
if (port == "6") port = "41";
if (port == "7") port = "42";
//중복체크
var Exist = DTUserSID.Where(t => t.SID == sid && t.Port == port).Count() > 0;
if (Exist == false)
{
var newdr = DTUserSID.NewUserSIDRow();
newdr.Port = port;
newdr.SID = sid;
DTUserSID.AddUserSIDRow(newdr);
}
}
}
else if (fi.Directory.Exists == false) fi.Directory.Create();
DTUserSID.AcceptChanges();
PUB.log.Add("사용자 SID 목록 : " + DTUserSID.Count.ToString() + " 건 불러옴");
}
public static void SaveSIDList()
{
if (DTUserSID == null) return;
var fi = new System.IO.FileInfo(UTIL.CurrentPath + "Data\\UserSID.csv");
if (fi.Directory.Exists == false) fi.Directory.Create();
if (DTUserSID.Count < 1) fi.Delete();
else
{
//자료를 저장한다.
var sb = new System.Text.StringBuilder();
sb.AppendLine("#PORT,SID");
var orderlist = from m in DTUserSID
orderby m.Port
orderby m.SID
select m;
var cnt = 0;
foreach (DataSet1.UserSIDRow dr in orderlist)
{
if (dr.SID.isEmpty() || dr.Port.isEmpty()) continue;
sb.AppendLine(string.Format("{0},{1}", dr.Port, dr.SID));
cnt += 1;
}
System.IO.File.WriteAllText(fi.FullName, sb.ToString(), System.Text.Encoding.UTF8);
PUB.log.Add(string.Format("{0}건의 사용자 sid가 저장되었습니다", cnt));
}
}
public static double GetFreeSpace(string driveletter)
{
try
{
var di = new System.IO.DriveInfo(driveletter);
var freespace = di.TotalFreeSpace;
var totalspace = di.TotalSize;
var freeSpaceRate = (freespace * 1.0 / totalspace) * 100.0;
return freeSpaceRate;
}
catch
{
return 100.0;
}
}
public static string getSavePath(out double freespace)
{
Boolean path1Exist = false;
double freespace1 = 100.0;
string savePath1 = "";
freespace = 100.0;
savePath1 = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, "Images");
if (savePath1 != "" && System.IO.Directory.Exists(savePath1))
{
path1Exist = true;
//이폴더를 사용
if (savePath1.StartsWith("\\")) return savePath1;
//남은잔량을 체크한다.
freespace1 = GetFreeSpace(savePath1.Substring(0, 1));
if (freespace1 >= AR.SETTING.Data.AutoDeleteThreshold) return savePath1;
}
if (path1Exist)
{
freespace = freespace1;
return savePath1;
}
//이제 문제가 좀 심각? (폴더가 없다)
var savePath = System.IO.Path.Combine(UTIL.CurrentPath, "Images");
if (System.IO.Directory.Exists(savePath) == false)
System.IO.Directory.CreateDirectory(savePath);
freespace = GetFreeSpace(savePath.Substring(0, 1));
return savePath;
}
public static double ChangeValuePopup(double value, string title)
{
var f = new AR.Dialog.fInput(title, value.ToString());
if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
var val = double.Parse(f.tbInput.Text);
return val;
}
else return value;
}
public static (bool success, string newid, string message) MakeNewREELID(string sid)
{
//WMS은 DB에서 생성하낟.
var ta = new dsWMSTableAdapters.QueriesTableAdapter();
string NewID = string.Empty;
string Message = string.Empty;
var retval = ta.X_SP_GET_UNIT_ID_LABEL(SETTING.Data.WMS_PROGRAM_ID,
SETTING.Data.WMS_CENTER_CD, sid,
SETTING.Data.WMS_REG_USERID,
PUB.IP,
ref NewID,
ref Message);
return ((!NewID.isEmpty() && Message == "OK"), NewID, Message);
}
public static void CheckFreeSpace()
{
//용량확인
var DriveName = AR.SETTING.Data.Path_Data.Substring(0, 1);
PUB.FreeSpace = UTIL.GetFreeSpace(DriveName);
}
public static void splitID(string ID, out string ww, out string seq)
{
if (ID.Length < 3)
{
ww = "";
seq = "";
}
else
{
try
{
ww = ID.Substring(0, 2);// int.Parse(ID.Substring(0, 2));
seq = ID.Substring(2);// int.Parse(ID.Substring(2));
}
catch (Exception ex)
{
PUB.log.AddE("slit id eerr" + ex.Message);
ww = "";
seq = "-1";
}
}
}
public static UInt16[] SIDtoUInt16(string sid)
{
var sidstr = sid.PadLeft(10, '0'); //총 10자리로 만들어놓는다
var getbytes = System.Text.Encoding.Default.GetBytes(sidstr);
var c1 = getbytes[1].ToString("X2") + getbytes[0].ToString("x2");
var c2 = getbytes[3].ToString("X2") + getbytes[2].ToString("x2");
var c3 = getbytes[5].ToString("X2") + getbytes[4].ToString("x2");
var c4 = getbytes[7].ToString("X2") + getbytes[6].ToString("x2");
var c5 = getbytes[9].ToString("X2") + getbytes[8].ToString("x2");
var Buffer = new UInt16[5];
var index = 0;
Buffer[index++] = Convert.ToUInt16(c1, 16);
Buffer[index++] = Convert.ToUInt16(c2, 16);
Buffer[index++] = Convert.ToUInt16(c3, 16);
Buffer[index++] = Convert.ToUInt16(c4, 16);
Buffer[index++] = Convert.ToUInt16(c5, 16);
return Buffer;
}
public static void ChangeUIPopup(System.Windows.Forms.NumericUpDown valueCtl)
{
var value = valueCtl.Value.ToString();
AR.Dialog.fInput f = new AR.Dialog.fInput("Input value", value);
if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
var val = decimal.Parse(f.tbInput.Text);
if (val < valueCtl.Minimum)
{
UTIL.MsgE(string.Format("최소 입력값은 {0} 입니다.", valueCtl.Minimum));
val = valueCtl.Minimum;
}
if (val > valueCtl.Maximum)
{
UTIL.MsgE(string.Format("최대 입력값은 {0} 입니다.", valueCtl.Maximum));
val = valueCtl.Maximum;
}
valueCtl.Value = val;
}
}
#region "message description"
public static string GetErrorMessage(eECode err, params object[] args)
{
string ermsg = string.Empty;// $"[E{(int)err}] ";
var dr = PUB.mdm.dataSet.ErrorDescription.Where(t => t.Idx == (short)err).FirstOrDefault();
if (dr != null)
{
//자료는 있으나 사용자가 입력하지 않은 상태
if (dr.Description.isEmpty()) ermsg += "NO ERROR DESCRIPTION\nERR:" + err.ToString() + "\n{0}";
else ermsg += dr.Description.Replace("\\n", "\n");
}
else ermsg = "NO ERROR DATA\nERR:" + err.ToString() + "\n{0}"; //자료자체를 찾을 수 없다
try
{
var newermsg = string.Format(ermsg, args);
ermsg = newermsg;
}
catch (Exception ex)
{
}
return ermsg;
}
public static string GetPinDescription(eDIName pin)
{
var pinno = (int)pin;
string ermsg = $"[X{pinno:X2}] {pin}";
try
{
var dr = PUB.mdm.dataSet.InputDescription.Where(t => t.Idx == (short)pin).FirstOrDefault();
if (dr != null)
{
if (dr.Description.isEmpty()) ermsg += $" {pin}";
else ermsg += $" " + dr.Description.Replace("\\n", "\n");
}
}
catch (Exception ex) { ermsg += "\n설명가져오기오류\n" + ex.Message; }
return ermsg;
}
public static string GetPinDescription(eDOName pin)
{
var pinno = (int)pin;
string ermsg = $"[X{pinno:X2}] {pin}";
try
{
var dr = PUB.mdm.dataSet.OutputDescription.Where(t => t.Idx == (short)pin).FirstOrDefault();
if (dr != null)
{
if (dr.Description.isEmpty()) ermsg += $" {pin}";
else ermsg += $" " + dr.Description.Replace("\\n", "\n");
}
}
catch (Exception ex) { ermsg += "\n설명가져오기오류\n" + ex.Message; }
return ermsg;
}
public static string GetPinName(eDIName pin)
{
var pinno = (int)pin;
string ermsg = $"[X{pinno:X2}] {pin}";
try
{
var dr = PUB.mdm.dataSet.InputDescription.Where(t => t.Idx == (short)pin).FirstOrDefault();
if (dr != null)
{
ermsg = dr.Title;
}
}
catch (Exception ex) { ermsg += "\n이름가져오기오류\n" + ex.Message; }
return ermsg;
}
public static string GetPinName(eDOName pin)
{
var pinno = (int)pin;
string ermsg = $"[Y{pinno:X2}] {pin}";
try
{
var dr = PUB.mdm.dataSet.OutputDescription.Where(t => t.Idx == (short)pin).FirstOrDefault();
if (dr != null)
{
ermsg = dr.Title;
}
}
catch (Exception ex) { ermsg += "\n이름가져오기오류\n" + ex.Message; }
return ermsg;
}
public static string GetResultCodeMessage(eResult rltCode)
{
//별도 메세지처리없이 그대로 노출한다
return rltCode.ToString().ToUpper();
}
#endregion
}
}