.net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型

news2024/9/25 1:25:23

注:.net中通过TCP/IP方式通过S7.net.dll动态库,连接到西门子PLC,西门子程序中许勾选优化块,程序读取需要 db块号+偏移量

在这里插入图片描述

一。使用VS项目,在项目中添加S7.net动态库

代码中引用S7.net动态库

using S7.Net;

实例化PLC服务名

///

/// 实例化PLC

///

Plc S71500;

连接PLC按钮时间编写:
在这里插入图片描述

以上代码可测试是否能连接至PLC

二.西门子中点位信息,在程序中地址表示说明

在DB块中有如下变量
在这里插入图片描述

        /// <summary>
        /// 实例化PLC
        /// </summary>
        Plc S71500;

        /// <summary>
        /// 连接PLC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            string ip=tb_plcip.Text.Trim();              //PLC地址IP 例192.168.0.1
            short rack= short.Parse( tb_rack.Text.Trim()); //PLC机架位置 默认0
            short solt = short.Parse(tb_solt.Text.Trim()); //PLC插槽位置,以实际为准
            //CpuType根据实际PLC连接,我这边已1500PLC为例
            S71500 = new Plc(CpuType.S71500, ip, rack, solt); 
            //调用S7.NET中的方法连接PLC
            S71500.Open();
            //连接成功后使能操作按钮
            if (S71500.IsConnected)
            {
                //判断是否连接成功
                MessageBox.Show("连接PLC成功");
            }
        }

在程序中读取需DB块号+地址,分别写法如下

DB1.DBW0 //地址为0,类型为整数

DB1.STRING2.18 //地址为2,字符长度18 类型为字符串

DB1.B22 //地址为22,类型为字节型

DB1.DBD24 //地址为24,类型为实数

DB1.DBW28 //地址为28,类型为整数

DB1.DBW28 //地址为28,类型为整数

DB1.DBX29.0 //地址为29.0,类型为布尔

