2014-08-28 update 1

This commit is contained in:
parallelbgls@outlook.com
2014-08-28 11:04:32 +08:00
parent eb631389a9
commit e0fea8731e
7 changed files with 142 additions and 20 deletions

View File

@@ -44,6 +44,7 @@
<Compile Include="AddressTranslator.cs" /> <Compile Include="AddressTranslator.cs" />
<Compile Include="BaseProtocal.cs" /> <Compile Include="BaseProtocal.cs" />
<Compile Include="ComConnector.cs" /> <Compile Include="ComConnector.cs" />
<Compile Include="ModbusUtility.cs" />
<Compile Include="RtuProtocalLinker.cs" /> <Compile Include="RtuProtocalLinker.cs" />
<Compile Include="ConfigurationManager.Designer.cs"> <Compile Include="ConfigurationManager.Designer.cs">
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>

View File

@@ -583,14 +583,14 @@ namespace ModBus.Net
public class WriteMultiRegisterInputStruct : InputStruct public class WriteMultiRegisterInputStruct : InputStruct
{ {
public WriteMultiRegisterInputStruct(byte belongAddress, string startAddress, ushort[] writeValue) public WriteMultiRegisterInputStruct(byte belongAddress, string startAddress, object[] writeValue)
{ {
BelongAddress = belongAddress; BelongAddress = belongAddress;
FunctionCode = (int)ModbusProtocalReg.WriteMultiRegister; FunctionCode = (int)ModbusProtocalReg.WriteMultiRegister;
StartAddress = AddressTranslatorNA200H.GetInstance().AddressTranslate(startAddress); StartAddress = AddressTranslatorNA200H.GetInstance().AddressTranslate(startAddress);
WriteCount = (ushort)writeValue.Length; WriteCount = (ushort)writeValue.Length;
WriteByteCount = (byte)(WriteCount * 2); WriteByteCount = (byte)(WriteCount * 2);
WriteValue = writeValue.Clone() as ushort[]; WriteValue = writeValue.Clone() as object[];
} }
public byte BelongAddress { get; private set; } public byte BelongAddress { get; private set; }
@@ -603,7 +603,7 @@ namespace ModBus.Net
public byte WriteByteCount { get; private set; } public byte WriteByteCount { get; private set; }
public ushort[] WriteValue { get; private set; } public object[] WriteValue { get; private set; }
} }
public class WriteMultiRegisterOutputStruct : OutputStruct public class WriteMultiRegisterOutputStruct : OutputStruct

View File

@@ -0,0 +1,89 @@
using System;
using System.Collections;
using System.Windows.Forms;
public enum ModbusType
{
Rtu = 0,
Tcp = 1,
}
namespace ModBus.Net
{
public class ModbusUtility
{
private BaseProtocal _wrapper;
private ModbusType _modbusType;
public ModbusType ModbusType
{
get
{
return _modbusType;
}
set
{
_modbusType = value;
switch (_modbusType)
{
case ModbusType.Rtu:
{
_wrapper = new ModbusRtuProtocal();
break;
}
case ModbusType.Tcp:
{
_wrapper = new ModbusTcpProtocal();
break;
}
}
}
}
private static ModbusUtility _modbusUtility;
private ModbusUtility()
{
ModbusType = ModbusType.Rtu;
}
public static ModbusUtility GetInstance()
{
return _modbusUtility ?? (_modbusUtility = new ModbusUtility());
}
public ushort[] ReadHoldRegister(byte belongAddress, string startAddress, ushort getCount)
{
try
{
var inputStruct = new ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct(belongAddress, startAddress, getCount);
var outputStruct =
_wrapper.SendReceive(_wrapper["ReadHoldRegisterModbusProtocal"], inputStruct) as
ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct;
return outputStruct.HoldRegisterStatus;
}
catch
{
return null;
}
}
public bool WriteMultiRegister(byte belongAddress, string startAddress, object[] writeValue)
{
try
{
var inputStruct = new WriteMultiRegisterModbusProtocal.WriteMultiRegisterInputStruct(belongAddress,
startAddress, writeValue);
var outputStruct =
_wrapper.SendReceive(_wrapper["WriteMultiRegisterModbusProtocal"], inputStruct) as
WriteMultiRegisterModbusProtocal.WriteMultiRegisterOutputStruct;
if (outputStruct.WriteCount != writeValue.Length) return false;
return true;
}
catch
{
return false;
}
}
}
}

View File

