最近写的一个程序要和生产线的PLC连动(特定条件下读写指定寄存器),
查询了一些PLC的操作资料,做了一个测试程序:
private void btnRead_Click(object sender, EventArgs e)
{
try
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = Dns.GetHostEntry(this.txtIP.Text.Trim()).AddressList[0];
IPEndPoint ipend = new IPEndPoint(ip, int.Parse(this.txtPort.Text.Trim()));
sock.Connect(ipend);
byte[] cmd;
byte[] rec;
cmd = createCommand("R", int.Parse(this.txtStartAddr.Text), 1);
sock.Send(cmd);
Thread.Sleep(1000);
rec = new byte[sock.Available];
sock.Receive(rec);
this.txtRegInfo.Text = this.txtRegInfo.Text + Environment.NewLine + " <读取> " + b2s(rec);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnStop_Click(object sender, EventArgs e)
{
try
{
this.mutexforsocket.WaitOne();
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = Dns.GetHostEntry(this.txtIP.Text.Trim()).AddressList[0];
IPEndPoint ipend = new IPEndPoint(ip, int.Parse(this.txtPort.Text.Trim()));
sock.Connect(ipend);
byte[] cmd;
byte[] rec;
cmd = createCommand("W", int.Parse(this.txtStartAddr.Text), 0x3130);
sock.Send(cmd);
Thread.Sleep(1000);