Exemplo n.º 1
0
 /// <summary>
 /// 将MC协议的核心报文打包成一个可以直接对PLC进行发送的原始报文
 /// </summary>
 /// <param name="mcCore">MC协议的核心报文</param>
 /// <param name="networkNumber">网络号</param>
 /// <param name="networkStationNumber">网络站号</param>
 /// <returns>原始报文信息</returns>
 public static byte[] PackMcCommand(byte[] mcCore, byte networkNumber = 0, byte networkStationNumber = 0)
 {
     byte[] array = new byte[22 + mcCore.Length];
     array[0]  = 53;
     array[1]  = 48;
     array[2]  = 48;
     array[3]  = 48;
     array[4]  = SoftBasic.BuildAsciiBytesFrom(networkNumber)[0];
     array[5]  = SoftBasic.BuildAsciiBytesFrom(networkNumber)[1];
     array[6]  = 70;
     array[7]  = 70;
     array[8]  = 48;
     array[9]  = 51;
     array[10] = 70;
     array[11] = 70;
     array[12] = SoftBasic.BuildAsciiBytesFrom(networkStationNumber)[0];
     array[13] = SoftBasic.BuildAsciiBytesFrom(networkStationNumber)[1];
     array[14] = SoftBasic.BuildAsciiBytesFrom((ushort)(array.Length - 18))[0];
     array[15] = SoftBasic.BuildAsciiBytesFrom((ushort)(array.Length - 18))[1];
     array[16] = SoftBasic.BuildAsciiBytesFrom((ushort)(array.Length - 18))[2];
     array[17] = SoftBasic.BuildAsciiBytesFrom((ushort)(array.Length - 18))[3];
     array[18] = 48;
     array[19] = 48;
     array[20] = 49;
     array[21] = 48;
     mcCore.CopyTo(array, 22);
     return(array);
 }
 /// <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]
     });
 }
Exemplo n.º 3
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] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length))[0];                // 软元件点数
            command[17] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length))[1];
            command[18] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length))[2];
            command[19] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length))[3];
            buffer.CopyTo(command, 20);

            return(command);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 创建一条别入byte数据的指令信息,需要指定一些参数,按照字单位
        /// </summary>
        /// <param name="station">站号</param>
        /// <param name="address">地址</param>
        /// <param name="value">数组值</param>
        /// <param name="sumCheck">是否和校验</param>
        /// <param name="waitTime">等待时间</param>
        /// <returns>是否创建成功</returns>
        public static OperateResult <byte[]> BuildWriteByteCommand(byte station, string address, byte[] value, bool sumCheck = true, byte waitTime = 0)
        {
            OperateResult <string> operateResult = FxAnalysisAddress(address);

            if (!operateResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(operateResult));
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append(station.ToString("D2"));
            stringBuilder.Append("FF");
            stringBuilder.Append("WW");
            stringBuilder.Append(waitTime.ToString("X"));
            stringBuilder.Append(operateResult.Content);
            stringBuilder.Append((value.Length / 2).ToString("D2"));
            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);
            }
            stringBuilder.Append(Encoding.ASCII.GetString(array));
            byte[] array2 = null;
            array2 = SoftBasic.SpliceTwoByteArray(bytes2: (!sumCheck) ? Encoding.ASCII.GetBytes(stringBuilder.ToString()) : Encoding.ASCII.GetBytes(CalculateAcc(stringBuilder.ToString())), bytes1: new byte[1]
            {
                5
            });
            return(OperateResult.CreateSuccessResult(array2));
        }
Exemplo n.º 5
0
        /// <summary>
        /// 根据类型地址以及需要写入的数据来生成指令头
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="value">实际的数据信息</param>
        /// <returns>带有成功标志的指令数据</returns>
        public static OperateResult <byte[]> BuildWriteWordCommand(string address, byte[] value)
        {
            var addressResult = FxCalculateWordStartAddress(address);

            if (!addressResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(addressResult));
            }

            // 字节数据转换成ASCII格式
            if (value != null)
            {
                value = SoftBasic.BuildAsciiBytesFrom(value);
            }

            ushort startAddress = addressResult.Content;

            byte[] _PLCCommand = new byte[11 + value.Length];
            _PLCCommand[0] = 0x02;                                                                  // STX
            _PLCCommand[1] = 0x31;                                                                  // Read
            _PLCCommand[2] = SoftBasic.BuildAsciiBytesFrom(startAddress)[0];                        // Offect Address
            _PLCCommand[3] = SoftBasic.BuildAsciiBytesFrom(startAddress)[1];
            _PLCCommand[4] = SoftBasic.BuildAsciiBytesFrom(startAddress)[2];
            _PLCCommand[5] = SoftBasic.BuildAsciiBytesFrom(startAddress)[3];
            _PLCCommand[6] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[0];            // Read Length
            _PLCCommand[7] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[1];
            Array.Copy(value, 0, _PLCCommand, 8, value.Length);
            _PLCCommand[_PLCCommand.Length - 3] = 0x03;                                               // ETX
            MelsecHelper.FxCalculateCRC(_PLCCommand).CopyTo(_PLCCommand, _PLCCommand.Length - 2);     // CRC

            return(OperateResult.CreateSuccessResult(_PLCCommand));
        }
