通过TCP客户端将CMD发送到PLC

时间:2017-01-07 03:49:52

标签: c# tcpclient plc

我试图向通过TCP客户端控制电子储物柜的PLC发送命令。我能够连接,但是出现我的命令没有被PLC读取

我有以下代码:

        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发送/检索命令。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

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

您的字节数组b包含以ASCII编码的ASCII编码字符串"0x02000x310x030x020x03",当您希望发送实际字节数组{{1}时,该字符串会转换为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

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