using System;
|
using System.Globalization;
|
using System.Text;
|
using System.Threading;
|
|
namespace SA_LTT.Module
|
{
|
/// <summary>
|
/// Omron temp controller
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// Start of text
|
/// </summary>
|
private char STX = Convert.ToChar(2);
|
|
/// <summary>
|
/// End of text
|
/// </summary>
|
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;
|
|
}
|
}
|
}
|
}
|