三,通过代码读写Tag点信息,以下代码可进行以上Tag点信息的读取及写入,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using S7.Net;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 实例化PLC
        /// </summary>
        Plc S71500;

        /// <summary>
        /// 连接PLC
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            string ip=tb_plcip.Text.Trim();              //PLC地址IP 例192.168.0.1
            short rack= short.Parse( tb_rack.Text.Trim()); //PLC机架位置 默认0
            short solt = short.Parse(tb_solt.Text.Trim()); //PLC插槽位置,以实际为准
            //CpuType根据实际PLC连接,我这边已1500PLC为例
            S71500 = new Plc(CpuType.S71500, ip, rack, solt); 
            //调用S7.NET中的方法连接PLC
            S71500.Open();
            //连接成功后使能操作按钮
            if (S71500.IsConnected)
            {
                //判断是否连接成功
                MessageBox.Show("连接PLC成功");
            }
        }

        //****
        //读取 ReadPLC("DB1.DBW0");
        //写入 WritePLC("DB1.DBW0","1");
        //其中BOOL写入: WritePLC(DB1.DBX29.0, "False");或WritePLC(DB1.DBX29.0, "True");


        #region  读写TAG点方法

        /// <summary>
        /// 去指定字符串中间字符
        /// </summary>
        /// <param name="sourse">字符串</param>
        /// <param name="startstr">首字符</param>
        /// <param name="endstr">尾字符</param>
        /// <returns></returns>
        public static string MidStrEx(string sourse, string startstr, string endstr)
        {
            string result = string.Empty;
            int startindex, endindex;
            try
            {
                startindex = sourse.IndexOf(startstr);
                if (startindex == -1)
                {
                    return result;
                }
                string tmpstr = sourse.Substring(startindex + startstr.Length);
                endindex = tmpstr.IndexOf(endstr);
                if (endindex == -1)
                {
                    return result;
                }
                result = tmpstr.Remove(endindex);

            }
            catch (Exception)
            {

            }
            return result;
        }
        /// <summary>
        /// 写入PLC数值
        /// </summary>
        /// <param name="DataTag"></param>
        public void WritePLC(string DataTag, string Data)
        {
            try
            {
                #region 逻辑处理

                string Type = "STRING";
                if (DataTag.Contains("STRING"))
                {
                    Type = "STRING";
                }
                else if (DataTag.Contains("DBW"))
                {
                    Type = "Word";
                }
                else if (DataTag.Contains(".B"))
                {
                    Type = "Byte";
                }
                else if (DataTag.Contains("DBD"))
                {
                    Type = "Real";
                }
                else if (DataTag.Contains("DBX"))
                {
                    Type = "Bool";
                }

                
                int strAdr = 0;
                //取到db块号
                int dbInt = dbInt = int.Parse(MidStrEx(DataTag, "DB", ".")); ;
                //字符串类型
                if (Type == "STRING")
                {
                    //取到地址
                    strAdr = int.Parse(MidStrEx(DataTag, "STRING", "."));
                    //写入PLC数据
                    S71500.Write(DataType.DataBlock, dbInt, strAdr, GetPLCStringByteArray(Data));
                }
                else if (Type == "Word")
                {
                    //写入整数型
                    strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
                    S71500.Write(DataType.DataBlock, dbInt, strAdr, Convert.ToInt16(Data));
                }
                else if (Type == "Byte")
                {
                    //写入字节型
                    strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
                    S71500.Write(DataType.DataBlock, dbInt, strAdr, Convert.ToByte(Data));
                }
                else if (Type == "Real")
                {
                    //写入实数
                    strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
                    S71500.Write(DataType.DataBlock, dbInt, strAdr, Convert.ToDouble(Data));
                }
                else if (Type == "Bool")
                {
                    //写入Bool值
                    S71500.Write(DataTag.ToUpper(), Convert.ToBoolean(Data));
                }
                #endregion
            }
            catch (Exception ex)
            {
            //写入异常

            }
        }
        int errorCount = 0;
        /// <summary>
        /// 读取PLC数据
        /// </summary>
        /// <param name="DataTag">Tag点名称</param>
        public string ReadPLC(string DataTag)
        {
            string returnData = "";
            try
            {
                if (DataTag.Contains("STRING"))
                {
                    //取到DB块号
                    int dbInt = dbInt = int.Parse(MidStrEx(DataTag, "DB", "."));
                    //取到偏移量地址
                    int strAdr = int.Parse(MidStrEx(DataTag, "STRING", "."));
                    //获取字符串长度
                    var reservedLength = (byte)S71500.Read(DataType.DataBlock, dbInt, strAdr, VarType.Byte, 1);
                    //读取时在地址前加两位偏移
                    string StrReplac = (string)S71500.Read(DataType.DataBlock, dbInt, strAdr + 2, VarType.String, reservedLength);
                    //去除字符串后面空白符号
                    returnData = StrReplac.Replace("\0", "");
                }
                else if (DataTag.Contains("DBW"))
                {         
                    //读取整数型数据
                    ushort UpValue = (ushort)S71500.Read(DataTag);
                    returnData = Convert.ToString(UpValue);
                }
                else if (DataTag.Contains(".B"))
                {
                    //取到DB块号
                    int dbInt = dbInt = int.Parse(MidStrEx(DataTag, "DB", "."));
                    //取到偏移量地址
                    int strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
                    //获取字符串长度
                    var reservedLength = (byte)S71500.Read(DataType.DataBlock, dbInt, strAdr, VarType.Byte, 1);
                    //将读取数据转为字符串
                    returnData = Convert.ToString(reservedLength);
                }
                else if (DataTag.Contains("DBD"))
                {
                    //读取小数型数据
                    double UpValue = ((uint)S71500.Read(DataTag)).ConvertToFloat();
                    if (Convert.ToString(UpValue).Trim() != "")
                    {
                        //截取保留小数位长度
                        returnData = Math.Round(UpValue, 3).ToString();
                    }
                }
                else if (DataTag.Contains("DBX"))
                {
                    //读取Bool值数据
                    var db1Bool1 = S71500.Read(DataTag);
                    returnData = db1Bool1.ToString();
                }
            }
            catch (Exception ex)
            {
               //读取异常
            }

            return returnData;
        }

        /// <summary>
        /// 获取西门子PLC字符串数组--String
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private byte[] GetPLCStringByteArray(string str)
        {
            byte[] value = Encoding.Default.GetBytes(str);
            byte[] head = new byte[2];
            head[0] = Convert.ToByte(254);
            head[1] = Convert.ToByte(str.Length);
            value = head.Concat(value).ToArray();
            return value;
        }

        /// <summary>
        /// 获取西门子PLC字符串数组--WString
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private byte[] GetPLCWStringByteArray(string str)
        {
            byte[] value = Encoding.BigEndianUnicode.GetBytes(str);
            byte[] head = BitConverter.GetBytes((short)508);
            byte[] length = BitConverter.GetBytes((short)str.Length);
            Array.Reverse(head);
            Array.Reverse(length);
            head = head.Concat(length).ToArray();
            value = head.Concat(value).ToArray();
            return value;
        }
        #endregion


    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/900173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络编程:Socket套接字编程

