首页 > 其他分享 >WPF上位机 - S7.NETPlus批量读取数据

WPF上位机 - S7.NETPlus批量读取数据

时间:2024-05-03 16:36:05浏览次数:13  
标签:读取数据 SiemensPlc S7 bytes instance NETPlus double AxisInterface

在编写上位机程序中,需要读取PLC数据。使用到了S7.NETPlus 这个库。
S7.NETPlus提供了很多读取和写入数据的方式。大批量读取数据的方式包括一下几个方法

  • Readbytes
  • ReadClass
  • ReadStruct
  • ReadMultipleVars

PLC侧的数据是一个Array的UDT数据,其中UDT中还包含了很多的UDT。在使用库的过程中,发现ReadClass 和 ReadStruct 面对UDT类型的数据时,有时候会报错。
试了很久放弃了ReadClass和Read Struct。 准备使用ReadMultipleVars需要一个VarList,对于使用过程中的变量映射不是很方面,最终还是使用了ReadBytes

var AxisInterface = SiemensPlc.Instance.AxisController.ReadBytes(DataType.DataBlock, SiemensPlc.Instance.InterfaceDB, SiemensPlc.instance.AxisId * 730, 730);
以上代码中使用ReadBytes 读取730个字节的数据到了AxisInterface中。接下来就需要将读取到的数据使用Coverter转换为需要的数据类型。
但是由于西门子PLC 和 PC的存储数据大小端不一致的问题,还要大小端调换一下。这样就非常的麻烦,需要先Reverse在Converter。一个变量需要操作两步。

解决

在阅读S7.NetPlus源码过程中,发现库中已经有了相关的操作。以LReal举例


using System;

namespace S7.Net.Types;

//
// 摘要:
//     Contains the conversion methods to convert Real from S7 plc to C# double.
public static class LReal
{
    //
    // 摘要:
    //     Converts a S7 LReal (8 bytes) to double
    public static double FromByteArray(byte[] bytes)
    {
        if (bytes.Length != 8)
        {
            throw new ArgumentException("Wrong number of bytes. Bytes array must contain 8 bytes.");
        }

        if (BitConverter.IsLittleEndian)
        {
            Array.Reverse(bytes);
        }

        return BitConverter.ToDouble(bytes, 0);
    }

    //
    // 摘要:
    //     Converts a double to S7 LReal (8 bytes)
    public static byte[] ToByteArray(double value)
    {
        byte[] bytes = BitConverter.GetBytes(value);
        if (BitConverter.IsLittleEndian)
        {
            Array.Reverse(bytes);
        }

        return bytes;
    }

    //
    // 摘要:
    //     Converts an array of double to an array of bytes
    public static byte[] ToByteArray(double[] value)
    {
        return TypeHelper.ToByteArray(value, ToByteArray);
    }

    //
    // 摘要:
    //     Converts an array of S7 LReal to an array of double
    public static double[] ToArray(byte[] bytes)
    {
        return TypeHelper.ToArray(bytes, FromByteArray);
    }
}

在S7.NET.Type中 提供了一系列数据类型的相关操作。可以直接使用。
这样根据PLC中数据的变量地址可以快速的写出来。

#region ActualValues
SiemensPlc.instance.actualValus.ActualVelocity = LReal.FromByteArray(AxisInterface[0..8]);
SiemensPlc.instance.actualValus.ActualPosition = LReal.FromByteArray(AxisInterface[8..16]);
SiemensPlc.instance.actualValus.TargetPosition = LReal.FromByteArray(AxisInterface[16..24]);
SiemensPlc.instance.actualValus.IsHomed = Bit.FromByte(AxisInterface[24], 0);
SiemensPlc.instance.actualValus.BrakelsOpen = Bit.FromByte(AxisInterface[24], 1);
SiemensPlc.instance.actualValus.AxisAlarm =DInt.FromByteArray(AxisInterface[26..30]);
SiemensPlc.instance.actualValus.AxisError = Bit.FromByte(AxisInterface[30], 0);
SiemensPlc.instance.actualValus.ErrorDetailReaction = DInt.FromByteArray(AxisInterface[32..36]);

#endregion Actual Values

