c#使用s7netplus读取plc数据

这篇具有很好参考价值的文章主要介绍了c#使用s7netplus读取plc数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于plc仿真设置请看上一篇文章:http://t.csdn.cn/XQp2P

首先按转nuget包:S7netplus     这是官网:https://github.com/S7NetPlus/s7netplus/wiki

s7netplus,c#,开发语言

这里的环境使用的是.net core 控制台程序

首先在使用的地方引用

s7netplus,c#,开发语言

using ConsoleApp1;
using Microsoft.VisualBasic;
using S7.Net;
using S7.Net.Types;
using System;
using System.ComponentModel.Design;
using System.Text;


Plc plc = new Plc(CpuType.S71500, "192.168.43.14" + "", 0, 1);//机架号,插槽号通常为0和1   ip写仿真软件中设置的ip。

plc.Open();//打开plc连接
if (plc.IsConnected)   //判断是否成功
{
    Console.WriteLine("PLC连接成功");
}
plc.Close();//关闭连接

其中数据类型:

    //plc中类型与c#类型 bool => Bit
    //Byte => byte
    //word => ushort
    //DWord => uint
    //Int => short
    //DInt => int
    //Real => float
    //LReal => double
    //String => string
    //DateTimeLong=>datetime
    //s7wstring=>string

数据类涉及到最后的转换。需要留意

以上一篇文章博途数据块为例:

点击转至在线》点击第二个点。监视数据块中的值的变化

图中偏移量为所在数据块的位置,与下一个数据相隔的偏移量为占用的字节

s7netplus,c#,开发语言
 

以第一个bool值举例:

var a = plc.Read("DB1.DBX0.0");//会重复发送tcp请求,效率较低,非特殊情况不建议使用
plc.Write("DB1.DBX0.0", true);//与以上同理
//read方法的参数为,数据库类型默认是数据库:DataBlock。第几个数据库,偏移量,数据类型,读取多少位

可以看到a值读取到设置的初始值false

在第2步中修改了bool值之后,博途软件中监视值换成了true

s7netplus,c#,开发语言

以上代码读取一次会重新建立一个tcp连接,非常消耗资源。在实际开发中不建议使用

可以用以下方案:

int db = 1;
//读取bool
var boolDemo = plc.Read(DataType.DataBlock, db,  0, VarType.Bit,  1);//参数分别为数据块类型,数据块,偏移量,读取类型,读取长度

Console.WriteLine("bool值打印:" + boolDemo);
//写入bool并打印
plc.Write(DataType.DataBlock, db, 0, false);//false表示写入的值
var boolDemoRead = plc.Read(DataType.DataBlock, db, 0, VarType.Bit, 1);
Console.WriteLine("修改后bool值打印:" + boolDemoRead);

s7netplus,c#,开发语言

在途中第一个参数,标识数据块类型。第二个标识数据块。我们是db1,所以写:1

偏移量为0      类型为bit     获取长度(除了字符类型和数组类其他都默认1)

以下代码是其他值类型的示例:

Plc plc = new Plc(CpuType.S71500, "192.168.43.14" + "", 0, 1);//机架号,插槽号通常为0和1   ip写仿真软件中设置的ip。

plc.Open();//打开plc连接
if (plc.IsConnected)   //判断是否成功
{
    Console.WriteLine("PLC连接成功");
}
//例如获取到第一个
var a = plc.Read("DB1.DBX0.0");//会重复发送tcp请求,效率较低,非特殊情况不建议使用
plc.Write("DB1.DBX0.0", true);//与以上同理
//read方法的参数为,数据库类型默认是数据库:DataBlock。第几个数据库,偏移量,数据类型,读取多少位

