/// <summary> /// 从三菱PLC中读取想要的数据,输入地址,按照字单位读取,返回读取结果 /// </summary> /// <param name="address">读取地址,格式为"M100","D100","W1A0"</param> /// <param name="length">读取的数据长度,字最大值960,位最大值7168</param> /// <returns>带成功标志的结果数据对象</returns> /// <remarks> /// 地址支持的列表参考 <seealso cref="MelsecMcNet"/> 的备注说明 /// </remarks> /// <example> /// 假设起始地址为D100,D100存储了温度,100.6℃值为1006,D101存储了压力,1.23Mpa值为123,D102,D103存储了产量计数,读取如下: /// <code lang="cs" source="HslCommunication_Net45.Test\Documentation\Samples\Profinet\melsecTest.cs" region="ReadExample2" title="Read示例" /> /// 以下是读取不同类型数据的示例 /// <code lang="cs" source="HslCommunication_Net45.Test\Documentation\Samples\Profinet\melsecTest.cs" region="ReadExample1" title="Read示例" /> /// </example> public override OperateResult <byte[]> Read(string address, ushort length) { // 分析地址 OperateResult <byte[]> coreResult = MelsecHelper.BuildReadMcCoreCommand(address, length, false, McAnalysisAddress); if (!coreResult.IsSuccess) { return(coreResult); } // 核心交互 var read = ReadFromCoreServer(PackMcCommand(coreResult.Content, this.NetworkNumber, this.NetworkStationNumber)); if (!read.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(read)); } // 错误代码验证 ushort errorCode = BitConverter.ToUInt16(read.Content, 9); if (errorCode != 0) { return(new OperateResult <byte[]>(errorCode, StringResources.Language.MelsecPleaseReferToManulDocument)); } // 数据解析,需要传入是否使用位的参数 return(ExtractActualData(SoftBasic.BytesArrayRemoveBegin(read.Content, 11), false)); }
/// <summary> /// 根据类型地址长度确认需要读取的指令头 /// </summary> /// <param name="address">起始地址</param> /// <param name="length">长度</param> /// <param name="isBit">指示是否按照位成批的读出</param> /// <param name="networkNumber">网络号</param> /// <param name="networkStationNumber">网络站号</param> /// <returns>带有成功标志的指令数据</returns> public static OperateResult <byte[]> BuildReadCommand(string address, ushort length, bool isBit, byte networkNumber = 0, byte networkStationNumber = 0) { OperateResult <byte[]> coreResult = MelsecHelper.BuildReadMcCoreCommand(address, length, isBit); if (!coreResult.IsSuccess) { return(coreResult); } return(OperateResult.CreateSuccessResult(PackMcCommand(coreResult.Content, networkNumber, networkStationNumber))); }
/// <summary> /// 从三菱PLC中批量读取位软元件,返回读取结果 /// </summary> /// <param name="address">起始地址</param> /// <param name="length">读取的长度</param> /// <returns>带成功标志的结果数据对象</returns> /// <remarks> /// 地址支持的列表参考 <seealso cref="MelsecMcNet"/> 的备注说明 /// </remarks> /// <example> /// <code lang="cs" source="HslCommunication_Net45.Test\Documentation\Samples\Profinet\melsecTest.cs" region="ReadBool" title="Bool类型示例" /> /// </example> public override OperateResult <bool[]> ReadBool(string address, ushort length) { // 分析地址 OperateResult <McAddressData> addressResult = McAnalysisAddress(address, length); if (!addressResult.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(addressResult)); } // 获取指令 byte[] coreResult = MelsecHelper.BuildReadMcCoreCommand(addressResult.Content, true); // 核心交互 var read = ReadFromCoreServer(PackMcCommand(coreResult, NetworkNumber, NetworkStationNumber)); if (!read.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(read)); } // 错误代码验证 ushort errorCode = BitConverter.ToUInt16(read.Content, 9); if (errorCode != 0) { return(new OperateResult <bool[]>(errorCode, StringResources.Language.MelsecPleaseReferToManulDocument)); } // 数据解析,需要传入是否使用位的参数 var extract = ExtractActualData(SoftBasic.BytesArrayRemoveBegin(read.Content, 11), true); if (!extract.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(extract)); } // 转化bool数组 return(OperateResult.CreateSuccessResult(extract.Content.Select(m => m == 0x01).Take(length).ToArray( ))); }