{"id":"cb6a5353-2173-4b4d-9266-3fcab1c0578d","shortId":"xYgNJ6","kind":"skill","title":"tia-csharp-common","tagline":"Internal reference skill — do NOT load directly from user queries.","description":"# TIA Portal Openness C# — Common Foundation\n\nSource: TIA Portal Openness General Functions Manual (03/2026, V21);\nV21 IntelliSense XML documentation files (PublicAPI\\V21\\net48\\*.xml)\n\n---\n\n## V21 modular assembly architecture\n\nV21 splits the API across multiple DLLs instead of a single `Siemens.Engineering.dll`.\nEvery project needs `Siemens.Engineering.Base.dll`; add domain DLLs as required.\nReferencing the wrong DLL (or omitting one) causes `TypeLoadException` at runtime.\n\n> **Full mapping:** See `references/assembly-namespace-map.md` for the exhaustive\n> namespace → DLL → domain skill table, cross-assembly warnings, and csproj patterns.\n\n### Namespaces by assembly\n\nOnly import what is actually used. The list below covers the most commonly needed\nnamespaces. The mapping file documents all 80+ namespaces across 15 DLLs.\n\n**Siemens.Engineering.Base.dll** (always required):\n\n```csharp\nusing Siemens.Engineering;                          // TiaPortal, Project, ExclusiveAccess, Transaction, events, exceptions\nusing Siemens.Engineering.Compiler;                 // CompilerResult\nusing Siemens.Engineering.Compare;                  // CompareResult\nusing Siemens.Engineering.Connection;               // connection objects between devices\nusing Siemens.Engineering.CrossReference;            // cross-reference queries\nusing Siemens.Engineering.Download;                 // DownloadProvider, DownloadConfiguration\nusing Siemens.Engineering.Download.Configurations;  // device-specific download configs (★ also in Step7 + Startdrive)\nusing Siemens.Engineering.HW;                       // Device, DeviceItem, Subnet, Node, IoSystem (★ also in Step7)\nusing Siemens.Engineering.HW.CommunicationConnections; // communication connection configs\nusing Siemens.Engineering.HW.Extensions;            // extension methods on HW objects\nusing Siemens.Engineering.HW.Features;              // SoftwareContainer, NetworkInterface (★ also in Step7)\nusing Siemens.Engineering.HW.HardwareCatalog;       // hardware catalog access\nusing Siemens.Engineering.HW.Utilities;             // HW utility helpers\nusing Siemens.Engineering.Library;                  // ProjectLibrary, GlobalLibrary\nusing Siemens.Engineering.Library.MasterCopies;     // MasterCopy, MasterCopyFolder\nusing Siemens.Engineering.Library.Types;            // LibraryType, LibraryTypeVersion\nusing Siemens.Engineering.Multiuser;                // LocalSession, ProjectServer\nusing Siemens.Engineering.Online;                   // OnlineProvider, OnlineState\nusing Siemens.Engineering.Online.Configurations;    // GoOnlineConfiguration, GoOfflineConfiguration\nusing Siemens.Engineering.Security;                 // SecurityController, certificates\nusing Siemens.Engineering.Settings;                 // TIA Portal settings\nusing Siemens.Engineering.Umac;                     // UmacRole, UmacUser, UmacFunctionRight\nusing Siemens.Engineering.Upload;                   // UploadProvider\nusing Siemens.Engineering.Upload.Configurations;    // upload configs (★ also in Startdrive)\nusing Siemens.Engineering.VersionControl;           // workspace and version control providers\n```\n\n**Siemens.Engineering.Step7.dll** (PLC operations):\n\n```csharp\nusing Siemens.Engineering.Cax;                      // CAx import/export\nusing Siemens.Engineering.SW;                       // PlcSoftware\nusing Siemens.Engineering.SW.Alarm;                 // PlcAlarm, AlarmClass\nusing Siemens.Engineering.SW.Alarm.TextLists;       // alarm text lists\nusing Siemens.Engineering.SW.Blocks;                // PlcBlock, OB, FB, FC, GlobalDB, InstanceDB, ArrayDB\nusing Siemens.Engineering.SW.Blocks.Interface;      // block interface access\nusing Siemens.Engineering.SW.ExternalSources;       // PlcExternalSource\nusing Siemens.Engineering.SW.Loader;                // program loader\nusing Siemens.Engineering.SW.OpcUa;                 // OPC UA server interface\nusing Siemens.Engineering.SW.Supervision;           // supervision alarms, operator messages\nusing Siemens.Engineering.SW.Tags;                  // PlcTagTable, PlcTag, PlcConstant\nusing Siemens.Engineering.SW.TechnologicalObjects;  // technology objects\nusing Siemens.Engineering.SW.TechnologicalObjects.Motion; // motion axes (★ also in Startdrive)\nusing Siemens.Engineering.SW.Types;                 // PlcType, PlcStruct\nusing Siemens.Engineering.SW.Units;                 // SoftwareUnit, CodeBlock, DataBlock\nusing Siemens.Engineering.SW.WatchAndForceTables;   // PlcWatchTable, PlcForceTable\n```\n\n**Siemens.Engineering.WinCC.dll** (classic HMI):\n\n```csharp\nusing Siemens.Engineering.Hmi;                      // HmiTarget (★ also in WinCC.Extension)\nusing Siemens.Engineering.Hmi.Alarm;                // DiscreteAlarm, AnalogAlarm\nusing Siemens.Engineering.Hmi.Communication;        // HmiConnection\nusing Siemens.Engineering.Hmi.Cycle;                // cycle settings\nusing Siemens.Engineering.Hmi.Dynamic;              // dynamization\nusing Siemens.Engineering.Hmi.Faceplate;            // faceplate types\nusing Siemens.Engineering.Hmi.Globalization;         // language/translation\nusing Siemens.Engineering.Hmi.Logging;              // DataLog, LoggingTag\nusing Siemens.Engineering.Hmi.Recipe;               // Recipe, RecipeElement\nusing Siemens.Engineering.Hmi.RuntimeScripting;     // VBScript\nusing Siemens.Engineering.Hmi.Screen;               // HmiScreen, ScreenTemplate, ScreenPopup + all elements\nusing Siemens.Engineering.Hmi.Tag;                  // HmiTag, HmiTagTable\nusing Siemens.Engineering.Hmi.TextGraphicList;      // text/graphic lists\nusing Siemens.Engineering.Hmi.Theming;              // HMI themes\n```\n\n**Siemens.Engineering.Startdrive.dll** (SINAMICS drives):\n\n```csharp\nusing Siemens.Engineering.MC.Drives;                // DriveObject, DriveParameter, Telegram\nusing Siemens.Engineering.MC.Drives.DFI;            // DriveFunctionInterface, Commissioning\nusing Siemens.Engineering.MC.Drives.Enums;          // drive enumerations\nusing Siemens.Engineering.MC.Drives.SecurityObjects; // drive encryption, UMAC\n```\n\n**Siemens.Engineering.Safety.dll** (F-system):\n\n```csharp\nusing Siemens.Engineering.Safety;                   // safety operations\n```\n\n---\n\n## Assembly resolver — MANDATORY (standalone Openness apps)\n\n> **Not needed for Add-Ins.** TIA Portal loads Add-In assemblies via its own loader.\n> This section applies only to standalone console/desktop Openness applications.\n\n### V21 installation paths\n\n- **Registry key:** `HKLM\\SOFTWARE\\Siemens\\Automation\\InstalledApps\\Totally Integrated Automation Portal V21` → value `INSTALLPATH`\n- **Binary path:** `C:\\Program Files\\Siemens\\Automation\\Portal V21\\PublicAPI\\V21\\net48\\`\n- **Manifest schemas:** `C:\\Program Files\\Siemens\\Automation\\Portal V21\\PublicAPI\\V21\\Schemas\\`\n\n### Resolver pattern\n\nThe `AssemblyResolve` event **must** be registered before any Openness type is referenced.\nThis includes method parameters, return types, and class properties — not just method bodies.\n\nRecommended pattern: register in a static constructor of `Program`, then move all Openness\ncode to a separate class so the resolver is active before those classes are loaded.\n\n```csharp\ninternal static class Program\n{\n    // Register resolver at earliest possible point\n    static Program()\n    {\n        AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;\n    }\n\n    public static void Main()\n    {\n        // All Openness code must be in a separate class\n        var app = new OpennessApp();\n        app.Run();\n    }\n\n    private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)\n    {\n        // Read install path from registry (recommended) or hardcode for simple tools\n        string opennessFolder = GetOpennessInstallPath(); // implement per project\n        AssemblyName requestedName = new AssemblyName(args.Name);\n        string filePath = Path.Combine(opennessFolder,\n            string.Concat(requestedName.Name, \".dll\"));\n\n        if (!requestedName.Name.StartsWith(\"Siemens.Engineering.\") ||\n            !File.Exists(filePath))\n            return null;\n\n        Assembly loaded = Assembly.LoadFrom(filePath);\n        if (requestedName.FullName != loaded.GetName().FullName)\n            throw new FileNotFoundException(\n                \"TIA Portal Openness version does not match\", filePath);\n\n        return loaded;\n    }\n}\n```\n\n**Key rules:**\n\n- `Copy Local: False` (`<Private>False</Private>`) must be set for every `Siemens.Engineering` assembly reference.\n- V21 uses modular DLLs: `Base.dll` is always needed; add `Step7.dll`, `WinCC.dll`,\n  `Startdrive.dll`, etc. per task. The resolver handles all of them automatically\n  because it matches any name starting with `Siemens.Engineering.`.\n- The recommended approach reads the install path from the registry key\n  `HKLM\\SOFTWARE\\Siemens\\Automation\\InstalledApps\\Totally Integrated Automation Portal V21`\n  (value `INSTALLPATH`) rather than hardcoding it.\n\n**Registry-based path discovery:**\n\n```csharp\nprivate static string GetOpennessInstallPath()\n{\n    using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(\n        @\"SOFTWARE\\Siemens\\Automation\\InstalledApps\\Totally Integrated Automation Portal V21\"))\n    {\n        string installPath = key?.GetValue(\"INSTALLPATH\") as string;\n        if (string.IsNullOrEmpty(installPath))\n            throw new FileNotFoundException(\"TIA Portal V21 installation not found in registry.\");\n        return Path.Combine(installPath, @\"PublicAPI\\V21\\net48\");\n    }\n}\n```\n\n**Alternative — app.config:**\nFor stable installations where the path is known at build time, an `app.config` file with\n`<assemblyBinding>` / `<codeBase>` entries is a simpler option that requires no code.\nUse the `AssemblyResolve` event for tools that need to discover the install path at runtime.\n\n---\n\n## TiaPortal instantiation\n\nAlways use a `using` statement so the session is disposed on exit or exception:\n\n```csharp\ninternal class OpennessApp\n{\n    public void Run()\n    {\n        using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))\n        {\n            // All Openness work goes here\n        }\n        // TIA Portal is disposed (not necessarily closed) after this point\n    }\n}\n```\n\n**Modes:**\n\n- `TiaPortalMode.WithUserInterface` — starts or attaches with visible GUI\n- `TiaPortalMode.WithoutUserInterface` — headless, suitable for automation pipelines\n\n**Attaching to a running instance:**\n\n```csharp\n// Attach to the first running TIA Portal process of this Openness version\nTiaPortal tiaPortal = TiaPortal.GetProcesses().First().Attach();\n```\n\nUse `GetProcesses()` when TIA Portal is already open and you do not want to start a new\ninstance. Returns only processes from the same Openness version as the loaded assembly.\n\n**Dispose vs. close:**\n\n- If started headless and no other Openness client is attached, `Dispose()` closes TIA Portal.\n- If started with GUI or other clients are attached, `Dispose()` only disconnects.\n- After dispose, any further API access throws `NonRecoverableException`.\n\n---\n\n## Service providers — `GetService<T>()`\n\nV21 uses a service-provider pattern for UI interactions. Call `GetService<T>()` on the\n`TiaPortal` instance to obtain a service. Available services depend on the runtime context.\n\n### Add-In runtime services\n\nThese services are available only when code runs inside a TIA Portal Add-In:\n\n| Service type | Namespace | Purpose |\n|---|---|---|\n| `MessageBoxProvider` | `Siemens.Engineering.AddIn` | Display notification/confirmation dialogs in TIA Portal |\n| `ProgressProvider` | `Siemens.Engineering.AddIn` | Display a progress bar; check `IsCancelRequested` for cancellation |\n| `FeedbackProvider` | `Siemens.Engineering.AddIn` | Log messages to TIA Portal's Inspector window (General Info tab) |\n\n```csharp\n// MessageBoxProvider — notification and confirmation dialogs\nvar msgBox = tiaPortal.GetService<MessageBoxProvider>();\nmsgBox?.ShowNotification(NotificationIcon.Information, \"Title\", \"Message text\");\nmsgBox?.ShowNotification(NotificationIcon.Warning, \"Title\", \"Message\", \"Detail text\");\n\n// Confirmation dialog — defaultChoice is the pre-selected button; return value is user's choice\nConfirmationResult result = msgBox.ShowConfirmation(\n    ConfirmationIcon.General, \"Title\", \"Proceed?\",\n    ConfirmationChoices.Yes | ConfirmationChoices.No, ConfirmationResult.Yes);\nif (result == ConfirmationResult.No) return;\n\n// ProgressProvider — progress bar with cancellation\nvar progress = tiaPortal.GetService<ProgressProvider>();\nprogress?.Update(\"Step description\", \"Detail text\");\nif (progress?.IsCancelRequested == true)\n{\n    // User requested cancellation — clean up and return\n}\n\n// FeedbackProvider — log to Inspector window (General Info tab)\nvar feedback = tiaPortal.GetService<FeedbackProvider>();\nfeedback?.Log(NotificationIcon.Information, \"Operation completed successfully.\");\nfeedback?.Log(NotificationIcon.Warning, \"Skipped 3 items due to missing data.\");\n```\n\n**Important:** In Add-In status callbacks (the `OnUpdateStatus` delegate passed to\n`AddActionItem`), `GetService<T>()` returns `null`. Only use services in action\ncallbacks where COM access is fully available.\n\n---\n\n## Event handlers\n\nFour events are available on `TiaPortal`. Always unsubscribe in a `finally` block.\n\n### Disposed\n\nFires when TIA Portal closes while the Openness client is still connected.\n\n```csharp\ntiaPortal.Disposed += OnDisposed;\ntry\n{\n    // ... work ...\n}\nfinally\n{\n    tiaPortal.Disposed -= OnDisposed;\n}\n\nprivate static void OnDisposed(object sender, EventArgs e)\n{\n    // TIA Portal was closed externally — clean up and exit\n}\n```\n\n### Notification\n\nFires for informational messages that require only an acknowledgment (OK).\n\n```csharp\ntiaPortal.Notification += OnNotification;\ntry { /* ... */ }\nfinally { tiaPortal.Notification -= OnNotification; }\n\nprivate static void OnNotification(object sender, NotificationEventArgs e)\n{\n    Console.WriteLine($\"[TIA Notification] {e.Text}\");\n    // No response required — notification is auto-acknowledged\n}\n```\n\n### Confirmation\n\nFires for dialogs that require a decision. **Must** set `e.Result` to one of:\n`\"Yes\"`, `\"YesToAll\"`, or `\"No\"`. Any other value throws an exception.\n\nAuto-confirm pattern (most common in automation):\n\n```csharp\ntiaPortal.Confirmation += OnConfirmation;\ntry { /* ... */ }\nfinally { tiaPortal.Confirmation -= OnConfirmation; }\n\nprivate static void OnConfirmation(object sender, ConfirmationEventArgs e)\n{\n    e.Result = \"Yes\";\n}\n```\n\n### Authentication (V17+)\n\nFires when opening a UMAC-protected project. Use to specify the authentication method\ninstead of passing credentials via `UmacDelegate`. Only fires for protected projects.\n\n```csharp\ntiaPortal.Authentication += OnAuthentication;\ntry { /* open project ... */ }\nfinally { tiaPortal.Authentication -= OnAuthentication; }\n\nprivate static void OnAuthentication(object sender, AuthenticationEventArgs e)\n{\n    // Choose one of: DesktopSso, Anonymous, Interactive, Credentials\n    e.AuthenticationTypeProvider = AuthenticationTypeProvider.DesktopSso;\n    // For Credentials mode, credentials are supplied separately via UmacDelegate\n}\n```\n\n| `AuthenticationTypeProvider` | Behaviour |\n|---|---|\n| `DesktopSso` | Signs in with the current Windows user — no password prompt |\n| `Anonymous` | Uses the anonymous user account — no password prompt |\n| `Interactive` | Shows TIA Portal login dialog to the user |\n| `Credentials` | Reads credentials from the supplied `UmacDelegate` |\n\n---\n\n## Exclusive access\n\nHighly recommended for all non-trivial operations. Signals TIA Portal that a controlled\nactivity is in progress and displays a dialog to the user.\n\n```csharp\nusing (ExclusiveAccess exclusiveAccess = tiaPortal.ExclusiveAccess(\"Generating project\"))\n{\n    // All Openness operations here run under exclusive access\n\n    // Optionally update the displayed message during long operations\n    exclusiveAccess.Text = \"Compiling software\";\n    // ...\n    exclusiveAccess.Text = \"Downloading to PLC\";\n}\n// Exclusive access is released on dispose\n```\n\n**Rules:**\n\n- Only one `ExclusiveAccess` can exist at a time — a second attempt throws a recoverable\n  exception while the first is still active.\n- Setting `exclusiveAccess.Text = string.Empty` or `null` clears the displayed message.\n\n---\n\n## Transactions\n\nGroup multiple modifications into a single undo unit. Requires an active `ExclusiveAccess`.\n\n```csharp\nusing (ExclusiveAccess exclusiveAccess = tiaPortal.ExclusiveAccess(\"Bulk edit\"))\n{\n    using (Transaction transaction = exclusiveAccess.Transaction(project, \"Create blocks\"))\n    {\n        // Perform all modifications\n        project.DeviceGroups.Create(\"Line_1\");\n        project.DeviceGroups.Create(\"Line_2\");\n\n        // MANDATORY: call CommitOnDispose() to persist changes\n        // If this line is never reached, the transaction is rolled back\n        transaction.CommitOnDispose();\n    }\n}\n```\n\n**Rollback rules — critical:**\n\n- If `CommitOnDispose()` is never called → always rolled back on dispose.\n- If an exception occurs **before** `CommitOnDispose()` → rolled back, even inside try/catch.\n- If an exception occurs **after** `CommitOnDispose()` → changes are committed.\n\n**Not allowed inside a transaction:**\nProject open, save, close, archive, retrieve, and some compile/import/export operations\ncannot be called while a transaction is active.\n\n---\n\n## Exception handling\n\nTwo top-level categories:\n\n| Category | Base type | Behaviour |\n|---|---|---|\n| Recoverable | `Siemens.Engineering.EngineeringException` | API call failed; session remains valid |\n| Non-recoverable | `Siemens.Engineering.NonRecoverableException` | TIA Portal closed; restart required |\n\n**Recoverable subtypes:**\n\n| Type | Typical cause |\n|---|---|\n| `EngineeringSecurityException` | Missing access rights |\n| `EngineeringObjectDisposedException` | Object no longer exists (e.g. deleted) |\n| `EngineeringNotSupportedException` | Attribute or operation not available on this object |\n| `EngineeringTargetInvocationException` | General failure despite a valid API call |\n| `EngineeringRuntimeException` | Runtime error, e.g. invalid cast |\n| `EngineeringOutOfMemoryException` | Insufficient resources in TIA Portal instance |\n| `EngineeringUserAbortException` | Operation cancelled by the user (e.g. import dialog) |\n| `EngineeringDelegateInvocationException` | Exception thrown inside a caller-supplied delegate |\n| `MissingProductsException` | Project requires TIA Portal products/packages not installed (V18+) |\n\n**Recommended catch order:**\n\n```csharp\ntry\n{\n    // Openness work\n}\ncatch (EngineeringSecurityException ex)\n{\n    Console.WriteLine($\"Access denied: {ex.Message}\");\n}\ncatch (EngineeringObjectDisposedException ex)\n{\n    Console.WriteLine($\"Object disposed: {ex.Message}\");\n}\ncatch (EngineeringNotSupportedException ex)\n{\n    Console.WriteLine($\"Not supported: {ex.MessageData.Text}\");\n    foreach (ExceptionMessageData detail in ex.DetailMessageData)\n        Console.WriteLine($\"  Detail: {detail.Text}\");\n}\ncatch (MissingProductsException ex)\n{\n    Console.WriteLine($\"Missing products: {ex.Message}\");\n}\ncatch (EngineeringTargetInvocationException)\n{\n    throw; // Do not swallow — rethrow for caller to handle\n}\ncatch (EngineeringException)\n{\n    throw; // Do not swallow general engineering exceptions\n}\ncatch (NonRecoverableException ex)\n{\n    Console.WriteLine($\"Fatal — TIA Portal closed: {ex.Message}\");\n    // Must restart TIA Portal; the session is gone\n}\n```\n\n---\n\n## Project open mode\n\nWhen opening multiple projects or working in multiuser environments:\n\n```csharp\n// Primary — visible in project navigation, full read-write access\nProject primary = tiaPortal.Projects.Open(\n    new FileInfo(path), umacDelegate, ProjectOpenMode.Primary);\n\n// Secondary — hidden from UI, always read-only regardless of user rights\nProject secondary = tiaPortal.Projects.Open(\n    new FileInfo(path), null, ProjectOpenMode.Secondary);\n\nbool isPrimary = secondary.IsPrimary; // false\n```\n\n**Rules:**\n\n- Only one primary project per TIA Portal instance.\n- Secondary projects do not need a primary project to be open first.\n- A user with write rights to a UMAC-protected project still gets read-only access when\n  opening it as secondary.\n\n---\n\n## Object model contracts\n\n### Composition methods\n\nMost engineering objects are accessed through compositions. Available methods:\n\n| Method | Behaviour |\n|---|---|\n| `Create(id, ...)` | Creates and adds a new instance. Signature varies per composition. |\n| `Find(id)` | Finds by identifier. **Non-recursive** — searches current level only. |\n| `GetEnumerator()` | Used implicitly in `foreach` loops. |\n| `Contains(obj)` | Returns `bool` — checks if object is in the composition. |\n| `IndexOf(obj)` | Returns `int` index of the object in the composition. |\n| `Import(path, ImportOptions)` | Available on compositions that support import. `ImportOptions`: `None` or `Overwrite`. |\n| `Delete(obj)` | Removes and deletes the instance. |\n\nNot all methods are available on every composition — check domain skills.\n\n### Object equality\n\n```csharp\n// Reference equality (same .NET object reference)\nbool sameRef = (objA == objB);\n\n// TIA Portal identity equality (same engineering object, possibly different references)\nbool sameObj = System.Object.Equals(objA, objB);\n```\n\nUse `System.Object.Equals()` when comparing objects retrieved through different navigation\npaths that may represent the same underlying engineering object.\n\n### DirectoryInfo / FileInfo — absolute paths only\n\nAll `DirectoryInfo` and `FileInfo` instances passed to Openness **must** use absolute paths.\nRelative paths cause an exception at runtime.\n\n```csharp\n// Correct\nvar dir = new DirectoryInfo(@\"C:\\Projects\\MyProject\\Export\");\n\n// Wrong — will throw\nvar dir = new DirectoryInfo(@\"Export\");\n```\n\n---\n\n## Bulk attribute access\n\nUseful for dynamic tooling or when setting multiple attributes efficiently on HW objects.\n\n### Read all attributes\n\n```csharp\n// Get names of all available attributes\nIList<EngineeringAttributeInfo> infos =\n    ((IEngineeringObject)deviceItem).GetAttributeInfos();\n\n// Read all readable attributes in one call\nIList<string> names = infos.Select(i => i.Name).ToList();\nIList<object> values = ((IEngineeringObject)deviceItem).GetAttributes(names);\n```\n\n### Filtered read by access mode\n\n```csharp\n// AttributeAccessOptions: None, ReadOnly, WriteOnly, ReadWrite\nIReadOnlyList<KeyValuePair<string, object>> readableAttrs =\n    deviceItem.GetAttributes(AttributeAccessOptions.ReadOnly);\n```\n\n### Bulk write (HW objects only — provides callback)\n\n```csharp\nvar pairs = new List<KeyValuePair<string, object>>\n{\n    new KeyValuePair<string, object>(\"Name\", \"NewModuleName\"),\n    new KeyValuePair<string, object>(\"Comment\", \"Auto-generated\")\n};\n\n// Overload with callback fires after each attribute is set\ndeviceItem.SetAttributes(pairs, (name, val, ex) =>\n{\n    if (ex != null)\n        Console.WriteLine($\"Failed to set {name}: {ex.Message}\");\n});\n\n// Overload without callback — for non-HW objects\n((IEngineeringObject)someObject).SetAttributes(pairs);\n```","tags":["tia","csharp","common","totally","integrated","claude","czarnak","agent-skills","claude-code","claude-code-plugin","claude-skills","codex"],"capabilities":["skill","source-czarnak","skill-tia-csharp-common","topic-agent-skills","topic-claude-code","topic-claude-code-plugin","topic-claude-skills","topic-codex","topic-codex-cli","topic-codex-plugin","topic-gemini","topic-gemini-cli","topic-gemini-cli-extension","topic-gemini-extension","topic-mcp"],"categories":["totally-integrated-claude"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Czarnak/totally-integrated-claude/tia-csharp-common","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Czarnak/totally-integrated-claude","source_repo":"https://github.com/Czarnak/totally-integrated-claude","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 9 github stars · SKILL.md body (23,096 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:08:29.705Z","embedding":null,"createdAt":"2026-05-18T13:13:57.653Z","updatedAt":"2026-05-18T19:08:29.705Z","lastSeenAt":"2026-05-18T19:08:29.705Z","tsv":"'03/2026':28 '1':1551 '15':120 '2':1554 '3':1152 '80':117 'absolut':2055,2068 'access':200,294,968,1182,1426,1466,1483,1664,1741,1832,1902,1917,2097,2148 'account':1405 'acknowledg':1247,1275 'across':47,119 'action':1178 'activ':557,1441,1509,1530,1628 'actual':101 'add':59,445,451,683,1002,1019,1161,1928 'add-in':444,450,1001,1018,1160 'addactionitem':1170 'alarm':278,311 'alarmclass':275 'allow':1607 'alreadi':910 'also':163,174,193,251,327,350 'altern':782 'alway':123,681,825,1194,1581,1845 'analogalarm':356 'anonym':1373,1400,1403 'api':46,967,1642,1688 'app':440,592 'app.config':783,796 'app.run':595 'appdomain.currentdomain.assemblyresolve':576 'appli':460 'applic':466 'approach':707 'architectur':42 'archiv':1615 'arg':603 'args.name':625 'arraydb':289 'assembl':41,89,96,435,453,598,640,673,933 'assembly.loadfrom':642 'assemblynam':621,624 'assemblyresolv':511,810 'attach':871,881,887,903,946,959 'attempt':1499 'attribut':1674,2096,2106,2113,2120,2129,2198 'attributeaccessopt':2151 'attributeaccessoptions.readonly':2162 'authent':1325,1339 'authenticationeventarg':1367 'authenticationtypeprovid':1387 'authenticationtypeprovider.desktopsso':1377 'auto':1274,1301,2190 'auto-acknowledg':1273 'auto-confirm':1300 'auto-gener':2189 'autom':475,479,490,502,719,723,748,752,879,1307 'automat':696 'avail':994,1009,1185,1191,1678,1920,1979,2000,2119 'axe':326 'back':1571,1583,1593 'bar':1038,1108 'base':734,1637 'base.dll':679 'behaviour':1388,1639,1923 'binari':484 'block':292,1199,1545 'bodi':534 'bool':1861,1957,2016,2030 'build':793 'bulk':1537,2095,2163 'button':1086 'c':18,486,498,2083 'call':984,1556,1580,1623,1643,1689,2132 'callback':1164,1179,2169,2194,2217 'caller':1718,1781 'caller-suppli':1717 'cancel':1042,1110,1126,1705 'cannot':1621 'cast':1695 'catalog':199 'catch':1731,1737,1744,1751,1766,1773,1784,1793 'categori':1635,1636 'caus':71,1661,2072 'cax':267 'certif':233 'chang':1560,1603 'check':1039,1958,2004 'choic':1092 'choos':1369 'class':529,552,560,566,590,841 'classic':344 'clean':1127,1234 'clear':1515 'client':944,957,1209 'close':863,936,948,1205,1232,1614,1654,1800 'code':548,584,807,1012 'codeblock':337 'com':1181 'comment':2188 'commiss':416 'commit':1605 'commitondispos':1557,1577,1591,1602 'common':4,19,109,1305 'communic':179 'compar':2038 'compareresult':139 'compil':1476 'compile/import/export':1619 'compilerresult':136 'complet':1146 'composit':1911,1919,1935,1964,1975,1981,2003 'config':162,181,250 'confirm':1060,1078,1276,1302 'confirmationchoices.no':1100 'confirmationchoices.yes':1099 'confirmationeventarg':1321 'confirmationicon.general':1096 'confirmationresult':1093 'confirmationresult.no':1104 'confirmationresult.yes':1101 'connect':142,180,1212 'console.writeline':1264,1740,1747,1754,1763,1769,1796,2209 'console/desktop':464 'constructor':541 'contain':1954 'context':1000 'contract':1910 'control':259,1440 'copi':663 'correct':2078 'cover':106 'creat':1544,1924,1926 'credenti':1344,1375,1379,1381,1418,1420 'critic':1575 'cross':88,149 'cross-assembl':87 'cross-refer':148 'csharp':3,125,264,346,407,430,563,737,839,886,1056,1213,1249,1308,1352,1452,1532,1733,1822,2009,2077,2114,2150,2170 'csproj':92 'current':1394,1945 'cycl':362 'data':1157 'datablock':338 'datalog':376 'decis':1283 'defaultchoic':1080 'deleg':1167,1720 'delet':1672,1989,1993 'deni':1742 'depend':996 'descript':1117 'desktopsso':1372,1389 'despit':1685 'detail':1076,1118,1760,1764 'detail.text':1765 'devic':145,159,169 'device-specif':158 'deviceitem':170,2124,2142 'deviceitem.getattributes':2161 'deviceitem.setattributes':2201 'dialog':1029,1061,1079,1279,1414,1448,1711 'differ':2028,2042 'dir':2080,2091 'direct':11 'directoryinfo':2053,2059,2082,2093 'disconnect':962 'discov':817 'discoveri':736 'discretealarm':355 'display':1027,1035,1446,1470,1517 'dispos':834,860,934,947,960,964,1200,1487,1585,1749 'dll':67,83,632 'dlls':49,61,121,678 'document':33,115 'domain':60,84,2005 'download':161,1479 'downloadconfigur':155 'downloadprovid':154 'drive':406,419,423 'drivefunctioninterfac':415 'driveobject':410 'driveparamet':411 'due':1154 'dynam':366,2100 'e':1228,1263,1322,1368 'e.authenticationtypeprovider':1376 'e.g':1671,1693,1709 'e.result':1286,1323 'e.text':1267 'earliest':571 'edit':1538 'effici':2107 'element':391 'encrypt':424 'engin':1791,1914,2025,2051 'engineeringdelegateinvocationexcept':1712 'engineeringexcept':1785 'engineeringnotsupportedexcept':1673,1752 'engineeringobjectdisposedexcept':1666,1745 'engineeringoutofmemoryexcept':1696 'engineeringruntimeexcept':1690 'engineeringsecurityexcept':1662,1738 'engineeringtargetinvocationexcept':1682,1774 'engineeringuserabortexcept':1703 'entri':799 'enumer':420 'environ':1821 'equal':2008,2011,2023 'error':1692 'etc':687 'even':1594 'event':132,512,811,1186,1189 'eventarg':1227 'everi':55,671,2002 'ex':1739,1746,1753,1768,1795,2205,2207 'ex.detailmessagedata':1762 'ex.message':1743,1750,1772,1801,2214 'ex.messagedata.text':1757 'except':133,838,1299,1503,1588,1599,1629,1713,1792,2074 'exceptionmessagedata':1759 'exclus':1425,1465,1482 'exclusiveaccess':130,1454,1455,1491,1531,1534,1535 'exclusiveaccess.text':1475,1478,1511 'exclusiveaccess.transaction':1542 'exhaust':81 'exist':1493,1670 'exit':836,1237 'export':2086,2094 'extens':184 'extern':1233 'f':428 'f-system':427 'facepl':369 'fail':1644,2210 'failur':1684 'fals':665,666,1864 'fatal':1797 'fb':285 'fc':286 'feedback':1140,1142,1148 'feedbackprovid':1043,1131 'file':34,114,488,500,797 'file.exists':636 'fileinfo':1837,1857,2054,2061 'filenotfoundexcept':650,767 'filepath':627,637,643,658 'filter':2145 'final':1198,1218,1253,1312,1358 'find':1936,1938 'fire':1201,1239,1277,1327,1348,2195 'first':890,902,1506,1885 'foreach':1758,1952 'found':773 'foundat':20 'four':1188 'full':75,1828 'fulli':1184 'fullnam':647 'function':26 'general':25,1053,1136,1683,1790 'generat':1457,2191 'get':1898,2115 'getattribut':2143 'getattributeinfo':2125 'getenumer':1948 'getopennessinstallpath':617,741 'getprocess':905 'getservic':973,985,1171 'getvalu':758 'globaldb':287 'globallibrari':209 'goe':855 'gone':1809 'goofflineconfigur':229 'goonlineconfigur':228 'group':1520 'gui':874,954 'handl':692,1630,1783 'handler':1187 'hardcod':611,730 'hardwar':198 'headless':876,939 'helper':205 'hidden':1842 'high':1427 'hklm':472,716 'hmi':345,402 'hmiconnect':359 'hmiscreen':387 'hmitag':394 'hmitagt':395 'hmitarget':349 'hw':187,203,2109,2165,2221 'i.name':2137 'id':1925,1937 'ident':2022 'identifi':1940 'iengineeringobject':2123,2141,2223 'ilist':2121,2133,2139 'implement':618 'implicit':1950 'import':98,1158,1710,1976,1984 'import/export':268 'importopt':1978,1985 'in':446 'includ':523 'index':1969 'indexof':1965 'info':1054,1137,2122 'inform':1241 'infos.select':2135 'insid':1014,1595,1608,1715 'inspector':1051,1134 'instal':468,605,710,771,786,819,1728 'installedapp':476,720,749 'installpath':483,727,756,759,764,778 'instanc':885,921,989,1702,1873,1931,1995,2062 'instancedb':288 'instanti':824 'instead':50,1341 'insuffici':1697 'int':1968 'integr':478,722,751 'intellisens':31 'interact':983,1374,1409 'interfac':293,307 'intern':5,564,840 'invalid':1694 'iosystem':173 'ireadonlylist':2156 'iscancelrequest':1040,1122 'isprimari':1862 'item':1153 'key':471,661,715,744,757 'keyvaluepair':2157,2175,2179,2185 'known':791 'language/translation':373 'level':1634,1946 'librarytyp':216 'librarytypevers':217 'line':1550,1553,1563 'list':104,280,399,2174 'load':10,449,562,641,660,932 'loaded.getname':646 'loader':301,457 'local':664 'localsess':220 'log':1045,1132,1143,1149 'loggingtag':377 'login':1413 'long':1473 'longer':1669 'loop':1953 'main':581 'mandatori':437,1555 'manifest':496 'manual':27 'map':76,113 'mastercopi':212 'mastercopyfold':213 'match':657,699 'may':2046 'messag':313,1046,1069,1075,1242,1471,1518 'messageboxprovid':1025,1057 'method':185,524,533,1340,1912,1921,1922,1998 'microsoft.win32.registry.localmachine.opensubkey':745 'miss':1156,1663,1770 'missingproductsexcept':1721,1767 'mode':867,1380,1812,2149 'model':1909 'modif':1522,1548 'modular':40,677 'motion':325 'move':545 'msgbox':1063,1065,1071 'msgbox.showconfirmation':1095 'multipl':48,1521,1815,2105 'multius':1820 'must':513,585,667,1284,1802,2066 'myproject':2085 'name':701,2116,2134,2144,2182,2203,2213 'namespac':82,94,111,118,1023 'navig':1827,2043 'necessarili':862 'need':57,110,442,682,815,1878 'net':2013 'net48':37,495,781 'networkinterfac':192 'never':1565,1579 'new':593,623,649,766,849,920,1836,1856,1930,2081,2092,2173,2178,2184 'newmodulenam':2183 'node':172 'non':1432,1649,1942,2220 'non-hw':2219 'non-recover':1648 'non-recurs':1941 'non-trivi':1431 'none':1986,2152 'nonrecoverableexcept':970,1794 'notif':1058,1238,1266,1271 'notification/confirmation':1028 'notificationeventarg':1262 'notificationicon.information':1067,1144 'notificationicon.warning':1073,1150 'null':639,1173,1514,1859,2208 'ob':284 'obj':1955,1966,1990 'obja':2018,2033 'objb':2019,2034 'object':143,188,322,600,1225,1260,1319,1365,1667,1681,1748,1908,1915,1960,1972,2007,2014,2026,2039,2052,2110,2159,2166,2177,2181,2187,2222 'obtain':991 'occur':1589,1600 'ok':1248 'omit':69 'onassemblyresolv':577,599 'onauthent':1354,1360,1364 'onconfirm':1310,1314,1318 'ondispos':1215,1220,1224 'one':70,1288,1370,1490,1867,2131 'onlineprovid':224 'onlinest':225 'onnotif':1251,1255,1259 'onupdatestatus':1166 'opc':304 'open':17,24,439,465,518,547,583,653,853,897,911,928,943,1208,1329,1356,1460,1612,1735,1811,1814,1884,1904,2065 'opennessapp':594,842 'opennessfold':616,629 'oper':263,312,434,1145,1434,1461,1474,1620,1676,1704 'option':803,1467 'order':1732 'overload':2192,2215 'overwrit':1988 'pair':2172,2202,2226 'paramet':525 'pass':1168,1343,2063 'password':1398,1407 'path':469,485,606,711,735,789,820,1838,1858,1977,2044,2056,2069,2071 'path.combine':628,777 'pattern':93,509,536,980,1303 'per':619,688,1870,1934 'perform':1546 'persist':1559 'pipelin':880 'plc':262,1481 'plcalarm':274 'plcblock':283 'plcconstant':318 'plcexternalsourc':297 'plcforcet':342 'plcsoftwar':271 'plcstruct':333 'plctag':317 'plctagtabl':316 'plctype':332 'plcwatchtabl':341 'point':573,866 'portal':16,23,237,448,480,491,503,652,724,753,769,858,893,908,950,1017,1032,1049,1204,1230,1412,1437,1653,1701,1725,1799,1805,1872,2021 'possibl':572,2027 'pre':1084 'pre-select':1083 'primari':1823,1834,1868,1880 'privat':596,738,1221,1256,1315,1361 'proceed':1098 'process':894,924 'product':1771 'products/packages':1726 'program':300,487,499,543,567,575 'progress':1037,1107,1112,1114,1121,1444 'progressprovid':1033,1106 'project':56,129,620,1334,1351,1357,1458,1543,1611,1722,1810,1816,1826,1833,1853,1869,1875,1881,1896,2084 'project.devicegroups.create':1549,1552 'projectlibrari':208 'projectopenmode.primary':1840 'projectopenmode.secondary':1860 'projectserv':221 'prompt':1399,1408 'properti':530 'protect':1333,1350,1895 'provid':260,972,979,2168 'public':578,843 'publicapi':35,493,505,779 'purpos':1024 'queri':14,151 'rather':728 'reach':1566 'read':604,708,1419,1830,1847,1900,2111,2126,2146 'read-on':1846,1899 'read-writ':1829 'readabl':2128 'readableattr':2160 'readon':2153 'readwrit':2155 'recip':380 'recipeel':381 'recommend':535,609,706,1428,1730 'recover':1502,1640,1650,1657 'recurs':1943 'refer':6,150,674,2010,2015,2029 'referenc':64,521 'references/assembly-namespace-map.md':78 'regardless':1849 'regist':515,537,568 'registri':470,608,714,733,775 'registry-bas':732 'relat':2070 'releas':1485 'remain':1646 'remov':1991 'repres':2047 'request':1125 'requestednam':622 'requestedname.fullname':645 'requestedname.name':631 'requestedname.name.startswith':634 'requir':63,124,805,1244,1270,1281,1528,1656,1723 'resolv':436,508,555,569,691 'resolveeventarg':602 'resourc':1698 'respons':1269 'restart':1655,1803 'result':1094,1103 'rethrow':1779 'retriev':1616,2040 'return':526,638,659,776,922,1087,1105,1130,1172,1956,1967 'right':1665,1852,1890 'roll':1570,1582,1592 'rollback':1573 'rule':662,1488,1574,1865 'run':845,884,891,1013,1463 'runtim':74,822,999,1004,1691,2076 'safeti':433 'sameobj':2031 'sameref':2017 'save':1613 'schema':497,507 'screenpopup':389 'screentempl':388 'search':1944 'second':1498 'secondari':1841,1854,1874,1907 'secondary.isprimary':1863 'section':459 'securitycontrol':232 'see':77 'select':1085 'sender':601,1226,1261,1320,1366 'separ':551,589,1384 'server':306 'servic':971,978,993,995,1005,1007,1021,1176 'service-provid':977 'session':832,1645,1807 'set':238,363,669,1285,1510,2104,2200,2212 'setattribut':2225 'show':1410 'shownotif':1066,1072 'siemen':474,489,501,718,747 'siemens.engineering':127,635,672,704 'siemens.engineering.addin':1026,1034,1044 'siemens.engineering.base.dll':58,122 'siemens.engineering.cax':266 'siemens.engineering.compare':138 'siemens.engineering.compiler':135 'siemens.engineering.connection':141 'siemens.engineering.crossreference':147 'siemens.engineering.dll':54 'siemens.engineering.download':153 'siemens.engineering.download.configurations':157 'siemens.engineering.engineeringexception':1641 'siemens.engineering.hmi':348 'siemens.engineering.hmi.alarm':354 'siemens.engineering.hmi.communication':358 'siemens.engineering.hmi.cycle':361 'siemens.engineering.hmi.dynamic':365 'siemens.engineering.hmi.faceplate':368 'siemens.engineering.hmi.globalization':372 'siemens.engineering.hmi.logging':375 'siemens.engineering.hmi.recipe':379 'siemens.engineering.hmi.runtimescripting':383 'siemens.engineering.hmi.screen':386 'siemens.engineering.hmi.tag':393 'siemens.engineering.hmi.textgraphiclist':397 'siemens.engineering.hmi.theming':401 'siemens.engineering.hw':168 'siemens.engineering.hw.communicationconnections':178 'siemens.engineering.hw.extensions':183 'siemens.engineering.hw.features':190 'siemens.engineering.hw.hardwarecatalog':197 'siemens.engineering.hw.utilities':202 'siemens.engineering.library':207 'siemens.engineering.library.mastercopies':211 'siemens.engineering.library.types':215 'siemens.engineering.mc.drives':409 'siemens.engineering.mc.drives.dfi':414 'siemens.engineering.mc.drives.enums':418 'siemens.engineering.mc.drives.securityobjects':422 'siemens.engineering.multiuser':219 'siemens.engineering.nonrecoverableexception':1651 'siemens.engineering.online':223 'siemens.engineering.online.configurations':227 'siemens.engineering.safety':432 'siemens.engineering.safety.dll':426 'siemens.engineering.security':231 'siemens.engineering.settings':235 'siemens.engineering.startdrive.dll':404 'siemens.engineering.step7.dll':261 'siemens.engineering.sw':270 'siemens.engineering.sw.alarm':273 'siemens.engineering.sw.alarm.textlists':277 'siemens.engineering.sw.blocks':282 'siemens.engineering.sw.blocks.interface':291 'siemens.engineering.sw.externalsources':296 'siemens.engineering.sw.loader':299 'siemens.engineering.sw.opcua':303 'siemens.engineering.sw.supervision':309 'siemens.engineering.sw.tags':315 'siemens.engineering.sw.technologicalobjects':320 'siemens.engineering.sw.technologicalobjects.motion':324 'siemens.engineering.sw.types':331 'siemens.engineering.sw.units':335 'siemens.engineering.sw.watchandforcetables':340 'siemens.engineering.umac':240 'siemens.engineering.upload':245 'siemens.engineering.upload.configurations':248 'siemens.engineering.versioncontrol':255 'siemens.engineering.wincc.dll':343 'sign':1390 'signal':1435 'signatur':1932 'simpl':613 'simpler':802 'sinam':405 'singl':53,1525 'skill':7,85,2006 'skill-tia-csharp-common' 'skip':1151 'softwar':473,717,746,1477 'softwarecontain':191 'softwareunit':336 'someobject':2224 'sourc':21 'source-czarnak' 'specif':160 'specifi':1337 'split':44 'stabl':785 'standalon':438,463 'start':702,869,918,938,952 'startdriv':166,253,329 'startdrive.dll':686 'statement':829 'static':540,565,574,579,597,739,1222,1257,1316,1362 'status':1163 'step':1116 'step7':165,176,195 'step7.dll':684 'still':1211,1508,1897 'string':615,626,740,755,761,2158,2176,2180,2186 'string.concat':630 'string.empty':1512 'string.isnullorempty':763 'subnet':171 'subtyp':1658 'success':1147 'suitabl':877 'supervis':310 'suppli':1383,1423,1719 'support':1756,1983 'swallow':1778,1789 'system':429 'system.object.equals':2032,2036 'tab':1055,1138 'tabl':86 'task':689 'technolog':321 'telegram':412 'text':279,1070,1077,1119 'text/graphic':398 'theme':403 'throw':648,765,969,1297,1500,1775,1786,2089 'thrown':1714 'tia':2,15,22,236,447,651,768,857,892,907,949,1016,1031,1048,1203,1229,1265,1411,1436,1652,1700,1724,1798,1804,1871,2020 'tia-csharp-common':1 'tiaport':128,823,847,848,850,899,900,988,1193 'tiaportal.authentication':1353,1359 'tiaportal.confirmation':1309,1313 'tiaportal.disposed':1214,1219 'tiaportal.exclusiveaccess':1456,1536 'tiaportal.getprocesses':901 'tiaportal.getservice':1064,1113,1141 'tiaportal.notification':1250,1254 'tiaportal.projects.open':1835,1855 'tiaportalmode.withoutuserinterface':875 'tiaportalmode.withuserinterface':851,868 'time':794,1496 'titl':1068,1074,1097 'tolist':2138 'tool':614,813,2101 'top':1633 'top-level':1632 'topic-agent-skills' 'topic-claude-code' 'topic-claude-code-plugin' 'topic-claude-skills' 'topic-codex' 'topic-codex-cli' 'topic-codex-plugin' 'topic-gemini' 'topic-gemini-cli' 'topic-gemini-cli-extension' 'topic-gemini-extension' 'topic-mcp' 'total':477,721,750 'transact':131,1519,1540,1541,1568,1610,1626 'transaction.commitondispose':1572 'tri':1216,1252,1311,1355,1734 'trivial':1433 'true':1123 'try/catch':1596 'two':1631 'type':370,519,527,1022,1638,1659 'typeloadexcept':72 'typic':1660 'ua':305 'ui':982,1844 'umac':425,1332,1894 'umac-protect':1331,1893 'umacdeleg':1346,1386,1424,1839 'umacfunctionright':243 'umacrol':241 'umacus':242 'under':2050 'undo':1526 'unit':1527 'unsubscrib':1195 'updat':1115,1468 'upload':249 'uploadprovid':246 'use':102,126,134,137,140,146,152,156,167,177,182,189,196,201,206,210,214,218,222,226,230,234,239,244,247,254,265,269,272,276,281,290,295,298,302,308,314,319,323,330,334,339,347,353,357,360,364,367,371,374,378,382,385,392,396,400,408,413,417,421,431,676,742,808,826,828,846,904,975,1175,1335,1401,1453,1533,1539,1949,2035,2067,2098 'user':13,1090,1124,1396,1404,1417,1451,1708,1851,1887 'util':204 'v17':1326 'v18':1729 'v21':29,30,36,39,43,467,481,492,494,504,506,675,725,754,770,780,974 'val':2204 'valid':1647,1687 'valu':482,726,1088,1296,2140 'var':591,743,1062,1111,1139,2079,2090,2171 'vari':1933 'vbscript':384 'version':258,654,898,929 'via':454,1345,1385 'visibl':873,1824 'void':580,844,1223,1258,1317,1363 'vs':935 'want':916 'warn':90 'wincc.dll':685 'wincc.extension':352 'window':1052,1135,1395 'without':2216 'work':854,1217,1736,1818 'workspac':256 'write':1831,1889,2164 'writeon':2154 'wrong':66,2087 'xml':32,38 'yes':1290,1324 'yestoal':1291","prices":[{"id":"f81f210a-cf90-4501-bf42-a86ae123ade6","listingId":"cb6a5353-2173-4b4d-9266-3fcab1c0578d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Czarnak","category":"totally-integrated-claude","install_from":"skills.sh"},"createdAt":"2026-05-18T13:13:57.653Z"}],"sources":[{"listingId":"cb6a5353-2173-4b4d-9266-3fcab1c0578d","source":"github","sourceId":"Czarnak/totally-integrated-claude/tia-csharp-common","sourceUrl":"https://github.com/Czarnak/totally-integrated-claude/tree/main/skills/tia-csharp-common","isPrimary":false,"firstSeenAt":"2026-05-18T13:13:57.653Z","lastSeenAt":"2026-05-18T19:08:29.705Z"}],"details":{"listingId":"cb6a5353-2173-4b4d-9266-3fcab1c0578d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Czarnak","slug":"tia-csharp-common","github":{"repo":"Czarnak/totally-integrated-claude","stars":9,"topics":["agent-skills","claude-code","claude-code-plugin","claude-skills","codex","codex-cli","codex-plugin","gemini","gemini-cli","gemini-cli-extension","gemini-extension","mcp","mcp-server","siemens","skills","tia-openness","tia-portal"],"license":"mit","html_url":"https://github.com/Czarnak/totally-integrated-claude","pushed_at":"2026-05-08T03:14:15Z","description":"A Claude Code plugin for Siemens TIA Portal engineering automation.","skill_md_sha":"3b3c51bf6f1020ee855bb66ad000a11487411b32","skill_md_path":"skills/tia-csharp-common/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Czarnak/totally-integrated-claude/tree/main/skills/tia-csharp-common"},"layout":"multi","source":"github","category":"totally-integrated-claude","frontmatter":{"name":"tia-csharp-common","description":"Internal reference skill — do NOT load directly from user queries."},"skills_sh_url":"https://skills.sh/Czarnak/totally-integrated-claude/tia-csharp-common"},"updatedAt":"2026-05-18T19:08:29.705Z"}}