Exemplo n.º 6
0
        /// <summary>
        /// 将MC协议的核心报文打包成一个可以直接对PLC进行发送的原始报文
        /// </summary>
        /// <param name="mcCore">MC协议的核心报文</param>
        /// <param name="networkNumber">网络号</param>
        /// <param name="networkStationNumber">网络站号</param>
        /// <returns>原始报文信息</returns>
        public static byte[] PackMcCommand(byte[] mcCore, byte networkNumber = 0, byte networkStationNumber = 0)
        {
            byte[] plcCommand = new byte[22 + mcCore.Length];
            plcCommand[0]  = 0x35;                                                                        // 副标题
            plcCommand[1]  = 0x30;
            plcCommand[2]  = 0x30;
            plcCommand[3]  = 0x30;
            plcCommand[4]  = SoftBasic.BuildAsciiBytesFrom(networkNumber)[0];                           // 网络号
            plcCommand[5]  = SoftBasic.BuildAsciiBytesFrom(networkNumber)[1];
            plcCommand[6]  = 0x46;                                                                      // PLC编号
            plcCommand[7]  = 0x46;
            plcCommand[8]  = 0x30;                                                                      // 目标模块IO编号
            plcCommand[9]  = 0x33;
            plcCommand[10] = 0x46;
            plcCommand[11] = 0x46;
            plcCommand[12] = SoftBasic.BuildAsciiBytesFrom(networkStationNumber)[0];                   // 目标模块站号
            plcCommand[13] = SoftBasic.BuildAsciiBytesFrom(networkStationNumber)[1];
            plcCommand[14] = SoftBasic.BuildAsciiBytesFrom((ushort)(plcCommand.Length - 18))[0];       // 请求数据长度
            plcCommand[15] = SoftBasic.BuildAsciiBytesFrom((ushort)(plcCommand.Length - 18))[1];
            plcCommand[16] = SoftBasic.BuildAsciiBytesFrom((ushort)(plcCommand.Length - 18))[2];
            plcCommand[17] = SoftBasic.BuildAsciiBytesFrom((ushort)(plcCommand.Length - 18))[3];
            plcCommand[18] = 0x30;                                                                        // CPU监视定时器
            plcCommand[19] = 0x30;
            plcCommand[20] = 0x31;
            plcCommand[21] = 0x30;
            mcCore.CopyTo(plcCommand, 22);

            return(plcCommand);
        }
Exemplo n.º 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] = SoftBasic.BuildAsciiBytesFrom(addressData.Length)[0];                                               // 软元件点数
            command[17] = SoftBasic.BuildAsciiBytesFrom(addressData.Length)[1];
            command[18] = SoftBasic.BuildAsciiBytesFrom(addressData.Length)[2];
            command[19] = SoftBasic.BuildAsciiBytesFrom(addressData.Length)[3];

            return(command);
        }
Exemplo n.º 8
0
        /// <summary>
        /// write data to address  Type of ReadByte
        /// </summary>
        /// <param name="station">plc station</param>
        /// <param name="address">address, for example: M100, D100, DW100</param>
        /// <param name="value">source value</param>
        /// <returns>command bytes</returns>
        private static OperateResult <byte[]> BuildWriteByteCommand(byte station, string address, byte[] value)
        {
            var analysisResult = XGBFastEnet.AnalysisAddress(address);

            if (!analysisResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysisResult));
            }

            List <byte> command = new List <byte>( );

            command.Add(0x05);      // ENQ
            command.AddRange(SoftBasic.BuildAsciiBytesFrom(station));
            command.Add(0x77);      // command w
            command.Add(0x53);      // command type: SB
            command.Add(0x42);
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)analysisResult.Content.Length));
            command.AddRange(Encoding.ASCII.GetBytes(analysisResult.Content));
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)value.Length));
            command.AddRange(SoftBasic.BytesToAsciiBytes(value));
            command.Add(0x04);      // EOT

            int sum = 0;

            for (int i = 0; i < command.Count; i++)
            {
                sum += command[i];
            }
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum));

            return(OperateResult.CreateSuccessResult(command.ToArray( )));
        }
 /// <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);
 }
Exemplo n.º 10
0
        /// <summary>
        /// Continuous writing to inverter device (W)
        /// </summary>
        /// <param name="station">plc station</param>
        /// <param name="address">address, for example: 0100 </param>
        /// <param name="value">source value</param>
        /// <returns>command bytes</returns>
        private static OperateResult <byte[]> BuildWriteByteCommand(byte station, string address, byte[] value)
        {
            var analysisResult = XGBFastEnet.AnalysisAddress(address);

            if (!analysisResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysisResult));
            }

            List <byte> command = new List <byte>();

            command.Add(0x05);    // ENQ
            command.AddRange(SoftBasic.BuildAsciiBytesFrom(station));
            command.Add(0x57);    // command W  Write inverter variable of Word.
            command.Add(0x06);    // Device Length
            command.AddRange(Encoding.ASCII.GetBytes(analysisResult.Content));
            command.AddRange(SoftBasic.BytesToAsciiBytes(value));

            int sum = 0;

            for (int i = 1; i < command.Count; i++)
            {
                sum += command[i];
            }
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum));

            command.Add(0x04);    // EOT



            return(OperateResult.CreateSuccessResult(command.ToArray()));
        }
