S7net【C#】

news/2024/6/18 19:07:44 标签: c#, 开发语言

C#项目,跟西门子PLC通讯

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using S7.Net;

namespace MeProgram
{
    public class S7NetPlc
    {
        Plc plc;
        /// <summary>
        /// 初始化S7NetPLC
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="CPUType"></param>
        public S7NetPlc(string IP, string CPUType ="S71200")
        {
            CreatePlc(IP, CPUType);
        }

        /// <summary>
        /// 实例化PLC  IP和CPU型号  CPU型号默认S71200
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="cpu"></param>
        void CreatePlc(string ip, string cpu)
        {
            CpuType cputype = new CpuType();
            if (Enum.TryParse(cpu.ToUpper(), out cputype))
            {
                plc = new Plc(cputype, ip, 0, 1);
            }
            else
            {
                Console.WriteLine("CPU型号错误");
            }
        }
        /// <summary>
        /// 连接PLC 再次调用可重新连接
        /// </summary>
        public async void Connet()
        {
            try
            {
                await plc.OpenAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        /// <summary>
        /// PLC连接状态
        /// </summary>
        /// <returns></returns>
        public bool ConnetStatus()
        {
            return plc.IsConnected;
        }

        #region 读取PLC数据
        /// <summary>
        /// 读取PLC 输入点 i
        /// </summary>
        /// <param name="start">开始的地址</param>
        /// <param name="字节数">读取字节数量</param>
        /// <returns></returns>
        public BitArray Get_I(int 地址I点, int 数量)
        {
            BitArray bitArray = new BitArray(数量);
            try
            {
                if (plc.IsConnected)
                {
                    bitArray = (BitArray)plc.Read(DataType.Input, 0, 地址I点, VarType.Bit, 数量);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return bitArray;
        }
        /// <summary>
        /// 读取PLC 输出点Q
        /// </summary>
        /// <param name="start">开始的地址</param>
        /// <param name="字节数">读取字节数量</param>
        /// <returns></returns>
        public BitArray Get_Q(int 地址Q点, int 数量)
        {
            BitArray bitArray = new BitArray(数量);
            try
            {
                if (plc.IsConnected)
                {
                    bitArray = (BitArray)plc.Read(DataType.Output, 0, 地址Q点, VarType.Bit, 数量);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return bitArray;
        }
        /// <summary>
        /// 读取PLC默认寄存器地址
        /// </summary>
        /// <param name="地址M点"></param>
        /// <param name="字节数"></param>
        /// <returns></returns>
        public BitArray Get_M(int 地址M点, int 数量)
        {
            BitArray bitArray = new BitArray(数量);
            try
            {
                if (plc.IsConnected)
                {
                    bitArray = (BitArray)plc.Read(DataType.Memory, 0, 地址M点, VarType.Bit, 数量);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return bitArray;
        }
        /// <summary>
        /// 批量读取连续的 bool 值
        /// </summary>
        /// <param name="DB"></param>
        /// <param name="起始地址"></param>
        /// <param name="数量"></param>
        /// <returns></returns>
        public BitArray Get_BitArray(int DB, int 偏移量, int 数量)
        {
            BitArray bitArray = new BitArray(数量);
            try
            {
                if (plc.IsConnected)
                {
                    bitArray = (BitArray)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Bit, 数量);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return bitArray;
        }
        /// <summary>
        /// 读取PLC DB块字节数据
        /// </summary>
        /// <param name="DB">DB块</param>
        /// <param name="start">开始的偏移量</param>
        /// <param name="字节数">读取的长度</param>
        /// <returns></returns>
        public byte[] Get_bytes(int DB, int 偏移量, int 数量)
        {
            byte[] db_byte = new byte[数量];
            try
            {
                if (plc.IsConnected)
                {
                    db_byte = plc.ReadBytes(DataType.DataBlock, DB, 偏移量, 数量);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_byte_Error:" + ex.Message);
            }
            return db_byte;
        }
        /// <summary>
        /// 读取PLC DB快16位有符号数据 
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <returns></returns>
        public short Get_int(int DB, int 偏移量)
        {
            short data = 0;
            try
            {
                if (plc.IsConnected)
                {
                    data = (short)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Int, 1);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_int_Error:" + ex.Message);
            }
            return data;
        }
        /// <summary>
        /// 读取PLC DB块32位有符号数据
        /// </summary>
        /// <param name="DB"></param>
        /// <param name="偏移量"></param>
        /// <returns></returns>
        public int Get_Dint(int DB, int 偏移量)
        {
            int data = 0;
            try
            {
                if (plc.IsConnected)
                {
                    data = (int)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.DInt, 1);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_Dint出错:" + ex.Message);
            }

            return data;
        }
        /// <summary>
        /// 读取PLC DB快16位无符号数据
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <returns></returns>
        public ushort Get_Word(int DB, int 偏移量)
        {
            ushort data = 0;
            try
            {
                if (plc.IsConnected)
                {
                    data = (ushort)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Word, 1);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_Word_Error:" + ex.Message);
            }
            return data;
        }
        /// <summary>
        /// 读取PLC DB快32位无符号数据
        /// </summary>
        /// <param name="DB"></param>
        /// <param name="偏移量"></param>
        /// <returns></returns>
        public uint Get_DWord(int DB, int 偏移量)
        {
            uint data = 0;
            try
            {
                if (plc.IsConnected)
                {
                    data = (uint)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.DWord, 1);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_DWord出错:" + ex.Message);
            }
            return data;
        }
        /// <summary>
        /// 读取PLC Timer 类型数据
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <returns></returns>
        public int Get_Timer(string 绝对地址)
        {
            object ss = 0;
            try
            {
                if (plc.IsConnected)
                {
                    ss = plc.Read(绝对地址.ToUpper());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_Timer_Error:" + ex.Message);
            }
            int fs = Convert.ToInt32(ss);
            return fs;
        }
        /// <summary>
        /// 读取PLC Real 类型数据
        /// </summary>
        /// <param name="绝对地址">PLC绝对地址</param>
        /// <returns></returns>
        public float Get_Real(int DB, int 偏移量)
        {
            float result = 0;
            try
            {
                if (plc.IsConnected)
                {
                    result = (float)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Real, 1);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_Real_Error:" + ex.Message);
            }
            return result;
        }
        /// <summary>
        /// 读取PLC string 类型数据
        /// </summary>
        /// <param name="DB">DB块</param>
        /// <param name="偏移地址">开始的偏移量</param>
        /// <returns></returns>
        public string Get_String(int DB, int 偏移量)
        {
            string 返回值 = string.Empty;
            try
            {
                if (plc.IsConnected)
                {
                    //西门子字符串长度 第一个字节是字符串的总长度 第二个是字符串的当前长度 要从当前字节的+1字节读取当前长度
                    var bytelen = (byte)plc.Read(DataType.DataBlock, DB, 偏移量 + 1, VarType.Byte, 1);
                    返回值 = (string)plc.Read(DataType.DataBlock, DB, 偏移量 + 2, VarType.String, bytelen);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("读取PLC_String_Error:" + ex.Message);
            }
            return 返回值;
        }
        #endregion

        #region 写入PLC数据
        /// <summary>
        /// 写入PLC输出点Q 地址
        /// </summary>
        /// <param name="输出Q">Q5.0 的5</param>
        /// <param name="第几位">Q5.4 的4</param>
        /// <param name="值">值</param>
        public void Set_Q(int 输出Q, int 第几位, bool 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.WriteBit(DataType.Output, 0, 输出Q, 第几位, 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入Q点出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC默认寄存器地址
        /// </summary>
        /// <param name="地址M"></param>
        /// <param name="第几位"></param>
        /// <param name="值"></param>
        public void Set_M(int 地址M, int 第几位, bool 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.WriteBit(DataType.Memory, 0, 地址M, 第几位, 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入M地址:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLCDB块 bool 类型地址
        /// </summary>
        /// <param name="DB"></param>
        /// <param name="偏移量">分配的第几个字节</param>
        /// <param name="第几位">字节里的第几位</param>
        /// <param name="值"></param>
        public void Set_Bit(int DB, int 偏移量, int 第几位, bool 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.WriteBit(DataType.DataBlock, DB, 偏移量, 第几位, 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_bool出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC DB块16位有符号数据
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <param name="值"></param>
        public void Set_int(string 绝对地址, short 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.Write(绝对地址.ToUpper(), 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_int出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC DB块32位有符号数据
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <param name="值"></param>
        public void Set_Dint(string 绝对地址, int 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.Write(绝对地址.ToUpper(), 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_Dint出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC DB块16位无符号数据
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <param name="值"></param>
        public void Set_Word(string 绝对地址, ushort 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.Write(绝对地址.ToUpper(), 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_Word出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC DB块32位无符号数据
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <param name="值"></param>
        public void Set_DWord(string 绝对地址, uint 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.Write(绝对地址.ToUpper(), 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_DWord出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC Real 类型地址
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <param name="值"></param>
        public void Set_Real(string 绝对地址, float 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.Write(绝对地址.ToUpper(), 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_Real出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC Timer 类型地址
        /// </summary>
        /// <param name="绝对地址"></param>
        /// <param name="值"></param>
        public void Set_Timer(string 绝对地址, int 值)
        {
            try
            {
                if (plc.IsConnected)
                {
                    plc.Write(绝对地址.ToUpper(), 值);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_Timer出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 写入PLC string 类型地址
        /// </summary>
        /// <param name="DB">DB块</param>
        /// <param name="偏移地址">分配的偏移量</param>
        /// <param name="值"></param>
        public void Set_String(int DB, int 偏移量, string Values)
        {
            try
            {
                if (plc.IsConnected)
                {
                    var lenMax = (byte)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Byte, 1);//拿到地址申请的字节长度
                    plc.Write(DataType.DataBlock, DB, 偏移量, GetStringByteArray(lenMax, Values));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写入PLC_String出错:" + ex.Message);
            }
        }
        /// <summary>
        /// 把 string数据 转换成西门子String数据格式
        /// </summary>
        /// <param name="datastring"></param>
        /// <returns></returns>
        private byte[] GetStringByteArray(byte LenMax, string Values)
        {
            byte[] byteArray = Encoding.Default.GetBytes(Values);
            byte[] sheel = new byte[2];
            sheel[0] = Convert.ToByte(LenMax);//申请的最大内存
            sheel[1] = Convert.ToByte(Values.Length);//当前字符长度
            return sheel.Concat(byteArray).ToArray();
        }
        #endregion
    }
}


http://www.niftyadmin.cn/n/5123959.html

相关文章

智能低代码洪流涌动程序员节 华为云Astro触发1024的乘法效应

从人工智能至量子计算&#xff0c;再到最新的云原生技术&#xff0c;越来越多的荣耀被程序员斩获。今年1024程序员节&#xff0c;华为云Astro向全民致敬&#xff1a;「低代码高产出 拓荒数字化版图——人人皆是程序员」&#xff0c;为全球工程师及开发爱好者呈现智能化开发的魅…

【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】

文章目录 排序算法小结排序算法C实现 排序算法小结 C语言中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。下面我们来一一介绍&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;冒泡排序是通过比较相邻元素的大小进行排…

CRD3 小陈读paper

KD损失 比较常见了 对于源模态上的原始训练任务&#xff0c;此类数据没有真实标签 y&#xff0c;因此我们忽略我们测试的所有目标中的 H(y, yS ) 项。 这个比较适合看图 Experiments 我们在三个知识蒸馏任务中评估我们的对比表示蒸馏 (CRD) 框架&#xff1a; &#xff08;a&a…

Mac怎么删除文件和软件?苹果电脑删除第三方软件方法

Mac删除程序这个话题为什么一直重复说或者太多人讨论呢&#xff1f;因为如果操作不当&#xff0c;可能会导致某些不好的影响。因为Mac电脑如果有太多无用的应用程序&#xff0c;很有可能会拖垮Mac系统的运行速度。或者如果因为删除不干净&#xff0c;导致残留文件积累在Mac电脑…

嵌入式学习5大误区,你中招了吗?

目录 误区1&#xff1a;错把自己当稚晖君 误区2&#xff1a;错误的学习方法 误区3&#xff1a;忽略时间成本 误区4&#xff1a;缺乏系统思维 误区5&#xff1a;追求完美主义 误区1&#xff1a;错把自己当稚晖君 稚晖君能够以一己之力创造一个个惊艳的产品&#xff0c;离不…

JS初步了解闭包(含实践)

闭包的概念&#xff1a; 一个函数对周围状态的引用捆绑在一起&#xff0c;内层函数中访问到其外层函数的作用域 简单理解&#xff1a; 闭包内层函数 外层函数的变量 闭包的作用&#xff1a;封闭数据&#xff0c;提供操作&#xff0c;外部也可以访问函数内部的变量 闭包基本格式…

uniapp接口请求api封装,规范化调用

封装规范和vue中的差不多&#xff0c;都是统一封装成一个request对象&#xff0c;然后在api.js里面调用。 先创建一个utils文件夹&#xff0c;然后里面创建一个request.js&#xff0c;代码如下&#xff1a; export const baseURL 基础url地址const request (options) > …

CSS隐藏元素的N种方法,你知道哪一种最适合你?

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、前…