using System;
using System.Collections.Generic;
using System.Text;
namespace TFT_MelsecMcNet
{
///
/// 三菱的数据地址表示形式
///
public class McAddressData : DeviceAddressDataBase
{
#region Constructor
///
/// 实例化一个默认的对象
///
public McAddressData()
{
McDataType = MelsecMcDataType.D;
}
#endregion
///
/// 三菱的数据地址信息
///
public MelsecMcDataType McDataType { get; set; }
///
/// 从指定的地址信息解析成真正的设备地址信息,默认是三菱的地址
///
/// 地址信息
/// 数据长度
public override void Parse(string address, ushort length)
{
OperateResult addressData = ParseMelsecFrom(address, length);
if (addressData.IsSuccess)
{
AddressStart = addressData.Content.AddressStart;
Length = addressData.Content.Length;
McDataType = addressData.Content.McDataType;
}
}
#region Static Method
///
/// 从实际三菱的地址里面解析出
///
/// 三菱的地址数据信息
/// 读取的数据长度
/// 是否成功的结果对象
public static OperateResult ParseMelsecFrom(string address, ushort length)
{
McAddressData addressData = new McAddressData
{
Length = length
};
try
{
switch (address[0])
{
case 'M':
case 'm':
{
addressData.McDataType = MelsecMcDataType.M;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.M.FromBase);
break;
}
case 'X':
case 'x':
{
addressData.McDataType = MelsecMcDataType.X;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.X.FromBase);
break;
}
case 'Y':
case 'y':
{
addressData.McDataType = MelsecMcDataType.Y;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Y.FromBase);
break;
}
case 'D':
case 'd':
{
addressData.McDataType = MelsecMcDataType.D;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.D.FromBase);
break;
}
case 'W':
case 'w':
{
addressData.McDataType = MelsecMcDataType.W;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.W.FromBase);
break;
}
case 'L':
case 'l':
{
addressData.McDataType = MelsecMcDataType.L;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.L.FromBase);
break;
}
case 'F':
case 'f':
{
addressData.McDataType = MelsecMcDataType.F;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.F.FromBase);
break;
}
case 'V':
case 'v':
{
addressData.McDataType = MelsecMcDataType.V;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.V.FromBase);
break;
}
case 'B':
case 'b':
{
addressData.McDataType = MelsecMcDataType.B;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.B.FromBase);
break;
}
case 'R':
case 'r':
{
addressData.McDataType = MelsecMcDataType.R;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.R.FromBase);
break;
}
case 'S':
case 's':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.SN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.SN.FromBase);
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.SS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.SS.FromBase);
break;
}
else if (address[1] == 'C' || address[1] == 'c')
{
addressData.McDataType = MelsecMcDataType.SC;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.SC.FromBase);
break;
}
else
{
addressData.McDataType = MelsecMcDataType.S;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.S.FromBase);
break;
}
}
case 'Z':
case 'z':
{
if (address.StartsWith("ZR") || address.StartsWith("zr"))
{
addressData.McDataType = MelsecMcDataType.ZR;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.ZR.FromBase);
break;
}
else
{
addressData.McDataType = MelsecMcDataType.Z;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Z.FromBase);
break;
}
}
case 'T':
case 't':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.TN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.TN.FromBase);
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.TS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.TS.FromBase);
break;
}
else if (address[1] == 'C' || address[1] == 'c')
{
addressData.McDataType = MelsecMcDataType.TC;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.TC.FromBase);
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
case 'C':
case 'c':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.CN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.CN.FromBase);
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.CS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.CS.FromBase);
break;
}
else if (address[1] == 'C' || address[1] == 'c')
{
addressData.McDataType = MelsecMcDataType.CC;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.CC.FromBase);
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
default: throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
catch (Exception ex)
{
return new OperateResult(ex.Message);
}
return OperateResult.CreateSuccessResult(addressData);
}
///
/// 从实际基恩士的地址里面解析出
///
/// 基恩士的地址数据信息
/// 读取的数据长度
/// 是否成功的结果对象
public static OperateResult ParseKeyenceFrom(string address, ushort length)
{
McAddressData addressData = new McAddressData();
addressData.Length = length;
try
{
switch (address[0])
{
case 'M':
case 'm':
{
addressData.McDataType = MelsecMcDataType.Keyence_M;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_M.FromBase);
break;
}
case 'X':
case 'x':
{
addressData.McDataType = MelsecMcDataType.Keyence_X;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_X.FromBase);
break;
}
case 'Y':
case 'y':
{
addressData.McDataType = MelsecMcDataType.Keyence_Y;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_Y.FromBase);
break;
}
case 'B':
case 'b':
{
addressData.McDataType = MelsecMcDataType.Keyence_B;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_B.FromBase);
break;
}
case 'L':
case 'l':
{
addressData.McDataType = MelsecMcDataType.Keyence_L;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_L.FromBase);
break;
}
case 'S':
case 's':
{
if (address[1] == 'M' || address[1] == 'm')
{
addressData.McDataType = MelsecMcDataType.Keyence_SM;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_SM.FromBase);
break;
}
else if (address[1] == 'D' || address[1] == 'd')
{
addressData.McDataType = MelsecMcDataType.Keyence_SD;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_SD.FromBase);
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
case 'D':
case 'd':
{
addressData.McDataType = MelsecMcDataType.Keyence_D;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_D.FromBase);
break;
}
case 'R':
case 'r':
{
addressData.McDataType = MelsecMcDataType.Keyence_R;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_R.FromBase);
break;
}
case 'Z':
case 'z':
{
if (address[1] == 'R' || address[1] == 'r')
{
addressData.McDataType = MelsecMcDataType.Keyence_ZR;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_ZR.FromBase);
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
case 'W':
case 'w':
{
addressData.McDataType = MelsecMcDataType.Keyence_W;
addressData.AddressStart = Convert.ToInt32(address.Substring(1), MelsecMcDataType.Keyence_W.FromBase);
break;
}
case 'T':
case 't':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.Keyence_TN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_TN.FromBase);
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.Keyence_TS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_TS.FromBase);
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
case 'C':
case 'c':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.Keyence_CN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_CN.FromBase);
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.Keyence_CS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2), MelsecMcDataType.Keyence_CS.FromBase);
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
default: throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
catch (Exception ex)
{
return new OperateResult(ex.Message);
}
return OperateResult.CreateSuccessResult(addressData);
}
///
/// 计算松下的MC协议的偏移地址的机制
///
/// 字符串形式的地址
/// 实际的偏移地址
public static int GetPanasonicAddress(string address)
{
if (address.IndexOf('.') > 0)
{
string[] values = address.Split('.');
return Convert.ToInt32(values[0]) * 16 + Convert.ToInt32(values[1]);
}
else
{
return Convert.ToInt32(address.Substring(0, address.Length - 1)) * 16 + Convert.ToInt32(address.Substring(address.Length - 1), 16);
}
}
///
/// 从实际松下的地址里面解析出
///
/// 松下的地址数据信息
/// 读取的数据长度
/// 是否成功的结果对象
public static OperateResult ParsePanasonicFrom(string address, ushort length)
{
McAddressData addressData = new McAddressData();
addressData.Length = length;
try
{
switch (address[0])
{
case 'R':
case 'r':
{
int add = GetPanasonicAddress(address.Substring(1));
if (add < 14400)
{
addressData.McDataType = MelsecMcDataType.Panasonic_R;
addressData.AddressStart = add;
}
else
{
addressData.McDataType = MelsecMcDataType.Panasonic_SM;
addressData.AddressStart = add - 14400;
}
break;
}
case 'X':
case 'x':
{
addressData.McDataType = MelsecMcDataType.Panasonic_X;
addressData.AddressStart = GetPanasonicAddress(address.Substring(1));
break;
}
case 'Y':
case 'y':
{
addressData.McDataType = MelsecMcDataType.Panasonic_Y;
addressData.AddressStart = GetPanasonicAddress(address.Substring(1));
break;
}
case 'L':
case 'l':
{
if (address[1] == 'D' || address[1] == 'd')
{
addressData.McDataType = MelsecMcDataType.Panasonic_LD;
addressData.AddressStart = Convert.ToInt32(address.Substring(2));
break;
}
else
{
addressData.McDataType = MelsecMcDataType.Panasonic_L;
addressData.AddressStart = GetPanasonicAddress(address.Substring(1));
}
break;
}
case 'D':
case 'd':
{
int add = Convert.ToInt32(address.Substring(1));
if (add < 90000)
{
addressData.McDataType = MelsecMcDataType.Panasonic_DT;
addressData.AddressStart = Convert.ToInt32(address.Substring(1));
}
else
{
addressData.McDataType = MelsecMcDataType.Panasonic_SD;
addressData.AddressStart = Convert.ToInt32(address.Substring(1)) - 90000;
}
break;
}
case 'T':
case 't':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.Panasonic_TN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2));
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.Panasonic_TS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2));
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
case 'C':
case 'c':
{
if (address[1] == 'N' || address[1] == 'n')
{
addressData.McDataType = MelsecMcDataType.Panasonic_CN;
addressData.AddressStart = Convert.ToInt32(address.Substring(2));
break;
}
else if (address[1] == 'S' || address[1] == 's')
{
addressData.McDataType = MelsecMcDataType.Panasonic_CS;
addressData.AddressStart = Convert.ToInt32(address.Substring(2));
break;
}
else
{
throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
default: throw new Exception(StringResources.Language.NotSupportedDataType);
}
}
catch (Exception ex)
{
return new OperateResult(ex.Message);
}
return OperateResult.CreateSuccessResult(addressData);
}
#endregion
}
}