Exemplo n.º 11
0
        private byte[] ReadSerialByCommand(byte[] command)
        {
            var result = new List <byte>();


            result.Add(0x06);    // ENQ
            result.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)station));
            result.Add(0x72);    // command r
            result.Add(0x53);    // command type: SB
            result.Add(0x42);
            result.AddRange(Encoding.ASCII.GetBytes("01"));


            int NameLength   = int.Parse(Encoding.ASCII.GetString(command, 6, 2));
            int RequestCount = Convert.ToInt32(Encoding.ASCII.GetString(command, 8 + NameLength, 2), 16);

            string DeviceAddress = Encoding.ASCII.GetString(command, 9, NameLength - 1);

            byte[] data = Read(DeviceAddress, (ushort)RequestCount).Content;

            result.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)data.Length));
            result.AddRange(SoftBasic.BytesToAsciiBytes(data));
            result.Add(0x03);    // ETX

            int sum1 = 0;

            for (int i = 0; i < result.Count; i++)
            {
                sum1 += result[i];
            }
            result.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum1));
            return(result.ToArray());
        }
        /// <summary>
        /// 根据类型地址长度确认需要读取的指令头
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="length">bool数组长度</param>
        /// <returns>带有成功标志的指令数据</returns>
        public static OperateResult <byte[], int> BuildReadBoolCommand(string address, ushort length)
        {
            OperateResult <ushort, ushort, ushort> operateResult = FxCalculateBoolStartAddress(address);

            if (!operateResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[], int>(operateResult));
            }
            ushort num     = (ushort)((operateResult.Content2 + length - 1) / 8 - (int)operateResult.Content2 / 8 + 1);
            ushort content = operateResult.Content1;

            byte[] array = new byte[11]
            {
                2,
                48,
                SoftBasic.BuildAsciiBytesFrom(content)[0],
                SoftBasic.BuildAsciiBytesFrom(content)[1],
                SoftBasic.BuildAsciiBytesFrom(content)[2],
                SoftBasic.BuildAsciiBytesFrom(content)[3],
                SoftBasic.BuildAsciiBytesFrom((byte)num)[0],
                SoftBasic.BuildAsciiBytesFrom((byte)num)[1],
                3,
                0,
                0
            };
            MelsecHelper.FxCalculateCRC(array).CopyTo(array, 9);
            return(OperateResult.CreateSuccessResult(array, (int)operateResult.Content3));
        }
        /// <summary>
        /// 将命令进行打包传送
        /// </summary>
        /// <param name="mcCommand">mc协议的命令</param>
        /// <param name="station">PLC的站号</param>
        /// <returns>最终的原始报文信息</returns>
        public static byte[] PackCommand(byte[] mcCommand, byte station = 0)
        {
            byte[] array = new byte[13 + mcCommand.Length];
            array[0]  = 5;
            array[1]  = 70;
            array[2]  = 57;
            array[3]  = SoftBasic.BuildAsciiBytesFrom(station)[0];
            array[4]  = SoftBasic.BuildAsciiBytesFrom(station)[1];
            array[5]  = 48;
            array[6]  = 48;
            array[7]  = 70;
            array[8]  = 70;
            array[9]  = 48;
            array[10] = 48;
            mcCommand.CopyTo(array, 11);
            int num = 0;

            for (int i = 1; i < array.Length - 3; i++)
            {
                num += array[i];
            }
            array[array.Length - 2] = SoftBasic.BuildAsciiBytesFrom((byte)num)[0];
            array[array.Length - 1] = SoftBasic.BuildAsciiBytesFrom((byte)num)[1];
            return(array);
        }
        /// <summary>
        /// 根据类型地址以及需要写入的数据来生成指令头
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="value">实际的数据信息</param>
        /// <returns>带有成功标志的指令数据</returns>
        public static OperateResult <byte[]> BuildWriteWordCommand(string address, byte[] value)
        {
            OperateResult <ushort> operateResult = FxCalculateWordStartAddress(address);

            if (!operateResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(operateResult));
            }
            if (value != null)
            {
                value = SoftBasic.BuildAsciiBytesFrom(value);
            }
            ushort content = operateResult.Content;

            byte[] array = new byte[13 + value.Length];
            array[0] = 2;
            array[1] = 69;
            array[2] = 49;
            array[3] = 48;
            array[4] = SoftBasic.BuildAsciiBytesFrom(content)[0];
            array[5] = SoftBasic.BuildAsciiBytesFrom(content)[1];
            array[6] = SoftBasic.BuildAsciiBytesFrom(content)[2];
            array[7] = SoftBasic.BuildAsciiBytesFrom(content)[3];
            array[8] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[0];
            array[9] = SoftBasic.BuildAsciiBytesFrom((byte)(value.Length / 2))[1];
            Array.Copy(value, 0, array, 10, value.Length);
            array[array.Length - 3] = 3;
            MelsecHelper.FxCalculateCRC(array).CopyTo(array, array.Length - 2);
            return(OperateResult.CreateSuccessResult(array));
        }
