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