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

这篇具有很好参考价值的文章主要介绍了C#和西门子PLC使用Udp通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、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、硬件配置

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

2、程序编程

Main程序

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

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

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

 "TSEND_C_DB"功能块配置如下:

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

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

3、添加监控表

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

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

 

二、C#程序工程创建

1、界面UI

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

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

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

 

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

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

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

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

(4)C#上位机读操作

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

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

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

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

 

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

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

三、工程合并下载连接

https://download.csdn.net/download/panjinliang066333/86508006文章来源地址https://www.toymoban.com/news/detail-443044.html

到了这里,关于C#和西门子PLC使用Udp通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#与西门子PLC1500的ModbusTcp服务器通信4--搭建ModbusTcp客户端

    客户端可以是一个程序或一个设备,这里我以C#WINFORM程序来实现客户机与PLC的Modbustcp服务器通信,开发环境是VS2019,.NET Framework版本是4.7.2  创建类库   编写C#各种类的转换库,该库由我提供,不用操心,文章最后提供。 项目引入这个类库  找到项目,找到引用,右键“管理

    2024年02月11日
    浏览(27)
  • C#与西门子PLC1500的ModbusTcp服务器通信3--搭建ModbusTcp服务器

     注意,这个IP地址必须与西门子虚拟网卡的IP地址及虚拟机的网卡IP地址同一网段           找到程序块main,找到右边的指令,找到通信,找到其它,拖到MB_SERVER到程序段1中    重点看mb_hold_reg和connect参数,disconnet为false表示被动连接,意思是说服务器等待客户机来连接,而

    2024年02月11日
    浏览(27)
  • 编写C#程序实现和西门子1500PLC进行Modbus Tcp通讯仿真

    前言 本文章的主题是介绍Modbus Tcp通讯仿真,其中C#编写的程序充当客户端(Client),西门子1500PLC充当的服务器端(Server),有关Modbus Tcp协议的具体内容在此也不再赘述,大家可以自行阅读官方文档。 注:在实现其基本功能的条件下,本文的代码编写以及软件配置均简化。

    2024年02月11日
    浏览(39)
  • 西门子PLC1200自由口通信

    文章目录 前言 自由口通信 二、使用步骤 组态 编程 总结 项目里需要使用PLC和某公司液体泵通信,液体泵采用RS485,支持OEM协议和DT协议,因此PLC采用自由口通信 提示:以下是本篇文章正文内容,下面案例可供参考 扩展了CB1241通信板,RS485连线如下图所示 TRB为+,TRA为-,M为接

    2024年02月07日
    浏览(30)
  • MATLAB和西门子SMART PLC OPC通信

    西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章 Smart 200PLC PC Access SMART OPC通信_基于pc access smart的opc通信_RXXW_Dor的博客-CSDN博客 文章浏览阅读2.7k次,点赞2次,收藏5次。OPC是一种利用微软COM/DCOM技术达成自动控制的协议,采用典型的C/S模式,针对硬件设备的驱动程序由

    2024年02月06日
    浏览(23)
  • C#上位机与西门子PLC数据交互

    拉了换一个简单的界面 我新建了一个DB数据块【DB1】,右键【DB1】,点击【属性】项,【优化的块访问】默认是勾选,要想显示数据块中地址偏移量,需要把【优化的块访问】勾选取消 1、右键项目名,选择图中【管理NuGet程序包】 2、在搜索框输入【S7netplus】,我安装的是第

    2024年02月13日
    浏览(31)
  • 西门子PLC1500大型程序fanuc机器人焊装 包括1台 西门子1500PLC程序

    西门子PLC1500大型程序fanuc机器人焊装 包括1台 西门子1500PLC程序,2台触摸屏TP1500程序  9个智能远程终端ET200SP Profinet连接  15个Festo智能模块Profinet通讯  10台Fanuc发那科机器人Profinet通讯  3台G120变频器Profinet通讯  2台智能电能管理仪表PAC3200  4个GRAPH顺控程序  图尔克RFID总线模

    2024年01月18日
    浏览(31)
  • C# 读取西门子S7系列PLC教程及源码

    若要创建驱动程序的实例,需要使用此构造函数: CPU:这指定您要连接到的  CPU 。支持的 CPU 包括: ip :指定 CPU 或外部以太网卡的 IP 地址 机架:它包含PLC的 机架 ,您可以在Step7的硬件配置中找到 插槽 :这是CPU的插槽,您可以在Step7的硬件配置中找到 例: 此代码为 IP 地

    2024年02月08日
    浏览(35)
  • C#与西门子PLC通讯——手搓S7通讯协议

    本文将尝试从源码角度,使用Tcp/Ip的方式直接与西门子PLC进行交互通讯。 往期博客参考 C#与西门子PLC通讯——新手快速入门 C#与西门子PLC通讯——熟手快速入门 建议先看一下这两篇,了解预设背景。 知其然,知其所以然。 这篇文章,我们就尝试重复造一个轮子。通过对通讯

    2024年02月04日
    浏览(29)
  • MCGS物联网触摸屏与西门子1200PLC通信穿透

    产品型号 昆仑通态MCGS触摸屏:TPC7022Nt WiFi版,有线ip地址:192.168.0.100; 西门子1200系列PLC:CPU1215C DC/DC/DC,ip地址:192.168.0.10; 电脑系统:Windows 10 家庭中文版,电脑以太网口ip地址:192.168.0.50。 (1)触摸屏上电后连续点击触摸屏面板,进入“系统参数设置”界面,点击进入

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包