文章目录&#xff1a; 一&#xff1a;定义和流程分析 1.定义 2.流程分析 3.网络字节序 二&#xff1a;相关函数 IP地址转换函数inet_pton inet_ntop&#xff08;本地字节序 网络字节序&#xff09; socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结…

使用线性回归模型优化权重:探索数据拟合的基础

文章目录 前言一、示例代码二、示例代码解读1.线性回归模型2.MSE损失函数3.优化过程4.结果解读 总结 前言 在机器学习和数据科学中&#xff0c;线性回归是一种常见而重要的方法。本文将以一个简单的代码示例为基础&#xff0c;介绍线性回归的基本原理和应用。将使用Python和Nu…

安卓框架中的常见问题汇总

目录 1.安卓操作系统的组件结构图如下 2.问题汇总 1.安卓操作系统的组件结构图如下 2.问题汇总 问题1&#xff1a;安卓框架中的库和应用程序框架之间什么关系&#xff1f; 在安卓系统中&#xff0c;应用程序框架层&#xff08;Application Framework&#xff09;是核心应用程…

迈向通用听觉人工智能!清华电子系、火山语音携手推出认知导向的听觉大语言模型SALMONN

日前&#xff0c;清华大学电子工程系与火山语音团队携手合作&#xff0c;推出认知导向的开源听觉大语言模型SALMONN (Speech Audio Language Music Open Neural Network)。 大语言模型 SALMONN LOGO 相较于仅仅支持语音输入或非语音音频输入的其他大模型&#xff0c;SALMONN对…

Python爬虫的scrapy的学习(学习于b站尚硅谷)

目录 一、scrapy  1. scrapy的安装  &#xff08;1&#xff09;什么是scrapy  &#xff08;2&#xff09;scrapy的安装 2. scrapy的基本使用  &#xff08;1&#xff09;scrap的使用步骤  &#xff08;2&#xff09;代码的演示 3. scrapy之58同城项目结构和基本方法&…

面试最常问的数组转树,树转数组 c++ web框架paozhu实现

刚毕业同学&#xff0c;找工作常被问 二维数组转树&#xff0c;树转二维数组 需要支持无限层级实现&#xff0c;如果你了解这个语言那么实现起来还要一番思考 c web框架 paozhu使用 需要实现数据库表数据到前台菜单实现&#xff0c;就是这种功能 二维数组转树&#xff0c;树转…

学习笔记:Opencv实现拉普拉斯图像锐化算法

2023.8.19 为了在暑假内实现深度学习的进阶学习&#xff0c;Copy大神的代码&#xff0c;记录学习日常 图像锐化的百科&#xff1a; 图像锐化算法-sharpen_lemonHe_的博客-CSDN博客 在环境配置中要配置opencv&#xff1a; pip install opencv-contrib-python Code and lena.png…

【模拟集成电路】反馈系统——基础到进阶(一)

【模拟集成电路】反馈系统——基础到进阶 前言1 概述2 反馈电路特性2.1增益灵敏度降低2.2 终端阻抗变化2.3 带宽拓展2.4 非线性减小 3 放大器分类4 反馈检测和返回机制4.1 按照检测物理量分类4.2 按照检测拓扑连接分类 5 反馈结构分析6 二端口方法7 波特方法6 麦德布鲁克方法 前…

