Esempio n. 1
0
        /// <summary>
        /// 读取数据块内容
        /// </summary>
        /// <param name="dbType">数据块类别标识</param>
        /// <param name="dbNumber">DB数据块编号</param>
        /// <param name="dbOffset">读取的起始偏移量</param>
        /// <param name="bufferLength">缓冲区长度</param>
        /// <param name="buffer">byte[]类型的缓冲区</param>
        /// <param name="errText">执行结果信息</param>
        public int ReadBlock(
            SiemensRegisterType dbType,
            int dbNumber,
            int dbOffset,
            int bufferLength,
            ref byte[] buffer,
            out string errText)
        {
            if (!isConnected)
            {
                isConnected = Connect();
            }

            buffer = new byte[bufferLength];
            int resNo = 0;

            lock (_lockObjet)
            {
                resNo =
                    CS7TcpClient.ReadBlockAsByte(
                        plcHandle,
                        (int)dbType,
                        dbNumber,
                        dbOffset,
                        bufferLength,
                        buffer);
            }

            if (resNo != 0)
            {
                errText = GetErrorMessage(resNo);
                _log.Error(
                    $"PLC:[{IPAddress}]读取[{dbType}]" +
                    $"[{dbNumber}]失败,失败信息:" +
                    $"[Code:{resNo},Message:{errText}");
            }
            else
            {
                errText = "读取正常";
            }

            return(resNo);
        }
Esempio n. 2
0
        /// <summary>
        /// 读取数据块内容
        /// </summary>
        /// <param name="dbType">数据块类别标识</param>
        /// <param name="dbNumber">DB数据块编号</param>
        /// <param name="dbOffset">读取的起始偏移量</param>
        /// <param name="bufferLength">缓冲区长度</param>
        /// <param name="buffer">byte[]类型的缓冲区</param>
        /// <param name="errText">执行结果信息</param>
        public int ReadBlock(
            SiemensRegisterType dbType,
            int dbNumber,
            int dbOffset,
            int bufferLength,
            ref byte[] buffer,
            out string errText)
        {
            if (!isConnected)
            {
                isConnected = Connect();
            }

            buffer = new byte[bufferLength];
            OperateResult <byte[]> resNo;

            lock (_lockObjet)
            {
                string addr = $"{dbType.ToString()}{dbNumber}.{dbOffset}";
                resNo =
                    siemensTcpNet.Read(
                        addr,
                        (ushort)bufferLength);
            }

            if (!resNo.IsSuccess)
            {
                errText = resNo.ToMessageShowString();
                _log.Error(
                    $"PLC:[{IPAddress}]读取[{dbType}]" +
                    $"[{dbNumber}]失败,失败信息:" +
                    $"[Message:{errText}");
            }
            else
            {
                buffer  = resNo.Content;
                errText = "读取正常";
            }

            return(resNo.ErrorCode);
        }
Esempio n. 3
0
        /// <summary>
        /// 读取Float值
        /// </summary>
        /// <param name="dbType">数据块类别标识</param>
        /// <param name="dbNumber">DB数据块编号</param>
        /// <param name="dbOffset">读取的起始偏移量</param>
        /// <param name="value">float类型的值</param>
        /// <param name="errText">执行结果信息</param>
        public int ReadFloat(
            SiemensRegisterType dbType,
            int dbNumber,
            int dbOffset,
            ref float value,
            out string errText)
        {
            if (!isConnected)
            {
                isConnected = Connect();
            }

            OperateResult <float> resNo;

            lock (_lockObjet)
            {
                string addr = $"{dbType.ToString()}{dbNumber}.{dbOffset}";
                resNo = siemensTcpNet.ReadFloat(addr);
            }

            if (!resNo.IsSuccess)
            {
                errText = resNo.ToMessageShowString();
                _log.Error(
                    $"PLC:[{IPAddress}]读取[{dbType}]" +
                    $"[{dbNumber}]失败,失败信息:" +
                    $"[Message:{errText}");
            }
            else
            {
                value   = resNo.Content;
                errText = "读取正常";
            }

            return(resNo.ErrorCode);
        }
