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

这篇具有很好参考价值的文章主要介绍了.net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

代码中引用S7.net动态库

using S7.Net;

实例化PLC服务名

///

/// 实例化PLC

///

Plc S71500;

连接PLC按钮时间编写:
.net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型

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

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

在DB块中有如下变量
.net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型

        /// <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点信息的读取及写入,代码如下:文章来源地址https://www.toymoban.com/news/detail-414460.html

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


    }
}

到了这里,关于.net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 西门子PLC S7-1500系列CPU与西门子PLC S7-300系列的通讯模块CP343-1进行TCP通讯的方法

    西门子PLC S7-1500系列是西门子新一代PLC产品,它通过多方面的创新,为用户提供了更高性价比的产品,提高了用户的工程实施效率。西门子PLC S7-1500为用户在自动化控制系统中提供了更高的运行能力,而且简单易用,节省了大量的系统开发时间,西门子PLC S7-1500系列有很强的通

    2023年04月08日
    浏览(75)
  • 西门子PLC S7-1200如何实现远程上下载?

    西门子S7-1200是一款高性能的PLC,具有模块化、结构紧凑、功能全面、编程简单的特点,总工业自动化领域中应用广泛,如贴片系统、传送带系统、污水处理厂、配电站、能源管理系统。 在使用过程,无论是为了减少现场调试的成本时间,还是为了给客户提高更快更强的技术

    2024年02月12日
    浏览(36)
  • 西门子S7-1200与S7-300PLC的九大不同点

    S7-1200作为新推出的紧凑型控制器,其产品定位在原有的SIMATIC S7-200和S7-300之间,它与S7-300的区别主要体现在硬件、通信、工程、存储器、功能块、计数器、定时器、工艺功能等方面。 一、硬件的区别 在硬件扩展方面,S7-300的主机架多支持八个扩展模块,而S7-1200支持扩展多八

    2024年01月25日
    浏览(32)
  • 西门子PLC S7-1200程序实例,西门子1200与安川机器人TCP IP通讯

    西门子PLC S7-1200程序实例,博图版本V15 1,西门子1200与安川机器人TCP IP通讯,包含机器人GSD文件; 2,西门子1200控制6轴伺服电机,四台台脉冲控制台达B2伺服,两台PN通讯控制西门子V90伺服电机; 3,两台西门子1200开放式通讯交互数据联动; 4,与4台位移传感器modbus485轮询读取

    2024年04月10日
    浏览(34)
  • 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)
  • 两个西门子S7-1200PLC之间的TCP以太网通讯

    两个西门子S7-1200PLC之间的TCP以太网通讯 西门子S7_1200两个CPU之间的以太网通讯程序,一个做主站一个做从站,可实现两个CPU之间的数据发送和读取,外加两个西门子KTP1200 12寸的触摸屏, 两个西门子S7-1200 PLC之间的TCP以太网通讯 随着工业自动化的发展,越来越多的设备之间需

    2024年02月02日
    浏览(33)
  • 西门子PLC S7-1200程序实例 西门子1200与安川机器人TCP/IP通讯,包含机器人GSD文件

    西门子PLC S7-1200程序实例,博图版本V15,仅供电气编程者学习借鉴, 1,西门子1200与安川机器人TCP/IP通讯,包含机器人GSD文件; 2,西门子1200控制6轴伺服电机,四台台脉冲控制台达B2伺服,两台PN通讯控制西门子V90伺服电机; 3,两台西门子1200开放式通讯交互数据联动; 4,与

    2024年02月11日
    浏览(38)
  • 西门子PLC S7-200SMART Modbus TCP通讯的步骤和要点

    Modbus TCP是一个非常传统,应用广泛的通讯协议,很多智能设备都支持该协议。西门子S7-200SMART及1200、1500系列都免费支持(300和400还是要高昂收费),并且做成了标准库,使用起来非常方便,下面简单介绍一下客户端的配置步骤,服务器的配置更加简单,可以自行摸索: 1、引

    2023年04月09日
    浏览(31)
  • PLC实验—西门子S7 1200读取旋转编码器数据并计算电机转速

    注意PTO控制步进电机实验博途软件需要V14版本,不然没有PTO功能块 软件的下载请点击下方百度网盘的链接 链接:https://pan.baidu.com/s/11mQFVnaQxrUy4W9nGIk8Jw 提取码:6lva 详细的操作指导视频已经放到了B站上 Simens S7-1200读取增量式编码器数据 Simens S7-1200根据编码器数据计算电机转速

    2024年02月05日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包