S7net【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.mzph.cn/news/121670.shtml

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

相关文章

LeetCode 1465. 切割后面积最大的蛋糕

矩形蛋糕的高度为 h 且宽度为 w&#xff0c;给你两个整数数组 horizontalCuts 和 verticalCuts&#xff0c;其中&#xff1a; horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离 verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离 请你按数组 horizontalC…

ChatGLM推出第三代基座大模型在论文阅读、文档摘要和财报分析等方面提升超过50%推理成本降低一半...

“ 智谱AI发布了第三代基座大模型ChatGLM3&#xff0c;在模型性能、功能支持、开源序列等方面进行了全面升级。ChatGLM3在语义、数学、推理、代码、知识等不同角度的数据集上测评显示&#xff0c;具有在10B以下的基础模型中最强的性能。同时&#xff0c;ChatGLM3还支持多模态理…

Ubuntu 22.04 开机闪logo后卡在/dev/sda3: clean

环境 Vmware 17.0.0&#xff0c;CPU 2&#xff0c;内存4G&#xff0c;硬盘50G Ubuntu 22.04 问题描述 开机 --> 显示两行代码 --> 显示ubuntu logo --> 左上显示两个代码卡住不动 原因分析 1、网上大多说显卡驱动&#xff0c;最近没安装相关软件&#xff0c;也没…

Xilinx MicroBlaze定时器中断无法返回主函数问题解决

最近在使用Xilinx 7系列FPGA XC7A100T时&#xff0c;运行MicroBlaze软核处理器&#xff0c;添加了AXI TIMER IP核&#xff0c;并使能定时器溢出中断&#xff0c;发现定时器触发中断后&#xff0c;无法返回主函数的问题&#xff0c;最后发现修改编译器优化等级就正常了。 FPGA型…

VirtualBox 安装 麒麟Linux

为了验证Oracle EM是否可以管理麒麟OS和其上的Oracle数据库&#xff0c;今天试着在VirtualBox上装了麒麟Linux&#xff0c;也就是银河麒麟。整个过程比较顺畅。 选定ISO文件后&#xff0c;操作系统自动识别为Red Hat。勾选“跳过自动安装”&#xff1a; 内存和CPU选的默认值&…

力扣labuladong——一刷day10

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣76. 最小覆盖子串二、力扣567. 字符串的排列三、力扣438. 找到字符串中所有字母异位词四、力扣3. 无重复字符的最长子串 前言 一、力扣76. 最小覆盖子串…

Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022

Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类 Chapter1 Qt重定向QDebug&#xff0c;自定义一个简易的日志管理类0.前言1.最简单的操作运行结果2.实现一个简易的日志管理类 Chapter2 Qt::Qt Log日志模块Qt Log日志模块官方解释官方Demo思路 Chapter3 QT日志模块的个性…

ssm164学院学生论坛的设计与实现+vue

项目名称&#xff1a;ssm164学院学生论坛的设计与实现vue 点击这里进入源码目录 声明&#xff1a; 适用范围&#xff1a; 本文档适用于广泛的学术和教育用途&#xff0c;包括但不限于个人学习、毕业设计和课程设计。免责声明&#xff1a; 特此声明&#xff0c;本文仅供参考学…

C# 图解教程 第5版 —— 第12章 枚举

文章目录 12.1 枚举12.1.1 设置底层类型和显式值12.1.2 隐式成员编号 12.2 位标志12.2.1 Flags 特性12.2.2 使用位标志的示例&#xff08;*&#xff09; 12.3 关于枚举的更多内容 12.1 枚举 枚举是值类型。只有一种类型的成员&#xff1a;命名的整数值常量。 每个枚举成员都被…

学习Java应该关注哪些网站?

前言 下面是我总结的一些不错的网站&#xff0c;可以收藏看一下哈~希望对你有帮助 一、入门教程类 主要是教程性质的网站&#xff0c;主要是新手学习参考以及相关知识的内容参考 1、菜鸟教程&#xff08;https://www.runoob.com&#xff09; 2、Java学习笔记&#xff08;http…

