通过 TCP 客户端向 PLC 发送命令

Sending CMD to PLC via TCP Client

我正在尝试通过 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 连接到 send/retrieve 命令。感谢任何帮助。

您的方向是正确的,但是您的命令编码有误。 Low-level 像这样的协议很难正确处理。

您的字节数组 b 包含 ASCII-encoded 字符串 "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 字符(例如 a-z、0-9 等)的关系。