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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,6 +4,9 @@ using System.Threading.Tasks;
namespace Modbus.Net.Modbus namespace Modbus.Net.Modbus
{ {
/// <summary>
/// 变量功能码
/// </summary>
internal enum ModbusProtocalVariableFunctionCode : byte internal enum ModbusProtocalVariableFunctionCode : byte
{ {
ReadVariable = 20, ReadVariable = 20,
@@ -39,6 +42,9 @@ namespace Modbus.Net.Modbus
WriteMultiRegister = 16 WriteMultiRegister = 16
} }
/// <summary>
/// Modbus协议
/// </summary>
public abstract class ModbusProtocal : BaseProtocal public abstract class ModbusProtocal : BaseProtocal
{ {
protected ModbusProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress) 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) public override byte[] BytesExtend(byte[] content)
{ {
//Modbus/Ascii协议扩张前面增加:后面增加LRC校验和尾字符
var newContent = new List<byte>(); var newContent = new List<byte>();
newContent.AddRange(Encoding.ASCII.GetBytes(":")); newContent.AddRange(Encoding.ASCII.GetBytes(":"));
foreach (var number in content) foreach (var number in content)
@@ -71,6 +72,7 @@ namespace Modbus.Net.Modbus
public override byte[] BytesDecact(byte[] content) public override byte[] BytesDecact(byte[] content)
{ {
//Modbus/Ascii协议收缩抛弃头尾。
var newContent = new List<byte>(); var newContent = new List<byte>();
var ans = Encoding.ASCII.GetString(content); var ans = Encoding.ASCII.GetString(content);
var index = ans.IndexOf(Environment.NewLine); var index = ans.IndexOf(Environment.NewLine);

View File

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

View File

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

View File

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

View File

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

View File

@@ -90,6 +90,7 @@
<ItemGroup> <ItemGroup>
<None Include="Modbus.Net.OPC.nuspec" /> <None Include="Modbus.Net.OPC.nuspec" />
<None Include="packages.config" /> <None Include="packages.config" />
<None Include="README.md" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- 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 namespace Modbus.Net.OPC
{ {
/// <summary>
/// OpcDa协议连接实现
/// </summary>
public class OpcDaConnector : BaseConnector public class OpcDaConnector : BaseConnector
{ {
protected static Dictionary<string, OpcDaConnector> _instances = new Dictionary<string, OpcDaConnector>(); protected static Dictionary<string, OpcDaConnector> _instances = new Dictionary<string, OpcDaConnector>();

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,9 @@
namespace Modbus.Net.OPC namespace Modbus.Net.OPC
{ {
/// <summary>
/// Opc协议
/// </summary>
public abstract class OpcProtocal : BaseProtocal public abstract class OpcProtocal : BaseProtocal
{ {
protected OpcProtocal() : base(0, 0) protected OpcProtocal() : base(0, 0)
@@ -9,6 +12,8 @@ namespace Modbus.Net.OPC
} }
} }
#region
public class ReadRequestOpcInputStruct : InputStruct public class ReadRequestOpcInputStruct : InputStruct
{ {
public ReadRequestOpcInputStruct(string tag) public ReadRequestOpcInputStruct(string tag)
@@ -43,6 +48,10 @@ namespace Modbus.Net.OPC
} }
} }
#endregion
#region
public class WriteRequestOpcInputStruct : InputStruct public class WriteRequestOpcInputStruct : InputStruct
{ {
public WriteRequestOpcInputStruct(string tag, object setValue) public WriteRequestOpcInputStruct(string tag, object setValue)
@@ -82,4 +91,6 @@ namespace Modbus.Net.OPC
return new WriteRequestOpcOutputStruct(ans); 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 namespace Modbus.Net.Siemens
{ {
/// <summary>
/// Siemens地址格式化Modbus.Net专用格式
/// </summary>
public class AddressFormaterSiemens : AddressFormater public class AddressFormaterSiemens : AddressFormater
{ {
public override string FormatAddress(string area, int address) public override string FormatAddress(string area, int address)
@@ -12,4 +15,36 @@
return area + " " + address + "." + subAddress; 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; using System.Linq;
namespace Modbus.Net.Siemens namespace Modbus.Net.Siemens
{ {
/// <summary>
/// 地址翻译器Modbus.Net格式
/// </summary>
public class AddressTranslatorSiemens : AddressTranslator public class AddressTranslatorSiemens : AddressTranslator
{ {
protected Dictionary<string, int> AreaCodeDictionary; protected Dictionary<string, int> AreaCodeDictionary;
@@ -69,4 +73,72 @@ namespace Modbus.Net.Siemens
return 1; 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"> <None Include="Modbus.Net.Siemens.nuspec">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</None> </None>
<None Include="README.md" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- 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 namespace Modbus.Net.Siemens
{ {
/// <summary>
/// 西门子设备
/// </summary>
public class SiemensMachine : BaseMachine public class SiemensMachine : BaseMachine
{ {
public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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