int db = 1;
//读取bool
var boolDemo = plc.Read(DataType.DataBlock, db,  0, VarType.Bit,  1);//参数分别为数据块类型,数据块,偏移量,读取类型,读取长度
Console.WriteLine("bool值打印:" + boolDemo);
//写入bool并打印
plc.Write(DataType.DataBlock, db, 0, false);//false表示写入的值
var boolDemoRead = plc.Read(DataType.DataBlock, db, 0, VarType.Bit, 1);
Console.WriteLine("修改后bool值打印:" + boolDemoRead);

//读取word
var wordDemo = plc.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
Console.WriteLine("word值打印:" + wordDemo);
//写入word并打印
plc.Write(DataType.DataBlock, db, 2, (ushort)9);//由于word在c#中是ushort,所以需要提前转换
var wordDemoRead = plc.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
Console.WriteLine("修改后word值打印:" + wordDemoRead);

//读取Dword
var DwordDemo = plc.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
Console.WriteLine("Dword值打印:" + DwordDemo);
//写入Dword并打印
plc.Write(DataType.DataBlock, db, 4, 8);
var DwordDemoRead = plc.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
Console.WriteLine("修改后Dword值打印:" + DwordDemoRead);

//读取int
var intDemo = plc.Read(DataType.DataBlock, db, 8, VarType.Int, 1);
Console.WriteLine("int值打印:" + intDemo);
//写入int并打印
short readInt = 9;//由于plc中的int是c#中的short,所以需要进行类型转换,否则将赋0
plc.Write(DataType.DataBlock, db, 8, readInt);
var intDemoRead = plc.Read(DataType.DataBlock, db, startByteAdr: 8, VarType.Int, 1);
Console.WriteLine("修改后int值打印:" + intDemoRead);

//读取Dint
var DintDemo = plc.Read(DataType.DataBlock, db, 10, VarType.Int, 1);
Console.WriteLine("Dint值打印:" + DwordDemo);
//写入Dint并打印
plc.Write(DataType.DataBlock, db, 10, 100);
var DintDemoRead = plc.Read(DataType.DataBlock, db, 10, VarType.Int, 1);
Console.WriteLine("修改后Dint值打印:" + DintDemoRead);

//读取Real
var RealDemo = plc.Read(DataType.DataBlock, db, 14, VarType.Int, 1);
Console.WriteLine("Real值打印:" + RealDemo);
//写入Real并打印
plc.Write(DataType.DataBlock, db, 14, (float)99.9);//float较特殊,小数会被编译器优先翻译成double
var DrealDemoRead = plc.Read(DataType.DataBlock, db, 14, VarType.Int, 1);
Console.WriteLine("修改后Real值打印:" + DrealDemoRead);

//读取LReal
var LRealDemo = plc.Read(DataType.DataBlock, db, 18, VarType.Int, 1);
Console.WriteLine("LReal值打印:" + LRealDemo);
//写入LRal并打印
plc.Write(DataType.DataBlock, db, 18, 88.88);
var LrealDemoRead = plc.Read(DataType.DataBlock, db, 18, VarType.Int, 1);
Console.WriteLine("修改后Lreal值打印:" + LrealDemoRead);

//读取byte
var byteDemo = plc.Read(DataType.DataBlock, db, 290, VarType.Byte, 1);
Console.WriteLine("byte值打印:" + byteDemo);
//写入byte并打印
plc.Write(DataType.DataBlock, db, 290, (byte)2);
var byteDemoRead = plc.Read(DataType.DataBlock, db, 290, VarType.Byte, 1);
Console.WriteLine("修改后byte值打印:" + byteDemoRead);

//读取date
var dateDemo = plc.Read(DataType.DataBlock, db, 282, VarType.DateTime, 1);//暂时只支持dateandtime
Console.WriteLine("data值打印:" + dateDemo);
//写入data并打印
plc.Write(DataType.DataBlock, 2, 282, System.DateTime.Now);
var dateDemoRead = plc.Read(DataType.DataBlock, db, 282, VarType.DateTime, 1);
Console.WriteLine("修改后data值打印:" + dateDemoRead);

