Files
Modbus.Net/Modbus.Net/ModBus.Net/AddressTranslator.cs
parallelbgls@outlook.com 30895c2d1e 2014-10-11 update 1
2014-10-11 14:57:10 +08:00

124 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Dynamic;
namespace ModBus.Net
{
/// <summary>
/// 数据单元翻译器
/// </summary>
public abstract class AddressTranslator
{
protected static AddressTranslator _instance;
public static AddressTranslator Instance
{
get
{
if (_instance == null)
{
CreateTranslator(new AddressTranslatorBase());
}
return _instance;
}
protected set
{
if (value == null) CreateTranslator(new AddressTranslatorBase());
_instance = value;
}
}
public static void CreateTranslator(AddressTranslator instance)
{
Instance = instance;
}
public abstract KeyValuePair<int,int> AddressTranslate(string address, bool isRead);
}
/// <summary>
/// NA200H数据单元翻译器
/// </summary>
public class AddressTranslatorNA200H : AddressTranslator
{
protected Dictionary<string, int> TransDictionary;
protected Dictionary<string, int> ReadFunctionCodeDictionary;
protected Dictionary<string, int> WriteFunctionCodeDictionary;
public AddressTranslatorNA200H()
{
TransDictionary = new Dictionary<string, int>
{
{"Q", 0},
{"M", 10000},
{"N", 20000},
{"I", 0},
{"S", 10000},
{"IW", 0},
{"SW", 5000},
{"MW", 0},
{"NW", 10000},
{"QW", 20000},
};
ReadFunctionCodeDictionary = new Dictionary<string, int>
{
{"Q", (int)ModbusProtocalReadDataFunctionCode.ReadCoilStatus},
{"M", (int)ModbusProtocalReadDataFunctionCode.ReadCoilStatus},
{"N", (int)ModbusProtocalReadDataFunctionCode.ReadCoilStatus},
{"I", (int)ModbusProtocalReadDataFunctionCode.ReadInputStatus},
{"S", (int)ModbusProtocalReadDataFunctionCode.ReadInputStatus},
{"IW", (int)ModbusProtocalReadDataFunctionCode.ReadInputRegister},
{"SW", (int)ModbusProtocalReadDataFunctionCode.ReadInputRegister},
{"MW", (int)ModbusProtocalReadDataFunctionCode.ReadHoldRegister},
{"NW", (int)ModbusProtocalReadDataFunctionCode.ReadHoldRegister},
{"QW", (int)ModbusProtocalReadDataFunctionCode.ReadHoldRegister},
};
WriteFunctionCodeDictionary = new Dictionary<string, int>
{
{"Q", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiCoil},
{"M", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiCoil},
{"N", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiCoil},
{"MW", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister},
{"NW", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister},
{"QW", (int)ModbusProtocalWriteDataFunctionCode.WriteMultiRegister},
};
}
public override KeyValuePair<int, int> AddressTranslate(string address, bool isRead)
{
address = address.ToUpper();
int 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();
string head = address.Substring(0, i);
string tail = address.Substring(i);
return isRead
? new KeyValuePair<int, int>(TransDictionary[head] + int.Parse(tail) - 1,
ReadFunctionCodeDictionary[head])
: new KeyValuePair<int, int>(TransDictionary[head] + int.Parse(tail) - 1,
WriteFunctionCodeDictionary[head]);
}
}
/// <summary>
/// 基本的单元转换器
/// </summary>
public class AddressTranslatorBase : AddressTranslator
{
public override KeyValuePair<int, int> AddressTranslate(string address, bool isRead)
{
int num1,num2;
string[] split = address.Split(':');
if (split.Length != 2) throw new FormatException();
if (int.TryParse(split[0], out num1) && int.TryParse(split[1], out num2))
{
return new KeyValuePair<int, int>(num2, num1);
}
throw new FormatException();
}
}
}