Ejemplo n.º 1
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));
            }
        }
Ejemplo n.º 2
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));
            }
        }
        /// <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));
        }
Ejemplo n.º 4
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));
            }
        }
        /// <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());
        }
Ejemplo n.º 6
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));
            }
        }
        /// <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()));
        }
Ejemplo n.º 8
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));
 }