Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This guide walks you through configuring the Scripts module for custom automation and business logic. You'll create reusable classes, automated tasks, simple expressions, and integrate external libraries using C#, VB.NET, or Python.

Prerequisites:

  • Basic programming knowledge (C#, VB.NET, or Python)
  • Understanding of event-driven programming
  • Tags configured for script interaction
PanelborderWidth1borderStylesolidtitleOn this Page

In this page:

Table of Contents
maxLevel2
minLevel2
indent10px
excludeSteps
stylenone


Configuration Workflow

  1. Create ScriptClasses - Build reusable function libraries
  2. Create ScriptTasks - Implement automated processes
  3. Add ScriptExpressions - Simple one-line actions
  4. Add References - Include external DLL libraries
  5. Test and Debug - Verify script execution

Step 1: Create ScriptClasses

ScriptClasses are libraries of reusable methods available throughout your solution.

Creating a Class

  1. Navigate to Scripts → Classes
  2. Click Plus icon
  3. Configure:
    • Name: Class identifier
    • Code: Language (C#, VB.NET, Python)
    • Domain: Server or Client execution
    • ClassContent: Methods or Namespace
  4. Click OK
  5. Double-click to open Code Editor

Built-in Classes

ClassPurposeDomain
ServerMainMethods for all server tasksServer
ClientMainMethods for all client displaysClient

Example Class Method

csharp

public class ServerMain
{
    public double CalculateEfficiency(double input, double output)
    {
        if (input == 0) return 0;
        return (output / input) * 100;
    }
    
    public void LogEvent(string message)
    {
        @Alarm.AuditTrail.AddCustomMessage(message);
    }
}

Step 2: Create ScriptTasks

ScriptTasks execute code based on triggers or schedules.

Creating a Task

  1. Go to Scripts → Tasks
  2. Click Plus icon
  3. Configure:
    • Name: Task identifier
    • Code: Language selection
    • Domain: Server (default) or Client
    • Trigger: Execution condition
    • Period: Time interval (if periodic)
  4. Click OK
  5. Double-click to edit code

Built-in Tasks

TaskTriggerPurpose
Server StartupSolution startsInitialize server resources
Server ShutdownSolution stopsCleanup operations
Client StartupClient connectsSetup client environment
Client ShutdownClient disconnectsClient cleanup

Trigger Options

Trigger TypeExampleUse Case
Tag ChangeTag.TemperatureReact to value changes
ConditionTag.Level > 100Monitor thresholds
Interval00:00:30Periodic execution
ScheduleDaily at 06:00Scheduled reports
StartupBuilt-inInitialization

Example Task Code

csharp

// Task: MonitorProduction
// Trigger: Tag.ProductionRun (on change)

public void RunTask()
{
    if (@Tag.ProductionRun == 1)
    {
        @Tag.StartTime = DateTime.Now;
        @Tag.BatchNumber = @Tag.BatchNumber + 1;
        
        // Call class method
        @Script.Class.ServerMain.LogEvent("Production Started");
    }
    else
    {
        @Tag.EndTime = DateTime.Now;
        TimeSpan duration = @Tag.EndTime - @Tag.StartTime;
        @Tag.BatchDuration = duration.TotalMinutes;
    }
}

Step 3: Add ScriptExpressions

Expressions are single-line statements for simple operations.

Creating an Expression

  1. Navigate to Scripts → Expressions
  2. Add new row with:
PropertyDescriptionExample
ObjectTarget tagTag.Result
ExpressionCalculation/actionTag.Input1 + Tag.Input2
ExecutionWhen to runOnChange
TriggerOptional triggerTag.Calculate

Expression Methods

IIF Method (all parameters evaluated):

Tag.Status = IIF(Tag.Value > 100, "High", "Normal")

TIF Method (conditional evaluation):

TIF(Tag.Mode == 1, @Script.Class.Method1(), @Script.Class.Method2())

Common Expression Examples

csharp

// Mathematical
Tag.Average = (Tag.Value1 + Tag.Value2) / 2

// Conditional
Tag.Alarm = Tag.Temperature > Tag.Setpoint

// Method call
@Script.Class.ServerMain.CalculateEfficiency(Tag.Input, Tag.Output)

// String manipulation
Tag.FullName = Tag.FirstName + " " + Tag.LastName

Step 4: Add External References

Adding DLL References

  1. Go to Scripts → References
  2. Click Plus icon
  3. Browse and select DLL file
  4. Configure:
    • Name: Reference identifier
    • Domain: Server or Client
  5. Click OK

DLL Location Best Practices

LocationMacroUse For
ThirdParty folder_ThirdParty_Server-side DLLs
WpfControls folder_WpfControls_Client-side controls
Solution folder_SolutionPath_Solution-specific DLLs

Adding Namespaces

  1. Open Code Editor
  2. Click Namespace Declarations button
  3. Add using/import statements:

csharp

using System.Data;
using MyCustomLibrary;

Step 5: Test and Debug

Enable Debugging

  1. Go to Runtime → Build and Publish
  2. Enable Debug Information
  3. Save solution

Using the Debugger

  1. Start runtime (F5)
  2. Go to Runtime → Startup
  3. Click Connect
  4. Open script in Code Editor
  5. Click Attach .NET Debugger
  6. Set breakpoints by clicking line numbers
  7. Use step controls when stopped

Monitoring Execution

Check script performance:

csharp

// In expressions or displays
@Script.Task.MyTask.ExecutionCount    // Number of executions
@Script.Task.MyTask.LastCPUTime       // Last execution time

Code Editor Features

IntelliSense

  • Type . after objects for property list
  • Automatic method completion
  • Parameter hints

Productivity Tools

ToolShortcutPurpose
Format DocumentToolbarAuto-format code
CommentCtrl+K,CComment selection
UncommentCtrl+K,UUncomment selection
CompileF6Check for errors

Toolkit Methods

Common operations via TK namespace:

csharp

// Type conversion
double value = TK.ConvertTo<double>("123.45");

// Tag to DataTable
DataTable dt = TK.CopyTagToDataTable(@Tag.MyTemplate);

// Dynamic property access
object val = TK.GetPropertyValue(@Tag.MyTag, "Value");

Common Issues

Script Not Executing

  • Check trigger configuration
  • Verify InitialState is Enabled
  • Review BuildStatus for errors
  • Confirm domain (Server/Client)

Compilation Errors

  • Check BuildErrors column
  • Verify references resolved
  • Review namespace declarations
  • Ensure language syntax correct

DLL Not Found

  • Use macros instead of absolute paths
  • Place in correct folder (ThirdParty/WpfControls)
  • Restart script module after DLL update
  • Check Resolved status in References

Performance Issues

  • Monitor LastCPUTime property
  • Avoid infinite loops
  • Use async operations for long tasks
  • Optimize database queries

Best Practices

?

(tick) Use descriptive names - Clear task and class identification

?

(tick) Handle exceptions - Try-catch blocks for error handling

?

(tick) Reuse code - Create methods in classes

?

(tick) Comment complex logic - Document purpose and parameters

?

(tick) Test incrementally - Verify each script separately

?

(tick) Monitor performance - Check execution times

?

(tick) Avoid circular references - Classes shouldn't reference each other


Script Examples

Data Calculation Task

csharp

// Runs every 1 minute
public void CalculateKPIs()
{
    double production = @Tag.ProductionCount;
    double runtime = @Tag.RuntimeHours;
    
    if (runtime > 0)
    {
        @Tag.ProductionRate = production / runtime;
        @Tag.Efficiency = @Script.Class.ServerMain.
            CalculateEfficiency(@Tag.PlannedProduction, production);
    }
}

Alarm Response Expression

// Object: Tag.AlarmActive
// Expression:
TIF(Tag.Critical == 1, @Script.Class.ServerMain.SendAlert(), 0)

Client Display Initialization

csharp

// Client Startup Task
public void InitializeClient()
{
    @Display.MainPage.UserLabel = @Client.UserName;
    @Display.MainPage.LoginTime = DateTime.Now;
}

Next Steps

  • [Code Behind →] Scripts in displays
  • [Python Integration →] Configure Python scripts
  • [API Integration →] External system connections



In this section...

Page Tree
root@parent
spaces93DRAF