最近写的一个程序要和生产线的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);
rec = new byte[sock.Available];
sock.Receive(rec);
this.txtRegInfo.Text = this.txtRegInfo.Text + Environment.NewLine + " <停止> " + b2s(rec);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
this.mutexforsocket.ReleaseMutex();
}
catch (Exception ex)
{
MessageBo

这篇博客展示了如何通过C#编程实现与PLC的TCP/IP连接,进行读写指定寄存器操作。作者提供了一个简单的程序,包括读取、停止、启动和清除操作,通过发送不同命令来改变寄存器状态,并展示接收的响应数据。
最低0.47元/天 解锁文章
1427

被折叠的 条评论
为什么被折叠?



