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

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

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

cs 复制代码
 //创建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

cs 复制代码
 //第一种读写方式
 //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区

cs 复制代码
//写入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类型

cs 复制代码
 //写入和读取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字节

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

不同类型数据的读取示例

cs 复制代码
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);

控制灯亮

cs 复制代码
  //控制灯亮
  // 一,.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位

相关推荐
白帽黑客沐瑶3 小时前
【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
网络·安全·web安全·计算机·程序员·编程·网络安全就业
侃侃_天下3 小时前
最终的信号类
开发语言·c++·算法
echoarts4 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
树码小子4 小时前
Java网络编程:(socket API编程:TCP协议的 socket API -- 回显程序的服务器端程序的编写)
java·网络·tcp/ip
Aomnitrix4 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
大飞pkz4 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
每天回答3个问题4 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说5 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔5 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
绿箭柠檬茶5 小时前
Ubuntu 服务器配置转发网络访问
服务器·网络·ubuntu