示例#1
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)}]");
            }
        }
示例#2
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}]");
            }
        }