Esempio n. 4
0
        /// <summary>
        /// 将值回写到PLC中
        /// </summary>
        /// <param name="dbType">数据块类别</param>
        /// <param name="dbNumber">DB数据块编号</param>
        /// <param name="tag">西门子Tag对象</param>
        public void WriteToPLC(
            SiemensRegisterType dbType,
            int dbNumber,
            SiemensTag tag)
        {
            if (!isConnected)
            {
                isConnected = Connect();
            }

            int rlt = 0;

            try
            {
                lock (_lockObjet)
                {
                    if (tag is SiemensBoolOfTag)
                    {
                        SiemensBoolOfTag ltag = tag as SiemensBoolOfTag;
                        rlt = CS7TcpClient.WriteBool(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Position,
                            ltag.Value);
                        if (!ltag.Name.Contains("MES_Heart_Beat"))
                        {
                            _log.Debug(
                                $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                                $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                        }
                    }
                    else if (tag is SiemensByteOfTag)
                    {
                        SiemensByteOfTag ltag = tag as SiemensByteOfTag;
                        rlt = CS7TcpClient.WriteByte(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Value);
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                    }
                    else if (tag is SiemensWordOfTag)
                    {
                        SiemensWordOfTag ltag = tag as SiemensWordOfTag;
                        rlt = CS7TcpClient.WriteWord(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Value);
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                    }
                    else if (tag is SiemensIntOfTag)
                    {
                        SiemensIntOfTag ltag = tag as SiemensIntOfTag;
                        rlt = CS7TcpClient.WriteInt(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Value);
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                    }
                    else if (tag is SiemensDWordOfTag)
                    {
                        SiemensDWordOfTag ltag = tag as SiemensDWordOfTag;
                        rlt = CS7TcpClient.WriteDWord(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Value);
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                    }
                    else if (tag is SiemensRealOfTag)
                    {
                        SiemensRealOfTag ltag = tag as SiemensRealOfTag;
                        rlt = CS7TcpClient.WriteFloat(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Value);
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                    }
                    else if (tag is SiemensArrayCharOfTag)
                    {
                        SiemensArrayCharOfTag ltag = tag as SiemensArrayCharOfTag;
                        rlt = CS7TcpClient.WriteString(
                            plcHandle,
                            (int)dbType,
                            dbNumber,
                            ltag.DB_Offset,
                            ltag.Length,
                            Encoding.ASCII.GetBytes(ltag.Value));
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}],待写入:[{ltag.Value}]");
                    }
                }
            }
            catch (Exception error)
            {
                throw new Exception(
                          $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                          $"Offset:[{tag.DB_Offset}]写入时发生错误,{error.Message}");
            }

            if (rlt != 0)
            {
                throw new Exception(
                          $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                          $"Offset:[{tag.DB_Offset}]写入失败,错误提示:[{rlt}]" +
                          $"[{GetErrorMessage(rlt)}]");
            }
        }
Esempio n. 5
0
        /// <summary>
        /// 将值回写到PLC中
        /// </summary>
        /// <param name="dbType">数据块类别</param>
        /// <param name="dbNumber">DB数据块编号</param>
        /// <param name="tag">西门子Tag对象</param>
        public void WriteToPLC(
            SiemensRegisterType dbType,
            int dbNumber,
            SiemensTag tag)
        {
            if (!isConnected)
            {
                isConnected = Connect();
            }

            OperateResult rlt = new OperateResult();

            try
            {
                lock (_lockObjet)
                {
                    string address =
                        $"{dbType.ToString()}{dbNumber}.{tag.DB_Offset}";
                    if (tag is SiemensBoolOfTag)
                    {
                        SiemensBoolOfTag ltag = tag as SiemensBoolOfTag;

                        if (!ltag.Name.Contains("MES_Heart_Beat"))
                        {
                            _log.Debug(
                                $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                                $"Offset:[{tag.DB_Offset}]Type[Bool],写入:[{ltag.Value}]");
                        }

                        address += $".{ltag.Position}";
                        rlt      = siemensTcpNet.Write(address, ltag.Value);
                    }
                    else if (tag is SiemensByteOfTag)
                    {
                        SiemensByteOfTag ltag = tag as SiemensByteOfTag;
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}]Type[Byte],写入:[{ltag.Value}]");
                        rlt = siemensTcpNet.Write(address, ltag.Value);
                    }
                    else if (tag is SiemensWordOfTag)
                    {
                        SiemensWordOfTag ltag = tag as SiemensWordOfTag;
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}]Type[Word],写入:[{ltag.Value}]");
                        rlt = siemensTcpNet.Write(address, ltag.Value);
                    }
                    else if (tag is SiemensIntOfTag)
                    {
                        SiemensIntOfTag ltag = tag as SiemensIntOfTag;
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}]Type[Int],写入:[{ltag.Value}]");
                        rlt = siemensTcpNet.Write(address, ltag.Value);
                    }
                    else if (tag is SiemensDWordOfTag)
                    {
                        SiemensDWordOfTag ltag = tag as SiemensDWordOfTag;
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}]Type[DWord],写入:[{ltag.Value}]");
                        rlt = siemensTcpNet.Write(address, ltag.Value);
                    }
                    else if (tag is SiemensRealOfTag)
                    {
                        SiemensRealOfTag ltag = tag as SiemensRealOfTag;
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}]Type[Real],写入:[{ltag.Value}]");
                        rlt = siemensTcpNet.Write(address, ltag.Value);
                    }
                    else if (tag is SiemensArrayCharOfTag)
                    {
                        SiemensArrayCharOfTag ltag = tag as SiemensArrayCharOfTag;
                        _log.Debug(
                            $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                            $"Offset:[{tag.DB_Offset}]Type[ArrayChar],写入:[{ltag.Value}]");
                        rlt =
                            siemensTcpNet.Write(
                                address,
                                Encoding.ASCII.GetBytes(ltag.Value));
                    }
                }
            }
            catch (Exception error)
            {
                throw new Exception(
                          $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                          $"Offset:[{tag.DB_Offset}]写入时发生错误,{error.Message}" +
                          $"Value[{tag.Value.ToString()}]");
            }

            if (rlt.ErrorCode != 0)
            {
                throw new Exception(
                          $"PLC:[{IPAddress}]:数据块[{dbNumber}]:Tag[{tag.Name}]:" +
                          $"Offset:[{tag.DB_Offset}]写入失败,错误提示:[{rlt.ErrorCode}]" +
                          $"[{rlt.Message}]");
            }
        }