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