using Aurora.Api;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AuroraIO
{
public class InfoIO
{
public const int WAIT_FOR_INTERLOCK_TIMEOUT = 1;
public const int WAIT_FOR_SENSOR_TIMEOUT = 2;
public const int DISABLE_TO_SET_IO = 3;
public enum IoType
{
DI,
DO,
AI,
AO,
EnumSize
}
public enum ActiveLevelType
{
High,
Low,
EnumSize
}
public enum InfoName
{
Index,
Address,
Description,
ID,
EnumSize
}
public enum eReactiveLayerStateType //ReactiveLayer 상태
{
IDLE, //초기화 전
READY, //초기화 후
RUN,
PAUSE,//일시 정지
HEAVYALARM, //Heavy Alarm
LIGHTALARM
};
public enum eReactiveLayerOperationType //ReactiveLayer 운전 모드
{
None,
Manual,
SemiAuto,
DryRun,
Auto
};
///
/// index 번호
///
int index = 0;
public int Index {
get { lock (this) { return index; } }
set { lock (this) { index = value; } }
}
///
/// 전장에서 사용하는 넘버링
///
string address = string.Empty;
public string Address {
get { lock (this) { return address; } }
set { lock (this) { address = value; } }
}
///
/// IO name
///
string id = string.Empty;
public string ID {
get { lock (this) { return id; } }
set { lock (this) { id = value; } }
}
///
/// IO Description
///
string description = string.Empty;
public string Description {
get { lock (this) { return description; } }
set { lock (this) { description = value; } }
}
/////
///// DO High 설정을 위해 필요한 조건
/////
//List highNecCond = new List();
//public List HighNecCond
//{
// get { lock (this) { return highNecCond; } }
// set { lock (this) { highNecCond = value; } }
//}
/////
///// DO low 설정을 위해 필요한 조건
/////
//List lowhNecCond = new List();
//public List LowhNecCond
//{
// get { lock (this) { return lowhNecCond; } }
// set { lock (this) { lowhNecCond = value; } }
//}
/////
///// DO High 설정시 DI 센서 입력
/////
//List highSensor = new List();
//public List HighSensor
//{
// get { lock (this) { return highSensor; } }
// set { lock (this) { highSensor = value; } }
//}
/////
///// DO High 설정시 DI 센서 입력
/////
//List lowSensor = new List();
//public List LowSensor
//{
// get { lock (this) { return lowSensor; } }
// set { lock (this) { lowSensor = value; } }
//}
//public int waitInterlockTimeout = 0;
//public int WaitInterlockTimeout
//{
// get { lock (this) { return waitInterlockTimeout; } }
// set { lock (this) { waitInterlockTimeout = value; } }
//}
//public int waitSensorTimeout = 0;
//public int WaitSensorTimeout
//{
// get { lock (this) { return waitSensorTimeout; } }
// set { lock (this) { waitSensorTimeout = value; } }
//}
/////
///// DI High 시에 설정할 DO
/////
//List highSufCond = new List();
//public List HighSufCond
//{
// get { lock (this) { return highSufCond; } }
// set { lock (this) { highSufCond = value; } }
//}
/////
///// DI low 시에 설정할 DO
/////
//List lowSufCond = new List();
//public List LowSufCond
//{
// get { lock (this) { return lowSufCond; } }
// set { lock (this) { lowSufCond = value; } }
//}
public List GetConditionList(string conditions)
{
List necConds = new List();
char[] separator = { '&', '|' };
string[] condition = conditions.Split(separator);
for (int i = 0; i < condition.Length; i++) {
if (condition[i].Contains('_')) {
string[] cond = condition[i].Split('_');
if (cond.Length != (int)ConditionInfo.ConditionInfoName.EnumSize) {
throw new Exception("IO Condition Data Length wrong!!");
}
int index = 0;
string temp = cond[index++];
ConditionInfo.eConditionType condType =
temp == ConditionInfo.eConditionType.DI.ToString() ? ConditionInfo.eConditionType.DI :
temp == ConditionInfo.eConditionType.DO.ToString() ? ConditionInfo.eConditionType.DO :
temp == ConditionInfo.eConditionType.AI.ToString() ? ConditionInfo.eConditionType.AI :
temp == ConditionInfo.eConditionType.AO.ToString() ? ConditionInfo.eConditionType.AI : ConditionInfo.eConditionType.STATE;
temp = cond[index++];
int ioNumber = -1;
eReactiveLayerStateType machineState = eReactiveLayerStateType.IDLE;
if (condType == ConditionInfo.eConditionType.STATE) {
machineState = temp == eReactiveLayerStateType.IDLE.ToString() ? eReactiveLayerStateType.IDLE :
temp == eReactiveLayerStateType.RUN.ToString() ? eReactiveLayerStateType.RUN :
temp == eReactiveLayerStateType.HEAVYALARM.ToString() ? eReactiveLayerStateType.HEAVYALARM :
temp == eReactiveLayerStateType.LIGHTALARM.ToString() ? eReactiveLayerStateType.LIGHTALARM :
temp == eReactiveLayerStateType.PAUSE.ToString() ? eReactiveLayerStateType.PAUSE : eReactiveLayerStateType.READY;
} else {
ioNumber = int.Parse(temp);
}
temp = cond[index++];
bool logic = bool.Parse(temp);
ConditionInfo necCond = new ConditionInfo(condType, machineState, ioNumber, logic);
necConds.Add(necCond);
}
}
return necConds;
}
public class ConditionInfo
{
public enum ConditionInfoName
{
ConditionType,
LogicType,
ioNumber,
EnumSize,
}
public enum eMachineStateType
{
IDLE, //초기화 전
READY, //초기화 후
RUN,
PAUSE,//일시 정지
HEAVYALARM, //Heavy Alarm
LIGHTALARM
}
public enum eConditionType { DI, DO, AI, AO, STATE }
eConditionType conditionType = eConditionType.STATE;
public eConditionType ConditionType {
get { lock (this) { return conditionType; } }
set { lock (this) { conditionType = value; } }
}
bool logicType = true;
public bool LogicType {
get { lock (this) { return logicType; } }
set { lock (this) { logicType = value; } }
}
public eReactiveLayerStateType machineState = eReactiveLayerStateType.IDLE;
public eReactiveLayerStateType MachineState {
get { lock (this) { return machineState; } }
set { lock (this) { machineState = value; } }
}
public int ioNumber = -1;
public int IoNumber {
get { lock (this) { return ioNumber; } }
set { lock (this) { ioNumber = value; } }
}
public ConditionInfo(eConditionType type, eReactiveLayerStateType state, int no, bool logic)
{
conditionType = type;
ioNumber = no;
machineState = state;
logicType = logic;
}
}
public bool ConvertIOInfo(params string[] data)
{
try {
bool rv = false;
if (data.Length != (int)InfoName.EnumSize) {
throw new Exception("IO Data Length wrong!!");
}
int index = 0;
Index = int.Parse(data[index++]);
Address = data[index++];
ID = data[index++];
description = data[index++];
//string temp = data[index++];
//IoType iotype =
// temp == IoType.DI.ToString() ? IoType.DI :
// temp == IoType.DO.ToString() ? IoType.DO :
// temp == IoType.AI.ToString() ? IoType.AI : IoType.AO;
//IOType = iotype;
//temp = data[index++];
//ActiveLevelType activeLevel = temp == ActiveLevelType.High.ToString() ? ActiveLevelType.High : ActiveLevelType.Low;
//ActiveLevel = activeLevel;
//BoardNo = int.Parse(data[index++]);
//Description = data[index++];
//HighNecCond = GetConditionList(data[index++]);
//LowhNecCond = GetConditionList(data[index++]);
//HighSensor = GetConditionList(data[index++]);
//LowSensor = GetConditionList(data[index++]);
//WaitInterlockTimeout = int.Parse(data[index++]);
//WaitSensorTimeout = int.Parse(data[index++]);
//HighSufCond = GetConditionList(data[index++]);
//LowSufCond = GetConditionList(data[index++]);
rv = true;
return rv;
} catch {
throw;
}
}
}
public abstract class IOUnit
{
protected Logger Log = new Logger("IO_Unit");
protected IConnConfig _connConfig;
string ioMappingFolder = "";
public string IOMappingFolder {
get { lock (this) { return ioMappingFolder; } }
set { lock (this) { ioMappingFolder = value; } }
}
List lstDI = new List();
public List ListDI {
get { lock (this) { return lstDI; } }
}
List lstDO = new List();
public List ListDO {
get { lock (this) { return lstDO; } }
}
List lstAI = new List();
public List ListAI {
get { lock (this) { return lstAI; } }
}
List lstAO = new List();
public List ListAO {
get { lock (this) { return lstAO; } }
}
#region 추상함수 선언
public abstract int Open(string iP);
public abstract void Close();
public abstract int Initialize();
public abstract void Instance(string mappingFolder);
public abstract bool IsConnected();
public abstract int GetDICount();
public abstract int GetDOCount();
public abstract int GetAICount();
public abstract int GetAOCount();
public abstract int GetDoArray(ref bool[] array);
public abstract int GetDiArray(ref bool[] array);
public abstract int ReadDoBit(int index, ref bool bit);
public abstract int ReadDiBit(int index, ref bool bit);
public abstract bool ReadDoBit(int index);
public abstract bool ReadDiBit(int index);
public abstract int WriteDoBit(int index, bool bit);
public abstract void ClearList();
#endregion
public int GetDiIndex(string id)
{
int index = -1;
foreach (InfoIO io in ListDI) {
if (io.ID == id) {
return io.Index;
}
}
return index;
}
public int GetDoIndex(string id)
{
int index = -1;
foreach (InfoIO io in ListDO) {
if (io.ID == id) {
return io.Index;
}
}
return index;
}
public int GetAiIndex(string id)
{
int index = -1;
foreach (InfoIO io in ListAI) {
if (io.ID == id) {
return io.Index;
}
}
return index;
}
public int GetAoIndex(string id)
{
int index = -1;
foreach (InfoIO io in ListAO) {
if (io.ID == id) {
return io.Index;
}
}
return index;
}
public string GetDiID(int index)
{
return ListDI[index].ID;
}
public string GetDOID(int index)
{
return ListDO[index].ID;
}
public string GetAiID(int index)
{
return ListAI[index].ID;
}
public string GetAoID(int index)
{
return ListAO[index].ID;
}
public void InterruptCallbackFunction(int nModuleNo, uint uFlag)
{
uint uValue = 0;
int inputCounts = ListDI.Count;
CAXD.AxdiReadInportBit(nModuleNo, (int)uFlag, ref uValue);
if (uValue == 1) {
//Rising Edge
} else {
//Falling Edge
}
}
}
}