通过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连接并发送/检索命令。任何帮助表示赞赏。
答
你在正确的轨道上,但是你的命令的编码是错误的。像这样的低级别协议很难得到正确的结果。
你的字节数组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等)相关。
“SUM:从STX到ETX低于1个字节的数据总和”您只需添加STX和ETX(作为将它们连接起来的字符串)即可。校验和肯定应该是所有字节的总和。 –