Exemplo n.º 15
0
        /// <summary>
        /// 根据类型地址长度确认需要读取的指令头
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="length">长度</param>
        /// <returns>带有成功标志的指令数据</returns>
        public static OperateResult <byte[]> BuildReadWordCommand(string address, ushort length)
        {
            var addressResult = FxCalculateWordStartAddress(address);

            if (!addressResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(addressResult));
            }

            length = (ushort)(length * 2);
            ushort startAddress = addressResult.Content;

            byte[] _PLCCommand = new byte[11];
            _PLCCommand[0] = 0x02;                                                  // STX
            _PLCCommand[1] = 0x30;                                                  // Read
            _PLCCommand[2] = SoftBasic.BuildAsciiBytesFrom(startAddress)[0];        // 偏移地址
            _PLCCommand[3] = SoftBasic.BuildAsciiBytesFrom(startAddress)[1];
            _PLCCommand[4] = SoftBasic.BuildAsciiBytesFrom(startAddress)[2];
            _PLCCommand[5] = SoftBasic.BuildAsciiBytesFrom(startAddress)[3];
            _PLCCommand[6] = SoftBasic.BuildAsciiBytesFrom((byte)length)[0];        // 读取长度
            _PLCCommand[7] = SoftBasic.BuildAsciiBytesFrom((byte)length)[1];
            _PLCCommand[8] = 0x03;                                                  // ETX
            MelsecHelper.FxCalculateCRC(_PLCCommand).CopyTo(_PLCCommand, 9);        // CRC

            return(OperateResult.CreateSuccessResult(_PLCCommand));                 // Return
        }
Exemplo n.º 16
0
        /// <summary>
        /// 根据类型地址长度确认需要读取的指令头
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="length">bool数组长度</param>
        /// <returns>带有成功标志的指令数据</returns>
        public static OperateResult <byte[], int> BuildReadBoolCommand(string address, ushort length)
        {
            var addressResult = FxCalculateBoolStartAddress(address);

            if (!addressResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[], int>(addressResult));
            }

            // 计算下实际需要读取的数据长度
            ushort length2 = (ushort)((addressResult.Content2 + length - 1) / 8 - (addressResult.Content2 / 8) + 1);

            ushort startAddress = addressResult.Content1;

            byte[] _PLCCommand = new byte[11];
            _PLCCommand[0] = 0x02;                                                  // STX
            _PLCCommand[1] = 0x30;                                                  // Read
            _PLCCommand[2] = SoftBasic.BuildAsciiBytesFrom(startAddress)[0];        // 偏移地址
            _PLCCommand[3] = SoftBasic.BuildAsciiBytesFrom(startAddress)[1];
            _PLCCommand[4] = SoftBasic.BuildAsciiBytesFrom(startAddress)[2];
            _PLCCommand[5] = SoftBasic.BuildAsciiBytesFrom(startAddress)[3];
            _PLCCommand[6] = SoftBasic.BuildAsciiBytesFrom((byte)length2)[0];       // 读取长度
            _PLCCommand[7] = SoftBasic.BuildAsciiBytesFrom((byte)length2)[1];
            _PLCCommand[8] = 0x03;                                                  // ETX
            MelsecHelper.FxCalculateCRC(_PLCCommand).CopyTo(_PLCCommand, 9);        // CRC

            return(OperateResult.CreateSuccessResult(_PLCCommand, (int)addressResult.Content3));
        }
        /// <summary>
        /// 根据类型地址长度确认需要读取的指令头
        /// </summary>
        /// <param name="address">起始地址</param>
        /// <param name="length">长度</param>
        /// <returns>带有成功标志的指令数据</returns>
        public static OperateResult <byte[]> BuildReadWordCommand(string address, ushort length)
        {
            OperateResult <ushort> operateResult = FxCalculateWordStartAddress(address);

            if (!operateResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(operateResult));
            }
            length = (ushort)(length * 2);
            ushort content = operateResult.Content;

            byte[] array = new byte[13]
            {
                2,
                69,
                48,
                48,
                SoftBasic.BuildAsciiBytesFrom(content)[0],
                SoftBasic.BuildAsciiBytesFrom(content)[1],
                SoftBasic.BuildAsciiBytesFrom(content)[2],
                SoftBasic.BuildAsciiBytesFrom(content)[3],
                SoftBasic.BuildAsciiBytesFrom((byte)length)[0],
                SoftBasic.BuildAsciiBytesFrom((byte)length)[1],
                3,
                0,
                0
            };
            MelsecHelper.FxCalculateCRC(array).CopyTo(array, 11);
            return(OperateResult.CreateSuccessResult(array));
        }
