我试图向通过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发送/检索命令。任何帮助表示赞赏。
答案 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等)相关联。