Bulk Engineering for DCS/PLC Automation
The Problem
Typical mid-size plant: 200-500 motors, 100-300 valves, 500-2000 analog loops, 200-1000 discrete I/O. Manual configuration: 15-60 min/instance. Bulk engineering reduces months to days.
General Pipeline
[Instrument Index / Motor List / Valve List] (Excel/CSV input)
|
v
[Engineering Database] (SQLite / structured data)
|
v
[Template Library] + [Configuration Rules]
|
v
[Code Generator] (Python + Jinja2 / string replacement)
|
v
[DCS/PLC Project Files] (PRT, XML, FHX, etc.)
|
v
[Validation] (cross-reference check, naming, completeness)
|
v
[Import to DCS Engineering Tool]
Input Documents
| Document | Contains | Used For |
|---|
| Instrument Index (I/O List) | Every tag, type, range, units, alarms, P&ID ref | Tag creation, scaling, alarms |
| Motor List | Motors with power, starter type, protections, interlocks | Motor block generation |
| Valve List | Valves with type, fail position, actuator | Valve block generation |
| Control Narrative | Control logic descriptions per unit | Logic implementation |
| Cause & Effect Matrix | Safety/interlock logic in tabular form | Interlock logic generation |
Output Artifacts
- Controller programs (function block instances + logic + parameters)
- I/O assignments (channel-to-tag mapping)
- HMI/operator displays (graphics, faceplates, navigation)
- Alarm configuration (priorities, limits, deadbands)
- Historian tags (trend definitions, storage rates)
- OPC server configuration
ABB Freelance Bulk Engineering (Primary Target)
Method 1: PRT File Templating (Recommended)
- Create a "golden" template PRT for each type (motor, valve, analog, etc.)
- Export as .prt file
- Programmatically for each new instance:
- Read template with UTF-16 encoding
- Replace all identifiers (node name, MSR name, EAM signals, descriptions)
- Update parameters
- Set checksum to
- Write output .prt file
- Import each .prt into target project in Freelance Engineering Workplace
Template Replacement Map (Motor)
| Element | Template | Replace With |
|---|
| Node name | | |
| MSR primary | | |
| MSR short | | |
| Graph ref | | |
| Description | | |
| EAM signals | + node | Same prefixes + new node |
Method 2: CSV Full Project Manipulation
Parse full project CSV, add new sections, re-import. More powerful but higher risk.
Method 3: DMF Display Templating
- Create template display in DigiVis
- Export as .DMF
- For each new display:
- Replace TXL text entries (tag names, descriptions, units)
- Replace ODB variable bindings (DIGI addresses)
- Update display navigation references
Key Challenges
- UTF-16 encoding: Must read/write correctly
- Internal cross-references: EAM, MSR, LAD:PARA_REF must be consistent
- Checksum: Set to 0, Freelance recalculates
- Unique naming: No duplicates allowed
- Area mapping: Tags must map to correct area codes
Siemens TIA Portal Bulk Engineering
TIA Openness API (.NET)
csharp
using Siemens.Engineering;
using Siemens.Engineering.SW;
TiaPortal tia = new TiaPortal(TiaPortalMode.WithUserInterface);
Project project = tia.Projects.Open(new FileInfo(@"Project.ap17"));
PlcSoftware sw = device.GetService<PlcSoftware>();
sw.BlockGroup.Blocks.Import(new FileInfo(@"MotorFB.xml"), ImportOptions.Override);
PlcTagTable table = sw.TagTableGroup.TagTables.Create("Motors");
SiVArc (HMI Auto-Generation)
Rules-based: define rules like "For every MotL FB, create faceplate." Reads PLC structure, auto-generates WinCC displays.
Emerson DeltaV Bulk Engineering
Class-Based Configuration (Most Powerful)
Define module template (class) -> instantiate many -> template changes propagate to all instances.
FHX File Generation
MODULE TEMPLATE "MT_MOTOR_1SPD" /
MODULE_CLASS = DEVICE /
{
FUNCTION_BLOCK "DC-1" / DEFINITION = "DC" /
{ ATTRIBUTE MODE_BLK.TARGET = AUTO ; ... }
}
Text-based, parseable, generatable with Python.
Recommended Technology Stack
| Component | Technology | Purpose |
|---|
| Language | Python 3.10+ | Core automation |
| Excel I/O | openpyxl, pandas | Read input spreadsheets |
| Templates | Jinja2 / string.Template | Generate output files |
| Database | SQLite | Engineering database |
| File I/O | codecs (UTF-16) | Read/write Freelance files |
| XML | lxml | PLCopen XML, SimaticML |
| Validation | pydantic | Data validation |
| GUI (opt) | Streamlit / PyQt6 | User interface |
| VCS | Git | Version control |
Python Template Approach
python
import codecs
import re
import pandas as pd
# Read motor list
motors = pd.read_excel('motor_list.xlsx')
# Read template
with codecs.open('MOT_template.prt', 'r', 'utf-16') as f:
template = f.read()
# Generate for each motor
for _, motor in motors.iterrows():
output = template
output = output.replace('11301CLWW1A1', motor['node_name'])
output = output.replace('11301.CLWW.1A1', motor['msr_name'])
output = output.replace('PHO RCK EXTR CNVR-1', motor['description'])
# ... more replacements
# Reset checksum
output = re.sub(r'\[CHECKSUM\];.*', '[CHECKSUM];0000000000', output)
with codecs.open(f"{motor['node_name']}.prt", 'w', 'utf-16-le') as f:
f.write('\ufeff' + output)
NAMUR NE 148 Requirements
The NAMUR standard for automation engineering tools mandates:
- Single data source - one instrument defined once, used everywhere
- Template-based engineering - define once, instantiate many
- Bulk operations - create/modify/delete in mass
- Consistency checking - validate cross-references
- Import/export - Excel and P&ID tool integration
- Version management - track changes
- Multi-user - concurrent engineering
- Target independence - generate for multiple DCS targets
Third-Party Tools
| Tool | Vendor | Description |
|---|
| SmartPlant Instrumentation | AVEVA | Central instrument DB, generates DCS configs for all vendors |
| COMOS | Siemens | P&ID to PLC code, TIA Portal integration |
| Engineering Base | AUCOTEC | Object-oriented, multi-DCS output |
| Unity App Generator | Schneider | Excel-based Modicon PLC generation |
| Ignition | Inductive Automation | Database-driven SCADA/HMI with Python scripting |
Asset-Centric vs Signal-Centric
Signal-Centric (Traditional): Start from I/O signals. AI_Card1_Ch3 -> create tag -> configure. Matches hardware but disconnected from equipment.
Asset-Centric (Modern): Start from physical equipment. Pump P-101A includes motor, flow, pressure, vibration, protection. Easier to template. Aligned with ISA-88/95.
| Approach | ABB Freelance | Siemens PCS 7 | Emerson DeltaV |
|---|
| Support | Moderate (MSR hierarchy) | Moderate (plant hierarchy) | Strong (class-based) |