Exemplo n.º 18
0
        /// <summary>
        /// One reading address  Type of ReadByte
        /// </summary>
        /// <param name="station">plc station</param>
        /// <param name="address">address, for example: MX100, DW100, TW100</param>
        /// <param name="length">read length</param>
        /// <returns></returns>
        private static OperateResult <byte[]> BuildReadOneCommand(byte station, string address, ushort length)
        {
            var analysisResult = AnalysisAddress(address, true);

            if (!analysisResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysisResult));
            }

            List <byte> command = new List <byte>();

            command.Add(0x05);    // ENQ
            command.AddRange(SoftBasic.BuildAsciiBytesFrom(station));
            command.Add(0x72);    // command r
            command.Add(0x53);    // command type: SS
            command.Add(0x53);
            command.Add(0x01);    // Number of blocks
            command.Add(0x00);
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)analysisResult.Content.Length));
            command.AddRange(Encoding.ASCII.GetBytes(analysisResult.Content));
            command.Add(0x04);    // EOT

            int sum = 0;

            for (int i = 0; i < command.Count; i++)
            {
                sum += command[i];
            }
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum));

            return(OperateResult.CreateSuccessResult(command.ToArray()));
        }
Exemplo n.º 19
0
        /// <summary>
        /// write data to address  Type of ReadByte
        /// </summary>
        /// <param name="station">plc station</param>
        /// <param name="address">address, for example: M100, D100, DW100</param>
        /// <param name="value">source value</param>
        /// <returns>command bytes</returns>
        private static OperateResult <byte[]> BuildWriteByteCommand(byte station, string address, byte[] value)
        {
            var analysisResult = XGBFastEnet.AnalysisAddress(address, false);

            if (!analysisResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysisResult));
            }
            var DataTypeResult = XGBFastEnet.GetDataTypeToAddress(address);

            if (!DataTypeResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(DataTypeResult));
            }

            List <byte> command = new List <byte>();

            command.Add(0x05);    // ENQ
            command.AddRange(SoftBasic.BuildAsciiBytesFrom(station));
            command.Add(0x77);    // command w
            command.Add(0x53);    // command type: S
            switch (DataTypeResult.Content)
            {
            case "Bit":
            case "Byte":
                command.Add(0x53);        // command type: SS
                command.Add(0x30);        // Number of blocks
                command.Add(0x31);
                command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)analysisResult.Content.Length));
                command.AddRange(Encoding.ASCII.GetBytes(analysisResult.Content));
                break;

            case "Word":
            case "DWord":
            case "LWord":
            case "Continuous":
                command.Add(0x42);           // command type: SB
                command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)analysisResult.Content.Length));
                command.AddRange(Encoding.ASCII.GetBytes(analysisResult.Content));
                command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)value.Length));
                break;

            default: break;
            }
            command.AddRange(SoftBasic.BytesToAsciiBytes(value));
            command.Add(0x04);    // EOT
            int sum = 0;

            for (int i = 0; i < command.Count; i++)
            {
                sum += command[i];
            }
            command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum));

            return(OperateResult.CreateSuccessResult(command.ToArray()));
        }
        /// <summary>
        /// 计算Fx协议指令的和校验信息
        /// </summary>
        /// <param name="data">字节数据</param>
        /// <returns>校验之后的数据</returns>
        internal static byte[] FxCalculateCRC(byte[] data)
        {
            int num = 0;

            for (int i = 1; i < data.Length - 2; i++)
            {
                num += data[i];
            }
            return(SoftBasic.BuildAsciiBytesFrom((byte)num));
        }
Exemplo n.º 21
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++)
            {
                SoftBasic.BuildAsciiBytesFrom(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] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[0];                                // 软元件点数
            command[17] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[1];
            command[18] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[2];
            command[19] = SoftBasic.BuildAsciiBytesFrom((ushort)(value.Length / 4))[3];
            value.CopyTo(command, 20);

            return(command);
        }
Exemplo n.º 22
0
        /// <summary>
        /// 将普通的指令打包成完整的指令
        /// </summary>
        /// <param name="cmd">fins指令</param>
        /// <returns>完整的质量</returns>
        private byte[] PackCommand(byte[] cmd)
        {
            cmd = BasicFramework.SoftBasic.BytesToAsciiBytes(cmd);

            byte[] buffer = new byte[18 + cmd.Length];

            buffer[0]  = (byte)'@';
            buffer[1]  = SoftBasic.BuildAsciiBytesFrom(this.UnitNumber)[0];
            buffer[2]  = SoftBasic.BuildAsciiBytesFrom(this.UnitNumber)[1];
            buffer[3]  = (byte)'F';
            buffer[4]  = (byte)'A';
            buffer[5]  = ResponseWaitTime;
            buffer[6]  = SoftBasic.BuildAsciiBytesFrom(this.ICF)[0];
            buffer[7]  = SoftBasic.BuildAsciiBytesFrom(this.ICF)[1];
            buffer[8]  = SoftBasic.BuildAsciiBytesFrom(this.DA2)[0];
            buffer[9]  = SoftBasic.BuildAsciiBytesFrom(this.DA2)[1];
            buffer[10] = SoftBasic.BuildAsciiBytesFrom(this.SA2)[0];
            buffer[11] = SoftBasic.BuildAsciiBytesFrom(this.SA2)[1];
            buffer[12] = SoftBasic.BuildAsciiBytesFrom(this.SID)[0];
            buffer[13] = SoftBasic.BuildAsciiBytesFrom(this.SID)[1];
            buffer[buffer.Length - 2] = (byte)'*';
            buffer[buffer.Length - 1] = 0x0D;
            cmd.CopyTo(buffer, 14);
            // 计算FCS
            int tmp = buffer[0];

            for (int i = 1; i < buffer.Length - 4; i++)
            {
                tmp = (tmp ^ buffer[i]);
            }
            buffer[buffer.Length - 4] = SoftBasic.BuildAsciiBytesFrom((byte)tmp)[0];
            buffer[buffer.Length - 3] = SoftBasic.BuildAsciiBytesFrom((byte)tmp)[1];
            string output = Encoding.ASCII.GetString(buffer);

            Console.WriteLine(output);
            return(buffer);
        }
 /// <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);
 }
