/// <summary> /// 往指定的地址里写入bool数组对象 /// </summary> /// <param name="address">三菱的地址信息</param> /// <param name="value">值</param> /// <returns>是否成功的结果</returns> public OperateResult Write(string address, bool[] value) { // 分析地址 OperateResult <McAddressData> analysis = McAddressData.ParseMelsecFrom(address, 0); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(analysis)); } if (analysis.Content.McDataType.DataType == 0) { return(new OperateResult <bool[]>(StringResources.Language.MelsecCurrentTypeNotSupportedWordOperate)); } if (analysis.Content.McDataType.DataCode == MelsecMcDataType.M.DataCode) { mBuffer.SetBytes(value.Select(m => m ? (byte)1 : (byte)0).ToArray( ), analysis.Content.AddressStart); return(OperateResult.CreateSuccessResult( )); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.X.DataCode) { xBuffer.SetBytes(value.Select(m => m ? (byte)1 : (byte)0).ToArray( ), analysis.Content.AddressStart); return(OperateResult.CreateSuccessResult( )); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.Y.DataCode) { yBuffer.SetBytes(value.Select(m => m ? (byte)1 : (byte)0).ToArray( ), analysis.Content.AddressStart); return(OperateResult.CreateSuccessResult( )); } else { return(new OperateResult <bool[]>(StringResources.Language.NotSupportedDataType)); } }
/// <summary> /// 读取指定地址的bool数据对象 /// </summary> /// <param name="address">三菱的地址信息</param> /// <param name="length">数组的长度</param> /// <returns>带有成功标志的结果对象</returns> public OperateResult <bool[]> ReadBool(string address, ushort length) { // 分析地址 OperateResult <McAddressData> analysis = McAddressData.ParseMelsecFrom(address, 0); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(analysis)); } if (analysis.Content.McDataType.DataType == 0) { return(new OperateResult <bool[]>(StringResources.Language.MelsecCurrentTypeNotSupportedWordOperate)); } if (analysis.Content.McDataType.DataCode == MelsecMcDataType.M.DataCode) { return(OperateResult.CreateSuccessResult(mBuffer.GetBytes(analysis.Content.AddressStart, length).Select(m => m != 0x00).ToArray( ))); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.X.DataCode) { return(OperateResult.CreateSuccessResult(xBuffer.GetBytes(analysis.Content.AddressStart, length).Select(m => m != 0x00).ToArray( ))); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.Y.DataCode) { return(OperateResult.CreateSuccessResult(yBuffer.GetBytes(analysis.Content.AddressStart, length).Select(m => m != 0x00).ToArray( ))); } else { return(new OperateResult <bool[]>(StringResources.Language.NotSupportedDataType)); } }
/// <summary> /// 批量读取PLC的数据,以字为单位,支持读取X,Y,M,S,D,T,C,具体的地址范围需要根据PLC型号来确认 /// </summary> /// <param name="address">地址信息</param> /// <param name="length">数据长度</param> /// <param name="readCore">通信的载体信息</param> /// <returns>读取结果信息</returns> public static OperateResult <byte[]> ReadHelper(string address, ushort length, Func <byte[], OperateResult <byte[]> > readCore) { OperateResult <McAddressData> operateResult = McAddressData.ParseMelsecFrom(address, length); if (!operateResult.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(operateResult)); } byte[] arg = MelsecHelper.BuildAsciiReadMcCoreCommand(operateResult.Content, isBit: false); OperateResult <byte[]> operateResult2 = readCore(arg); if (!operateResult2.IsSuccess) { return(operateResult2); } if (operateResult2.Content[0] != 2) { return(new OperateResult <byte[]>(operateResult2.Content[0], "Read Faild:" + Encoding.ASCII.GetString(operateResult2.Content, 1, operateResult2.Content.Length - 1))); } byte[] array = new byte[length * 2]; for (int i = 0; i < array.Length / 2; i++) { ushort value = Convert.ToUInt16(Encoding.ASCII.GetString(operateResult2.Content, i * 4 + 11, 4), 16); BitConverter.GetBytes(value).CopyTo(array, i * 2); } return(OperateResult.CreateSuccessResult(array)); }
/// <summary> /// 写入自定义的数据到数据内存中去 /// </summary> /// <param name="address">地址</param> /// <param name="value">数据值</param> /// <returns>是否写入成功的结果对象</returns> public override OperateResult Write(string address, byte[] value) { // 分析地址 OperateResult <McAddressData> analysis = McAddressData.ParseMelsecFrom(address, 0); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(analysis)); } if (analysis.Content.McDataType.DataCode == MelsecMcDataType.M.DataCode) { byte[] buffer = SoftBasic.ByteToBoolArray(value).Select(m => m ? (byte)1 : (byte)0).ToArray( ); mBuffer.SetBytes(buffer, analysis.Content.AddressStart); return(OperateResult.CreateSuccessResult( )); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.X.DataCode) { byte[] buffer = SoftBasic.ByteToBoolArray(value).Select(m => m ? (byte)1 : (byte)0).ToArray( ); xBuffer.SetBytes(buffer, analysis.Content.AddressStart); return(OperateResult.CreateSuccessResult( )); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.Y.DataCode) { byte[] buffer = SoftBasic.ByteToBoolArray(value).Select(m => m ? (byte)1 : (byte)0).ToArray( ); yBuffer.SetBytes(buffer, analysis.Content.AddressStart); return(OperateResult.CreateSuccessResult( )); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.D.DataCode) { dBuffer.SetBytes(value, analysis.Content.AddressStart * 2); return(OperateResult.CreateSuccessResult( )); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.W.DataCode) { wBuffer.SetBytes(value, analysis.Content.AddressStart * 2); return(OperateResult.CreateSuccessResult( )); } else { return(new OperateResult <byte[]>(StringResources.Language.NotSupportedDataType)); } }
/// <summary> /// 批量写入bool类型的数组,支持的类型为X,Y,S,T,C,具体的地址范围取决于PLC的类型 /// </summary> /// <param name="address">PLC的地址信息</param> /// <param name="value">数据信息</param> /// <param name="readCore">通信的载体信息</param> /// <returns>是否写入成功</returns> public static OperateResult WriteHelper(string address, bool[] value, Func <byte[], OperateResult <byte[]> > readCore) { OperateResult <McAddressData> operateResult = McAddressData.ParseMelsecFrom(address, 0); if (!operateResult.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(operateResult)); } byte[] arg = MelsecHelper.BuildAsciiWriteBitCoreCommand(operateResult.Content, value); OperateResult <byte[]> operateResult2 = readCore(arg); if (!operateResult2.IsSuccess) { return(operateResult2); } if (operateResult2.Content[0] != 6) { return(new OperateResult(operateResult2.Content[0], "Write Faild:" + Encoding.ASCII.GetString(operateResult2.Content, 1, operateResult2.Content.Length - 1))); } return(OperateResult.CreateSuccessResult()); }
/// <summary> /// 读取自定义的寄存器的值。按照字为单位 /// </summary> /// <param name="address">起始地址,示例:"D100","M100"</param> /// <param name="length">数据长度</param> /// <exception cref="IndexOutOfRangeException"></exception> /// <returns>byte数组值</returns> public override OperateResult <byte[]> Read(string address, ushort length) { // 分析地址 OperateResult <McAddressData> analysis = McAddressData.ParseMelsecFrom(address, length); if (!analysis.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(analysis)); } if (analysis.Content.McDataType.DataCode == MelsecMcDataType.M.DataCode) { bool[] buffer = mBuffer.GetBytes(analysis.Content.AddressStart, length * 16).Select(m => m != 0x00).ToArray( ); return(OperateResult.CreateSuccessResult(SoftBasic.BoolArrayToByte(buffer))); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.X.DataCode) { bool[] buffer = xBuffer.GetBytes(analysis.Content.AddressStart, length * 16).Select(m => m != 0x00).ToArray( ); return(OperateResult.CreateSuccessResult(SoftBasic.BoolArrayToByte(buffer))); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.Y.DataCode) { bool[] buffer = yBuffer.GetBytes(analysis.Content.AddressStart, length * 16).Select(m => m != 0x00).ToArray( ); return(OperateResult.CreateSuccessResult(SoftBasic.BoolArrayToByte(buffer))); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.D.DataCode) { return(OperateResult.CreateSuccessResult(dBuffer.GetBytes(analysis.Content.AddressStart * 2, length * 2))); } else if (analysis.Content.McDataType.DataCode == MelsecMcDataType.W.DataCode) { return(OperateResult.CreateSuccessResult(wBuffer.GetBytes(analysis.Content.AddressStart * 2, length * 2))); } else { return(new OperateResult <byte[]>(StringResources.Language.NotSupportedDataType)); } }
/// <summary> /// 批量读取bool类型数据,支持的类型为X,Y,S,T,C,具体的地址范围取决于PLC的类型 /// </summary> /// <param name="address">地址信息,比如X10,Y17,注意X,Y的地址是8进制的</param> /// <param name="length">读取的长度</param> /// <param name="readCore">通信的载体信息</param> /// <returns>读取结果信息</returns> public static OperateResult <bool[]> ReadBoolHelper(string address, ushort length, Func <byte[], OperateResult <byte[]> > readCore) { OperateResult <McAddressData> operateResult = McAddressData.ParseMelsecFrom(address, length); if (!operateResult.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(operateResult)); } byte[] arg = MelsecHelper.BuildAsciiReadMcCoreCommand(operateResult.Content, isBit: true); OperateResult <byte[]> operateResult2 = readCore(arg); if (!operateResult2.IsSuccess) { return(OperateResult.CreateFailedResult <bool[]>(operateResult2)); } if (operateResult2.Content[0] != 2) { return(new OperateResult <bool[]>(operateResult2.Content[0], "Read Faild:" + Encoding.ASCII.GetString(operateResult2.Content, 1, operateResult2.Content.Length - 1))); } byte[] array = new byte[length]; Array.Copy(operateResult2.Content, 11, array, 0, length); return(OperateResult.CreateSuccessResult(array.Select((byte m) => m == 49).ToArray())); }
/// <summary> /// 分析地址的方法,允许派生类里进行重写操作 /// </summary> /// <param name="address">地址信息</param> /// <param name="length">数据长度</param> /// <returns>解析后的数据信息</returns> protected virtual OperateResult <McAddressData> McAnalysisAddress(string address, ushort length) { return(McAddressData.ParseMelsecFrom(address, length)); }