You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.5 KiB
180 lines
5.5 KiB
using System.Collections.Generic;
|
|
|
|
namespace DataService
|
|
{
|
|
public abstract class IModbusReader: IPLCDevice
|
|
{
|
|
public const byte fctReadCoil = 1;
|
|
public const byte fctReadDiscreteInputs = 2;
|
|
public const byte fctReadHoldingRegister = 3;
|
|
public const byte fctReadInputRegister = 4;
|
|
public const byte fctWriteSingleCoil = 5;
|
|
public const byte fctWriteSingleRegister = 6;
|
|
public const byte fctWriteMultipleCoils = 15;
|
|
public const byte fctWriteMultipleRegister = 16;
|
|
public const byte fctReadWriteMultipleRegister = 23;
|
|
|
|
public int PDU
|
|
{
|
|
get { return 0xFF; }
|
|
}
|
|
|
|
public int GetBlockSize(int area)
|
|
{
|
|
return area > 2 ? PDU / 2 : PDU;
|
|
}
|
|
|
|
public DeviceAddress GetDeviceAddress(string address)
|
|
{
|
|
DeviceAddress dv = DeviceAddress.Empty;
|
|
if (address == null || address.Length < 3)
|
|
return dv;
|
|
else
|
|
{
|
|
int index = address.IndexOf('.');
|
|
switch (address[0])
|
|
{
|
|
case '0':
|
|
dv.Area = fctReadCoil;
|
|
if (index > 0)
|
|
{
|
|
dv.Start = 64 * int.Parse(address.Substring(1, index - 1));
|
|
dv.Bit = byte.Parse(address.Substring(index + 1));
|
|
}
|
|
break;
|
|
case '1':
|
|
dv.Area = fctReadDiscreteInputs;
|
|
if (index > 0)
|
|
{
|
|
dv.Start = 64 * int.Parse(address.Substring(1, index - 1));
|
|
dv.Bit = byte.Parse(address.Substring(index + 1));
|
|
}
|
|
break;
|
|
case '4':
|
|
dv.Area = fctReadHoldingRegister;
|
|
if (index > 0)
|
|
{
|
|
dv.Start = int.Parse(address.Substring(1, index - 1));
|
|
dv.Bit = byte.Parse(address.Substring(index + 1));
|
|
}
|
|
else
|
|
dv.Start = int.Parse(address.Mid(1));
|
|
break;
|
|
case '3':
|
|
dv.Area = fctReadInputRegister;
|
|
if (index > 0)
|
|
{
|
|
dv.Start = int.Parse(address.Substring(1, index - 1));
|
|
dv.Bit = byte.Parse(address.Substring(index + 1));
|
|
}
|
|
else
|
|
dv.Start = int.Parse(address.Mid(1));
|
|
break;
|
|
}
|
|
}
|
|
return dv;
|
|
}
|
|
|
|
public string GetAddress(DeviceAddress address)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
|
|
short _id;
|
|
public short ID
|
|
{
|
|
get
|
|
{
|
|
return _id;
|
|
}
|
|
}
|
|
|
|
string _server;
|
|
public string ServerName
|
|
{
|
|
get { return _server; }
|
|
set { _server = value; }
|
|
}
|
|
|
|
public abstract DeviceDriver Driver
|
|
{
|
|
get ;
|
|
}
|
|
|
|
public abstract bool IsClosed
|
|
{
|
|
get;
|
|
}
|
|
|
|
private int _timeout;
|
|
public int TimeOut
|
|
{
|
|
get { return _timeout; }
|
|
set { _timeout = value; }
|
|
}
|
|
|
|
List<IGroup> _grps = new List<IGroup>(20);
|
|
public IEnumerable<IGroup> Groups
|
|
{
|
|
get { return _grps; }
|
|
}
|
|
|
|
IDataServer _parent;
|
|
public IDataServer Parent
|
|
{
|
|
get { return _parent; }
|
|
}
|
|
|
|
public abstract bool Connect();
|
|
|
|
public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false)
|
|
{
|
|
ModbusGroup grp = new ModbusGroup(id, name, updateRate, active, this);
|
|
_grps.Add(grp);
|
|
return grp;
|
|
}
|
|
|
|
public bool RemoveGroup(IGroup grp)
|
|
{
|
|
grp.IsActive = false;
|
|
return _grps.Remove(grp);
|
|
}
|
|
|
|
public event ShutdownRequestEventHandler OnClose;
|
|
|
|
public abstract void Dispose();
|
|
|
|
public abstract byte[] ReadBytes(DeviceAddress address, ushort size);
|
|
|
|
public abstract ItemData<int> ReadInt32(DeviceAddress address);
|
|
|
|
public abstract ItemData<short> ReadInt16(DeviceAddress address);
|
|
|
|
public abstract ItemData<byte> ReadByte(DeviceAddress address);
|
|
|
|
public abstract ItemData<string> ReadString(DeviceAddress address, ushort size);
|
|
|
|
public abstract ItemData<float> ReadFloat(DeviceAddress address);
|
|
|
|
public abstract ItemData<bool> ReadBit(DeviceAddress address);
|
|
|
|
public abstract ItemData<object> ReadValue(DeviceAddress address);
|
|
|
|
public abstract int WriteBytes(DeviceAddress address, byte[] bit);
|
|
|
|
public abstract int WriteBit(DeviceAddress address, bool bit);
|
|
|
|
public abstract int WriteBits(DeviceAddress address, byte bits);
|
|
|
|
public abstract int WriteInt16(DeviceAddress address, short value);
|
|
|
|
public abstract int WriteInt32(DeviceAddress address, int value);
|
|
|
|
public abstract int WriteFloat(DeviceAddress address, float value);
|
|
|
|
public abstract int WriteString(DeviceAddress address, string str);
|
|
|
|
public abstract int WriteValue(DeviceAddress address, object value);
|
|
}
|
|
}
|
|
|