Exemplo n.º 24
0
        private byte[] WriteSerialByMessage(byte[] packCommand)
        {
            var    result = new List <byte>();
            string NameLength, DeviceAddress;
            var    Read = Encoding.ASCII.GetString(packCommand, 3, 3);

            result.Add(0x06);    // ENQ
            result.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)station));
            result.Add(0x77);    // command w
            result.Add(0x53);    // command type: SB
            result.Add(0x42);
            result.Add(0x03);    // EOT

            if (Read == "wSS")
            {
                NameLength    = Encoding.ASCII.GetString(packCommand, 8, 2);
                DeviceAddress = Encoding.ASCII.GetString(packCommand, 11, int.Parse(NameLength) - 1);

                string data = Encoding.ASCII.GetString(packCommand, 10 + int.Parse(NameLength), 2);
                Write(DeviceAddress, new byte[] { (byte)(data == "01" ? 0x01 : 0x00) });
            }
            else
            {
                NameLength    = Encoding.ASCII.GetString(packCommand, 6, 2);
                DeviceAddress = Encoding.ASCII.GetString(packCommand, 9, int.Parse(NameLength) - 1);

                int    RequestCount = int.Parse(Encoding.ASCII.GetString(packCommand, 8 + int.Parse(NameLength), 2));
                string Value        = Encoding.ASCII.GetString(packCommand, 8 + int.Parse(NameLength) + RequestCount, RequestCount * 2);
                var    wdArys       = HexToBytes(Value);
                Write(DeviceAddress, wdArys);
            }



            return(result.ToArray());
        }
