78 lines
2.7 KiB
C#
78 lines
2.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|