| name | tia-openness-bag-pulse |
| description | Use when working in an open Siemens TIA Portal V17 project through Openness, especially for SCL bag pulse logic, PLC/HMI tag tables, TP1200 screens or popup screens, WinCC VB scripts, cycles, text lists, graphic lists, data records, alarm records, scheduled tasks, structured HMI tag naming, import/export loops, compile checks, or repeatable skill packaging. |
TIA Openness Bag Pulse
Use this skill to turn a user request like "connect to TIA and build a bag pulse dust collector", "create a TP1200 button and a popup screen", or "verify HMI VB script/cycle/text-list import and export" into a repeatable Openness workflow.
Assume the work happens on Windows with PowerShell, an already-open TIA Portal session, and a CPU that supports SCL blocks. Prefer creating new blocks and tag tables over mutating unrelated existing logic.
Workflow
- Inspect the local Openness environment.
- Attach to the open TIA Portal process.
- Discover the target project, PLC software object, existing blocks, and existing tag tables.
- Generate or update the SCL source files in the current workspace.
- Import the source into TIA with Openness, creating blocks, DBs, HMI screens, HMI popup screens, VB scripts, cycles, text lists, graphic lists, or HMI tag tables.
- Create or update the PLC tag table for field IO and status words.
- Compile the generated PLC blocks when PLC logic changed.
- Export generated HMI objects or PLC blocks for verification.
- Save the project.
- Report what was created, what addresses were used, and whether OB1/Main or HMI screens were changed.
Quick Rules
- Prefer
C:\Program Files\Siemens\Automation\Portal V17\PublicAPI\V17\Siemens.Engineering.dll when V17 is installed. If V17 is missing, search under C:\Program Files\Siemens\Automation\Portal* for Siemens.Engineering.dll and use the newest matching PublicAPI version.
- Use PowerShell and load the DLL with
Add-Type -Path.
- Enumerate TIA processes with
[Siemens.Engineering.TiaPortal]::GetProcesses().
- Attach to an existing UI session instead of opening a new hidden TIA process when the user says Portal is already open.
- Find PLC software through
DeviceItem.GetService[SoftwareContainer]() rather than assuming the PLC sits at a fixed device-item depth.
- Prefer adding new blocks with distinct names such as
FB_BagPulseDustCollector, DB_BagPulseDustCollector, DB_BagPulseDustCollector_IO, and FC_BagPulseDustCollector_IO.
- Compile newly generated blocks first. Then compile the PLC software object to confirm the whole software tree is clean.
- Save the TIA project after a successful compile.
Default Deliverable
Unless the user asks for a different structure, generate these objects:
FB_BagPulseDustCollector: the reusable core SCL FB
DB_BagPulseDustCollector: instance DB for the FB
DB_BagPulseDustCollector_IO: parameter and status DB for HMI/operator tuning
FC_BagPulseDustCollector_IO: IO wrapper that maps field signals to the FB and writes outputs/status back out
Main or OB1: call the IO wrapper only when safe to do so
Keep the core behavior conservative:
- Default
BagCount := 4
- Make
PulseTime, ValveInterval, and CyclePause adjustable
- Support manual pulse and pressure-difference requests
- Support enabled-bag selection and optional per-bag pulse time
Read references/default-io-map.md when the user does not provide an IO list and you need a ready-made closed loop.
Read references/tia-v17-shortcuts.md when the user asks for TIA Portal V17 shortcuts or when keyboard-driven UI navigation is faster than hunting through menus.
Read references/hmi-screen-popup-import.md when the user asks to create or verify TP1200/HMI screens, simple buttons, popup screens, or HMI XML import/export through Openness.
Read references/hmi-structured-tag-naming.md when HMI variable names must be easy to trace from the property pane back to PLC DBs, for example DB_ActivePopup_Heater01_ActiveID.
Read references/hmi-plc-linked-tags.md when HMI tags should be moved from internal variables to direct PLC-linked variables with Connection and ControllerTag, for example DB_ActivePopup.Valve01.Visible.
Read references/hmi-popup-sim-800x800.md when the user asks to continue the HMI弹窗 [FB1] / DB_Components / DB_ActivePopup popup simulation, create an 800x800 popup, bind internal Int HMI tags, add button SetTag actions, or verify the known-good Codex_Popup_Sim_800x800_IO2 workflow.
Read references/hmi-advanced-objects.md when the user asks about VB script import/export, HMI tag-table fixes for SmartTags, cycles, text lists, graphic lists, data records, alarm records, scheduled tasks, or the 记录 / 计划任务 / 周期 / 文本和图形列表 nodes.
Safe Edit Policy For Main/OB1
- Inspect existing
Main/OB1 first.
- If OB1 is empty or effectively empty, replacing it with a simple SCL caller is acceptable.
- If OB1 contains real user logic, do not overwrite it silently.
- In a populated OB1, prefer one of these:
- export the block first and preserve a backup in the workspace
- add a single new FC/FB call if you can do it without disturbing existing logic
- otherwise stop short of OB1 mutation and tell the user the generated caller block is ready to be inserted
Report explicitly whether Main/OB1 was changed.
PowerShell Pattern
Use short inspection commands first:
Get-Process | Where-Object { $_.ProcessName -match 'Portal|Siemens|TIA' }
Get-ChildItem -Path 'C:\Program Files\Siemens' -Recurse -Filter Siemens.Engineering.dll -ErrorAction SilentlyContinue
When attaching through Openness, use a helper like this:
$dll = 'C:\Program Files\Siemens\Automation\Portal V17\PublicAPI\V17\Siemens.Engineering.dll'
Add-Type -Path $dll
$process = [Siemens.Engineering.TiaPortal]::GetProcesses() | Select-Object -First 1
$tia = $process.Attach()
For PLC discovery, prefer a recursive walk over device items and a reflected generic GetService helper when PowerShell has trouble calling the generic method directly.
Block Import Pattern
Generate source files in the current workspace, then import them through ExternalSourceGroup.
Recommended source files:
BagPulseDustCollector_OpennessImport.scl: core FB, instance DB, IO DB, IO wrapper FC
Main_Call_BagPulseDustCollector.scl: optional OB1/Main caller
Recommended sequence:
- Create or find the external source.
- Call
GenerateBlocksFromSource(KeepOnError).
- Compile the generated blocks individually.
- Compile the PLC software object.
If block export fails because blocks are inconsistent, compile first and retry export only if you actually need the export.
Read references/generated-objects.md when you need the default block naming and responsibility split.
Tag Table Pattern
Create a dedicated PLC tag table, for example BagPulseDustCollector_IO, and keep the IO mapping there. Avoid mixing these tags into the default system clock tag table.
Use the default map from references/default-io-map.md unless the user supplies a plant-specific address list.
If the target project already uses those addresses, stop and ask for the actual IO allocation instead of guessing.
HMI Screen Pattern
For TP1200 or HMI requests, find Siemens.Engineering.Hmi.HmiTarget through the HMI device item's SoftwareContainer. Use ScreenFolder.Screens for normal screens and ScreenPopupFolder.ScreenPopups for popup screens.
Use XML import for simple generated HMI objects:
assets/hmi-screen-templates/hmi_import_Codex_Button_Test.xml: normal screen with one button
assets/hmi-screen-templates/hmi_import_Codex_Popup_500x500.xml: 500x500 popup screen
After import, export the new HMI screen or popup to verify that the object exists and that key attributes such as Width, Height, and the button object name are present.
For the verified HMI弹窗 [FB1] simulation, use these scripts in order:
powershell -ExecutionPolicy Bypass -File ".\scripts\import-popup-sim-int-tagset.ps1" -OutputRoot ".\tia_popup_touch_sim"
powershell -ExecutionPolicy Bypass -File ".\scripts\create-popup-sim-visual-screen.ps1" -OutputRoot ".\tia_popup_touch_sim" -ScreenName "Codex_Popup_Sim_800x800_IO2" -BindIntSet
powershell -ExecutionPolicy Bypass -File ".\scripts\create-popup-sim-visual-screen.ps1" -OutputRoot ".\tia_popup_touch_sim" -ScreenName "Codex_Popup_Sim_Runtime" -ScreenNumber 21 -ScreenWidth 1280 -ScreenHeight 740 -AsNormalScreen -BindIntSet
powershell -ExecutionPolicy Bypass -File ".\scripts\import-popup-sim-int-tagset.ps1" -OutputRoot ".\tia_popup_touch_sim" -UseStructuredTagNames -SkipTagNames "DB_ActivePopup_Heater01_ActiveID"
powershell -ExecutionPolicy Bypass -File ".\scripts\create-popup-sim-visual-screen.ps1" -OutputRoot ".\tia_popup_touch_sim" -ScreenName "Codex_Popup_Sim_Runtime_Named" -ScreenNumber 22 -ScreenWidth 1280 -ScreenHeight 740 -AsNormalScreen -BindIntSet -UseStructuredTagNames -FocusComponent Heater01
powershell -ExecutionPolicy Bypass -File ".\scripts\compile-current-hmi-target.ps1" -OutputRoot ".\tia_popup_touch_sim"
For TP1200, do not import an 800 x 800 object as a normal screen. Import it as Hmi.Screen.ScreenPopup through ScreenPopupFolder.ScreenPopups.
If runtime interaction needs a directly openable normal screen, use 1280 x 740 with -AsNormalScreen; this target rejected both 800 x 800 and 1280 x 800 normal-screen imports.
For traceable HMI tag names, use -UseStructuredTagNames. The naming pattern is DB_Components_<Component>_<Field> and DB_ActivePopup_<Component>_<Field>, for example DB_ActivePopup_Heater01_ActiveID. If the project already contains a manually created tag, pass it through -SkipTagNames and keep the existing object.
To connect generated HMI tags directly to PLC DB variables, use scripts/import-popup-plc-linked-tagset.ps1. It adds Connection and ControllerTag links, preserves DoubleClickTime as an internal helper because the exported PLC DB has no matching member, and can skip tags already created in 默认变量表.
HMI Structured Naming Pattern
Use structured names once the basic import path is stable and the user needs to find data from the HMI property pane.
- Component-side inputs:
DB_Components_<Component>_<Field>, such as DB_Components_Heater01_ClickTrig
- Popup/status outputs:
DB_ActivePopup_<Component>_<Field>, such as DB_ActivePopup_Heater01_ActiveID
- Known components in the current popup simulation:
Valve01, Heater01, Fan01
- If a tag already exists, preserve it with
-SkipTagNames; do not delete or overwrite manually created tags.
Read references/hmi-structured-tag-naming.md before adding component names or mapping the screen to real PLC DB members.
HMI PLC-Linked Tag Pattern
Use this after structured naming is stable and the user wants the HMI variable table to show a PLC connection like HMI_连接_1, PLC_1, and DB_ActivePopup.Valve01.Visible.
powershell -ExecutionPolicy Bypass -File ".\scripts\export-hmi-tag-table.ps1" -OutputRoot ".\tia_popup_touch_sim" -TagTableName "Codex_Popup_PLC_Named_Int_Tags"
powershell -ExecutionPolicy Bypass -File ".\scripts\import-popup-plc-linked-tagset.ps1" -OutputRoot ".\tia_popup_touch_sim" -TagTableName "Codex_Popup_PLC_Named_Int_Tags" -ConnectionName "HMI_连接_1" -ReplaceExistingTable -SkipTagNames "DB_ActivePopup_Heater01_ActiveID"
powershell -ExecutionPolicy Bypass -File ".\scripts\compile-current-hmi-target.ps1" -OutputRoot ".\tia_popup_touch_sim"
Read references/hmi-plc-linked-tags.md before changing PLC-linked field mappings or adding Real/String links.
HMI Advanced Object Pattern
For HMI VB scripts, cycles, text lists, graphic lists, and internal tag tables, use the bundled templates under assets/hmi-advanced-templates and the repeatable validation script:
powershell -NoProfile -ExecutionPolicy Bypass -File ".\scripts\invoke-hmi-advanced-loop.ps1"
In V17 TP1200 Comfort testing, Openness exposed Cycles, TextLists, GraphicLists, TagFolder, and VBScriptFolder, but did not expose direct collections for data records, alarm records, or scheduled tasks. For those nodes, document the boundary clearly and use GUI/manual XML samples if the user needs direct edits.
Validation
After generation:
- Compile
FB_BagPulseDustCollector
- Compile
DB_BagPulseDustCollector
- Compile
DB_BagPulseDustCollector_IO
- Compile
FC_BagPulseDustCollector_IO
- Compile the whole PLC software object
- Compile the HMI target when HMI objects changed
- Save the project
In the final report, include:
- project name
- PLC software name
- blocks created or updated
- tag table created or updated
- whether
Main/OB1 changed
- compile result summary
- HMI compile result summary when HMI objects changed
- any assumptions, especially IO addresses
What To Avoid
- Do not overwrite a populated
Main/OB1 without checking it first.
- Do not reuse
%M0 and %M1 clock bytes for status words.
- Do not assume the project contains no existing bag pulse logic; inspect existing FB/FC/DB names first.
- Do not claim the work is complete until the PLC software compile passes.