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

被折叠的 条评论
为什么被折叠?



