2017-01-07 2 views
0

Я пытаюсь отправить команду в ПЛК, который управляет электронными шлюзами через TCP-клиент. Я могу подключиться, но это появляется моя команда не читается от PLC.Отправка CMD на PLC через TCP-клиент

У меня есть следующий код:

 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 являются команды, которые могут быть отправлены. ПЛК поставляется с некоторой документацией, и здесь находится picture. Я полагаю, что мой CMD ошибочен, как мне его исправить? Это мой первый раз, когда я пытаюсь подключиться и отправлять/извлекать команды из ПЛК. Любая помощь приветствуется.

+0

«СУММА: сумма данных ниже 1 байт от STX до ETX». Вы просто добавляете STX и ETX (как строки, которые объединяют их). Контрольная сумма, конечно же, должна быть суммой всех байтов. –

ответ

0

Вы на правильном пути, но кодировка вашей команды неверна. Низкоуровневые протоколы, подобные этим, сложны, чтобы получить право.

Вашего байтовый массив b содержит ASCII-строку в кодировке "0x02000x310x030x020x03", закодированной в ASCII, который переводит на byte[22] { 48, 120, 48, 50, 48, 48, 48, 120, 51, 49, 48, 120, 48, 51, 48, 120, 48, 50, 48, 120, 48, 51 } в то время как вы хотите, чтобы посылать массив фактических байт 0x02 и т.д.

попробовать что-то вроде: byte[b] = new byte { 0x02, 0x00, 0x31, 0x30, 0x02, 0x03 }

См. Также http://www.december.com/html/spec/ascii.html, чтобы узнать, как STX и ETX относятся к другим символам ASCII (например, az, 0-9 и т. Д.).

Смежные вопросы