Initial commit
This commit is contained in:
455
Handler/Project/Device/KeyenceBarcode.cs
Normal file
455
Handler/Project/Device/KeyenceBarcode.cs
Normal file
@@ -0,0 +1,455 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Runtime.InteropServices;
|
||||
using AR;
|
||||
|
||||
namespace Project.Device
|
||||
{
|
||||
public class KeyenceBarcode : IDisposable
|
||||
{
|
||||
public string IP { get; set; }
|
||||
public int Port { get; set; }
|
||||
private Winsock_Orcas.Winsock ws;
|
||||
public event EventHandler<RecvDataEvent> BarcodeRecv;
|
||||
public event EventHandler<RecvImageEvent> ImageRecv;
|
||||
RecvDataEvent LastData = null;
|
||||
RecvImageEvent LastImage = null;
|
||||
|
||||
public Boolean IsTriggerOn { get; set; } = false;
|
||||
private DateTime LastTrigOnTime = DateTime.Now;
|
||||
private System.Threading.Thread thliveimage = null;
|
||||
public int LiveImagetDelay = 500;
|
||||
public bool disposed = false;
|
||||
bool bRunConnectionK = true;
|
||||
public string Tag { get; set; }
|
||||
|
||||
|
||||
public string baseZPL { get; set; }
|
||||
|
||||
public class RecvDataEvent : EventArgs
|
||||
{
|
||||
public string RawData { get; set; }
|
||||
public RecvDataEvent(string rawdata)
|
||||
{
|
||||
this.RawData = rawdata;
|
||||
}
|
||||
}
|
||||
public class RecvImageEvent : EventArgs
|
||||
{
|
||||
public Image Image { get; set; }
|
||||
public RecvImageEvent(Image rawdata)
|
||||
{
|
||||
this.Image = rawdata;
|
||||
}
|
||||
}
|
||||
|
||||
public KeyenceBarcode(string ip = "192.168.100.100", int port = 9004)
|
||||
{
|
||||
this.IP = ip;
|
||||
this.Port = port;
|
||||
ws = new Winsock_Orcas.Winsock();
|
||||
ws.LegacySupport = true;
|
||||
ws.DataArrival += Ws_DataArrival;
|
||||
ws.Connected += Ws_Connected;
|
||||
thliveimage = new Thread(new ThreadStart(GetLiveImage));
|
||||
thliveimage.IsBackground = false;
|
||||
thliveimage.Start();
|
||||
Console.WriteLine($"{ip} / Port:{port}");
|
||||
}
|
||||
|
||||
~KeyenceBarcode()
|
||||
{
|
||||
Dispose(disposing: false);
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(disposing: true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
#region "Image Utility"
|
||||
|
||||
/// <summary>
|
||||
/// 8bpp 이미지의 팔레트를 설정합니다
|
||||
/// </summary>
|
||||
/// <param name="bmp"></param>
|
||||
public void UpdateGrayPallete(ref Bitmap bmp)
|
||||
{
|
||||
if (bmp.PixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed)
|
||||
{
|
||||
System.Drawing.Imaging.ColorPalette pal = bmp.Palette;
|
||||
for (int i = 0; i < 256; i++)
|
||||
{
|
||||
pal.Entries[i] = Color.FromArgb(i, i, i);
|
||||
}
|
||||
bmp.Palette = pal;
|
||||
}
|
||||
}
|
||||
public void GetImagePtr(Bitmap bmp, out IntPtr ptr, out int stride)
|
||||
{
|
||||
stride = 0;
|
||||
ptr = IntPtr.Zero;
|
||||
try
|
||||
{
|
||||
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
|
||||
ptr = bmpdata.Scan0;
|
||||
stride = bmpdata.Stride;
|
||||
bmp.UnlockBits(bmpdata);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsCompatible(Bitmap source, Bitmap target)
|
||||
{
|
||||
if (source == null) return false;
|
||||
try
|
||||
{
|
||||
if (source.Height != target.Height ||
|
||||
source.Width != target.Width ||
|
||||
source.PixelFormat != target.PixelFormat) return false;
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE("keyence compatiable : " + ex.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
public bool IsCompatible(Bitmap source, int w, int h, PixelFormat pf)
|
||||
{
|
||||
if (source == null) return false;
|
||||
if (source.Height != h ||
|
||||
source.Width != w ||
|
||||
source.PixelFormat != pf) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public Bitmap CreateBitmap(int w, int h)
|
||||
{
|
||||
|
||||
Bitmap bmp = new Bitmap(w, h, PixelFormat.Format8bppIndexed);
|
||||
UpdateGrayPallete(ref bmp);
|
||||
return bmp;
|
||||
}
|
||||
|
||||
byte[] memorybuffer;
|
||||
public void UpdateBitmap(Bitmap source, Bitmap target)
|
||||
{
|
||||
if (source.Width < 10 || source.Height < 10) return;
|
||||
if (target == null || target.Width < 10 || target.Height < 10)
|
||||
{
|
||||
target = CreateBitmap(source.Width, source.Height);
|
||||
}
|
||||
|
||||
var bitmaperrcnt = AR.VAR.I32[eVarInt32.BitmapCompatErr];
|
||||
if (IsCompatible(source, target) == false)
|
||||
{
|
||||
PUB.log.AddE($"키엔스비트맵호환오류 원본:{source.Width}x{source.Height} => 대상:{target.Width}x{target.Height}");
|
||||
|
||||
if (bitmaperrcnt > 5)
|
||||
{
|
||||
var o = target;
|
||||
target = CreateBitmap(source.Width, source.Height);
|
||||
if (o != null) o.Dispose();
|
||||
bitmaperrcnt = 0;
|
||||
}
|
||||
else AR.VAR.I32[eVarInt32.BitmapCompatErr] += 1;
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bitmaperrcnt > 0)
|
||||
AR.VAR.I32[eVarInt32.BitmapCompatErr] = 0;
|
||||
}
|
||||
|
||||
//get image pointer
|
||||
BitmapData bmpdatas = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, source.PixelFormat);
|
||||
var ptrs = bmpdatas.Scan0;
|
||||
var strides = bmpdatas.Stride;
|
||||
|
||||
BitmapData bmpdatat = target.LockBits(new Rectangle(0, 0, target.Width, target.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, target.PixelFormat);
|
||||
var ptrt = bmpdatat.Scan0;
|
||||
var stridet = bmpdatat.Stride;
|
||||
|
||||
//read source data
|
||||
var sourcesize = Math.Abs(bmpdatas.Stride) * source.Height;
|
||||
if (memorybuffer == null || memorybuffer.Length != sourcesize)
|
||||
{
|
||||
memorybuffer = new byte[sourcesize];
|
||||
}
|
||||
|
||||
Marshal.Copy(ptrs, memorybuffer, 0, sourcesize);
|
||||
|
||||
//write target data
|
||||
Marshal.Copy(memorybuffer, 0, ptrt, sourcesize);
|
||||
|
||||
source.UnlockBits(bmpdatas);
|
||||
target.UnlockBits(bmpdatat);
|
||||
|
||||
}
|
||||
|
||||
public void UpdateBitmap(Bitmap target, byte[] buffer, int w, int h)
|
||||
{
|
||||
if (IsCompatible(target, w, h, target.PixelFormat) == false)
|
||||
{
|
||||
throw new Exception("cannot udate incompatible bitmap.");
|
||||
}
|
||||
|
||||
//get image pointer
|
||||
BitmapData bmpdata = target.LockBits(new Rectangle(0, 0, target.Width, target.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, target.PixelFormat);
|
||||
var ptr = bmpdata.Scan0;
|
||||
var stride = bmpdata.Stride;
|
||||
|
||||
|
||||
if (stride == w) //image x4
|
||||
{
|
||||
Marshal.Copy(buffer, 0, ptr, stride * h);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < target.Height; ++i)
|
||||
{
|
||||
Marshal.Copy(buffer, i * w, new IntPtr(ptr.ToInt64() + i * stride), w);
|
||||
}
|
||||
}
|
||||
|
||||
target.UnlockBits(bmpdata);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!this.disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
//dipose managed resources;
|
||||
bRunConnectionK = false;
|
||||
Trigger(false);
|
||||
ws.DataArrival -= Ws_DataArrival;
|
||||
ws.Connected -= Ws_Connected;
|
||||
Disconnect();
|
||||
if (thliveimage != null && thliveimage.IsAlive) thliveimage.Abort();
|
||||
}
|
||||
|
||||
//dispose unmmanged resources;
|
||||
}
|
||||
|
||||
disposed = true;
|
||||
}
|
||||
|
||||
void GetLiveImage()
|
||||
{
|
||||
while (bRunConnectionK)
|
||||
{
|
||||
if (IsConnect && IsTriggerOn)
|
||||
{
|
||||
var tagname = this.Tag;
|
||||
var img = GetImage();
|
||||
this.LastImage = new RecvImageEvent(img);
|
||||
ImageRecv?.Invoke(this, this.LastImage);
|
||||
System.Threading.Thread.Sleep(LiveImagetDelay);
|
||||
}
|
||||
else System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
private void Ws_Connected(object sender, Winsock_Orcas.WinsockConnectedEventArgs e)
|
||||
{
|
||||
this.Trigger(true);
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
if (this.ws.State == Winsock_Orcas.WinsockStates.Closed)
|
||||
{
|
||||
this.ws.RemoteHost = this.IP;
|
||||
this.ws.RemotePort = this.Port;
|
||||
this.ws.Connect();
|
||||
}
|
||||
|
||||
}
|
||||
public void Disconnect()
|
||||
{
|
||||
if (this.ws.State != Winsock_Orcas.WinsockStates.Closed)
|
||||
this.ws.Close();
|
||||
}
|
||||
|
||||
private void Ws_DataArrival(object sender, Winsock_Orcas.WinsockDataArrivalEventArgs e)
|
||||
{
|
||||
var data = ws.Get<string>();
|
||||
this.LastData = new RecvDataEvent(data);
|
||||
BarcodeRecv?.Invoke(this, LastData);
|
||||
}
|
||||
|
||||
public bool Reset()
|
||||
{
|
||||
//if (IsTriggerOn) return;
|
||||
string cmd = "RESET";
|
||||
if (IsConnect == false)
|
||||
{
|
||||
PUB.log.AddE("Keyence Not Connected : RESET");
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
ws.Send(cmd + "\r");
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE(ex.Message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void Trigger(bool bOn)
|
||||
{
|
||||
//if (IsTriggerOn) return;
|
||||
string cmd = bOn ? "LON" : "LOFF";
|
||||
|
||||
if (bOn) LastTrigOnTime = DateTime.Now;
|
||||
|
||||
try
|
||||
{
|
||||
ws.Send(cmd + "\r");
|
||||
IsTriggerOn = bOn;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
public void ExecCommand(string cmd)
|
||||
{
|
||||
try
|
||||
{
|
||||
ws.Send(cmd + "\r");
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
public bool IsConnect
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ws == null) return false;
|
||||
return ws.State == Winsock_Orcas.WinsockStates.Connected;
|
||||
}
|
||||
}
|
||||
|
||||
private bool readimage = false;
|
||||
ManualResetEvent mre = new ManualResetEvent(true);
|
||||
bool mreSetOK = true;
|
||||
bool mreResetOK = true;
|
||||
|
||||
public Image GetImage()
|
||||
{
|
||||
Image oimg = null;
|
||||
if (mreResetOK && mre.WaitOne(1000) == false)
|
||||
{
|
||||
mreResetOK = false;
|
||||
return oimg;
|
||||
}
|
||||
else
|
||||
{
|
||||
mreResetOK = mre.Reset();
|
||||
try
|
||||
{
|
||||
var url = $"http://{this.IP}/liveimage.jpg";
|
||||
var data = UTIL.DownloadImagefromUrl(url);
|
||||
var ms = new System.IO.MemoryStream(data);
|
||||
oimg = Image.FromStream(ms);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE("Keyence GetImage:" + ex.Message);
|
||||
}
|
||||
|
||||
if (mreResetOK)
|
||||
{
|
||||
mreSetOK = mre.Set();
|
||||
}
|
||||
}
|
||||
return oimg;
|
||||
}
|
||||
|
||||
public bool SaveImage(string fn)
|
||||
{
|
||||
var fi = new System.IO.FileInfo(fn);
|
||||
if (fi.Directory.Exists == false)
|
||||
fi.Directory.Create();
|
||||
|
||||
|
||||
|
||||
if (mreResetOK && mre.WaitOne(1000) == false)
|
||||
{
|
||||
mreResetOK = false;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool retval = false;
|
||||
mreResetOK = mre.Reset();
|
||||
try
|
||||
{
|
||||
var url = $"http://{this.IP}/liveimage.jpg";
|
||||
var data = UTIL.DownloadImagefromUrl(url);
|
||||
using (var ms = new System.IO.MemoryStream(data))
|
||||
{
|
||||
using (var oimg = Image.FromStream(ms))
|
||||
oimg.Save(fi.FullName);
|
||||
}
|
||||
retval = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
if (mreResetOK)
|
||||
mre.Set();
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
public bool UpdateKeyenceImage(ref System.Windows.Forms.PictureBox pic)
|
||||
{
|
||||
bool retval = false;
|
||||
if (readimage)
|
||||
{
|
||||
PUB.log.AddAT("키엔스 이미지를 받고 잇어 명령을 처리하지 않음");
|
||||
}
|
||||
else
|
||||
{
|
||||
readimage = true;
|
||||
var oimg = pic.Image;
|
||||
|
||||
var newimage = GetImage();
|
||||
|
||||
pic.Image = newimage;
|
||||
retval = newimage != null;
|
||||
if (oimg != null) oimg.Dispose();
|
||||
|
||||
}
|
||||
readimage = false;
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
}
|
||||
116
Handler/Project/Device/SATOPrinter.cs
Normal file
116
Handler/Project/Device/SATOPrinter.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Project.Device
|
||||
{
|
||||
public class SATOPrinter : arDev.RS232
|
||||
{
|
||||
public string LastPrintZPL = string.Empty;
|
||||
public string qrData = string.Empty;
|
||||
public string baseZPL
|
||||
{
|
||||
get
|
||||
{
|
||||
var fi = new System.IO.FileInfo(AR.SETTING.Data.baseZPLFile);
|
||||
if (fi.Exists)
|
||||
{
|
||||
return System.IO.File.ReadAllText(fi.FullName, System.Text.Encoding.Default);
|
||||
}
|
||||
else return Properties.Settings.Default.ZPL7;
|
||||
}
|
||||
}
|
||||
|
||||
public SATOPrinter()
|
||||
{
|
||||
//this.baseZPL = Properties.Settings.Default.ZPL7;
|
||||
this.Terminal = eTerminal.CR;
|
||||
this.ReceiveData += SATOPrinter_ReceiveData;
|
||||
this.ReceiveData_Raw += SATOPrinter_ReceiveData_Raw;
|
||||
}
|
||||
|
||||
private void SATOPrinter_ReceiveData_Raw(object sender, ReceiveDataEventArgs e)
|
||||
{
|
||||
PUB.log.Add($"SATO Recv(RAW) : " + e.StrValue);
|
||||
}
|
||||
|
||||
private void SATOPrinter_ReceiveData(object sender, ReceiveDataEventArgs e)
|
||||
{
|
||||
PUB.log.Add($"SATO Recv : " + e.StrValue);
|
||||
}
|
||||
|
||||
public Boolean TestPrint(Boolean drawbox, string manu = "", string mfgdate = "")
|
||||
{
|
||||
var dtstr = DateTime.Now.ToShortDateString();
|
||||
var printcode = "103077807;Z577603504;105-35282-1105;15000;RC00004A219001W;20210612";
|
||||
var reel = new Class.Reel(printcode);
|
||||
//reel.id = "RLID" + DateTime.Now.ToString("MMHHmmssfff");
|
||||
reel.sid = "103000000";
|
||||
reel.partnum = "PARTNO".PadRight(20, '0'); //20자리
|
||||
|
||||
if (mfgdate == "") reel.mfg = dtstr;
|
||||
else reel.mfg = mfgdate;
|
||||
|
||||
reel.lot = "LOT000000000";
|
||||
if (manu == "") reel.manu = "ATK4EET1";
|
||||
else reel.manu = manu;
|
||||
|
||||
reel.qty = 15000;
|
||||
var rlt = Print(reel, true, drawbox);
|
||||
var fi = new System.IO.FileInfo(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp_zpl.txt"));
|
||||
System.IO.File.WriteAllText(fi.FullName, LastPrintZPL, System.Text.Encoding.Default);
|
||||
return rlt;
|
||||
}
|
||||
|
||||
|
||||
public Boolean Print(Class.Reel reel, Boolean display1drid, Boolean drawOUtBox)
|
||||
{
|
||||
string prtData;
|
||||
prtData = makeZPL_210908(reel, drawOUtBox, out qrData);
|
||||
|
||||
return Print(prtData);
|
||||
}
|
||||
|
||||
public bool Print(string _zpl)
|
||||
{
|
||||
this.LastPrintZPL = _zpl;
|
||||
if (this.IsOpen() == false) return false;
|
||||
|
||||
try
|
||||
{
|
||||
this.Write(_zpl);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public string makeZPL_210908(Class.Reel reel, Boolean drawbox, out string qrData)
|
||||
{
|
||||
string m_strSend = string.Empty;
|
||||
qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum);
|
||||
|
||||
var reeid = reel.id;
|
||||
if (reeid.Length > 20)
|
||||
reeid = "..." + reeid.Substring(reeid.Length - 20);
|
||||
|
||||
m_strSend = this.baseZPL;
|
||||
m_strSend = m_strSend.Replace("{qrData}", qrData);
|
||||
m_strSend = m_strSend.Replace("{sid}", reel.sid);
|
||||
m_strSend = m_strSend.Replace("{lot}", reel.lot);
|
||||
m_strSend = m_strSend.Replace("{partnum}", reel.partnum);
|
||||
m_strSend = m_strSend.Replace("{rid}", reeid);
|
||||
m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString());
|
||||
m_strSend = m_strSend.Replace("{mfg}", reel.mfg);
|
||||
m_strSend = m_strSend.Replace("{supply}", reel.manu);
|
||||
|
||||
//줄바꿈제거
|
||||
m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
|
||||
return m_strSend;
|
||||
}
|
||||
}
|
||||
}
|
||||
282
Handler/Project/Device/SATOPrinterAPI.cs
Normal file
282
Handler/Project/Device/SATOPrinterAPI.cs
Normal file
@@ -0,0 +1,282 @@
|
||||
using arCtl;
|
||||
using SATOPrinterAPI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Project.Device
|
||||
{
|
||||
public class SATOPrinterAPI : IDisposable
|
||||
{
|
||||
private bool disposed = false;
|
||||
Printer SATOPrinter = null;
|
||||
public string LastPrintZPL = string.Empty;
|
||||
public string qrData = string.Empty;
|
||||
public string PortName { get; set; }
|
||||
public int BaudRate { get; set; }
|
||||
public string baseZPL
|
||||
{
|
||||
get
|
||||
{
|
||||
var fi = new System.IO.FileInfo(AR.SETTING.Data.baseZPLFile);
|
||||
if (fi.Exists)
|
||||
{
|
||||
return System.IO.File.ReadAllText(fi.FullName, System.Text.Encoding.Default);
|
||||
}
|
||||
else return Properties.Settings.Default.ZPL7;
|
||||
}
|
||||
}
|
||||
|
||||
public SATOPrinterAPI()
|
||||
{
|
||||
SATOPrinter = new Printer();
|
||||
SATOPrinter.Timeout = 2500;
|
||||
SATOPrinter.Interface = Printer.InterfaceType.COM;
|
||||
SATOPrinter.ByteAvailable += SATOPrinter_ByteAvailable;
|
||||
}
|
||||
|
||||
|
||||
bool _isopen = false;
|
||||
public bool Open()
|
||||
{
|
||||
try
|
||||
{
|
||||
SATOPrinter.COMPort = this.PortName;
|
||||
SATOPrinter.COMSetting.Baudrate = this.BaudRate;
|
||||
SATOPrinter.Connect();
|
||||
_isopen = true;
|
||||
return _isopen;
|
||||
}
|
||||
catch { _isopen = false; return false; }
|
||||
|
||||
}
|
||||
private string ControlCharReplace(string data)
|
||||
{
|
||||
Dictionary<string, char> chrList = ControlCharList();
|
||||
foreach (string key in chrList.Keys)
|
||||
{
|
||||
data = data.Replace(key, chrList[key].ToString());
|
||||
}
|
||||
return data;
|
||||
}
|
||||
private Dictionary<string, char> ControlCharList()
|
||||
{
|
||||
Dictionary<string, char> ctr = new Dictionary<string, char>();
|
||||
ctr.Add("[NUL]", '\u0000');
|
||||
ctr.Add("[SOH]", '\u0001');
|
||||
ctr.Add("[STX]", '\u0002');
|
||||
ctr.Add("[ETX]", '\u0003');
|
||||
ctr.Add("[EOT]", '\u0004');
|
||||
ctr.Add("[ENQ]", '\u0005');
|
||||
ctr.Add("[ACK]", '\u0006');
|
||||
ctr.Add("[BEL]", '\u0007');
|
||||
ctr.Add("[BS]", '\u0008');
|
||||
ctr.Add("[HT]", '\u0009');
|
||||
ctr.Add("[LF]", '\u000A');
|
||||
ctr.Add("[VT]", '\u000B');
|
||||
ctr.Add("[FF]", '\u000C');
|
||||
ctr.Add("[CR]", '\u000D');
|
||||
ctr.Add("[SO]", '\u000E');
|
||||
ctr.Add("[SI]", '\u000F');
|
||||
ctr.Add("[DLE]", '\u0010');
|
||||
ctr.Add("[DC1]", '\u0011');
|
||||
ctr.Add("[DC2]", '\u0012');
|
||||
ctr.Add("[DC3]", '\u0013');
|
||||
ctr.Add("[DC4]", '\u0014');
|
||||
ctr.Add("[NAK]", '\u0015');
|
||||
ctr.Add("[SYN]", '\u0016');
|
||||
ctr.Add("[ETB]", '\u0017');
|
||||
ctr.Add("[CAN]", '\u0018');
|
||||
ctr.Add("[EM]", '\u0019');
|
||||
ctr.Add("[SUB]", '\u001A');
|
||||
ctr.Add("[ESC]", '\u001B');
|
||||
ctr.Add("[FS]", '\u001C');
|
||||
ctr.Add("[GS]", '\u001D');
|
||||
ctr.Add("[RS]", '\u001E');
|
||||
ctr.Add("[US]", '\u001F');
|
||||
ctr.Add("[DEL]", '\u007F');
|
||||
return ctr;
|
||||
}
|
||||
|
||||
|
||||
private bool Query(string cmd, out string errmsg)
|
||||
{
|
||||
errmsg = string.Empty;
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
errmsg = "No Command";
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
byte[] cmddata = Utils.StringToByteArray(ControlCharReplace(cmd));
|
||||
byte[] receiveData = SATOPrinter.Query(cmddata);
|
||||
|
||||
if (receiveData != null)
|
||||
{
|
||||
errmsg = ControlCharConvert(Utils.ByteArrayToString(receiveData));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errmsg = ex.Message;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
private string ControlCharConvert(string data)
|
||||
{
|
||||
Dictionary<char, string> chrList = ControlCharList().ToDictionary(x => x.Value, x => x.Key);
|
||||
foreach (char key in chrList.Keys)
|
||||
{
|
||||
data = data.Replace(key.ToString(), chrList[key]);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
~SATOPrinterAPI()
|
||||
{
|
||||
Dispose(disposing: false);
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(disposing: true);
|
||||
// This object will be cleaned up by the Dispose method.
|
||||
// Therefore, you should call GC.SuppressFinalize to
|
||||
// take this object off the finalization queue
|
||||
// and prevent finalization code for this object
|
||||
// from executing a second time.
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
// Check to see if Dispose has already been called.
|
||||
if (!this.disposed)
|
||||
{
|
||||
// If disposing equals true, dispose all managed
|
||||
// and unmanaged resources.
|
||||
if (disposing)
|
||||
{
|
||||
// Dispose managed resources.
|
||||
//component.Dispose();
|
||||
|
||||
}
|
||||
SATOPrinter.Disconnect();
|
||||
// Note disposing has been done.
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsOpen
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
if (_isopen == false || SATOPrinter == null) return false;
|
||||
try
|
||||
{
|
||||
return true;// return SATOPrinter.IsBusy;
|
||||
//var prn = this.SATOPrinter.GetPrinterStatus();
|
||||
//return prn.IsOnline;
|
||||
}
|
||||
catch { return false; }
|
||||
|
||||
}
|
||||
}
|
||||
private void SATOPrinter_ByteAvailable(object sender, Printer.ByteAvailableEventArgs e)
|
||||
{
|
||||
byte[] rawData = e.Data;
|
||||
var msg = Utils.ByteArrayToString(rawData);// System.Text.Encoding.Default.GetString(rawData);
|
||||
PUB.log.Add($"SATO Recv : " + msg);
|
||||
}
|
||||
|
||||
|
||||
// private void SATOPrinter_ReceiveData_Raw(object sender, ReceiveDataEventArgs e)
|
||||
//{
|
||||
// PUB.log.Add($"SATO Recv(RAW) : " + e.StrValue);
|
||||
//}
|
||||
|
||||
//private void SATOPrinter_ReceiveData(object sender, ReceiveDataEventArgs e)
|
||||
//{
|
||||
// PUB.log.Add($"SATO Recv : " + e.StrValue);
|
||||
//}
|
||||
|
||||
public Boolean TestPrint(Boolean drawbox, string manu = "", string mfgdate = "")
|
||||
{
|
||||
var dtstr = DateTime.Now.ToShortDateString();
|
||||
var printcode = "103077807;Z577603504;105-35282-1105;15000;RC00004A219001W;20210612";
|
||||
var reel = new Class.Reel(printcode);
|
||||
//reel.id = "RLID" + DateTime.Now.ToString("MMHHmmssfff");
|
||||
reel.sid = "103000000";
|
||||
reel.partnum = "PARTNO".PadRight(20, '0'); //20자리
|
||||
|
||||
if (mfgdate == "") reel.mfg = dtstr;
|
||||
else reel.mfg = mfgdate;
|
||||
|
||||
reel.lot = "LOT000000000";
|
||||
if (manu == "") reel.manu = "ATK4EET1";
|
||||
else reel.manu = manu;
|
||||
|
||||
reel.qty = 15000;
|
||||
var rlt = Print(reel, true, drawbox);
|
||||
var fi = new System.IO.FileInfo(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp_zpl.txt"));
|
||||
System.IO.File.WriteAllText(fi.FullName, LastPrintZPL, System.Text.Encoding.Default);
|
||||
return rlt;
|
||||
}
|
||||
|
||||
|
||||
public Boolean Print(Class.Reel reel, Boolean display1drid, Boolean drawOUtBox)
|
||||
{
|
||||
string prtData;
|
||||
prtData = makeZPL_210908(reel, drawOUtBox, out qrData);
|
||||
|
||||
return Print(prtData);
|
||||
}
|
||||
|
||||
public bool Print(string _zpl)
|
||||
{
|
||||
this.LastPrintZPL = _zpl;
|
||||
//if (this.IsOpen == false) return false;
|
||||
try
|
||||
{
|
||||
byte[] cmddata = Utils.StringToByteArray(ControlCharReplace(_zpl));
|
||||
SATOPrinter.Send(cmddata);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public string makeZPL_210908(Class.Reel reel, Boolean drawbox, out string qrData)
|
||||
{
|
||||
string m_strSend = string.Empty;
|
||||
qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum);
|
||||
|
||||
var reeid = reel.id;
|
||||
if (reeid.Length > 20)
|
||||
reeid = "..." + reeid.Substring(reeid.Length - 20);
|
||||
|
||||
m_strSend = this.baseZPL;
|
||||
m_strSend = m_strSend.Replace("{qrData}", qrData);
|
||||
m_strSend = m_strSend.Replace("{sid}", reel.sid);
|
||||
m_strSend = m_strSend.Replace("{lot}", reel.lot);
|
||||
m_strSend = m_strSend.Replace("{partnum}", reel.partnum);
|
||||
m_strSend = m_strSend.Replace("{rid}", reeid);
|
||||
m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString());
|
||||
m_strSend = m_strSend.Replace("{mfg}", reel.mfg);
|
||||
m_strSend = m_strSend.Replace("{supply}", reel.manu);
|
||||
|
||||
//줄바꿈제거
|
||||
m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
|
||||
return m_strSend;
|
||||
}
|
||||
}
|
||||
}
|
||||
91
Handler/Project/Device/StateMachine.cs
Normal file
91
Handler/Project/Device/StateMachine.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Project.Device
|
||||
{
|
||||
public class CSequence : AR.StateMachineSequence
|
||||
{
|
||||
public CSequence(int stepLen = 255) : base(stepLen) { }
|
||||
|
||||
public void Clear(eSMStep idx)
|
||||
{
|
||||
base.Clear((int)idx);
|
||||
}
|
||||
public int Get(eSMStep idx)
|
||||
{
|
||||
return base.Get((int)idx);
|
||||
}
|
||||
|
||||
public void Set(eSMStep idx, byte value)
|
||||
{
|
||||
base.Set((int)idx, value);
|
||||
}
|
||||
|
||||
|
||||
public void Update(eSMStep idx, int incValue = 1)
|
||||
{
|
||||
base.Update((int)idx, incValue);
|
||||
}
|
||||
public TimeSpan GetTime(eSMStep idx = 0)
|
||||
{
|
||||
return base.GetTime((int)idx);
|
||||
}
|
||||
public int GetData(eSMStep idx)
|
||||
{
|
||||
return base.GetData((int)idx);
|
||||
}
|
||||
public void ClearData(eSMStep idx) { base.ClearData((int)idx); }
|
||||
public void AddData(eSMStep idx, byte value = 1)
|
||||
{
|
||||
base.AddData((int)idx, value);
|
||||
}
|
||||
public void SetData(eSMStep idx, byte value)
|
||||
{
|
||||
_runseqdata[(int)idx] = value;
|
||||
}
|
||||
|
||||
public void UpdateTime(eSMStep idx)
|
||||
{
|
||||
_runseqtime[(int)idx] = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
public class CStateMachine : AR.StateMachine
|
||||
{
|
||||
/// <summary>
|
||||
/// Sequece Value / data
|
||||
/// </summary>
|
||||
public CSequence seq;
|
||||
public eSMStep PrePauseStep = eSMStep.NOTSET;
|
||||
public CStateMachine()
|
||||
{
|
||||
seq = new CSequence(255);
|
||||
}
|
||||
|
||||
public new eSMStep Step { get { return (eSMStep)base.Step; } }
|
||||
public void SetNewStep(eSMStep newstep_, Boolean force = false)
|
||||
{
|
||||
//일시중지라면 중지전의 상태를 백업한다
|
||||
if (newstep_ == eSMStep.PAUSE && this.Step != eSMStep.PAUSE && this.Step != eSMStep.WAITSTART) PrePauseStep = this.Step;
|
||||
base.SetNewStep((byte)newstep_, force);
|
||||
}
|
||||
|
||||
public new eSMStep getNewStep
|
||||
{
|
||||
get
|
||||
{
|
||||
return (eSMStep)newstep_;
|
||||
}
|
||||
}
|
||||
public new eSMStep getOldStep
|
||||
{
|
||||
get
|
||||
{
|
||||
return (eSMStep)oldstep_;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
154
Handler/Project/Device/TowerLamp.cs
Normal file
154
Handler/Project/Device/TowerLamp.cs
Normal file
@@ -0,0 +1,154 @@
|
||||
//#define OLD
|
||||
|
||||
using Project;
|
||||
using Project.Device;
|
||||
using System;
|
||||
|
||||
#if OLD
|
||||
using static Project.StateMachine;
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// 타워램프조작
|
||||
/// </summary>
|
||||
public static class TowerLamp
|
||||
{
|
||||
static bool enable = true;
|
||||
#if OLD
|
||||
static arDev.AzinAxt.DIO DIO = null;
|
||||
#else
|
||||
static arDev.DIO.IDIO DIO = null;
|
||||
#endif
|
||||
static int R = -1;
|
||||
static int G = -1;
|
||||
static int Y = -1;
|
||||
static DateTime updatetime = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// 타워램프 사용여부 false 가 입력되면 모든 램프가 꺼집니다
|
||||
/// </summary>
|
||||
public static Boolean Enable
|
||||
{
|
||||
get { return enable; }
|
||||
set
|
||||
{
|
||||
enable = value;
|
||||
if (enable == false)
|
||||
{
|
||||
RED = false;
|
||||
YEL = false;
|
||||
GRN = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 갱신주기 250ms 기본설정
|
||||
/// </summary>
|
||||
public static int UpdateInterval = 250;
|
||||
|
||||
#if OLD
|
||||
|
||||
public static void Init(arDev.AzinAxt.DIO dio_, int R_, int G_, int Y_)
|
||||
#else
|
||||
public static void Init(arDev.DIO.IDIO dio_, int R_, int G_, int Y_)
|
||||
#endif
|
||||
|
||||
|
||||
{
|
||||
DIO = dio_;
|
||||
R = R_;
|
||||
G = G_;
|
||||
Y = Y_;
|
||||
}
|
||||
public static void Update(eSMStep Step)
|
||||
{
|
||||
if (Enable == false) return;
|
||||
if (DIO == null) return; ;// throw new Exception("DIO가 설정되지 않았습니다. Init 함수를 호출 하세요");
|
||||
|
||||
var ts = DateTime.Now - updatetime;
|
||||
if (ts.TotalMilliseconds < UpdateInterval) return;
|
||||
|
||||
if (Step == eSMStep.RUN) //동작중에는 녹색을 점등
|
||||
{
|
||||
if (GRN == false) GRN = true;
|
||||
if (RED == true) RED = false;
|
||||
if (YEL == true) YEL = false;
|
||||
}
|
||||
else if (Step < eSMStep.IDLE || Step.ToString().StartsWith("HOME")) //초기화관련
|
||||
{
|
||||
GRN = false;
|
||||
var cur = YEL;
|
||||
RED = !cur;
|
||||
YEL = !cur;
|
||||
}
|
||||
else if (Step == eSMStep.FINISH) //작업종료
|
||||
{
|
||||
var cur = GRN;
|
||||
GRN = !cur;
|
||||
YEL = !cur;
|
||||
RED = false;
|
||||
}
|
||||
else if (Step == eSMStep.WAITSTART) //사용자대기
|
||||
{
|
||||
var cur = YEL;
|
||||
YEL = !cur;
|
||||
GRN = false;
|
||||
RED = false;
|
||||
}
|
||||
else if (Step == eSMStep.ERROR || Step == eSMStep.EMERGENCY)
|
||||
{
|
||||
RED = !RED;
|
||||
YEL = false;
|
||||
GRN = false;
|
||||
}
|
||||
else if (Step == eSMStep.PAUSE)
|
||||
{
|
||||
if (RED == false) RED = true;
|
||||
if (YEL == true) YEL = false;
|
||||
if (GRN == true) GRN = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//나머지 모든 상황은 대기로 한다
|
||||
if (YEL == false) YEL = true;
|
||||
if (GRN == true) GRN = false;
|
||||
if (RED == true) RED = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void SetLamp(int port, bool value)
|
||||
{
|
||||
if (DIO == null || !DIO.IsInit || port < 0) return;
|
||||
DIO.SetOutput(port, value);
|
||||
}
|
||||
static bool GetLamp(int port)
|
||||
{
|
||||
if (DIO == null || !DIO.IsInit || port < 0) return false;
|
||||
#if OLD
|
||||
return DIO.OUTPUT(port);
|
||||
#else
|
||||
return DIO.GetDOValue(port);
|
||||
#endif
|
||||
}
|
||||
|
||||
public static Boolean GRN
|
||||
{
|
||||
get { return GetLamp(G); }
|
||||
set { SetLamp(G, value); }
|
||||
}
|
||||
public static Boolean YEL
|
||||
{
|
||||
get { return GetLamp(Y); }
|
||||
set { SetLamp(Y, value); }
|
||||
}
|
||||
public static Boolean RED
|
||||
{
|
||||
get { return GetLamp(R); }
|
||||
set { SetLamp(R, value); }
|
||||
}
|
||||
}
|
||||
|
||||
//230619 chi PAUSE 상태추가 => RED ON
|
||||
// 전처리추가
|
||||
380
Handler/Project/Device/_CONNECTION.cs
Normal file
380
Handler/Project/Device/_CONNECTION.cs
Normal file
@@ -0,0 +1,380 @@
|
||||
using AR;
|
||||
using Emgu.CV;
|
||||
using Emgu.CV.Structure;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using UIControl;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain : Form
|
||||
{
|
||||
DateTime CameraConTimeL = DateTime.Now;
|
||||
DateTime CameraConTimeR = DateTime.Now;
|
||||
DateTime BarcodeConTime = DateTime.Now;
|
||||
DateTime KeyenceConTimeF = DateTime.Now;
|
||||
DateTime KeyenceConTimeR = DateTime.Now;
|
||||
DateTime PrintLConTime = DateTime.Now;
|
||||
DateTime PrintRConTime = DateTime.Now;
|
||||
DateTime swPLCConTime = DateTime.Now;
|
||||
Boolean bRunConnection = true;
|
||||
|
||||
DateTime SendStatusTime = DateTime.Now;
|
||||
void bwDeviceConnection()
|
||||
{
|
||||
while (bRunConnection && this.Disposing == false && this.Disposing == false)
|
||||
{
|
||||
//초기혹은 파괴상태는 처리안함
|
||||
if (PUB.keyenceF != null && PUB.keyenceF.disposed &&
|
||||
PUB.keyenceR != null && PUB.keyenceR.disposed)
|
||||
{
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ConnectSeq == 0) //키엔스
|
||||
{
|
||||
var tscam = DateTime.Now - KeyenceConTimeF;
|
||||
if (tscam.TotalSeconds > 5 && PUB.flag.get(eVarBool.FG_KEYENCE_OFFF) == false)
|
||||
{
|
||||
if (AR.SETTING.Data.Keyence_IPF.isEmpty() == false)
|
||||
{
|
||||
if (PUB.keyenceF != null && PUB.keyenceF.IsConnect == false)
|
||||
{
|
||||
PUB.keyenceF.Connect();
|
||||
KeyenceConTimeF = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
KeyenceConTimeF = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
}
|
||||
else KeyenceConTimeF = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
ConnectSeq += 1;
|
||||
}
|
||||
else if (ConnectSeq == 1) //키엔스
|
||||
{
|
||||
var tscam = DateTime.Now - KeyenceConTimeR;
|
||||
if (tscam.TotalSeconds > 5 && PUB.flag.get(eVarBool.FG_KEYENCE_OFFR) == false)
|
||||
{
|
||||
if (AR.SETTING.Data.Keyence_IPR.isEmpty() == false)
|
||||
{
|
||||
if (PUB.keyenceR != null && PUB.keyenceR.IsConnect == false)
|
||||
{
|
||||
PUB.keyenceR.Connect();
|
||||
KeyenceConTimeR = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
KeyenceConTimeR = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
}
|
||||
else KeyenceConTimeR = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
ConnectSeq += 1;
|
||||
}
|
||||
else if (ConnectSeq == 2) //카메라(왼)
|
||||
{
|
||||
var tscam = DateTime.Now - CameraConTimeL;
|
||||
if (tscam.TotalSeconds > 7)
|
||||
{
|
||||
//if (COMM.SETTING.Data.EnableExtVision)
|
||||
if (PUB.wsL == null || PUB.wsL.Connected == false)
|
||||
{
|
||||
if (AR.SETTING.Data.Log_CameraConn)
|
||||
PUB.log.Add($"카메라(L) 접속 시도({AR.SETTING.Data.HostIPL}:{AR.SETTING.Data.HostPortL})");
|
||||
if (PUB.wsL != null)
|
||||
{
|
||||
DetachCameraEventL(); //이벤트 종료
|
||||
PUB.wsL.Dispose();
|
||||
}
|
||||
|
||||
PUB.wsL = new WatsonWebsocket.WatsonWsClient(AR.SETTING.Data.HostIPL, AR.SETTING.Data.HostPortL, false);
|
||||
AttachCameraEventL();
|
||||
try
|
||||
{
|
||||
PUB.wsL.StartWithTimeout();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE(ex.Message); //220214
|
||||
}
|
||||
|
||||
CameraConTimeL = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
//if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_L) == false)
|
||||
{
|
||||
//마지막 수신시간으로 부터 5초가 지나면 전송한다
|
||||
//var tsRecv = DateTime.Now - lastRecvWSL;
|
||||
//if (tsRecv.TotalSeconds >= 15)
|
||||
//{
|
||||
// PUB.wsL.Dispose();
|
||||
//}
|
||||
//else if (tsRecv.TotalSeconds >= 5)
|
||||
{
|
||||
WS_Send(eWorkPort.Left, PUB.wsL, string.Empty, "STATUS", "");
|
||||
}
|
||||
CameraConTimeL = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
}
|
||||
}
|
||||
ConnectSeq += 1;
|
||||
}
|
||||
else if (ConnectSeq == 3) //카메라(우)
|
||||
{
|
||||
var tscam = DateTime.Now - CameraConTimeR;
|
||||
if (tscam.TotalSeconds > 7)
|
||||
{
|
||||
//if (COMM.SETTING.Data.EnableExtVision)
|
||||
if (PUB.wsR == null || PUB.wsR.Connected == false)
|
||||
{
|
||||
if (AR.SETTING.Data.Log_CameraConn)
|
||||
PUB.log.Add($"카메라(R) 접속 시도({AR.SETTING.Data.HostIPR}:{AR.SETTING.Data.HostPortR})");
|
||||
if (PUB.wsR != null)
|
||||
{
|
||||
DetachCameraEventR(); //이벤트 종료
|
||||
PUB.wsR.Dispose();
|
||||
}
|
||||
|
||||
PUB.wsR = new WatsonWebsocket.WatsonWsClient(AR.SETTING.Data.HostIPR, AR.SETTING.Data.HostPortR, false);
|
||||
AttachCameraEventR();
|
||||
|
||||
try
|
||||
{
|
||||
PUB.wsR.Start();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE(ex.Message); //220214
|
||||
}
|
||||
|
||||
|
||||
CameraConTimeR = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
//if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_R) == false)
|
||||
{
|
||||
//마지막 수신시간으로 부터 5초가 지나면 전송한다
|
||||
//var tsRecv = DateTime.Now - lastRecvWSR;
|
||||
//if (tsRecv.TotalSeconds >= 15)
|
||||
//{
|
||||
// PUB.wsR.Dispose();
|
||||
//}
|
||||
//else if (tsRecv.TotalSeconds >= 5)
|
||||
{
|
||||
WS_Send(eWorkPort.Right, PUB.wsR, string.Empty, "STATUS", "");
|
||||
}
|
||||
CameraConTimeR = DateTime.Now.AddSeconds(-4);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
ConnectSeq += 1;
|
||||
}
|
||||
else if (ConnectSeq == 4) //바코드연결
|
||||
{
|
||||
var tscam = DateTime.Now - BarcodeConTime;
|
||||
if (tscam.TotalSeconds > 5)
|
||||
{
|
||||
if (AR.SETTING.Data.Barcode_Port.isEmpty() == false)
|
||||
{
|
||||
if (PUB.BarcodeFix == null || PUB.BarcodeFix.IsOpen() == false)
|
||||
{
|
||||
PUB.BarcodeFix.PortName = AR.SETTING.Data.Barcode_Port;
|
||||
PUB.BarcodeFix.BaudRate = AR.SETTING.Data.Barcode_Baud;
|
||||
PUB.BarcodeFix.Open();
|
||||
BarcodeConTime = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
BarcodeConTime = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
}
|
||||
else BarcodeConTime = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
ConnectSeq += 1;
|
||||
}
|
||||
else if (ConnectSeq == 5) //프린터(좌)
|
||||
{
|
||||
var tscam = DateTime.Now - PrintLConTime;
|
||||
if (tscam.TotalSeconds > 5)
|
||||
{
|
||||
if (AR.SETTING.Data.PrintL_Port.isEmpty() == false)
|
||||
{
|
||||
if (PUB.PrinterL == null || PUB.PrinterL.IsOpen == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
PUB.PrinterL.PortName = AR.SETTING.Data.PrintL_Port;
|
||||
PUB.PrinterL.BaudRate = AR.SETTING.Data.PrintL_Baud;
|
||||
PUB.PrinterL.Open();
|
||||
PrintLConTime = DateTime.Now;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
PrintLConTime = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
}
|
||||
else PrintLConTime = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
ConnectSeq += 1;
|
||||
}
|
||||
else if (ConnectSeq == 6) //프린터(우)
|
||||
{
|
||||
var tscam = DateTime.Now - PrintRConTime;
|
||||
if (tscam.TotalSeconds > 5)
|
||||
{
|
||||
if (AR.SETTING.Data.PrintR_Port.isEmpty() == false)
|
||||
{
|
||||
if (PUB.PrinterR == null || PUB.PrinterR.IsOpen == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
PUB.PrinterR.PortName = AR.SETTING.Data.PrintR_Port;
|
||||
PUB.PrinterR.BaudRate = AR.SETTING.Data.PrintR_Baud;
|
||||
PUB.PrinterR.Open();
|
||||
PrintRConTime = DateTime.Now;
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
}
|
||||
else
|
||||
{
|
||||
//연결이 되어있다면 상태값을 요청한다
|
||||
PrintRConTime = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
}
|
||||
else PrintRConTime = DateTime.Now.AddSeconds(-4);
|
||||
}
|
||||
ConnectSeq = 7;
|
||||
}
|
||||
else if (ConnectSeq == 7) //swPLC 230725
|
||||
{
|
||||
var tscam = DateTime.Now - swPLCConTime;
|
||||
if (tscam.TotalSeconds > 5)
|
||||
{
|
||||
if (PUB.plc != null && PUB.plc.Init == false)
|
||||
{
|
||||
PUB.plc.Start();
|
||||
}
|
||||
swPLCConTime = DateTime.Now;
|
||||
}
|
||||
ConnectSeq = 0;
|
||||
}
|
||||
|
||||
var tsst = DateTime.Now - SendStatusTime;
|
||||
if (tsst.TotalSeconds > 3)
|
||||
{
|
||||
//내정보를 전송한다.
|
||||
|
||||
var modelVision = "";
|
||||
if (PUB.Result.isSetvModel) modelVision = PUB.Result.vModel.Title;
|
||||
|
||||
var dt = new
|
||||
{
|
||||
mc = SETTING.Data.McName,
|
||||
status = PUB.sm.Step.ToString(),
|
||||
model = modelVision,
|
||||
bypass = (VAR.BOOL[eVarBool.Opt_DisablePrinter] ? true : false),
|
||||
};
|
||||
string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
|
||||
var url = $@"http://10.131.32.29:8080/api/updatelastatus";
|
||||
var rlt = PostFromUrl(url, jsonStr, out bool iserr, _timeout: 1000);
|
||||
if (iserr) PUB.log.AddE($"ECS 상태정보실패 메세지:{rlt}");
|
||||
SendStatusTime = DateTime.Now;
|
||||
}
|
||||
|
||||
System.Threading.Thread.Sleep(2000);
|
||||
|
||||
}
|
||||
Console.WriteLine("Close : bwDeviceConnection");
|
||||
}
|
||||
|
||||
|
||||
public string PostFromUrl(string url, string jsonStr, out Boolean isError, string authid = "", string authpw = "", int _timeout = 0)
|
||||
{
|
||||
isError = false;
|
||||
string result = "";
|
||||
try
|
||||
{
|
||||
var timeout = 1000;
|
||||
//RaiseMessage(false, "POST : " + url);
|
||||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
|
||||
if (_timeout == 0)
|
||||
{
|
||||
request.Timeout = timeout;
|
||||
request.ReadWriteTimeout = timeout;
|
||||
}
|
||||
else
|
||||
{
|
||||
request.Timeout = _timeout;
|
||||
request.ReadWriteTimeout = _timeout;
|
||||
}
|
||||
|
||||
|
||||
if (string.IsNullOrEmpty(authid) == false && string.IsNullOrEmpty(authpw) == false)
|
||||
{
|
||||
string authInfo = $"{authid}:{authpw}";
|
||||
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
|
||||
request.Headers["Authorization"] = "Basic " + authInfo;
|
||||
}
|
||||
|
||||
request.Method = "POST";
|
||||
request.ContentType = "application/json";
|
||||
request.ContentLength = jsonStr.Length;
|
||||
request.MaximumAutomaticRedirections = 4;
|
||||
request.MaximumResponseHeadersLength = 4;
|
||||
request.Credentials = CredentialCache.DefaultCredentials;
|
||||
|
||||
using (StreamWriter sw = new StreamWriter(request.GetRequestStream()))
|
||||
{
|
||||
sw.Write(jsonStr);
|
||||
sw.Flush();
|
||||
sw.Close();
|
||||
|
||||
var response = request.GetResponse() as HttpWebResponse;
|
||||
using (var txtReader = new StreamReader(response.GetResponseStream()))
|
||||
{
|
||||
result = txtReader.ReadToEnd();
|
||||
}
|
||||
}
|
||||
|
||||
// LastQueryBUF = result;
|
||||
//LastQueryURL = url;
|
||||
//RaiseRawMessage(url, "RESULT\n" + result); //181026 - show data
|
||||
}
|
||||
catch (WebException wex)
|
||||
{
|
||||
isError = true;
|
||||
result = wex.ToString();// new StreamReader(wex.Response.GetResponseStream()).ReadToEnd();
|
||||
//RaiseMessage(true, "POST-ERROR\n" + result);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user