208 lines
7.4 KiB
C#
208 lines
7.4 KiB
C#
namespace S7.Net
|
|
{
|
|
internal class PLCAddress
|
|
{
|
|
private DataType dataType;
|
|
private int dbNumber;
|
|
private int startByte;
|
|
private int bitNumber;
|
|
private VarType varType;
|
|
|
|
public DataType DataType
|
|
{
|
|
get => dataType;
|
|
set => dataType = value;
|
|
}
|
|
|
|
public int DbNumber
|
|
{
|
|
get => dbNumber;
|
|
set => dbNumber = value;
|
|
}
|
|
|
|
public int StartByte
|
|
{
|
|
get => startByte;
|
|
set => startByte = value;
|
|
}
|
|
|
|
public int BitNumber
|
|
{
|
|
get => bitNumber;
|
|
set => bitNumber = value;
|
|
}
|
|
|
|
public VarType VarType
|
|
{
|
|
get => varType;
|
|
set => varType = value;
|
|
}
|
|
|
|
public PLCAddress(string address)
|
|
{
|
|
Parse(address, out dataType, out dbNumber, out varType, out startByte, out bitNumber);
|
|
}
|
|
|
|
public static void Parse(string input, out DataType dataType, out int dbNumber, out VarType varType, out int address, out int bitNumber)
|
|
{
|
|
bitNumber = -1;
|
|
dbNumber = 0;
|
|
|
|
switch (input.Substring(0, 2))
|
|
{
|
|
case "DB":
|
|
string[] strings = input.Split(new char[] { '.' });
|
|
if (strings.Length < 2)
|
|
throw new InvalidAddressException("To few periods for DB address");
|
|
|
|
dataType = DataType.DataBlock;
|
|
dbNumber = int.Parse(strings[0].Substring(2));
|
|
address = int.Parse(strings[1].Substring(3));
|
|
|
|
string dbType = strings[1].Substring(0, 3);
|
|
switch (dbType)
|
|
{
|
|
case "DBB":
|
|
varType = VarType.Byte;
|
|
return;
|
|
case "DBW":
|
|
varType = VarType.Word;
|
|
return;
|
|
case "DBD":
|
|
varType = VarType.DWord;
|
|
return;
|
|
case "DBX":
|
|
bitNumber = int.Parse(strings[2]);
|
|
if (bitNumber > 7)
|
|
throw new InvalidAddressException("Bit can only be 0-7");
|
|
varType = VarType.Bit;
|
|
return;
|
|
default:
|
|
throw new InvalidAddressException();
|
|
}
|
|
case "IB":
|
|
case "EB":
|
|
// Input byte
|
|
dataType = DataType.Input;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.Byte;
|
|
return;
|
|
case "IW":
|
|
case "EW":
|
|
// Input word
|
|
dataType = DataType.Input;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.Word;
|
|
return;
|
|
case "ID":
|
|
case "ED":
|
|
// Input double-word
|
|
dataType = DataType.Input;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.DWord;
|
|
return;
|
|
case "QB":
|
|
case "AB":
|
|
case "OB":
|
|
// Output byte
|
|
dataType = DataType.Output;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.Byte;
|
|
return;
|
|
case "QW":
|
|
case "AW":
|
|
case "OW":
|
|
// Output word
|
|
dataType = DataType.Output;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.Word;
|
|
return;
|
|
case "QD":
|
|
case "AD":
|
|
case "OD":
|
|
// Output double-word
|
|
dataType = DataType.Output;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.DWord;
|
|
return;
|
|
case "MB":
|
|
// Memory byte
|
|
dataType = DataType.Memory;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.Byte;
|
|
return;
|
|
case "MW":
|
|
// Memory word
|
|
dataType = DataType.Memory;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.Word;
|
|
return;
|
|
case "MD":
|
|
// Memory double-word
|
|
dataType = DataType.Memory;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(2));
|
|
varType = VarType.DWord;
|
|
return;
|
|
default:
|
|
switch (input.Substring(0, 1))
|
|
{
|
|
case "E":
|
|
case "I":
|
|
// Input
|
|
dataType = DataType.Input;
|
|
varType = VarType.Bit;
|
|
break;
|
|
case "Q":
|
|
case "A":
|
|
case "O":
|
|
// Output
|
|
dataType = DataType.Output;
|
|
varType = VarType.Bit;
|
|
break;
|
|
case "M":
|
|
// Memory
|
|
dataType = DataType.Memory;
|
|
varType = VarType.Bit;
|
|
break;
|
|
case "T":
|
|
// Timer
|
|
dataType = DataType.Timer;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(1));
|
|
varType = VarType.Timer;
|
|
return;
|
|
case "Z":
|
|
case "C":
|
|
// Counter
|
|
dataType = DataType.Counter;
|
|
dbNumber = 0;
|
|
address = int.Parse(input.Substring(1));
|
|
varType = VarType.Counter;
|
|
return;
|
|
default:
|
|
throw new InvalidAddressException(string.Format("{0} is not a valid address", input.Substring(0, 1)));
|
|
}
|
|
|
|
string txt2 = input.Substring(1);
|
|
if (txt2.IndexOf(".") == -1)
|
|
throw new InvalidAddressException("To few periods for DB address");
|
|
|
|
address = int.Parse(txt2.Substring(0, txt2.IndexOf(".")));
|
|
bitNumber = int.Parse(txt2.Substring(txt2.IndexOf(".") + 1));
|
|
if (bitNumber > 7)
|
|
throw new InvalidAddressException("Bit can only be 0-7");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|