目录

Main程序



"TSEND_C_DB"功能块配置如下:
"TURCV_DB"功能块不需要配置,ADDR地址和"TSEND_C_DB"相同即可

双击添加新监控表,在监控表中分别添加MB20-MB29、MB30-MB39寄存器。在监控状态下,可以实时的读取、修改当前寄存器值


注意的是,本地Udp创建成功后,先给PLC寄存器发送0做数据测试。PLC只有在接收到到一次上位机发送的程序,PLC才会启动对上位机发送功能,因为共用的功能块ADDR中的地址。
- private void btnConnect_Click(object sender, EventArgs e)
- {
- try
- {
- LocalIp = txtLocalIp.Text;
- LocalPort = int.Parse(txtLocalPort.Text);
-
- TargetIp = txtPlcIp.Text;
- TargetPort = int.Parse(txtPlcPort.Text);
-
- client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- client.Bind(new IPEndPoint(IPAddress.Parse(LocalIp), LocalPort));
- Thread.Sleep(50);
- MessageBox.Show("本地Udp创建成功");
- txtUdpState.Text = "本地Udp创建成功";
- isUdpConnected = true;
-
- //本地Udp创建成功后,先给PLC寄存器发送0做数据测试
- byte[] sendBytes = new byte[10];
- sendBytes[0] = 0x00;
- sendBytes[1] = 0x00;
- sendBytes[2] = 0x00;
- sendBytes[3] = 0x00;
- sendBytes[4] = 0x00;
- sendBytes[5] = 0x00;
- sendBytes[6] = 0x00;
- sendBytes[7] = 0x00;
- sendBytes[8] = 0x00;
- sendBytes[9] = 0x00;
- EndPoint point = new IPEndPoint(IPAddress.Parse(TargetIp), TargetPort);
- client.SendTo(sendBytes, point);
-
- threadRecv = new Thread(ReciveMsg);
- threadRecv.Start();
-
- timer1.Start();
- }
- catch
- {
- txtUdpState.Text = "本地Udp创建失败";
- }
- }
- void ReciveMsg()
- {
- while (true)
- {
- if(isUdpConnected)
- {
- EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
- byte[] buffer = new byte[1024];
- int length = client.ReceiveFrom(buffer, ref point);//接收数据报
- if(length>0)
- {
- for(int i=0;i<10;i++)
- {
- byteRecvs[i] = buffer[i];
- }
- }
-
- }
-
- }
- }
- private void timer1_Tick(object sender, EventArgs e)
- {
- //将线程中接收到PLC的byte数据,转换成16进制的字符串显示
- txtReadMB20.Text = byteRecvs[0].ToString("X");
- txtReadMB21.Text = byteRecvs[1].ToString("X");
- txtReadMB22.Text = byteRecvs[2].ToString("X");
- txtReadMB23.Text = byteRecvs[3].ToString("X");
- txtReadMB24.Text = byteRecvs[4].ToString("X");
- txtReadMB25.Text = byteRecvs[5].ToString("X");
- txtReadMB26.Text = byteRecvs[6].ToString("X");
- txtReadMB27.Text = byteRecvs[7].ToString("X");
- txtReadMB28.Text = byteRecvs[8].ToString("X");
- txtReadMB29.Text = byteRecvs[9].ToString("X");
-
- }
- private void btnWriteValue_Click(object sender, EventArgs e)
- {
- try
- {
- if(isUdpConnected==false)
- {
- MessageBox.Show("请先创建本地Udp", "提示");
- return;
- }
-
- byte[] sendBytes = new byte[10];
- //sendBytes[0] = 0x10;
- //sendBytes[1] = 0x10;
- //sendBytes[2] = 0x10;
- //sendBytes[3] = 0x10;
- //sendBytes[4] = 0x10;
- //sendBytes[5] = 0x10;
- //sendBytes[6] = 0x10;
- //sendBytes[7] = 0x10;
- //sendBytes[8] = 0x10;
- //sendBytes[9] = 0x10;
-
- sendBytes[0] = StringToByte(txtWriteMB30.Text);
- sendBytes[1] = StringToByte(txtWriteMB31.Text);
- sendBytes[2] = StringToByte(txtWriteMB32.Text);
- sendBytes[3] = StringToByte(txtWriteMB33.Text);
- sendBytes[4] = StringToByte(txtWriteMB34.Text);
- sendBytes[5] = StringToByte(txtWriteMB35.Text);
- sendBytes[6] = StringToByte(txtWriteMB36.Text);
- sendBytes[7] = StringToByte(txtWriteMB37.Text);
- sendBytes[8] = StringToByte(txtWriteMB38.Text);
- sendBytes[9] = StringToByte(txtWriteMB39.Text);
-
-
- EndPoint point = new IPEndPoint(IPAddress.Parse(TargetIp), TargetPort);
- client.SendTo(sendBytes, point);
- MessageBox.Show("发送成功");
-
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.ToString());
- }
-
- }
封装方法需要注意的是,PLC寄存器最大只能支持两位的16进制FF。所以,需要将测写入的字符串不能超过3两位、同时也不能超过F。
- /// <summary>
- /// 字符串转byte数据
- /// </summary>
- /// <param name="s"></param>
- /// <returns></returns>
- private byte StringToByte(string s)
- {
- if(s.Length>2)
- {
- throw new ArgumentNullException("超过两位或者不是16进制字符!");
- }
- byte b;
- try
- {
- string str;
- str = "0x" + s;
- b = Convert.ToByte(str, 16);
- }
- catch
- {
- throw new ArgumentNullException("不是指定的16进制字符");
- }
- return b;
- }
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- System.Environment.Exit(0); //强制关闭所有线程
- }



在PLC程序中,将M60.0强制TRUE

PLC即将数据以0.5秒的时间周期发送上位机C#,时间可以调快一点比如50毫秒、100毫秒都可以

对于不会C#上位机编程的电气工程师来说,也可以使用网络调试助手来做测试。测试方法参加另一篇博客西门子S7-1200 PLC和上位机通信_Big_潘大师的博客-CSDN博客_西门子1200与上位机s7通讯
https://download.csdn.net/download/panjinliang066333/86508006