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.
136 lines
5.8 KiB
136 lines
5.8 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
|
|
namespace Mirle.Component.MPLC.MCProtocol
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class MCDevice
|
|
{
|
|
/// <summary>
|
|
/// 建構式
|
|
/// </summary>
|
|
private MCDevice() { }
|
|
/// <summary>
|
|
/// 設備尋找表
|
|
/// </summary>
|
|
private static readonly Dictionary<string, Device> _DeviceLookup = new Dictionary<string, Device>()
|
|
{
|
|
["SM"] = new Device(Device.TypeBit, "SM", 0x91, Device.AddressDecimal),
|
|
["SD"] = new Device(Device.TypeWord, "SD", 0xA9, Device.AddressDecimal),
|
|
["X"] = new Device(Device.TypeBit, "X*", 0x9C, Device.AddressHexadecimal),
|
|
["Y"] = new Device(Device.TypeBit, "Y*", 0x9D, Device.AddressHexadecimal),
|
|
["M"] = new Device(Device.TypeBit, "M*", 0x90, Device.AddressDecimal),
|
|
["L"] = new Device(Device.TypeBit, "L*", 0x92, Device.AddressDecimal),
|
|
["F"] = new Device(Device.TypeBit, "F*", 0x93, Device.AddressDecimal),
|
|
["V"] = new Device(Device.TypeBit, "V*", 0x94, Device.AddressDecimal),
|
|
["B"] = new Device(Device.TypeBit, "B*", 0xA0, Device.AddressHexadecimal),
|
|
["D"] = new Device(Device.TypeWord, "D*", 0xA8, Device.AddressDecimal),
|
|
["W"] = new Device(Device.TypeWord, "W*", 0xB4, Device.AddressHexadecimal),
|
|
["TS"] = new Device(Device.TypeBit, "TS", 0xC1, Device.AddressDecimal),
|
|
["TC"] = new Device(Device.TypeBit, "TC", 0xC0, Device.AddressDecimal),
|
|
["TN"] = new Device(Device.TypeWord, "TN", 0xC2, Device.AddressDecimal),
|
|
["SS"] = new Device(Device.TypeBit, "SS", 0xC7, Device.AddressDecimal),
|
|
["SC"] = new Device(Device.TypeBit, "SC", 0xC6, Device.AddressDecimal),
|
|
["SN"] = new Device(Device.TypeWord, "SN", 0xC8, Device.AddressDecimal),
|
|
["CS"] = new Device(Device.TypeBit, "CS", 0xC4, Device.AddressDecimal),
|
|
["CC"] = new Device(Device.TypeBit, "CC", 0xC3, Device.AddressDecimal),
|
|
["CN"] = new Device(Device.TypeWord, "CN", 0xC5, Device.AddressDecimal),
|
|
["SB"] = new Device(Device.TypeBit, "SB", 0xA1, Device.AddressHexadecimal),
|
|
["SW"] = new Device(Device.TypeWord, "SW", 0xB5, Device.AddressHexadecimal),
|
|
["S"] = new Device(Device.TypeBit, "S*", 0x98, Device.AddressDecimal),
|
|
["DX"] = new Device(Device.TypeBit, "DX", 0xA2, Device.AddressHexadecimal),
|
|
["DY"] = new Device(Device.TypeBit, "DY", 0xA3, Device.AddressHexadecimal),
|
|
["Z"] = new Device(Device.TypeWord, "Z*", 0xCC, Device.AddressDecimal),
|
|
["R"] = new Device(Device.TypeWord, "R*", 0xAF, Device.AddressDecimal),
|
|
["ZR"] = new Device(Device.TypeWord, "ZR", 0xB0, Device.AddressHexadecimal),
|
|
};
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public string AsciiAddress { get; private set; }
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public string AsciiDeviceCode { get; private set; }
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public byte BinaryDeviceCode { get; private set; }
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int Address { get; private set; }
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public bool IsBit { get; private set; } = false;
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public bool IsWord => !IsBit;
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int BitIndex { get; private set; }
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="deviceAddress"></param>
|
|
/// <returns></returns>
|
|
public static MCDevice Parse(string deviceAddress)
|
|
{
|
|
return Parse(deviceAddress, 0);
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="deviceAddress"></param>
|
|
/// <param name="offset"></param>
|
|
/// <returns></returns>
|
|
public static MCDevice Parse(string deviceAddress, int offset)
|
|
{
|
|
try
|
|
{
|
|
var item = _DeviceLookup.First(i => deviceAddress.StartsWith(i.Key));
|
|
var device = item.Value;
|
|
string asciiAddress = deviceAddress.TrimStart(item.Key.ToCharArray()).Split('.')[0];
|
|
int bitIndex = deviceAddress.Contains(".") ? int.Parse(deviceAddress.Split('.')[1], System.Globalization.NumberStyles.HexNumber) : 0;
|
|
if (device.DataType == Device.TypeBit)
|
|
{
|
|
bitIndex = 0;
|
|
}
|
|
int address = 0;
|
|
switch (device.AddressType)
|
|
{
|
|
case Device.AddressHexadecimal:
|
|
address = int.Parse(asciiAddress, System.Globalization.NumberStyles.HexNumber) + offset;
|
|
asciiAddress = address.ToString("X");
|
|
break;
|
|
case Device.AddressDecimal:
|
|
default:
|
|
address = int.Parse(asciiAddress) + offset;
|
|
asciiAddress = address.ToString("D");
|
|
break;
|
|
}
|
|
return new MCDevice()
|
|
{
|
|
AsciiAddress = asciiAddress,
|
|
AsciiDeviceCode = device.AsciiCode,
|
|
BinaryDeviceCode = device.BinaryCode,
|
|
Address = address,
|
|
IsBit = device.DataType == Device.TypeBit,
|
|
BitIndex = bitIndex,
|
|
};
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.WriteLine($"{ex}");
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
}
|