Пример #1
0
        /// <summary>
        /// 根据读取的地址,长度,是否位读取创建Fins协议的核心报文
        /// </summary>
        /// <param name="address">地址,具体格式请参照示例说明</param>
        /// <param name="length">读取的数据长度</param>
        /// <param name="isBit">是否使用位读取</param>
        /// <returns>带有成功标识的Fins核心报文</returns>
        public static OperateResult <byte[]> BuildReadCommand(string address, ushort length, bool isBit)
        {
            var analysis = OmronFinsNetHelper.AnalysisAddress(address, isBit);

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

            byte[] _PLCCommand = new byte[8];
            _PLCCommand[0] = 0x01;    // 读取存储区数据
            _PLCCommand[1] = 0x01;
            if (isBit)
            {
                _PLCCommand[2] = analysis.Content1.BitCode;
            }
            else
            {
                _PLCCommand[2] = analysis.Content1.WordCode;
            }
            analysis.Content2.CopyTo(_PLCCommand, 3);
            _PLCCommand[6] = (byte)(length / 256);                       // 长度
            _PLCCommand[7] = (byte)(length % 256);

            return(OperateResult.CreateSuccessResult(_PLCCommand));
        }
Пример #2
0
        /// <summary>
        /// 向PLC中位软元件写入bool数组,返回值说明,比如你写入D100,values[0]对应D100.0
        /// </summary>
        /// <param name="address">要写入的数据地址,具体的地址参考文档</param>
        /// <param name="values">要写入的实际数据,可以指定任意的长度</param>
        /// <returns>返回写入结果</returns>
        /// <example>
        /// <code lang="cs" source="Communication_Net45.Test\Documentation\Samples\Profinet\OmronFinsNet.cs" region="WriteBool" title="WriteBool示例" />
        /// </example>
        public OperateResult Write(string address, bool[] values)
        {
            // 获取指令
            var command = OmronFinsNetHelper.BuildWriteWordCommand(address, values.Select(m => m ? (byte)0x01 : (byte)0x00).ToArray(), true);;

            if (!command.IsSuccess)
            {
                return(command);
            }

            // 核心数据交互
            OperateResult <byte[]> read = ReadBase(PackCommand(command.Content));

            if (!read.IsSuccess)
            {
                return(read);
            }

            // 数据有效性分析
            OperateResult <byte[]> valid = ResponseValidAnalysis(read.Content, false);

            if (!valid.IsSuccess)
            {
                return(valid);
            }

            // 成功
            return(OperateResult.CreateSuccessResult());
        }
Пример #3
0
        /// <summary>
        /// 从欧姆龙PLC中批量读取位软元件,返回读取结果
        /// </summary>
        /// <param name="address">读取地址,具体的地址参考文档</param>
        /// <param name="length">读取的长度</param>
        /// <returns>带成功标志的结果数据对象</returns>
        /// <example>
        /// <code lang="cs" source="Communication_Net45.Test\Documentation\Samples\Profinet\OmronFinsNet.cs" region="ReadBool" title="ReadBool示例" />
        /// </example>
        public OperateResult <bool[]> ReadBool(string address, ushort length)
        {
            // 获取指令
            var command = OmronFinsNetHelper.BuildReadCommand(address, length, true);

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

            // 核心交互
            OperateResult <byte[]> read = ReadBase(PackCommand(command.Content));

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

            // 数据有效性分析
            OperateResult <byte[]> valid = ResponseValidAnalysis(read.Content, true);

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

            // 返回正确的数据信息
            return(OperateResult.CreateSuccessResult(valid.Content.Select(m => m != 0x00 ? true : false).ToArray()));
        }
Пример #4
0
        /// <summary>
        /// 批量写入PLC的数据,以字为单位,也就是说最少2个字节信息,具体的地址参考文档
        /// </summary>
        /// <param name="address">地址信息</param>
        /// <param name="value">数据值</param>
        /// <returns>是否写入成功</returns>
        public override OperateResult Write(string address, byte[] value)
        {
            // 获取指令
            var command = OmronFinsNetHelper.BuildWriteWordCommand(address, value, false);;

            if (!command.IsSuccess)
            {
                return(command);
            }

            // 核心数据交互
            OperateResult <byte[]> read = ReadBase(PackCommand(command.Content));

            if (!read.IsSuccess)
            {
                return(read);
            }

            // 数据有效性分析
            OperateResult <byte[]> valid = ResponseValidAnalysis(read.Content, false);

            if (!valid.IsSuccess)
            {
                return(valid);
            }

            // 成功
            return(OperateResult.CreateSuccessResult());
        }
Пример #5
0
        /// <summary>
        /// 批量读取PLC的数据,以字为单位,具体的地址参考文档
        /// </summary>
        /// <param name="address">地址信息</param>
        /// <param name="length">数据长度</param>
        /// <returns>读取结果信息</returns>
        public override OperateResult <byte[]> Read(string address, ushort length)
        {
            // 解析地址
            var command = OmronFinsNetHelper.BuildReadCommand(address, length, false);

            if (!command.IsSuccess)
            {
                return(command);
            }

            // 核心交互
            OperateResult <byte[]> read = ReadBase(PackCommand(command.Content));

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

            // 数据有效性分析
            OperateResult <byte[]> valid = ResponseValidAnalysis(read.Content, true);

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

            // 读取到了正确的数据
            return(OperateResult.CreateSuccessResult(valid.Content));
        }
Пример #6
0
        /// <summary>
        /// 根据写入的地址,数据,是否位写入生成Fins协议的核心报文
        /// </summary>
        /// <param name="address">地址内容,具体格式请参照示例说明</param>
        /// <param name="value">实际的数据</param>
        /// <param name="isBit">是否位数据</param>
        /// <returns>带有成功标识的Fins核心报文</returns>
        public static OperateResult <byte[]> BuildWriteWordCommand(string address, byte[] value, bool isBit)
        {
            var analysis = OmronFinsNetHelper.AnalysisAddress(address, isBit);

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

            byte[] _PLCCommand = new byte[8 + value.Length];
            _PLCCommand[0] = 0x01;
            _PLCCommand[1] = 0x02;

            if (isBit)
            {
                _PLCCommand[2] = analysis.Content1.BitCode;
            }
            else
            {
                _PLCCommand[2] = analysis.Content1.WordCode;
            }

            analysis.Content2.CopyTo(_PLCCommand, 3);
            if (isBit)
            {
                _PLCCommand[6] = (byte)(value.Length / 256);
                _PLCCommand[7] = (byte)(value.Length % 256);
            }
            else
            {
                _PLCCommand[6] = (byte)(value.Length / 2 / 256);
                _PLCCommand[7] = (byte)(value.Length / 2 % 256);
            }

            value.CopyTo(_PLCCommand, 8);

            return(OperateResult.CreateSuccessResult(_PLCCommand));
        }