Go中的有限状态机FSM的详细介绍 _

1、FSM简介 1.1 有限状态机的定义 有限状态机&#xff08;Finite State Machine&#xff0c;FSM&#xff09;是一种数学模型&#xff0c;用于描述系统在不同状态下的行为和转移条件。 状态机有三个组成部分&#xff1a;状态&#xff08;State&#xff09;、事件&#xff08;…

认识Spring框架

目录 1.了解Spring框架 2.了解Spring的体系结构 3.认识Spring家族 4.实现第一个Spring入门程序 1.了解Spring框架 1.什么是Spring框架&#xff1f; Spring是一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面的容器框架。 关键词概念解释&#xff1a; 1.轻量级…

2023国赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

2028量产?兰博基尼首款纯电车型Lanzador亮相,双电机四驱跨界GT

经过多次预热之后&#xff0c;兰博基尼的首款纯电车型Lanzador终于在8月19日正式亮相。这款车以较完整的面貌出现在大众面前&#xff0c;将于2028年开始正式量产。虽然Lanzador仍是一个暂定名字&#xff0c;但它来自西班牙语&#xff0c;意为“投手”、“发射器”和“推动者”&…

C++笔记之注册的含义

C笔记之注册的含义 code review! 文章目录 C笔记之注册的含义1.注册对象到Qt的信号槽系统中2.注册函数到Qt的元对象系统中元对象系统例1例2 3.注册自定义类型到C STL容器中4.将函数指针传递给另一个类&#xff0c;注册回调函数class ICallback存在的意义例1&#xff0c;用于说…

专业课只考2门,计算机学硕最低分290的江苏院校

南京工业大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、专业目录、23复试详情、各专业考情分析。 正文1332字&#xff0c;预计阅读&#xff1a;3分钟。 2023考情概况 南京工业大学计算机相关各专业复试和…

Intellij中直接运行ts配置:run configuration for typescript

在Intellij中可以借助插件run configuration for typescript直接运行typescript&#xff1a; run configuration for typescript插件本质还是依赖于 ts-node 来运行&#xff0c;只是其可以帮助我们自动配置好 ts-node 运行参数&#xff0c;简化使用。 第一步&#xff1a;安装…

uniapp配置添加阿里巴巴图标icon流程步骤

文章目录 下载复制文件到项目文件夹里项目配置目录结构显示图标 下载 阿里巴巴icon官网 https://www.iconfont.cn/ 复制文件到项目文件夹里 项目配置目录结构 显示图标

带你了解建堆的时间复杂度

目录 用向上调整建堆的时间复杂度 1.向上调整建堆的时间复杂度O(N*logN) 2.数学论证 3.相关代码 用向下调整建堆的时间复杂度 1.建堆的时间复杂度为O(N) 2.数学论证 3.相关代码 完结撒花✿✿ヽ(▽)ノ✿✿ 博主建议:面试的时候可能会被面试官问到建堆时间复杂度的证明过…

安卓手机的充电原理

安卓手机的充电原理是通过充电器将交流电转换为直流电&#xff0c;然后通过USB接口传输到手机电池中。手机电池的充电过程分为三个阶段&#xff1a;涓流充电、恒流充电和恒压充电。 充电动画 涓流充电是用来先对完全放电的电池单元进行预充&#xff08;恢复性充电&#xff09…

pdf 转 word

pdf 转 word 一、思路 直接调用LibreOffice 命令进行文档转换的命令行工具 使用的前系统中必须已经安装了 libreofficelibreoffice已翻译的用户界面语言包: 中文 (简体)libreoffice离线帮助文档: 中文 (简体)上传字体 重点&#xff1a;重点&#xff1a;重点&#xff1a; 亲…

蓝光眼镜有效吗?科研团队:无法证明防蓝光镜片可以减少视力伤害

8 月 19 日消息&#xff0c;本次由墨尔本大学、莫纳什大学和伦敦城市大学联合进行的科研团队&#xff0c;对来自 6个国家和地区的 17 项已发表的研究进行了深入研究。他们的研究发现&#xff0c;无法证明防蓝光镜片能够减少眼睛的视力伤害或改善佩戴者的睡眠质量等功效。 这项研…