C#和西门子PLC使用Udp通信

news/2024/10/20 16:06:51/

目录

一、PLC程序工程创建

1、硬件配置

2、程序编程

3、添加监控表

二、C#程序工程创建

1、界面UI

2、代码编写

(1)创建本地Udp

(2)读PLC的线程函数

(3)定时器

(4)上位机写寄存器操作

(5)StringToByte()方法封装

(6)窗口关闭

3、C#和PLC测试

(1)C#上位机写操作1

(2)C#上位机写操作2

(3)C#控制PLC中的继电器输出

(4)C#上位机读操作

 (5)串口调试助手和PLC通信测试

三、工程合并下载连接


一、PLC程序工程创建

1、硬件配置

2、程序编程

Main程序

 

 

 "TSEND_C_DB"功能块配置如下:

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

3、添加监控表

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

 

二、C#程序工程创建

1、界面UI

2、代码编写

(1)创建本地Udp

注意的是,本地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创建失败";}}

(2)读PLC的线程函数

        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];}}}}}

(3)定时器

        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");}

(4)上位机写寄存器操作

         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());}}

(5)StringToByte()方法封装

封装方法需要注意的是,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;}

(6)窗口关闭

        private void Form1_FormClosing(object sender, FormClosingEventArgs e){System.Environment.Exit(0);         //强制关闭所有线程}

3、C#和PLC测试

(1)C#上位机写操作1

 

(2)C#上位机写操作2

(3)C#控制PLC中的继电器输出

(4)C#上位机读操作

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

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

 

 (5)串口调试助手和PLC通信测试

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

三、工程合并下载连接

https://download.csdn.net/download/panjinliang066333/86508006


http://www.ppmy.cn/news/342686.html

相关文章

西门子触摸屏脚本程序_西门子触摸屏实例程序

描述: 在本页中可下载到最新的 SIMATIC WinCC flexible 2008 演示项目 ( 样例组态 ) 。演示应用程序可以和不 同的 SIMATIC 面板以及 PC Runtime 版本一起使用。 注意: 使用这些演示应用程序需要 WinCC flexible 2008 或 WinCC flexible 2008 SP1 。 使用演示项目所需要的软件…

西门子plc软件 linux,西门子PLC编程软件

西门子PLC编程软件官方版是一款专为西门子产品打造的PLC编程工具。西门子PLC编程软件最新版支持所有SIMATIC控制器进行组态和编程操作&#xff0c;西门子PLC编程软件还内置了硬件配置和参数设置、通讯组态、编程、测试、启动和维护、文件建档、运行和诊断功能等功能&#xff0c…

西门子atch指令详解_西门子plc指令

指令( 英文全称意思 ) :指令含义 1、LD ( Load 装载 ) :动合触点 2、LDN ( Load Not 不装载 ) : 动断触点 3、A ( And 与 动合) : 用于动合触点串联 4、AN ( And Not 与 动断 ) :用于动断触点串联 5、O ( Or 或 动合 ) :用于动合触点并联 6、ON ( Or Not 或 动断 ) : 用于动…

西门子博途与上位机TCPIP通信

1、PLC硬件IP设定及组态如下图&#xff1a; 堆垛机 1号机 IP地址&#xff1a;190.20.0.72 掩码 255.255.255.0 2、PLC与上位机TCP网络连接组态如下图&#xff1a; WCS上位机IP地址设定 IP地址&#xff1a;190.20.0.&#xff12;&#xff15;&#xff10; 掩码 255.255.255.0…

上位机与西门子PLC通信协议

前言 最近西门子PLC价格大幅上调&#xff0c;在工控界引起了不小的风波&#xff0c;不仅涨价&#xff0c;甚至还缺货&#xff0c;导致很多人不得不更改方案。听说最近已经完成了芯片替换&#xff0c;希望不久能够恢复供货&#xff0c;并把价格回调。 通过这件事&#xff0c;从…

plc控制电机实验报告_基于西门子PLC电动机正反转互锁控制实验报告

实 验 报 告 实验课程:基于西门子PLC电动机正反转互锁控制 学生姓名:张荣 学号:130302062 专业班级:13级应电一班 二〇一六年六月十六日 实验报告 传统的继电器控制系统中都使用了继电器、接触器等器件。在这样的纯硬继电器系统中,系统的接线难度会随着系统的复杂程度增加…

西门子plc 用c语言编程,西门子PLC常用指令举例

在西门子plc梯形图中,将其触点和线圈等称为程序中的编程元件。编程元件也称为软元件,是指在plc编程时使用的输入/输出端子所对应的存储区以及内部的存储单元、寄存器等。 根据编程元件的功能,西门子plc梯形图中的常用的编程元件主要有输入继电器(I)、输出继电器(Q)、辅助继电…

西门子200程序案例集

100ms定时器子程序多次调用.rar 200做的主令控制器程序.rar 2010年春节五个字霓虹灯.rar 3-PID控制.rar 428前提胶.rar 630旋臂绞.rar About Time AND Timer sample in STEP7_20070903a.zip Analog Average.zip K650吹瓶机.rar plc200例子.rar PLC发电机励磁控制程序.rar S200配…