Exemplo n.º 25
0
        private byte[] ReadFromModbusCore(byte[] packet)
        {
            List <byte> command = new List <byte>();

            command.Clear();
            var StartAddress  = string.Empty;
            var station       = Encoding.ASCII.GetString(packet, 1, 2);
            var Read          = Encoding.ASCII.GetString(packet, 3, 3);
            var nameLength    = Encoding.ASCII.GetString(packet, 6, 2);
            var DeviceAddress = Encoding.ASCII.GetString(packet, 8, int.Parse(nameLength));
            var size          = Encoding.ASCII.GetString(packet, 8 + int.Parse(nameLength), 2);

            //=====================================================================================
            // Read Response
            if (Read.Substring(0, 2) == "rS")
            {
                command.Add(0x06);    // ENQ
                command.AddRange(SoftBasic.BuildAsciiBytesFrom(byte.Parse(station)));
                command.Add(0x72);    // command r
                command.Add(0x53);    // command type: SB
                command.Add(0x42);
                command.AddRange(Encoding.ASCII.GetBytes("01"));
                StartAddress = DeviceAddress.Remove(0, 3);
                bool[] data;
                string txtValue;
                switch (DeviceAddress.Substring(1, 2))
                {
                case "MB":
                case "PB":
                    var dbint      = Convert.ToInt32(size, 16) * 8;
                    int startIndex = int.Parse(StartAddress);
                    switch (DeviceAddress[1])
                    {
                    case 'P':
                        data = pBuffer.GetBool(startIndex, dbint);
                        break;

                    case 'Q':
                        data = qBuffer.GetBool(startIndex, dbint);
                        break;

                    case 'M':
                        data = mBuffer.GetBool(startIndex, dbint);
                        break;

                    case 'D':
                        data = dBuffer.GetBool(startIndex, dbint);
                        break;

                    default: throw new Exception(StringResources.Language.NotSupportedDataType);
                    }
                    var data3 = SoftBasic.BoolArrayToByte(data);
                    txtValue = GetValStr(data3, 0, Convert.ToInt32(size, 16));
                    command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)data3.Length));
                    command.AddRange(SoftBasic.BytesToAsciiBytes(data3));
                    command.Add(0x03);        // ETX
                    int sum1 = 0;
                    for (int i = 0; i < command.Count; i++)
                    {
                        sum1 += command[i];
                    }
                    command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum1));
                    break;

                case "DB":
                case "TB":
                    var    RequestCount = Convert.ToInt32(size, 16);
                    byte[] dataW;
                    var    startIndexW = int.Parse(StartAddress);
                    switch (DeviceAddress[1])
                    {
                    case 'P':
                        dataW = pBuffer.GetBytes(startIndexW, (ushort)RequestCount);
                        break;

                    case 'Q':
                        dataW = qBuffer.GetBytes(startIndexW, (ushort)RequestCount);
                        break;

                    case 'M':
                        dataW = mBuffer.GetBytes(startIndexW, (ushort)RequestCount);
                        break;

                    case 'D':
                        dataW = dBuffer.GetBytes(startIndexW, (ushort)RequestCount);
                        break;

                    default: throw new Exception(StringResources.Language.NotSupportedDataType);
                    }
                    txtValue = GetValStr(dataW, 0, Convert.ToInt32(size, 16));
                    command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)dataW.Length));
                    command.AddRange(SoftBasic.BytesToAsciiBytes(dataW));
                    command.Add(0x03);        // ETX
                    int sum = 0;
                    for (int i = 0; i < command.Count; i++)
                    {
                        sum += command[i];
                    }
                    command.AddRange(SoftBasic.BuildAsciiBytesFrom((byte)sum));
                    break;
                }
                return(command.ToArray());
            }
            else
            {
                StartAddress = DeviceAddress.Remove(0, 3);
                command.Add(0x06);    // ENQ
                command.AddRange(SoftBasic.BuildAsciiBytesFrom(byte.Parse(station)));
                command.Add(0x77);    // command w
                command.Add(0x53);    // command type: SB
                command.Add(0x42);
                command.Add(0x03);    // EOT
                string Value;
                if (Read.Substring(0, 3) == "WSS")
                {
                    //nameLength = packet.Substring(8, 1);
                    //DeviceAddress = packet.Substring(9, Convert.ToInt16(nameLength));
                    //AddressLength = packet.Substring(9 + Convert.ToInt16(nameLength), 1);
                    nameLength    = Encoding.ASCII.GetString(packet, 8, 2);
                    DeviceAddress = Encoding.ASCII.GetString(packet, 10, int.Parse(nameLength));
                    Value         = Encoding.ASCII.GetString(packet, 10 + int.Parse(nameLength), 2);
                }
                else
                {
                    //Value = Encoding.ASCII.GetString(packet, 10 + int.Parse(nameLength), int.Parse(size));
                    Value = Encoding.ASCII.GetString(packet, 8 + int.Parse(nameLength) + int.Parse(size), int.Parse(size) * 2);
                    var wdArys = HexToBytes(Value);
                }


                var startIndex = CheckAddress(StartAddress);
                switch (DeviceAddress.Substring(1, 2))
                {
                case "MX":     // Bit X
                    Value = Encoding.ASCII.GetString(packet, 8 + int.Parse(nameLength) + int.Parse(size), int.Parse(size));
                    switch (DeviceAddress[1])
                    {
                    //case 'M': inputBuffer.SetBool(value, startIndex); break;
                    //case 'M': outputBuffer.SetBool(value, startIndex); break;
                    case 'M': mBuffer.SetBool(Value == "01" ? true : false, startIndex); break;

                    case 'D': dBuffer.SetBool(Value == "01" ? true : false, startIndex); break;

                    default: throw new Exception(StringResources.Language.NotSupportedDataType);
                    }
                    return(command.ToArray());

                case "DW":     //Word
                    Value = Encoding.ASCII.GetString(packet, 8 + int.Parse(nameLength) + int.Parse(size), int.Parse(size) * 2);
                    var wdArys = HexToBytes(Value);
                    switch (DeviceAddress[1])
                    {
                    case 'C': pBuffer.SetBytes(wdArys, startIndex); break;

                    case 'T': qBuffer.SetBytes(wdArys, startIndex); break;

                    case 'M': mBuffer.SetBytes(wdArys, startIndex); break;

                    case 'D': dBuffer.SetBytes(wdArys, startIndex); break;

                    default: throw new Exception(StringResources.Language.NotSupportedDataType);
                    }
                    return(command.ToArray());

                case "DD":     //DWord


                    break;

                case "DL":     //LWord

                    break;

                default:

                    return(null);
                }
            }
            return(command.ToArray());
        }
