2017-01-07 8 views
0

TCP 클라이언트를 통해 전자 보관함을 제어하는 ​​PLC로 명령을 보내려고합니다. 연결할 수 있지만 이 내 명령이 PLC에서으로 읽히지 않습니다.TCP 클라이언트를 통해 PLC에 CMD 보내기

 private const string STX = "0x02"; 
     private const string ETX = "0x03"; 
     private const string STATUS = "0x30"; 
     private const string OPEN = "0x31"; 
     private const string SUM = STX + ETX; 

     static void Main(string[] args) 
     { 
      var tcpClient = new TcpClient(); 
      tcpClient.Connect("192.168.1.190", 4000); 

      if (tcpClient.Connected) 
      { 
       var networkStream = tcpClient.GetStream(); 
       if (networkStream.CanWrite) 
       { 
        var ADDY = "00"; 
        var asciiEncode = new ASCIIEncoding(); 
        byte[] b = asciiEncode.GetBytes(STX + ADDY + OPEN + ETX + SUM); 
        networkStream.Write(b, 0, b.Length); 
        byte[] b1 = new byte[100]; 
        var k = networkStream.Read(b1, 0, 100); 
        for (var i = 0; i < k; i++) 
        { 
         Console.WriteLine(Convert.ToChar(b1[i])); 
        } 
       } 
      } 
     } 

상태/OPEN 보낼 수있는 명령입니다 :

나는 다음과 같은 코드가 있습니다. PLC에는 설명서가 들어 있으며 여기에 picture이 있습니다. 내 CMD가 잘못되었다고 가정하고 어떻게 수정합니까? 이것은 처음으로 PLC에 연결하고 명령을 보내거나 가져 오는 것입니다. 어떤 도움을 주셔서 감사합니다.

+0

"SUM : STX에서 ETX 로의 1 바이트 미만의 데이터 합계"STX와 ETX를 연결하는 문자열입니다. 체크섬은 확실히 모든 바이트의 합계라고 가정합니다. –

답변

0

올바른 길을 가고 있지만 명령의 인코딩이 잘못되었습니다. 이와 같은 낮은 수준의 프로토콜은 올바르게 작동하기가 까다 롭습니다. byte[b] = new byte { 0x02, 0x00, 0x31, 0x30, 0x02, 0x03 } :

귀하의 바이트 배열 b

는 실제 바이트 0x02의 배열을 보내고 싶은 동안 byte[22] { 48, 120, 48, 50, 48, 48, 48, 120, 51, 49, 48, 120, 48, 51, 48, 120, 48, 50, 48, 120, 48, 51 }로 변환 ASCII로 인코딩 된 ASCII 인코딩 된 문자열 "0x02000x310x030x020x03",,, 등

같은 시도를 포함

STX와 ETX가 다른 ASCII 문자 (예 : az, 0-9 등)와 어떤 관련이 있는지 보려면 http://www.december.com/html/spec/ascii.html도 참조하십시오.