当前位置:   article > 正文

c#使用s7netplus读取plc数据

s7netplus

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

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

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

首先在使用的地方引用

  1. using ConsoleApp1;
  2. using Microsoft.VisualBasic;
  3. using S7.Net;
  4. using S7.Net.Types;
  5. using System;
  6. using System.ComponentModel.Design;
  7. using System.Text;
  8. Plc plc = new Plc(CpuType.S71500, "192.168.43.14" + "", 0, 1);//机架号,插槽号通常为0和1 ip写仿真软件中设置的ip。
  9. plc.Open();//打开plc连接
  10. if (plc.IsConnected) //判断是否成功
  11. {
  12. Console.WriteLine("PLC连接成功");
  13. }
  14. plc.Close();//关闭连接

其中数据类型:

  1. //plc中类型与c#类型 bool => Bit
  2. //Byte => byte
  3. //word => ushort
  4. //DWord => uint
  5. //Int => short
  6. //DInt => int
  7. //Real => float
  8. //LReal => double
  9. //String => string
  10. //DateTimeLong=>datetime
  11. //s7wstring=>string

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

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

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

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


 

以第一个bool值举例:

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

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

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

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

可以用以下方案:

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

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

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

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

  1. Plc plc = new Plc(CpuType.S71500, "192.168.43.14" + "", 0, 1);//机架号,插槽号通常为0和1 ip写仿真软件中设置的ip。
  2. plc.Open();//打开plc连接
  3. if (plc.IsConnected) //判断是否成功
  4. {
  5. Console.WriteLine("PLC连接成功");
  6. }
  7. //例如获取到第一个
  8. var a = plc.Read("DB1.DBX0.0");//会重复发送tcp请求,效率较低,非特殊情况不建议使用
  9. plc.Write("DB1.DBX0.0", true);//与以上同理
  10. //read方法的参数为,数据库类型默认是数据库:DataBlock。第几个数据库,偏移量,数据类型,读取多少位
  11. int db = 1;
  12. //读取bool
  13. var boolDemo = plc.Read(DataType.DataBlock, db, 0, VarType.Bit, 1);//参数分别为数据块类型,数据块,偏移量,读取类型,读取长度
  14. Console.WriteLine("bool值打印:" + boolDemo);
  15. //写入bool并打印
  16. plc.Write(DataType.DataBlock, db, 0, false);//false表示写入的值
  17. var boolDemoRead = plc.Read(DataType.DataBlock, db, 0, VarType.Bit, 1);
  18. Console.WriteLine("修改后bool值打印:" + boolDemoRead);
  19. //读取word
  20. var wordDemo = plc.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
  21. Console.WriteLine("word值打印:" + wordDemo);
  22. //写入word并打印
  23. plc.Write(DataType.DataBlock, db, 2, (ushort)9);//由于word在c#中是ushort,所以需要提前转换
  24. var wordDemoRead = plc.Read(DataType.DataBlock, db, 2, VarType.Int, 1);
  25. Console.WriteLine("修改后word值打印:" + wordDemoRead);
  26. //读取Dword
  27. var DwordDemo = plc.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
  28. Console.WriteLine("Dword值打印:" + DwordDemo);
  29. //写入Dword并打印
  30. plc.Write(DataType.DataBlock, db, 4, 8);
  31. var DwordDemoRead = plc.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
  32. Console.WriteLine("修改后Dword值打印:" + DwordDemoRead);
  33. //读取int
  34. var intDemo = plc.Read(DataType.DataBlock, db, 8, VarType.Int, 1);
  35. Console.WriteLine("int值打印:" + intDemo);
  36. //写入int并打印
  37. short readInt = 9;//由于plc中的int是c#中的short,所以需要进行类型转换,否则将赋0
  38. plc.Write(DataType.DataBlock, db, 8, readInt);
  39. var intDemoRead = plc.Read(DataType.DataBlock, db, startByteAdr: 8, VarType.Int, 1);
  40. Console.WriteLine("修改后int值打印:" + intDemoRead);
  41. //读取Dint
  42. var DintDemo = plc.Read(DataType.DataBlock, db, 10, VarType.Int, 1);
  43. Console.WriteLine("Dint值打印:" + DwordDemo);
  44. //写入Dint并打印
  45. plc.Write(DataType.DataBlock, db, 10, 100);
  46. var DintDemoRead = plc.Read(DataType.DataBlock, db, 10, VarType.Int, 1);
  47. Console.WriteLine("修改后Dint值打印:" + DintDemoRead);
  48. //读取Real
  49. var RealDemo = plc.Read(DataType.DataBlock, db, 14, VarType.Int, 1);
  50. Console.WriteLine("Real值打印:" + RealDemo);
  51. //写入Real并打印
  52. plc.Write(DataType.DataBlock, db, 14, (float)99.9);//float较特殊,小数会被编译器优先翻译成double
  53. var DrealDemoRead = plc.Read(DataType.DataBlock, db, 14, VarType.Int, 1);
  54. Console.WriteLine("修改后Real值打印:" + DrealDemoRead);
  55. //读取LReal
  56. var LRealDemo = plc.Read(DataType.DataBlock, db, 18, VarType.Int, 1);
  57. Console.WriteLine("LReal值打印:" + LRealDemo);
  58. //写入LRal并打印
  59. plc.Write(DataType.DataBlock, db, 18, 88.88);
  60. var LrealDemoRead = plc.Read(DataType.DataBlock, db, 18, VarType.Int, 1);
  61. Console.WriteLine("修改后Lreal值打印:" + LrealDemoRead);
  62. //读取byte
  63. var byteDemo = plc.Read(DataType.DataBlock, db, 290, VarType.Byte, 1);
  64. Console.WriteLine("byte值打印:" + byteDemo);
  65. //写入byte并打印
  66. plc.Write(DataType.DataBlock, db, 290, (byte)2);
  67. var byteDemoRead = plc.Read(DataType.DataBlock, db, 290, VarType.Byte, 1);
  68. Console.WriteLine("修改后byte值打印:" + byteDemoRead);
  69. //读取date
  70. var dateDemo = plc.Read(DataType.DataBlock, db, 282, VarType.DateTime, 1);//暂时只支持dateandtime
  71. Console.WriteLine("data值打印:" + dateDemo);
  72. //写入data并打印
  73. plc.Write(DataType.DataBlock, 2, 282, System.DateTime.Now);
  74. var dateDemoRead = plc.Read(DataType.DataBlock, db, 282, VarType.DateTime, 1);
  75. Console.WriteLine("修改后data值打印:" + dateDemoRead);
  76. //读取char
  77. var charDemo = plc.Read(DataType.DataBlock, db, 4, VarType.String, 1);
  78. Console.WriteLine("char值打印:" + charDemo);
  79. //写入char并打印
  80. plc.Write(DataType.DataBlock, db, 4, "a");
  81. var charDemoRead = plc.Read(DataType.DataBlock, db, 4, VarType.Int, 1);
  82. Console.WriteLine("修改后char值打印:" + charDemoRead);

