当前位置: 首页 > news >正文

西门子s7第三方(S7netplus)读写操作

和西门子PLC通讯需要使用S7netplus​​这个包,可以在NuGet​​上搜索下载,下载后引入命令空间using S7.Net;​​

创建PLC对象进行连接使用Write Read进行读写操作即可不需要在发请求帧

 //创建Plc对象Plc plc;
//西门子设备是s7-1200//参数1 CPu类型//参数2 ip地址// 参数3 机架号//参数4 插槽plc = new Plc(CpuType.S71200, "192.168.107.202", 0, 0);

plc.Open()打开连接即可进行读写操作

第一种读写方式:

不建议使用这种方法每使用这个方法都要重新运行效率慢

注:在进行读写操作一定要把值进行转换(PLC和C#值不相等)不然读写失败或为0

 //第一种读写方式//DBX 位类型 bool 默认true/false//DBB  byte 字节//DBW  int 整型//DBD real  浮点
//写入DB1,DBW16这个地址 DB1 块号, DBW16:16地址存储是word类型相当于c#short类型ushort a = 888;plc.Write("DB1.DBW16",a);//把数据a写入指定位置//读取数据ushort b=(ushort)  plc.Read("DB1.DBW16");Console.WriteLine(b);

第二种:读写DB区

//写入word和读取word
//参数1 读取那种存储区 DataType.DataBlock:DB块
//参数2 DB块号 1
//参数3 写入地址
//参数4 写入内容plc.Write(DataType.DataBlock,1,16,(ushort)666);
//参数1 存储区类型 参数2:db块号,参数3 地址 参数4数据类型 参数5:读取长度
var b1=   plc.Read(DataType.DataBlock,1,16,VarType.Int,1);Console.WriteLine(b1);

读写DB区bool类型

 //写入和读取bool类型//写入DB1.DBX0.4位plc.Write(DataType.DataBlock,1,4,true);var b2= plc.Read(DataType.DataBlock,1,4,VarType.Bit,1);Console.WriteLine(b2);// plc.Write("DB1.DBX0.4",true);
//Console.WriteLine((bool)plc.Read("DB1.DBX0.4"));
以上两个方法都可实现

读写byte字节

 //写入和读取字节类型plc.Write(DataType.DataBlock,1,4,(byte)6);var b3 = plc.Read(DataType.DataBlock, 1, 4, VarType.Byte, 1);Console.WriteLine(b3);

不同类型数据的读取示例

Console.WriteLine("--------------DateTime-------------------");
DateTime t = (DateTime)plc.Read(DataType.DataBlock, 21, 44, VarType.DateTimeLong, 1);
Console.WriteLine(t);
Console.WriteLine("--------------DWord-------------------");
uint i1 = (uint)plc.Read("DB21.DBD4");
Console.WriteLine(i1);
i1 = (uint)plc.Read(DataType.DataBlock, 21, 4, VarType.DWord, 1);
Console.WriteLine(i1);Console.WriteLine("--------------USInt-------------------");
b1 = (byte)plc.Read("DB21.DBB1");
Console.WriteLine(b1);
b1 = (byte)plc.Read("DB21.DBB8");
Console.WriteLine(b1);
b1 = (byte)plc.Read(DataType.DataBlock, 21, 8, VarType.Byte, 1);
Console.WriteLine(b1);Console.WriteLine("--------------SInt-------------------");
sbyte b2 = (sbyte)(byte)plc.Read("DB21.DBB9");
Console.WriteLine(b2);
b2 = (sbyte)(byte)plc.Read(DataType.DataBlock, 21, 9, VarType.Byte, 1);
Console.WriteLine(b2);Console.WriteLine("--------------UInt-------------------");
ushort us = (ushort)plc.Read("DB21.DBW10");
Console.WriteLine(us);
us = (ushort)plc.Read(DataType.DataBlock, 21, 10, VarType.Word, 1);
Console.WriteLine(us);Console.WriteLine("--------------Int-------------------");
short s = (short)(ushort)plc.Read("DB21.DBW12");
Console.WriteLine(s);Console.WriteLine("--------------UDInt-------------------");
uint ui = (uint)plc.Read("DB21.DBD14");
Console.WriteLine(ui);
ui = (uint)plc.Read(DataType.DataBlock, 21, 14, VarType.DWord, 1);
Console.WriteLine(ui);Console.WriteLine("--------------DInt-------------------");
int i = (int)(uint)plc.Read("DB21.DBD18");
Console.WriteLine(i);
i = (int)plc.Read(DataType.DataBlock, 21, 18, VarType.DInt, 1);
Console.WriteLine(i);Console.WriteLine("--------------Real-------------------");
float f = ((uint)plc.Read("DB21.DBD22")).ConvertToFloat();
Console.WriteLine(f);
f = (float)plc.Read(DataType.DataBlock, 21, 22, VarType.Real, 1);
Console.WriteLine(f);

 控制灯亮

  //控制灯亮// 一,.2指示灯不可控,闪烁表示PLC工作正常//二,如果把Bool量 % M10.1置1,则.3指示灯点亮plc.Write("M10.1", 1);//点亮plc.Write("M10.1", 0);//灯灭//三,把Bool量 % Q0.4置1,则.4指示灯点亮plc.Write("Q0.4", 1);plc.Write("Q0.4",0);//四,% MW100为16位INT型数据,写入数字小于 - 5可以点亮.5指示灯,大于等于 - 5不能点亮short a = -6;plc.Write("MW100",a);//灯亮plc.Write("MW100", (short)9);//灯灭

 

总结

只需要根据plc中类型的可存储数据范围即可轻松找到对应的C#数据类型

地址是plc中数据存储的位置,我们通常通过地址进行plc数据的操作,格式一般为区+地址​,如果是DB区的数据,需要额外加上DB块编号和数据类型

DB21.DBX2.2​中DB表示访问DB块,DB块的编号为21,DBX中前面的DB是固定的,X表示读取位,也就是bool,2.2表示读取第2个字节的第2个位,如果读取的不是位,就不需要写.2​了

DBX => 1位 DBB => 8位 DBW => 16位 DBD => 32位

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从0开始搭建vue + flask 旅游景点数据分析系统(一):创建前端项目
  • 2024电赛H题参考方案(+视频演示+核心控制代码)——自动行使小车
  • 函数式编程范式
  • go-kratos 学习笔记(6) 数据库gorm使用
  • 后端返回列表中包含图片id,如何将列表中的图片id转化成url
  • vue3 命令运行窗口暴露网络地址,以及修改端口号
  • AI技术革命对未来就业的影响
  • GUI图形化界面操作(下部)
  • 基于Java的微博传播分析系统的设计与实现
  • 设计模式实战:任务调度系统的设计与实现
  • Vue2从基础到实战(v-bind对于样式控制的增强-操作style)
  • Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL
  • 2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展
  • UE5.4内容示例(3)FBX_Import_Options - 学习笔记
  • postMessage 收到消息类型 “webpackWarnings“
  • CSS实用技巧干货
  • JavaScript实现分页效果
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Web设计流程优化:网页效果图设计新思路
  • 技术:超级实用的电脑小技巧
  • 前端技术周刊 2019-01-14:客户端存储
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我是如何设计 Upload 上传组件的
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # Apache SeaTunnel 究竟是什么?
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #define与typedef区别
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (十三)Flask之特殊装饰器详解
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)项目管理杂谈-我所期望的新人
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .env.development、.env.production、.env.staging
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core中的时区转换问题
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET中GET与SET的用法
  • .py文件应该怎样打开?
  • @RequestBody与@RequestParam
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ solr入门 ] - 利用solrJ进行检索
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [ANT] 项目中应用ANT
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C#]winform部署yolov5-onnx模型
  • [C++随笔录] 红黑树