Files
Modbus.Net/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs
2017-06-30 11:45:19 +08:00

217 lines
7.3 KiB
C#

using System;
using System.Threading.Tasks;
namespace Modbus.Net.Modbus
{
/// <summary>
/// Modbus连接类型
/// </summary>
public enum ModbusType
{
/// <summary>
/// Rtu连接
/// </summary>
Rtu = 0,
/// <summary>
/// Tcp连接
/// </summary>
Tcp = 1,
/// <summary>
/// Ascii连接
/// </summary>
Ascii = 2
}
/// <summary>
/// Modbus基础Api入口
/// </summary>
public class ModbusUtility : BaseUtility, IUtilityMethodTime
{
/// <summary>
/// Modbus协议类型
/// </summary>
private ModbusType _modbusType;
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress,
Endian endian = Endian.BigEndianLsb)
: base(slaveAddress, masterAddress)
{
Endian = endian;
ConnectionString = null;
ModbusType = (ModbusType) connectionType;
AddressTranslator = new AddressTranslatorModbus();
}
public ModbusUtility(ModbusType connectionType, string connectionString, byte slaveAddress, byte masterAddress,
Endian endian = Endian.BigEndianLsb)
: base(slaveAddress, masterAddress)
{
Endian = endian;
ConnectionString = connectionString;
ModbusType = connectionType;
AddressTranslator = new AddressTranslatorModbus();
}
public override Endian Endian { get; }
protected string ConnectionStringIp
{
get
{
if (ConnectionString == null) return null;
return ConnectionString.Contains(":") ? ConnectionString.Split(':')[0] : ConnectionString;
}
}
protected int? ConnectionStringPort
{
get
{
if (ConnectionString == null) return null;
if (!ConnectionString.Contains(":")) return null;
var connectionStringSplit = ConnectionString.Split(':');
try
{
return connectionStringSplit.Length < 2 ? (int?) null : int.Parse(connectionStringSplit[1]);
}
catch
{
return null;
}
}
}
public ModbusType ModbusType
{
get { return _modbusType; }
set
{
_modbusType = value;
switch (_modbusType)
{
//Rtu协议
case ModbusType.Rtu:
{
Wrapper = ConnectionString == null
? new ModbusRtuProtocal(SlaveAddress, MasterAddress, Endian)
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian);
break;
}
//Tcp协议
case ModbusType.Tcp:
{
Wrapper = ConnectionString == null
? new ModbusTcpProtocal(SlaveAddress, MasterAddress, Endian)
: (ConnectionStringPort == null
? new ModbusTcpProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian)
: new ModbusTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress, Endian));
break;
}
//Ascii协议
case ModbusType.Ascii:
{
Wrapper = ConnectionString == null
? new ModbusAsciiProtocal(SlaveAddress, MasterAddress, Endian)
: new ModbusAsciiProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian);
break;
}
}
}
}
/// <summary>
/// 读时间
/// </summary>
/// <returns>设备的时间</returns>
public async Task<DateTime> GetTimeAsync()
{
try
{
var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress);
var outputStruct =
await Wrapper.SendReceiveAsync<GetSystemTimeModbusOutputStruct>(
Wrapper[typeof(GetSystemTimeModbusProtocal)], inputStruct);
return outputStruct?.Time ?? DateTime.MinValue;
}
catch (Exception)
{
return DateTime.MinValue;
}
}
/// <summary>
/// 写时间
/// </summary>
/// <param name="setTime">需要写入的时间</param>
/// <returns>写入是否成功</returns>
public async Task<bool> SetTimeAsync(DateTime setTime)
{
try
{
var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime);
var outputStruct =
await Wrapper.SendReceiveAsync<SetSystemTimeModbusOutputStruct>(
Wrapper[typeof(SetSystemTimeModbusProtocal)], inputStruct);
return outputStruct?.WriteCount > 0;
}
catch (Exception)
{
return false;
}
}
public override void SetConnectionType(int connectionType)
{
ModbusType = (ModbusType) connectionType;
}
/// <summary>
/// 读数据
/// </summary>
/// <param name="startAddress">起始地址</param>
/// <param name="getByteCount">获取字节个数</param>
/// <returns>获取的结果</returns>
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
{
try
{
var inputStruct = new ReadDataModbusInputStruct(SlaveAddress, startAddress,
(ushort) getByteCount, AddressTranslator);
var outputStruct = await
Wrapper.SendReceiveAsync<ReadDataModbusOutputStruct>(Wrapper[typeof(ReadDataModbusProtocal)],
inputStruct);
return outputStruct?.DataValue;
}
catch
{
return null;
}
}
/// <summary>
/// 写数据
/// </summary>
/// <param name="startAddress">起始地址</param>
/// <param name="setContents">需要设置的数据</param>
/// <returns>设置是否成功</returns>
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
{
try
{
var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents,
AddressTranslator, Endian);
var outputStruct = await
Wrapper.SendReceiveAsync<WriteDataModbusOutputStruct>(Wrapper[typeof(WriteDataModbusProtocal)],
inputStruct);
return outputStruct?.WriteCount == setContents.Length;
}
catch
{
return false;
}
}
}
}