比较特殊的:

string:

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

具体代码中有体现

+1表示获取到长度

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

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

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

wstring:

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

  1. //读取wstring
  2. 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中设置的长度,则抛出异常

具体可以看代码实现

  1. //读取array
  2. float[] arrayDemo = (float[])plc.Read(DataType.DataBlock, db, 804, VarType.Real, 10);//array较为特殊,他设定的范围值可能有多种类型,real,int,wrod,bool等,需要根据不同类型做处理
  3. Console.WriteLine("array值打印:" + System.String.Join(",", arrayDemo));
  4. //写入array并打印
  5. for (int i = 0; i < arrayDemo.Length; i++)
  6. {
  7. arrayDemo[i] += 0.1F;
  8. }
  9. plc.Write(DataType.DataBlock, db, 804, arrayDemo);//在原有的基础上修改
  10. float[] arrayDemo2 = { 0.11F, 0.22F };//如果只改变其中一个的话我自己写一个帮助方法去修改传值的array
  11. plc.Write(DataType.DataBlock, db, 804, arrayDemo2);//可以修改少数几个。如果只修改其中几个则修改后完整修改 指针不能超过长度
  12. float[] arrayDemoRead = (float[])plc.Read(DataType.DataBlock, db, 804, VarType.Real, 10);
  13. Console.WriteLine("修改后array值打印:" + System.String.Join(",", arrayDemoRead));

实现了一个帮助类,导入即用:资源链接:https://download.csdn.net/download/qq_53217825/88333254

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/290049
推荐阅读
相关标签
  

闽ICP备14008679号