Exemplo n.º 26
0
        /// <summary>
        /// 生成位写入的数据报文信息,该报文可直接用于发送串口给PLC
        /// </summary>
        /// <param name="address">地址信息,每个地址存在一定的范围,需要谨慎传入数据。举例:M10,S10,X5,Y10,C10,T10</param>
        /// <param name="value"><c>True</c>或是<c>False</c></param>
        /// <returns>带报文信息的结果对象</returns>
        public static OperateResult <byte[]> BuildWriteBoolPacket(string address, bool value)
        {
            var analysis = FxAnalysisAddress(address);

            if (!analysis.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(analysis));
            }

            // 二次运算起始地址偏移量,根据类型的不同,地址的计算方式不同
            ushort startAddress = analysis.Content2;

            if (analysis.Content1 == MelsecMcDataType.M)
            {
                if (startAddress >= 8000)
                {
                    startAddress = (ushort)(startAddress - 8000 + 0x0F00);
                }
                else
                {
                    startAddress = (ushort)(startAddress + 0x0800);
                }
            }
            else if (analysis.Content1 == MelsecMcDataType.S)
            {
                startAddress = (ushort)(startAddress + 0x0000);
            }
            else if (analysis.Content1 == MelsecMcDataType.X)
            {
                startAddress = (ushort)(startAddress + 0x0400);
            }
            else if (analysis.Content1 == MelsecMcDataType.Y)
            {
                startAddress = (ushort)(startAddress + 0x0500);
            }
            else if (analysis.Content1 == MelsecMcDataType.CS)
            {
                startAddress += (ushort)(startAddress + 0x01C0);
            }
            else if (analysis.Content1 == MelsecMcDataType.CC)
            {
                startAddress += (ushort)(startAddress + 0x03C0);
            }
            else if (analysis.Content1 == MelsecMcDataType.CN)
            {
                startAddress += (ushort)(startAddress + 0x0E00);
            }
            else if (analysis.Content1 == MelsecMcDataType.TS)
            {
                startAddress += (ushort)(startAddress + 0x00C0);
            }
            else if (analysis.Content1 == MelsecMcDataType.TC)
            {
                startAddress += (ushort)(startAddress + 0x02C0);
            }
            else if (analysis.Content1 == MelsecMcDataType.TN)
            {
                startAddress += (ushort)(startAddress + 0x0600);
            }
            else
            {
                return(new OperateResult <byte[]>(StringResources.Language.MelsecCurrentTypeNotSupportedBitOperate));
            }


            byte[] _PLCCommand = new byte[9];
            _PLCCommand[0] = 0x02;                                                     // STX
            _PLCCommand[1] = value ? (byte)0x37 : (byte)0x38;                          // Read
            _PLCCommand[2] = SoftBasic.BuildAsciiBytesFrom(startAddress)[2];           // 偏移地址
            _PLCCommand[3] = SoftBasic.BuildAsciiBytesFrom(startAddress)[3];
            _PLCCommand[4] = SoftBasic.BuildAsciiBytesFrom(startAddress)[0];
            _PLCCommand[5] = SoftBasic.BuildAsciiBytesFrom(startAddress)[1];
            _PLCCommand[6] = 0x03;                                                       // ETX
            MelsecHelper.FxCalculateCRC(_PLCCommand).CopyTo(_PLCCommand, 7);             // CRC

            return(OperateResult.CreateSuccessResult(_PLCCommand));
        }
        /// <summary>
        /// 生成位写入的数据报文信息,该报文可直接用于发送串口给PLC
        /// </summary>
        /// <param name="address">地址信息,每个地址存在一定的范围,需要谨慎传入数据。举例:M10,S10,X5,Y10,C10,T10</param>
        /// <param name="value"><c>True</c>或是<c>False</c></param>
        /// <returns>带报文信息的结果对象</returns>
        public static OperateResult <byte[]> BuildWriteBoolPacket(string address, bool value)
        {
            OperateResult <MelsecMcDataType, ushort> operateResult = FxAnalysisAddress(address);

            if (!operateResult.IsSuccess)
            {
                return(OperateResult.CreateFailedResult <byte[]>(operateResult));
            }
            ushort content = operateResult.Content2;

            if (operateResult.Content1 == MelsecMcDataType.M)
            {
                content = ((content < 8000) ? ((ushort)(content + 2048)) : ((ushort)(content - 8000 + 3840)));
            }
            else if (operateResult.Content1 == MelsecMcDataType.S)
            {
                content = content;
            }
            else if (operateResult.Content1 == MelsecMcDataType.X)
            {
                content = (ushort)(content + 1024);
            }
            else if (operateResult.Content1 == MelsecMcDataType.Y)
            {
                content = (ushort)(content + 1280);
            }
            else if (operateResult.Content1 == MelsecMcDataType.CS)
            {
                content = (ushort)(content + (ushort)(content + 448));
            }
            else if (operateResult.Content1 == MelsecMcDataType.CC)
            {
                content = (ushort)(content + (ushort)(content + 960));
            }
            else if (operateResult.Content1 == MelsecMcDataType.CN)
            {
                content = (ushort)(content + (ushort)(content + 3584));
            }
            else if (operateResult.Content1 == MelsecMcDataType.TS)
            {
                content = (ushort)(content + (ushort)(content + 192));
            }
            else if (operateResult.Content1 == MelsecMcDataType.TC)
            {
                content = (ushort)(content + (ushort)(content + 704));
            }
            else
            {
                if (operateResult.Content1 != MelsecMcDataType.TN)
                {
                    return(new OperateResult <byte[]>(StringResources.Language.MelsecCurrentTypeNotSupportedBitOperate));
                }
                content = (ushort)(content + (ushort)(content + 1536));
            }
            byte[] array = new byte[9]
            {
                2,
                (byte)(value ? 55 : 56),
                SoftBasic.BuildAsciiBytesFrom(content)[2],
                SoftBasic.BuildAsciiBytesFrom(content)[3],
                SoftBasic.BuildAsciiBytesFrom(content)[0],
                SoftBasic.BuildAsciiBytesFrom(content)[1],
                3,
                0,
                0
            };
            MelsecHelper.FxCalculateCRC(array).CopyTo(array, 7);
            return(OperateResult.CreateSuccessResult(array));
        }