C#
C#으로 LS PLC와 RS232C 통신하기
벵거빠돌이
2018. 4. 5. 17:43
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; } } }