Files
Modbus.Net/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs
parallelbgls@outlook.com a7162ebf70 2016-01-30 update 1
2016-01-30 12:02:46 +08:00

171 lines
5.6 KiB
C#

using System;
using System.Threading.Tasks;
namespace ModBus.Net.Siemens
{
public enum SiemensType
{
Ppi = 0,
Mpi = 1,
Tcp = 2
};
public enum SiemensMachineModel
{
S7_200 = 0,
S7_200_Smart = 1,
S7_300 = 2,
S7_400 = 3,
S7_1200 = 4,
S7_1500 = 5
};
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 _maxPdu;
private SiemensType _siemensType;
public SiemensType ConnectionType
{
get
{
return _siemensType;
}
set
{
_siemensType = value;
switch (_siemensType)
{
//case SiemensType.Ppi:
// {
// throw new NotImplementedException();
// }
//case SiemensType.Mpi:
// {
// throw new NotImplementedException();
// }
case SiemensType.Tcp:
{
Wrapper = ConnectionString == null ? new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu) : new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ConnectionString);
break;
}
}
}
}
public SiemensUtility(SiemensType connectionType, string connectionString, SiemensMachineModel model)
{
ConnectionString = connectionString;
switch (model)
{
case SiemensMachineModel.S7_200:
{
_tdpuSize = 0x09;
_taspSrc = 0x1001;
_tsapDst = 0x1000;
_maxCalling = 0x0001;
_maxCalled = 0x0001;
_maxPdu = 0x03c0;
break;
}
case SiemensMachineModel.S7_300:
case SiemensMachineModel.S7_400:
{
_tdpuSize = 0x1a;
_taspSrc = 0x4b54;
_tsapDst = 0x0302;
_maxCalling = 0x0001;
_maxCalled = 0x0001;
_maxPdu = 0x00f0;
break;
}
case SiemensMachineModel.S7_1200:
case SiemensMachineModel.S7_1500:
{
_tdpuSize = 0x0a;
_taspSrc = 0x1011;
_tsapDst = 0x0301;
_maxCalling = 0x0003;
_maxCalled = 0x0003;
_maxPdu = 0x0100;
break;
}
case SiemensMachineModel.S7_200_Smart:
{
_tdpuSize = 0x0a;
_taspSrc = 0x0101;
_tsapDst = 0x0101;
_maxCalling = 0x0001;
_maxCalled = 0x0001;
_maxPdu = 0x03c0;
break;
}
default:
{
throw new NotImplementedException("没有相应的西门子类型");
}
}
ConnectionType = connectionType;
AddressTranslator = new AddressTranslatorSiemens();
}
public override void SetConnectionType(int connectionType)
{
ConnectionType = (SiemensType) connectionType;
}
protected override async Task<byte[]> GetDatasAsync(byte belongAddress, byte materAddress, string startAddress, int getByteCount)
{
try
{
var readRequestSiemensInputStruct = new ReadRequestSiemensInputStruct(0xd3c7, SiemensTypeCode.Byte, startAddress, (ushort)getByteCount, AddressTranslator);
var readRequestSiemensOutputStruct =
await
Wrapper.SendReceiveAsync(Wrapper[typeof (ReadRequestSiemensProtocal)],
readRequestSiemensInputStruct) as ReadRequestSiemensOutputStruct;
return readRequestSiemensOutputStruct?.GetValue;
}
catch (Exception)
{
return null;
}
}
public override async Task<bool> SetDatasAsync(byte belongAddress, byte materAddress, string startAddress, object[] setContents)
{
try
{
var writeRequestSiemensInputStruct = new WriteRequestSiemensInputStruct(0xd3c8, startAddress, setContents, AddressTranslator);
var writeRequestSiemensOutputStruct =
await
Wrapper.SendReceiveAsync(Wrapper[typeof (WriteRequestSiemensProtocal)],
writeRequestSiemensInputStruct) as WriteRequestSiemensOutputStruct;
return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError;
}
catch (Exception)
{
return false;
}
}
/*
public override DateTime GetTime(byte belongAddress)
{
throw new NotImplementedException();
}
public override bool SetTime(byte belongAddress, DateTime setTime)
{
throw new NotImplementedException();
}
*/
}
}