public partial class BitTest : Form
{
const char STX = (char)0x02;
const char ETX = (char)0x03; //End Text [응답용Asc]
const char EOT = (char)0x04; //End of Text[요구용 Asc]
const char ENQ = (char)0x05; //Enquire[프레임시작코드]
const char ACK = (char)0x06; //Acknowledge[응답 시작]
const char NAK = (char)0x15; //Not Acknoledge[에러응답시작]
private SerialPort m_serialPort;
public BitTest()
{
InitializeComponent();
}
private void WordReadTest_Load(object sender, EventArgs e)
{
SerialPortOpen();
}
private void WordReadTest_FormClosing(object sender, FormClosingEventArgs e)
{
SerialPortClose();
}
private void btnOpen_Click(object sender, EventArgs e)
{
SerialPortOpen();
}
private void btnClose_Click(object sender, EventArgs e)
{
SerialPortClose();
}
///
/// 포트오픈
///
private void SerialPortOpen()
{
m_serialPort = new SerialPort();
m_serialPort.PortName = "Com7";
m_serialPort.BaudRate = 19200;
m_serialPort.Parity = Parity.None;
m_serialPort.DataBits = 8;
m_serialPort.StopBits = StopBits.One;
m_serialPort.Handshake = Handshake.None;
m_serialPort.ReadTimeout = 500;
m_serialPort.WriteTimeout = 500;
m_serialPort.Open();
btnOpen.Enabled = false;
btnClose.Enabled = true;
btnExecute.Enabled = true;
}
///
/// 포트 종료
///
private void SerialPortClose()
{
m_serialPort.Close();
btnOpen.Enabled = true;
btnClose.Enabled = false;
btnExecute.Enabled = false;
}
//실행
private void btnExecute_Click(object sender, EventArgs e)
{
DateTime t1 = DateTime.Now;
string strOutputData = ENQ + "00RSS01" + "07%MX0000" + EOT;
m_serialPort.Write(strOutputData);
lblOutputData.Text = strOutputData;
do
{
//데이타를 전부 PLC로 전송 하기 위함..
} while (m_serialPort.WriteBufferSize == 0);
string indata= DataRead();
TimeSpan span = DateTime.Now.Subtract(t1);
lblMillisecond.Text = span.Milliseconds.ToString();
}
///
/// PLC로 부터 수신된 데이타를 가지고 온다
///
///
private string DataRead()
{
bool m_Next = false;
string strInData = string.Empty;
string strRetValue= string.Empty;
DateTime start = DateTime.Now;
do
{
string msg = m_serialPort.ReadExisting();
strInData += msg;
//TODO : 데이타에 종료문자가 있으면...
if (msg.IndexOf(ETX) > 0)
{
//TODO 데이타 처음에 정상 응답이 있으면
if (strInData[0] == ACK)
{
//TODO 들어오는 데이타를 분석..[ETX(1)+국번(2)+비트읽기(3)+블륵수(2)]
lblInputData.Text = strInData;//Test용
strRetValue = strInData.Substring(8, strInData.Length - 9); //실제Data
m_Next = true;
}
//TODO: 데이타에 비정상 응답이 들어오면..
else if (strInData[0] == NAK)
{
lblInputData.Text = "NAK";
strRetValue = "-1";
m_Next = true;
}
}
//DOTO : 응답이 없으면 0.5초간은 로프를둘면서 기다란다.
TimeSpan ts = DateTime.Now.Subtract(start);
if (ts.Milliseconds > 500)
{
lblInputData.Text = "TimeOut";
strRetValue = "-3";
m_Next = true;
}
} while (!m_Next);
return strRetValue;
}
}
}