| Code Block | ||||
|---|---|---|---|---|
| ||||
---
title: "Skill Template — Replace This Title"
tags: [replace, with, relevant, keywords]
description: "One-line summary explaining what this skill teaches Claude to do"
version: "1.0"
author: "Tatsoft"
---
|
| Excerpt |
|---|
Canonical template for creating FrameworX AI Skills — markdown playbooks that teach the AI assistant how to build specific solutions. Duplicate this page to create your own skill. |
| Note |
|---|
Publishing checklist: When publishing a skill page to Confluence, you must add the To create a new skill: Click ... → Copy on this page, then replace all placeholder content with your implementation. |
...
Hands-on exercises for navigating Designer interface and using productivity features.
[getting-started, new-solution, tags, simulator, display, beginner, quickstart]
Step-by-step guide for the first 5 minutes after creating a new FrameworX solution: create tags, simulate data, build a basic display, and run
Build a working solution from scratch in minutes: tags → simulated data → display → runtime. This is the foundation every other skill builds on.
| Section | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
...
...
|
Describe the trigger conditions. Be specific — Claude uses this to decide whether to load the skill.
Use this skill when:
...
...
...
Do NOT use this skill when:
What must exist in the solution before this skill can be applied.
...
...
open_solution or ...
create_solution completed)...
Quick reference for Claude on which tools and table types this skill uses.
Category | Items |
|---|---|
Tools |
...
| |
Tables |
...
|
...
...
Explain what to do and why. Include the exact MCP tool call.
First, fetch the schema to confirm field names:
| Code Block | ||
|---|---|---|
| ||
get_table_schema(' |
...
TableType') |
...
Then write the objects:
| Code Block | ||||
|---|---|---|---|---|
| ||||
{
"table_type": " |
...
TableType", "data": [ { |
...
...
"Name": " |
...
ObjectName", |
...
|
...
"Property1": " |
...
Value1", |
...
|
...
|
...
" |
...
Property2": " |
...
Value2" |
...
}
]
}
|
Key decisions:
Double for analog measurements, Integer for states/enumsPlant/Reactor1/) create a browsable asset treeDescription — it appears in Designer tooltips and AI contextThe Value Simulator generates realistic changing values for testing — no real hardware needed.
First, get the protocol schema:
list_protocols('ValueSimulator')
Then create the device pipeline (Channel → Node → Points):
...
Continue the pattern. Each step should be self-contained enough that Claude can execute it and verify before moving on.
| Code Block | ||||
|---|---|---|---|---|
| ||||
{ "table_type": " |
...
AnotherTable", |
...
"data": [
|
...
|
...
{ |
...
|
...
|
...
|
...
" |
...
Name": " |
...
ObjectName", |
...
" |
...
DependsOn": " |
...
ObjectFromStep1"
}
]
}
|
Final configuration step.
Include C# script examples when the skill involves ScriptsClasses or ScriptsTasks.
| Code Block | ||||
|---|---|---|---|---|
| ||||
public static void MethodName(string tagPath)
{
double value = @Tag.TagPath.Value;
// Process logic here
@Tag.OutputTag.Value = result;
}
|
Expression to trigger this class:
ObjectName | Expression | Execution |
|---|---|---|
TriggerName |
| OnChange |
How to confirm the implementation is correct. List concrete checks.
get_objects('TableType') — verify the new objects appearget_designer_state() — confirm no compilation errors (for scripts)browse_namespace('Tag.Path') — verify tags have expected valuesMistake | Why It Happens | How to Avoid |
|---|---|---|
‹Mistake 1› | ‹Root cause› | ‹Correct approach› |
‹Mistake 2› | ‹Root cause› | ‹Correct approach› |
‹Mistake 3› | ‹Root cause› | ‹Correct approach› |
Optional section for common variations of this skill.
Variation A: ‹Name›
Variation B: ‹Name›
skill-related-name — ‹How it connects›skill-another-name — ‹How it connects›...
Value Simulator address patterns:
random(min,max) — random value in rangesin(center,amplitude,frequency) — sine waveramp(min,max,step) — ramp up then resetImportant: Always call list_protocols('ValueSimulator') first to get the exact address syntax for the current version. The examples above are common patterns but the protocol schema is the source of truth.
Create a simple dashboard to visualize the live data.
list_elements('Dashboard')
get_table_schema('DisplaysList')
Create a dashboard with text displays for each tag:
{
"table_type": "DisplaysList",
"data": [
{
"Name": "MainPage",
"PanelType": "Dashboard",
"Columns": 2,
"Rows": 3,
"Title": "Reactor 1 Monitor",
"Elements": [
{
"Type": "TextBlock",
"Column": 0, "Row": 0,
"LinkedValue": "Tag.Plant/Reactor1/Temperature",
"Label": "Temperature (°C)"
},
{
"Type": "TextBlock",
"Column": 1, "Row": 0,
"LinkedValue": "Tag.Plant/Reactor1/Pressure",
"Label": "Pressure (bar)"
},
{
"Type": "TextBlock",
"Column": 0, "Row": 1,
"LinkedValue": "Tag.Plant/Reactor1/Level",
"Label": "Level (%)"
},
{
"Type": "TextBlock",
"Column": 1, "Row": 1,
"LinkedValue": "Tag.Plant/Reactor1/FlowRate",
"Label": "Flow Rate (L/min)"
},
{
"Type": "TrendChart",
"Column": 0, "Row": 2, "ColumnSpan": 2,
"Pens": [
{ "TagName": "Tag.Plant/Reactor1/Temperature", "Color": "#FF3498DB" },
{ "TagName": "Tag.Plant/Reactor1/Pressure", "Color": "#FFE74C3C" }
]
}
]
}
]
}
Key decisions:
PanelType: "Dashboard" — required, do not omit (defaults to Canvas otherwise)MainPage is the default startup displayLinkedValue with full runtime path: Tag.Plant/Reactor1/Temperaturedesigner_action('start_runtime')
Wait a few seconds, then verify:
get_runtime_state()
You should see tag values changing as the simulator feeds data.
get_objects('UnsTags') — confirm 5 tags existget_objects('DevicesChannels') — confirm Simulator channel existsget_objects('DevicesPoints') — confirm 5 points mapped to tagsget_runtime_state() — runtime should be running, tags should have changing valuesPanelType: Omitting PanelType on a display defaults to Canvas, which uses absolute positioning (Left/Top) instead of grid layout. Always set PanelType: "Dashboard" for grid-based layouts.Tag.Plant/Reactor1/Temperature (with Tag. prefix) in display bindings. The tag Name is Plant/Reactor1/Temperature but the runtime namespace path needs the Tag. prefix.list_protocols('ValueSimulator') for current syntax. Don't guess address formats from memory.TagName to map to a UNS tag. Points without TagName don't feed data anywhere.From here, the user can add:
skill-alarm-pipelineskill-historian-configurationskill-edge-ml-pipeline| Page Tree | ||
|---|---|---|
|
...
...