private void ImportChildTagsRecursively(Tag parentTag, TcAdsSymbolInfo symbol, int adsPort) { while (symbol != null) { var tag = new Tag(); try { tag = BeckhoffHelper.ConvertSymbolToTag(symbol, adsPort); tag.Parent = parentTag; parentTag.Childs.Add(tag); } catch (TagException e) { Console.WriteLine("Cannot import tags online (will skip it): " + e); } if (symbol.SubSymbolCount > 0 && !symbol.IsPointer && !symbol.IsReference) { ImportChildTagsRecursively(tag, symbol.FirstSubSymbol, adsPort); } symbol = symbol.NextSymbol; } }
private Tag ImportTagWithChilds(TcAdsSymbolInfo symbol, int adsPort, HashSet <string> tagHashSet) { Tag tag = null; if (symbol == null) { return(tag); } try { tag = BeckhoffHelper.ConvertSymbolToTag(symbol, adsPort); } catch (TagException e) { _logger.Warn("Cannot import tags online (will skip it): " + e); return(tag); } // prevent circular reads (endless loop) by checking if the hashset already contains the tag if ((symbol.IsReference || symbol.IsPointer) && (!tag.MetaData.ReadPointer || tagHashSet.Contains(tag.GetPointerlessFullName()))) { return(tag); } if (tag.MetaData.ReadPointer) { tagHashSet.Add(tag.GetPointerlessFullName()); } tag.FullName(); TcAdsSymbolInfo subSymbol = symbol.FirstSubSymbol; while (subSymbol != null) { Tag subTag = ImportTagWithChilds(subSymbol, adsPort, tagHashSet); if (subTag != null) { tag.Childs.Add(subTag); subTag.Parent = tag; } subSymbol = subSymbol.NextSymbol; } return(tag); }
public Tag ImportTag(string name, int adsPort) { _logger.Debug(string.Format("Importing tag '{0}' on port '{1}", name, adsPort)); if (_twinCatClient == null) { return(null); } var symbol = _twinCatClient.ReadSymbolInfo(name); if (symbol == null) { return(null); } Tag result = BeckhoffHelper.ConvertSymbolToTag(symbol, adsPort); return(result); }
private object ReadNextDataType(string dataType, int bitSize, AdsBinaryReader binaryReader) { return(BeckhoffHelper.ReadDataType(dataType, bitSize, binaryReader)); }
private bool WriteToStream(AdsStream dataStream, Tag tag, object value) { var binaryWriter = new AdsBinaryWriter(dataStream); switch (tag.DataType) { case IEC61131_3_DataTypes.Boolean: if (value is string) { value = Boolean.Parse((string)value); } binaryWriter.Write((bool)value); break; case IEC61131_3_DataTypes.Byte: binaryWriter.Write((byte)value); break; case IEC61131_3_DataTypes.SInt: binaryWriter.Write(Convert.ToSByte(value)); break; case IEC61131_3_DataTypes.USInt: binaryWriter.Write(Convert.ToByte(value)); break; case IEC61131_3_DataTypes.UInt: binaryWriter.Write(Convert.ToUInt16(value)); break; case IEC61131_3_DataTypes.Int: binaryWriter.Write(Convert.ToInt16(value)); break; case IEC61131_3_DataTypes.DInt: binaryWriter.Write((int)value); break; case IEC61131_3_DataTypes.LInt: binaryWriter.Write(Convert.ToInt64(value)); break; case IEC61131_3_DataTypes.Real: binaryWriter.Write((float)value); break; case IEC61131_3_DataTypes.LReal: binaryWriter.Write((double)value); break; case IEC61131_3_DataTypes.Word: binaryWriter.Write(Convert.ToUInt16(value)); break; case IEC61131_3_DataTypes.DWord: binaryWriter.Write(Convert.ToUInt32(value)); break; case IEC61131_3_DataTypes.LWord: binaryWriter.Write(Convert.ToUInt64(value)); break; case IEC61131_3_DataTypes.ULInt: binaryWriter.Write(Convert.ToUInt64(value)); break; case IEC61131_3_DataTypes.UDInt: binaryWriter.Write(Convert.ToUInt32(value)); break; default: // handle STRINT DataType if (StructuredTextSyntaxRegexHelper.StringDataTypeRegex.IsMatch(tag.DataType)) { var tmpString = (string)value; var length = tag.BitSize / 8; if (tmpString.Length > length) { throw new TagException("string is exceeds max defined lenght of " + length, tag); } binaryWriter.WritePlcString((string)value, (int)dataStream.Length); break; } if (BeckhoffHelper.IsEnum(tag.DataType, tag.BitSize)) { binaryWriter.Write(Convert.ToInt16(value)); break; } switch (tag.BitSize) { case 1: if (value is string) { value = Boolean.Parse((string)value); } binaryWriter.Write((bool)value); break; case 8: binaryWriter.Write(Convert.ToByte(value)); break; case 16: binaryWriter.Write(Convert.ToUInt16(value)); break; case 32: binaryWriter.Write(Convert.ToUInt32(value)); break; case 64: binaryWriter.Write(Convert.ToUInt64(value)); break; default: return(false); } break; } return(true); }