2017-04-01 update 1 IInputStrcut IOutputStruct Template System.

This commit is contained in:
parallelbgls
2017-04-01 10:40:47 +08:00
parent df10b93ab6
commit a60700df39
5 changed files with 90 additions and 49 deletions

View File

@@ -137,8 +137,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new ReadDataModbusInputStruct(SlaveAddress, startAddress, var inputStruct = new ReadDataModbusInputStruct(SlaveAddress, startAddress,
(ushort) getByteCount, AddressTranslator); (ushort) getByteCount, AddressTranslator);
var outputStruct = await var outputStruct = await
Wrapper.SendReceiveAsync(Wrapper[typeof (ReadDataModbusProtocal)], inputStruct) as Wrapper.SendReceiveAsync<ReadDataModbusOutputStruct>(Wrapper[typeof (ReadDataModbusProtocal)], inputStruct);
ReadDataModbusOutputStruct;
return outputStruct?.DataValue; return outputStruct?.DataValue;
} }
catch catch
@@ -160,8 +159,7 @@ namespace Modbus.Net.Modbus
var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents, var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents,
AddressTranslator, Endian); AddressTranslator, Endian);
var outputStruct = await var outputStruct = await
Wrapper.SendReceiveAsync(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct) as Wrapper.SendReceiveAsync<WriteDataModbusOutputStruct>(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct);
WriteDataModbusOutputStruct;
return outputStruct?.WriteCount == setContents.Length; return outputStruct?.WriteCount == setContents.Length;
} }
catch catch
@@ -181,8 +179,7 @@ namespace Modbus.Net.Modbus
{ {
var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress); var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress);
var outputStruct = var outputStruct =
Wrapper.SendReceive(Wrapper[typeof(GetSystemTimeModbusProtocal)], inputStruct) as Wrapper.SendReceive<GetSystemTimeModbusOutputStruct>(Wrapper[typeof(GetSystemTimeModbusProtocal)], inputStruct);
GetSystemTimeModbusOutputStruct;
return outputStruct?.Time; return outputStruct?.Time;
} }
catch (Exception) catch (Exception)
@@ -202,8 +199,7 @@ namespace Modbus.Net.Modbus
{ {
var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime); var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime);
var outputStruct = var outputStruct =
Wrapper.SendReceive(Wrapper[typeof(SetSystemTimeModbusProtocal)], inputStruct) as Wrapper.SendReceive<SetSystemTimeModbusOutputStruct>(Wrapper[typeof(SetSystemTimeModbusProtocal)], inputStruct);
SetSystemTimeModbusOutputStruct;
return outputStruct?.WriteCount > 0; return outputStruct?.WriteCount > 0;
} }
catch (Exception) catch (Exception)

View File

@@ -33,8 +33,7 @@ namespace Modbus.Net.OPC
var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress, split.ToString()); var readRequestOpcInputStruct = new ReadRequestOpcInputStruct(startAddress, split.ToString());
var readRequestOpcOutputStruct = var readRequestOpcOutputStruct =
await await
Wrapper.SendReceiveAsync(Wrapper[typeof(ReadRequestOpcProtocal)], readRequestOpcInputStruct) as Wrapper.SendReceiveAsync<ReadRequestOpcOutputStruct>(Wrapper[typeof(ReadRequestOpcProtocal)], readRequestOpcInputStruct);
ReadRequestOpcOutputStruct;
return readRequestOpcOutputStruct?.GetValue; return readRequestOpcOutputStruct?.GetValue;
} }
catch (Exception) catch (Exception)
@@ -51,8 +50,7 @@ namespace Modbus.Net.OPC
var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress, split.ToString(), setContents[0]); var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress, split.ToString(), setContents[0]);
var writeRequestOpcOutputStruct = var writeRequestOpcOutputStruct =
await await
Wrapper.SendReceiveAsync(Wrapper[typeof(WriteRequestOpcProtocal)], writeRequestOpcInputStruct) Wrapper.SendReceiveAsync<WriteRequestOpcOutputStruct>(Wrapper[typeof(WriteRequestOpcProtocal)], writeRequestOpcInputStruct);
as WriteRequestOpcOutputStruct;
return writeRequestOpcOutputStruct?.WriteResult == true; return writeRequestOpcOutputStruct?.WriteResult == true;
} }
catch (Exception e) catch (Exception e)

View File

@@ -183,8 +183,8 @@ namespace Modbus.Net.Siemens
0xd3c7, SiemensTypeCode.Byte, startAddress, (ushort) getByteCount, AddressTranslator); 0xd3c7, SiemensTypeCode.Byte, startAddress, (ushort) getByteCount, AddressTranslator);
var readRequestSiemensOutputStruct = var readRequestSiemensOutputStruct =
await await
Wrapper.SendReceiveAsync(Wrapper[typeof (ReadRequestSiemensProtocal)], Wrapper.SendReceiveAsync<ReadRequestSiemensOutputStruct>(Wrapper[typeof (ReadRequestSiemensProtocal)],
readRequestSiemensInputStruct) as ReadRequestSiemensOutputStruct; readRequestSiemensInputStruct);
return readRequestSiemensOutputStruct?.GetValue; return readRequestSiemensOutputStruct?.GetValue;
} }
catch (Exception) catch (Exception)
@@ -207,8 +207,8 @@ namespace Modbus.Net.Siemens
0xd3c8, startAddress, setContents, AddressTranslator); 0xd3c8, startAddress, setContents, AddressTranslator);
var writeRequestSiemensOutputStruct = var writeRequestSiemensOutputStruct =
await await
Wrapper.SendReceiveAsync(Wrapper[typeof (WriteRequestSiemensProtocal)], Wrapper.SendReceiveAsync<WriteRequestSiemensOutputStruct>(Wrapper[typeof (WriteRequestSiemensProtocal)],
writeRequestSiemensInputStruct) as WriteRequestSiemensOutputStruct; writeRequestSiemensInputStruct);
return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError; return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError;
} }
catch (Exception) catch (Exception)

