目录

一、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

C#和西门子PLC使用Udp通信相关推荐

  1. plc 上位机编译算法_基于西门子PLC的Socket通信深度剖析

    对于自控或电气工程师来说,西门子PLC是每个人都非常熟悉的一款PLC品牌:而对于上位机开发工程师来说,Socket通信或TCP/IP协议也是必须要掌握的一种通信方式.西门子的200Smart PLC, ...

  2. C# / VB / LabVIEW / VC / Python 上位机使用S7-TCP协议与西门子PLC进行网口通信的教程 (Win/Linux)

    现在越来越多的项目开始使用上位机了,在上位机实现数据存储.曲线绘制时,使用高级语言自行开发程序,比各种组态软件更加自由,更加强大.在进行上位机软件开发时,第一步就是要跟PLC取得通信,能够读写PLC内 ...

  3. 西门子 PLC S7单边通信

    PLC通信 1.组态&编程 (1)打开博途软件,创建新项目,命名为:通信 (2)添加新设备,命名为A,这里选择的是CPU1211C,版本V4.2 (3)CPU属性设置,启用系统存储器字节和时钟 ...

  4. C#/VB.NET与西门子PLC进行ModbusTcp通信

    进入自动化行业半年多了,每天都与机器打交道. 前段时间接手一个任务,需要将我们机台与下站机台进行通讯,我们机台是PC,下站机台为西门子S7-1200. 想想完成这个任务,领导就会对我这个新人刮目相看, ...

  5. plc 上位机编译算法_西门子PLC的开放式TCP通信

    对于自控或电气工程师来说,西门子PLC是每个人都非常熟悉的一款PLC品牌:而对于上位机开发工程师来说,Socket通信或TCP/IP协议也是必须要掌握的一种通信方式. 相比较而言,西门子PLC对Soc ...

  6. java微信小程序、APP 西门子PLC通信,java S7-S200、java S7-300、java S7-400,java与PROFINET协议通信 Java与西门子PLC通信

    最近在处理Java与西门子PLC通信的,摸索出通信方法,实现了java与西门子PLC间相互通信,可以方便的实现西门子PLC实现功能后,怎么做人机交互.APP控制等功能. **可提供下载: 我们提供we ...

  7. 西门子PLC通信全解析

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

  8. modbus tcp主站和从站_组态王与西门子 PLC无线Modbus通讯

    组态王与西门子PLC无线Modbus通信方案 本方案是组态软件与西门子S7-200 Smart 进行无线MODBUS 通信的实现方法.此方案可以作为西门子S7-200 Smart与组态软件的无线MOD ...

  9. Netty实现连接西门子PLC

    西门子PLC支持以太网通信,常用的通信协议是S7协议,S7协议本质上也属于TCP/IP的一种,TCP/IP通信一般是基于Socket实现的,考虑到Socket通信是I/O阻塞模式,在连接大批量PLC节 ...

最新文章

  1. 1079 Total Sales of Supply Chain
  2. c++对象模型之Data布局
  3. 有关包络Spectral Envelope的疑问
  4. SpringMVC框架
  5. 限制MySQL Binlog的传输速率
  6. xlwt表格的对齐样式
  7. 【MyBatis】Mybatis使用SqlSessionFactory加载xml文件
  8. HTML和CSS是什么玩意儿
  9. Educoder 机器学习 SMO进行优化 第1关:SMO高效优化算法
  10. android是j2me的一个实现吗,j2me与android的区别
  11. KITTI 数据集简介
  12. CIM系统与MES系统介绍
  13. matlab 模式识别工具箱下载,模式识别matlab工具箱
  14. python俄罗斯方块小游戏实验报告_用Python实现童年小游戏俄罗斯方块
  15. JAVA 算法中Map 使用技巧,持续更新,边学边更
  16. 虚拟IP人物,同时空出现——思念党的福音
  17. 备案域名服务器DNS修改,未备案域名也可以用高防CDN加速
  18. 微信小程序之日期时间筛选器实现(支持年月日时分)
  19. 商务智能与数据挖掘 - 认识数据
  20. python 字典 按值排序贺按键排序 得到一个新字典

热门文章

  1. 7-1 汽车加油问题 (15分)
  2. 空间分析 | 莫兰指数的计算
  3. vue中使用天地图测距、测面、标点【一】
  4. Linux 基本操作 看完这篇Linux基本的操作就会了
  5. 写在2015年年末的年终总结
  6. 谷粒学苑-在线教育实战项目-面试总结-简历优化
  7. python标准库模块路径_Python3的系统标准库pathlib模块的 Path 对路径的操作会更简单...
  8. RK3568烧录系统
  9. NETPLIER : 一款基于概率的网络协议逆向工具(一)理论
  10. 使用模拟器玩地下城与勇士M电脑版试玩分享