|
@@ -4,6 +4,7 @@ using System.Text;
|
|
|
using YSAI.Core.attribute;
|
|
using YSAI.Core.attribute;
|
|
|
using YSAI.Core.communication.net.tcp.client;
|
|
using YSAI.Core.communication.net.tcp.client;
|
|
|
using YSAI.Core.data;
|
|
using YSAI.Core.data;
|
|
|
|
|
+using YSAI.Core.@enum;
|
|
|
using YSAI.Core.@interface;
|
|
using YSAI.Core.@interface;
|
|
|
using YSAI.Core.subscription;
|
|
using YSAI.Core.subscription;
|
|
|
using YSAI.Core.virtualAddress;
|
|
using YSAI.Core.virtualAddress;
|
|
@@ -92,10 +93,10 @@ namespace YSAI.Mitsubishi
|
|
|
/// <param name="address">地址名</param>
|
|
/// <param name="address">地址名</param>
|
|
|
/// <param name="toUpper">转换成大写</param>
|
|
/// <param name="toUpper">转换成大写</param>
|
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
|
- private McAddressDetails ParseQNA3E(string address, McDT dataType = McDT.None, bool toUpper = true)
|
|
|
|
|
|
|
+ private ADetails ParseQNA3E(string address, DataType dataType = DataType.None, bool toUpper = true)
|
|
|
{
|
|
{
|
|
|
if (toUpper) address = address.ToUpper();
|
|
if (toUpper) address = address.ToUpper();
|
|
|
- var addressInfo = new McAddressDetails()
|
|
|
|
|
|
|
+ var addressInfo = new ADetails()
|
|
|
{
|
|
{
|
|
|
DataType = dataType
|
|
DataType = dataType
|
|
|
};
|
|
};
|
|
@@ -325,10 +326,10 @@ namespace YSAI.Mitsubishi
|
|
|
/// <param name="address">地址名</param>
|
|
/// <param name="address">地址名</param>
|
|
|
/// <param name="toUpper">转换成大写</param>
|
|
/// <param name="toUpper">转换成大写</param>
|
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
|
- private McAddressDetails ParseA1E(string address, bool toUpper = true)
|
|
|
|
|
|
|
+ private ADetails ParseA1E(string address, bool toUpper = true)
|
|
|
{
|
|
{
|
|
|
if (toUpper) address = address.ToUpper();
|
|
if (toUpper) address = address.ToUpper();
|
|
|
- var addressInfo = new McAddressDetails();
|
|
|
|
|
|
|
+ var addressInfo = new ADetails();
|
|
|
switch (address[0])
|
|
switch (address[0])
|
|
|
{
|
|
{
|
|
|
case 'X'://X输入寄存器
|
|
case 'X'://X输入寄存器
|
|
@@ -533,26 +534,26 @@ namespace YSAI.Mitsubishi
|
|
|
private byte[] R(string address, ushort length, bool isBit = false)
|
|
private byte[] R(string address, ushort length, bool isBit = false)
|
|
|
{
|
|
{
|
|
|
//地址详情
|
|
//地址详情
|
|
|
- McAddressDetails details = null;
|
|
|
|
|
|
|
+ ADetails details = null;
|
|
|
//命令字节
|
|
//命令字节
|
|
|
byte[]? command = null;
|
|
byte[]? command = null;
|
|
|
//类型判断
|
|
//类型判断
|
|
|
- switch (basics.DType)
|
|
|
|
|
|
|
+ switch (basics.PType)
|
|
|
{
|
|
{
|
|
|
- case DevType.A1E:
|
|
|
|
|
|
|
+ case pType.A1E:
|
|
|
details = ParseA1E(address);
|
|
details = ParseA1E(address);
|
|
|
command = ReadCommand_A1E(details.BeginAddress, details.TypeCode, (ushort)length, isBit);
|
|
command = ReadCommand_A1E(details.BeginAddress, details.TypeCode, (ushort)length, isBit);
|
|
|
break;
|
|
break;
|
|
|
- case DevType.QNA3E:
|
|
|
|
|
|
|
+ case pType.QNA3E:
|
|
|
details = ParseQNA3E(address);
|
|
details = ParseQNA3E(address);
|
|
|
command = ReadCommand_QNA3E(details.BeginAddress, details.TypeCode, (ushort)length, isBit);
|
|
command = ReadCommand_QNA3E(details.BeginAddress, details.TypeCode, (ushort)length, isBit);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
//发送等待结果
|
|
//发送等待结果
|
|
|
OperateResult operateResult = null;
|
|
OperateResult operateResult = null;
|
|
|
- switch (basics.DType)
|
|
|
|
|
|
|
+ switch (basics.PType)
|
|
|
{
|
|
{
|
|
|
- case DevType.A1E:
|
|
|
|
|
|
|
+ case pType.A1E:
|
|
|
var lenght = command[10] + command[11] * 256;
|
|
var lenght = command[10] + command[11] * 256;
|
|
|
if (isBit)
|
|
if (isBit)
|
|
|
{
|
|
{
|
|
@@ -563,7 +564,7 @@ namespace YSAI.Mitsubishi
|
|
|
operateResult = tcpClientOperate.SendWait(command);
|
|
operateResult = tcpClientOperate.SendWait(command);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
- case DevType.QNA3E:
|
|
|
|
|
|
|
+ case pType.QNA3E:
|
|
|
operateResult = tcpClientOperate.SendWait(command);
|
|
operateResult = tcpClientOperate.SendWait(command);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -582,13 +583,13 @@ namespace YSAI.Mitsubishi
|
|
|
|
|
|
|
|
int len = length;
|
|
int len = length;
|
|
|
byte[] RValue = null;
|
|
byte[] RValue = null;
|
|
|
- switch (basics.DType)
|
|
|
|
|
|
|
+ switch (basics.PType)
|
|
|
{
|
|
{
|
|
|
- case DevType.A1E:
|
|
|
|
|
- RValue= new byte[bytes.Length - 2];
|
|
|
|
|
|
|
+ case pType.A1E:
|
|
|
|
|
+ RValue = new byte[bytes.Length - 2];
|
|
|
Array.Copy(bytes, 2, RValue, 0, RValue.Length);
|
|
Array.Copy(bytes, 2, RValue, 0, RValue.Length);
|
|
|
break;
|
|
break;
|
|
|
- case DevType.QNA3E:
|
|
|
|
|
|
|
+ case pType.QNA3E:
|
|
|
if (isBit)
|
|
if (isBit)
|
|
|
{
|
|
{
|
|
|
len = (ushort)Math.Ceiling(len * 0.5);
|
|
len = (ushort)Math.Ceiling(len * 0.5);
|
|
@@ -617,17 +618,17 @@ namespace YSAI.Mitsubishi
|
|
|
//数据反转
|
|
//数据反转
|
|
|
Array.Reverse(data);
|
|
Array.Reverse(data);
|
|
|
//地址详情
|
|
//地址详情
|
|
|
- McAddressDetails details = null;
|
|
|
|
|
|
|
+ ADetails details = null;
|
|
|
//命令字节
|
|
//命令字节
|
|
|
byte[]? command = null;
|
|
byte[]? command = null;
|
|
|
//类型判断
|
|
//类型判断
|
|
|
- switch (basics.DType)
|
|
|
|
|
|
|
+ switch (basics.PType)
|
|
|
{
|
|
{
|
|
|
- case DevType.A1E:
|
|
|
|
|
|
|
+ case pType.A1E:
|
|
|
details = ParseA1E(address);
|
|
details = ParseA1E(address);
|
|
|
command = WriteCommand_A1E(details.BeginAddress, details.TypeCode, data, isBit);
|
|
command = WriteCommand_A1E(details.BeginAddress, details.TypeCode, data, isBit);
|
|
|
break;
|
|
break;
|
|
|
- case DevType.QNA3E:
|
|
|
|
|
|
|
+ case pType.QNA3E:
|
|
|
details = ParseQNA3E(address);
|
|
details = ParseQNA3E(address);
|
|
|
command = WriteCommand_QNA3E(details.BeginAddress, details.TypeCode, data, isBit);
|
|
command = WriteCommand_QNA3E(details.BeginAddress, details.TypeCode, data, isBit);
|
|
|
break;
|
|
break;
|
|
@@ -769,37 +770,35 @@ namespace YSAI.Mitsubishi
|
|
|
{
|
|
{
|
|
|
addressData.addressName = item.AddressName;
|
|
addressData.addressName = item.AddressName;
|
|
|
}
|
|
}
|
|
|
- ////如果是string 类型 (地址,长度)
|
|
|
|
|
- //if (item.AddressDataType == Core.@enum.DataType.String)
|
|
|
|
|
- //{
|
|
|
|
|
- // byte[] strByte = R(addressData.addressName, (ushort)addressData.count);
|
|
|
|
|
- // Value = BitConverter.ToString(strByte).ToString();
|
|
|
|
|
- //}
|
|
|
|
|
- //else
|
|
|
|
|
- //{
|
|
|
|
|
if (addressData.count.Equals(0))
|
|
if (addressData.count.Equals(0))
|
|
|
{
|
|
{
|
|
|
switch (item.AddressDataType)
|
|
switch (item.AddressDataType)
|
|
|
{
|
|
{
|
|
|
case Core.@enum.DataType.Short:
|
|
case Core.@enum.DataType.Short:
|
|
|
|
|
+ case Core.@enum.DataType.Int16:
|
|
|
Value = BitConverter.ToInt16(R(addressData.addressName, 2), 0).ToString();
|
|
Value = BitConverter.ToInt16(R(addressData.addressName, 2), 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Bool:
|
|
case Core.@enum.DataType.Bool:
|
|
|
Value = ((R(addressData.addressName, 1)[0] & 0b00010000) != 0).ToString();
|
|
Value = ((R(addressData.addressName, 1)[0] & 0b00010000) != 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Ushort:
|
|
case Core.@enum.DataType.Ushort:
|
|
|
|
|
+ case Core.@enum.DataType.UInt16:
|
|
|
Value = BitConverter.ToUInt16(R(addressData.addressName, 2), 0).ToString();
|
|
Value = BitConverter.ToUInt16(R(addressData.addressName, 2), 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Int:
|
|
case Core.@enum.DataType.Int:
|
|
|
|
|
+ case Core.@enum.DataType.Int32:
|
|
|
Value = BitConverter.ToInt32(R(addressData.addressName, 4), 0).ToString();
|
|
Value = BitConverter.ToInt32(R(addressData.addressName, 4), 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Uint:
|
|
case Core.@enum.DataType.Uint:
|
|
|
|
|
+ case Core.@enum.DataType.UInt32:
|
|
|
Value = BitConverter.ToUInt32(R(addressData.addressName, 4), 0).ToString();
|
|
Value = BitConverter.ToUInt32(R(addressData.addressName, 4), 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Long:
|
|
case Core.@enum.DataType.Long:
|
|
|
|
|
+ case Core.@enum.DataType.Int64:
|
|
|
Value = BitConverter.ToInt64(R(addressData.addressName, 8), 0).ToString();
|
|
Value = BitConverter.ToInt64(R(addressData.addressName, 8), 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Ulong:
|
|
case Core.@enum.DataType.Ulong:
|
|
|
|
|
+ case Core.@enum.DataType.UInt64:
|
|
|
Value = BitConverter.ToUInt64(R(addressData.addressName, 8), 0).ToString();
|
|
Value = BitConverter.ToUInt64(R(addressData.addressName, 8), 0).ToString();
|
|
|
break;
|
|
break;
|
|
|
case Core.@enum.DataType.Double:
|
|
case Core.@enum.DataType.Double:
|
|
@@ -869,7 +868,6 @@ namespace YSAI.Mitsubishi
|
|
|
Value = $"不支持{item.AddressDataType}类型批量读取";
|
|
Value = $"不支持{item.AddressDataType}类型批量读取";
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- //}
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
//数据处理
|
|
//数据处理
|
|
@@ -903,6 +901,15 @@ namespace YSAI.Mitsubishi
|
|
|
/// 实现订阅功能
|
|
/// 实现订阅功能
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
private SubscribeOperate subscribeOperate;
|
|
private SubscribeOperate subscribeOperate;
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 事件抛出
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="sender">自定义订阅对象</param>
|
|
|
|
|
+ /// <param name="e">返回的参数</param>
|
|
|
|
|
+ private void SubscribeOperate_OnEvent(object? sender, EventResult e)
|
|
|
|
|
+ {
|
|
|
|
|
+ OnEventHandler(this, e);
|
|
|
|
|
+ }
|
|
|
public OperateResult Subscribe(Address address)
|
|
public OperateResult Subscribe(Address address)
|
|
|
{
|
|
{
|
|
|
string SN = Depart("Subscribe");
|
|
string SN = Depart("Subscribe");
|
|
@@ -937,16 +944,6 @@ namespace YSAI.Mitsubishi
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
|
|
- /// 事件抛出
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- /// <param name="sender">自定义订阅对象</param>
|
|
|
|
|
- /// <param name="e">返回的参数</param>
|
|
|
|
|
- private void SubscribeOperate_OnEvent(object? sender, EventResult e)
|
|
|
|
|
- {
|
|
|
|
|
- OnEventHandler(this, e);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
public Task<OperateResult> SubscribeAsync(Address address)
|
|
public Task<OperateResult> SubscribeAsync(Address address)
|
|
|
{
|
|
{
|
|
|
return Task.Run(() => Subscribe(address));
|
|
return Task.Run(() => Subscribe(address));
|