S7.Net读取二

1.PLC读存储区数据---字符串读取
一个字符串的长度为256
最多可以放254个字符,形成一个字符数组,读出来我们按照字节读取

重新编译,自动生成偏移量

前面两位存的不是字符串的内容,从第三位开始才是字符串内容
第一个存储的是总字符数
第二个存的是当前字符数
起始偏移量+2才是字符串开始

修改字符串的值,右键 --修改操作数


修改数据块,就要重新下载装载

重新初始化


取整体

第一种方式:字符串读取整个字符串
无法读取P#DB3.DBX0.0
DB3.DBX0.0读取为false
使用第二种:参数连续读取的方式
//字符串默认长度254
var totalCount = plc.Read(DataType.DataBlock, 3, 0, VarType.Byte, 1);
//实际长度
var strCount = plc.Read(DataType.DataBlock, 3, 1, VarType.Byte, 1);
//读取字符串
string str= plc.Read(DataType.DataBlock, 3, 2, VarType.String, Convert.ToInt32(strCount)).ToString();
读取中文

一个中文是两个字节
//实际中文长度
var str2Count = plc.Read(DataType.DataBlock, 3, 257, VarType.Byte, 1);//运行中,三个字,长度为6,一个中文2个字节
//中文字符串
//string str2 = plc.Read(DataType.DataBlock, 3, 258, VarType.String, Convert.ToInt32(str2Count)).ToString();//读出来的是问号??????
第三种方式 ReadBytes 读取字节数组,再转中文编码
var bytes = plc.ReadBytes(DataType.DataBlock, 3, 258, Convert.ToInt32(str2Count)); //读取Bytes
string str4 = Encoding.Default.GetString(bytes);//方块������
//netcore要安装依赖包 System.Text.Encoding.CodePages
//添加注册 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding encoding = Encoding.GetEncoding("gbk");//安装依赖才会识别gbk
string str3 = encoding.GetString(bytes); //
一次性按字节读取多个数据 ReadBytes ,再拆分
//“Big-endian”表示最重要的字节位于单词的左端,大小。 “Little-endian”表示最重要的字节位于单词的右端,小大
小大端要反转数组才能取到正确的值
byte[] arrList = plc.ReadBytes(DataType.DataBlock, 2, 0, 13); //count的值 byte[] arrList01 = arrList.Take(2).ToArray(); if (BitConverter.IsLittleEndian) arrList01 = arrList01.Reverse().ToArray(); ushort count = BitConverter.ToUInt16(arrList01, 0); //rcount 值 byte[] arrList02 = arrList.Skip(2).Take(4).ToArray(); if (BitConverter.IsLittleEndian) arrList02 = arrList02.Reverse().ToArray(); uint rcount = BitConverter.ToUInt32(arrList02, 0); byte length = arrList[6]; byte[] arrlist03 = arrList.Skip(8).Take(length).ToArray(); string str02 = Encoding.Default.GetString(arrlist03);
第四种方式:ReadClass (model,db,startAddr)
直接读取到类, 自动分配
DInt占4个字节32位::用字段用int类型
Uint无符号16位ushort类型和int类型:占2个字节16位用字段用short类型
string只能存英文字符串,属性要加特性标识[S7String(S7StringType.S7String,254)]
wstring可以存中文,属性要加特性标识[S7String(S7StringType.S7WString, 254)]
定义的实体类要和配置的变量名相同,顺序相同,不能乱
私有变量和适配器的 { get; set; }的 不能读
PlcData data = new PlcData();
plc.ReadClass(data, 2, 0);
数据块

监视

读取类
public class Plc2 { public int Dint01 { get; set; } public bool bool01 { get; set; } [S7String(S7StringType.S7String, 254)] public string string01 { get; set; }//前面2为长度,后面为内容 public short uint01 { get; set; } [S7String(S7StringType.S7String,254)] public string string02 { get; set; }//前面2为长度,后面为内容,如果存中文,直接读取为??????? public short int01 { get; set; } [S7String(S7StringType.S7WString, 254)] public string wstring { get; set; }//前面4为长度,后面为内容 public byte Static_1 { get; set; } public short word01 { get; set; } //word数组 public short array01 { get; set; } public short array02 { get; set; } public short array03 { get; set; } public short array04 { get; set; } public short array05 { get; set; } }
第五种方式:ReadClass<T> (db,startAddr)
同上面的结果,只是不用new
PlcData data1 = plc.ReadClass<PlcData>(2, 0);
DB参数值

db不是数据块中的1,而是DB2中的2
浙公网安备 33010602011771号