C# WPF Modbus读写设备数据

本文介绍了如何在C#WPF应用中使用NModbus4库实现Modbus协议,实现连接设备、读取模拟量、整数和浮点数以及写入数据的功能。

C# WPF Modbus读写设备数据

引入NModbus4,thinger.DataConvertLib

在这里插入图片描述

MainWindow.xaml

<Window x:Class="Modbus_demo.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <Grid>
        <StackPanel>
            <TextBlock Text="{Binding testValue}"></TextBlock>
            <Button Content="连接Modbus" Margin="10" Command="{Binding ConnectCommand}"></Button>
            <Button Content="读取数据" Margin="10" Command="{Binding ReadCommand}"></Button>
            <Button Content="写入数据" Margin="10" Command="{Binding writeCommand}"></Button>
        </StackPanel>
    </Grid>
</Window>

MainWindowViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using System.Net;
using System;
using System.Net.Sockets;
using Modbus.Device;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Windows;
using thinger.DataConvertLib;
using DataFormat = thinger.DataConvertLib.DataFormat;
using System.Collections.Generic;
using System.Windows.Documents;
using static ImTools.ImMap;

namespace Modbus_demo.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private string _testValue = "测试值";

        public string testValue
        {
            get { return _testValue; }
            set { SetProperty(ref _testValue, value); }
        }

        public MainWindowViewModel()
        {

        }

        private TcpClient client;
        private ModbusIpMaster master;

        private DelegateCommand _ConnectCommand;
        public DelegateCommand ConnectCommand =>
            _ConnectCommand ?? (_ConnectCommand = new DelegateCommand(ExecuteConnectCommand));

        void ExecuteConnectCommand()
        {
            
            client = new TcpClient();
            client.Connect("127.0.0.1", 502);
            master = ModbusIpMaster.CreateIp(client); 
        }

        private DelegateCommand _ReadCommand;
        public DelegateCommand ReadCommand =>
            _ReadCommand ?? (_ReadCommand = new DelegateCommand(ExecuteReadCommand));

        void ExecuteReadCommand()
        {
            // 读取模拟量
            // ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints)
            // slaveAddress         设备ID
            // startAddress         开始地址
            // numberOfPoints   读取数量
            ushort[] modbusData = master.ReadHoldingRegisters(1,0,10);
            float[] floats = new float[modbusData.Length / 2];
            floats = FloatLib.GetFloatArrayFromByteArray(ByteArrayLib.GetByteArrayFromUShortArray(modbusData), DataFormat.ABCD);
            testValue = floats[0].ToString();

            // 读取整数
            ushort[] modbusData1 = master.ReadHoldingRegisters(2, 0, 10);
            testValue = modbusData1[0].ToString();

            // 读取long
            ushort[] modbusData2 = master.ReadHoldingRegisters(3, 0, 2);
            long value = BitConverter.ToInt32(ByteArrayLib.GetByteArrayFromUShortArray(modbusData2), 0);        // DCBA
            testValue = value.ToString();
        }

        private DelegateCommand _writeCommand;
        public DelegateCommand writeCommand =>
            _writeCommand ?? (_writeCommand = new DelegateCommand(ExecutewriteCommand));

        void ExecutewriteCommand()
        {
            // 写整数
            master.WriteSingleRegister(2, 1, (ushort)12);
            // 写浮点数
            byte[] bs = BitConverter.GetBytes(12.34);
            ushort[] usArray = UShortLib.GetUShortArrayFromByteArray(bs, DataFormat.DCBA);
            master.WriteMultipleRegisters(1, 2, usArray);
        }
    }
}

执行效果

整数读取

在这里插入图片描述

浮点数读取

在这里插入图片描述

Long读取

在这里插入图片描述

整数写入

在这里插入图片描述

浮点数写入

在这里插入图片描述

示例工程下载

https://download.youkuaiyun.com/download/hmxm6/89356467

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值