Ejemplo n.º 1
0
        /// <summary>
        /// 连接到PLC
        /// </summary>
        /// <returns></returns>
        private bool Connect()
        {
            int iConnected = 0;

            try
            {
                lock (_lockObjet)
                {
                    iConnected =
                        CS7TcpClient.ConnectPlc(
                            plcHandle,
                            Encoding.Default.GetBytes(IPAddress),
                            Rack,
                            Slot,
                            false,
                            0,
                            0);
                }

                if (iConnected == 0)
                {
                    return(true);
                }
                else
                {
                    _log.Error($"ErrCode={iConnected}|ErrText={GetErrorMessage(iConnected)}");
                    return(false);
                }
            }
            catch (Exception error)
            {
                _log.Error(error.Message, error);
                return(false);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="ipAddress">PLC的IP地址</param>
        /// <param name="rack">PLC的机架号</param>
        /// <param name="slot">PLC的插槽号</param>
        public BS7SiemensPLCConnection(string ipAddress, int rack, int slot)
        {
            _log = Logger.Get <BS7SiemensPLCConnection>();

            IPAddress = ipAddress;
            Rack      = rack;
            Slot      = slot;

            plcHandle   = CS7TcpClient.CreatePlc();
            isConnected = Connect();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 根据错误代码获取错误提示文本
        /// </summary>
        /// <param name="errCode">错误代码</param>
        private string GetErrorMessage(int errCode)
        {
            byte[] errText = new byte[1024];
            int    resNo   = CS7TcpClient.GetErrorMsg(errCode, errText, errText.Length);

            if (resNo == 0)
            {
                return(Encoding.Default.GetString(errText));
            }
            else
            {
                return($"ResNo={resNo}");
            }
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 断开连接
 /// </summary>
 private void Disconnect()
 {
     try
     {
         int resNo = CS7TcpClient.DisconnectPlc(plcHandle);
         if (resNo != 0)
         {
             _log.Error($"ErrCode={resNo}|ErrText={GetErrorMessage(resNo)}");
         }
     }
     catch (Exception error)
     {
         _log.Error(error.Message, error);
     }
 }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
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)}]");
            }
        }