429 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			429 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using AR;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| 
 | |
| namespace Project
 | |
| {
 | |
|     public partial class FMain
 | |
|     {
 | |
| 
 | |
|         private void Keyence_BarcodeRecv(object sender, Device.KeyenceBarcode.RecvDataEvent e)
 | |
|         {
 | |
|             var dev = sender as Device.KeyenceBarcode;
 | |
|             if (e.RawData.StartsWith("ERROR"))
 | |
|             {
 | |
|                 //로그가 너무 많이 쌓이니 해제한다
 | |
|                 //Pub.log.AddE("Reader RES : " + resp);
 | |
|             }
 | |
|             else if (e.RawData.StartsWith("OK"))
 | |
|             {
 | |
|                 //OK회신
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 //값은 받았다
 | |
|                 if (PUB.sm.Step != eSMStep.HOME_FULL && PUB.sm.Step != eSMStep.HOME_QUICK)
 | |
|                 {
 | |
|                     //							PUB.logKeyence.Add($"{resp.Replace("\n", "").Replace("\r", "")}");
 | |
|                     ParseBarcode(e.RawData, dev.Tag.ToString());
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //PUB.logKeyence.Add($"Code Ignore by Home Process({resp.Replace("\n", "").Replace("\r", "")})");
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         bool imageprocess = false;
 | |
|         private void Keyence_ImageRecv(object sender, Device.KeyenceBarcode.RecvImageEvent e)
 | |
|         {
 | |
| 
 | |
|             var dev = sender as Device.KeyenceBarcode;
 | |
|             System.Windows.Forms.PictureBox keyenceview;
 | |
|             if (dev.Tag == "R") keyenceview = keyenceviewR;
 | |
|             else keyenceview = keyenceviewF;
 | |
| 
 | |
|             if (imageprocess == false)
 | |
|             {
 | |
|                 imageprocess = true;
 | |
| 
 | |
|                 if (PUB.sm.Step >= eSMStep.IDLE && this.IsDisposed == false && this.Disposing == false)
 | |
|                 {
 | |
| 
 | |
|                     //var oimage = this.pictureBox1.Image;
 | |
|                     //this.pictureBox1.Image = e.Image;
 | |
|                     //if (oimage != null) oimage.Dispose();
 | |
| 
 | |
|                     if (keyenceview.Image == null)
 | |
|                     {
 | |
|                         //var newbitmap = new Bitmap(e.Image.Width,e.Image.Height, e.Image.PixelFormat);
 | |
|                         var old = keyenceview.Image;
 | |
|                         //var newbitmap = PUB.keyence.CreateBitmap(e.Image.Width, e.Image.Height);
 | |
|                         //PUB.keyence.UpdateBitmap((Bitmap)e.Image, newbitmap);
 | |
|                         keyenceview.Image = e.Image;
 | |
|                         if (old != null) old.Dispose();
 | |
|                         PUB.log.AddAT("First image received");
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         //내용ㅁㄴ업데이트하자
 | |
|                         var preimage = keyenceview.Image as Bitmap;
 | |
|                         keyenceview.Image = e.Image;
 | |
|                         if (preimage != null) preimage.Dispose();
 | |
|                         //PUB.keyence.UpdateBitmap((Bitmap)e.Image, preimage);
 | |
|                         //this.pictureBox2.Invalidate();
 | |
|                     }
 | |
| 
 | |
| 
 | |
|                 }
 | |
| 
 | |
|                 if (this.IsDisposed)
 | |
|                 {
 | |
|                     dev.Dispose();
 | |
|                 }
 | |
| 
 | |
|                 imageprocess = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         double GetAngle(Point pt1, Point pt2)
 | |
|         {
 | |
|             var val = Math.Asin((pt2.Y - pt1.Y) / Math.Sqrt(Math.Pow(pt2.X - pt1.X, 2.0) + Math.Pow(pt2.Y - pt1.Y, 2.0)));
 | |
| 
 | |
| 
 | |
|             double retval = 0.0;
 | |
|             if ((pt2.X - pt1.X) >= 0 && (pt2.Y - pt1.Y) >= 0)
 | |
|                 retval = val;
 | |
|             else if ((pt2.X - pt1.X) < 0 && (pt2.Y - pt1.Y) >= 0)
 | |
|                 retval = Math.PI - val;
 | |
|             else if ((pt2.X - pt1.X) < 0 && (pt2.Y - pt1.Y) < 0)
 | |
|                 retval = Math.PI - val;
 | |
|             else if ((pt2.X - pt1.X) >= 0 && (pt2.Y - pt1.Y) < 0)
 | |
|                 retval = Math.PI * 2 + val;
 | |
| 
 | |
|             return retval;
 | |
|         }
 | |
| 
 | |
|         private string KeyenceBarcodeDataF = string.Empty;
 | |
|         private string KeyenceBarcodeDataR = string.Empty;
 | |
|         
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 키엔스로부터 받은 데이터를 분석한다.
 | |
|         /// </summary>
 | |
|         /// <param name="response"></param>
 | |
|         /// <param name="Source"></param>
 | |
|         void ParseBarcode(string response, string Source)
 | |
|         {
 | |
| 
 | |
|             //220901 - 특문있었ㅇ츰
 | |
|             var r1 = (char)0x1D;
 | |
|             var r2 = (char)0x1E;
 | |
|             var r3 = (char)0x04;
 | |
|             var r4 = (char)0x00;
 | |
|             response = response.Replace(r1.ToString(), "");
 | |
|             response = response.Replace(r2.ToString(), "");
 | |
|             response = response.Replace(r3.ToString(), "");
 | |
|             response = response.Replace(r4.ToString(), "");
 | |
|             response = response.Replace("\r", "");
 | |
|             response = response.Replace("\n", "");
 | |
|             response = response.Replace("\0", "");
 | |
|             response = response.RemoveNoneASCII().Trim();
 | |
| 
 | |
|             ///101409576:522/1171:427/1143:429/1134:524/1155:475/1151\r
 | |
|             var frames = response.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
 | |
|             var itemC = PUB.Result.ItemDataC;
 | |
| 
 | |
|             //키엔스바코드패턴검사
 | |
|             var Pattern = @"^(\d+):(\w+.*):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+)";
 | |
|             Pattern = @"^(\d+):(.*):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+)";
 | |
|             var RegX = new System.Text.RegularExpressions.Regex(Pattern);
 | |
|             foreach (var resp in frames)
 | |
|             {
 | |
|                 if (RegX.IsMatch(resp.Trim()) == false)
 | |
|                 {
 | |
|                     //에러처리 221018
 | |
|                     if (resp.StartsWith("0:ERROR")) continue;
 | |
| 
 | |
|                     PUB.log.AddE($"***Barcode({Source}) response data error value (please check Keyence transmission format) " + resp);
 | |
|                     listView21.SetText(9, 3, "ERR");//.setTitle(8, 1, "ERR");
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (AR.VAR.BOOL[eVarBool.JOB_PickON_Retry])  //221110
 | |
|                 {
 | |
|                     if (PUB.sm.Step == eSMStep.RUN)
 | |
|                         PUB.log.AddAT($"Picker({Source}) is retrying, ignoring barcode:{resp}");
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 var MatchList = RegX.Matches(resp.Trim());
 | |
|                 var buf = MatchList[0].Groups;
 | |
|                 
 | |
|                 var angle = 0;
 | |
|                 var sym = buf[1].Value; //symbol
 | |
|                 var vData = buf[2].Value.Trim();    //data
 | |
| 
 | |
|                 if (Source == "R") KeyenceBarcodeDataR = vData; //rear
 | |
|                 else KeyenceBarcodeDataF = vData;   //front
 | |
| 
 | |
|                 //바코드 무시조건 확인
 | |
|                 //if (PUB.Result.BCDIgnorePattern != null)
 | |
|                 //{
 | |
|                 //	Boolean ignore = false;
 | |
|                 //	foreach (var ignoreitem in PUB.Result.BCDIgnorePattern)
 | |
|                 //	{
 | |
|                 //		if (ignoreitem.Pattern.isEmpty()) continue;
 | |
|                 //		RegX = new System.Text.RegularExpressions.Regex(ignoreitem.Pattern);
 | |
|                 //		if (RegX.IsMatch(vData))
 | |
|                 //		{
 | |
|                 //			var igmsg = "무시바코드 Patter: " + ignoreitem.Pattern + ",값=" + vData;
 | |
|                 //			ignore = true;
 | |
|                 //			break;
 | |
|                 //		}
 | |
|                 //	}
 | |
|                 //	if (ignore) continue;
 | |
|                 //}
 | |
| 
 | |
|                 var vV1 = buf[3].Value.Split('/');
 | |
|                 var vV2 = buf[4].Value.Split('/');
 | |
|                 var vV3 = buf[5].Value.Split('/');
 | |
|                 var vV4 = buf[6].Value.Split('/');
 | |
|                 var vCP = buf[7].Value.Split('/');
 | |
| 
 | |
|                 var vertex = new Point[4];
 | |
|                 vertex[0] = new Point(int.Parse(vV1[0]), int.Parse(vV1[1]));
 | |
|                 vertex[1] = new Point(int.Parse(vV2[0]), int.Parse(vV2[1]));
 | |
|                 vertex[2] = new Point(int.Parse(vV3[0]), int.Parse(vV3[1]));
 | |
|                 vertex[3] = new Point(int.Parse(vV4[0]), int.Parse(vV4[1]));
 | |
|                 var vertextCP = new Point(int.Parse(vCP[0]), int.Parse(vCP[1]));
 | |
| 
 | |
|                 var ReelCP = Point.Empty;
 | |
|                 if (itemC.VisionData.ReelSize == eCartSize.Inch13)
 | |
|                     ReelCP = AR.SETTING.Data.CenterPosition13;
 | |
|                 else
 | |
|                     ReelCP = AR.SETTING.Data.CenterPosition7;
 | |
| 
 | |
|                 //각도를 이곳에서 처리함
 | |
|                 angle = (int)(GetAngle(vertex[0], vertex[1]) * 180.0 / Math.PI);
 | |
| 
 | |
|                 //var atkstdbcd = new StdLabelPrint.CAmkorSTDBarcode(vData);
 | |
|                 //if (atkstdbcd.DisposalCode) //사용하지않는 103코드라면 아에 처리안함
 | |
|                 //{
 | |
|                 //	PUB.log.AddE("***폐기된 103 코드형태라 처리하지 않음" + vData);
 | |
|                 //	continue;
 | |
|                 //}
 | |
| 
 | |
|                 //특정좌표가 기준점으로부터 몇도 틀어져 있는가? 
 | |
|                 //math.atan2(PY - CY, PX - CX)
 | |
| 
 | |
|                 //회전후좌표계산
 | |
|                 //x = root((px - cx) ^ 2 + (py - cy) ^ 2) * cos@ +cx
 | |
|                 //y = root(px ^ 2 + py ^ 2) * sin@   +cy
 | |
|                 double theta = 0.0;// Pub.Result.ItemData[1].VisionData.BaseAngle;
 | |
|                 if (itemC.VisionData.BaseAngle(out string msg, out Class.KeyenceBarcodeData angbcd))
 | |
|                 {
 | |
|                     theta = angbcd.Angle;
 | |
|                 }
 | |
|                 
 | |
|                 var theta_rad = -theta * Math.PI / 180.0;
 | |
|                 var PX = (int)(Math.Cos(theta_rad) * (vertextCP.X - ReelCP.X) - Math.Sin(theta_rad) * (vertextCP.Y - ReelCP.Y)) + ReelCP.X;
 | |
|                 var PY = (int)(Math.Sin(theta_rad) * (vertextCP.X - ReelCP.X) + Math.Cos(theta_rad) * (vertextCP.Y - ReelCP.Y)) + ReelCP.Y;
 | |
| 
 | |
|                 float LabelAngRad = (float)(Math.Atan2(PY - ReelCP.Y, PX - ReelCP.X));// 2;  //라벨의 위치값을 찾아서 입력해야한다.
 | |
|                 var labelpos = (float)(LabelAngRad * 180.0 / Math.PI);
 | |
|                 if (labelpos < 0) labelpos = 360 + labelpos;
 | |
| 
 | |
|                 byte lp = 0;
 | |
| 
 | |
|                 if (labelpos >= 15 * 22.5 && labelpos <= 360) lp = 6;
 | |
|                 else if (labelpos >= 0 && labelpos <= 22.5) lp = 6;
 | |
|                 else if (labelpos >= 1 * 22.5 && labelpos <= 3 * 22.5) lp = 3;
 | |
|                 else if (labelpos >= 3 * 22.5 && labelpos <= 5 * 22.5) lp = 2;
 | |
|                 else if (labelpos >= 5 * 22.5 && labelpos <= 7 * 22.5) lp = 1;
 | |
|                 else if (labelpos >= 7 * 22.5 && labelpos <= 9 * 22.5) lp = 4;
 | |
|                 else if (labelpos >= 9 * 22.5 && labelpos <= 11 * 22.5) lp = 7;
 | |
|                 else if (labelpos >= 11 * 22.5 && labelpos <= 13 * 22.5) lp = 8;
 | |
|                 else if (labelpos >= 13 * 22.5 && labelpos <= 15 * 22.5) lp = 9;
 | |
|                 else
 | |
|                 {
 | |
| 
 | |
|                 }
 | |
| 
 | |
|                 //중첩된 데이터가 있는가?
 | |
|                 lock (itemC.VisionData.barcodelist)
 | |
|                 {
 | |
|                     //키값에 소스위치도 같이 포함한다
 | |
|                     var valuekey = Source + vData;
 | |
|                     var bcdin = itemC.VisionData.barcodelist.ContainsKey(valuekey);//.Where(t => t.Value.CheckIntersect(vertextCP, vData) == true).FirstOrDefault();
 | |
|                     if (bcdin == false)
 | |
|                     {
 | |
|                         //신규바코드데이터이므로 추가한다.
 | |
|                         PUB.logKeyence.Add($"{resp.Replace("\n", "").Replace("\r", "")}");
 | |
|                         var newitem = new Class.KeyenceBarcodeData()
 | |
|                         {
 | |
|                             AmkorData = new StdLabelPrint.CAmkorSTDBarcode(vData),
 | |
|                             CenterPX = vertextCP,
 | |
|                             Data = vData,
 | |
|                             vertex = vertex,
 | |
|                             Angle = angle,
 | |
|                             LabelPosition = lp,
 | |
|                             barcodeSymbol = sym,
 | |
|                             barcodeSource = Source,
 | |
|                         };
 | |
| 
 | |
|                         var addok = itemC.VisionData.barcodelist.TryAdd(valuekey, newitem);
 | |
|                         if (addok) PUB.log.Add($"[O]BCD RESERV[NEW:{sym}] " + Source + " " + vData);
 | |
|                         else PUB.log.AddE($"[X]BCD RESERV[NEW:{sym}] " + Source + " " + vData);
 | |
| 
 | |
|                         itemC.VisionData.UpdateBarcodePositionData();
 | |
|                         itemC.VisionData.BarcodeDirty = true;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         //기존데이터와 좌표가 겹치면 두고 다르면 업데이트한다
 | |
|                         var predata = itemC.VisionData.barcodelist[valuekey];
 | |
|                         if (predata.CheckIntersect(vertextCP, vData) == false)
 | |
|                         {
 | |
|                             var newitem = new Class.KeyenceBarcodeData()
 | |
|                             {
 | |
|                                 AmkorData = new StdLabelPrint.CAmkorSTDBarcode(vData),
 | |
|                                 CenterPX = vertextCP,
 | |
|                                 Data = vData,
 | |
|                                 vertex = vertex,
 | |
|                                 Angle = angle,
 | |
|                                 LabelPosition = lp,
 | |
|                                 barcodeSymbol = sym,
 | |
|                                 barcodeSource = Source,
 | |
|                             };
 | |
| 
 | |
|                             //기존정보를 지우고
 | |
|                             PUB.log.Add($"[UPD]BCD RESERV:{sym}] " + Source + " " + vData);
 | |
|                             itemC.VisionData.barcodelist[valuekey] = newitem;
 | |
|                             itemC.VisionData.UpdateBarcodePositionData();
 | |
|                             itemC.VisionData.BarcodeDirty = true;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 listView21.SetText(9, 3, $"{angle} > {theta}");
 | |
|                 listView21.SetText(10, 3, itemC.VisionData.QRInputRaw.isEmpty() ? $"DETECT" : $"NONE");
 | |
|                 listView21.SetText(13, 2, $"LABEL");
 | |
|                 listView21.SetText(13, 3, $"{labelpos:N1}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         Boolean IsSIDValue(string data)
 | |
|         {
 | |
|             if (data.Length != 9) return false;
 | |
|             decimal a = 0;
 | |
|             if (decimal.TryParse(data, out a) == false) return false;
 | |
|             if (data.StartsWith("10") == false) return false;
 | |
|             return true;
 | |
|         }
 | |
|         Boolean IsDateValue(string date, out string datestr)
 | |
|         {
 | |
|             //821123 과 19821123 의 데이터를 판별한다
 | |
|             datestr = string.Empty;
 | |
|             date = date.Replace("-", "").Replace("/", "");
 | |
|             if (date.Length == 6)
 | |
|             {
 | |
|                 var vy = date.Substring(0, 2);
 | |
|                 var vm = date.Substring(2, 2);
 | |
|                 var vd = date.Substring(4, 2);
 | |
|                 if (isDigit(vy) == false || isDigit(vm) == false || isDigit(vd) == false)
 | |
|                     return false;
 | |
|                 if (vy.toInt() < 0 || vy.toInt() > 29) return false;
 | |
|                 if (vm.toInt() < 1 || vm.toInt() > 12) return false;
 | |
|                 if (vd.toInt() < 1 || vd.toInt() > 21) return false;
 | |
|                 datestr = "20" + vy + vm + vd;
 | |
|                 return true;
 | |
| 
 | |
|             }
 | |
|             else if (date.Length == 8)
 | |
|             {
 | |
|                 var vy = date.Substring(0, 4);
 | |
|                 var vm = date.Substring(4, 2);
 | |
|                 var vd = date.Substring(6, 2);
 | |
|                 if (isDigit(vy) == false || isDigit(vm) == false || isDigit(vd) == false)
 | |
|                     return false;
 | |
|                 if (vy.toInt() < 2000 || vy.toInt() > 2900) return false;
 | |
|                 if (vm.toInt() < 1 || vm.toInt() > 12) return false;
 | |
|                 if (vd.toInt() < 1 || vd.toInt() > 31) return false;
 | |
|                 datestr = vy + vm + vd;
 | |
|                 return true;
 | |
|             }
 | |
|             else return false;
 | |
|         }
 | |
|         Boolean isDigit(string v)
 | |
|         {
 | |
|             int a;
 | |
|             return int.TryParse(v, out a);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         string cmd = string.Empty;
 | |
|         DateTime LastTrigOnTime = DateTime.Now;
 | |
|         Boolean bTrgOn = false;
 | |
|         //private void Keyence_Trigger(bool bOn)
 | |
|         //{
 | |
| 
 | |
|         //	if (PUB.flag.get(eVarBool.KEYENCE_TRIGGER) == bOn) return;
 | |
| 
 | |
|         //	if (bOn)
 | |
|         //		cmd = "LON";
 | |
|         //	else
 | |
|         //		cmd = "LOFF";
 | |
| 
 | |
|         //	if (bOn) LastTrigOnTime = DateTime.Now;
 | |
| 
 | |
|         //	string resp = reader.ExecCommand(cmd);
 | |
|         //	bTrgOn = bOn;
 | |
|         //	PUB.logKeyence.Add("BARCODE", $"트리거 전송({cmd})");
 | |
|         //	_isCrevisACQ[1] = bOn;
 | |
| 
 | |
|         //	//트리거
 | |
|         //	PUB.flag.set(eVarBool.KEYENCE_TRIGGER, bOn, "JOB");
 | |
|         //}
 | |
|         private void SaveImage(string filename)
 | |
|         {
 | |
|             var fi = new System.IO.FileInfo(filename);
 | |
|             var ext = fi.Extension;
 | |
|             var nameonly = fi.FullName.Replace(fi.Extension, "");
 | |
|             var fiF = new System.IO.FileInfo(nameonly + "F" + ext);
 | |
|             var fiR = new System.IO.FileInfo(nameonly + "F" + ext);
 | |
| 
 | |
| 
 | |
|             if (PUB.keyenceF != null)
 | |
|             {
 | |
|                 var img = this.keyenceviewF.Image;
 | |
|                 if (img == null) return;
 | |
|                 using (var newimg = new Bitmap(img.Width, img.Height, img.PixelFormat))
 | |
|                 {
 | |
|                     PUB.keyenceR.UpdateBitmap((Bitmap)img, newimg);
 | |
|                     if (fiF.Directory.Exists == false) fiF.Directory.Create();
 | |
|                     if (fiF.Exists) fiF.Delete();
 | |
|                     newimg.Save(fiF.FullName);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (PUB.keyenceR != null)
 | |
|             {
 | |
|                 var img = this.keyenceviewR.Image;
 | |
|                 if (img == null) return;
 | |
|                 using (var newimg = new Bitmap(img.Width, img.Height, img.PixelFormat))
 | |
|                 {
 | |
|                     PUB.keyenceR.UpdateBitmap((Bitmap)img, newimg);
 | |
|                     if (fiR.Directory.Exists == false) fiR.Directory.Create();
 | |
|                     if (fiR.Exists) fiR.Delete();
 | |
|                     newimg.Save(fiR.FullName);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
