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; }

}
View Code

 

第五种方式:ReadClass<T> (db,startAddr)

同上面的结果,只是不用new

PlcData data1 = plc.ReadClass<PlcData>(2, 0);

 

 

DB参数值

 db不是数据块中的1,而是DB2中的2

posted on 2025-03-13 16:55  张彦山  阅读(251)  评论(0)    收藏  举报