using System; using System.Globalization; using System.Text; using System.Threading; namespace SA_LTT.Module { /// /// Omron temp controller /// public class E5CC : ComPort { private struct VariableArea { public string Node; public string slaveAddress; public string functionCode; public string MRC; public string SRC; public string responseCode; public string readData; } /// /// Start of text /// private char STX = Convert.ToChar(2); /// /// End of text /// private char EXT = Convert.ToChar(3); private int _temperature; private Equipment _equipment; private Thread t_statusUpdate; public int Temperature { get { return _temperature; } set { _temperature = value; } } public E5CC(Equipment equipment) { serialPort.PortName = "COM6"; serialPort.BaudRate = 9600; serialPort.Parity = System.IO.Ports.Parity.Even; serialPort.DataBits = 7; serialPort.StopBits = System.IO.Ports.StopBits.Two; serialPort.Handshake = System.IO.Ports.Handshake.RequestToSend; serialPort.ReadTimeout = 1000; ReceiveWaitSeconds = 0.1; Terminator = null; _equipment = equipment; t_statusUpdate = new Thread(statusUpdate); t_statusUpdate.Start(); } public void statusUpdate() { while (_equipment.IsDisposed == false) { try { Thread.Sleep(500); if (IsOpen) { // Todo. Command 설정. ReadCurrentTemperature(); } else { if (_equipment.alarmManager.OccurredAlarms.Exists(x => x.Code == AlarmCode.AL_0054_TEMPCONTROLER_DISCONNECTED)) { } else { if (Open() == false) { _equipment.alarmManager.Occur(AlarmCode.AL_0054_TEMPCONTROLER_DISCONNECTED); } } } } catch (Exception e) { EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace); } } } private char GetCyclicRedundancyCheck(string command) { byte[] commandBytes = Encoding.Default.GetBytes(command); string formmatedCommand = string.Empty; for (int i = 1; i < commandBytes.Length; i++) { formmatedCommand += $"{commandBytes[i]:X2}"; if (i != commandBytes.Length - 1) formmatedCommand += ","; } string[] BCC_HexData = formmatedCommand.Split(','); int blockCheckCharacter = int.Parse(BCC_HexData[0], NumberStyles.HexNumber); for (int i = 1; i < BCC_HexData.Length; i++) { blockCheckCharacter ^= int.Parse(BCC_HexData[i], NumberStyles.HexNumber); } return Convert.ToChar(blockCheckCharacter); } private bool ReadVariableArea(int node, string variableType, string readStartAddress, string numberOfElements, out string receivedData) { receivedData = string.Empty; string command = $"{STX}{node:X2}0000101{variableType}{readStartAddress}00{numberOfElements}{EXT}"; char blockCheckCharacter = GetCyclicRedundancyCheck(command); command += blockCheckCharacter; char[] bytes; VariableArea variableArea = new VariableArea(); if (WriteRead(command, out bytes)) { GetVariableArea(bytes, out variableArea); receivedData = variableArea.readData; return true; } else { return false; } } private void GetVariableArea(char[] commandFrame, out VariableArea variableArea) { variableArea = new VariableArea(); char[] node = new char[2]; char[] slaveAddress = new char[2]; char[] functionCode = new char[2]; char[] mrc = new char[2]; char[] src = new char[2]; char[] responseCode = new char[4]; char[] readData = new char[commandFrame.Length - 17]; Array.Copy(commandFrame, 1, node, 0, 2); Array.Copy(commandFrame, 3, slaveAddress, 0, 2); Array.Copy(commandFrame, 5, functionCode, 0, 2); Array.Copy(commandFrame, 7, mrc, 0, 2); Array.Copy(commandFrame, 9, src, 0, 2); Array.Copy(commandFrame, 11, responseCode, 0, 4); Array.Copy(commandFrame, 15, readData, 0, commandFrame.Length - 15 - 2); variableArea.Node = new string(node); variableArea.slaveAddress = new string(slaveAddress); variableArea.functionCode = new string(functionCode); variableArea.MRC = new string(mrc); variableArea.SRC = new string(src); variableArea.responseCode = new string(responseCode); variableArea.readData = new string(readData); } public int ReadCurrentTemperature() { int temperature = 0; string receivedData; if (ReadVariableArea(1, "C0", "0000", $"{1:X4}", out receivedData)) { temperature = int.Parse(receivedData, NumberStyles.HexNumber); } Temperature = temperature; return temperature; } public bool WriteRead(string command, out char[] receivedData) { receivedData = null; string data = WriteRead(command); //data = "\u00020200000101000000000190\u0003\t"; if (data != string.Empty) { char blockCheckCharacter = GetCyclicRedundancyCheck(data.Remove(data.Length - 1, 1)); if (blockCheckCharacter == data[data.Length-1]) { receivedData = data.ToCharArray(); return true; } else { return false; } } else { return false; } } } }