using System;
using System.Collections.Generic;
namespace Modbus.Net.Siemens
{
///
/// 地址翻译器(Modbus.Net格式)
///
public class AddressTranslatorSiemens : AddressTranslator
{
///
/// 区域的翻译字典
///
protected Dictionary AreaCodeDictionary;
///
/// 构造函数
///
public AddressTranslatorSiemens()
{
AreaCodeDictionary = new Dictionary
{
{"S", 0x04},
{"SM", 0x05},
{"AI", 0x06},
{"AQ", 0x07},
{"C", 0x1E},
{"T", 0x1F},
{"HC", 0x20},
{"I", 0x81},
{"Q", 0x82},
{"M", 0x83},
{"DB", 0x84},
{"V", 0x184}
};
}
///
/// 地址转换
///
/// 格式化的地址
/// 是否为读取,是为读取,否为写入
/// 翻译后的地址
public override AddressDef AddressTranslate(string address, bool isRead)
{
address = address.ToUpper();
var splitString = address.Split(' ');
var head = splitString[0];
var tail = splitString[1];
string sub;
if (tail.Contains('.'))
{
var splitString2 = tail.Split('.');
sub = splitString2[1];
tail = splitString2[0];
}
else
{
sub = "0";
}
if (head.Length > 1 && head.Substring(0, 2) == "DB")
{
head = head.Substring(2);
return new AddressDef
{
AreaString = "DB" + head,
Area = int.Parse(head) * 256 + AreaCodeDictionary["DB"],
Address = int.Parse(tail),
SubAddress = int.Parse(sub)
};
}
return
new AddressDef
{
AreaString = head,
Area = AreaCodeDictionary[head],
Address = int.Parse(tail),
SubAddress = int.Parse(sub)
};
}
///
/// 获取区域中的单个地址占用的字节长度
///
/// 区域名称
/// 字节长度
public override double GetAreaByteLength(string area)
{
return 1;
}
}
///
/// 地址翻译器(Siemens格式)
///
public class AddressTranslatorSimenseStandard : AddressTranslator
{
///
/// 区域的翻译字典
///
protected Dictionary AreaCodeDictionary;
///
/// 构造函数
///
public AddressTranslatorSimenseStandard()
{
AreaCodeDictionary = new Dictionary
{
{"S", 0x04},
{"SM", 0x05},
{"AI", 0x06},
{"AQ", 0x07},
{"C", 0x1E},
{"T", 0x1F},
{"HC", 0x20},
{"I", 0x81},
{"Q", 0x82},
{"M", 0x83},
{"DB", 0x84},
{"V", 0x184}
};
}
///
/// 地址转换
///
/// 格式化的地址
/// 是否为读取,是为读取,否为写入
/// 翻译后的地址
public override AddressDef AddressTranslate(string address, bool isRead)
{
address = address.ToUpper();
if (address.Substring(0, 2) == "DB")
{
var addressSplit = address.Split('.');
if (addressSplit.Length != 2 && addressSplit.Length != 3) throw new FormatException();
addressSplit[0] = addressSplit[0].Substring(2);
if (addressSplit[1].Substring(0, 2) == "DB")
addressSplit[1] = addressSplit[1].Substring(2);
return new AddressDef
{
AreaString = "DB" + addressSplit[0],
Area = int.Parse(addressSplit[0]) * 256 + AreaCodeDictionary["DB"],
Address = int.Parse(addressSplit[1]),
SubAddress = addressSplit.Length == 2 ? 0 : int.Parse(addressSplit[2])
};
}
var i = 0;
int t;
while (!int.TryParse(address[i].ToString(), out t) && i < address.Length)
i++;
if (i == 0 || i >= address.Length) throw new FormatException();
var head = address.Substring(0, i);
var tail = address.Substring(i).Split('.');
return new AddressDef
{
AreaString = head,
Area = AreaCodeDictionary[head],
Address = int.Parse(tail[0]),
SubAddress = tail.Length == 1 ? 0 : int.Parse(tail[1])
};
}
///
/// 获取区域中的单个地址占用的字节长度
///
/// 区域名称
/// 字节长度
public override double GetAreaByteLength(string area)
{
return 1;
}
}
}