2017-02-07 update 1 Add comments and documents.

This commit is contained in:
parallelbgls
2017-02-07 17:15:05 +08:00
parent 0d19567038
commit ff81e4aa09
34 changed files with 463 additions and 16 deletions

View File

@@ -1,5 +1,8 @@
namespace Modbus.Net.Modbus
{
/// <summary>
/// 南大奥拓NA200H专用AddressFormater
/// </summary>
public class AddressFormaterNA200H : AddressFormater
{
public override string FormatAddress(string area, int address)
@@ -13,6 +16,9 @@
}
}
/// <summary>
/// Modbus标准AddressFormater
/// </summary>
public class AddressFormaterModbus : AddressFormater
{
public override string FormatAddress(string area, int address)

View File

@@ -4,12 +4,21 @@ using System.Linq;
namespace Modbus.Net.Modbus
{
/// <summary>
/// NA200H数据单元翻译器
/// 南大奥拓NA200H数据单元翻译器
/// </summary>
public class AddressTranslatorNA200H : AddressTranslator
{
/// <summary>
/// 读功能码
/// </summary>
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
/// <summary>
/// 功能码翻译至标准Modbus地址位置
/// </summary>
protected Dictionary<string, int> TransDictionary;
/// <summary>
/// 写功能码
/// </summary>
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
public AddressTranslatorNA200H()
@@ -188,7 +197,13 @@ namespace Modbus.Net.Modbus
/// </summary>
public class AddressTranslatorModbus : AddressTranslator
{
/// <summary>
/// 读功能码
/// </summary>
protected Dictionary<string, AreaOutputDef> ReadFunctionCodeDictionary;
/// <summary>
/// 写功能码
/// </summary>
protected Dictionary<string, AreaOutputDef> WriteFunctionCodeDictionary;
public AddressTranslatorModbus()

View File

@@ -1,7 +1,7 @@
namespace Modbus.Net.Modbus
{
/// <summary>
/// Modbus/Rtu协议
/// Modbus/Ascii码协议
/// </summary>
public class ModbusAsciiProtocal : ModbusProtocal
{

View File

@@ -3,6 +3,9 @@ using System.Text;
namespace Modbus.Net.Modbus
{
/// <summary>
/// Modbus/Ascii码协议连接器
/// </summary>
public class ModbusAsciiProtocalLinker : ComProtocalLinker
{
public ModbusAsciiProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.Modbus
{
/// <summary>
/// Modbus设备
/// </summary>
public class ModbusMachine : BaseMachine
{
public ModbusMachine(ModbusType connectionType, string connectionString,

View File

@@ -4,6 +4,9 @@ using System.Threading.Tasks;
namespace Modbus.Net.Modbus
{
/// <summary>
/// 变量功能码
/// </summary>
internal enum ModbusProtocalVariableFunctionCode : byte
{
ReadVariable = 20,
@@ -39,6 +42,9 @@ namespace Modbus.Net.Modbus
WriteMultiRegister = 16
}
/// <summary>
/// Modbus协议
/// </summary>
public abstract class ModbusProtocal : BaseProtocal
{
protected ModbusProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress)

View File

@@ -57,6 +57,7 @@ namespace Modbus.Net.Modbus
{
public override byte[] BytesExtend(byte[] content)
{
//Modbus/Ascii协议扩张前面增加:后面增加LRC校验和尾字符
var newContent = new List<byte>();
newContent.AddRange(Encoding.ASCII.GetBytes(":"));
foreach (var number in content)
@@ -71,6 +72,7 @@ namespace Modbus.Net.Modbus
public override byte[] BytesDecact(byte[] content)
{
//Modbus/Ascii协议收缩抛弃头尾。
var newContent = new List<byte>();
var ans = Encoding.ASCII.GetString(content);
var index = ans.IndexOf(Environment.NewLine);

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.Modbus
{
/// <summary>
/// Modbus/Rtu协议连接器
/// </summary>
public class ModbusRtuProtocalLinker : ComProtocalLinker
{
public ModbusRtuProtocalLinker(string com) : base(com, 9600, Parity.None, StopBits.One, 8)

View File

@@ -1,5 +1,8 @@
namespace Modbus.Net.Modbus
{
/// <summary>
/// Modbus/Tcp协议连接器
/// </summary>
public class ModbusTcpProtocalLinker : TcpProtocalLinker
{
public ModbusTcpProtocalLinker(string ip) : base(ip, int.Parse(ConfigurationManager.ModbusPort))

View File

@@ -23,8 +23,14 @@ namespace Modbus.Net.Modbus
Ascii = 2
}
/// <summary>
/// Modbus基础Api入口
/// </summary>
public class ModbusUtility : BaseUtility
{
/// <summary>
/// Modbus协议类型
/// </summary>
private ModbusType _modbusType;
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress)
@@ -81,6 +87,7 @@ namespace Modbus.Net.Modbus
_modbusType = value;
switch (_modbusType)
{
//Rtu协议
case ModbusType.Rtu:
{
Wrapper = ConnectionString == null
@@ -88,6 +95,7 @@ namespace Modbus.Net.Modbus
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress);
break;
}
//Tcp协议
case ModbusType.Tcp:
{
Wrapper = ConnectionString == null
@@ -98,6 +106,7 @@ namespace Modbus.Net.Modbus
MasterAddress));
break;
}
//Ascii协议
case ModbusType.Ascii:
{
Wrapper = ConnectionString == null
@@ -114,6 +123,12 @@ namespace Modbus.Net.Modbus
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
@@ -131,6 +146,12 @@ namespace Modbus.Net.Modbus
}
}
/// <summary>
/// 写数据
/// </summary>
/// <param name="startAddress">起始地址</param>
/// <param name="setContents">需要设置的数据</param>
/// <returns>设置是否成功</returns>
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
{
try
@@ -149,6 +170,10 @@ namespace Modbus.Net.Modbus
}
/*
/// <summary>
/// 读时间
/// </summary>
/// <returns>设备的时间</returns>
public override DateTime GetTime()
{
try
@@ -165,6 +190,11 @@ namespace Modbus.Net.Modbus
}
}
/// <summary>
/// 写时间
/// </summary>
/// <param name="setTime">需要写入的时间</param>
/// <returns>写入是否成功</returns>
public override bool SetTime(DateTime setTime)
{
try

View File

@@ -1,4 +1,4 @@
Modbus.Net
Modbus.Net.Modbus
===================
[![NuGet](https://img.shields.io/nuget/v/Modbus.Net.Modbus.svg)](https://www.nuget.org/packages/Modbus.Net.Modbus/)

View File

@@ -3,8 +3,17 @@ using System.Linq;
namespace Modbus.Net.OPC
{
/// <summary>
/// Opc地址编码器
/// </summary>
public class AddressFormaterOpc : AddressFormater
{
/// <summary>
/// 协议构造器
/// </summary>
/// <param name="tagGeter">如何通过BaseMachine和AddressUnit构造Opc的标签</param>
/// <param name="machine">调用这个编码器的设备</param>
/// <param name="seperator">每两个标签之间用什么符号隔开,默认为/</param>
public AddressFormaterOpc(Func<BaseMachine, AddressUnit, string[]> tagGeter, BaseMachine machine,
char seperator = '/')
{

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.OPC
{
/// <summary>
/// Opc地址解析器
/// </summary>
public class AddressTranslatorOpc : AddressTranslator
{
public override AddressDef AddressTranslate(string address, bool isRead)

View File

@@ -90,6 +90,7 @@
<ItemGroup>
<None Include="Modbus.Net.OPC.nuspec" />
<None Include="packages.config" />
<None Include="README.md" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -5,6 +5,9 @@ using System.Threading.Tasks;
namespace Modbus.Net.OPC
{
/// <summary>
/// OpcDa协议连接实现
/// </summary>
public class OpcDaConnector : BaseConnector
{
protected static Dictionary<string, OpcDaConnector> _instances = new Dictionary<string, OpcDaConnector>();

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.OPC
{
/// <summary>
/// OpcDa设备
/// </summary>
public class OpcDaMachine : BaseMachine
{
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses, bool keepConnect)

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.OPC
{
/// <summary>
/// OpcDa协议
/// </summary>
public class OpcDaProtocal : OpcProtocal
{
private readonly string _host;

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.OPC
{
/// <summary>
/// Opc Da协议连接器
/// </summary>
public class OpcDaProtocalLinker : ProtocalLinker
{
public OpcDaProtocalLinker() : this(ConfigurationManager.OpcDaHost)

View File

@@ -3,6 +3,9 @@ using System.Threading.Tasks;
namespace Modbus.Net.OPC
{
/// <summary>
/// Opc Da协议Api入口
/// </summary>
public class OpcDaUtility : BaseUtility
{
public OpcDaUtility(string connectionString) : base(0, 0)

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.OPC
{
/// <summary>
/// Opc协议
/// </summary>
public abstract class OpcProtocal : BaseProtocal
{
protected OpcProtocal() : base(0, 0)
@@ -9,6 +12,8 @@ namespace Modbus.Net.OPC
}
}
#region
public class ReadRequestOpcInputStruct : InputStruct
{
public ReadRequestOpcInputStruct(string tag)
@@ -43,6 +48,10 @@ namespace Modbus.Net.OPC
}
}
#endregion
#region
public class WriteRequestOpcInputStruct : InputStruct
{
public WriteRequestOpcInputStruct(string tag, object setValue)
@@ -82,4 +91,6 @@ namespace Modbus.Net.OPC
return new WriteRequestOpcOutputStruct(ans);
}
}
#endregion
}

View File

@@ -0,0 +1,35 @@
Modbus.Net.OPC
===================
[![NuGet](https://img.shields.io/nuget/v/Modbus.Net.OPC.svg)](https://www.nuget.org/packages/Modbus.Net.OPC/)
Modbus Implementation of Modbus.Net
Table of Content:
* [Basic Concept](#basic)
* [Address Mapping](#address)
* [Link](#link)
##<a name="basic"></a> Basic Concept
Siemens Protocal is derived by Profibus and Profinet.
##<a name="address"></a> Address Mapping
Modbus.Net.OPC has a simple address formatting tool. You can find it from AddressFormaterOPC.
You need to use messages in BaseMachine and AddressUnit to create an OPC tag.
Here is a Sample.
If your tag is "1/15/Value_Opening", 1 is MachineId, 15 is StationId and Value_Opening is point name.
Your tagGeter code should be.
```C#
(baseMachine, addressUnit) => return new string[]{baseMachine.Id, ((XXUnitExtend)addressUnit.unitExtend).stationId, addressUnit.Name};
```
If you want change your tag to "1.15.Value_Opening", just set the seperator to '.' .
##<a name="link"></a> Link
The link of OPC DA should like "opcda://PC-Name/OPC-Software-Name".

View File

@@ -1,5 +1,8 @@
namespace Modbus.Net.Siemens
{
/// <summary>
/// Siemens地址格式化Modbus.Net专用格式
/// </summary>
public class AddressFormaterSiemens : AddressFormater
{
public override string FormatAddress(string area, int address)
@@ -12,4 +15,36 @@
return area + " " + address + "." + subAddress;
}
}
/// <summary>
/// Siemens地址格式化Siemens格式
/// </summary>
public class AddressFormaterSimenseStandard : AddressFormater
{
public override string FormatAddress(string area, int address)
{
if (area.Length > 1 &&
area.ToUpper().Substring(0, 2) == "DB")
{
return area.ToUpper() + "." + "DB" + address;
}
else
{
return area.ToUpper() + address;
}
}
public override string FormatAddress(string area, int address, int subAddress)
{
if (area.Length > 1 &&
area.ToUpper().Substring(0, 2) == "DB")
{
return area.ToUpper() + "." + "DB" + address + "." + subAddress;
}
else
{
return area.ToUpper() + address + "." + subAddress;
}
}
}
}

View File

@@ -1,8 +1,12 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Modbus.Net.Siemens
{
/// <summary>
/// 地址翻译器Modbus.Net格式
/// </summary>
public class AddressTranslatorSiemens : AddressTranslator
{
protected Dictionary<string, int> AreaCodeDictionary;
@@ -69,4 +73,72 @@ namespace Modbus.Net.Siemens
return 1;
}
}
/// <summary>
/// 地址翻译器Siemens格式
/// </summary>
public class AddressTranslatorSimenseStandard : AddressTranslator
{
protected Dictionary<string, int> AreaCodeDictionary;
public AddressTranslatorSimenseStandard()
{
AreaCodeDictionary = new Dictionary<string, int>
{
{"S", 0x04},
{"SM", 0x05},
{"AI", 0x06},
{"AQ", 0x07},
{"C", 0x1E},
{"T", 0x1F},
{"HC", 0x20},
{"I", 0x81},
{"Q", 0x82},
{"M", 0x83},
{"DB", 0x84},
{"V", 0x184},
};
}
public override AddressDef AddressTranslate(string address, bool isRead)
{
address = address.ToUpper();
if (address.Substring(0, 2) == "DB")
{
var addressSplit = address.Split('.');
if (addressSplit.Length != 2 && addressSplit.Length != 3) throw new FormatException();
addressSplit[0] = addressSplit[0].Substring(2);
if (addressSplit[1].Substring(0, 2) == "DB")
addressSplit[1] = addressSplit[1].Substring(2);
return new AddressDef
{
AreaString = "DB" + addressSplit[0],
Area = int.Parse(addressSplit[0]) * 256 + AreaCodeDictionary["DB"],
Address = int.Parse(addressSplit[1]),
SubAddress = addressSplit.Length == 2 ? 0 : int.Parse(addressSplit[2])
};
}
int i = 0;
int t;
while (!int.TryParse(address[i].ToString(), out t) && i < address.Length)
{
i++;
}
if (i == 0 || i >= address.Length) throw new FormatException();
string head = address.Substring(0, i);
string[] tail = address.Substring(i).Split('.');
return new AddressDef
{
AreaString = head,
Area = AreaCodeDictionary[head],
Address = int.Parse(tail[0]),
SubAddress = tail.Length == 1 ? 0 : int.Parse(tail[1])
};
}
public override double GetAreaByteLength(string area)
{
return 1;
}
}
}

View File

@@ -64,6 +64,7 @@
<None Include="Modbus.Net.Siemens.nuspec">
<SubType>Designer</SubType>
</None>
<None Include="README.md" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -0,0 +1,42 @@
Modbus.Net.Siemens
===================
[![NuGet](https://img.shields.io/nuget/v/Modbus.Net.Siemens.svg)](https://www.nuget.org/packages/Modbus.Net.Siemens/)
Modbus Implementation of Modbus.Net
Table of Content:
* [Basic Concept](#basic)
* [Address Mapping](#address)
* [Addres Coding](#coding)
* [SubAddress Rules](#subpos)
##<a name="basic"></a> Basic Concept
Siemens Protocal is derived by Profibus and Profinet.
##<a name="address"></a> Address Mapping
Modbus.Net.Siemens has two types of AddressMapping -- Modbus.Net way or Siemens way.
But Modbus.Net already decleared the type in AddressUnit, so all of the formatting ways will ignore the address type.
The following table shows the differences between them.
Standard Siemens Address | Modbus.Net Address Format | Siemens Address Format |
------------------------ | ------------------------- | ---------------------- |
I0.0 | I 0.0 | I0.0 |
IB0 | I 0 | I0 |
V10.5 | V 10.5 | V10.5 |
VB19 | V 19 | V19 |
DB1.DBD22 | DB1 22 | DB1.DB22 |
DB2.DB35.1 | DB2 35.1 | DB2.DB35.1 |
##<a name="coding"></a> Address Coding
The Coding of Modbus.Net.Siemens is the same as standard siemens protocal.
##<a name="subpos"></a> SubAddress Rules
SubAddress Rules is the same as standard siemens protocal.
Area length will always be 1.

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子设备
/// </summary>
public class SiemensMachine : BaseMachine
{
public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model,

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子Ppi协议
/// </summary>
public class SiemensPpiProtocal : SiemensProtocal
{
private readonly string _com;

View File

@@ -4,6 +4,9 @@ using System.Threading.Tasks;
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子Ppi协议连接器
/// </summary>
public class SiemensPpiProtocalLinker : ComProtocalLinker
{
public SiemensPpiProtocalLinker(string com)

View File

@@ -4,31 +4,101 @@ using System.Linq;
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子数据类型
/// </summary>
public enum SiemensTypeCode : byte
{
/// <summary>
/// 布尔
/// </summary>
Bool = 0x01,
/// <summary>
/// 字节
/// </summary>
Byte = 0x02,
/// <summary>
/// 字
/// </summary>
Word = 0x03,
/// <summary>
/// 双字
/// </summary>
DWord = 0x04,
/// <summary>
/// 计数器
/// </summary>
C = 0x1E,
/// <summary>
/// 计时器
/// </summary>
T = 0x1F,
/// <summary>
/// 高速计数器
/// </summary>
HC = 0x20
}
/// <summary>
/// 西门子通讯报错信息
/// </summary>
public enum SiemensAccessResult : byte
{
/// <summary>
/// 无错误
/// </summary>
NoError = 0xFF,
/// <summary>
/// 硬件错误
/// </summary>
HardwareFault = 0x01,
/// <summary>
/// 非法对象访问Area错误
/// </summary>
IllegalObjectAccess = 0x03,
/// <summary>
/// 非法地址访问
/// </summary>
InvalidAddress = 0x05,
/// <summary>
/// 不支持的数据类型
/// </summary>
DataTypeNotSupport = 0x06,
/// <summary>
/// 对象不存在或长度超出允许范围
/// </summary>
ObjNotExistOrLengthError = 0x0A
}
/// <summary>
/// 西门子数据访问类型
/// </summary>
public enum SiemensDataType : byte
{
/// <summary>
/// 错误
/// </summary>
Error = 0x00,
/// <summary>
/// 比特位访问
/// </summary>
BitAccess = 0x03,
/// <summary>
/// 一般访问
/// </summary>
OtherAccess = 0x04
}
@@ -39,6 +109,8 @@ namespace Modbus.Net.Siemens
}
}
#region
internal class ComCreateReferenceSiemensInputStruct : InputStruct
{
public ComCreateReferenceSiemensInputStruct(byte slaveAddress, byte masterAddress)
@@ -85,6 +157,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
#region
internal class CreateReferenceSiemensInputStruct : InputStruct
{
public byte TdpuSize;
@@ -167,6 +243,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
#region
public class ComConfirmMessageSiemensInputStruct : InputStruct
{
public ComConfirmMessageSiemensInputStruct(byte slaveAddress, byte masterAddress)
@@ -206,6 +286,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
#region
internal class EstablishAssociationSiemensInputStruct : InputStruct
{
public EstablishAssociationSiemensInputStruct(ushort pduRef, ushort maxCalling, ushort maxCalled, ushort maxPdu)
@@ -270,6 +354,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
#region
public class ReadRequestSiemensInputStruct : InputStruct
{
public ReadRequestSiemensInputStruct(byte slaveAddress, byte masterAddress, ushort pduRef,
@@ -362,6 +450,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
#region
public class WriteRequestSiemensInputStruct : InputStruct
{
public WriteRequestSiemensInputStruct(byte slaveAddress, byte masterAddress, ushort pduRef, string startAddress,
@@ -452,7 +544,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
/*
#region 读时间请求
public class ReadTimeSiemensInputStruct : InputStruct
{
public ReadTimeSiemensInputStruct(ushort pduRef)
@@ -490,6 +585,10 @@ namespace Modbus.Net.Siemens
}
}
#endregion
#region 写时间请求
public class WriteTimeSiemensInputStruct : InputStruct
{
public WriteTimeSiemensInputStruct(ushort pduRef, DateTime dateTime, TodClockStatus todClockStatus)
@@ -528,8 +627,13 @@ namespace Modbus.Net.Siemens
throw new NotImplementedException();
}
}
#endregion
*/
/// <summary>
/// 西门子通讯报错信息
/// </summary>
public class SiemensProtocalErrorException : ProtocalErrorException
{
private static readonly Dictionary<int, string> ProtocalErrorDictionary = new Dictionary<int, string>

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子Tcp协议扩展
/// </summary>
public class SiemensTcpProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
{
public override byte[] BytesExtend(byte[] content)
@@ -19,6 +22,9 @@ namespace Modbus.Net.Siemens
}
}
/// <summary>
/// 西门子Ppi协议扩展
/// </summary>
public class SiemensPpiProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend
{
public override byte[] BytesExtend(byte[] content)

View File

@@ -2,17 +2,19 @@
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子Tcp协议
/// </summary>
public class SiemensTcpProtocal : SiemensProtocal
{
private readonly ushort _taspSrc;
private readonly ushort _tsapDst;
private readonly ushort _maxCalling;
private readonly ushort _maxCalled;
private readonly ushort _maxPdu;
private readonly byte _tdpuSize;
private readonly string _ip;
private readonly ushort _maxCalled;
private readonly ushort _maxCalling;
private readonly ushort _maxPdu;
private readonly int _port;
private readonly ushort _taspSrc;
private readonly byte _tdpuSize;
private readonly ushort _tsapDst;
private int _connectTryCount;
public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled,
@@ -87,6 +89,7 @@ namespace Modbus.Net.Siemens
_connectTryCount = 0;
var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst);
return
//先建立连接,然后建立设备的引用
await await
ForceSendReceiveAsync(this[typeof (CreateReferenceSiemensProtocal)], inputStruct)
.ContinueWith(async answer =>

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.Siemens
{
/// <summary>
/// 西门子Tcp协议连接器
/// </summary>
public class SiemensTcpProtocalLinker : TcpProtocalLinker
{
public SiemensTcpProtocalLinker(string ip)

View File

@@ -20,15 +20,17 @@ namespace Modbus.Net.Siemens
S7_1500 = 5
}
/// <summary>
/// 西门子通讯Api入口
/// </summary>
public class SiemensUtility : BaseUtility
{
private readonly byte _tdpuSize;
private readonly ushort _taspSrc;
private readonly ushort _tsapDst;
private readonly ushort _maxCalling;
private readonly ushort _maxCalled;
private readonly ushort _maxCalling;
private readonly ushort _maxPdu;
private readonly ushort _taspSrc;
private readonly byte _tdpuSize;
private readonly ushort _tsapDst;
private SiemensType _siemensType;
@@ -119,6 +121,9 @@ namespace Modbus.Net.Siemens
}
}
/// <summary>
/// 西门子连接类型
/// </summary>
public SiemensType ConnectionType
{
get { return _siemensType; }
@@ -127,6 +132,7 @@ namespace Modbus.Net.Siemens
_siemensType = value;
switch (_siemensType)
{
//PPI
case SiemensType.Ppi:
{
Wrapper = ConnectionString == null
@@ -134,10 +140,12 @@ namespace Modbus.Net.Siemens
: new SiemensPpiProtocal(ConnectionString, SlaveAddress, MasterAddress);
break;
}
//MPI
//case SiemensType.Mpi:
// {
// throw new NotImplementedException();
// }
//Ethenet
case SiemensType.Tcp:
{
Wrapper = ConnectionString == null
@@ -153,11 +161,21 @@ namespace Modbus.Net.Siemens
}
}
/// <summary>
/// 设置连接类型
/// </summary>
/// <param name="connectionType">需要设置的连接类型</param>
public override void SetConnectionType(int connectionType)
{
ConnectionType = (SiemensType) connectionType;
}
/// <summary>
/// 读数据
/// </summary>
/// <param name="startAddress">开始地址</param>
/// <param name="getByteCount">读取字节个数</param>
/// <returns>从设备中读取的数据</returns>
public override async Task<byte[]> GetDatasAsync(string startAddress, int getByteCount)
{
try
@@ -176,6 +194,12 @@ namespace Modbus.Net.Siemens
}
}
/// <summary>
/// 写数据
/// </summary>
/// <param name="startAddress">开始地址</param>
/// <param name="setContents">需要写入的数据</param>
/// <returns>写入是否成功</returns>
public override async Task<bool> SetDatasAsync(string startAddress, object[] setContents)
{
try

View File

@@ -5,6 +5,9 @@ using System.Threading.Tasks;
namespace Modbus.Net
{
/// <summary>
/// 基础Api入口
/// </summary>
public abstract class BaseUtility
{
/// <summary>