using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; using System.ComponentModel; using Cosmos.CommonManager; using Cosmos.UserFrame; namespace Cosmos.Measuring { public class Scale { #region 클래스 변수 선언 /// /// 전자저울과의 RS232 통신을 위한 시리얼포트 객체 /// private SerialPort m_cSerialPort = null; /// /// 전자저울 이벤트 수신 후 처리할 작업용 스레드 작업(라벨프린터 출력) /// private BackgroundWorker bw = null; #endregion 클래스 변수 선언 #region 생성자 public Scale() { bw = new BackgroundWorker(); } #endregion 생성자 #region OPEN / CLOSE 처리 함수 public bool OpenScale(string sSerialPort, long lBaudrate) { bool bRet = false; try { if (m_cSerialPort != null) { //grayber@20180307 시리얼 포트 flush 추가 start - Open 함수 Input Output 버퍼 삭제 (주석처리) //m_cSerialPort.DiscardInBuffer(); //m_cSerialPort.DiscardOutBuffer(); //grayber@20180307 시리얼 포트 flush 추가 end m_cSerialPort.Close(); System.Threading.Thread.Sleep(50); m_cSerialPort = null; } if (m_cSerialPort == null) { m_cSerialPort = new SerialPort(); if (m_cSerialPort == null) { UserLog.WriteLogFile(UserCom.LOG_ERROR, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "SERIAL PORT ERROR"); return bRet; } m_cSerialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); m_cSerialPort.PinChanged += new SerialPinChangedEventHandler(serialPort_PinChanged); m_cSerialPort.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort_ErrorReceived); m_cSerialPort.NewLine = "\r\n"; m_cSerialPort.Encoding = Encoding.ASCII; m_cSerialPort.WriteBufferSize = 512; m_cSerialPort.PortName = sSerialPort; m_cSerialPort.BaudRate = (int)lBaudrate; m_cSerialPort.DataBits = 7; m_cSerialPort.StopBits = StopBits.One; m_cSerialPort.Parity = Parity.Even; m_cSerialPort.Handshake = Handshake.None; m_cSerialPort.ReadTimeout = 5000; m_cSerialPort.WriteTimeout = 5000; m_cSerialPort.Open(); if (m_cSerialPort.IsOpen == false) { UserLog.WriteLogFile(UserCom.LOG_ERROR, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "SERIAL PORT OPEN ERROR"); return bRet; } // BackgroundWorker 이벤트 함수 등록 bw.DoWork += DeviceEventHandler; bRet = true; } } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } return bRet; } public bool CloseScale() { bool bRet = false; try { if (m_cSerialPort == null) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "Close fail(m_cSerialPort_Scale == null)"); return bRet; } //grayber@20180307 시리얼 포트 flush 추가 start - Close 함수 Input Output 버퍼 삭제 m_cSerialPort.DiscardInBuffer(); m_cSerialPort.DiscardOutBuffer(); //grayber@20180307 시리얼 포트 flush 추가 end m_cSerialPort.Close(); bRet = true; //grayber@20180307 시리얼 포트 flush 추가 start - try 문 밖으로 이동 (기존) //m_cSerialPort = null; //grayber@20180307 시리얼 포트 flush 추가 end // BackgroundWorker 이벤트 함수 제거 bw.DoWork -= DeviceEventHandler; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } //grayber@20180307 시리얼 포트 flush 추가 start - try 문 밖으로 이동 (변경) m_cSerialPort = null; //grayber@20180307 시리얼 포트 flush 추가 end return bRet; } #endregion OPEN / CLOSE 처리 함수 #region SerialPort Alive 체크 public bool IsPortOpend() { bool bRet = false; try { if(m_cSerialPort == null) { return false; } if(m_cSerialPort.IsOpen == false) { return false; } bRet = true; } catch(Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); bRet = false; } return bRet; } #endregion #region SerialPort 이벤트 private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { SerialPort serialPort = (SerialPort)sender; string sHeader = ""; try { if ((SerialPort)sender == m_cSerialPort) { if (!bw.IsBusy) { // 데이터의 Terminator는 개행문자(\r\n)이므로 개행문자 까지 값을 읽는 ReadLine으로 수신 string sScaleData = serialPort.ReadLine(); sHeader = sScaleData.Substring(0, 2); // ST:계량모드, QT:계수모드, US:데이터가 안정되지 않다, OL:데이터가 오버되어 있다.(계량범위를 넘었다.) if (sHeader.Equals("ST")) { bw.RunWorkerAsync(sScaleData); } else if (sHeader.Equals("QT")) { } else { } //grayber@20171222 저울,라벨프린터, PoleDisplay 디버그 로그 추가 start #if true // 로그추가 //grayber@20171222 디버그 로그 추가 - 저울 디버그 UserLog.WriteLogFile(UserCom.LOG_OP, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "▶▶ " + "Recv: " + "[" + sScaleData + "]"); #endif //grayber@20171222 저울,라벨프린터, PoleDisplay 디버그 로그 추가 end } else { UserLog.WriteLogFile(UserCom.LOG_ERROR, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "저울 이벤트 처리 전 이벤트 발생 불가"); } } } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } } private void serialPort_PinChanged(object sender, SerialPinChangedEventArgs e) { } private void serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e) { } #endregion SerialPort 이벤트 #region Event Handler private void DeviceEventHandler(object sender, DoWorkEventArgs e) { string sScaleData = ""; string sHeader = ""; string sWeight = ""; string sUnit = ""; string sItemNm = ""; bool bPrintYn = false; try { // Ex) ST,+00000.00__g sScaleData = (string)e.Argument; sHeader = sScaleData.Substring(0, 2); sWeight = sScaleData.Substring(3, 9); sUnit = sScaleData.Substring(12, 3).Trim(); bPrintYn = GetItemNameByWeight(Convert.ToInt32(sWeight), ref sItemNm); // 저울 입력 이벤트 전달 if (MeasuringMain.m_delegateScaleDev != null) MeasuringMain.m_delegateScaleDev(bPrintYn, Convert.ToInt32(sWeight), sUnit, sItemNm); else { UserLog.WriteLogFile(UserCom.LOG_ERROR, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "MeasuringMain.m_delegateScaleDev is null."); } // 저울 입력 데이터 전달 if(MeasuringMain.m_delegateScaleDevRaw != null) { MeasuringMain.m_delegateScaleDevRaw(sScaleData); } else { UserLog.WriteLogFile(UserCom.LOG_ERROR, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) "MeasuringMain.m_delegateScaleDevRaw is null."); } } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } } #endregion Event Handler #region 중량데이터로 상품명 얻기 /// /// 측정된 중량으로 상품명 가져오기 /// /// /// /// private bool GetItemNameByWeight(int iWeight, ref string sItemNm) { bool bIsOk = false; sItemNm = string.Empty; try { if (iWeight >= 236 && iWeight <= 335) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0545); bIsOk = false; } //else if (iWeight >= 336 && iWeight <= 434) //{ // sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0545); // bIsOk = true; //} //else if (iWeight >= 435 && iWeight <= 534) //{ // sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0546); // bIsOk = true; //} //#10856] (신규) [BR] 저울 중량 라벨프린터 양식 변경 //스타워즈 파인트 제외 else if (iWeight >= 336 && iWeight <= 534) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0545); bIsOk = true; } else if (iWeight >= 545 && iWeight <= 642) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0547); bIsOk = false; } else if (iWeight >= 643 && iWeight <= 742) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0547); bIsOk = true; } else if (iWeight >= 889 && iWeight <= 988) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0548); bIsOk = false; } else if (iWeight >= 989 && iWeight <= 1088) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0548); bIsOk = true; } //grayber@20180213 [BR] 핸드팩 중량 출력 대상 제품 추가 요청 start // 추가 else if (iWeight >= 1104 && iWeight <= 1199) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1095); bIsOk = true; } // 기존 //else if (iWeight >= 1137 && iWeight <= 1236) // 변경 else if (iWeight >= 1200 && iWeight <= 1236) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0549); bIsOk = false; } //grayber@20180213 [BR] 핸드팩 중량 출력 대상 제품 추가 요청 end else if (iWeight >= 1237 && iWeight <= 1536) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0549); bIsOk = true; } else if (iWeight >= 1700 && iWeight <= 1999) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0550); bIsOk = false; } else if (iWeight >= 2000 && iWeight <= 2300) { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0550); bIsOk = true; } else { sItemNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0551); bIsOk = false; } } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명)) System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명)) ex.Message); } return bIsOk; } #endregion } }