Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过TCP客户端向PLC发送CMD_C#_Tcpclient_Plc - Fatal编程技术网

C# 通过TCP客户端向PLC发送CMD

C# 通过TCP客户端向PLC发送CMD,c#,tcpclient,plc,C#,Tcpclient,Plc,我正试图向PLC发送一个命令,该PLC通过TCP客户端控制电子储物柜。我可以连接,但PLC似乎没有读取我的命令 我有以下代码: private const string STX = "0x02"; private const string ETX = "0x03"; private const string STATUS = "0x30"; private const string OPEN = "0x31"; pr

我正试图向PLC发送一个命令,该PLC通过TCP客户端控制电子储物柜。我可以连接,但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]));
                    }
                }
            }
        }
private const string STX=“0x02”;
私有常量字符串ETX=“0x03”;
private const string STATUS=“0x30”;
私有常量字符串OPEN=“0x31”;
私有常量字符串和=STX+ETX;
静态void Main(字符串[]参数)
{
var tcpClient=新的tcpClient();
tcpClient.Connect(“192.168.1.190”,4000);
if(TCP客户端已连接)
{
var networkStream=tcpClient.GetStream();
if(networkStream.CanWrite)
{
var ADDY=“00”;
var ascienceode=新的ascienceoding();
byte[]b=ascienceode.GetBytes(STX+ADDY+OPEN+ETX+SUM);
networkStream.Write(b,0,b.Length);
字节[]b1=新字节[100];
var k=networkStream.Read(b1,0100);
对于(变量i=0;i

STATUS/OPEN是可以发送的命令。PLC附带了一些文档,下面是它的一部分。我假设我的CMD是错误的,我如何修复它?这是我第一次尝试连接到PLC并从PLC发送/检索命令。非常感谢您的帮助。

您的方法是正确的,但是命令的编码是错误的。像这样的低级协议很难正确实现

您的字节数组
b
包含ASCII编码的字符串
“0x020000x310x030x020x03”
,用ASCII编码,它转换为
字节[22]{48,120,48,48,48,120,51,49,48,120,48,51,48,48,50,48,120,48,51}
,同时您要发送实际字节数组
0x02

尝试以下方法:

字节[b]=新字节{0x02,0x00,0x31,0x30,0x02,0x03}


另请参见以了解STX和ETX与其他ASCII字符(例如a-z、0-9等)的关系。

“SUM:STX到ETX的1字节以下的数据总和”您只需添加STX和ETX(作为串接它们的字符串)。校验和当然应该是所有字节的总和。我正在使用的PLC使用的是同一组命令(规范看起来与此图完全相同)。不幸的是,我是网络程序员,没有硬件方面的经验。我成功地发送命令并接收响应。我完全被困在如何解析STATUS命令(0x30)的响应上。如果有人能告诉我如何使用这两个数字计算出所有锁的状态,我将不胜感激。提前谢谢