package com.zy.common.HslCommunication.Core.Net.NetworkBase; import com.zy.common.HslCommunication.BasicFramework.SoftBasic; import com.zy.common.HslCommunication.Core.IMessage.INetMessage; import com.zy.common.HslCommunication.Core.Net.IReadWriteNet; import com.zy.common.HslCommunication.Core.Transfer.IByteTransform; import com.zy.common.HslCommunication.Core.Types.IDataTransfer; import com.zy.common.HslCommunication.Core.Types.OperateResult; import com.zy.common.HslCommunication.Core.Types.OperateResultExOne; import com.zy.common.HslCommunication.Utilities; /** * 设备类的基类,提供了基础的字节读写方法,采用泛型继承实现 * @param 消息类型 * @param 变换类型 */ public class NetworkDeviceBase extends NetworkDoubleBase implements IReadWriteNet { /************************************************************************************************** * * 说明:子类中需要重写基础的读取和写入方法,来支持不同的数据访问规则 * * 此处没有将读写位纳入进来,因为各种设备的支持不尽相同,比较麻烦 * **************************************************************************************************/ protected short WordLength = 1; /** * 从设备读取原始数据 * @param address 地址信息 * @param length 数据长度 * @return 带有成功标识的结果对象 */ public OperateResultExOne Read(String address, short length) { return new OperateResultExOne(); } /** * 将原始数据写入设备 * @param address 起始地址 * @param value 原始数据 * @return 带有成功标识的结果对象 */ public OperateResult Write(String address, byte[] value) { return new OperateResult(); } /** * 读取自定义类型的数据,需要规定解析规则 * @param address 起始地址 * @param tClass 类 * @param 类型名称 * @return 带有成功标识的结果对象 */ public OperateResultExOne ReadCustomer(String address ,Class tClass) { OperateResultExOne result = new OperateResultExOne(); T Content; try { Content = tClass.newInstance(); } catch (Exception ex){ Content = null; } OperateResultExOne read = Read(address, Content.getReadCount()); if (read.IsSuccess) { Content.ParseSource(read.Content); result.Content = Content; result.IsSuccess = true; } else { result.ErrorCode = read.ErrorCode; result.Message = read.Message; } return result; } /** * 写入自定义类型的数据到设备去,需要规定生成字节的方法 * @param address 起始地址 * @param data 实例对象 * @param 自定义类型 * @return 带有成功标识的结果对象 */ public OperateResult WriteCustomer(String address, T data ) { return Write(address, data.ToSource()); } /** * 读取设备的short类型的数据 * @param address 起始地址 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadInt16(String address) { return GetInt16ResultFromBytes(Read(address, WordLength)); } /** * 读取设备的short类型的数组 * @param address 起始地址 * @param length 读取的数组长度 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadInt16(String address, short length) { OperateResultExOne read = Read(address, (short) (length * WordLength)); if (!read.IsSuccess) { OperateResultExOne result = new OperateResultExOne(); result.CopyErrorFromOther(read); return result; } return OperateResultExOne.CreateSuccessResult(super.getByteTransform().TransInt16(read.Content, 0, length)); } /** * 读取设备的int类型的数据 * @param address 起始地址 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadInt32(String address) { return GetInt32ResultFromBytes(Read(address, (short) (2 * WordLength))); } /** * 读取设备的int类型的数组 * @param address 起始地址 * @param length 数组长度 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadInt32(String address, short length) { OperateResultExOne read = Read(address, (short) (length * WordLength * 2)); if (!read.IsSuccess) { OperateResultExOne result = new OperateResultExOne(); result.CopyErrorFromOther(read); return result; } return OperateResultExOne.CreateSuccessResult(super.getByteTransform().TransInt32(read.Content, 0, length)); } /** * 读取设备的float类型的数据 * @param address 起始地址 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadFloat(String address) { return GetSingleResultFromBytes(Read(address, (short) (2 * WordLength))); } /** * 读取设备的float类型的数组 * @param address 起始地址 * @param length 数组长度 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadFloat(String address, short length) { OperateResultExOne read = Read(address, (short) (length * WordLength * 2)); if (!read.IsSuccess) { OperateResultExOne result = new OperateResultExOne(); result.CopyErrorFromOther(read); return result; } return OperateResultExOne.CreateSuccessResult(super.getByteTransform().TransSingle(read.Content, 0, length)); } /** * 读取设备的long类型的数据 * @param address 起始地址 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadInt64(String address) { return GetInt64ResultFromBytes(Read(address, (short) (4 * WordLength))); } /** * 读取设备的long类型的数组 * @param address 起始地址 * @param length 数组长度 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadInt64(String address, short length) { OperateResultExOne read = Read(address, (short) (length * WordLength * 4)); if (!read.IsSuccess) { OperateResultExOne result = new OperateResultExOne(); result.CopyErrorFromOther(read); return result; } return OperateResultExOne.CreateSuccessResult(super.getByteTransform().TransInt64(read.Content, 0, length)); } /** * 读取设备的double类型的数据 * @param address 起始地址 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadDouble(String address) { return GetDoubleResultFromBytes(Read(address, (short) (4 * WordLength))); } /** * 读取设备的double类型的数组 * @param address 起始地址 * @param length 数组长度 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadDouble(String address, short length) { OperateResultExOne read = Read(address, (short) (length * WordLength * 4)); if (!read.IsSuccess) { OperateResultExOne result = new OperateResultExOne(); result.CopyErrorFromOther(read); return result; } return OperateResultExOne.CreateSuccessResult(super.getByteTransform().TransDouble(read.Content, 0, length)); } /** * 读取设备的字符串数据,编码为ASCII * @param address 起始地址 * @param length 数据长度 * @return 带成功标志的结果数据对象 */ public OperateResultExOne ReadString(String address, short length) { return GetStringResultFromBytes(Read(address, length)); } /** * 向设备中写入short数组,返回是否写入成功 * @param address 起始地址 * @param values 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, short[] values) { return Write(address, super.getByteTransform().TransByte(values)); } /** * 向设备中写入short数据,返回是否写入成功 * @param address 起始地址 * @param value 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, short value) { return Write(address, new short[]{value}); } /** * 向设备中写入int数组,返回是否写入成功 * @param address 起始地址 * @param values 写入值 * @return 返回写入结果 */ /// 返回写入结果 public OperateResult Write(String address, int[] values) { return Write(address, super.getByteTransform().TransByte(values)); } /** * 向设备中写入int数据,返回是否写入成功 * @param address 起始地址 * @param value 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, int value) { return Write(address, new int[]{value}); } /** * 向设备中写入float数组,返回是否写入成功 * @param address 起始地址 * @param values 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, float[] values) { return Write(address, super.getByteTransform().TransByte(values)); } /** * 向设备中写入float数据,返回是否写入成功 * @param address 起始地址 * @param value 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, float value) { return Write(address, new float[]{value}); } /** * 向设备中写入long数组,返回是否写入成功 * @param address 起始地址 * @param values 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, long[] values) { return Write(address, getByteTransform().TransByte(values)); } /** * 向设备中写入long数据,返回是否写入成功 * @param address 起始地址 * @param value 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, long value) { return Write(address, new long[]{value}); } /** * 设备中写入double数组,返回是否写入成功 * @param address 起始地址 * @param values 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, double[] values) { return Write(address, getByteTransform().TransByte(values)); } /** * 向设备中写入double数据,返回是否写入成功 * @param address 起始地址 * @param value 写入值 * @return 返回写入结果 */ public OperateResult Write(String address, double value) { return Write(address, new double[]{value}); } /** * 向设备中写入字符串,编码格式为ASCII * @param address 起始地址 * @param value 写入值 * @return 返回读取结果 */ public OperateResult Write(String address, String value) { byte[] temp = getByteTransform().TransByte(value, "US-ASCII"); if (WordLength == 1) temp = SoftBasic.ArrayExpandToLengthEven(temp); return Write(address, temp); } /** * 向设备中写入字符串,编码格式为ASCII * @param address 起始地址 * @param value 写入值 * @param length 写入的字符串的长度 * @return 返回读取结果 */ public OperateResult Write(String address, String value, int length) { byte[] temp = getByteTransform().TransByte(value, "US-ASCII"); temp = SoftBasic.ArrayExpandToLength(temp, length); if (WordLength == 1) temp = SoftBasic.ArrayExpandToLengthEven(temp); return Write(address, temp); } /** * 向设备中写入字符串,编码格式为Unicode * @param address 要写入的数据地址 * @param value 要写入的实际数据 * @return 写入结果 */ public OperateResult WriteUnicodeString(String address, String value) { byte[] temp = Utilities.string2Byte(value); return Write(address, temp); } /** * 向设备中写入字符串,超出截断,不够补0,编码格式为Unicode * @param address 要写入的数据地址 * @param value 要写入的实际数据 * @param length 指定的字符串长度,必须大于0 * @return 写入结果 */ public OperateResult WriteUnicodeString(String address, String value, int length) { byte[] temp = Utilities.string2Byte(value); temp = SoftBasic.ArrayExpandToLength(temp, length * 2); return Write(address, temp); } /** * 返回表示当前对象的字符串 * @return 字符串数据 */ @Override public String toString() { return "NetworkDeviceBase"; } }