@@ -10,7 +10,7 @@ namespace NA200H.UI.ConsoleApp
{ {
class Program class Program
{ {
static void Main(string[] args) private static void Main(string[] args)
{ {
/* /*
string ip = "192.168.4.247"; string ip = "192.168.4.247";
@@ -105,13 +105,19 @@ namespace NA200H.UI.ConsoleApp
Console.Read(); Console.Read();
Console.Read();*/ Console.Read();*/
ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct readHoldRegisterInputStruct = new ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct(2, "0", 4); ushort[] holdRegArr = ModbusUtility.GetInstance().ReadHoldRegister(0x02, "0", 4);
ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct readHoldRegisterOutputStruct = (ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct)wrapper.SendReceive(wrapper["ReadHoldRegisterModbusProtocal"], readHoldRegisterInputStruct); foreach (var holdReg in holdRegArr)
for (int i = 0; i < readHoldRegisterOutputStruct.HoldRegisterStatus.Length; i++)
{ {
Console.WriteLine(readHoldRegisterOutputStruct.HoldRegisterStatus[i]); Console.WriteLine(holdReg);
} }
Console.Read(); Console.Read();
Console.Read();
Console.WriteLine(ModbusUtility.GetInstance()
.WriteMultiRegister(0x02, "0", new object[] {(ushort) 8, (ushort) 9, (ushort) 10}));
Console.Read();
Console.Read();
/* /*
//调用方法二:自动构造 //调用方法二:自动构造
//第一步:先生成一个输入结构体,然后向这个结构体中填写数据 //第一步:先生成一个输入结构体,然后向这个结构体中填写数据

View File

@@ -1,8 +1,16 @@
<Window x:Class="NA200H.UI.WPF.MainWindow" <Window x:Class="NA200H.UI.WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"> Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_OnLoaded">
<Grid> <Grid>
<TextBox x:Name="Add1" HorizontalAlignment="Left" Height="23" Margin="46,125,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="65" TextAlignment="Center"/>
<TextBox x:Name="Add2" HorizontalAlignment="Left" Height="23" Margin="144,125,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="65" TextAlignment="Center"/>
<TextBox x:Name="Add3" HorizontalAlignment="Left" Height="23" Margin="242,125,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="65" TextAlignment="Center"/>
<TextBox x:Name="AddAns" HorizontalAlignment="Left" Height="23" Margin="400,125,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="65" IsEnabled="False" TextAlignment="Center"/>
<Button x:Name="Calc" Content="计算" HorizontalAlignment="Center" Margin="0,198,0,0" VerticalAlignment="Top" Width="75" Click="Calc_OnClick"/>
<Label Content="+" HorizontalAlignment="Left" Margin="116,125,0,0" VerticalAlignment="Top" Width="23" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="+" HorizontalAlignment="Left" Margin="214,125,0,0" VerticalAlignment="Top" Width="23" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="=" HorizontalAlignment="Left" Margin="343,122,0,0" VerticalAlignment="Top" Width="23" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid> </Grid>
</Window> </Window>

View File

@@ -13,14 +13,32 @@ namespace NA200H.UI.WPF
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
BaseProtocal wrapper = new ModbusRtuProtocal(); }
ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct readHoldRegisterInputStruct = new ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct(2, "0", 4);
ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct readHoldRegisterOutputStruct = (ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct)wrapper.SendReceive(wrapper["ReadHoldRegisterModbusProtocal"], readHoldRegisterInputStruct); private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
for (int i = 0; i < readHoldRegisterOutputStruct.HoldRegisterStatus.Length; i++) {
{ ModbusUtility.GetInstance().ModbusType = ModbusType.Rtu;
Console.WriteLine(readHoldRegisterOutputStruct.HoldRegisterStatus[i]); ushort[] getNum = ModbusUtility.GetInstance().ReadHoldRegister(0x02, "0", 4);
} SetValue(getNum);
Console.Read(); }
private void SetValue(ushort[] getNum)
{
Add1.Text = getNum[0].ToString();
Add2.Text = getNum[1].ToString();
Add3.Text = getNum[2].ToString();
AddAns.Text = getNum[3].ToString();
}
private void Calc_OnClick(object sender, RoutedEventArgs e)
{
ushort add1 = 0, add2 = 0, add3 = 0;
ushort.TryParse(Add1.Text, out add1);
ushort.TryParse(Add2.Text, out add2);
ushort.TryParse(Add3.Text, out add3);
ModbusUtility.GetInstance().WriteMultiRegister(0x02, "0", new object[] {add1, add2, add3});
ushort[] getNum = ModbusUtility.GetInstance().ReadHoldRegister(0x02, "0", 4);
SetValue(getNum);
} }
} }
} }