Initial commit

This commit is contained in:
ChiKyun Kim
2025-07-17 16:11:46 +09:00
parent 4865711adc
commit 4a1b1924ba
743 changed files with 230954 additions and 0 deletions

View 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;
}
}
}

View 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;
}
}
}

View 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;
}
}
}

View 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_;
}
}
}
}

View 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
// 전처리추가

View 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;
}
}
}