//读取char
var charDemo = plc.Read(DataType.DataBlock, db, 4, VarType.String, 1);
Console.WriteLine("char值打印:" + charDemo);
//写入char并打印
plc.Write(DataType.DataBlock, db, 4, "a");
var charDemoRead = plc.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
Console.WriteLine("修改后char值打印:" + charDemoRead);

比较特殊的:

string:

需要先获取string值的所占长度。再拿到具体byte值。转换为utf8格式的ascci码

具体代码中有体现

+1表示获取到长度

+2表示获取到跳过偏移长度的字符

string类型只能存储ascci码,需要注意,不能存储中文

//读取string
#pragma warning disable
var count = (byte)plc.Read(DataType.DataBlock, db, 26 + 1, VarType.Byte, 1);//+1表示读取偏移值的长度
byte[] stringDemo = plc.ReadBytes(DataType.DataBlock, db, 26 + 2, count);//+2表示读取偏移值(跳过)的字符
string stringValue = Encoding.Default.GetString(stringDemo);
Console.WriteLine("string值打印:" + stringValue);
//写入string并打印
plc.Write(DataType.DataBlock, db, 26 + 1, (byte)"nihao".Length);//长度需要改成byte类型
plc.Write(DataType.DataBlock, db, 26 + 2, "nihao");
stringDemo = plc.ReadBytes(DataType.DataBlock, db, 26 + 2, count);//获取到byte值
string stringDemoRead = Encoding.Default.GetString(stringDemo);
Console.WriteLine("修改后string值打印:" + stringDemoRead);

wstring:

wstring的读取比较简单,需要注意的是获取的字符需要为254个。因为符号占用了4个字节


//读取wstring
var wstringDemo = plc.Read(DataType.DataBlock, db, startByteAdr: 292, VarType.S7WString, varCount: 254);

array:

array区别于其他方法的原因是:在读取时需要进行转换,例如使用float[]   将博途的real类型转换为float数组类型。在读取时count值也需要和plc中设置的长度一致

在写入时,可以在读取的值上做修改如:arraydemo。

也可以自定义一个新数组。注意新数组的长度可以少于plc中设定的长度。那么长度只能的值会写入生效。例如plc中设置长度为2,我写入的长度只有1,那么数组第一个值会写入,plc中第一个值随之改变,第二个值则不变。如果新数组的长度大于plc中设置的长度,则抛出异常

具体可以看代码实现

//读取array
float[] arrayDemo = (float[])plc.Read(DataType.DataBlock, db, 804, VarType.Real, 10);//array较为特殊,他设定的范围值可能有多种类型,real,int,wrod,bool等,需要根据不同类型做处理
Console.WriteLine("array值打印:" + System.String.Join(",", arrayDemo));

//写入array并打印
for (int i = 0; i < arrayDemo.Length; i++)
{
    arrayDemo[i] += 0.1F;
}
plc.Write(DataType.DataBlock, db, 804, arrayDemo);//在原有的基础上修改
float[] arrayDemo2 = { 0.11F, 0.22F };//如果只改变其中一个的话我自己写一个帮助方法去修改传值的array
plc.Write(DataType.DataBlock, db, 804, arrayDemo2);//可以修改少数几个。如果只修改其中几个则修改后完整修改   指针不能超过长度

float[] arrayDemoRead = (float[])plc.Read(DataType.DataBlock, db, 804, VarType.Real, 10);
Console.WriteLine("修改后array值打印:" + System.String.Join(",", arrayDemoRead));

实现了一个帮助类,导入即用:资源链接:https://download.csdn.net/download/qq_53217825/88333254文章来源地址https://www.toymoban.com/news/detail-822674.html

