通过TCP客户端向CMD发送CMD

问题描述:

我试图通过TCP客户端发送命令给控制电子锁的PLC。我可以连接,但它出现我的命令没有被PLC读取通过TCP客户端向CMD发送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])); 
        } 
       } 
      } 
     } 

STATUS/OPEN是可发送的命令。 PLC附带一些文档,下面是它的picture。我假设我的CMD错了,我该如何解决它?这是我第一次尝试从PLC连接并发送/检索命令。任何帮助表示赞赏。

+0

“SUM:从STX到ETX低于1个字节的数据总和”您只需添加STX和ETX(作为将它们连接起来的字符串)即可。校验和肯定应该是所有字节的总和。 –

你在正确的轨道上,但是你的命令的编码是错误的。像这样的低级别协议很难得到正确的结果。

你的字节数组b包含ASCII编码字符串"0x02000x310x030x020x03",在ASCII编码,而要被发送的实际字节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 }

试着这么做: byte[b] = new byte { 0x02, 0x00, 0x31, 0x30, 0x02, 0x03 }

另请参阅http://www.december.com/html/spec/ascii.html了解STX和ETX如何与其他ASCII字符(例如az,0-9等)相关。