/// <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> /// 往指定的地址里写入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> /// 从三菱地址,是否位读取进行创建读取Ascii格式的MC的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="isBit">是否进行了位读取操作</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildAsciiReadMcCoreCommand(McAddressData addressData, bool isBit) { return(new byte[20] { 48, 52, 48, 49, 48, 48, 48, (byte)(isBit ? 49 : 48), Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[0], Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[1], BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[0], BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[1], BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[2], BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[3], BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[4], BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[5], SoftBasic.BuildAsciiBytesFrom(addressData.Length)[0], SoftBasic.BuildAsciiBytesFrom(addressData.Length)[1], SoftBasic.BuildAsciiBytesFrom(addressData.Length)[2], SoftBasic.BuildAsciiBytesFrom(addressData.Length)[3] }); }
/// <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> /// 以位为单位,创建ASCII数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">原始的bool数组数据</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildAsciiWriteBitCoreCommand(McAddressData addressData, bool[] value) { if (value == null) { value = new bool[0]; } byte[] array = value.Select((bool m) => (byte)(m ? 49 : 48)).ToArray(); byte[] array2 = new byte[20 + array.Length]; array2[0] = 49; array2[1] = 52; array2[2] = 48; array2[3] = 49; array2[4] = 48; array2[5] = 48; array2[6] = 48; array2[7] = 49; array2[8] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[0]; array2[9] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[1]; array2[10] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[0]; array2[11] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[1]; array2[12] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[2]; array2[13] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[3]; array2[14] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[4]; array2[15] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[5]; array2[16] = SoftBasic.BuildAsciiBytesFrom((ushort)value.Length)[0]; array2[17] = SoftBasic.BuildAsciiBytesFrom((ushort)value.Length)[1]; array2[18] = SoftBasic.BuildAsciiBytesFrom((ushort)value.Length)[2]; array2[19] = SoftBasic.BuildAsciiBytesFrom((ushort)value.Length)[3]; array.CopyTo(array2, 20); return(array2); }
/// <summary> /// 以位为单位,创建ASCII数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">原始的bool数组数据</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildAsciiWriteBitCoreCommand(McAddressData addressData, bool[] value) { if (value == null) { value = new bool[0]; } byte[] buffer = value.Select(m => m ? (byte)0x31 : (byte)0x30).ToArray( ); byte[] command = new byte[20 + buffer.Length]; command[0] = 0x31; // 批量写入的命令 command[1] = 0x34; command[2] = 0x30; command[3] = 0x31; command[4] = 0x30; // 子命令 command[5] = 0x30; command[6] = 0x30; command[7] = 0x31; command[8] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[0]; // 软元件类型 command[9] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[1]; command[10] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[0]; // 起始地址的地位 command[11] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[1]; command[12] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[2]; command[13] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[3]; command[14] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[4]; command[15] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[5]; command[16] = MelsecHelper.BuildBytesFromData((ushort)(value.Length))[0]; // 软元件点数 command[17] = MelsecHelper.BuildBytesFromData((ushort)(value.Length))[1]; command[18] = MelsecHelper.BuildBytesFromData((ushort)(value.Length))[2]; command[19] = MelsecHelper.BuildBytesFromData((ushort)(value.Length))[3]; buffer.CopyTo(command, 20); return(command); }
/// <summary> /// 从三菱地址,是否位读取进行创建读取Ascii格式的MC的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="isBit">是否进行了位读取操作</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildAsciiReadMcCoreCommand(McAddressData addressData, bool isBit) { byte[] command = new byte[20]; command[0] = 0x30; // 批量读取数据命令 command[1] = 0x34; command[2] = 0x30; command[3] = 0x31; command[4] = 0x30; // 以点为单位还是字为单位成批读取 command[5] = 0x30; command[6] = 0x30; command[7] = isBit ? (byte)0x31 : (byte)0x30; command[8] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[0]; // 软元件类型 command[9] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[1]; command[10] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[0]; // 起始地址的地位 command[11] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[1]; command[12] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[2]; command[13] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[3]; command[14] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[4]; command[15] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[5]; command[16] = MelsecHelper.BuildBytesFromData(addressData.Length)[0]; // 软元件点数 command[17] = MelsecHelper.BuildBytesFromData(addressData.Length)[1]; command[18] = MelsecHelper.BuildBytesFromData(addressData.Length)[2]; command[19] = MelsecHelper.BuildBytesFromData(addressData.Length)[3]; return(command); }
/// <summary> /// 从三菱地址,是否位读取进行创建读取的MC的核心报文 /// </summary> /// <param name="isBit">是否进行了位读取操作</param> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildReadMcCoreCommand(McAddressData addressData, bool isBit) { byte[] command = new byte[10]; command[0] = 0x01; // 批量读取数据命令 command[1] = 0x04; command[2] = isBit ? (byte)0x01 : (byte)0x00; // 以点为单位还是字为单位成批读取 command[3] = 0x00; command[4] = BitConverter.GetBytes(addressData.AddressStart)[0]; // 起始地址的地位 command[5] = BitConverter.GetBytes(addressData.AddressStart)[1]; command[6] = BitConverter.GetBytes(addressData.AddressStart)[2]; command[7] = addressData.McDataType.DataCode; // 指明读取的数据 command[8] = (byte)(addressData.Length % 256); // 软元件的长度 command[9] = (byte)(addressData.Length / 256); return(command); }
/// <summary> /// 从三菱地址,是否位读取进行创建读取的MC的核心报文 /// </summary> /// <param name="isBit">是否进行了位读取操作</param> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildReadMcCoreCommand(McAddressData addressData, bool isBit) { return(new byte[10] { 1, 4, (byte)(isBit ? 1 : 0), 0, BitConverter.GetBytes(addressData.AddressStart)[0], BitConverter.GetBytes(addressData.AddressStart)[1], BitConverter.GetBytes(addressData.AddressStart)[2], addressData.McDataType.DataCode, (byte)((int)addressData.Length % 256), (byte)((int)addressData.Length / 256) }); }
private OperateResult <byte[]> ReadAddressData(McAddressData addressData) { byte[] mcCore = MelsecHelper.BuildAsciiReadMcCoreCommand(addressData, isBit: false); OperateResult <byte[]> operateResult = ReadFromCoreServer(PackMcCommand(mcCore, NetworkNumber, NetworkStationNumber)); if (!operateResult.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(operateResult)); } ushort num = Convert.ToUInt16(Encoding.ASCII.GetString(operateResult.Content, 18, 4), 16); if (num != 0) { return(new OperateResult <byte[]>(num, StringResources.Language.MelsecPleaseReferToManulDocument)); } return(ExtractActualData(operateResult.Content, isBit: false)); }
private OperateResult WriteAddressData(McAddressData addressData, byte[] value) { byte[] mcCore = MelsecHelper.BuildWriteWordCoreCommand(addressData, value); OperateResult <byte[]> operateResult = ReadFromCoreServer(PackMcCommand(mcCore, NetworkNumber, NetworkStationNumber)); if (!operateResult.IsSuccess) { return(operateResult); } ushort num = BitConverter.ToUInt16(operateResult.Content, 9); if (num != 0) { return(new OperateResult <byte[]>(num, StringResources.Language.MelsecPleaseReferToManulDocument)); } return(OperateResult.CreateSuccessResult()); }
private OperateResult <byte[]> ReadAddressData(McAddressData addressData) { byte[] mcCore = MelsecHelper.BuildReadMcCoreCommand(addressData, isBit: false); OperateResult <byte[]> operateResult = ReadFromCoreServer(PackMcCommand(mcCore, NetworkNumber, NetworkStationNumber)); if (!operateResult.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(operateResult)); } ushort num = BitConverter.ToUInt16(operateResult.Content, 9); if (num != 0) { return(new OperateResult <byte[]>(num, StringResources.Language.MelsecPleaseReferToManulDocument)); } return(ExtractActualData(SoftBasic.BytesArrayRemoveBegin(operateResult.Content, 11), isBit: false)); }
/// <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> /// 以字为单位,创建数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">实际的原始数据信息</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildWriteWordCoreCommand(McAddressData addressData, byte[] value) { if (value == null) { value = new byte[0]; } byte[] array = new byte[10 + value.Length]; array[0] = 1; array[1] = 20; array[2] = 0; array[3] = 0; array[4] = BitConverter.GetBytes(addressData.AddressStart)[0]; array[5] = BitConverter.GetBytes(addressData.AddressStart)[1]; array[6] = BitConverter.GetBytes(addressData.AddressStart)[2]; array[7] = addressData.McDataType.DataCode; array[8] = (byte)(value.Length / 2 % 256); array[9] = (byte)(value.Length / 2 / 256); value.CopyTo(array, 10); return(array); }
/// <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="addressData">三菱Mc协议的数据地址</param> /// <param name="value">原始的bool数组数据</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildWriteBitCoreCommand(McAddressData addressData, bool[] value) { if (value == null) { value = new bool[0]; } byte[] array = TransBoolArrayToByteData(value); byte[] array2 = new byte[10 + array.Length]; array2[0] = 1; array2[1] = 20; array2[2] = 1; array2[3] = 0; array2[4] = BitConverter.GetBytes(addressData.AddressStart)[0]; array2[5] = BitConverter.GetBytes(addressData.AddressStart)[1]; array2[6] = BitConverter.GetBytes(addressData.AddressStart)[2]; array2[7] = addressData.McDataType.DataCode; array2[8] = (byte)(value.Length % 256); array2[9] = (byte)(value.Length / 256); array.CopyTo(array2, 10); return(array2); }
/// <summary> /// 以字为单位,创建数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">实际的原始数据信息</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildWriteWordCoreCommand(McAddressData addressData, byte[] value) { if (value == null) { value = new byte[0]; } byte[] command = new byte[10 + value.Length]; command[0] = 0x01; // 批量写入数据命令 command[1] = 0x14; command[2] = 0x00; // 以字为单位成批读取 command[3] = 0x00; command[4] = BitConverter.GetBytes(addressData.AddressStart)[0]; // 起始地址的地位 command[5] = BitConverter.GetBytes(addressData.AddressStart)[1]; command[6] = BitConverter.GetBytes(addressData.AddressStart)[2]; command[7] = addressData.McDataType.DataCode; // 指明写入的数据 command[8] = (byte)(value.Length / 2 % 256); // 软元件长度的地位 command[9] = (byte)(value.Length / 2 / 256); value.CopyTo(command, 10); return(command); }
/// <summary> /// 以位为单位,创建数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">原始的bool数组数据</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildWriteBitCoreCommand(McAddressData addressData, bool[] value) { if (value == null) { value = new bool[0]; } byte[] buffer = MelsecHelper.TransBoolArrayToByteData(value); byte[] command = new byte[10 + buffer.Length]; command[0] = 0x01; // 批量写入数据命令 command[1] = 0x14; command[2] = 0x01; // 以位为单位成批写入 command[3] = 0x00; command[4] = BitConverter.GetBytes(addressData.AddressStart)[0]; // 起始地址的地位 command[5] = BitConverter.GetBytes(addressData.AddressStart)[1]; command[6] = BitConverter.GetBytes(addressData.AddressStart)[2]; command[7] = addressData.McDataType.DataCode; // 指明写入的数据 command[8] = (byte)(value.Length % 256); // 软元件长度的地位 command[9] = (byte)(value.Length / 256); buffer.CopyTo(command, 10); return(command); }
/// <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> /// 以字为单位,创建ASCII数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">实际的原始数据信息</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildAsciiWriteWordCoreCommand(McAddressData addressData, byte[] value) { if (value == null) { value = new byte[0]; } byte[] buffer = new byte[value.Length * 2]; for (int i = 0; i < value.Length / 2; i++) { MelsecHelper.BuildBytesFromData(BitConverter.ToUInt16(value, i * 2)).CopyTo(buffer, 4 * i); } value = buffer; byte[] command = new byte[20 + value.Length]; command[0] = 0x31; // 批量写入的命令 command[1] = 0x34; command[2] = 0x30; command[3] = 0x31; command[4] = 0x30; // 子命令 command[5] = 0x30; command[6] = 0x30; command[7] = 0x30; command[8] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[0]; // 软元件类型 command[9] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[1]; command[10] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[0]; // 起始地址的地位 command[11] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[1]; command[12] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[2]; command[13] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[3]; command[14] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[4]; command[15] = MelsecHelper.BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[5]; command[16] = MelsecHelper.BuildBytesFromData((ushort)(value.Length / 4))[0]; // 软元件点数 command[17] = MelsecHelper.BuildBytesFromData((ushort)(value.Length / 4))[1]; command[18] = MelsecHelper.BuildBytesFromData((ushort)(value.Length / 4))[2]; command[19] = MelsecHelper.BuildBytesFromData((ushort)(value.Length / 4))[3]; value.CopyTo(command, 20); return(command); }
/// <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())); }
private OperateResult <byte[]> ReadAddressData(McAddressData addressData) { byte[] coreResult = MelsecHelper.BuildReadMcCoreCommand(addressData, false); // 核心交互 var read = ReadFromCoreServer(PackMcCommand(coreResult, 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> /// 以字为单位,创建ASCII数据写入的核心报文 /// </summary> /// <param name="addressData">三菱Mc协议的数据地址</param> /// <param name="value">实际的原始数据信息</param> /// <returns>带有成功标识的报文对象</returns> public static byte[] BuildAsciiWriteWordCoreCommand(McAddressData addressData, byte[] value) { if (value == null) { value = new byte[0]; } byte[] array = new byte[value.Length * 2]; for (int i = 0; i < value.Length / 2; i++) { SoftBasic.BuildAsciiBytesFrom(BitConverter.ToUInt16(value, i * 2)).CopyTo(array, 4 * i); } value = array; byte[] array2 = new byte[20 + value.Length]; array2[0] = 49; array2[1] = 52; array2[2] = 48; array2[3] = 49; array2[4] = 48; array2[5] = 48; array2[6] = 48; array2[7] = 48; array2[8] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[0]; array2[9] = Encoding.ASCII.GetBytes(addressData.McDataType.AsciiCode)[1]; array2[10] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[0]; array2[11] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[1]; array2[12] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[2]; array2[13] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[3]; array2[14] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[4]; array2[15] = BuildBytesFromAddress(addressData.AddressStart, addressData.McDataType)[5]; array2[16] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[0]; array2[17] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[1]; array2[18] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[2]; array2[19] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[3]; value.CopyTo(array2, 20); return(array2); }
private OperateResult <byte[]> ReadAddressData(McAddressData addressData) { // 地址分析 byte[] coreResult = MelsecHelper.BuildAsciiReadMcCoreCommand(addressData, false); // 核心交互 var read = ReadFromCoreServer(PackMcCommand(coreResult, NetworkNumber, NetworkStationNumber)); if (!read.IsSuccess) { return(OperateResult.CreateFailedResult <byte[]>(read)); } // 错误代码验证 ushort errorCode = Convert.ToUInt16(Encoding.ASCII.GetString(read.Content, 18, 4), 16); if (errorCode != 0) { return(new OperateResult <byte[]>(errorCode, StringResources.Language.MelsecPleaseReferToManulDocument)); } // 数据解析,需要传入是否使用位的参数 return(ExtractActualData(read.Content, false)); }
private OperateResult WriteAddressData(McAddressData addressData, byte[] value) { // 创建核心报文 byte[] coreResult = MelsecHelper.BuildWriteWordCoreCommand(addressData, value); // 核心交互 OperateResult <byte[]> read = ReadFromCoreServer(PackMcCommand(coreResult, NetworkNumber, NetworkStationNumber)); if (!read.IsSuccess) { return(read); } // 错误码校验 ushort ErrorCode = BitConverter.ToUInt16(read.Content, 9); if (ErrorCode != 0) { return(new OperateResult <byte[]>(ErrorCode, StringResources.Language.MelsecPleaseReferToManulDocument)); } // 成功 return(OperateResult.CreateSuccessResult( )); }
/// <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)); }
/// <summary> /// 分析地址的方法,允许派生类里进行重写操作 /// </summary> /// <param name="address">地址信息</param> /// <param name="length">数据长度</param> /// <returns>解析后的数据信息</returns> protected override OperateResult <McAddressData> McAnalysisAddress(string address, ushort length) { return(McAddressData.ParsePanasonicFrom(address, length)); }
/// <summary> /// 分析地址的方法,允许派生类里进行重写操作 /// </summary> /// <param name="address">地址信息</param> /// <param name="length">数据长度</param> /// <returns>解析后的数据信息</returns> protected override OperateResult<McAddressData> McAnalysisAddress( string address, ushort length ) { return McAddressData.ParseKeyenceFrom( address, length ); }