/// <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); }
/// <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); }
/// <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); }
/// <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)}]"); } }
/// <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}]"); } }