到了这里,关于c#使用s7netplus读取plc数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C#与西门子PLC通讯——手搓S7通讯协议

    本文将尝试从源码角度,使用Tcp/Ip的方式直接与西门子PLC进行交互通讯。 往期博客参考 C#与西门子PLC通讯——新手快速入门 C#与西门子PLC通讯——熟手快速入门 建议先看一下这两篇,了解预设背景。 知其然,知其所以然。 这篇文章,我们就尝试重复造一个轮子。通过对通讯

    2024年02月04日
    浏览(46)
  • 使用IOT-Tree Server连接西门子PLC S7-300/1200/1500

    IOT-Tree Server是个开源物联网软件,可以作为组态软件成为自动化系统的上位软件。她提供了接入、数据组织管理、控制逻辑和人机交互多个方面的功能。从版本0.99开始,IOT-Tree Server新增了西门子以太网驱动,能够通过以太网的方式直接访问S7-300/1200/1500. S7-200 smart好像也支持

    2024年02月03日
    浏览(60)
  • 使用浏览器访问西门子S7-1200PLC_Web服务器设置

    平常都是用触摸屏或者上位机监控在线查看PLC的数据,在西门子S7-1200中,可以使用博途配置web服务器,通过浏览器进行登录,访问PLC的运行状态及需要监控的数据信息。 打开博途,新建一个项目,选择一个常用的PLC型号,进入编程界面,上述步骤不再赘述;右击mian,点击属

    2024年02月16日
    浏览(98)
  • S7-1200主站读取485数据

    S7-1200做主站,读取485从站数据 ;使用V3.1版本  Modbus_Comm_Load ; 使用V3.1版本  Modbus_Master (版本不同,指令方式稍有不同,记录下) 1)启动读数地址定义 2)Modbus主站初始化 3)Modbus主站指令 4)数据读取完成信号 配置: 1、CM1241属性中的端口组态 2、Modbus_Comm_Load的静态数据中名

    2024年02月17日
    浏览(28)
  • OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换

            在现代工业自动化领域,OPC UA(开放性生产控制和统一架构)是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用,帮助读者更好地理解这一概念。 一、OPC UA的定义         OPC UA全称为“开放性生产控制和统一架构”。简单来说,它是

    2024年01月20日
    浏览(39)
  • OPC UA 开源库编译方法及通过OPC UA连接西门S7-1200 PLC通信并进行数据交换[一]

            在现代工业自动化领域,OPC UA(开放性生产控制和统一架构)是一种广泛应用的通信协议。本文将以通俗易懂的方式解释OPC UA的含义和作用,帮助读者更好地理解这一概念。 一、OPC UA的定义         OPC UA全称为“开放性生产控制和统一架构”。简单来说,它是

    2024年01月16日
    浏览(57)
  • python通过S7协议读取西门子200smart数据

    发现网上很多关于python通过s7协议控制200smart的代码都失败,我猜应该是版本的问题。自己捣鼓了半天,终于测试成功   写PLC 写PLC用到的方法为 write_area(area,dbnumber,start,data) 说明如下:area表示往哪个区去写,如:plc.write_area(client.Areas.DB,1,2,bytes)                 dbnumber:如果是

    2024年01月25日
    浏览(42)
  • C#上位机与三菱PLC的通信07--使用第3方通讯库读写数据

    mcprotocol 是一个基于 Node.js 的三菱 PLC MC 协议通信库,具有以下特点: 支持多种三菱 PLC MC 协议的设备,如 FX3U、Q03UDECPU、QJ71E71 等。 支持多种功能码和数据类型,如读取线圈(M)、读取寄存器(D)、写入寄存器(D)、读取扩展寄存器(D*)、读取位寄存器(X/Y)、读取字寄

    2024年02月19日
    浏览(84)
  • S7-200 PLC编程软件介绍

     更多关于西门子S7-200PLC内容请查看:西门子200系列PLC学习课程大纲(课程筹备中) 西门子200PLC编程软件采用的是 STEP 7-Micro/WIN 软件。 它可以进行编写程序,PLC程序下载与上传,编程向导,程序编译,PLC程序监控等等功能。 1.STEP 7-Micro/WIN 下载地址为: 西门子200编程软件-Micro

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

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

    2024年01月25日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包