#region copyright //------------------------------------------------------------------------------ // 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 // 此代码版权(除特别声明外的代码)归作者本人Diego所有 // 源代码使用协议遵循本仓库的开源协议及附加协议 // Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway // Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway // 使用文档:https://diego2098.gitee.io/thingsgateway-docs/ // QQ群:605534569 //------------------------------------------------------------------------------ #endregion using System.ComponentModel; using System.Text; using ThingsGateway.Foundation.Extension.String; namespace ThingsGateway.Foundation; /// /// 读写设备基类 /// public abstract class ReadWriteDevicesBase : DisposableObject, IReadWriteDevice { /// [Description("数据转换")] public DataFormat DataFormat { get => ThingsGatewayBitConverter.DataFormat; set => ThingsGatewayBitConverter.DataFormat = value; } /// public ILog Logger { get; protected set; } /// public IThingsGatewayBitConverter ThingsGatewayBitConverter { get; protected set; } = new ThingsGatewayBitConverter(EndianType.Big); /// [Description("读写超时")] public ushort TimeOut { get; set; } = 3000; /// public ushort RegisterByteLength { get; protected set; } = 1; /// public virtual int GetBitOffset(string address) { int bitIndex = 0; if (address?.IndexOf('.') > 0) { try { bitIndex = Convert.ToInt32(address?.SplitDot()?.Last()); } catch { return 0; } } return bitIndex; } /// public abstract Task> ReadAsync(string address, int length, CancellationToken token = default); /// public abstract Task> SendThenResponseAsync(byte[] data, WaitingOptions waitingOptions = null, CancellationToken token = default); /// public abstract OperResult SendThenResponse(byte[] data, WaitingOptions waitingOptions = null, CancellationToken token = default); /// public abstract Task WriteAsync(string address, byte[] value, CancellationToken token = default); /// public abstract Task WriteAsync(string address, bool[] value, CancellationToken token = default); /// public virtual Task WriteAsync(string address, bool value, CancellationToken token = default) { return WriteAsync(address, new bool[1] { value }, token); } /// public virtual Task WriteAsync(string address, short value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, byte value, CancellationToken token = default) { return WriteAsync(address, new byte[1] { value }, token); } /// public virtual Task WriteAsync(string address, ushort value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, int value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, uint value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, long value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, ulong value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, float value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, double value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); return WriteAsync(address, transformParameter.GetBytes(value), token); } /// public virtual Task WriteAsync(string address, string value, CancellationToken token = default) { IThingsGatewayBitConverter transformParameter = ByteTransformUtil.GetTransByAddress(ref address, ThingsGatewayBitConverter); byte[] data = transformParameter.GetBytes(value); return WriteAsync(address, data, token); } /// public virtual string GetAddressDescription() { StringBuilder stringBuilder = new(); stringBuilder.AppendLine("通用格式"); stringBuilder.AppendLine("4字节转换格式"); stringBuilder.AppendLine("DATA=ABCD;"); stringBuilder.AppendLine("举例:"); stringBuilder.AppendLine("DATA=ABCD; ,代表大端格式,其中ABCD=>Big-Endian;BADC=>;Big-Endian Byte Swap;CDAB=>Little-Endian Byte Swap;DCBA=>Little-Endian"); stringBuilder.AppendLine("字符串长度:"); stringBuilder.AppendLine("LEN=1;"); stringBuilder.AppendLine("BCD格式:"); stringBuilder.AppendLine("BCD=C8421;,其中有C8421;C5421;C2421;C3;Gray"); stringBuilder.AppendLine("字符格式:"); stringBuilder.AppendLine("TEXT=UTF8;,其中有UTF8;ASCII;Default;Unicode"); stringBuilder.AppendLine(""); return stringBuilder.ToString(); } }