using System; namespace ModBus.Net { public class SimenseTcpProtocal : SimenseProtocal { private ushort _taspSrc; private ushort _tsapDst; private ushort _maxCalling; private ushort _maxCalled; private ushort _maxPdu; private byte _tdpuSize; private string _ip; private int connectTryCount; public SimenseTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu) : this(tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ConfigurationManager.IP) { } public SimenseTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu, string ip) { _taspSrc = tsapSrc; _tsapDst = tsapDst; _maxCalling = maxCalling; _maxCalled = maxCalled; _maxPdu = maxPdu; _tdpuSize = tdpuSize; _ip = ip; connectTryCount = 0; } public override byte[] SendReceive(params object[] content) { while (!ProtocalLinker.IsConnected) { Connect(); } return base.SendReceive(content); } public override OutputStruct SendReceive(ProtocalUnit unit, InputStruct content) { if (!ProtocalLinker.IsConnected) { if (connectTryCount > 10) return null; Connect(); } return base.SendReceive(unit, content); } private OutputStruct ForceSendReceive(ProtocalUnit unit, InputStruct content) { return base.SendReceive(unit, content); } public override bool Connect() { connectTryCount++; ProtocalLinker = new SimenseTcpProtocalLinker(_ip); if (ProtocalLinker.Connect()) { var inputStruct = new CreateReferenceSimenseInputStruct(_tdpuSize, _taspSrc, _tsapDst); var outputStruct = (CreateReferenceSimenseOutputStruct) ForceSendReceive(this[typeof (CreateReferenceSimenseProtocal)], inputStruct); if (!ProtocalLinker.IsConnected) return false; var inputStruct2 = new EstablishAssociationSimenseInputStruct(0x0101, _maxCalling, _maxCalled, _maxPdu); var outputStruct2 = (EstablishAssociationSimenseOutputStruct) SendReceive(this[typeof (EstablishAssociationSimenseProtocal)], inputStruct2); return true; } return false; } } }