2017-01-07 6 views
0

Ich versuche, einen Befehl an eine SPS zu senden, die elektronische Schließfächer über einen TCP-Client steuert. Ich bin in der Lage zu verbinden, aber es erscheint mein Befehl wird nicht gelesen von der SPS.Senden von CMD an die SPS über den TCP-Client

Ich habe den folgenden Code:

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

STATUS/OPEN sind die Befehle, die gesendet werden können. Die PLC kam mit einigen Unterlagen und hier ist eine picture davon. Ich gehe davon aus, dass mein CMD falsch ist, wie kann ich es beheben? Dies ist das erste Mal, dass ich versuche, eine Verbindung herzustellen und Befehle von einer SPS zu senden/abrufen. Jede Hilfe wird geschätzt.

+0

"SUM: Datensumme unter 1 Byte von STX zu ETX" Sie fügen nur STX und ETX hinzu (als Strings, die sie verketten). Die Prüfsumme soll sicherlich eine Summe aller Bytes sein. –

Antwort

0

Sie sind auf dem richtigen Weg, aber die Codierung Ihres Befehls ist falsch. Low-Level-Protokolle wie diese sind schwierig, um richtig zu machen.

Ihr Byte-Array b enthält die ASCII-codierte Zeichenfolge "0x02000x310x030x020x03", in ASCII codiert, was zu byte[22] { 48, 120, 48, 50, 48, 48, 48, 120, 51, 49, 48, 120, 48, 51, 48, 120, 48, 50, 48, 120, 48, 51 } übersetzt, während Sie ein Array der aktuellen Bytes zu senden werden möchten 0x02 usw.

Probieren Sie etwas wie: byte[b] = new byte { 0x02, 0x00, 0x31, 0x30, 0x02, 0x03 }

Siehe auch http://www.december.com/html/spec/ascii.html, um zu sehen, wie sich STX und ETX auf die anderen ASCII-Zeichen beziehen (zB az, 0-9 usw.).

Verwandte Themen