【c代码】【字符串数组排序】

实现字符串数组由小到大排序 代码如下 注意有句代码是strcpy(tmp,s[i]); →注意此是tmp和s[i]作比较 已调试√ #include<stdio.h> #include<string.h> int main() {char s[150][150];for(int i0;i<3;i){gets(s[i]); //注意是s[i] } //字符串数组从小到大排序 …

redolog和undolog

一、什么是redolog redolog是基于InnoDB存储引擎下的日志文件&#xff0c;也叫重做日志。用于记录数据页的物理变化&#xff0c;记录数据修改后的值。无论事务是否成功提交都会产生记录。当mysql产生故障&#xff0c;可以采用redolog日志恢复数据&#xff0c;同时redolog日志是…

PostGreSQL模式schema

问题引入 之前在做数据库设计时&#xff0c;经常会忽略schema模式&#xff0c;直接在数据库下的public模式下建立各类数据表。如果数据表命名不够规范&#xff0c;后期寻找某张表时就会比较麻烦。通过 所幸&#xff0c;PostgreSQL 的模式schema管理&#xff0c;可以对这个问题…

VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴

本文 以 Python 语言开发 我们在做三维软件开发时&#xff0c;经常会用到相机坐标轴&#xff0c;来指示当前空间位置&#xff1b; 坐标轴效果&#xff1a; 相机方向坐标轴 Cube 正方体坐标轴 自定义坐标轴&#xff1a; Code&#xff1a; Axes def main():colors vtkNamedC…

(四)库存超卖案例实战——优化redis分布式锁

前言 在上一节内容中&#xff0c;我们已经实现了使用redis分布式锁解决商品“超卖”的问题&#xff0c;本节内容是对redis分布式锁的优化。在上一节的redis分布式锁中&#xff0c;我们的锁有俩个可以优化的问题。第一&#xff0c;锁需要实现可重入&#xff0c;同一个线程不用重…

机器学习之朴素贝叶斯

朴素贝叶斯&#xff1a; 也叫贝叶算法推断&#xff0c;建立在主管判断的基础上&#xff0c;不断地进行地修正。需要大量的计算。1、主观性强2、大量计算 贝叶斯定理&#xff1a;有先验概率和后验概率区别&#xff1a;假如出门堵车有两个因素&#xff1a;车太多与交通事故先验概…

归结原理、归结演绎推理

主要内容 归结演绎推理范式子句与子句集将谓词公式转化为子句集命题逻辑鲁宾逊归结原理 归结演绎推理 定理证明的实质是对前提P和结论Q证明P →Q的永真性应用反证法&#xff0c;欲证明P →Q&#xff0c;只要证明 P∧~Q 等价于 F鲁宾逊归结原理对机械化推理有重大突破鲁宾逊归…

Linux—vmstat命令详解

vmstat概念 vmstat命令是 Virtual Meomory Statistics&#xff08;虚拟内存统计&#xff09;的缩写&#xff0c;可用来动态监控系统资源的 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息使用情况 vmstat下载 yum -y install sysstat vmstat命令参数…

XJ+Nreal 高精度地图+Nreal眼镜SDK到发布APK至眼镜中

仅支持Anroid平台 Nreal套装自带的计算单元&#xff0c;其实也是⼀个没有显示器的Android设备 新建unity⼯程&#xff0c;将⼯程切换Android平台。 正在上传…重新上传取消正在上传…重新上传取消 Cloud XDK Unity User Manual for Nreal ARGlasses 该XDK是针对 NReal AR 眼镜…

vue axios请求两种方式,出现401错误,需要添加config配置

file文件的转化 const uint8Array xxxxx;//总之先拿到uint8Array 格式的话 let mBuffer Buffer.from(uint8Array); //转buffer this.mBlob new Blob([mBuffer], { type: application/pdf;charsetutf-8 }); //这里是转blob this.mFile new File([this.mBlob], merged.pdf, …