コード例 #1
0
        /// <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));
            }
        }
コード例 #2
0
        /// <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));
            }
        }
コード例 #3
0
 /// <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]
     });
 }
コード例 #4
0
        /// <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));
        }
コード例 #5
0
 /// <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);
 }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
 /// <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)
     });
 }
コード例 #10
0
        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));
        }
コード例 #11
0
        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());
        }
コード例 #12
0
        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));
        }
コード例 #13
0
        /// <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));
            }
        }
コード例 #14
0
 /// <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);
 }
コード例 #15
0
        /// <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());
        }
コード例 #16
0
 /// <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);
 }
コード例 #17
0
        /// <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);
        }
コード例 #18
0
        /// <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);
        }
コード例 #19
0
        /// <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));
            }
        }
コード例 #20
0
        /// <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);
        }
コード例 #21
0
        /// <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()));
        }
コード例 #22
0
ファイル: MelsecMcNet.cs プロジェクト: zd413/HslCommunication
        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));
        }
コード例 #23
0
 /// <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);
 }
コード例 #24
0
        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));
        }
コード例 #25
0
ファイル: MelsecMcNet.cs プロジェクト: zd413/HslCommunication
        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( ));
        }
コード例 #26
0
 /// <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));
 }
コード例 #27
0
 /// <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));
 }
コード例 #28
0
 /// <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 );
 }