View File

@@ -109,6 +109,18 @@ namespace Modbus.Net
return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content));
} }
/// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构
/// </summary>
/// <param name="unit">协议的实例</param>
/// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam>
public virtual T SendReceive<T>(ProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct
{
return AsyncHelper.RunSync(() => SendReceiveAsync<T>(unit, content));
}
/// <summary> /// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构 /// 发送协议,通过传入需要使用的协议内容和输入结构
/// </summary> /// </summary>
@@ -117,28 +129,40 @@ namespace Modbus.Net
/// <returns>输出信息的结构化描述</returns> /// <returns>输出信息的结构化描述</returns>
public virtual async Task<IOutputStruct> SendReceiveAsync(ProtocalUnit unit, IInputStruct content) public virtual async Task<IOutputStruct> SendReceiveAsync(ProtocalUnit unit, IInputStruct content)
{ {
var t = 0; return await SendReceiveAsync<IOutputStruct>(unit, content);
var formatContent = unit.Format(content);
if (formatContent != null)
{
byte[] receiveContent;
//如果为特别处理协议的话,跳过协议扩展收缩
if (unit is ISpecialProtocalUnit)
{
receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
}
else
{
receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent);
}
if (receiveContent != null)
{
return unit.Unformat(receiveContent, ref t);
}
}
return null;
} }
/// <summary>
/// 发送协议,通过传入需要使用的协议内容和输入结构
/// </summary>
/// <param name="unit">协议的实例</param>
/// <param name="content">输入信息的结构化描述</param>
/// <returns>输出信息的结构化描述</returns>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam>
public virtual async Task<T> SendReceiveAsync<T>(ProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct
{
var t = 0;
var formatContent = unit.Format(content);
if (formatContent != null)
{
byte[] receiveContent;
//如果为特别处理协议的话,跳过协议扩展收缩
if (unit is ISpecialProtocalUnit)
{
receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent);
}
else
{
receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent);
}
if (receiveContent != null)
{
return unit.Unformat<T>(receiveContent, ref t);
}
}
return null;
}
/// <summary> /// <summary>
/// 协议连接开始 /// 协议连接开始
/// </summary> /// </summary>

View File

@@ -12,12 +12,23 @@ namespace Modbus.Net
/// </summary> /// </summary>
public Endian Endian { get; set; } = Endian.BigEndianLsb; public Endian Endian { get; set; } = Endian.BigEndianLsb;
/// <summary> /// <summary>
/// 从输入结构格式化 /// 从输入结构格式化
/// </summary>s /// </summary>s
/// <param name="message">结构化的输入数据</param> /// <param name="message">结构化的输入数据</param>
/// <returns>格式化后的字节流</returns> /// <returns>格式化后的字节流</returns>
public abstract byte[] Format(IInputStruct message); public abstract byte[] Format(IInputStruct message);
/// <summary>
/// 从输入结构格式化
/// </summary>
/// <param name="message">结构化的输入数据</param>
/// <typeparam name="T">IInputStruct的具体类型</typeparam>
/// <returns>格式化后的字节流</returns>
public byte[] Format<T>(T message) where T : IInputStruct
{
return Format(message);
}
/// <summary> /// <summary>
/// 从对象的参数数组格式化 /// 从对象的参数数组格式化
@@ -29,13 +40,25 @@ namespace Modbus.Net
return TranslateContent(Endian, message); return TranslateContent(Endian, message);
} }
/// <summary> /// <summary>
/// 把仪器返回的内容填充到输出结构中 /// 把仪器返回的内容填充到输出结构中
/// </summary> /// </summary>
/// <param name="messageBytes">返回数据的字节流</param> /// <param name="messageBytes">返回数据的字节流</param>
/// <param name="pos">转换标记位</param> /// <param name="pos">转换标记位</param>
/// <returns>结构化的输出数据</returns> /// <returns>结构化的输出数据</returns>
public abstract IOutputStruct Unformat(byte[] messageBytes, ref int pos); public abstract IOutputStruct Unformat(byte[] messageBytes, ref int pos);
/// <summary>
/// 把仪器返回的内容填充到输出结构中
/// </summary>
/// <param name="messageBytes">返回数据的字节流</param>
/// <param name="pos">转换标记位</param>
/// <typeparam name="T">IOutputStruct的具体类型</typeparam>
/// <returns>结构化的输出数据</returns>
public T Unformat<T>(byte[] messageBytes, ref int pos) where T : class, IOutputStruct
{
return Unformat(messageBytes, ref pos) as T;
}
/// <summary> /// <summary>
/// 转换静态方法,把对象数组转换为字节数组。 /// 转换静态方法,把对象数组转换为字节数组。