Scripts & Data EnrichEnrichment (Tutorial) teaches you to:
- Create alarm groups and items
- Configure alarm conditions
- Set up notifications
- Enable audit trail for FDA 21 CFR Part 11 compliance
Prerequisites:
- calculated tags using expressions
- Build reusable logic with Script Classes
- Automate processes with Script Tasks
- Handle events and data transformations
- Monitor script performance and debugging
Prerequisites:
- Complete Solution (Tutorial) - uses TankFarm tags
- Basic understanding of C# or VB.NET syntaxAdd Tags to UNS (Tutorial)
In this page:
Table of Contents maxLevel 2 minLevel 2 indent 10px exclude Steps style none
Simple
use New Tag on top toolbar to create the Tag, type: double
: @Tag
TempC * 9/5 + 32
type: Text
: @Tag.Motor1_Running AND @Tag.Pump1_Running ?
:
@Tag
[SQL Database Query] - Database integration [Reports Module] - Automated reporting
Create Tag Expressions
- Navigate to Scripts → Expressions
- Add calculated tag:
Temperature Conversion:
Create TagName:- temperature conversion:
Field | Value |
---|---|
Object | Tag.Tank1_TempF ( |
create as Double) |
Expression |
Tag.Tank1_ |
Temp * 1.8 + 32 | |
Execution | OnChange |
Domain | Server |
- Add status logic:
Field | Value |
---|---|
Object | Tag. |
Conditional Logic:
Create TagName:System_Status ( |
create as String) |
Expression |
TIF(Tag.Tank1_Status = 2, "Running" |
, "Stopped") | |
Execution | OnChange |
Domain | Server |
Create Script Task
- Go to Scripts → Tasks
- Add new task:
- Click plus icon, name:
ShiftCounter
- Double-click to open Code Editor
- Enter code (no method wrapper):
csharp
// Reset counter at shift change
DateTime now = DateTime.Now;
if (now.Hour == 6 || now.Hour == 14 || now.Hour == 22)
{
if (@Tag.ShiftReset == false)
{
@Tag.Units_Previous = @Tag.Units_Produced;
@Tag.Units_Produced = 0;
@Tag.ShiftReset = true;
}
}
else
{
@Tag.ShiftReset = false;
}
Configure:
- Trigger: TimerPeriod
- RatePeriod: 60000ms 60000 (1 minute)
- Domain: Server
Build Script Class
- Navigate to Scripts → Classes
- Create class:
-
TankCalculations
- Enter methods (no class declaration):
csharp
public static double CalculateVolume(double level, double diameter)
{
double radius = diameter / 2;
return Math.PI * radius * radius * level;
}
public static double FlowRateCalculateFlowRate(double volumeStart, double volumeEnd, int minutes)
{
if {
(minutes == 0) return 0;
return (volumeEnd - volumeStart) / minutes;
}
public static string GetAlarmTextGetStatusText(double value, double limit)
{
if (value > limit)
return $"High: {value:F2} (Limit: {limit:F2})";
else
return "Normal";
}
Use Class in Expression
- Go to Scripts → Expressions
In tag expressions:
csharp
@Script- Create volume calculation:
Field | Value |
---|---|
Object | Tag.Tank1_Volume |
Expression | Script.Class.TankCalculations.CalculateVolume( |
Tag.Tank1_Level, |
10.5) |
Python Integration
- Scripts → Settings
- Enable Python
- Create Python script:
python
Execution | OnChange |
Note: No @ symbol needed in expressions
Event-Driven Task
- Create task:
TemperatureMonitor
- Configure trigger on tag change:
csharp
import numpy as np from datetime import datetime def calculate_statistics(values): """Calculate statistical values""" arr = np.array(values) returnif (@Tag.Tank1_Temp > @Tag.HighLimit)
{
'mean': np.mean(arr), 'std': np.std(arr),@Tag.Alarm_Active = true;
'max': np.max(arr), 'min': np.min(arr) } def predict_value(history, hours_ahead): """Simple linear prediction""" # Implementation here return predicted_value # Set tag values tags['Stats_Mean'] = calculate_statistics(history)['mean']
Event-Driven Scripts
Create event handler:
csharp
// On tag change event
public void OnTemperatureChange()
{
if (@Tag.Tank1_Temperature > @Tag.HighLimit)
{
@Tag.Alarm_Active = true;
@Tag.Alarm_Message = $"High Temperature: {@Tag.Tank1_Temp:F1}°C";
@Tag.Alarm_Time = DateTime.Now;
// Log to historian
@Script.Class.NotificationsServerMain.SendEmail(
"operator@company.com",
LogEvent(
"High Temperature AlertAlarm",
$"Tank 1: {@Tag.Tank1_Temperature}°C"
Temp
);
}
}
Bind to tagConfigure:
- Trigger: Tag: .Tank1_TemperatureTemp
- Event: OnValueChange
- Script: OnTemperatureChange
Test Scripts
- Start Runtime with debugger
- Set breakpoints in scripts
- Monitor script execution:
- Scripts → Monitor
- Check execution time
- View error messages
Next Steps
- Domain: Server
Add External References
- Go to Scripts → References
- Add DLL if using external libraries
- Open Code Editor
- Click Namespace Declarations
- Add required namespaces
Test and Debug
- Build verification:
- Check green checkmark in BuildStatus
- Review BuildErrors if red X
- Runtime monitoring:
- Go to Scripts → Monitor
- Check ExecutionCount
- Review LastCPUTime
- Debug with breakpoints:
- Enable debug in Runtime → Build and Publish
- Set breakpoints in Code Editor
- Attach debugger during runtime
Step-by-step guide to add calculations, automation, and data enrichment to your TankFarm solution using Scripts module capabilities.
[Create Dashboards] - Display calculationsIn this section...
Page Tree | ||||
---|---|---|---|---|
|