using Aurora.Util.HislogPlus; using AuroraPLC; using Hermes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WeldingCommon.Devices; namespace ILSOS_CCW_H52A.Device { partial class PLCControllerCCWH52A { public (int err, bool data) ReadBit(eBitInput inputAddr, ePLCDevice device = ePLCDevice.B, bool isInput = true) => base.ReadBit((int)inputAddr, device, isInput); public int WriteBit(eBitOutput outputAddr, bool onOff, ePLCDevice device = ePLCDevice.B, bool isOutput = true) => base.WriteBit((int)outputAddr, onOff, device, isOutput); public (int err, short data) ReadWord(eWordInput inputAddr, ePLCDevice device = ePLCDevice.W, bool isInput = true) => base.ReadWord((int)inputAddr, device, isInput); public int WriteWord(eWordOutput outputAddr, short shData, ePLCDevice device = ePLCDevice.W, bool isOutput = true) => base.WriteWord((int)outputAddr, shData, device, isOutput); public (int err, int data) ReadDWord(eWordInput inputAddr, ePLCDevice device = ePLCDevice.W, bool isInput = true) => base.ReadDWord((int)inputAddr, device, isInput); public int WriteDWord(eWordOutput outputAddr, int iVal, ePLCDevice device = ePLCDevice.W, bool isOutput = true) => base.WriteDWord((int)outputAddr, iVal, device, isOutput); public (int err, short[] datas) ReadWords(eWordInput startAddress, eWordInput endAddress, ePLCDevice device = ePLCDevice.W, bool isInput = true) => base.ReadWordBlock((int)startAddress, endAddress - startAddress + 1, device, isInput); public int WriteWords(eWordOutput startAddress, eWordOutput endAddress, short[] data, ePLCDevice device = ePLCDevice.W, bool isOutput = true) => base.WriteWordBlock((int)startAddress, endAddress - startAddress, data, device, isOutput); public string ReadASCII(eWordInput start, eWordInput end) { StringBuilder sb = new StringBuilder(); var words = ReadWords(start, end); foreach (var word in words.datas) sb.Append(Conv_ReadData(PLCBase.eDataType.Type_Ascii, word, 0, false, false)); return sb.ToString(); } public int WriteWordToBit((eWordOutput addrOffset, int bitNo) address, bool on) { var value = base.ReadWord((int)address.addrOffset, ePLCDevice.W, false); short current = value.data; if (on) { current |= (short)(1 << address.bitNo); } else { current &= (short)~(1 << address.bitNo); } return base.WriteWord((int)address.addrOffset, current, ePLCDevice.W); } public bool ReadWordToBit((eWordInput addrOffset, int bitNo) address) { short current = ReadWord(address.addrOffset).data; return (current & (1 << address.bitNo)) != 0; } public IEnumerable ReadWordToBits(eWordInput address, bool isLowerFirst = true) { var ret = new List(); int word = ReadWord(address).data; if (isLowerFirst) { for (int idx = 0; idx < 15; idx++) ret.Add((word & (1 << idx)) != 0); } else { for (int idx = 15; idx > 0; idx--) ret.Add((word & (1 << idx)) != 0); } return ret; } public override void MappingPLCAddr() { PLC_AUTO_REQAddr = (int)eBitInput.PLC_AUTO_REQ; PLC_MANUAL_REQAddr = (int)eBitInput.PLC_MANUAL_REQ; PLC_RECIPE_CHANGE_REQAddr = (int)eBitInput.PLC_RECIPE_CHANGE_REQ; PLC_RECIPE_CHANGE_COMPLETE_ARKAddr = (int)eBitInput.PLC_RECIPE_CHANGE_COMP_ARK; PLC_RECIPE_NOAddr = (int)eWordInput.PLC_RECIPE_NO; PLC_LIVE_STATUSAddr = (int)eBitInput.PLC_LIVE_STATUS; PLC_EMO_STATUSAddr = (int)eBitInput.PLC_EMO_STATUS; PLC_USE_DISPLACEMENT_SENSORAddr = (int)eBitInput.PLC_USE_DISPLACEMENT_SENSOR; //용접 변위센서 사용 PLC_STAGE_MOVINGAddr = (int)eBitInput.PLC_STAGE_MOVING; //Rotary Stage가 움직이고 있을 때 On PLC_USE_WELD_JIG_1Addr = (int)eBitInput.PLC_USE_WELD_JIG_1; //지그 1번 용접수행 여부 PLC_USE_WELD_JIG_2Addr = (int)eBitInput.PLC_USE_WELD_JIG_2; //지그 2번 용접수행 여부 PLC_USE_WELD_JIG_3Addr = (int)eBitInput.PLC_USE_WELD_JIG_3; //지그 3번 용접수행 여부 PLC_USE_WELD_JIG_4Addr = (int)eBitInput.PLC_USE_WELD_JIG_4; //지그 4번 용접수행 여부 PLC_USE_WELD_JIG_5Addr = (int)eBitInput.PLC_USE_WELD_JIG_5; //지그 5번 용접수행 여부 PLC_USE_WELD_JIG_6Addr = (int)eBitInput.PLC_USE_WELD_JIG_6; //지그 6번 용접수행 여부 PLC_USE_WELD_JIG_7Addr = (int)eBitInput.PLC_USE_WELD_JIG_7; //지그 7번 용접수행 여부 PLC_USE_WELD_JIG_8Addr = (int)eBitInput.PLC_USE_WELD_JIG_8; //지그 8번 용접수행 여부 PLC_USE_WELD_JIG_9Addr = (int)eBitInput.PLC_USE_WELD_JIG_9; //지그 9번 용접수행 여부 PLC_USE_WELD_JIG_10Addr = (int)eBitInput.PLC_USE_WELD_JIG_10; //지그 10번 용접수행 여부 PLC_USE_WELD_JIG_11Addr = (int)eBitInput.PLC_USE_WELD_JIG_11; //지그 11번 용접수행 여부 PLC_USE_WELD_JIG_12Addr = (int)eBitInput.PLC_USE_WELD_JIG_12; //지그 12번 용접수행 여부 PLC_USE_WELD_JIG_13Addr = (int)eBitInput.PLC_USE_WELD_JIG_13; //지그 13번 용접수행 여부 PLC_USE_WELD_JIG_14Addr = (int)eBitInput.PLC_USE_WELD_JIG_14; //지그 14번 용접수행 여부 PLC_USE_WELD_JIG_15Addr = (int)eBitInput.PLC_USE_WELD_JIG_15; //지그 15번 용접수행 여부 PLC_USE_WELD_JIG_16Addr = (int)eBitInput.PLC_USE_WELD_JIG_16; //지그 16번 용접수행 여부 PC_LIVE_STATUSAddr = (int)eBitOutput.PC_LIVE_STATUS; PC_AUTO_STATUSAddr = (int)eBitOutput.PC_AUTO_STATUS; //PC 자동운전 상태 PC_AUTO_COMPLETEAddr = (int)eBitOutput.PC_AUTO_COMPLETE; //PC 자동운전 변경 완료 PC_MANUAL_COMPLETEAddr = (int)eBitOutput.PC_MANUAL_COMPLETE; //PC 수동운전 변경 완료 PC_LIGHT_ALARM_STATUSAddr = (int)eBitOutput.PC_LIGHT_ALARM_STATUS; //PC 경알람 상태 PC_HEAVY_ALARM_STATUSAddr = (int)eBitOutput.PC_HEAVY_ALARM_STATUS; //PC 중알람 상태 PC_RECIPE_CHANGE_COMPLETEAddr = (int)eBitOutput.PC_RECIPE_CHANGE_COMPLETE; //PC 레시피 변경 완료 PC_LASER_READYAddr = (int)eBitOutput.PC_LASER_READY; //PC Laser Ready 상태 PC_LASER_ONAddr = (int)eBitOutput.PC_LASER_ON; PC_WELD_COMPLETE_1Addr = (int)eBitOutput.PC_WELD_COMPLETE_1; //지그 1번 용접완료 여부 PC_WELD_COMPLETE_2Addr = (int)eBitOutput.PC_WELD_COMPLETE_2; //지그 2번 용접완료 여부 PC_WELD_COMPLETE_3ADdr = (int)eBitOutput.PC_WELD_COMPLETE_3; //지그 3번 용접완료 여부 PC_WELD_COMPLETE_4Addr = (int)eBitOutput.PC_WELD_COMPLETE_4; //지그 4번 용접완료 여부 PC_WELD_COMPLETE_5Addr = (int)eBitOutput.PC_WELD_COMPLETE_5; //지그 5번 용접완료 여부 PC_WELD_COMPLETE_6Addr = (int)eBitOutput.PC_WELD_COMPLETE_6; //지그 6번 용접완료 여부 PC_WELD_COMPLETE_7Addr = (int)eBitOutput.PC_WELD_COMPLETE_7; //지그 7번 용접완료 여부 PC_WELD_COMPLETE_8Addr = (int)eBitOutput.PC_WELD_COMPLETE_8; //지그 8번 용접완료 여부 PC_WELD_COMPLETE_9Addr = (int)eBitOutput.PC_WELD_COMPLETE_9; //지그 9번 용접완료 여부 PC_WELD_COMPLETE_10Addr = (int)eBitOutput.PC_WELD_COMPLETE_10; //지그 10번 용접완료 여부 PC_WELD_COMPLETE_11Addr = (int)eBitOutput.PC_WELD_COMPLETE_11; //지그 11번 용접완료 여부 PC_WELD_COMPLETE_12Addr = (int)eBitOutput.PC_WELD_COMPLETE_12; //지그 12번 용접완료 여부 PC_WELD_COMPLETE_13Addr = (int)eBitOutput.PC_WELD_COMPLETE_13; //지그 13번 용접완료 여부 PC_WELD_COMPLETE_14Addr = (int)eBitOutput.PC_WELD_COMPLETE_14; //지그 14번 용접완료 여부 PC_WELD_COMPLETE_15Addr = (int)eBitOutput.PC_WELD_COMPLETE_15; //지그 15번 용접완료 여부 PC_WELD_COMPLETE_16Addr = (int)eBitOutput.PC_WELD_COMPLETE_16; //지그 16번 용접완료 여부 } public double ReadDWordByDivision(eWordInput input) { var result = ReadDWord((int)input); if (result.err != E1.OK) { // 로그 에러 넣기 //Log.E("Error While Reading Double Word Division {0}", result.err.ToString()); } double divisionIndex = ConvertTo2WordDivisionIndex(input.ToString()); return (result.data / (double)divisionIndex); } public int ConvertTo2WordDivisionIndex(string id) { if (id.Contains("RECIPE") || id.Contains("RAMPING_START_POWER") || id.Contains("RAMPING_START_A_POWER") || id.Contains("RAMPING_START_B_POWER") || id.Contains("RAMPING_END_POWER") || id.Contains("DELAY")) return 1; else if (id.Contains("LASER_POWER") || id.Contains("SPEED")) return 10; else return 1000; } public int ToggleBit(eBitInput readBit, eBitOutput writeBit) { int ret = 0; if (ReadBit(readBit).data) ret = WriteBit(writeBit, false); else ret = WriteBit(writeBit, true); Log.I($"{Enum.GetName(typeof(eBitOutput), writeBit)} -> {!ReadBit(readBit).data}"); return ret; } } }