Communication/Ethernet.cs
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using Auto_Insert_Sim_Tray.UI;
using Auto_Insert_Sim_Tray.Utils;
using Auto_Insert_Sim_Tray.Configs.Model;
using static Auto_Insert_Sim_Tray.Define.LogDefine;
namespace Auto_Insert_Sim_Tray.Communication
public enum EthernetResult
SEND_DATA_CONNECT_CLOSE_ERROR,
public class ConnectedSocketStateObject
private Socket workSocket = null;
private const int bufferSize = 1024;
private byte[] receiveBuffer = new byte[bufferSize];
private int receiveDataSize;
private StringBuilder receiveDataStringBuilder = new StringBuilder();
get { return workSocket; }
set { workSocket = value; }
get { return bufferSize; }
public byte[] ReceiveBuffer
get { return receiveBuffer; }
set { receiveBuffer = value; }
public int ReceiveDataSize
get { return receiveDataSize; }
set { receiveDataSize = value; }
public StringBuilder ReceiveDataStringBuilder
get { return receiveDataStringBuilder; }
set { receiveDataStringBuilder = value; }
public void ClearBuffer()
Array.Clear(receiveBuffer, 0, BufferSize);
private static string CLASS_NAME = "Ethernet";
private const int MinimumPortNum = 0;
private const int InvalidPortNum = -1;
private EthernetMode mode;
private IPAddress ipAddress;
private Socket mainSocket;
private IPEndPoint endPoint;
public List<ConnectedSocketStateObject> connectedSocketList;
public delegate void ConnectCallbackEvent(EthernetResult result, string remoteEndPoint);
public event ConnectCallbackEvent ConnectCallbackEventHandler;
public delegate void SendDataCallbackEvent(EthernetResult result, string remoteEndPoint, string sendData = null);
public event SendDataCallbackEvent SendDataCallbackEventHandler;
public delegate void ReceiveDataCallbackEvent(string readData, string remoteEndPoint);
public event ReceiveDataCallbackEvent ReceiveDataCallbackEventHandler;
public delegate void DisconnectedCallbackEvent(string remoteEndPoint);
public event DisconnectedCallbackEvent DisconnectedCallbackEventHandler;
public Ethernet(EthernetMode mode = EthernetMode.eNone, string ipAddress = null, int portNum = InvalidPortNum)
this.ipAddress = IPAddress.Parse(ipAddress);
public Ethernet(EthernetMode mode = EthernetMode.eNone, IPAddress ipAddress = null, int portNum = InvalidPortNum)
this.ipAddress = ipAddress;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Connect", CONTENT_TYPE.INFO);
case EthernetMode.eServerMode:
case EthernetMode.eClientMode:
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Wrong mode", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Disconnect", CONTENT_TYPE.INFO);
case EthernetMode.eServerMode:
case EthernetMode.eClientMode:
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
private void startServer()
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "startServer", CONTENT_TYPE.DEBUG);
if ((ipAddress == null) || (portNum < MinimumPortNum))
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Wrong parameter", CONTENT_TYPE.DEBUG);
throw new Exception("Wrong parameter");
endPoint = new IPEndPoint(ipAddress, portNum);
mainSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
connectedSocketList = new List<ConnectedSocketStateObject>();
mainSocket.Bind(endPoint);
mainSocket.BeginAccept(new AsyncCallback(AcceptCallback), mainSocket);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Wrong BeginAccept", CONTENT_TYPE.INFO);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
private void AcceptCallback(IAsyncResult ar)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "AcceptCallback", CONTENT_TYPE.DEBUG);
client = ((Socket)ar.AsyncState).EndAccept(ar);
mainSocket.BeginAccept(AcceptCallback, mainSocket);
ConnectedSocketStateObject connSocketState = new ConnectedSocketStateObject();
connSocketState.WorkSocket = client;
connectedSocketList.Add(connSocketState);
ConnectCallbackEventHandler?.Invoke(EthernetResult.SUCCESS, client.RemoteEndPoint.ToString());
client.BeginReceive(connSocketState.ReceiveBuffer, 0, connSocketState.BufferSize, 0, new AsyncCallback(ReceiveDataCallback), connSocketState);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Accept success", CONTENT_TYPE.INFO);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
if ((client != null) && (client.RemoteEndPoint != null))
endPoint = client.RemoteEndPoint.ToString();
ConnectCallbackEventHandler?.Invoke(EthernetResult.SERVER_ACCEPT_ERROR, endPoint);
public void startClient()
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "startClient", CONTENT_TYPE.DEBUG);
if ((ipAddress == null) || (portNum < MinimumPortNum))
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Wrong parameter", CONTENT_TYPE.DEBUG);
throw new Exception("Wrong parameter");
endPoint = new IPEndPoint(ipAddress, portNum);
mainSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if (!mainSocket.Connected)
mainSocket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), mainSocket);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "BeginConnect", CONTENT_TYPE.INFO);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
throw new Exception("Start client error!");
private void ConnectCallback(IAsyncResult ar)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "ConnectCallback", CONTENT_TYPE.DEBUG);
client = (Socket)ar.AsyncState;
ConnectedSocketStateObject connSocketState = new ConnectedSocketStateObject();
connSocketState.WorkSocket = mainSocket;
ConnectCallbackEventHandler?.Invoke(EthernetResult.SUCCESS, ipAddress.ToString());
client.BeginReceive(connSocketState.ReceiveBuffer, 0, connSocketState.BufferSize, 0, new AsyncCallback(ReceiveDataCallback), connSocketState);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "BeginReceive", CONTENT_TYPE.INFO);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
ConnectCallbackEventHandler?.Invoke(EthernetResult.CLIENT_CONNECT_ERROR, ipAddress.ToString());
private void ReceiveDataCallback(IAsyncResult ar)
LogUtil.Instance.Log(LOG_TYPE.TCP_LOG, $"[{mode}][Port {portNum}] ReceiveData:", CONTENT_TYPE.LOG);
string content = String.Empty;
ConnectedSocketStateObject connSocketState = (ar.AsyncState) as ConnectedSocketStateObject;
connSocketState.ReceiveDataSize = connSocketState.WorkSocket.EndReceive(ar);
if (connSocketState.ReceiveDataSize > 0)
connSocketState.ReceiveDataStringBuilder.Append(Encoding.UTF8.GetString(connSocketState.ReceiveBuffer, 0, connSocketState.ReceiveDataSize));
content = connSocketState.ReceiveDataStringBuilder.ToString();
connSocketState.ClearBuffer();
connSocketState.ReceiveDataStringBuilder.Clear();
connSocketState.ReceiveDataSize = 0;
ReceiveDataCallbackEventHandler?.Invoke(content, connSocketState.WorkSocket.RemoteEndPoint.ToString());
connSocketState.WorkSocket.BeginReceive(connSocketState.ReceiveBuffer, 0, connSocketState.BufferSize, 0, new AsyncCallback(ReceiveDataCallback), connSocketState);
LogUtil.Instance.Log(LOG_TYPE.TCP_LOG, $"[{connSocketState.WorkSocket.RemoteEndPoint}]{content}", CONTENT_TYPE.LOG);
throw new Exception("ReceivedDataSize Error!");
catch (ObjectDisposedException objectDisposedException)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{objectDisposedException}", CONTENT_TYPE.EXCEPTION);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
if (mode == EthernetMode.eServerMode)
if ((connSocketState != null) && (connSocketState.WorkSocket != null))
if (connSocketState.WorkSocket.RemoteEndPoint != null)
endPoint = connSocketState.WorkSocket.RemoteEndPoint.ToString();
removeDisconnectedSocket(connSocketState.WorkSocket);
endPoint = ipAddress.ToString();
DisconnectedCallbackEventHandler?.Invoke(endPoint);
private void removeDisconnectedSocket(Socket socket)
if (connectedSocketList != null)
for (int connectedClientsCount = connectedSocketList.Count - 1; connectedClientsCount >= 0; connectedClientsCount--)
ConnectedSocketStateObject connSocketState = connectedSocketList[connectedClientsCount];
if (socket.RemoteEndPoint.Equals(connSocketState.WorkSocket.RemoteEndPoint) &&
socket.LocalEndPoint.Equals(connSocketState.WorkSocket.LocalEndPoint))
connSocketState.WorkSocket.Close();
connectedSocketList.RemoveAt(connectedClientsCount);
public void SendData(string data, string remoteIpAddress = null, int remotePortNum = InvalidPortNum)
LogUtil.Instance.Log(LOG_TYPE.TCP_LOG, $"[{mode}][Port {portNum}] SendData: {data}", CONTENT_TYPE.LOG);
if (mode == EthernetMode.eClientMode)
if (isSocketConnected(mainSocket))
LogUtil.Instance.Log(LOG_TYPE.TCP_LOG, $"[{mainSocket.RemoteEndPoint}]{data}", CONTENT_TYPE.LOG);
SendData(mainSocket, data);
SendDataCallbackEventHandler?.Invoke(EthernetResult.SEND_DATA_CONNECT_CLOSE_ERROR, mainSocket.RemoteEndPoint.ToString());
for (int connectedClientsCount = connectedSocketList.Count - 1; connectedClientsCount >= 0; connectedClientsCount--)
ConnectedSocketStateObject connSocketState = connectedSocketList[connectedClientsCount];
if ((remoteIpAddress == null)
|| ((remoteIpAddress != null) && IsSameDestination(remoteIpAddress, remotePortNum, connSocketState.WorkSocket)))
client = connSocketState.WorkSocket;
if (isSocketConnected(client))
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"[{client.RemoteEndPoint}]{data}", CONTENT_TYPE.DEBUG);
if (client != null && client.RemoteEndPoint != null)
endPoint = client.RemoteEndPoint.ToString();
SendDataCallbackEventHandler?.Invoke(EthernetResult.SEND_DATA_CONNECT_CLOSE_ERROR, endPoint);
DisconnectedCallbackEventHandler?.Invoke(endPoint);
connectedSocketList.RemoveAt(connectedClientsCount);
private void SendData(Socket handler, string data)
byte[] byteData = Encoding.UTF8.GetBytes(data);
if (handler != null && handler.RemoteEndPoint != null)
endPoint = handler.RemoteEndPoint.ToString();
handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendDataCallback), handler);
SendDataCallbackEventHandler?.Invoke(EthernetResult.SUCCESS, endPoint, data);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
SendDataCallbackEventHandler?.Invoke(EthernetResult.SEND_DATA_ERROR, endPoint);
private void SendDataCallback(IAsyncResult ar)
handler = (Socket)ar.AsyncState;
int bytesSent = handler.EndSend(ar);
SendDataCallbackEventHandler?.Invoke(EthernetResult.SUCCESS, handler.RemoteEndPoint.ToString());
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
if (handler != null && handler.RemoteEndPoint != null)
endPoint = handler.RemoteEndPoint.ToString();
SendDataCallbackEventHandler?.Invoke(EthernetResult.SEND_DATA_ERROR, endPoint);
private void CloseAllSocket()
if ((mode == EthernetMode.eServerMode) && (connectedSocketList != null))
for (int connectedClientsCount = connectedSocketList.Count - 1; connectedClientsCount >= 0; connectedClientsCount--)
ConnectedSocketStateObject connSocketState = connectedSocketList[connectedClientsCount];
if ((connSocketState != null) && (connSocketState.WorkSocket != null))
connSocketState.WorkSocket.Close();
connectedSocketList.RemoveAt(connectedClientsCount);
connectedSocketList = null;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
private bool isSocketConnected(Socket socket)
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] tcpConnections;
throw new Exception("Socket is null");
tcpConnections = ipProperties.GetActiveTcpConnections().Where(
x => x.LocalEndPoint.Equals(socket.LocalEndPoint) && x.RemoteEndPoint.Equals(socket.RemoteEndPoint)).ToArray();
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
if ((tcpConnections != null) && (tcpConnections.Length > 0))
TcpState stateOfConnection = tcpConnections.First().State;
if (stateOfConnection == TcpState.Established)
private bool IsSameDestination(string remoteIpAddress, int remotePortNum, Socket socket)
IPEndPoint endPoint = (IPEndPoint)socket.RemoteEndPoint;
string socketIpAddress = endPoint.Address.ToString();
if (remoteIpAddress.Equals(socketIpAddress))
if (remotePortNum != InvalidPortNum)
if (remotePortNum == endPoint.Port)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{ex}", CONTENT_TYPE.EXCEPTION);
private IPAddress GetDefaultIpAddress()
IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress address in hostEntry.AddressList)
if (address.AddressFamily == AddressFamily.InterNetwork)
return IPAddress.Loopback;
if (connectedSocketList is null)
Configs/Model/AxisParamData.Cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Auto_Insert_Sim_Tray.Configs.Model
public class AxisParamData
[DisplayName("[Axis Parameter] Resolution")]
[Description("Resolution for motor (pulse)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object resolution { get; set; }
[DisplayName("[Axis Parameter] Distance")]
[Description("Distance of motor's pulley (cm)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object distance { get; set; }
[DisplayName("[Axis Parameter] Velocity high")]
[Description("Default motor velocity high (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object vel_high { get; set; } = 0;
[DisplayName("[Axis Parameter] Velocity medium")]
[Description("Default motor velocity medium (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object vel_medium { get; set; } = 0;
[DisplayName("[Axis Parameter] Velocity low")]
[Description("Default motor velocity low (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object vel_low { get; set; } = 0;
[DisplayName("[Axis Parameter] Velocity value maximum")]
[Description("Default motor velocity value maximum (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object vel_value_max { get; set; } = 0;
[DisplayName("[Axis Parameter] Velocity value minimum")]
[Description("Default motor velocity value minimum (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object vel_value_min { get; set; } = 0;
[DisplayName("[Axis Parameter] Acceleration")]
[Description("Default motor acceleration (ms)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object acc { get; set; }
[DisplayName("[Axis Parameter] Deceleration")]
[Description("Default motor dcceleration (ms)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object dec { get; set; }
[DisplayName("[Axis Parameter] Jog velocity")]
[Description("Jog motor velocity (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object jogVel { get; set; } = 0;
[DisplayName("[Axis Parameter] Jog acceleration")]
[Description("Jog motor acceleration (ms)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object jogAcc { get; set; }
[DisplayName("[Axis Parameter] Jog dcceleration")]
[Description("Jog motor dcceleration (ms)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object jogDec { get; set; }
[DisplayName("[Axis Parameter] Origin velocity")]
[Description("Origin motor velocity (mm/s)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object oriVel { get; set; }
[DisplayName("[Axis Parameter] Origin acceleration")]
[Description("Origin motor acceleration (ms)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object oriAcc { get; set; }
[DisplayName("[Axis Parameter] Origin dcceleration")]
[Description("Origin motor dcceleration (ms)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object oriDec { get; set; }
[DisplayName("[Axis Parameter] Origin return value")]
[Description("If you don't use origin origin and limit +, - sensors, you can insert null (pulse)")]
[TypeConverter(typeof(AxisParamExpandableObjectConverter))]
public object oriReturn { get; set; }
[DisplayName("[Axis Parameter] Inposition flag")]
[Description("(Only Fastech) When motor be stopped, you can reference inposition flag or not (bool)")]
public bool inpositionFlag { get; set; }
public AxisParamData(object resolution, object distance, object vel, object vel_low, object acc, object dec,
object jogVel, object jogAcc, object jogDec,
object oriVel, object oriAcc, object oriDec, object oriReturn = null, bool inpositionFlag = false)
this.resolution = resolution;
this.distance = distance;
this.oriReturn = oriReturn;
this.inpositionFlag = inpositionFlag;
public AxisParamData() { }
public class AxisParamExpandableObjectConverter : ExpandableObjectConverter
public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destinationType)
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, System.Type destinationType)
tempData = Convert.ToDouble(value);
return Convert.ToString(value);
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
return Convert.ToDouble(value);
MessageBox.Show(e.Message.ToString());
Configs/Model/ConfigMC.cs
using Microsoft.Office.Interop.Excel;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Configs.Model
[DisplayName("Number of tray")]
[Description("Number of tray")]
public int Number_Of_Tray_Max { get; set; } = 0;
[DisplayName("Current tray")]
[Description("Current tray on out tray")]
public int Count_Tray_OutTray { get; set; } = 0;
[DisplayName("Offset Tray")]
[Description("Define Offset value (cm)")]
public decimal Offset_OutTray { get; set; } = 0;
[Category("Cylinder Rotate")]
[DisplayName("Cyliner Rotate LD SET Front")]
[Description("Select true: Rotate Front/ false: Rotate Rear")]
public bool Rotate_LD_SET { get; set; } = true;
[Category("Cylinder Rotate")]
[DisplayName("Cyliner Rotate ULD SET Rear")]
[Description("Select true: Rotate Front/ false: Rotate Rear")]
public bool Rotate_ULD_SET { get; set; } = true;
[Category("By Pass Mode")]
[DisplayName("Select where to place set")]
[Description("Select true: Set OK/ false: SET NG")]
public bool ByPassSetOK { get; set; } = true;
[DisplayName("Number of insert Tray Sim Fail")]
[Description("Number of insert Tray Sim Fail")]
public int Number_Of_NG_Jig_Left { get; set; } = 0;
[DisplayName("Number of insert Tray Sim Fail")]
[Description("Number of insert Tray Sim Fail")]
public int Number_Of_NG_Jig_Right { get; set; } = 0;
[DisplayName("Number of Grip Tray Sim fail")]
[Description("Number of Grip Tray Sim fail")]
public int Number_Of_Grip_Tray_Sim_Fail { get; set; } = 0;
[DisplayName("Use Run Servo ABSLiner")]
[Description("Cài đặt True sẽ chạy ABSLiner từ điểm Wait đi gắp Tray Sim, False sẽ chạy đơn từng trục từ điểm Wait đi gắp Tray Sim")]
public bool Use_Run_Servo_ABSLiner { get; set; } = true;
Configs/Model/DelayTimeModel.cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Configs.Model
public class DelayTimeModel
[Category("Cylinder of Jig")]
[DisplayName("1. Cylinder Align Hor")]
[Description("Define Align Hor Sol delay (s)")]
public double Jig_Align_Hor_Delay { get; set; } = 0.1f;
[Category("Cylinder of Jig")]
[DisplayName("2. Cylinder Align Ver")]
[Description("Define Align Hor Sol delay (s)")]
public double Jig_Align_Ver_Delay { get; set; } = 0.1f;
[Category("Cylinder of Shutter NG")]
[DisplayName("1. NG Cylinder Up/Down")]
[Description("Define Up/Down Sol delay (s)")]
public double NG_UpDownSolDelay { get; set; } = 0.1f;
[Category("Cylinder of Shutter NG")]
[DisplayName("2. NG FW")]
[Description("Define FW Sol delay (s)")]
public double NG_FWSolDelay { get; set; } = 0.1f;
[Category("Cylinder of Shutter NG")]
[DisplayName("3. NG BW")]
[Description("Define BW Sol delay (s)")]
public double NG_BWSolDelay { get; set; } = 0.1f;
[DisplayName("1. Check Khay Tray Sim")]
[Description("Define Check Tray Sim delay to Align (s)")]
public double Intray_Check_Tray_Sim_Delay { get; set; } = 0.1f;
[DisplayName("2. Cycliner Align Tray")]
[Description("Define Cylinder Align delay (s)")]
public double Intray_Align_Delay { get; set; } = 0.1f;
[DisplayName("3. Cycliner Unalign Tray")]
[Description("Define Cylinder Align delay (s)")]
public double Intray_Unalign_Delay { get; set; } = 0.1f;
[DisplayName("4. Separate Tray Sim")]
[Description("Define Cylinder Cylinder of Intray delay (s)")]
public double Step_Separate_Delay { get; set; } = 0.1f;
[DisplayName("1. Time check NG")]
[Description("Define time check NG when insert sim tray (s)")]
public double Insert_Sim_Tray_Check_NG { get; set; } = 0.1f;
[DisplayName("2. Grip Sim Tray ")]
[Description("Define time Grip Sim Tray delay (s)")]
public double RobotXYZ_Grip_Delay { get; set; } = 0.1f;
[DisplayName("3. Down Cylinder Rear ")]
[Description("Define time Down Cylinder Rear delay (s)")]
public double RobotXYZ_Down_Rear_Delay { get; set; } = 0.1f;
[DisplayName("4. Down Cylinder Front ")]
[Description("Define time Down Cylinder Front delay (s)")]
public double RobotXYZ_Down_Front_Delay { get; set; } = 0.1f;
[DisplayName("5. Check Tray Sim ")]
[Description("Define time to check Grip Tray Sim Ok or NG (s)")]
public double RobotXYZ_Check_Tray_Sim { get; set; } = 0.1f;
[DisplayName("Load CV delay")]
[Description("Define CV run after detecting sensor out On <-> Off (s)")]
public double LoadCVDelay { get; set; } = 0.1f;
[DisplayName("Unload CV delay")]
[Description("Define CV run after detecting sensor out On <-> Off (s)")]
public double UnloadCVDelay { get; set; } = 0.1f;
[DisplayName("CV Input Tray Sim")]
[Description("Define CV Input Tray Sim run after detecting sensor out On <-> Off (s)")]
public double CVInputDelay { get; set; } = 0.1f;
[DisplayName("CV Outtray Tray Sim")]
[Description("Define CV Input Tray Sim run after detecting sensor out On <-> Off (s)")]
public double CVOuttrayDelay { get; set; } = 0.1f;
[DisplayName("Dry Run Testing time")]
[Description("Define Dry Run Testing Time (s)")]
public double TestDryrunTime { get; set; } = 10.0f;
[DisplayName("Dry Run Down RF Cable time")]
[Description("Define Dry Run Down RF Cable time (s)")]
public double TestRFDownTime { get; set; } = 5.0f;
[DisplayName("On buzzer time")]
[Description("Define buzzer time (s)")]
public double OnBuzzerTime { get; set; } = 5.0f;
[DisplayName("Out Set Timer")]
[Description("Define Out Set Timer (s)")]
public double OutSetTime { get; set; } = 5.0f;
[DisplayName("1. Time check model SET")]
[Description("Define Time check model SET vs model Tray Sim delay (s)")]
public double Wait_To_LD_Pick_Set { get; set; } = 0.1f;
[DisplayName("2. Clamp On LD")]
[Description("Define time Clamp On LD delay (s)")]
public double Clamp_On_LD_Delay { get; set; } = 0.1f;
[DisplayName("3. Clamp On ULD")]
[Description("Define time Clamp On ULD delay (s)")]
public double Clamp_On_ULD_Delay { get; set; } = 0.1f;
Configs/Model/LogisticModel.cs
using Auto_Insert_Sim_Tray.Utils;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.SystemDefine;
namespace Auto_Insert_Sim_Tray.Configs.Model
public class LogisticModel
[DisplayName("Make metal duration")]
[Description("Make metal duration for dry run(ms)")]
public int MakeMetalDurationForDryrun { get; set; } = 5000;
[DisplayName("Use door sensor")]
[Description("Select true/false to use door sensor")]
public bool IsUseDoorSensor { get; set; } = true;
[DisplayName("Use area sensor")]
[Description("Select true/false to use area sensor")]
public bool IsUseAreaSensor { get; set; } = true;
[DisplayName("Use sensor check tray sim")]
[Description("Select true/false to use area sensor")]
public bool IsUseSensorCheckTraySim { get; set; } = true;
[DisplayName("X Ready Signal at CV In")]
[Description("True: NC Signal || False: NO Signal")]
public bool IsIF_XReady_CVIn_NC { get; set; } = true;
[DisplayName("Y Busy Signal at CV In")]
[Description("True: NC Signal || False: NO Signal")]
public bool IsIF_YBusy_CVIn_NC { get; set; } = true;
[DisplayName("X Busy Signal at CV Out")]
[Description("True: NC Signal || False: NO Signal")]
public bool IsIF_XBusy_CVOut_NC { get; set; } = true;
[DisplayName("Y Ready Signal at CV Out")]
[Description("True: NC Signal || False: NO Signal")]
public bool IsIF_YReady_CVOut_NC { get; set; } = true;
[DisplayName("Last machine")]
[Description("Select true/false to check last machine for same modules or line")]
public bool IsEndMachine { get; set; } = false;
[Description("Select true/false to use or not use Barcode")]
public bool UseBarcode { get; set; } = false;
[Description("Select true/false to use or not use Vision")]
public bool UseVision { get; set; } = false;
[Description("Select true/false to use or not use AGV")]
public bool UseAGV { get; set; } = false;
[Category("Logistics Time")]
[DisplayName("#1 Shift Start Time")]
[Description("Time to start #1 shift")]
public string lineStartTime1 { get; set; } = "08:00";
[Category("Logistics Time")]
[DisplayName("#1 Shift End Time")]
[Description("Time to end #1 shift")]
public string lineEndTime1 { get; set; } = "17:00";
[Category("Logistics Time")]
[DisplayName("#2 Shift Start Time")]
[Description("Time to start #2 shift")]
public string lineStartTime2 { get; set; } = "21:30";
[Category("Logistics Time")]
[DisplayName("#2 Shift End Time")]
[Description("Time to end #2 shift")]
public string lineEndTime2 { get; set; } = "06:30";
[Category("Logistics Time")]
[DisplayName("#1 Rest Start Time")]
[Description("Time to start #1 rest time")]
public string lineRestStartTime1 { get; set; } = "10:30";
[Category("Logistics Time")]
[DisplayName("#1 Rest End Time")]
[Description("Time to end #1 rest time")]
public string lineRestEndTime1 { get; set; } = "10:45";
[Category("Logistics Time")]
[DisplayName("#2 Rest Start Time")]
[Description("Time to start #2 rest time")]
public string lineRestStartTime2 { get; set; } = "15:00";
[Category("Logistics Time")]
[DisplayName("#2 Rest End Time")]
[Description("Time to end #2 rest time")]
public string lineRestEndTime2 { get; set; } = "15:15";
[Category("Logistics Time")]
[DisplayName("#3 Rest Start Time")]
[Description("Time to start #3 rest time")]
public string lineRestStartTime3 { get; set; } = "23:30";
[Category("Logistics Time")]
[DisplayName("#3 Rest End Time")]
[Description("Time to end #3 rest time")]
public string lineRestEndTime3 { get; set; } = "23:45";
[Category("Logistics Time")]
[DisplayName("#4 Rest Start Time")]
[Description("Time to start #3 rest time")]
public string lineRestStartTime4 { get; set; } = "03:30";
[Category("Logistics Time")]
[DisplayName("#4 Rest End Time")]
[Description("Time to end #4 rest time")]
public string lineRestEndTime4 { get; set; } = "03:45";
[Category("Logistics Time")]
[DisplayName("Initializing interval(ms)")]
[Description("Interval time for tact time or initializing system")]
public int tactTimeResetCheckInterval { get; set; } = 1000 * 15;
public string dataPwd { get; set; } = "0000";
public string originReturnPwd { get; set; } = "0001";
[Category("Block Condition")]
[DisplayName("Continue fail block count")]
[Description("Set continue fail block count (times)")]
public int nPackFailBlockCount { get; set; } = 0;
[Category("Block Condition")]
[DisplayName("Fail rate block percent")]
[Description("Set fail rate block percent (%)")]
public float nFailRateBlock { get; set; } = 100;
[Category("Block Condition")]
[DisplayName("Max retest count on current JIG")]
[Description("Set max retest count on current JIG (times)")]
public int nRetestPackCount { get; set; } = 0;
[Category("Jig Tester Operation")]
[DisplayName("Use retest tab on next JIG")]
[Description("Select true/false to use retest tab on next JIG")]
public bool IsUseRetestOnNextJig { get; set; } = true;
[Category("Jig Tester Operation")]
[DisplayName("Delay Rf cable insert after Pack insert")]
[Description("Define delay (ms)")]
public uint RfCableInsertDelay { get; set; } = 30000;
[Category("01 Line Name")]
[DisplayName("Line Name")]
[Description("Setup current line name")]
public string sLineName { get; set; } = "01";
[DisplayName("Model name")]
[Description("Current selected model name")]
public string modelName { get; set; } = "None";
[DisplayName("Model name sim tray left")]
[Description("Current selected model name sim tray left")]
public string modelSimTrayLeft { get; set; } = "None";
[DisplayName("Model name sim tray right")]
[Description("Current selected model name sim tray right")]
public string modelSimTrayRight { get; set; } = "None";
public MACHINE_TYPE modelType = MACHINE_TYPE.B;
public ProductInfoModel productInfo { get; set; } = new ProductInfoModel();
public TactTimeUtil TackTime = new TactTimeUtil();
Configs/Model/VisionConfig.cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Configs.Model
public class VisionConfig
[Category("Vision Left")]
[DisplayName("IP Address of Vision Left")]
[Description("IP Address of Vision Left")]
public string IPAddress_Vision_1 { get; set; } = "107.114.203.127";
[Category("Vision Left")]
[DisplayName("Port of Vision Left")]
[Description("Port of Vision Left")]
public int Port_Vision_1 { get; set; } = 5000;
[Category("Vision Left")]
[DisplayName("Use Vision Left")]
[Description("Select true/false to use or not use Vision Left")]
public bool UseVision_Left { get; set; } = true;
[Category("Vision Right")]
[DisplayName("IP Address of Vision Right")]
[Description("IP Address of Vision Right")]
public string IPAddress_Vision_2 { get; set; } = "107.114.203.127";
[Category("Vision Right")]
[DisplayName("Port of Vision Right")]
[Description("Port of Vision Right")]
public int Port_Vision_2 { get; set; } = 5050;
[Category("Vision Right")]
[DisplayName("Use Vision Right")]
[Description("Select true/false to use or not use Vision Right")]
public bool UseVision_Right { get; set; } = true;
[Category("Vision Setting")]
public int TimeOut { get; set; } = 3000;
[Category("Vision Setting")]
[DisplayName("Max Retry")]
[Description("Max Retry")]
public int MaxRetry { get; set; } = 3;
[Category("Vision Setting")]
[DisplayName("Read Command")]
[Description("Read Command")]
public string ReadCommand { get; set; } = "grab";
using Auto_Insert_Sim_Tray.Configs.Model;
using Auto_Insert_Sim_Tray.Define;
using Auto_Insert_Sim_Tray.Define.Position;
using Auto_Insert_Sim_Tray.HW.Common;
using Auto_Insert_Sim_Tray.Utils;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Runtime.Serialization.Json;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.AxisDefine;
using static Auto_Insert_Sim_Tray.Define.LogDefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
using static Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib.EZI_COMM_DEFINE;
namespace Auto_Insert_Sim_Tray.Configs
private static JsonHelper instance;
public static JsonHelper Instance
instance = new JsonHelper();
public LogisticModel logisticModel = new LogisticModel();
public Dictionary<AXIS_LIST, AxisParamData> axisParams = new Dictionary<AXIS_LIST, AxisParamData>()
{ AXIS_LIST.X_AXIS_LD_SET, new AxisParamData() },
{ AXIS_LIST.X_AXIS_ULD_SET, new AxisParamData() },
{ AXIS_LIST.X_AXIS_ROBOTXYZ, new AxisParamData() },
{ AXIS_LIST.Y_AXIS_ROBOTXYZ, new AxisParamData() },
{ AXIS_LIST.Z_AXIS_ROBOTXYZ, new AxisParamData() },
{ AXIS_LIST.X_AXIS_ULD_TRAY, new AxisParamData() },
{ AXIS_LIST.Z_AXIS_OUT_TRAY, new AxisParamData() },
{ AXIS_LIST.R_AXIS_RELOAD_SIM, new AxisParamData() },
public Dictionary<AxisPositionKey, Tuple<decimal, decimal>> axisPos = new Dictionary<AxisPositionKey, Tuple<decimal, decimal>>(new AxisPositionComparer());
public Dictionary<int, Tuple<string, string, string>> errorMsg = new Dictionary<int, Tuple<string, string, string>>();
public DelayTimeModel delayTime = new DelayTimeModel();
public TimeoutModel timeout = new TimeoutModel();
public ConfigMC configMC = new ConfigMC();
public List<string> modelList = new List<string>();
public Dictionary<string, string> models = new Dictionary<string, string>();
public ProductInfoModel productInfo = new ProductInfoModel();
public VisionConfig visionConfig = new VisionConfig();
public BarcodeConfig barcodeConfig = new BarcodeConfig();
public Dictionary<TOWERLAMP_MODE, TOWERLAMP_ELEMENT> towerLamp = new Dictionary<TOWERLAMP_MODE, TOWERLAMP_ELEMENT>()
{ TOWERLAMP_MODE.MANUAL, TOWERLAMP_ELEMENT.Y },
{ TOWERLAMP_MODE.AUTO, TOWERLAMP_ELEMENT.G },
{ TOWERLAMP_MODE.ERROR, TOWERLAMP_ELEMENT.R },
{ TOWERLAMP_MODE.OPP, TOWERLAMP_ELEMENT.Y },
{ TOWERLAMP_MODE.OP_CALL, TOWERLAMP_ELEMENT.Y },
{ TOWERLAMP_MODE.IDLE, TOWERLAMP_ELEMENT.Y },
public Dictionary<string, PatternsModel> patterns = new Dictionary<string, PatternsModel>();
public Dictionary<AXIS_LIST, Tuple<int, int>> dic_Limit_Speed = new Dictionary<AXIS_LIST, Tuple<int, int>>();
private string GetPath(CONFIG_TYPE type)
case CONFIG_TYPE.LOGISTIC:
path = ConfigDefine.logisticJson;
path = ConfigDefine.axisParamJson;
case CONFIG_TYPE.PRODUCT_INFO:
path = ConfigDefine.productInfoJson;
path = ConfigDefine.errorJson;
case CONFIG_TYPE.SERIAL_PORT:
path = ConfigDefine.serialJson;
case CONFIG_TYPE.DELAY_TIME:
path = ConfigDefine.delayTimeJson;
case CONFIG_TYPE.TIMEOUT:
path = ConfigDefine.timeoutJson;
case CONFIG_TYPE.MODEL_LIST:
path = ConfigDefine.modelListJson;
path = ConfigDefine.modelJson;
case CONFIG_TYPE.AXIS_POS:
path = ConfigDefine.axisPosDirectory + JsonHelper.Instance.logisticModel.modelName + "_AxisPos.json";
case CONFIG_TYPE.PATTERNS:
path = ConfigDefine.patternJson;
path = ConfigDefine.vision;
case CONFIG_TYPE.TOWER_LAMP:
path = ConfigDefine.towerLampJson;
case CONFIG_TYPE.CONFIG_MC:
path = ConfigDefine.config_MC;
private object GetSerialInstance(CONFIG_TYPE type)
case CONFIG_TYPE.LOGISTIC:
case CONFIG_TYPE.PRODUCT_INFO:
case CONFIG_TYPE.TOWER_LAMP:
case CONFIG_TYPE.SERIAL_PORT:
case CONFIG_TYPE.DELAY_TIME:
case CONFIG_TYPE.TIMEOUT:
case CONFIG_TYPE.MODEL_LIST:
case CONFIG_TYPE.AXIS_POS:
case CONFIG_TYPE.PATTERNS:
case CONFIG_TYPE.CONFIG_MC:
private Type GetType(CONFIG_TYPE type)
case CONFIG_TYPE.LOGISTIC:
ob = logisticModel.GetType();
ob = axisParams.GetType();
case CONFIG_TYPE.AXIS_POS:
case CONFIG_TYPE.PRODUCT_INFO:
ob = productInfo.GetType();
case CONFIG_TYPE.TOWER_LAMP:
ob = towerLamp.GetType();
case CONFIG_TYPE.SERIAL_PORT:
ob = barcodeConfig.GetType();
case CONFIG_TYPE.TIMEOUT:
case CONFIG_TYPE.MODEL_LIST:
ob = modelList.GetType();
case CONFIG_TYPE.DELAY_TIME:
ob = delayTime.GetType();
case CONFIG_TYPE.PATTERNS:
ob = visionConfig.GetType();
case CONFIG_TYPE.CONFIG_MC:
public void Deserialize(CONFIG_TYPE type, string strJson)
DataContractJsonSerializer serializer = new DataContractJsonSerializer(GetType(type));
case CONFIG_TYPE.LOGISTIC:
logisticModel = JsonConvert.DeserializeObject<LogisticModel>(strJson);
axisParams = JsonConvert.DeserializeObject<Dictionary<AXIS_LIST, AxisParamData>>(strJson);
case CONFIG_TYPE.PRODUCT_INFO:
productInfo = JsonConvert.DeserializeObject<ProductInfoModel>(strJson);
case CONFIG_TYPE.TOWER_LAMP:
towerLamp = JsonConvert.DeserializeObject<Dictionary<TOWERLAMP_MODE, TOWERLAMP_ELEMENT>>(strJson);
errorMsg = JsonConvert.DeserializeObject<Dictionary<int, Tuple<string, string, string>>>(strJson);
case CONFIG_TYPE.SERIAL_PORT:
barcodeConfig = JsonConvert.DeserializeObject<BarcodeConfig>(strJson);
if (barcodeConfig.scanner is null)
barcodeConfig.scanner = new HW.BarcodeReader.BarcodeReaderConfig()
case CONFIG_TYPE.DELAY_TIME:
delayTime = JsonConvert.DeserializeObject<DelayTimeModel>(strJson);
case CONFIG_TYPE.TIMEOUT:
timeout = JsonConvert.DeserializeObject<TimeoutModel>(strJson);
case CONFIG_TYPE.MODEL_LIST:
modelList = JsonConvert.DeserializeObject<List<string>>(strJson);
models = JsonConvert.DeserializeObject<Dictionary<string, string>>(strJson);
case CONFIG_TYPE.AXIS_POS:
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
Dictionary<AxisPositionKey, Tuple<decimal, decimal>> temp = (Dictionary<AxisPositionKey, Tuple<decimal, decimal>>)serializer.ReadObject(ms);
for (int i = 0; i < temp.Count(); i++)
if (axisPos.Keys.Contains(temp.ElementAt(i).Key))
axisPos[temp.ElementAt(i).Key] = temp.ElementAt(i).Value;
axisPos.Add(temp.ElementAt(i).Key, temp.ElementAt(i).Value);
case CONFIG_TYPE.PATTERNS:
patterns = JsonConvert.DeserializeObject<Dictionary<string, PatternsModel>>(strJson);
visionConfig = JsonConvert.DeserializeObject<VisionConfig>(strJson);
case CONFIG_TYPE.CONFIG_MC:
configMC = JsonConvert.DeserializeObject<ConfigMC>(strJson);
public void SaveSettings(CONFIG_TYPE type)
string path = GetPath(type);
if (type == CONFIG_TYPE.AXIS_POS)
string msg = "Config path not found : " + type.ToString();
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, msg, CONTENT_TYPE.WARNING);
Directory.CreateDirectory(ConfigDefine.axisPosDirectory);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(GetType(type));
using (MemoryStream ms = new MemoryStream())
serializer.WriteObject(ms, GetSerialInstance(type));
string strJson = Encoding.Default.GetString(ms.ToArray());
string strJson_Idt = JToken.Parse(strJson).ToString(Formatting.Indented);
File.WriteAllText(path, strJson_Idt, Encoding.UTF8);
string msg = "Config path not found : " + type.ToString();
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, msg, CONTENT_TYPE.WARNING);
Directory.CreateDirectory(ConfigDefine.configRootPath);
string strJson = JsonConvert.SerializeObject(GetSerialInstance(type));
string strJson_Idt = JToken.Parse(strJson).ToString(Formatting.Indented);
File.WriteAllText(path, strJson_Idt, Encoding.UTF8);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, ex.ToString(), CONTENT_TYPE.EXCEPTION);
public void LoadSettings(CONFIG_TYPE type)
string path = GetPath(type);
if (File.Exists(path) == true)
string strJson = File.ReadAllText(path, Encoding.UTF8);
Deserialize(type, strJson);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, ex.ToString(), CONTENT_TYPE.EXCEPTION);
string msg = "File not found : " + type.ToString();
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, msg, CONTENT_TYPE.WARNING);
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Auto_Insert_Sim_Tray.Define
public static class AxisDefine
public const decimal ACCEPTABLE_DISTANCE = 0.1m;
public const int AXIS_MOVE_DELAY = 100;
public enum X_LD_POSITION
public enum X_ULD_POSITION
public enum XYZ_ROBOT_POSITION
public enum X_ULD_TRAY_POSITION
public enum Z_TF_OUTTRAY_POSITION
public enum LASER_POSITION
using Auto_Insert_Sim_Tray.Configs;
using Auto_Insert_Sim_Tray.Configs.Model;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Define
public class ConfigDefine
public static string configRootPath = SystemDefine.rootPath + @"Json\";
public static string axisPosDirectory = configRootPath + @"AxisPosition\";
public static string logisticJson = configRootPath + @"Logistic.Json";
public static string positionJson = configRootPath + @"Position.Json";
public static string errorJson = configRootPath + @"ErrorCode.Json";
public static string serialJson = configRootPath + @"SerialPort.Json";
public static string productInfoJson = configRootPath + @"ProductInfo.Json";
public static string axisParamJson = configRootPath + @"AxisParam.Json";
public static string delayTimeJson = configRootPath + @"DelayTime.Json";
public static string timeoutJson = configRootPath + @"Timeout.Json";
public static string modelListJson = configRootPath + @"ModelList.Json";
public static string modelJson = configRootPath + @"Model.Json";
public static string axisPosJson = axisPosDirectory + JsonHelper.Instance.logisticModel.modelName + "_AxisPos.json";
public static string metalLogisticsInfo = configRootPath + @"MetalLogisticsInfo.Json";
public static string patternJson = configRootPath + @"Patterns.Json";
public static string towerLampJson = configRootPath + @"Tower Lamp.Json";
public static string config_MC = configRootPath + @"Config MC.Json";
public static string vision = configRootPath + @"Vision.Json";
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Define
public enum CONVEYOR_LIST
public class ConveyorData
public object middleSensor;
public ConveyorData(object runCW, object runCCW, object inSensor, object middleSensor, object outSensor)
this.inSensor = inSensor;
this.middleSensor = middleSensor;
this.outSensor = outSensor;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Define
public static class IODefine
_10_SS_ULD_ROTATE_MIDDLE,
_10_SS_JIG_LEFT_ALIGN_HOR_OFF,
_10_SS_JIG_LEFT_ALIGN_HOR_ON,
_10_SS_JIG_LEFT_ALIGN_VER_OFF,
_10_SS_JIG_LEFT_ALIGN_VER_ON,
_10_SS_JIG_LEFT_DETECT_SET,
_11_SS_INTRAY_LEFT_HOLD_OFF,
_11_SS_INTRAY_LEFT_HOLD_ON,
_11_SS_INTRAY_LEFT_SEPERATE_OFF,
_11_SS_INTRAY_LEFT_SEPERATE_ON,
_11_SS_INTRAY_LEFT_ELEVATOR_1_BW,
_11_SS_INTRAY_LEFT_ELEVATOR_1_FW,
_11_SS_INTRAY_LEFT_ELEVATOR_2_BW,
_11_SS_INTRAY_LEFT_ELEVATOR_2_FW,
_11_SS_INTRAY_LEFT_STOPPER_1_DOWN,
_11_SS_INTRAY_LEFT_STOPPER_1_UP,
_11_SS_INTRAY_LEFT_STOPPER_2_DOWN,
_11_SS_INTRAY_LEFT_STOPPER_2_UP,
_11_SS_INTRAY_LEFT_REMOVE_DOWN,
_11_SS_INTRAY_LEFT_REMOVE_UP,
_11_SS_INTRAY_LEFT_REMOVE_BW,
_11_SS_INTRAY_LEFT_REMOVE_FW,
_11_SS_INTRAY_LEFT_ALIGN_OFF,
_11_SS_INTRAY_LEFT_ALIGN_ON,
_11_SS_INTRAY_LEFT_ALIGN_TOP_ON,
_11_SS_INTRAY_LEFT_DETECT_1,
_11_SS_INTRAY_LEFT_DETECT_2,
_11_SS_INTRAY_LEFT_DETECT_3,
_11_SS_INTRAY_LEFT_DETECT_4,
_11_SS_JIG_RIGHT_POS_OUT,
_11_SS_JIG_RIGHT_ALIGN_HOR_OFF,
_11_SS_JIG_RIGHT_ALIGN_HOR_ON,
_11_SS_JIG_RIGHT_ALIGN_VER_OFF,
_11_SS_JIG_RIGHT_ALIGN_VER_ON,
_11_SS_JIG_RIGHT_DETECT_SET,
_12_SS_INTRAY_RIGHT_HOLD_OFF,
_12_SS_INTRAY_RIGHT_HOLD_ON,
_12_SS_INTRAY_RIGHT_SEPERATE_OFF,
_12_SS_INTRAY_RIGHT_SEPERATE_ON,
_12_SS_INTRAY_RIGHT_ELEVATOR_1_BW,
_12_SS_INTRAY_RIGHT_ELEVATOR_1_FW,
_12_SS_INTRAY_RIGHT_ELEVATOR_2_BW,
_12_SS_INTRAY_RIGHT_ELEVATOR_2_FW,
_12_SS_INTRAY_RIGHT_STOPPER_1_DOWN,
_12_SS_INTRAY_RIGHT_STOPPER_1_UP,
_12_SS_INTRAY_RIGHT_STOPPER_2_DOWN,
_12_SS_INTRAY_RIGHT_STOPPER_2_UP,
_12_SS_INTRAY_RIGHT_REMOVE_DOWN,
_12_SS_INTRAY_RIGHT_REMOVE_UP,
_12_SS_INTRAY_RIGHT_REMOVE_BW,
_12_SS_INTRAY_RIGHT_REMOVE_FW,
_12_SS_INTRAY_RIGHT_ALIGN_OFF,
_12_SS_INTRAY_RIGHT_ALIGN_ON,
_12_SS_INTRAY_RIGHT_ALIGN_TOP_ON,
_12_SS_INTRAY_RIGHT_DETECT_1,
_12_SS_INTRAY_RIGHT_DETECT_2,
_12_SS_INTRAY_RIGHT_DETECT_3,
_12_SS_INTRAY_RIGHT_DETECT_4,
_12_SS_NG_SHUTTER_DETECT_1,
_12_SS_NG_SHUTTER_DETECT_2,
_12_SS_NG_SHUTTER_DETECT_3,
_12_SS_NG_SHUTTER_DETECT_4,
_13_SS_TRAY_SIM_ROTATE_OFF,
_13_SS_TRAY_SIM_ROTATE_ON,
_13_SS_TRAY_SIM_TURN_OFF,
_13_SS_TRAY_SIM_GRIP_OFF,
_13_SS_TRAY_SIM_PUSH_FRONT_UP,
_13_SS_TRAY_SIM_PUSH_FRONT_DOWN,
_13_SS_TRAY_SIM_PUSH_REAR_UP,
_13_SS_TRAY_SIM_PUSH_REAR_DOWN,
_13_SS_TRAY_SIM_GRIP_CHECK,
_13_SS_UNLOAD_TRAY_CLAMP_OFF,
_13_SS_UNLOAD_TRAY_CLAMP_ON,
_13_SS_OUTTRAY_LIFT_DETECT,
_13_SS_OUTTRAY_TRANSFER_FRONT_BW,
_13_SS_OUTTRAY_TRANSFER_FRONT_FW,
_13_SS_OUTTRAY_TRANSFER_REAR_BW,
_13_SS_OUTTRAY_TRANSFER_REAR_FW,
_13_SS_OUTTRAY_REMOVE_BW,
_13_SS_OUTTRAY_REMOVE_FW,
_13_SS_OUTTRAY_PUSH_DOWN,
_13_SS_OUTTRAY_TRANSFER_FRONT_DETECT,
_13_SS_OUTTRAY_TRANSFER_REAR_DETECT,
_13_SS_OUTTRAY_LEFT_DETECT_1,
_13_SS_OUTTRAY_LEFT_DETECT_2,
_13_SS_OUTTRAY_RIGHT_DETECT_1,
_13_SS_OUTTRAY_RIGHT_DETECT_2,
_13_SS_TRAY_SIM_CHECK_NG,
_14_SS_OUTTRAY_STOPPER_TRANSFER_UP,
_14_SS_OUTTRAY_STOPPER_TRANSFER_DOWN,
_14_SS_OUTTRAY_LEFT_STOPPER_1_UP,
_14_SS_OUTTRAY_LEFT_STOPPER_1_DOWN,
_14_SS_OUTTRAY_LEFT_STOPPER_2_UP,
_14_SS_OUTTRAY_LEFT_STOPPER_2_DOWN,
_14_SS_OUTTRAY_RIGHT_STOPPER_1_UP,
_14_SS_OUTTRAY_RIGHT_STOPPER_1_DOWN,
_14_SS_OUTTRAY_RIGHT_STOPPER_2_UP,
_14_SS_OUTTRAY_RIGHT_STOPPER_2_DOWN,
_14_SS_JIG_LEFT_ALIGN_SIM_ON,
_14_SS_JIG_LEFT_ALIGN_SIM_OFF,
_14_SS_JIG_RIGHT_ALIGN_SIM_ON,
_14_SS_JIG_RIGHT_ALIGN_SIM_OFF,
_14_SS_RELOAD_SIM_SAFETY,
_14_SS_SAFETY_ZONE_INPUT,
_14_SS_SAFETY_ZONE_OUTPUT,
_10_SOL_LD_CLAMP_UP_DOWN,
_10_SOL_ULD_ROTATE_FRONT,
_10_SOL_ULD_CLAMP_UP_DOWN,
_10_SOL_JIG_LEFT_POS_OUT,
_10_SOL_JIG_LEFT_ALIGN_HOR,
_10_SOL_JIG_LEFT_ALIGN_VER,
_10_SOL_JIG_LEFT_ALIGN_SIM,
_11_SOL_INTRAY_LEFT_HOLD_OFF,
_11_SOL_INTRAY_LEFT_HOLD_ON,
_11_SOL_INTRAY_LEFT_SEPERATE_OFF,
_11_SOL_INTRAY_LEFT_SEPERATE_ON,
_11_SOL_INTRAY_LEFT_ELEVATOR_1_BW,
_11_SOL_INTRAY_LEFT_ELEVATOR_1_FW,
_11_SOL_INTRAY_LEFT_ELEVATOR_2_BW,
_11_SOL_INTRAY_LEFT_ELEVATOR_2_FW,
_11_SOL_INTRAY_LEFT_STOPPER_1_DOWN,
_11_SOL_INTRAY_LEFT_STOPPER_2_DOWN,
_11_SOL_INTRAY_LEFT_REMOVE_DOWN,
_11_SOL_INTRAY_LEFT_REMOVE_UP,
_11_SOL_INTRAY_LEFT_REMOVE_BW,
_11_SOL_INTRAY_LEFT_REMOVE_FW,
_11_SOL_INTRAY_LEFT_ALIGN_OFF,
_11_SOL_INTRAY_LEFT_ALIGN_TOP_OFF,
_11_SOL_INTRAY_RIGHT_HOLD_OFF,
_11_SOL_INTRAY_RIGHT_HOLD_ON,
_11_SOL_INTRAY_RIGHT_SEPERATE_OFF,
_11_SOL_INTRAY_RIGHT_SEPERATE_ON,
_11_SOL_INTRAY_RIGHT_ELEVATOR_1_BW,
_11_SOL_INTRAY_RIGHT_ELEVATOR_1_FW,
_11_SOL_INTRAY_RIGHT_ELEVATOR_2_BW,
_11_SOL_INTRAY_RIGHT_ELEVATOR_2_FW,
_11_SOL_INTRAY_RIGHT_STOPPER_1_DOWN,
_11_SOL_INTRAY_RIGHT_STOPPER_2_DOWN,
_11_SOL_INTRAY_RIGHT_REMOVE_DOWN,
_11_SOL_INTRAY_RIGHT_REMOVE_UP,
_11_SOL_INTRAY_RIGHT_REMOVE_BW,
_11_SOL_INTRAY_RIGHT_REMOVE_FW,
_11_SOL_INTRAY_RIGHT_ALIGN_OFF,
_11_SOL_INTRAY_RIGHT_ALIGN_TOP_OFF,
_12_SOL_TRAY_SIM_ROTATE_OFF,
_12_SOL_TRAY_SIM_ROTATE_ON,
_12_SOL_TRAY_SIM_PUSH_FRONT,
_12_SOL_TRAY_SIM_PUSH_REAR,
_12_SOL_OUTTRAY_TRANSFER_FRONT_BW,
_12_SOL_OUTTRAY_TRANSFER_FRONT_FW,
_12_SOL_OUTTRAY_TRANSFER_REAR_BW,
_12_SOL_OUTTRAY_TRANSFER_REAR_FW,
_12_SOL_OUTTRAY_REMOVE_BW,
_12_SOL_OUTTRAY_REMOVE_FW,
_12_SOL_OUTTRAY_PUSH_DOWN,
_12_SOL_OUTTRAY_STOPPER_TRANSFER_DOWN,
_12_SOL_OUTTRAY_STOPPER_LEFT_DOWN_1,
_12_SOL_OUTTRAY_STOPPER_LEFT_DOWN_2,
_12_SOL_OUTTRAY_STOPPER_RIGHT_DOWN_1,
_12_SOL_OUTTRAY_STOPPER_RIGHT_DOWN_2,
_12_SOL_UNLOAD_TRAY_DOWN,
_12_SOL_UNLOAD_TRAY_CLAMP_OFF,
_12_SOL_UNLOAD_TRAY_CLAMP_ON,
_12_SOL_JIG_RIGHT_POS_OUT,
_12_SOL_JIG_RIGHT_POS_IN,
_12_SOL_JIG_RIGHT_ALIGN_HOR,
_12_SOL_JIG_RIGHT_ALIGN_VER,
_12_SOL_JIG_RIGHT_ALIGN_SIM,
_13_SOL_NG_SHUTTER_DOWN_1,
_13_SOL_NG_SHUTTER_DOWN_2,
_13_SOL_NG_SHUTTER_DOWN_3,
_13_CV_INTRAY_LEFT_INPUT_1,
_13_CV_INTRAY_LEFT_INPUT_2,
_13_CV_INTRAY_RIGHT_WORK,
_13_CV_INTRAY_RIGHT_INPUT_1,
_13_CV_INTRAY_RIGHT_INPUT_2,
_13_CV_OUTTRAY_LEFT_OUTPUT_1,
_13_CV_OUTTRAY_LEFT_OUTPUT_2,
_13_CV_OUTTRAY_RIGHT_OUTPUT_1,
_13_CV_OUTTRAY_RIGHT_OUTPUT_2,
using Auto_Insert_Sim_Tray.Configs;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Define
public static class SystemDefine
public static string systemEquipmentName = "INSERT SIM TRAY";
public static string rootPath = @"C:\FA\" + systemEquipmentName + @"\";
public static string modelTag = "Model : ";
public static string pgmVersion = "20252301.03";
public static string groupName = "Automation Group";
public const bool TEST_NONE_HW = false;
public const int UI_TIMER_INTERVAL = 1000;
public const int MAX_DISPLAY_LOGLINE = 20;
public const int MAX_QUEUE_TO_CALCULATION_TACKTIME = 100;
public static System.Drawing.Size monitorDesign = new System.Drawing.Size(1280, 768);
public const int DELAY_TIME_SYSTEM_HW_MANAGER_THREAD_RUN = 20;
public const int DELAY_TIME_DEFAULT_PROC_THREAD_RUN = 20;
public const int DELAY_TIME_FOR_DRYRUN_THREAD_RUN = 200;
public const bool IsRunWithMachine = true;
public static bool IsLoadingFinish = false;
public static bool IsRun_No_PC_Test = false;
#region system error code
public const int ERROR_NOT_ALLOCATE = 0;
public const int ERRCODE_NO_ERROR = -1000;
public const int ERRCODE_STOP_YELLOW = 39578;
public const int ERRCODE_EMO_PRESS = ((int)SystemEnum.ECODE.EMERGENCY_STOP);
public const int ERRCODE_LIGHT_CURTAIN_ABOVE = ((int)SystemEnum.ECODE.LIGHT_CURTAIN_ABOVE);
public const int ERRCODE_LIGHT_CURTAIN_BELOW = ((int)SystemEnum.ECODE.LIGHT_CURTAIN_BELOW);
public const int ERRCODE_DOOR_OPEN = ((int)SystemEnum.ECODE.DOOR_OPEN);
public const int ERRCODE_ETHERCAT_MASTER_NOT_FOUND = 30000;
public const int ERRCODE_ETHERCAT_INIT_FAIL = 30001;
public static int BUZZER_TIMEOUT = (int)(JsonHelper.Instance.delayTime.OnBuzzerTime * 1000);
public const int CHECK_IDLE_TIME = 60000;
public const int CHECK_OOS_TIME = 15000;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Define
public static class SystemEnum
public enum MAINFORM_EVENT
public enum LIST_ETHERNET
public enum REQUEST_ACTION
public enum COMPARE_RESULT
SERVO_MOVING_INTERPOLATION_ERROR,
INITIALIZE_MODE_RUN_TIMEOUT,
SENSOR_SAFETY_RELOAD_SIM_TRAY,
TF_TRAYOUT_AXIS_Z_ERRROR,
LD_SET_SOL_UP_DOWN_ERROR = 2000,
LD_SET_X_AXIS_MOVE_TIMEOUT,
LD_SET_SOL_GRIP_UP_DOWN_ERROR,
ULD_SET_SOL_UP_DOWN_ERROR = 3000,
ULD_SET_SOL_ROTATE_ERROR,
ULD_SET_X_AXIS_MOVE_TIMEOUT,
ULD_SET_X_AXIS_DANGEROUS,
ULD_SET_SOL_GRIP_UP_DOWN_ERROR,
JIG_LEFT_SOL_IN_OUT_ERROR = 4000,
JIG_LEFT_SOL_ALIGN_HORIZONTAL_ERROR,
JIG_LEFT_SOL_ALIGN_VERTICAL_ERROR,
JIG_LEFT_SOL_ALIGN_SIM_ERROR,
JIG_LEFT_DANGEROUS_TO_MOVE,
JIG_RIGHT_SOL_IN_OUT_ERROR = 5000,
JIG_RIGHT_SOL_FLIP_ERROR,
JIG_RIGHT_SOL_ALIGN_HORIZONTAL_ERROR,
JIG_RIGHT_SOL_ALIGN_VERTICAL_ERROR,
JIG_RIGHT_SOL_ALIGN_SIM_ERROR,
JIG_RIGHT_DANGEROUS_TO_MOVE,
INTRAY_LEFT_SOL_HOLD_ERROR = 6000,
INTRAY_LEFT_SOL_SEPERATE_ERROR,
INTRAY_LEFT_SOL_ELEVATOR_1_ERROR,
INTRAY_LEFT_SOL_ELEVATOR_2_ERROR,
INTRAY_LEFT_SOL_STOPPER_1_ERROR,
INTRAY_LEFT_SOL_STOPPER_2_ERROR,
INTRAY_LEFT_SOL_REMOVE_UP_DOWN_ERROR,
INTRAY_LEFT_SOL_REMOVE_BW_FW_ERROR,
INTRAY_LEFT_SOL_ALIGN_ERROR,
INTRAY_LEFT_SOL_ALIGN_TOP_ERROR,
INTRAY_RIGHT_SOL_HOLD_ERROR = 7000,
INTRAY_RIGHT_SOL_SEPERATE_ERROR,
INTRAY_RIGHT_SOL_ELEVATOR_1_ERROR,
INTRAY_RIGHT_SOL_ELEVATOR_2_ERROR,
INTRAY_RIGHT_SOL_STOPPER_1_ERROR,
INTRAY_RIGHT_SOL_STOPPER_2_ERROR,
INTRAY_RIGHT_SOL_REMOVE_UP_DOWN_ERROR,
INTRAY_RIGHT_SOL_REMOVE_BW_FW_ERROR,
INTRAY_RIGHT_SOL_ALIGN_ERROR,
INTRAY_RIGHT_SOL_ALIGN_TOP_ERROR,
ROBOTXYZ_SOL_ROTATE_ERROR = 8000,
ROBOTXYZ_SOL_PUSH_FRONT_ERROR,
ROBOTXYZ_SOL_PUSH_REAR_ERROR,
ROBOTXYZ_SOL_CHECK_NG_ERROR,
ROBOTXYZ_SOL_CHECK_GRIP_ERROR,
ROBOTXYZ_X_AXIS_MOVE_TIMEOUT,
ROBOTXYZ_Y_AXIS_MOVE_TIMEOUT,
ROBOTXYZ_Z_AXIS_MOVE_TIMEOUT,
INSERT_TRAY_SIM_FAIL_JIG_LEFT,
INSERT_TRAY_SIM_FAIL_JIG_RIGHT,
ROBOTXYZ_GRIP_TRAY_SIM_FAIL,
OUT_TRAY_SOL_TRANSFER_FRONT_ERROR = 9000,
OUT_TRAY_SOL_TRANSFER_REAR_ERROR,
OUT_TRAY_SOL_REMOVE_ERROR,
OUT_TRAY_SOL_TRANSFER_STOPPER_ERROR,
OUT_TRAY_SOL_LEFT_STOPPER_1_ERROR,
OUT_TRAY_SOL_LEFT_STOPPER_2_ERROR,
OUT_TRAY_SOL_RIGHT_STOPPER_1_ERROR,
OUT_TRAY_SOL_RIGHT_STOPPER_2_ERROR,
OUT_TRAY_Z_AXIS_MOVE_TIMEOUT,
#region ULD TRAY + NG SHUTTLE + RELOAD
NG_SHUTTLE_SOL_FW_BW_ERROR = 10000,
UNLOAD_TRAY_SOL_UP_DOWN_ERROR,
UNLOAD_TRAY_SOL_GRIP_ERROR,
UNLOAD_TRAY_X_AXIS_MOVE_TIMEOUT,
public enum Auto_In_CV_Step
public enum Auto_Out_CV_Step
public enum ORG_Input_CV_Left
public enum Initial_Input_CV_Left
public enum Auto_Input_CV_Left
public enum ORG_Input_CV_Right
public enum Initial_Input_CV_Right
public enum Auto_Input_CV_Right
public enum ORG_Outtray_CV_Left
public enum Initial_Outtray_CV_Left
public enum Auto_Outtray_CV_Left
public enum ORG_Outtray_CV_Right
public enum Initial_Outtray_CV_Right
public enum Auto_Outtray_CV_Right
public enum ORG_TF_LD_SET
public enum Initial_TF_LD_SET
public enum Auto_TF_LD_SET
_3_2_MoveX_Jig_Left_And_Rotate,
_3_3_MoveX_Jig_Right_And_Rotate,
_3_7_MoveX_Wait_And_Rotate,
public enum Semi_TF_LD_SET
public enum ORG_TF_ULD_SET
public enum Initial_TF_ULD_SET
public enum Auto_TF_ULD_SET
_2_2_MoveX_Jig_Left_And_Rotate,
_2_3_MoveX_Jig_Right_And_Rotate,
_2_7_MoveX_Wait_And_Rotate,
public enum Semi_TF_ULD_SET
public enum Initial_Jig_Left
public enum Auto_Jig_Left
_2_8_Sol_Unalign_Hor_Ver,
_3_5_Sol_Unalign_Hor_Ver,
public enum ORG_Jig_Right
public enum Initial_Jig_Right
public enum Auto_Jig_Right
_2_8_Sol_Unalign_Hor_Ver,
_3_5_Sol_Unalign_Hor_Ver,
public enum Initial_Intray_Left
public enum Auto_Intray_Left
_1_3_Transfer_Tray_To_Work,
_1_4_Transfer_Tray_To_Align,
_2_Transfer_Tray_To_Work,
_3_Transfer_Tray_To_Align,
public enum Initial_Intray_Right
public enum Auto_Intray_Right
_1_3_Transfer_Tray_To_Work,
_1_4_Transfer_Tray_To_Align,
_2_Transfer_Tray_To_Work,
_3_Transfer_Tray_To_Align,
public enum Initial_ULD_Tray
public enum Auto_ULD_Tray
public enum Semi_ULD_Tray
public enum ORG_TF_OutTray
public enum Initial_TF_OutTray
public enum Auto_TF_OutTray
_2_2_Sol_Transfer_Fornt_BW,
_2_7_Sol_Transfer_Front_FW,
_3_2_Sol_Transfer_Rear_FW,
_3_3_Sol_Transfer_Rear_BW,
public enum Semi_TF_OutTray
public enum Initial_NG_Shuttle
public enum Auto_NG_Shuttle
public enum Initial_RobotXYZ
public enum Auto_RobotXYZ
_1_2_Check_Pick_Sim_Tray,
_1_4_Check_Insert_Sim_Tray,
_2_3_Sol_Rotate_Off_and_Turn_On,
_3_6_Sol_Push_Up_Rear_and_Grip_Off,
_3_6_1_Sol_Push_Up_Rear_NG,
_3_8_Sol_Push_Down_Front,
_3_10_MoveZ_Jig_Insert_Up,
_4_2_Move_Wait_Check_Vision_Left,
_4_4_Move_Wait_Check_Vision_Right,
public enum Semi_RobotXYZ
HW/BarcodeReader/BarcodeReader.cs
using Auto_Insert_Sim_Tray.Communication;
using Auto_Insert_Sim_Tray.Configs;
using Auto_Insert_Sim_Tray.Configs.Model;
using Auto_Insert_Sim_Tray.Utils;
using HControlCSharp.Utils;
using System.Diagnostics;
using System.Windows.Forms;
namespace Auto_Insert_Sim_Tray.HW.BarcodeReader
public class BarcodeReader : Serial
private uint _dataLength = 10;
private bool _isScanning = false;
private string _strReceive = String.Empty;
private bool _isReadFail = false;
private string _readCommand = String.Empty;
private uint _curRetry = 0;
private string _newLine = "\r\n";
public BarcodeReaderConfig BarcodeReaderConfig;
private readonly object _lockObject = new object();
private bool _isConnected { get; set; }
public uint DataLength { get => _dataLength; private set => _dataLength = value; }
public bool IsScanning { get => _isScanning; private set => _isScanning = value; }
public string DataReceive
private set => _strReceive = value;
public bool IsReadFail { get => _isReadFail; private set => _isReadFail = value; }
public uint RetryRead => BarcodeReaderConfig.RetryRead;
public uint TimeoutRead => (uint)BarcodeReaderConfig.serialPortModel.ReadTimeout;
public string ReadCommand { get => _readCommand; set => _readCommand = value; }
public bool IsConnected => _isConnected;
public BarcodeReader(BarcodeReaderConfig config) : base(config.serialPortModel)
BarcodeReaderConfig = config;
if (!ValidationDataConfi(BarcodeReaderConfig))
DataLength = BarcodeReaderConfig.DataLength;
ReadCommand = BarcodeReaderConfig.ReadCommand;
SerialReceivedHandler = new EventHandler<SerialDataEventArgs>(Serial_DataRecieved);
SerialDataRecieved += SerialReceivedHandler;
private bool ValidationDataConfi(BarcodeReaderConfig config)
if (config.serialPortModel is null)
if (config.DataLength <= 0)
if (config.RetryRead <= 0)
if (String.IsNullOrWhiteSpace(config.ReadCommand))
private bool ValidationDataReceive(string data)
if (String.IsNullOrWhiteSpace(data))
if (!data.EndsWith("\n")) return false;
data = data.Substring(0, data.IndexOf("\n"));
if (data.Length != DataLength) return false;
private void Serial_DataRecieved(object sender, SerialDataEventArgs e)
DataReceive += Encoding.ASCII.GetString(e._data);
base.DataUpdate(this, e);
_isConnected = base.Open();
_isConnected = !base.Close();
if (MessageBox.Show("Scanner Barcode not connect ", "Scanner", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
if (MessageBox.Show("Scanner Barcode not connect ", "Scanner", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
Thread th = new Thread(() =>
Stopwatch watch = Stopwatch.StartNew();
&& watch.ElapsedMilliseconds < TimeoutRead)
check = ValidationDataReceive(DataReceive);
if (_curRetry < RetryRead && !check)
if (!check) IsReadFail = true;
public new void Dispose()
SerialDataRecieved -= SerialReceivedHandler;
SerialReceivedHandler = null;
public class BarcodeReaderConfig
public uint DataLength { set; get; } = 10;
public string ReadCommand { get; set; } = "T";
public uint RetryRead { get; set; } = 3;
public string NewLine { get; set; } = "\r\n";
public SerialPortModel serialPortModel = new SerialPortModel();
public enum Baurate : int
using Auto_Insert_Sim_Tray.Define;
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Manager;
using Auto_Insert_Sim_Tray.Utils;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.LogDefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
using Timer = System.Timers.Timer;
namespace Auto_Insert_Sim_Tray.HW.Common
public enum TOWERLAMP_MODE
public enum TOWERLAMP_ELEMENT
public class TowerLampData
public object outG { get; set; }
public object outY { get; set; }
public object outR { get; set; }
public object outBuzzer { get; set; }
public TowerLampData(object green, object yellow, object red, object buzzer)
private TowerLampData towerData;
public Timer elapsedTimer;
public TowerLamp(IIO io, TowerLampData data)
InitializeVariable(io, data);
private void InitializeVariable(IIO io, TowerLampData data)
elapsedTimer = new Timer();
elapsedTimer.Interval = SystemDefine.BUZZER_TIMEOUT;
elapsedTimer.AutoReset = false;
elapsedTimer.Elapsed += ElapsedTimer_Elapsed;
public void SetTowerLampColor(TOWERLAMP_ELEMENT element)
if (towerData?.outG == null || towerData?.outR == null || towerData?.outY == null)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Please check tower lamp IO assign", CONTENT_TYPE.ERROR);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Please assign IO interface", CONTENT_TYPE.ERROR);
case TOWERLAMP_ELEMENT.G:
case TOWERLAMP_ELEMENT.G_B:
iIO.Off(towerData?.outR);
iIO.Off(towerData?.outY);
case TOWERLAMP_ELEMENT.R:
case TOWERLAMP_ELEMENT.R_B:
iIO.Off(towerData?.outG);
iIO.Off(towerData?.outY);
case TOWERLAMP_ELEMENT.Y:
case TOWERLAMP_ELEMENT.Y_B:
iIO.Off(towerData?.outG);
iIO.Off(towerData?.outR);
case TOWERLAMP_ELEMENT.G_Y:
case TOWERLAMP_ELEMENT.G_Y_B:
iIO.Off(towerData?.outR);
case TOWERLAMP_ELEMENT.G_R:
case TOWERLAMP_ELEMENT.G_R_B:
iIO.Off(towerData?.outY);
case TOWERLAMP_ELEMENT.R_Y:
case TOWERLAMP_ELEMENT.R_Y_B:
iIO.Off(towerData?.outG);
case TOWERLAMP_ELEMENT.NONE:
case TOWERLAMP_ELEMENT.NONE_B:
iIO.Off(towerData?.outG);
iIO.Off(towerData?.outR);
iIO.Off(towerData?.outY);
case TOWERLAMP_ELEMENT.G_R_Y:
case TOWERLAMP_ELEMENT.G_R_Y_B:
private void ElapsedTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
public void BuzzerControl()
if (towerData?.outBuzzer != null)
iIO.On(towerData?.outBuzzer);
elapsedTimer.Interval = SystemDefine.BUZZER_TIMEOUT;
public void BuzzerControl(TOWERLAMP_ELEMENT element)
if (towerData?.outBuzzer != null)
if (element <= TOWERLAMP_ELEMENT.R_Y)
iIO.Off(towerData?.outBuzzer);
else if (element > TOWERLAMP_ELEMENT.R_Y)
iIO.On(towerData?.outBuzzer);
elapsedTimer.Interval = SystemDefine.BUZZER_TIMEOUT;
public void BuzzerOnInfinitely()
if (towerData?.outBuzzer != null && iIO != null)
iIO.On(towerData?.outBuzzer);
public void BuzzerOnInfinitely(TOWERLAMP_ELEMENT element)
if (towerData?.outBuzzer != null && iIO != null)
if (element <= TOWERLAMP_ELEMENT.R_Y)
iIO.Off(towerData?.outBuzzer);
else if (element > TOWERLAMP_ELEMENT.R_Y)
iIO.On(towerData?.outBuzzer);
public void ForceBuzzerOff()
if (towerData?.outBuzzer != null && iIO != null)
iIO.Off(towerData?.outBuzzer);
using Auto_Insert_Sim_Tray.Configs;
using Auto_Insert_Sim_Tray.Configs.Model;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib.EZI_COMM_DEFINE;
namespace Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Data
public enum FASTECH_OBJECT_TYPE
public enum FASTECH_CONNECTION_TYPE
public enum FASTECH_AXIS_TYPE
EZI_MOTION_LINK_PLUS_R_V6,
EZI_MOTION_LINK_PLUS_R_V8,
EZI_MOTION_LINK_PLUS_E_V6,
public enum FASTECH_IO_BOARD_TYPE
public class FastechObject
public FASTECH_OBJECT_TYPE objectType { get; }
public FASTECH_CONNECTION_TYPE connectionType { get; }
public object connectionInfo { get; }
public FASTECH_IO_BOARD_TYPE boardType { get; }
public FASTECH_AXIS_TYPE axisType { get; }
public FastechStatus fastechStatus { get; set; }
public FastechObject(FASTECH_OBJECT_TYPE objectType, byte ID, FASTECH_CONNECTION_TYPE connectionType, object connectionInfo, FASTECH_IO_BOARD_TYPE boardType, FASTECH_AXIS_TYPE axisType)
this.objectType = objectType;
this.connectionType = connectionType;
this.connectionInfo = connectionInfo;
this.boardType = boardType;
this.axisType = axisType;
fastechStatus = new FastechStatus();
public class FastechStatus
public ushort posTableItemNo;
using Auto_Insert_Sim_Tray.Configs.Model;
using Auto_Insert_Sim_Tray.Define;
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Data;
using Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib;
using Auto_Insert_Sim_Tray.Utils;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.AxisDefine;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.LogDefine;
using static Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib.EZI_COMM_DEFINE;
using static Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib.EziMOTIONPlusELib;
using static Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib.EziMOTIONPlusRLib;
using static Auto_Insert_Sim_Tray.HW.Vendor.Fastech.Lib.EziMOTIONPlusRV8Lib;
namespace Auto_Insert_Sim_Tray.HW.Vendor.Fastech
class Fastech : IAxis, IIO, NV_UI_2_0.UserIIO
private const bool ON = true;
private const bool OFF = false;
private const int TRUE = 1;
private const int FALSE = 0;
private int portCount = 0;
private int ethernetCount = 0;
private int maxPortValue = 0;
private int maxEthernetID = 0;
private int countRetryConnect = 0;
private bool[] isPortConnected = null;
private bool[] isEthernetConnected = null;
private List<FastechObject[]> listFastechObjects;
private AxisParamData[] axisParamData;
private Dictionary<AXIS_LIST, FastechObject> axisList;
private List<FastechObject> ioList;
private SafeThread axisThread;
private SafeThread inputThread;
private SafeThread outputThread;
private object axisStatusLock;
private object inputStatusLock;
private object outputStatusLock;
public Fastech(List<FastechObject[]> listFastechObjects)
axisStatusLock = new object();
inputStatusLock = new object();
outputStatusLock = new object();
this.listFastechObjects = listFastechObjects;
GetConnectNum(ref portCount, ref maxPortValue, ref ethernetCount, ref maxEthernetID);
isPortConnected = new bool[maxPortValue + 1];
isEthernetConnected = new bool[maxEthernetID + 1];
axisParamData = new AxisParamData[Convert.ToInt32(AXIS_LIST.MAX)];
axisThread = new SafeThread(new ThreadStart(UpdateAllStatus), 50);
axisThread.StartThread();
inputThread = new SafeThread(new ThreadStart(UpdateInputStatus), 50);
inputThread.StartThread();
outputThread = new SafeThread(new ThreadStart(UpdateOutputStatus), 50);
outputThread.StartThread();
private void InitFastechObjectList()
axisList = new Dictionary<AXIS_LIST, FastechObject>();
ioList = new List<FastechObject>();
foreach (var fastechObjects in listFastechObjects)
foreach (var fastech in fastechObjects)
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
axisList.Add((AXIS_LIST)axixIdx, fastech);
if ((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
private void GetConnectNum(ref int portCount, ref int maxPortValue, ref int ethernetCount, ref int maxEthernetID)
foreach (var fastechObjects in listFastechObjects)
foreach (var fastech in fastechObjects)
if (fastech.connectionType == FASTECH_CONNECTION_TYPE.SERIAL)
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
if (bytePort > maxPortValue)
else if (fastech.connectionType == FASTECH_CONNECTION_TYPE.ETHERNET)
if (fastech.ID > maxEthernetID)
maxEthernetID = fastech.ID;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"GetConnectNum - Port : {portCount}, {maxPortValue}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"GetConnectNum - Ethernet : {ethernetCount}, {maxEthernetID}", CONTENT_TYPE.DEBUG);
private string GetPortString(string port)
if (port.Contains("COM"))
port = port.Remove(0, 3);
private bool CheckAxisStatus(object axisIdx, uint checkFlag)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
if ((fastech.fastechStatus.axisStatus & checkFlag) != 0)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void UpdateAllStatus()
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
FastechStatus fastechStatus = new FastechStatus();
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_GetAllStatus(
ref fastechStatus.inStatusV8,
ref fastechStatus.outStatus,
ref fastechStatus.axisStatus,
ref fastechStatus.targetPos,
ref fastechStatus.currentPos,
ref fastechStatus.posError,
ref fastechStatus.velocity,
ref fastechStatus.posTableItemNo);
libRet = EziMOTIONPlusRLib.FAS_GetAllStatus(
ref fastechStatus.inStatus,
ref fastechStatus.outStatus,
ref fastechStatus.axisStatus,
ref fastechStatus.targetPos,
ref fastechStatus.currentPos,
ref fastechStatus.posError,
ref fastechStatus.velocity,
ref fastechStatus.posTableItemNo);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_GetAllStatus(
ref fastechStatus.inStatus,
ref fastechStatus.outStatus,
ref fastechStatus.axisStatus,
ref fastechStatus.targetPos,
ref fastechStatus.currentPos,
ref fastechStatus.posError,
ref fastechStatus.velocity,
ref fastechStatus.posTableItemNo);
fastech.fastechStatus = fastechStatus;
if (libRet == FMM_NOT_OPEN)
UpdateConnectionStatus(fastech);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Fastech update status error with return value : " + libRet.ToString(), CONTENT_TYPE.ERROR);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
private void Reconnect(FastechObject fastech)
private void UpdateConnectionStatus(FastechObject fastech)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.NONE:
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
isPortConnected[bytePort] = false;
case FASTECH_CONNECTION_TYPE.ETHERNET:
isEthernetConnected[fastech.ID] = false;
public void UpdateInputStatus()
FastechStatus fastechStatus = new FastechStatus();
foreach (FastechObject fastech in ioList)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
if (!isPortConnected[bytePort])
if (((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
&& ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) == FASTECH_OBJECT_TYPE.NONE))
libRet = EziMOTIONPlusRLib.FAS_GetSlaveInfo(bytePort, fastech.ID, ref boardType, ref version);
switch ((FASTECH_IO_BOARD_TYPE)boardType)
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I32:
libRet = EziMOTIONPlusRLib.FAS_GetInput(bytePort, fastech.ID, ref inputValue, ref latch);
case FASTECH_CONNECTION_TYPE.ETHERNET:
if (!isEthernetConnected[fastech.ID])
libRet = EziMOTIONPlusELib.FAS_GetSlaveInfo(fastech.ID, ref boardType, ref version);
switch ((FASTECH_IO_BOARD_TYPE)boardType)
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I32:
libRet = EziMOTIONPlusELib.FAS_GetInput(fastech.ID, ref inputValue, ref latch);
fastech.inputValue = inputValue;
if (libRet == FMM_NOT_OPEN)
UpdateConnectionStatus(fastech);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fastech output status error with return value : {libRet.ToString()}", CONTENT_TYPE.ERROR);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void UpdateOutputStatus()
FastechStatus fastechStatus = new FastechStatus();
foreach (FastechObject fastech in ioList)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
if (!isPortConnected[bytePort])
if (((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
&& ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) == FASTECH_OBJECT_TYPE.NONE))
libRet = EziMOTIONPlusRLib.FAS_GetSlaveInfo(bytePort, fastech.ID, ref boardType, ref version);
switch ((FASTECH_IO_BOARD_TYPE)boardType)
case FASTECH_IO_BOARD_TYPE.EZI_IO_O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_O32:
libRet = EziMOTIONPlusRLib.FAS_GetOutput(bytePort, fastech.ID, ref outputValue, ref latch);
case FASTECH_CONNECTION_TYPE.ETHERNET:
if (!isEthernetConnected[fastech.ID])
libRet = EziMOTIONPlusELib.FAS_GetSlaveInfo(fastech.ID, ref boardType, ref version);
switch ((FASTECH_IO_BOARD_TYPE)boardType)
case FASTECH_IO_BOARD_TYPE.EZI_IO_O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_O32:
libRet = EziMOTIONPlusELib.FAS_GetOutput(fastech.ID, ref outputValue, ref latch);
fastech.outputValue = outputValue;
if (libRet == FMM_NOT_OPEN)
UpdateConnectionStatus(fastech);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fastech output status error with return value : {libRet.ToString()}", CONTENT_TYPE.ERROR);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
private void GetBoardIOSize(FASTECH_IO_BOARD_TYPE type, ref int inputSize, ref int outputSize)
case FASTECH_IO_BOARD_TYPE.EZI_PLUS_I6O9:
case FASTECH_IO_BOARD_TYPE.EZI_PLUS_I9O9:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I32:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I8O8:
case FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_O16:
case FASTECH_IO_BOARD_TYPE.EZI_IO_O32:
private UInt64 GetInputLogic(FastechObject fastech, int ioValue)
UInt64 inputLogic = 0x00;
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
inputLogic = (uint)EZISERVO_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN0;
inputLogic = (uint)EZISERVO_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN1;
inputLogic = (uint)EZISERVO_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN2;
inputLogic = (uint)EZISERVO_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN3;
inputLogic = (uint)EZISERVO_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN4;
inputLogic = (uint)EZISERVO_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN5;
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN0;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN1;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN2;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN3;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN4;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN5;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN6;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN7;
inputLogic = (UInt64)EZISERVOV8_INLOGIC_LIST.SERVO_IN_LOGIC_USERIN8;
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN0;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN1;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN2;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN3;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN4;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN5;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN6;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN7;
inputLogic = (uint)EZISERVO2_INLOGIC_LIST.SERVO2_IN_LOGIC_USERIN8;
private UInt64 GetOutputLogic(FastechObject fastech, int ioValue)
UInt64 outputLogic = 0x00;
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
outputLogic = (uint)EZISERVO_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT0;
outputLogic = (uint)EZISERVO_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT1;
outputLogic = (uint)EZISERVO_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT2;
outputLogic = (uint)EZISERVO_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT3;
outputLogic = (uint)EZISERVO_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT4;
outputLogic = (uint)EZISERVO_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT5;
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT0;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT1;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT2;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT3;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT4;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT5;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT6;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT7;
outputLogic = (UInt64)EZISERVOV8_OUTLOGIC_LIST.SERVO_OUT_LOGIC_USEROUT8;
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT0;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT1;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT2;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT3;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT4;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT5;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT6;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT7;
outputLogic = (uint)EZISERVO2_OUTLOGIC_LIST.SERVO2_OUT_LOGIC_USEROUT8;
public bool IsOn(object io)
int ioValue = Convert.ToInt32(io);
foreach (var fastech in ioList)
GetBoardIOSize(fastech.boardType, ref inputSize, ref outputSize);
if (io.GetType() == typeof(DI))
if (ioValue >= inputSize)
if (((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
&& ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE))
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
data = ((fastech.fastechStatus.inStatus & GetInputLogic(fastech, ioValue)) != 0);
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
data = ((fastech.fastechStatus.inStatusV8 & GetInputLogic(fastech, ioValue)) != 0);
data = ((fastech.inputValue & (0x01 << (int)ioValue)) != 0);
else if (io.GetType() == typeof(DO))
if (ioValue >= outputSize)
if (((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
&& ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE))
data = ((fastech.fastechStatus.outStatus & GetOutputLogic(fastech, ioValue)) != 0);
if (fastech.boardType == FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16)
data = ((fastech.outputValue & (0x01 << (int)(ioValue + 16))) != 0);
data = ((fastech.outputValue & (0x01 << (int)ioValue)) != 0);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsOff(object io)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void Off(object io)
int ioValue = Convert.ToInt32(io);
bool isConnected = false;
if (io.GetType() != typeof(DO))
foreach (var fastech in ioList)
GetBoardIOSize(fastech.boardType, ref inputSize, ref outputSize);
if (ioValue >= outputSize)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
isConnected = isPortConnected[bytePort];
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
isConnected = isEthernetConnected[fastech.ID];
if (((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
&& ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE))
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
EziMOTIONPlusRLib.FAS_SetIOOutput(bytePort, fastech.ID, setMask, (uint)GetOutputLogic(fastech, ioValue));
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
EziMOTIONPlusRV8Lib.FAS_SetIOOutput(bytePort, fastech.ID, setMask, (uint)GetOutputLogic(fastech, ioValue));
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
EziMOTIONPlusELib.FAS_SetIOOutput(fastech.ID, setMask, (uint)GetOutputLogic(fastech, ioValue));
clrMask = clrMask << ioValue;
if (fastech.boardType == FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
EziMOTIONPlusRLib.FAS_SetOutput(bytePort, fastech.ID, setMask, clrMask);
case FASTECH_CONNECTION_TYPE.ETHERNET:
EziMOTIONPlusELib.FAS_SetOutput(fastech.ID, setMask, clrMask);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void On(object io)
int ioValue = Convert.ToInt32(io);
bool isConnected = false;
if (io.GetType() != typeof(DO))
foreach (var fastech in ioList)
GetBoardIOSize(fastech.boardType, ref inputSize, ref outputSize);
if (ioValue >= outputSize)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
isConnected = isPortConnected[bytePort];
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
isConnected = isEthernetConnected[fastech.ID];
if (((fastech.objectType & FASTECH_OBJECT_TYPE.IO) != FASTECH_OBJECT_TYPE.NONE)
&& ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE))
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
EziMOTIONPlusRLib.FAS_SetIOOutput(bytePort, fastech.ID, (uint)GetOutputLogic(fastech, ioValue), clrMask);
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
EziMOTIONPlusRV8Lib.FAS_SetIOOutput(bytePort, fastech.ID, (uint)GetOutputLogic(fastech, ioValue), clrMask);
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
EziMOTIONPlusELib.FAS_SetIOOutput(fastech.ID, (uint)GetOutputLogic(fastech, ioValue), clrMask);
setMask = setMask << ioValue;
if (fastech.boardType == FASTECH_IO_BOARD_TYPE.EZI_IO_I16O16)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
EziMOTIONPlusRLib.FAS_SetOutput(bytePort, fastech.ID, setMask, clrMask);
case FASTECH_CONNECTION_TYPE.ETHERNET:
EziMOTIONPlusELib.FAS_SetOutput(fastech.ID, setMask, clrMask);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsConnected()
foreach (var fastechObjects in listFastechObjects)
foreach (var fastech in fastechObjects)
if (fastech.connectionType == FASTECH_CONNECTION_TYPE.SERIAL)
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
ret &= isPortConnected[bytePort];
else if (fastech.connectionType == FASTECH_CONNECTION_TYPE.ETHERNET)
IPAddress ip = (IPAddress)fastech.connectionInfo;
ret &= isEthernetConnected[fastech.ID];
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsConnected(object axisIdx)
bool isConnected = false;
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
isConnected = isPortConnected[bytePort];
case FASTECH_CONNECTION_TYPE.ETHERNET:
isConnected = isEthernetConnected[fastech.ID];
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void Close(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void Close(FastechObject fastech)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
isPortConnected[bytePort] = false;
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
EziMOTIONPlusRV8Lib.FAS_Close(bytePort);
EziMOTIONPlusRLib.FAS_Close(bytePort);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Serial connection close : {serial.PortName}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
isEthernetConnected[fastech.ID] = false;
EziMOTIONPlusELib.FAS_Close(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Ethernet connection close : {ip.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public void Close(FastechObject[] fastechObjects)
foreach (var fastech in fastechObjects)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
isPortConnected[bytePort] = false;
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
EziMOTIONPlusRV8Lib.FAS_Close(bytePort);
EziMOTIONPlusRLib.FAS_Close(bytePort);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Serial connection close : {serial.PortName}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
isEthernetConnected[fastech.ID] = false;
EziMOTIONPlusELib.FAS_Close(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Ethernet connection close : {ip.ToString()}", CONTENT_TYPE.DEBUG);
if (fastech.connectionType == FASTECH_CONNECTION_TYPE.SERIAL)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
foreach (var fastechObjects in listFastechObjects)
foreach (var fastech in fastechObjects)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
isPortConnected[bytePort] = false;
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
EziMOTIONPlusRV8Lib.FAS_Close(bytePort);
EziMOTIONPlusRLib.FAS_Close(bytePort);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Serial connection close : {serial.PortName}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
isEthernetConnected[fastech.ID] = false;
EziMOTIONPlusELib.FAS_Close(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Ethernet connection close : {ip.ToString()}", CONTENT_TYPE.DEBUG);
if (fastech.connectionType == FASTECH_CONNECTION_TYPE.SERIAL)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool Connect(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool Connect(FastechObject fastech)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
if (!isPortConnected[bytePort])
connectRet = EziMOTIONPlusRV8Lib.FAS_Connect(bytePort, baudRate);
connectRet = EziMOTIONPlusRV8Lib.FAS_IsSlaveExist(bytePort, fastech.ID);
if (!isPortConnected[bytePort])
connectRet = EziMOTIONPlusRLib.FAS_Connect(bytePort, baudRate);
connectRet = EziMOTIONPlusRLib.FAS_IsSlaveExist(bytePort, fastech.ID);
isPortConnected[bytePort] = true;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Serial connection success : {serial.PortName}", CONTENT_TYPE.DEBUG);
isPortConnected[bytePort] = false;
if (countRetryConnect <= 20)
LogUtil.Instance.Log(LOG_TYPE.INFO, $"Serial connection fail : {serial.PortName}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
bConnectRet = EziMOTIONPlusELib.FAS_ConnectTCP(ip, fastech.ID);
if (bConnectRet != false)
connectRet = EziMOTIONPlusELib.FAS_IsSlaveExist(fastech.ID);
if ((bConnectRet != false) && (connectRet != FALSE))
isEthernetConnected[fastech.ID] = true;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Ethernet connection success : {ip.ToString()}", CONTENT_TYPE.DEBUG);
isEthernetConnected[fastech.ID] = false;
if (countRetryConnect <= 20)
LogUtil.Instance.Log(LOG_TYPE.INFO, $"Ethernet connection fail : {ip.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool Connect(FastechObject[] fastechObjects)
foreach (var fastech in fastechObjects)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
if (!isPortConnected[bytePort])
connectRet = EziMOTIONPlusRV8Lib.FAS_Connect(bytePort, baudRate);
connectRet = EziMOTIONPlusRV8Lib.FAS_IsSlaveExist(bytePort, fastech.ID);
if (!isPortConnected[bytePort])
connectRet = EziMOTIONPlusRLib.FAS_Connect(bytePort, baudRate);
connectRet = EziMOTIONPlusRLib.FAS_IsSlaveExist(bytePort, fastech.ID);
isPortConnected[bytePort] = true;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Serial connection success : {serial.PortName}", CONTENT_TYPE.DEBUG);
isPortConnected[bytePort] = false;
LogUtil.Instance.Log(LOG_TYPE.INFO, $"Serial connection fail : {serial.PortName}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
bConnectRet = EziMOTIONPlusELib.FAS_ConnectTCP(ip, fastech.ID);
if (bConnectRet != false)
connectRet = EziMOTIONPlusELib.FAS_IsSlaveExist(fastech.ID);
if ((bConnectRet != false) && (connectRet != FALSE))
isEthernetConnected[fastech.ID] = true;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Ethernet connection success : {ip.ToString()}", CONTENT_TYPE.DEBUG);
isEthernetConnected[fastech.ID] = false;
LogUtil.Instance.Log(LOG_TYPE.INFO, $"Ethernet connection fail : {ip.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
foreach (var fastechObjects in listFastechObjects)
foreach (var fastech in fastechObjects)
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
uint baudRate = Convert.ToUInt32(serial.BaudRate);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
if (!isPortConnected[bytePort])
connectRet = EziMOTIONPlusRV8Lib.FAS_Connect(bytePort, baudRate);
connectRet = EziMOTIONPlusRV8Lib.FAS_IsSlaveExist(bytePort, fastech.ID);
if (!isPortConnected[bytePort])
connectRet = EziMOTIONPlusRLib.FAS_Connect(bytePort, baudRate);
connectRet = EziMOTIONPlusRLib.FAS_IsSlaveExist(bytePort, fastech.ID);
isPortConnected[bytePort] = true;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Serial connection success : {serial.PortName}", CONTENT_TYPE.DEBUG);
isPortConnected[bytePort] = false;
LogUtil.Instance.Log(LOG_TYPE.INFO, $"Serial connection fail : {serial.PortName}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
IPAddress ip = (IPAddress)fastech.connectionInfo;
bConnectRet = EziMOTIONPlusELib.FAS_ConnectTCP(ip, fastech.ID);
if (bConnectRet != false)
connectRet = EziMOTIONPlusELib.FAS_IsSlaveExist(fastech.ID);
if ((bConnectRet != false) && (connectRet != FALSE))
isEthernetConnected[fastech.ID] = true;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Ethernet connection success : {ip.ToString()}", CONTENT_TYPE.DEBUG);
isEthernetConnected[fastech.ID] = false;
LogUtil.Instance.Log(LOG_TYPE.INFO, $"Ethernet connection fail : {ip.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool GetCurrentPos(ref object[] type)
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
decimal scale = Convert.ToDecimal(axisParamData[(int)var.Key].resolution) / Convert.ToDecimal(axisParamData[(int)var.Key].distance);
type[(uint)var.Key] = Convert.ToDecimal(fastech.fastechStatus.currentPos) * Convert.ToDecimal(((decimal)1 / scale));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool GetCurrentPos(object axisIdx, ref object currentPos)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
decimal scale = Convert.ToDecimal(axisParamData[(int)axisIdx].resolution) / Convert.ToDecimal(axisParamData[(int)axisIdx].distance);
currentPos = Convert.ToDecimal(fastech.fastechStatus.targetPos) * Convert.ToDecimal(((decimal)1 / scale));
currentPos = Convert.ToDecimal(fastech.fastechStatus.currentPos) * Convert.ToDecimal(((decimal)1 / scale));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public decimal ScalePos(object axisIdx)
return Convert.ToDecimal(axisParamData[(int)axisIdx].resolution) / Convert.ToDecimal(axisParamData[(int)axisIdx].distance);
public bool GetCurrentPulse(object axisIdx, ref object currentPulse)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
currentPulse = Convert.ToDecimal(fastech.fastechStatus.targetPos);
currentPulse = Convert.ToDecimal(fastech.fastechStatus.currentPos);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool GetParameter(object servoParamFlag, ref object[] setValue)
byte flag = Convert.ToByte(servoParamFlag);
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_GetParameter(bytePort, fastech.ID, flag, ref getValue);
libRet = EziMOTIONPlusRLib.FAS_GetParameter(bytePort, fastech.ID, flag, ref getValue);
setValue[(uint)var.Key] = (object)getValue;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{var.Key} can't get parameter because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_GetParameter(fastech.ID, flag, ref getValue);
setValue[(uint)var.Key] = (object)getValue;
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{var.Key} can't get parameter because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
throw new NotImplementedException();
public bool IsAlarmCheck(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
if (!CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_ERRORALL))
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
throw new NotImplementedException();
throw new NotImplementedException();
public bool IsMoveDone(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
ret = (!CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_MOTIONING) && !CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_MOTIONACCEL)
&& !CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_MOTIONCONST) && !CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_MOTIONDECEL)
&& (axisParamData[(int)axisIdx].inpositionFlag ? CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_INPOSITION) : true));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsMoveDone(ref bool[] ret)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Return parameter have to size bigger than 0", CONTENT_TYPE.DEBUG);
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = axisList[(AXIS_LIST)var.Key];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
ret[(uint)var.Key] = (!CheckAxisStatus(var.Key, (uint)AXISSTATUS.FFLAG_MOTIONING) && !CheckAxisStatus(var.Key, (uint)AXISSTATUS.FFLAG_MOTIONACCEL)
&& !CheckAxisStatus(var.Key, (uint)AXISSTATUS.FFLAG_MOTIONCONST) && !CheckAxisStatus(var.Key, (uint)AXISSTATUS.FFLAG_MOTIONDECEL)
&& (axisParamData[(int)var.Key].inpositionFlag ? CheckAxisStatus(var.Key, (uint)AXISSTATUS.FFLAG_INPOSITION) : true));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsOriginDone(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
ret = CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_ORIGINRETOK);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsOriginDone()
throw new NotImplementedException();
public bool IsServoOn(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
ret = CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_SERVOON);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool JogMove(params object[] args)
int axisIdx = Convert.ToInt32(args[(int)PARMS_ARG.SLAVE_NO]);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
bool direction = Convert.ToBoolean(args[(int)PARMS_ARG.FLAG]);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
LEVEL_SPEED speed = LEVEL_SPEED.SLOW;
if (decimal.TryParse(args[(int)PARMS_ARG.VALUE].ToString(), out nVel))
vel = (uint)nVel * (uint)scale;
else if (Enum.TryParse(args[(int)PARMS_ARG.VALUE].ToString().ToUpper(), out speed))
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_medium);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].jogVel);
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveVelocity(bytePort, fastech.ID, vel, (direction ? 1 : 0));
libRet = EziMOTIONPlusRLib.FAS_MoveVelocity(bytePort, fastech.ID, vel, (direction ? 1 : 0));
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveVelocity(fastech.ID, vel, (direction ? 1 : 0));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"(AXIS_LIST)axisIdx Can't move with jog control", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveStop(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveStop(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_MoveStop(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveStop(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{(AXIS_LIST)axisIdx} can't stop", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveStop(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_MoveStop(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveStop(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"{(AXIS_LIST)var.Key} can't stop", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveTargetPos(params object[] args)
int axisIdx = Convert.ToInt32(args[(int)PARMS_ARG.SLAVE_NO]);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
int targetPos = Convert.ToInt32(Convert.ToDouble(args[(int)PARMS_ARG.FLAG]) * scale);
LEVEL_SPEED speed = LEVEL_SPEED.SLOW;
if (decimal.TryParse(args[(int)PARMS_ARG.VALUE].ToString(), out nVel))
vel = (uint)(nVel * (decimal)scale);
else if (Enum.TryParse(args[(int)PARMS_ARG.VALUE].ToString().ToUpper(), out speed))
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_medium);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveSingleAxisAbsPos(bytePort, fastech.ID, targetPos, vel);
libRet = EziMOTIONPlusRLib.FAS_MoveSingleAxisAbsPos(bytePort, fastech.ID, targetPos, vel);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveSingleAxisAbsPos(fastech.ID, targetPos, vel);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {axisIdx} to {targetPos} because of {ret.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveTargetPosInc(params object[] args)
int axisIdx = Convert.ToInt32(args[(int)PARMS_ARG.SLAVE_NO]);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
int targetPos = Convert.ToInt32(Convert.ToDouble(args[(int)PARMS_ARG.FLAG]) * scale);
LEVEL_SPEED speed = LEVEL_SPEED.SLOW;
if (decimal.TryParse(args[(int)PARMS_ARG.VALUE].ToString(), out nVel))
vel = (uint)nVel * (uint)scale;
else if (Enum.TryParse(args[(int)PARMS_ARG.VALUE].ToString().ToUpper(), out speed))
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_medium);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveSingleAxisIncPos(fastech.ID, targetPos, vel);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {axisIdx} to {targetPos} because of {ret.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveTargetPos_Interpolation(object[] axisLinear, decimal[] lplAbsPos, params object[] args)
if (axisLinear is null || lplAbsPos is null) return false;
if (axisLinear.Length < 2 || lplAbsPos.Length < 2) return false;
int axisIdx = Convert.ToInt32(axisLinear[0]);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
int[] targetPos = new int[lplAbsPos.Length];
for (int i = 0; i < targetPos.Length; i++)
double scaleIdx = Convert.ToDouble(axisParamData[Convert.ToInt32(axisLinear[i])].resolution) / Convert.ToDouble(axisParamData[Convert.ToInt32(axisLinear[i])].distance);
targetPos[i] = Convert.ToInt32(Convert.ToDouble(lplAbsPos[i]) * scaleIdx);
LEVEL_SPEED speed = LEVEL_SPEED.SLOW;
if (decimal.TryParse(args[(int)PARMS_ARG.VALUE].ToString(), out nVel))
vel = (uint)nVel * (uint)scale;
else if (Enum.TryParse(args[(int)PARMS_ARG.VALUE].ToString().ToUpper(), out speed))
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_medium);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
byte[] iID_R = new byte[axisLinear.Length];
for (int i = 0; i < axisLinear.Length; i++)
iID_R[i] = (byte)axisList[(AXIS_LIST)(int.Parse(axisLinear[i].ToString()))].ID;
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveLinearAbsPos(bytePort, (byte)iID_R.Length, iID_R, targetPos, vel, ushort.Parse(axisParamData[(int)axisIdx].acc.ToString()));
libRet = EziMOTIONPlusRV8Lib.FAS_MoveLinearAbsPos(bytePort, (byte)iID_R.Length, iID_R, targetPos, vel, ushort.Parse(axisParamData[(int)axisIdx].acc.ToString()));
case FASTECH_CONNECTION_TYPE.ETHERNET:
int[] iID_E = new int[axisLinear.Length];
for (int i = 0; i < axisLinear.Length; i++)
int idx = Convert.ToInt32(axisLinear[i]);
iID_E[i] = (int)axisList[(AXIS_LIST)(idx)].ID;
libRet = EziMOTIONPlusELib.FAS_MoveLinearAbsPos2((byte)iID_E.Length, iID_E, targetPos, vel, ushort.Parse(axisParamData[(int)axisIdx].acc.ToString()));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {axisIdx} to {targetPos} because of {ret.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveTargetPosInc_Interpolation(object[] axisLinear, decimal[] lplIncPos, params object[] args)
if (axisLinear is null || lplIncPos is null) return false;
if (axisLinear.Length < 2 || lplIncPos.Length < 2) return false;
int axisIdx = Convert.ToInt32(axisLinear[0]);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
int[] targetPos = new int[lplIncPos.Length];
for (int i = 0; i < targetPos.Length; i++)
targetPos[i] = Convert.ToInt32(Convert.ToDouble(lplIncPos[i]) * scale);
LEVEL_SPEED speed = LEVEL_SPEED.SLOW;
if (decimal.TryParse(args[(int)PARMS_ARG.VALUE].ToString(), out nVel))
vel = (uint)nVel * (uint)scale;
else if (Enum.TryParse(args[(int)PARMS_ARG.VALUE].ToString().ToUpper(), out speed))
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_medium);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.ETHERNET:
int[] iID_E = new int[axisLinear.Length];
for (int i = 0; i < axisLinear.Length; i++)
iID_E[i] = (int)axisLinear[i];
libRet = EziMOTIONPlusELib.FAS_MoveLinearIncPos2(fastech.ID, iID_E, targetPos, vel, ushort.Parse(axisParamData[(int)axisIdx].acc.ToString()));
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {axisIdx} to {targetPos} because of {ret.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveTargetPulse(params object[] args)
int axisIdx = Convert.ToInt32(args[(int)PARMS_ARG.SLAVE_NO]);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
int targetPos = Convert.ToInt32(Convert.ToDouble(args[(int)PARMS_ARG.FLAG]));
string speed = args[(int)PARMS_ARG.VALUE].ToString();
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_medium);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_low);
vel = Convert.ToUInt32(axisParamData[(int)axisIdx].vel_high);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveSingleAxisAbsPos(bytePort, fastech.ID, targetPos, vel);
libRet = EziMOTIONPlusRLib.FAS_MoveSingleAxisAbsPos(bytePort, fastech.ID, targetPos, vel);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveSingleAxisAbsPos(fastech.ID, targetPos, vel);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {axisIdx} to {targetPos} because of {ret.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveToOrigin(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveOriginSingleAxis(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_MoveOriginSingleAxis(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveOriginSingleAxis(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {axisIdx} to Origin because of {ret.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool MoveToOrigin()
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_MoveOriginSingleAxis(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_MoveOriginSingleAxis(bytePort, fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {var.Key} to Origin because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_MoveOriginSingleAxis(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to move {var.Key} to Origin because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool ResetServoAlarm(object axisIdx = null)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Axis index is null", CONTENT_TYPE.DEBUG);
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ServoAlarmReset(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_ServoAlarmReset(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ServoAlarmReset(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to reset {(AXIS_LIST)axisIdx} servo alarm because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool ResetServoAlarm()
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ServoAlarmReset(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_ServoAlarmReset(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ServoAlarmReset(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to reset {(AXIS_LIST)var.Key} servo alarm because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool ServoOff(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ServoEnable(bytePort, fastech.ID, FALSE);
libRet = EziMOTIONPlusRLib.FAS_ServoEnable(bytePort, fastech.ID, FALSE);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ServoEnable(fastech.ID, FALSE);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to turn off {(AXIS_LIST)axisIdx} servo because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ServoEnable(bytePort, fastech.ID, FALSE);
libRet = EziMOTIONPlusRLib.FAS_ServoEnable(bytePort, fastech.ID, FALSE);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ServoEnable(fastech.ID, FALSE);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to turn off {(AXIS_LIST)var.Key} servo because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool ServoOn(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ServoEnable(bytePort, fastech.ID, TRUE);
libRet = EziMOTIONPlusRLib.FAS_ServoEnable(bytePort, fastech.ID, TRUE);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ServoEnable(fastech.ID, TRUE);
libRet = EziMOTIONPlusELib.FAS_SetCommandPos(fastech.ID, fastech.fastechStatus.currentPos);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to turn on {(AXIS_LIST)axisIdx} servo because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = var.Value;
if (!IsConnected(var.Key))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ServoEnable(bytePort, fastech.ID, TRUE);
libRet = EziMOTIONPlusRLib.FAS_ServoEnable(bytePort, fastech.ID, TRUE);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ServoEnable(fastech.ID, TRUE);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to turn on {(AXIS_LIST)var.Key} servo because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool SetAxisParams(object axisIdx, object data)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (axisParamData[(int)axisIdx] is null)
axisParamData[(int)axisIdx] = new AxisParamData();
axisParamData[(int)axisIdx].resolution = ((AxisParamData)data).resolution;
axisParamData[(int)axisIdx].distance = ((AxisParamData)data).distance;
axisParamData[(int)axisIdx].vel_high = ((AxisParamData)data).vel_high;
axisParamData[(int)axisIdx].vel_medium = ((AxisParamData)data).vel_medium;
axisParamData[(int)axisIdx].vel_low = ((AxisParamData)data).vel_low;
axisParamData[(int)axisIdx].acc = ((AxisParamData)data).acc;
axisParamData[(int)axisIdx].dec = ((AxisParamData)data).dec;
axisParamData[(int)axisIdx].jogVel = ((AxisParamData)data).jogVel;
axisParamData[(int)axisIdx].jogAcc = ((AxisParamData)data).jogAcc;
axisParamData[(int)axisIdx].jogDec = ((AxisParamData)data).jogDec;
axisParamData[(int)axisIdx].oriVel = ((AxisParamData)data).oriVel;
axisParamData[(int)axisIdx].oriDec = ((AxisParamData)data).oriDec;
axisParamData[(int)axisIdx].oriReturn = ((AxisParamData)data).oriReturn;
axisParamData[(int)axisIdx].inpositionFlag = ((AxisParamData)data).inpositionFlag;
if (axisParamData[(int)axisIdx].resolution is null || axisParamData[(int)axisIdx].distance is null)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Please assign gear ratio data", CONTENT_TYPE.ERROR);
double scale = Convert.ToDouble(axisParamData[(int)axisIdx].resolution) / Convert.ToDouble(axisParamData[(int)axisIdx].distance);
axisParamData[(int)axisIdx].vel_high = Convert.ToDouble(axisParamData[(int)axisIdx].vel_high) * scale;
axisParamData[(int)axisIdx].vel_medium = Convert.ToDouble(axisParamData[(int)axisIdx].vel_medium) * scale;
axisParamData[(int)axisIdx].vel_low = Convert.ToDouble(axisParamData[(int)axisIdx].vel_low) * scale;
axisParamData[(int)axisIdx].jogVel = Convert.ToDouble(axisParamData[(int)axisIdx].jogVel) * scale;
axisParamData[(int)axisIdx].oriVel = Convert.ToDouble(axisParamData[(int)axisIdx].oriVel) * scale;
int accTime = Convert.ToInt32(axisParamData[(int)axisIdx].acc);
int decTime = Convert.ToInt32(axisParamData[(int)axisIdx].dec);
int jogVelocity = Convert.ToInt32(axisParamData[(int)axisIdx].jogVel);
int jogAccDecTime = Convert.ToInt32(axisParamData[(int)axisIdx].jogAcc);
int originVelocity = Convert.ToInt32(axisParamData[(int)axisIdx].oriVel);
int originAccDecTime = Convert.ToInt32(axisParamData[(int)axisIdx].oriAcc);
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V6:
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_ORGACCDECTIME, originAccDecTime);
case FASTECH_CONNECTION_TYPE.ETHERNET:
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_E_V6:
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_ORGACCDECTIME, originAccDecTime);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to set parameter to {(AXIS_LIST)axisIdx}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool SetAxisParams(params object[] args)
axisParamData = (AxisParamData[])args;
foreach (KeyValuePair<AXIS_LIST, FastechObject> var in axisList)
FastechObject fastech = axisList[(AXIS_LIST)var.Key];
if (!IsConnected((AXIS_LIST)var.Key))
double scale = Convert.ToDouble(axisParamData[(int)var.Key].resolution) / Convert.ToDouble(axisParamData[(int)var.Key].distance);
axisParamData[(int)var.Key].vel_high = Convert.ToDouble(axisParamData[(int)var.Key].vel_high) * scale;
axisParamData[(int)var.Key].vel_medium = Convert.ToDouble(axisParamData[(int)var.Key].vel_medium) * scale;
axisParamData[(int)var.Key].vel_low = Convert.ToDouble(axisParamData[(int)var.Key].vel_low) * scale;
axisParamData[(int)var.Key].jogVel = Convert.ToDouble(axisParamData[(int)var.Key].jogVel) * scale;
axisParamData[(int)var.Key].oriVel = Convert.ToDouble(axisParamData[(int)var.Key].oriVel) * scale;
int velocity = Convert.ToInt32(axisParamData[(int)var.Key].vel_high);
int accTime = Convert.ToInt32(axisParamData[(int)var.Key].acc);
int decTime = Convert.ToInt32(axisParamData[(int)var.Key].dec);
int jogVelocity = Convert.ToInt32(axisParamData[(int)var.Key].jogVel);
int jogAccDecTime = Convert.ToInt32(axisParamData[(int)var.Key].jogAcc);
int originVelocity = Convert.ToInt32(axisParamData[(int)var.Key].oriVel);
int originAccDecTime = Convert.ToInt32(axisParamData[(int)var.Key].oriAcc);
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V6:
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVO_PARAM.SERVO_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZISERVOV8_PARAM.SERVO_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V6:
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRLib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINK_PARAM.MOTIONLINK_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusRV8Lib.FAS_SetParameter(bytePort, fastech.ID, (byte)FM_EZIMOTIONLINKV8_PARAM.MOTIONLINK_ORGACCDECTIME, originAccDecTime);
case FASTECH_CONNECTION_TYPE.ETHERNET:
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_E_V6:
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZISERVO2_PARAM.SERVO2_ORGACCDECTIME, originAccDecTime);
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_E_V6:
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_AXISACCTIME, accTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_AXISDECTIME, decTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_JOGSPEED, jogVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_JOGACCDECTIME, jogAccDecTime);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_ORGSPEED, originVelocity);
libRet |= EziMOTIONPlusELib.FAS_SetParameter(fastech.ID, (byte)FM_EZIMOTIONLINK2_PARAM.MOTIONLINK2_ORGACCDECTIME, originAccDecTime);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to set parameter to {(AXIS_LIST)var.Key}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsOnOriginSensor(object axisIdx)
return CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_ORIGINSENSOR);
public void EmergencyMoveStop(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_EmergencyStop(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_EmergencyStop(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_EmergencyStop(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to emergency stop {(AXIS_LIST)axisIdx} servo because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
throw new NotImplementedException();
public bool ClearPosition(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if (!IsConnected(axisIdx))
switch (fastech.connectionType)
case FASTECH_CONNECTION_TYPE.SERIAL:
SerialPortModel serial = (SerialPortModel)fastech.connectionInfo;
string strPort = GetPortString(serial.PortName);
byte bytePort = byte.Parse(strPort);
switch (fastech.axisType)
case FASTECH_AXIS_TYPE.EZI_SERVO_PLUS_R_V8:
case FASTECH_AXIS_TYPE.EZI_MOTION_LINK_PLUS_R_V8:
libRet = EziMOTIONPlusRV8Lib.FAS_ClearPosition(bytePort, fastech.ID);
libRet = EziMOTIONPlusRLib.FAS_ClearPosition(bytePort, fastech.ID);
case FASTECH_CONNECTION_TYPE.ETHERNET:
libRet = EziMOTIONPlusELib.FAS_ClearPosition(fastech.ID);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, $"Fail to clear position {(AXIS_LIST)axisIdx} servo because of {libRet.ToString()}", CONTENT_TYPE.DEBUG);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsLowerLimit(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
ret = CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_HWNEGALMT);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
public bool IsUpperLimit(object axisIdx)
FastechObject fastech = axisList[(AXIS_LIST)axisIdx];
if ((fastech.objectType & FASTECH_OBJECT_TYPE.AXIS) != FASTECH_OBJECT_TYPE.NONE)
ret = CheckAxisStatus(axisIdx, (uint)AXISSTATUS.FFLAG_HWPOSILMT);
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, e.ToString(), CONTENT_TYPE.EXCEPTION);
Vendor/HoneywellBarcodeReader.cs
using System.Collections.Generic;
using System.Threading.Tasks;
using Auto_Insert_Sim_Tray.Configs.Model;
using Auto_Insert_Sim_Tray.HW.BarcodeReader;
namespace Auto_Insert_Sim_Tray.HW.Vendor.Honeywell
public class HoneywellBarcodeReader : BarcodeReader.BarcodeReader
string StopCommand = String.Empty;
public HoneywellBarcodeReader(BarcodeReaderConfig config, byte STX = 0x16, byte ETX = 0x0D) : base(config)
this.StopCommand = $"{((char)this.STX)}U";
base.Send(this.StopCommand);
using System.Collections.Generic;
using System.Threading.Tasks;
using Auto_Insert_Sim_Tray.Configs;
using Auto_Insert_Sim_Tray.Define;
using Auto_Insert_Sim_Tray.Utils;
using static Auto_Insert_Sim_Tray.Define.LogDefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Manager
public OpMsg(OP_MODE op, int message = -1)
public class SystemManager : IObservable<OpMsg>
private IList<IObserver<OpMsg>> listObserver;
private OpMsg prevOpMode;
public bool IsRunning { get; set; }
private MainForm mainForm;
private ManualResetEvent pauseEvent;
private object outOfStockWarningLock;
private bool isOutOfStockWarning;
private object outOfStockLock;
private bool isOutOfStock;
private object inputStopLock;
private object outputStopLock;
private bool isInputStop;
private bool isOutputStop;
private RUN_MODE runMode;
private Stack<OpMsg> opStack;
private Stack<OpMsg> tempStack;
public SynchronizationContext syncContext { get; set; }
public delegate void IsOpCallChange(bool isCall);
public event IsOpCallChange IsOpCalled;
public SystemManager(MainForm main)
LogUtil.Instance.Log(LOG_TYPE.DEVELOPMENT, "Init system manager", CONTENT_TYPE.DEBUG);
InitializeVariable(main);
private void InitializeVariable(MainForm main)
pauseEvent = new ManualResetEvent(true);
listObserver = new List<IObserver<OpMsg>>();
syncContext = SynchronizationContext.Current;
opMsg.opMode = OP_MODE.NONE;
prevOpMode.opMode = OP_MODE.NONE;
isOutOfStockWarning = false;
outOfStockWarningLock = new object();
outOfStockLock = new object();
inputStopLock = new object();
outputStopLock = new object();
opStack = new Stack<OpMsg>();
tempStack = new Stack<OpMsg>();
TacktimeManager = JsonHelper.Instance.logisticModel.TackTime;
initializeChecker = new InitializeChecker(TacktimeManager);
public ManualResetEvent PauseEvent
public IDisposable Subscribe(IObserver<OpMsg> observer)
if (!listObserver.Contains(observer))
listObserver.Add(observer);
return new UnSubscriber<OpMsg>(listObserver, observer);
IsOpCalled?.Invoke(isOpCall);
public bool IsOutOfStockWarning
lock (outOfStockWarningLock)
return isOutOfStockWarning;
lock (outOfStockWarningLock)
isOutOfStockWarning = value;
public void StackPush(OpMsg msg)
for (int i = 0; i < opStack.Count(); i++)
if ((opStack.ElementAt(i).opMode == msg.opMode) && (opStack.ElementAt(i).errCode == msg.errCode))
public OpMsg StackPop(OpMsg msg)
if (check.opMode == msg.opMode && check.errCode == msg.errCode)
while (tempStack.Count > 0)
opStack.Push(tempStack.Pop());
tempStack.Push(opStack.Pop());
return IsEmpty() ? new OpMsg(OP_MODE.NONE) : opStack.Peek();
return (opStack.Count == 0);
public void SetOPModeWithAsync(OP_MODE op, int errCode = -1)
opMsg = new OpMsg(op, errCode);
mainForm.autoPanel.login = null;
if (mainForm.CheckStartCondition())
mainForm.selected_Unit = UNIT_TYPE.NONE;
opMsg = new OpMsg(OP_MODE.STOP);
SetOPModeWithAsync(OP_MODE.STOP, SystemDefine.ERRCODE_STOP_YELLOW);
if (mainForm.alarmForm != null)
mainForm.alarmForm = null;
if (prevOpMode.opMode == OP_MODE.E_STOP)
if (prevOpMode.errCode != opMsg.errCode)
mainForm.nV_Mainform_TOP1.SetMachineStatus(op.ToString());
public TactTimeUtil TacktimeManager { get; set; }
public InitializeChecker initializeChecker { get; private set; }
protected void Update(OpMsg data)
foreach (var ob in listObserver)
foreach (var ob in listObserver)
if (opMsg.opMode == OP_MODE.RUN || opMsg.opMode == OP_MODE.RESET || opMsg.opMode == OP_MODE.SEMI_RUN
|| opMsg.opMode == OP_MODE.ORG_RUN || opMsg.opMode == OP_MODE.INIT)
else if (opMsg.opMode == OP_MODE.STOP || opMsg.opMode == OP_MODE.E_STOP)
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Auto_Insert_Sim_Tray.Manager
class UnSubscriber<OP_MODE> : IDisposable
private IList<IObserver<OP_MODE>> listObserver;
private IObserver<OP_MODE> observer;
public UnSubscriber(IList<IObserver<OP_MODE>> listOb, IObserver<OP_MODE> ob)
if (listObserver.Contains(observer))
listObserver.Remove(observer);
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Mechanical;
using Auto_Insert_Sim_Tray.Utils;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical
public class MIn_CV : M_Base
sSETInfo set = new sSETInfo();
public bool IsReadyPick, IsReadyPlace;
public bool IsHaveSet_CV_In;
public bool IsTriggerScanner = false;
public MIn_CV(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.IN_CV;
SetConveyor(DO._13_CV_INPUT, null, DI._14_SS_CV_IN_DETECT_1, DI._14_SS_CV_IN_DETECT_2, DI._14_SS_CV_IN_DETECT_3, ref iCV_In);
internal sSETInfo SET { get => set; set => set = value; }
public bool isIFForntReady { get; set; }
public bool isIFForntBusy { get; set; }
public void SetIFBusyToFrontMachine(bool isNormalCloseSignal)
if (!isNormalCloseSignal)
iIO.On(DO._13_IF_FRONT_BUSY);
iIO.Off(DO._13_IF_FRONT_BUSY);
public void ClearIFBusyToFrontMachine(bool isNormalCloseSignal)
if (!isNormalCloseSignal)
iIO.Off(DO._13_IF_FRONT_BUSY);
iIO.On(DO._13_IF_FRONT_BUSY);
public bool bDetect_In_Chk => iCV_In.IsInSensor();
public bool bDetect_Mid_Chk => iCV_In.IsMiddleSensor();
public bool bDetect_Out_Chk => iCV_In.IsOutSensor();
public bool bCV_In_Run => iCV_In.IsRunCW();
public bool bCV_In_Stop => !iCV_In.IsRunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_In()
return ECODE.WORK_SUCCESS;
Mechanical/CV/MInput_Left_CV.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Mechanical;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.CV
public class MInput_Left_CV : M_Base
public IConveyor iCV_Input_Left_1;
public IConveyor iCV_Input_Left_2;
public ICylinder iStopper_1_Sol;
public ICylinder iStopper_2_Sol;
public bool IsEmpty_CV_1, IsEmpty_CV_2;
public bool IsHaveTray_CV_Input_1, IsHaveTray_CV_Input_2;
public MInput_Left_CV(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.LEFT_INTRAY_CV;
SetConveyor(DO._13_CV_INTRAY_LEFT_INPUT_1, null, null, null, DI._11_SS_INTRAY_LEFT_DETECT_1, ref iCV_Input_Left_1);
SetConveyor(DO._13_CV_INTRAY_LEFT_INPUT_2, null, null, null, DI._11_SS_INTRAY_LEFT_DETECT_2, ref iCV_Input_Left_2);
SetSingleCylinder(DO._11_SOL_INTRAY_LEFT_STOPPER_1_DOWN, null, DI._11_SS_INTRAY_LEFT_STOPPER_1_UP, DI._11_SS_INTRAY_LEFT_STOPPER_1_DOWN, ref iStopper_1_Sol);
SetSingleCylinder(DO._11_SOL_INTRAY_LEFT_STOPPER_2_DOWN, null, DI._11_SS_INTRAY_LEFT_STOPPER_2_UP, DI._11_SS_INTRAY_LEFT_STOPPER_2_DOWN, ref iStopper_2_Sol);
public bool bDetect_Input_1_Chk => iCV_Input_Left_1.IsOutSensor();
public bool bStopper_Input_1_Up_Chk => iStopper_1_Sol.IsActive();
public bool bStopper_Input_1_Down_Chk => iStopper_1_Sol.IsDeactive();
public bool bDetect_Input_2_Chk => iCV_Input_Left_2.IsOutSensor();
public bool bStopper_Input_2_Up_Chk => iStopper_2_Sol.IsActive();
public bool bStopper_Input_2_Down_Chk => iStopper_2_Sol.IsDeactive();
public bool bCV_Input_Left_1_Run => iCV_Input_Left_1.IsRunCW();
public bool bCV_Input_Left_1_Stop => !iCV_Input_Left_1.IsRunCW();
public bool bStopper_Input_1_Up_Sol => iStopper_1_Sol.IsSolActive();
public bool bStopper_Input_1_Down_Sol => iStopper_1_Sol.IsSolDeactive();
public bool bCV_Input_Left_2_Run => iCV_Input_Left_2.IsRunCW();
public bool bCV_Input_Left_2_Stop => !iCV_Input_Left_2.IsRunCW();
public bool bStopper_Input_2_Up_Sol => iStopper_2_Sol.IsSolActive();
public bool bStopper_Input_2_Down_Sol => iStopper_2_Sol.IsSolDeactive();
public ECODE Run_CV_Input_Left_1()
iCV_Input_Left_1.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Input_Left_1()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_1_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_1_Down()
iStopper_1_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Run_CV_Input_Left_2()
iCV_Input_Left_2.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Input_Left_2()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_2_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_2_Down()
iStopper_2_Sol.Deactive();
return ECODE.WORK_SUCCESS;
Mechanical/CV/MInput_Right_CV.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Mechanical;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.CV
public class MInput_Right_CV : M_Base
public IConveyor iCV_Input_Right_1;
public IConveyor iCV_Input_Right_2;
public ICylinder iStopper_1_Sol;
public ICylinder iStopper_2_Sol;
public bool IsEmpty_CV_1, IsEmpty_CV_2;
public bool IsHaveTray_CV_Input_1, IsHaveTray_CV_Input_2;
public MInput_Right_CV(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.RIGHT_INTRAY_CV;
SetConveyor(DO._13_CV_INTRAY_RIGHT_INPUT_1, null, null, null, DI._12_SS_INTRAY_RIGHT_DETECT_1, ref iCV_Input_Right_1);
SetConveyor(DO._13_CV_INTRAY_RIGHT_INPUT_2, null, null, null, DI._12_SS_INTRAY_RIGHT_DETECT_2, ref iCV_Input_Right_2);
SetSingleCylinder(DO._11_SOL_INTRAY_RIGHT_STOPPER_1_DOWN, null, DI._12_SS_INTRAY_RIGHT_STOPPER_1_UP, DI._12_SS_INTRAY_RIGHT_STOPPER_1_DOWN, ref iStopper_1_Sol);
SetSingleCylinder(DO._11_SOL_INTRAY_RIGHT_STOPPER_2_DOWN, null, DI._12_SS_INTRAY_RIGHT_STOPPER_2_UP, DI._12_SS_INTRAY_RIGHT_STOPPER_2_DOWN, ref iStopper_2_Sol);
public bool isReadyTransferFromAGV { get; set; }
public bool isBusyTransferFromAGV { get; set; }
public void SetIFReadytoAGV()
iIO.On(DO._13_OUT_AGV_2_5);
public void ClearIFReadytoAGV()
iIO.Off(DO._13_OUT_AGV_2_5);
public bool bDetect_Input_1_Chk => iCV_Input_Right_1.IsOutSensor();
public bool bStopper_Input_1_Up_Chk => iStopper_1_Sol.IsActive();
public bool bStopper_Input_1_Down_Chk => iStopper_1_Sol.IsDeactive();
public bool bDetect_Input_2_Chk => iCV_Input_Right_2.IsOutSensor();
public bool bStopper_Input_2_Up_Chk => iStopper_2_Sol.IsActive();
public bool bStopper_Input_2_Down_Chk => iStopper_2_Sol.IsDeactive();
public bool bCV_Input_Right_1_Run => iCV_Input_Right_1.IsRunCW();
public bool bCV_Input_Right_1_Stop => !iCV_Input_Right_1.IsRunCW();
public bool bStopper_Input_1_Up_Sol => iStopper_1_Sol.IsSolActive();
public bool bStopper_Input_1_Down_Sol => iStopper_1_Sol.IsSolDeactive();
public bool bCV_Input_Right_2_Run => iCV_Input_Right_2.IsRunCW();
public bool bCV_Input_Right_2_Stop => !iCV_Input_Right_2.IsRunCW();
public bool bStopper_Input_2_Up_Sol => iStopper_2_Sol.IsSolActive();
public bool bStopper_Input_2_Down_Sol => iStopper_2_Sol.IsSolDeactive();
public ECODE Run_CV_Input_Right_1()
iCV_Input_Right_1.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Input_Right_1()
iCV_Input_Right_1.Stop();
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_1_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_1_Down()
iStopper_1_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Run_CV_Input_Right_2()
iCV_Input_Right_2.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Input_Right_2()
iCV_Input_Right_2.Stop();
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_2_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Input_2_Down()
iStopper_2_Sol.Deactive();
return ECODE.WORK_SUCCESS;
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Utils;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.AxisDefine;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical
public class MOut_CV : M_Base
public IConveyor iCV_Out;
sSETInfo set = new sSETInfo();
public bool IsReadyPick, IsReadyPlace;
public bool isHaveSet_CV_Out= false;
public MOut_CV(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.OUT_CV;
SetConveyor(DO._13_CV_OUTPUT, null, DI._14_SS_CV_OUT_DETECT_1 , null, DI._14_SS_CV_OUT_DETECT_2, ref iCV_Out);
internal sSETInfo SET { get => set; set => set = value; }
public bool isIFBehindBusy { get; set; }
public bool isIFBehindReady { get; set; }
public void SetIFReadyToBehindMachine(bool isNormalCloseSignal)
if (!isNormalCloseSignal)
iIO.On(DO._13_IF_BEHIND_READY);
iIO.Off(DO._13_IF_BEHIND_READY);
public void ClearIFReadyToBehindMachine(bool isNormalCloseSignal)
if (!isNormalCloseSignal)
iIO.Off(DO._13_IF_BEHIND_READY);
iIO.On(DO._13_IF_BEHIND_READY);
public bool bDetect_In_Chk => iCV_Out.IsInSensor();
public bool bDetect_Out_Chk => iCV_Out.IsOutSensor();
public bool bCV_Out_Run => iCV_Out.IsRunCW();
public bool bCV_Out_Stop => !iCV_Out.IsRunCW();
public ECODE Run_CV_Out()
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Out()
return ECODE.WORK_SUCCESS;
Mechanical/CV/MOuttray_Left_CV.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Mechanical;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.CV
public class MOuttray_Left_CV : M_Base
public IConveyor iCV_Outtray_Left_1;
public IConveyor iCV_Outtray_Left_2;
public ICylinder iStopper_1_Sol;
public ICylinder iStopper_2_Sol;
public bool IsEmpty_CV_1, IsEmpty_CV_2;
public bool IsHaveTray_CV_Outtray_1, IsHaveTray_CV_Outtray_2;
public MOuttray_Left_CV(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.LEFT_OUTTRAY_CV;
SetConveyor(DO._13_CV_OUTTRAY_LEFT_OUTPUT_1, null, null, null, DI._13_SS_OUTTRAY_LEFT_DETECT_1, ref iCV_Outtray_Left_1);
SetConveyor(DO._13_CV_OUTTRAY_LEFT_OUTPUT_2, null, null, null, DI._13_SS_OUTTRAY_LEFT_DETECT_2, ref iCV_Outtray_Left_2);
SetSingleCylinder(DO._12_SOL_OUTTRAY_STOPPER_LEFT_DOWN_1, null, DI._14_SS_OUTTRAY_LEFT_STOPPER_1_UP, DI._14_SS_OUTTRAY_LEFT_STOPPER_1_DOWN, ref iStopper_1_Sol);
SetSingleCylinder(DO._12_SOL_OUTTRAY_STOPPER_LEFT_DOWN_2, null, DI._14_SS_OUTTRAY_LEFT_STOPPER_2_UP, DI._14_SS_OUTTRAY_LEFT_STOPPER_2_DOWN, ref iStopper_2_Sol);
public bool bDetect_Outtray_1_Chk => iCV_Outtray_Left_1.IsOutSensor();
public bool bStopper_Outtray_1_Up_Chk => iStopper_1_Sol.IsActive();
public bool bStopper_Outtray_1_Down_Chk => iStopper_1_Sol.IsDeactive();
public bool bDetect_Outtray_2_Chk => iCV_Outtray_Left_2.IsOutSensor();
public bool bStopper_Outtray_2_Up_Chk => iStopper_2_Sol.IsActive();
public bool bStopper_Outtray_2_Down_Chk => iStopper_2_Sol.IsDeactive();
public bool bCV_Outtray_Left_1_Run => iCV_Outtray_Left_1.IsRunCW();
public bool bCV_Outtray_Left_1_Stop => !iCV_Outtray_Left_1.IsRunCW();
public bool bStopper_Outtray_1_Up_Sol => iStopper_1_Sol.IsSolActive();
public bool bStopper_Outtray_1_Down_Sol => iStopper_1_Sol.IsSolDeactive();
public bool bCV_Outtray_Left_2_Run => iCV_Outtray_Left_2.IsRunCW();
public bool bCV_Outtray_Left_2_Stop => !iCV_Outtray_Left_2.IsRunCW();
public bool bStopper_Outtray_2_Up_Sol => iStopper_2_Sol.IsSolActive();
public bool bStopper_Outtray_2_Down_Sol => iStopper_2_Sol.IsSolDeactive();
public ECODE Run_CV_Outtray_Left_1()
iCV_Outtray_Left_1.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Outtray_Left_1()
iCV_Outtray_Left_1.Stop();
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_1_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_1_Down()
iStopper_1_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Run_CV_Outtray_Left_2()
iCV_Outtray_Left_2.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Outtray_Left_2()
iCV_Outtray_Left_2.Stop();
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_2_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_2_Down()
iStopper_2_Sol.Deactive();
return ECODE.WORK_SUCCESS;
Mechanical/CV/MOuttray_Right_CV.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Mechanical;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.CV
public class MOuttray_Right_CV : M_Base
public IConveyor iCV_Outtray_Right_1;
public IConveyor iCV_Outtray_Right_2;
public ICylinder iStopper_1_Sol;
public ICylinder iStopper_2_Sol;
public bool IsEmpty_CV_1, IsEmpty_CV_2;
public bool IsHaveTray_CV_Outtray_1, IsHaveTray_CV_Outtray_2;
public MOuttray_Right_CV(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.RIGHT_OUTTRAY_CV;
SetConveyor(DO._13_CV_OUTTRAY_RIGHT_OUTPUT_1, null, null, null, DI._13_SS_OUTTRAY_RIGHT_DETECT_1, ref iCV_Outtray_Right_1);
SetConveyor(DO._13_CV_OUTTRAY_RIGHT_OUTPUT_2, null, null, null, DI._13_SS_OUTTRAY_RIGHT_DETECT_2, ref iCV_Outtray_Right_2);
SetSingleCylinder(DO._12_SOL_OUTTRAY_STOPPER_RIGHT_DOWN_1, null, DI._14_SS_OUTTRAY_RIGHT_STOPPER_1_UP, DI._14_SS_OUTTRAY_RIGHT_STOPPER_1_DOWN, ref iStopper_1_Sol);
SetSingleCylinder(DO._12_SOL_OUTTRAY_STOPPER_RIGHT_DOWN_2, null, DI._14_SS_OUTTRAY_RIGHT_STOPPER_2_UP, DI._14_SS_OUTTRAY_RIGHT_STOPPER_2_DOWN, ref iStopper_2_Sol);
public bool bDetect_Outtray_1_Chk => iCV_Outtray_Right_1.IsOutSensor();
public bool bStopper_Outtray_1_Up_Chk => iStopper_1_Sol.IsActive();
public bool bStopper_Outtray_1_Down_Chk => iStopper_1_Sol.IsDeactive();
public bool bDetect_Outtray_2_Chk => iCV_Outtray_Right_2.IsOutSensor();
public bool bStopper_Outtray_2_Up_Chk => iStopper_2_Sol.IsActive();
public bool bStopper_Outtray_2_Down_Chk => iStopper_2_Sol.IsDeactive();
public bool bCV_Outtray_Right_1_Run => iCV_Outtray_Right_1.IsRunCW();
public bool bCV_Outtray_Right_1_Stop => !iCV_Outtray_Right_1.IsRunCW();
public bool bStopper_Outtray_1_Up_Sol => iStopper_1_Sol.IsSolActive();
public bool bStopper_Outtray_1_Down_Sol => iStopper_1_Sol.IsSolDeactive();
public bool bCV_Outtray_Right_2_Run => iCV_Outtray_Right_2.IsRunCW();
public bool bCV_Outtray_Right_2_Stop => !iCV_Outtray_Right_2.IsRunCW();
public bool bStopper_Outtray_2_Up_Sol => iStopper_2_Sol.IsSolActive();
public bool bStopper_Outtray_2_Down_Sol => iStopper_2_Sol.IsSolDeactive();
public ECODE Run_CV_Outtray_Right_1()
iCV_Outtray_Right_1.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Outtray_Right_1()
iCV_Outtray_Right_1.Stop();
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_1_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_1_Down()
iStopper_1_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Run_CV_Outtray_Right_2()
iCV_Outtray_Right_2.RunCW();
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Outtray_Right_2()
iCV_Outtray_Right_2.Stop();
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_2_Up()
return ECODE.WORK_SUCCESS;
public ECODE Stopper_Outtray_2_Down()
iStopper_2_Sol.Deactive();
return ECODE.WORK_SUCCESS;
Mechanical/Intray/MIntray_Base.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using Auto_Insert_Sim_Tray.Utils;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.AxisDefine;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.Intray
public abstract class MIntray_Base : M_Base
public object Intray_Detect_4_Chk;
public ICylinder iHold_Sol;
public ICylinder iSeperate_Sol;
public ICylinder iElevator_1_Sol;
public ICylinder iElevator_2_Sol;
public ICylinder iRemove_Down_Sol;
public ICylinder iRemove_BW_Sol;
public ICylinder iAlign_Sol;
public ICylinder iAlign_Top_Sol;
public IConveyor iCV_Work;
public bool IsHaveTray_Work_Left, IsHaveTray_Align_Left, IsHaveTray_Work_Right, IsHaveTray_Align_Right;
public bool IsAlign_Done_Left, IsAlign_Done_Right;
public PulseIO PulseTray;
public bool IsHaveNew_Tray;
public bool bHold_On_Chk => iHold_Sol.IsActive();
public bool bHold_Off_Chk => iHold_Sol.IsDeactive();
public bool bSeparate_On_Chk => iSeperate_Sol.IsActive();
public bool bSeparate_Off_Chk => iSeperate_Sol.IsDeactive();
public bool bElevator_1_FW_Chk => iElevator_1_Sol.IsActive();
public bool bElevator_1_BW_Chk => iElevator_1_Sol.IsDeactive();
public bool bElevator_2_FW_Chk => iElevator_2_Sol.IsActive();
public bool bElevator_2_BW_Chk => iElevator_2_Sol.IsDeactive();
public bool bRemove_Up_Chk => iRemove_Down_Sol.IsActive();
public bool bRemove_Down_Chk => iRemove_Down_Sol.IsDeactive();
public bool bRemove_FW_Chk => iRemove_BW_Sol.IsActive();
public bool bRemove_BW_Chk => iRemove_BW_Sol.IsDeactive();
public bool bAlign_On_Chk => iAlign_Sol.IsActive();
public bool bAlign_Off_Chk => iAlign_Sol.IsDeactive();
public bool bAlign_Top_On_Chk => iAlign_Top_Sol.IsActive();
public bool bIntray_Detect_4 => iIO.IsOn(Intray_Detect_4_Chk);
public bool bIntray_Detect_3 => iCV_Work.IsOutSensor();
public bool bHold_On_Sol => iHold_Sol.IsSolActive();
public bool bHold_Off_Sol => iHold_Sol.IsSolDeactive();
public bool bSeparate_On_Sol => iSeperate_Sol.IsSolActive();
public bool bSeparate_Off_Sol => iSeperate_Sol.IsSolDeactive();
public bool bElevator_1_FW_Sol => iElevator_1_Sol.IsSolActive();
public bool bElevator_1_BW_Sol => iElevator_1_Sol.IsSolDeactive();
public bool bElevator_2_FW_Sol => iElevator_2_Sol.IsSolActive();
public bool bElevator_2_BW_Sol => iElevator_2_Sol.IsSolDeactive();
public bool bRemove_Up_Sol => iRemove_Down_Sol.IsSolActive();
public bool bRemove_Down_Sol => iRemove_Down_Sol.IsSolDeactive();
public bool bRemove_FW_Sol => iRemove_BW_Sol.IsSolActive();
public bool bRemove_BW_Sol => iRemove_BW_Sol.IsSolDeactive();
public bool bAlign_On_Sol => iAlign_Sol.IsSolActive();
public bool bAlign_Off_Sol => iAlign_Sol.IsSolDeactive();
public bool bAlign_Top_On_Sol => iAlign_Top_Sol.IsSolActive();
public bool bAlign_Top_Off_Sol => iAlign_Top_Sol.IsSolDeactive();
public bool bCV_Work_Run => iCV_Work.IsRunCW();
public bool bCV_Work_Stop => !iCV_Work.IsRunCW();
return ECODE.WORK_SUCCESS;
return ECODE.WORK_SUCCESS;
public ECODE Separate_On()
return ECODE.WORK_SUCCESS;
public ECODE Separate_Off()
iSeperate_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Elevator_1_FW()
iElevator_1_Sol.Active();
return ECODE.WORK_SUCCESS;
public ECODE Elevator_1_BW()
iElevator_1_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Elevator_2_FW()
iElevator_2_Sol.Active();
return ECODE.WORK_SUCCESS;
public ECODE Elevator_2_BW()
iElevator_2_Sol.Deactive();
return ECODE.WORK_SUCCESS;
iRemove_Down_Sol.Active();
return ECODE.WORK_SUCCESS;
public ECODE Remove_Down()
iRemove_Down_Sol.Deactive();
return ECODE.WORK_SUCCESS;
return ECODE.WORK_SUCCESS;
iRemove_BW_Sol.Deactive();
return ECODE.WORK_SUCCESS;
return ECODE.WORK_SUCCESS;
return ECODE.WORK_SUCCESS;
public ECODE Align_Top_On()
return ECODE.WORK_SUCCESS;
public ECODE Align_Top_Off()
iAlign_Top_Sol.Deactive();
return ECODE.WORK_SUCCESS;
public ECODE Run_CV_Work()
return ECODE.WORK_SUCCESS;
public ECODE Stop_CV_Work()
return ECODE.WORK_SUCCESS;
Mechanical/Intray/MIntray_Left.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.AxisDefine;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.Intray
public class MIntray_Left : MIntray_Base
public MIntray_Left(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.INTRAY_LEFT;
SetDoubleCylinder(DO._11_SOL_INTRAY_LEFT_HOLD_ON,
DO._11_SOL_INTRAY_LEFT_HOLD_OFF,
DI._11_SS_INTRAY_LEFT_HOLD_ON,
DI._11_SS_INTRAY_LEFT_HOLD_OFF, ref iHold_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_LEFT_SEPERATE_ON,
DO._11_SOL_INTRAY_LEFT_SEPERATE_OFF,
DI._11_SS_INTRAY_LEFT_SEPERATE_ON,
DI._11_SS_INTRAY_LEFT_SEPERATE_OFF, ref iSeperate_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_LEFT_ELEVATOR_1_FW,
DO._11_SOL_INTRAY_LEFT_ELEVATOR_1_BW,
DI._11_SS_INTRAY_LEFT_ELEVATOR_1_FW,
DI._11_SS_INTRAY_LEFT_ELEVATOR_1_BW, ref iElevator_1_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_LEFT_ELEVATOR_2_FW,
DO._11_SOL_INTRAY_LEFT_ELEVATOR_2_BW,
DI._11_SS_INTRAY_LEFT_ELEVATOR_2_FW,
DI._11_SS_INTRAY_LEFT_ELEVATOR_2_BW, ref iElevator_2_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_LEFT_REMOVE_UP,
DO._11_SOL_INTRAY_LEFT_REMOVE_DOWN,
DI._11_SS_INTRAY_LEFT_REMOVE_UP,
DI._11_SS_INTRAY_LEFT_REMOVE_DOWN, ref iRemove_Down_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_LEFT_REMOVE_FW,
DO._11_SOL_INTRAY_LEFT_REMOVE_BW,
DI._11_SS_INTRAY_LEFT_REMOVE_FW,
DI._11_SS_INTRAY_LEFT_REMOVE_BW, ref iRemove_BW_Sol);
SetSingleCylinder(DO._11_SOL_INTRAY_LEFT_ALIGN_OFF,
DI._11_SS_INTRAY_LEFT_ALIGN_ON,
DI._11_SS_INTRAY_LEFT_ALIGN_OFF, ref iAlign_Sol);
SetSingleCylinder(DO._11_SOL_INTRAY_LEFT_ALIGN_TOP_OFF,
DI._11_SS_INTRAY_LEFT_ALIGN_TOP_ON,
null, ref iAlign_Top_Sol);
Set_IO_Value(DI._11_SS_INTRAY_LEFT_DETECT_4, ref Intray_Detect_4_Chk);
SetConveyor(DO._13_CV_INTRAY_LEFT_WORK, null, null, null, DI._11_SS_INTRAY_LEFT_DETECT_3, ref iCV_Work);
PulseTray = new Utils.PulseIO(this.iIO, DI._11_SS_INTRAY_LEFT_DETECT_4);
Mechanical/Intray/MIntray_Right.cs
using Auto_Insert_Sim_Tray.HW.Interface;
using System.Collections.Generic;
using System.Threading.Tasks;
using static Auto_Insert_Sim_Tray.Define.AxisDefine;
using static Auto_Insert_Sim_Tray.Define.IODefine;
using static Auto_Insert_Sim_Tray.Define.SystemEnum;
namespace Auto_Insert_Sim_Tray.Mechanical.Intray
public class MIntray_Right : MIntray_Base
public MIntray_Right(IIO iIO, IAxis iAxis)
Unit_Type = UNIT_TYPE.INTRAY_RIGHT;
SetDoubleCylinder(DO._11_SOL_INTRAY_RIGHT_HOLD_ON,
DO._11_SOL_INTRAY_RIGHT_HOLD_OFF,
DI._12_SS_INTRAY_RIGHT_HOLD_ON,
DI._12_SS_INTRAY_RIGHT_HOLD_OFF, ref iHold_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_RIGHT_SEPERATE_ON,
DO._11_SOL_INTRAY_RIGHT_SEPERATE_OFF,
DI._12_SS_INTRAY_RIGHT_SEPERATE_ON,
DI._12_SS_INTRAY_RIGHT_SEPERATE_OFF, ref iSeperate_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_RIGHT_ELEVATOR_1_FW,
DO._11_SOL_INTRAY_RIGHT_ELEVATOR_1_BW,
DI._12_SS_INTRAY_RIGHT_ELEVATOR_1_FW,
DI._12_SS_INTRAY_RIGHT_ELEVATOR_1_BW, ref iElevator_1_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_RIGHT_ELEVATOR_2_FW,
DO._11_SOL_INTRAY_RIGHT_ELEVATOR_2_BW,
DI._12_SS_INTRAY_RIGHT_ELEVATOR_2_FW,
DI._12_SS_INTRAY_RIGHT_ELEVATOR_2_BW, ref iElevator_2_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_RIGHT_REMOVE_UP,
DO._11_SOL_INTRAY_RIGHT_REMOVE_DOWN,
DI._12_SS_INTRAY_RIGHT_REMOVE_UP,
DI._12_SS_INTRAY_RIGHT_REMOVE_DOWN, ref iRemove_Down_Sol);
SetDoubleCylinder(DO._11_SOL_INTRAY_RIGHT_REMOVE_FW,
DO._11_SOL_INTRAY_RIGHT_REMOVE_BW,
DI._12_SS_INTRAY_RIGHT_REMOVE_FW,
DI._12_SS_INTRAY_RIGHT_REMOVE_BW, ref iRemove_BW_Sol);
SetSingleCylinder(DO._11_SOL_INTRAY_RIGHT_ALIGN_OFF,
DI._12_SS_INTRAY_RIGHT_ALIGN_ON,
DI._12_SS_INTRAY_RIGHT_ALIGN_OFF, ref iAlign_Sol);
SetSingleCylinder(DO._11_SOL_INTRAY_RIGHT_ALIGN_TOP_OFF,
DI._12_SS_INTRAY_RIGHT_ALIGN_TOP_ON,
null, ref iAlign_Top_Sol);
Set_IO_Value(DI._12_SS_INTRAY_RIGHT_DETECT_4, ref Intray_Detect_4_Chk);
SetConveyor(DO._13_CV_INTRAY_RIGHT_WORK, null, null, null, DI._12_SS_INTRAY_RIGHT_DETECT_3, ref iCV_Work);
PulseTray = new Utils.PulseIO(this.iIO, DI._12_SS_INTRAY_RIGHT_DETECT_4);