标签:读取数据,SiemensPlc,S7,bytes,instance,NETPlus,double,AxisInterface
From: https://www.cnblogs.com/Tristan998/p/18171304

相关文章

  • iptables使用详解(centos7)
    iptables使用详解(centos7)小百菜已于2024-03-2114:40:02修改阅读量7.2k收藏22点赞数2文章标签:iptables限速版权GitCode开源社区文章已被社区收录加入社区我们需要安装iptables-services,用来启动和停止iptables服务防火墙配置文件/etc/sysconfig/iptables查......
  • centos7修改redis密码
    检查Redis配置文件首先,我们需要确保Redis的配置文件中包含了设置密码的选项。打开Redis的配置文件/etc/redis.conf,查找以下行并确保取消注释(去掉行首的#):requirepassyour_password启动Redis服务使用以下命令启动Redis服务:systemctlstartredis如果Redis已经在运行,则可以跳......
  • CentOS7的Hadoop集群配置时间同步
    mastervi/etc/ntp.conf点击查看代码[root@masterhadoop]#vim/etc/ntp.conf...前文省略..#Hostsonlocalnetworkarelessrestricted.restrict192.168.10.0mask255.255.255.0nomodifynotrap#Usepublicserversfromthepool.ntp.orgproject.#Please......
  • CentOS7虚拟机磁盘扩容
    新建逻辑分区,识别逻辑分区,创建物理分区,扩展卷组,扩展目标分区。点击查看代码<--删除了一些错误书写-->[root@master~]#fdisk-l磁盘/dev/sda:53.7GB,53687091200字节,104857600个扇区Units=扇区of1*512=512bytes扇区大小(逻辑/物理):512字节/512字节I......
  • 关于在CentOS7的docker容器下启动MySQL5.7.44卡住的问题的解决办法
    最近想在docker中跑一个MySQL5.7版本的服务,而且要基于CentOS,所以着手自己构建镜像。容器的构建参照下面这篇文章基于CentOS7镜像容器的MySQL环境构筑-sxb_sunday-博客园(cnblogs.com)构建完成后,用下面命令启动MySQL服务的时候,启动进程一直卡住没有反应,只能CTRL+C强制停止。......
  • CentOS7 磁盘挂载操作
    我们在使用CentOS7时,一般最好把数据都存放在额外挂载的磁盘上,优点就是防止系统磁盘爆满,以及防止数据丢失。目前使用的Linux操作系统,也绝大部分与CentOS7的操作命令一样,包括一些国产Linux系统。因此本篇博客以CentOS7为例,通过vm虚拟机,介绍如何通过命令操作,挂载一块新......
  • CentOS7上的Mysql8.3允许远程连接
    点击查看代码[root@clone2~]#mysql-uroot-pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis9Serverversion:8.3.0MySQLCommunityServer-GPLCopyright(c)2000,2024,Oracleand/oritsaffiliates......
  • CentOS7安装NVIDIA GPU驱动程序和CUDA工具包
      1.查看本地环境检查GPU型号lspci|grep-invidia查看linux系统版本uname-m&&cat/etc/redhat-release禁用nouveaulsmod|grepnouveau#打开如下文件sudovim/usr/lib/modprobe.d/dist-blacklist.conf#写入以下内容blacklistnouveauoptionsnouveaumodes......
  • centos7数据盘挂载/硬盘挂载/磁盘挂载
    挂载命令:1、数据盘挂载命令:用“lsblk”命令看数据盘信息,确定设备文件名如:dev目录下的vdb。2、执行fdisk/dev/vdb,按界面提示依次输入“n”(新建分区)、“p”(新建扩展分区)、“1”(使用第1个主分区),两次回车,输入“w”(保存分区表),完成后分区vdb1创建完成。3、使用命令对新分区......
  • linux系统 centos7禁止root账号登录
    没有账号的新增账号:sudouseradd-m账号名称sudopasswd账号名称执行完上面命令会让你输入密码输入密码:xxxxxxx1、(注意:禁止root账户登陆前确保有其他账户可以正常使用)编辑配置文件`/etc/ssh/sshd_config`,将`PermitRootLoginyes`改为`PermitRootLoginno`  2、执......