diff --git a/.gitignore b/.gitignore
index d351d02d..8f79c1cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,37 +1,8 @@
# Git Repository File Ignore Specifications
-# B&R Automation Studio project directory files
-
-*/AS/System/
-# Ignore Binaries/ directory (the entire folder)
-*/Binaries
-# Ignore everything INSIDE Diagnosis/ directory
-*/Diagnosis/**
-# Ignore Temp/ directory
-*/Temp
-
-# Ignore all .set and .isopen files
-*/*.set
-*/*.isopen
# Ignore .zip files, for the moment
*.zip
-# Exception for Diagnosis/ sub-directories -> these won't be committed anyways
-# because there are no files inside that will be committed
-# Credit: Jim G. on Stack Overflow https://stackoverflow.com/a/25916709/11402416
-!**/Diagnosis/**/
-# Exception for specific files within Diagnosis/
-#!*.tc
-
-
-# ******************************************************************************
-# Project specific ignore paths
-# ******************************************************************************
-# Save watch windows and task trace configurations
-!**/Diagnosis/**/*.PVM
-!**/Diagnosis/**/*.tc
-
-
# ignore temp files
*~
~*
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index fbdfba47..00000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 B&R Industrial Automation
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/mappFramework/.gitignore b/mappFramework/.gitignore
new file mode 100644
index 00000000..df653b36
--- /dev/null
+++ b/mappFramework/.gitignore
@@ -0,0 +1,29 @@
+# Git Repository File Ignore Specifications
+# B&R Automation Studio project directory files
+
+/AS/System/
+# Ignore Binaries/ directory (the entire folder)
+/Binaries
+# Ignore (all) debugging content
+/Diagnosis/**
+# But save the watch windows and task trace configurations (if it should stay in the repository)
+!/Diagnosis/**/
+!/Diagnosis/**/*.PVM
+!/Diagnosis/**/*.tc
+# Ignore Temp/ directory
+/Temp/
+#Ignore Upgrades
+/Upgrades/
+# Ignore all .set and .isopen files
+/*.set
+/*.isopen
+/debug.log
+
+# Ignore .zip files, for the moment
+/*.zip
+
+# ignore temp files
+*~
+~*
+*.[Bb]ak
+*.[Oo]rig
diff --git a/mappFramework/Logical/ChineseHelp/Package.pkg b/mappFramework/Logical/ChineseHelp/Package.pkg
index 72b19261..bce57007 100644
--- a/mappFramework/Logical/ChineseHelp/Package.pkg
+++ b/mappFramework/Logical/ChineseHelp/Package.pkg
@@ -1,5 +1,5 @@
-
+
diff --git a/mappFramework/Logical/ChineseHelp/mappFramwork.chm b/mappFramework/Logical/ChineseHelp/mappFramwork.chm
index b66dc757..014eeb7f 100644
Binary files a/mappFramework/Logical/ChineseHelp/mappFramwork.chm and b/mappFramework/Logical/ChineseHelp/mappFramwork.chm differ
diff --git a/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmMgr.st b/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmMgr.st
index 2eb54dfa..b494db3c 100644
--- a/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmMgr.st
+++ b/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmMgr.st
@@ -16,7 +16,7 @@ PROGRAM _INIT
END_IF
// Call action to intialize alarm samples
- AlarmSampleInit;
+ AlarmSampleInit;
// Initialize mapp function blocks
MpAlarmXCore_0.Enable := TRUE;
@@ -29,12 +29,14 @@ PROGRAM _INIT
MpAlarmXHistory_0();
MpAlarmXListUI_0.Enable := TRUE;
+ MpAlarmXListUI_0.MpLink := ADR(gMpLinkAlarmXCore);
MpAlarmXListUI_0.UISetup.AlarmListScrollWindow := 10;
MpAlarmXListUI_0.UISetup.AlarmListSize := 50;
MpAlarmXListUI_0.UISetup.TimeStampPattern := '%Y %m %d %H:%M:%S';
MpAlarmXListUI_0();
MpAlarmXHistoryUI_0.Enable := TRUE;
+ MpAlarmXHistoryUI_0.MpLink := ADR(gMpLinkAlarmXHistory);
MpAlarmXHistoryUI_0.UISetup.AlarmListScrollWindow := 10;
MpAlarmXHistoryUI_0.UISetup.AlarmListSize := (SIZEOF(MpAlarmXListUIConnect.AlarmList.InstanceID) / SIZEOF(MpAlarmXListUIConnect.AlarmList.InstanceID[0]));
MpAlarmXHistoryUI_0.UISetup.TimeStampPattern := '%Y %m %d %H:%M:%S';
@@ -53,7 +55,7 @@ PROGRAM _CYCLIC
END_IF
// Call all cyclic actions
- AlarmHandling;
+ AlarmHandling;
GetBacktraceInformation;
ExecuteQuery;
QueryTableConfig;
diff --git a/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmSamples.st b/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmSamples.st
index d8026a4b..552ad5bd 100644
--- a/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmSamples.st
+++ b/mappFramework/Logical/Infrastructure/AlarmX/AlarmMgr/AlarmSamples.st
@@ -4,18 +4,18 @@ ACTION AlarmSampleInit:
// If AlarmExamples.LevelMonitoring gets less than 20 or more than 80, the LevelMonitoringExample alarm will trigger
// The Low limit is 20. The LowLow limit is 10. The High limit is 80. The HighHigh limit is 90.
- AlarmExamples.LevelMonitoring := 50;
+ AlarmExamples.LevelMonitoring := 50;
// If AlarmExamples.DeviationMonitoring deviates from the setpoint (AlarmExamples.DeviationMonitoringSetpoint) by more than 5
// units in either direction, the DeviationMonitoringExample alarm will trigger
- AlarmExamples.DeviationMonitoring := 15;
+ AlarmExamples.DeviationMonitoring := 15;
AlarmExamples.DeviationMonitoringSetpoint := 15;
// If AlarmExamples.RateOfChange increases at a rate of more than 5 units per second, the RateOfChangeExample alarm will trigger
- AlarmExamples.RateOfChange := 0;
+ AlarmExamples.RateOfChange := 0;
// If AlarmExamples.SnippetValue gets between 50 and 100, an alarm will trigger and the current value will be shown in the alarm text
- AlarmExamples.SnippetValue := 10;
+ AlarmExamples.SnippetValue := 10;
END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditAlarms.tmx b/mappFramework/Logical/Infrastructure/Audit/AuditAlarms.tmx
new file mode 100644
index 00000000..27643d0d
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditAlarms.tmx
@@ -0,0 +1,20 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ Audit/Alarms
+
+
+
+
+ Servus Welt!
+
+
+ Hello world!
+
+
+ Bonjour tout le monde!
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.st b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.st
new file mode 100644
index 00000000..2cac84a4
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.st
@@ -0,0 +1,118 @@
+//***********************************************************************
+// Copyright: B&R Industrial Automation GmbH
+// Author: B&R Industrial Automation GmbH
+// Created: Sept 1, 2022
+// Description: Task for audit management.
+//***********************************************************************
+
+PROGRAM _INIT
+
+ // Create folder for this component on the user file device
+ DirCreate_0(enable := TRUE, pDevice := ADR('UserPartition'), pName := ADR(LOCAL_FOLDER));
+
+ // Check if folder already exist and if so disabled the function block call
+ IF DirCreate_0.status = fiERR_DIR_ALREADY_EXIST THEN
+ DirCreate_0(enable := FALSE);
+ END_IF
+
+ // Initialize mapp function blocks
+ MpAuditTrail_0.Enable := TRUE;
+ MpAuditTrail_0.MpLink := ADR(gMpLinkAuditTrail);
+ MpAuditTrail_0.Language := ADR('en');
+ MpAuditTrail_0.DeviceName := ADR('mappAuditFiles');
+ MpAuditTrail_0();
+
+ MpAuditTrailConfig_0.Enable := TRUE;
+ MpAuditTrailConfig_0.MpLink := ADR(gMpLinkAuditTrail);
+ MpAuditTrailConfig_0.Configuration := ADR(AuditTrailConfig);
+ MpAuditTrailConfig_0.Load := TRUE;
+ MpAuditTrailConfig_0();
+
+ MpAuditTrail_CEvents.Enable := TRUE;
+ MpAuditTrail_CEvents.MpLink := ADR(gMpLinkCustomEvents);
+ MpAuditTrail_CEvents();
+
+ // Initialize custom events
+ CustomEvent[0].Type := "Custom Event Type";
+ CustomEvent[0].Msg := "Custom Event Message";
+ CustomEvent[0].Comment := "Custom Event Comment";
+
+ CustomEvent[1].Type := "Audit Test";
+ CustomEvent[1].Msg := "This is a custom event test msg";
+ CustomEvent[1].Comment := "If you see this it was a success!";
+
+ CustomEvent[2].Type := "Cmd Exe";
+ CustomEvent[2].Msg := "The run query command was pressed on the HMI";
+ CustomEvent[2].Comment := "Result can be seen in the Query tab";
+
+ HmiAudit.Status.Query.Name := 'UserEvents';
+ HmiAudit.Status.Query.Option := 1;
+
+ // Configuring the query selection, reading the available components
+ HmiAudit.Parameters.QuerySelection[0] := 'UserXMgr';
+ HmiAudit.Parameters.QuerySelection[1] := 'RecipeMgr';
+
+ IF (ST_ident(ADR(HmiAudit.Parameters.QuerySelection[0]), 0, ADR(ident)) = 0) AND (ST_ident(ADR(HmiAudit.Parameters.QuerySelection[1]), 0, ADR(ident)) = 0) THEN
+ HmiAudit.Status.DeviceDataProvider[0] := '{"value":"UserEvents","text":"User Events Query"}';
+ HmiAudit.Status.DeviceDataProvider[1] := '{"value":"RecipeEvents","text":"Recipe Events Query"}';
+ ELSIF (ST_ident(ADR(HmiAudit.Parameters.QuerySelection[0]), 0, ADR(ident)) <> 0) AND (ST_ident(ADR(HmiAudit.Parameters.QuerySelection[1]), 0, ADR(ident)) = 0) THEN
+ HmiAudit.Status.DeviceDataProvider[0] := '{"value":"RecipeEvents","text":"Recipe Events Query"}';
+ ELSIF (ST_ident(ADR(HmiAudit.Parameters.QuerySelection[0]), 0, ADR(ident)) = 0) AND (ST_ident(ADR(HmiAudit.Parameters.QuerySelection[1]), 0, ADR(ident)) <> 0) THEN
+ HmiAudit.Status.DeviceDataProvider[0] := '{"value":"UserEvents","text":"User Events Query"}';
+ END_IF
+
+END_PROGRAM
+
+PROGRAM _CYCLIC
+
+ // Call all cyclic actions
+ ExecuteQuery;
+ QueryTableConfig;
+ ArchiveExport;
+ ArchiveSettings;
+ ChangeConfiguration;
+
+ // Sample code for how custom events can be triggered. Use custom events as needed around the application for debugging purposes.
+ IF EDGEPOS(CustomEvent[0].Set) THEN
+ MpAuditCustomEvent(gMpLinkCustomEvents,CustomEvent[0].Type,CustomEvent[0].Msg,CustomEvent[0].Comment);
+ END_IF
+ IF EDGENEG(CustomEvent[1].Set) THEN
+ MpAuditCustomEvent(gMpLinkCustomEvents,CustomEvent[1].Type,CustomEvent[1].Msg,CustomEvent[1].Comment);
+ END_IF
+
+ // Change sample variable randomly to trigger a value change event
+ IF VariableMonitorExample = 0 THEN
+ VariableMonitorExample := 10.5;
+ END_IF
+
+ // Error reset
+ IF NOT MpAuditTrail_0.Error THEN
+ MpAuditTrail_0.ErrorReset := FALSE;
+ END_IF
+
+ // Assign MpLinks and HMI connections
+ MpAuditTrail_0.MpLink := ADR(gMpLinkAuditTrail);
+ MpAuditTrailConfig_0.MpLink := ADR(gMpLinkAuditTrail);
+ MpAuditTrail_CEvents.MpLink := ADR(gMpLinkCustomEvents);
+
+ // Call function blocks
+ MpAuditTrail_0();
+ MpAuditTrailConfig_0();
+ MpAuditTrail_CEvents();
+
+END_PROGRAM
+
+PROGRAM _EXIT
+
+ // Disable the function blocks to unlink the MpLinks
+ MpAuditTrail_0.Enable := FALSE;
+ MpAuditTrailConfig_0.Enable := FALSE;
+ MpAuditTrail_CEvents.Enable := FALSE;
+
+ // Call function blocks
+ MpAuditTrail_0();
+ MpAuditTrailConfig_0();
+ MpAuditTrail_CEvents();
+
+END_PROGRAM
+
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.typ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.typ
new file mode 100644
index 00000000..0d8bdf5c
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.typ
@@ -0,0 +1,73 @@
+
+TYPE
+ AuditQueryHMIType : STRUCT (*Datatype for the structure which rearranges the query data from AuditQuery into a structure of arrays for easy connection to the Table widget in mapp View*)
+ EvTime : ARRAY[0..MAX_QUERY_RESULTS]OF DATE_AND_TIME; (*ActiveAudits query, Event-Time column*)
+ Text : ARRAY[0..MAX_QUERY_RESULTS]OF WSTRING[100]; (*ActiveAudits query, Text column*)
+ DText : ARRAY[0..MAX_QUERY_RESULTS]OF WSTRING[100]; (*ActiveAudits query, Display Text column*)
+ Op : ARRAY[0..MAX_QUERY_RESULTS]OF WSTRING[100]; (*ActiveAudits query, Operator-Name column*)
+ QueryCount : USINT; (*Count of query results for building the query table configuration string*)
+ Name : STRING[80]; (*Name of the query to be executed*)
+ Option : USINT; (*Index value of the selected query type in the dropdown on the query tab*)
+ END_STRUCT;
+ ActiveAuditStateEnum :
+ ( (*Enumeration for the state for the query state machine*)
+ ACTIVE_AUDIT_WAIT, (*Wait state*)
+ ACTIVE_AUDIT_QUERY, (*State to query the Audit data*)
+ ACTIVE_AUDIT_NEXT (*State to check if more Audits meet the query criteria and need to be queried*)
+ );
+ AuditCustomEventType : STRUCT (*Structure for custom events handling*)
+ Set : BOOL; (*Trigger the assigned function*)
+ Type : WSTRING[100]; (*Entered when creating the entry under %typ*)
+ Msg : WSTRING[100]; (*Entered when creating the entry under %msg *)
+ Comment : WSTRING[100]; (*Entered when creating the entry under %cmt *)
+ END_STRUCT;
+ AuditQueryType : STRUCT (*Structure for query results and status*)
+ State : ActiveAuditStateEnum; (*State variable for the query state machine*)
+ LastUpdateCount : UDINT; (*Previous count of query results. Used to check for new query data. *)
+ UpdateCountRecipe : UDINT; (*Count of query results. Increases each time new results are availble. *)
+ UpdateCount : UDINT; (*Count of query results. Increases each time new results are availble. *)
+ Audits : ARRAY[0..MAX_QUERY_RESULTS]OF AuditType; (*Query data*)
+ Next : BOOL; (*Trigger to query the next data, if there are more results than MAX_QUERY_RESULTS*)
+ END_STRUCT;
+ AuditHmiInterfaceType : STRUCT (*Structure to hold commands and status from the HMI*)
+ Commands : AuditCommandsType; (*HMI commands*)
+ Parameters : AuditParType; (*HMI parameters*)
+ Status : {REDUND_UNREPLICABLE} AuditStatusType; (*HMI status*)
+ END_STRUCT;
+ AuditCommandsType : STRUCT (*Structure to hold the commands from the HMI*)
+ ExportArchives : BOOL; (*Triggers an Audit export of the Audit history. Connected to a button on the HMI. *)
+ RunQuery : BOOL; (*Triggers the query to run. Connected to a button on the HMI. *)
+ SaveConfig : BOOL; (*Starts the configuration for archives*)
+ END_STRUCT;
+ AuditStatusType : STRUCT (*Structure to hold status information from the mapp View HMI. (This structure is not compatible/relevant if you are using a VC4 visualization)*)
+ AuditSortCfg : STRING[1000]; (*Sort configuration for the AuditList widget*)
+ AuditFilterCfg : STRING[1000]; (*Filter configuration for the AuditList widget*)
+ TableConfig : ARRAY[0..1]OF STRING[255]; (*Table configuration for the Audit query Table*)
+ Query : AuditQueryHMIType; (*Structure which rearranges the query data from AuditQuery into a structure of arrays for easy connection to the Table widget*)
+ CustomEventSortCfg : STRING[1000]; (*Sort configuration for the AuditList Custom Events widget*)
+ CustomEventsFilterCfg : STRING[1000]; (*Filter configuration for the AuditList Custom Events widget*)
+ ArchiveAvailable : BOOL; (*At least 1 archive is available for export*)
+ NumberOfArchives : UINT; (*How many archives are available for export*)
+ DeviceDataProvider : ARRAY[0..1]OF STRING[100]; (*Data provider for the file device selector*)
+ END_STRUCT;
+ AuditParType : STRUCT (*Structure to hold parameter data for the HMI*)
+ ArchiveSettings : AuditArchiveParType; (*Parameter for archive configuration*)
+ QuerySelection : ARRAY[0..MAX_QUERIES]OF STRING[10]; (*The selection in the query dropdown on the query tab of the Audit content*)
+ END_STRUCT;
+ AuditArchiveParType : STRUCT (*Automatic archive settings*)
+ Enable : BOOL; (*Enable automatic archive feature*)
+ MaxSize : UDINT; (*Name prefix for each automatic backup file*)
+ Mode : MpAuditArchiveModeEnum; (*Mode (daily, Mo-Fr or by batch)*)
+ Hour : USINT; (*Time (hour)*)
+ Minute : USINT; (*Time (minutes)*)
+ FileType : MpAuditFileTypeEnum := mpAUDIT_FILE_TYPE_XML; (*File type selection (XML, TXT, PDF)*)
+ END_STRUCT;
+ AuditType : STRUCT (*Structure to hold the Audit data for the query results*)
+ EvTime : DATE_AND_TIME; (*ActiveAudits query, Event-Time column*)
+ Text : WSTRING[100]; (*ActiveAudits query, Text column*)
+ DText : WSTRING[100]; (*ActiveAudits query, Display Text column*)
+ Op : WSTRING[100]; (*ActiveAudits query, Operator-Name column*)
+ END_STRUCT;
+END_TYPE
+
+(*Enumerations*)
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.var b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.var
new file mode 100644
index 00000000..51f5ecce
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/AuditMgr.var
@@ -0,0 +1,28 @@
+(*Function Blocks*)
+VAR
+ DirCreate_0 : DirCreate; (*DirCreate instance*)
+ MpAuditTrail_0 : MpAuditTrail; (*AuditTrail for regular mapp events*)
+ MpAuditTrailConfig_0 : MpAuditTrailConfig; (*AuditTrail configuration*)
+ MpAuditTrail_CEvents : MpAuditTrail; (*AuditTrail for custom events*)
+ QueryUserEvents_0 : {REDUND_UNREPLICABLE} MpAuditQuery; (*MpAlarmXQuery instance*)
+END_VAR
+(*Constants*)
+VAR CONSTANT
+ MAX_QUERY_RESULTS : USINT := 19; (*Maximum number of query results (Value+1)*)
+ LOCAL_FOLDER : STRING[10] := 'Audit'; (*Folder name on the file device for UserX files*)
+ MAX_CUSTOM_EVENTS : USINT := 9; (*Maximum number of custom events*)
+ MAX_QUERIES : USINT := 2; (*Maximum number of configured queries*)
+END_VAR
+(*Structure Types*)
+VAR
+ HmiAudit : AuditHmiInterfaceType; (*HMI interface structure*)
+ CustomEvent : ARRAY[0..MAX_CUSTOM_EVENTS] OF AuditCustomEventType; (*Custom events*)
+ AuditQuery : {REDUND_UNREPLICABLE} AuditQueryType; (*Query results and status*)
+ AuditTrailConfig : MpAuditTrailConfigType; (*Configuration structure for changing archiving setup*)
+END_VAR
+(*Variables*)
+VAR
+ i : USINT; (*Index for loops*)
+ ident : UDINT; (*Identifier for task deployment*)
+ VariableMonitorExample : REAL; (*Used for the variable monitor example*)
+END_VAR
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/ChangeConfiguration.st b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/ChangeConfiguration.st
new file mode 100644
index 00000000..101bf3d4
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/ChangeConfiguration.st
@@ -0,0 +1,30 @@
+ACTION ChangeConfiguration:
+
+ MpAuditTrailConfig_0.MpLink := ADR(gMpLinkAuditTrail);
+ MpAuditTrailConfig_0.Configuration := ADR(AuditTrailConfig);
+
+ IF (MpAuditTrailConfig_0.Error = TRUE) THEN
+ IF (MpAuditTrailConfig_0.StatusID = mpAUDIT_ERR_CONFIG_LOAD) THEN
+ LoadAuditConfiguration;
+ END_IF
+ MpAuditTrailConfig_0.Load := FALSE;
+ MpAuditTrailConfig_0.Save := FALSE;
+ MpAuditTrailConfig_0.ErrorReset := TRUE;
+ END_IF
+
+ MpAuditTrailConfig_0();
+ MpAuditTrailConfig_0.ErrorReset := FALSE;
+
+ IF (MpAuditTrailConfig_0.CommandDone = TRUE) THEN
+ IF (MpAuditTrailConfig_0.Load = TRUE) THEN
+ LoadAuditConfiguration;
+ END_IF
+ // after save the AuditTrail needs to restart
+ IF (MpAuditTrailConfig_0.Save = TRUE) THEN
+ MpAuditTrail_0.Enable := FALSE;
+ END_IF
+ MpAuditTrailConfig_0.Load := FALSE;
+ MpAuditTrailConfig_0.Save := FALSE;
+ END_IF
+
+END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/ExecuteQuery.st b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/ExecuteQuery.st
new file mode 100644
index 00000000..0837991f
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/ExecuteQuery.st
@@ -0,0 +1,67 @@
+ACTION ExecuteQuery:
+
+ // Initialize mapp function block
+ QueryUserEvents_0.MpLink := ADR(gMpLinkAuditTrail);
+ QueryUserEvents_0.Enable := TRUE;
+ QueryUserEvents_0.Name := ADR(HmiAudit.Status.Query.Name);
+ QueryUserEvents_0.Language := ADR('en');
+ QueryUserEvents_0();
+
+ CASE (AuditQuery.State) OF
+ ACTIVE_AUDIT_WAIT:
+ // Wait until the RunQuery command is triggered from the HMI.
+ // If you prefer that the query runs anytime new data is available, then uncomment line 15 and comment out line 16 and delete
+ // the "Run query" button from the HMI.
+ //IF (AuditQuery.LastUpdateCount <> AuditQuery.UpdateCount) THEN
+ IF (HmiAudit.Commands.RunQuery = TRUE) THEN
+ // Call the custom event function when the query execution is triggered
+ MpAuditCustomEvent(gMpLinkCustomEvents,CustomEvent[2].Type,CustomEvent[2].Msg,CustomEvent[2].Comment);
+ brsmemset(ADR(AuditQuery.Audits[0]), 0, SIZEOF(AuditQuery.Audits));
+ AuditQuery.LastUpdateCount := AuditQuery.UpdateCount;
+ QueryUserEvents_0.Execute := TRUE;
+ HmiAudit.Commands.RunQuery := FALSE;
+ IF (HmiAudit.Status.Query.Name = 'UserEvents') THEN
+ HmiAudit.Status.Query.Option := 0;
+ ELSIF (HmiAudit.Status.Query.Name = 'RecipeEvents') THEN
+ HmiAudit.Status.Query.Option := 1;
+ END_IF
+
+ AuditQuery.State := ACTIVE_AUDIT_QUERY;
+ END_IF
+
+ ACTIVE_AUDIT_QUERY:
+ // If the number of query results is less than MAX_QUERY_RESULTS, return to the wait state
+ IF ((QueryUserEvents_0.CommandDone = TRUE) AND (QueryUserEvents_0.Info.HasMoreRows = FALSE)) THEN
+ // Call the custom event function when the query execution is done
+ MpAuditCustomEvent(gMpLinkCustomEvents,"Cmd Done","Executing the query command has finished","For additional information check the logger.");
+ QueryUserEvents_0.Execute := FALSE;
+ QueryUserEvents_0.Next := FALSE;
+ AuditQuery.State := ACTIVE_AUDIT_WAIT;
+ // If the number of query results is more than MAX_QUERY_RESULTS, then query the next set of results
+ ELSIF ((QueryUserEvents_0.CommandDone = TRUE) AND (QueryUserEvents_0.Info.HasMoreRows = TRUE)) THEN
+ QueryUserEvents_0.Next := FALSE;
+ AuditQuery.State := ACTIVE_AUDIT_NEXT;
+ END_IF
+
+ ACTIVE_AUDIT_NEXT:
+ IF (AuditQuery.Next = TRUE) THEN
+ // By default, AuditQuery.Alarms has 20 elements, so it can hold 20 query results at a time (MAX_QUERY_RESULTS = 19).
+ // If AuditQuery.Next is true, this means the query result is more than 20 alarms.
+ // If you want to save the data for the first 20 alarms, add code here to copy AuditQuery.Alarms to another location.
+ // Otherwise, the older alarms in the query will get overwritten with the newest entries here.
+ brsmemset(ADR(AuditQuery.Audits[0]), 0, SIZEOF(AuditQuery.Audits));
+ AuditQuery.Next := FALSE;
+ QueryUserEvents_0.Next := TRUE;
+ AuditQuery.State := ACTIVE_AUDIT_QUERY;
+ END_IF
+ END_CASE
+
+ // Convert the query results into arrays that can easily be bound to the Table widget in mapp View
+ FOR i := 0 TO MAX_QUERY_RESULTS DO
+ HmiAudit.Status.Query.EvTime[i] := AuditQuery.Audits[i].EvTime;
+ HmiAudit.Status.Query.Op[i] := AuditQuery.Audits[i].Op;
+ HmiAudit.Status.Query.Text[i] := AuditQuery.Audits[i].Text;
+ HmiAudit.Status.Query.DText[i] := AuditQuery.Audits[i].DText;
+ END_FOR
+
+END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/HMIActions.st b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/HMIActions.st
new file mode 100644
index 00000000..7247fef3
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/HMIActions.st
@@ -0,0 +1,77 @@
+ACTION ArchiveExport:
+
+ // Assign variables to exchange with the HMI
+ MpAuditTrail_0.ExportArchive := HmiAudit.Commands.ExportArchives;
+ HmiAudit.Status.ArchiveAvailable := MpAuditTrail_0.ArchiveAvailable;
+ HmiAudit.Status.NumberOfArchives := MpAuditTrail_0.Info.NumberArchives;
+
+ IF (HmiAudit.Commands.ExportArchives AND MpAuditTrail_0.CommandDone) THEN
+ HmiAudit.Commands.ExportArchives := FALSE;
+ END_IF
+
+END_ACTION
+
+ACTION ArchiveSettings:
+
+ // Audit Trail Config implementation
+ IF (HmiAudit.Commands.SaveConfig = TRUE) THEN
+ HmiAudit.Commands.SaveConfig := FALSE;
+ SaveAuditConfiguration;
+ MpAuditTrailConfig_0.Save := TRUE;
+ END_IF
+
+ // After the configuration has been changed the AuditTrail is reset (disabled). This re-enables the component
+ IF MpAuditTrail_0.Active = FALSE THEN
+ MpAuditTrail_0.Enable := TRUE;
+ END_IF
+
+END_ACTION
+
+ACTION SaveAuditConfiguration:
+
+ // Assign current parameters from the HMI structure to AuditTrail configuration before saving it
+ AuditTrailConfig.Archive.Time := UDINT_TO_TOD((((USINT_TO_UDINT(HmiAudit.Parameters.ArchiveSettings.Hour) * 60) +
+ HmiAudit.Parameters.ArchiveSettings.Minute) * 60) * 1000);
+ AuditTrailConfig.Archive.Enable := HmiAudit.Parameters.ArchiveSettings.Enable;
+ AuditTrailConfig.Archive.MaxSize := HmiAudit.Parameters.ArchiveSettings.MaxSize;
+ AuditTrailConfig.Archive.Mode := HmiAudit.Parameters.ArchiveSettings.Mode;
+ AuditTrailConfig.Export.FileType := HmiAudit.Parameters.ArchiveSettings.FileType;
+
+ END_ACTION
+
+ACTION LoadAuditConfiguration:
+
+ // Assign current parameters from the configuration to the HMI structure
+ HmiAudit.Parameters.ArchiveSettings.Hour := UDINT_TO_USINT(TOD_TO_UDINT(AuditTrailConfig.Archive.Time) / 1000 / 60 / 60);
+ HmiAudit.Parameters.ArchiveSettings.Minute := UDINT_TO_USINT(TOD_TO_UDINT(AuditTrailConfig.Archive.Time) / 1000 / 60) -
+ (HmiAudit.Parameters.ArchiveSettings.Hour * 60);
+ HmiAudit.Parameters.ArchiveSettings.Enable := AuditTrailConfig.Archive.Enable;
+ HmiAudit.Parameters.ArchiveSettings.MaxSize := AuditTrailConfig.Archive.MaxSize;
+ HmiAudit.Parameters.ArchiveSettings.Mode := AuditTrailConfig.Archive.Mode;
+ HmiAudit.Parameters.ArchiveSettings.FileType := AuditTrailConfig.Export.FileType;
+
+END_ACTION
+
+ACTION QueryTableConfig:
+
+ // Configure visible list
+ HmiAudit.Status.TableConfig[0] := '{ "specRows": [{"from":';
+ HmiAudit.Status.Query.QueryCount := 0;
+ FOR i := 0 TO 9 DO
+ IF HmiAudit.Status.Query.Text[i] <> "" THEN
+ HmiAudit.Status.Query.QueryCount := i + 1;
+ END_IF
+ END_FOR
+ brsitoa((HmiAudit.Status.Query.QueryCount), ADR(HmiAudit.Status.TableConfig[0]) + brsstrlen(ADR(HmiAudit.Status.TableConfig[0])));
+ brsstrcat(ADR(HmiAudit.Status.TableConfig[0]), ADR(',"to":19, "visible":false}]'));
+
+ // Hide operator column for the recipe query
+ IF (HmiAudit.Status.Query.Option = 0) THEN
+ brsstrcat(ADR(HmiAudit.Status.TableConfig[0]), ADR(', "specColumns": [ {"from":1, "to":1, "visible":true}]'));
+ ELSIF (HmiAudit.Status.Query.Option = 1) THEN
+ brsstrcat(ADR(HmiAudit.Status.TableConfig[0]), ADR(', "specColumns": [ {"from":1, "to":1, "visible":false}]'));
+ END_IF
+
+ brsstrcat(ADR(HmiAudit.Status.TableConfig[0]), ADR('}'));
+
+END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/Audit/AuditMgr/IEC.prg b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/IEC.prg
new file mode 100644
index 00000000..a19ea54b
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/AuditMgr/IEC.prg
@@ -0,0 +1,12 @@
+
+
+
+
+ AuditMgr.st
+ AuditMgr.typ
+ AuditMgr.var
+ HMIActions.st
+ ExecuteQuery.st
+ ChangeConfiguration.st
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/CommonText/Package.pkg b/mappFramework/Logical/Infrastructure/Audit/CommonText/Package.pkg
new file mode 100644
index 00000000..99fb860f
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/CommonText/Package.pkg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtBackupF.tmx b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtBackupF.tmx
new file mode 100644
index 00000000..5a1a7f0a
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtBackupF.tmx
@@ -0,0 +1,45 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/Backup
+
+
+
+
+ Sicherungserstellung gestartet {&dev}:{&file}
+
+
+ 备份创建开始 {&dev}:{&file}
+
+
+ Backup creation started {&dev}:{&file}
+
+
+ Bonjour tout le monde!
+
+
+
+
+ Sicherungserstellung abgeschlossen {&dev}:{&file}
+
+
+ 备份创建完成 {&dev}:{&file}
+
+
+ Backup creation completed {&dev}:{&file}
+
+
+
+
+ Sicherungsinstallation {&dev}:{&file}
+
+
+ 备份安装 {&dev}:{&file}
+
+
+ Backup installing {&dev}:{&file}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtFileF.tmx b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtFileF.tmx
new file mode 100644
index 00000000..a71d003f
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtFileF.tmx
@@ -0,0 +1,144 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/File
+
+
+
+
+ Ein Ordner/eine Datei wurde erstellt: {&file}
+
+
+ 创建了一个文件夹/文件:{&file}
+
+
+ A folder/file was created: {&file}
+
+
+ Bonjour tout le monde!
+
+
+
+
+ Ein Ordner/Datei wurde überschrieben: {&file}
+
+
+ 文件夹/文件被覆盖:{&file}
+
+
+ A folder/file was overwritten: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde hinzugefügt: {&file}
+
+
+ 添加了一个文件夹/文件:{&file}
+
+
+ A folder/file was added: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde gelöscht: {&file}
+
+
+ 文件夹/文件已删除:{&file}
+
+
+ A folder/file was deleted: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde umbenannt: {&file}
+
+
+ 文件夹/文件已重命名:{&file}
+
+
+ A folder/file was renamed: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde gelesen: {&file}
+
+
+ 已读取文件夹/文件:{&file}
+
+
+ A folder/file was read: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde kopiert: {&file}
+
+
+ 复制了一个文件夹/文件:{&file}
+
+
+ A folder/file was copied: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde ausgeschnitten: {&file}
+
+
+ 文件夹/文件被剪切:{&file}
+
+
+ A folder/file was cut: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde zuerst kopiert und dann eingefügt. Ein neuer Ordner/eine neue Datei wurde erstellt.
+
+
+ 文件夹/文件首先被复制然后粘贴。 创建了一个新文件夹/文件。
+
+
+ A folder/file was first copied and then pasted. A new folder/file was created.
+
+
+
+
+ Ein Ordner/Datei wurde zuerst kopiert und dann eingefügt. Der vorhandene Ordner/Datei wurde überschrieben.
+
+
+ 文件夹/文件首先被复制然后粘贴。 现有文件夹/文件被覆盖。
+
+
+ A folder/file was first copied and then pasted. The existing folder/file was overwritten.
+
+
+
+
+ Ein Ordner/Datei wurde gesperrt: {&file}
+
+
+ 文件夹/文件被锁定:{&file}
+
+
+ A folder/file was locked: {&file}
+
+
+
+
+ Ein Ordner/Datei wurde entsperrt: {&file}
+
+
+ 文件夹/文件已解锁:{&file}
+
+
+ A folder/file was unlocked: {&file}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtRecipeF.tmx b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtRecipeF.tmx
new file mode 100644
index 00000000..037c9159
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtRecipeF.tmx
@@ -0,0 +1,64 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/Recipe
+
+
+
+
+ Start Laden von Rezept {&dev}:{&file}
+
+
+ 开始加载配方 {&dev}:{&file}
+
+
+ Start Loading Recipe {&dev}:{&file}
+
+
+
+
+ Ende Laden von Rezept
+
+
+ 结束加载配方
+
+
+ End Loading Recipe
+
+
+
+
+ Rezept {&dev}:{&file} gespeichert
+
+
+ 保存的配方 {&dev}:{&file}
+
+
+ Saved Recipe {&dev}:{&file}
+
+
+
+
+ Rezept {&dev}:{&old} umbenannt auf {&new}
+
+
+ 将配方 {dev}:{old} 重命名为 {new}
+
+
+ Renamed Recipe {&dev}:{&old} to {&new}
+
+
+
+
+ Rezept {&dev}:{&file} gelöscht
+
+
+ 已删除配方 {&dev}:{&file}
+
+
+ Deleted Recipe {&dev}:{&file}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtUserF.tmx b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtUserF.tmx
new file mode 100644
index 00000000..deab74c2
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/CommonText/TxtUserF.tmx
@@ -0,0 +1,163 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/User
+
+
+
+
+ Angemeldet
+
+
+ 登录
+
+
+ logged in
+
+
+
+
+ Abgemeldet
+
+
+ 登出
+
+
+ logged out
+
+
+
+
+ Abgemeldet (Timeout)
+
+
+ 已注销(超时)
+
+
+ was logged out (timeout)
+
+
+
+
+ Anwender {&usr} zugefügt
+
+
+ 添加用户 {&usr}
+
+
+ added user {&usr}
+
+
+
+
+ Anwender {&usr} gelöscht
+
+
+ 已删除用户 {&usr}
+
+
+ deleted user {&usr}
+
+
+
+
+ Anwender {&usr} gesperrt
+
+
+ 锁定用户 {&usr}
+
+
+ locked user {&usr}
+
+
+
+
+ Anwender {&usr} entsperrt
+
+
+ 解锁用户 {&usr}
+
+
+ unlocked user {&usr}
+
+
+
+
+ Gesperrt (inkorrektes Passwort)
+
+
+ 被锁定(密码错误)
+
+
+ got locked (incorrect password)
+
+
+
+
+ Passwort geändert
+
+
+ 已更改密码
+
+
+ has changed password
+
+
+
+
+ Falscher Name eingegeben
+
+
+ 输入了错误的名称
+
+
+ Incorrect name was entered
+
+
+
+
+ Falsches Passwort eingegeben
+
+
+ 输入了错误的密码
+
+
+ Incorrect password was entered
+
+
+
+
+ Neue Rolle {&usr} zugefügt
+
+
+ 添加了新角色 {&usr}
+
+
+ added new role {&usr}
+
+
+
+
+ Rolle {&usr} gelöscht
+
+
+ 已删除角色 {&usr}
+
+
+ deleted role {&usr}
+
+
+
+
+ Ungültige Anmeldeinformationen wurden eingegeben
+
+
+ 输入的凭据无效
+
+
+ Invalid credentials entered
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/DisplayText/Package.pkg b/mappFramework/Logical/Infrastructure/Audit/DisplayText/Package.pkg
new file mode 100644
index 00000000..f19ad51d
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/DisplayText/Package.pkg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/DisplayText/TxtDatapoints.tmx b/mappFramework/Logical/Infrastructure/Audit/DisplayText/TxtDatapoints.tmx
new file mode 100644
index 00000000..364a0d30
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/DisplayText/TxtDatapoints.tmx
@@ -0,0 +1,20 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/Display/DP
+
+
+
+
+ Beispieltemperature
+
+
+ 样品温度
+
+
+ Sample Temperature
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/DisplayText/TxtEventF.tmx b/mappFramework/Logical/Infrastructure/Audit/DisplayText/TxtEventF.tmx
new file mode 100644
index 00000000..da981758
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/DisplayText/TxtEventF.tmx
@@ -0,0 +1,152 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/Display/SysF/Event
+
+
+
+
+ {&op} {=$MpAudit/Display/SysF/Event/{&ev}}
+
+
+ {&op} {=$MpAudit/Display/SysF/Event/{&ev}}
+
+
+ {&op} {=$MpAudit/Display/SysF/Event/{&ev}}
+
+
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+
+
+ {=$MpAudit/Display/DP/{&dpid}} Wert von {&old|.2f}{&old[UNIT=%s]} auf {&new|.2f}{&new[UNIT=%s]} geändert
+
+
+ {=$MpAudit/Display/DP/{&dpid}} 从改变值 {&old|.2f}{&old[UNIT=%s]} 至 {&new|.2f}{&new[UNIT=%s]}
+
+
+ {=$MpAudit/Display/DP/{&dpid}} changed value from {&old|.2f}{&old[UNIT=%s]} to {&new|.2f}{&new[UNIT=%s]}
+
+
+
+
+ hat Wert (UserID: {&dpid}) von {&old} auf {&new} geändert
+
+
+ 从改变值 (UserID: {&dpid}) 从 {&old} 至 {&new}
+
+
+ changed value of (UserID: {&dpid}) from {&old} to {&new}
+
+
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+
+
+ hat Wert {=$MpAudit/DP/{&dpid}} von {&old|.2f}{&old[UNIT=%s]} auf {&new|.2f}{&new[UNIT=%s]} geändert
+
+
+ 从改变值 {=$MpAudit/DP/{&dpid}} 从 {&old|.2f}{&old[UNIT=%s]} 至 {&new|.2f}{&new[UNIT=%s]}
+
+
+ changed value of {=$MpAudit/DP/{&dpid}} from {&old|.2f}{&old[UNIT=%s]} to {&new|.2f}{&new[UNIT=%s]}
+
+
+
+
+ Alarm {&name} Status geändert: {&stold} -> {&stnew}
+
+
+ 警报 {&name} 改变状态: {&stold} 至 {&stnew}
+
+
+ Alarm {&name} changed state: {&stold} to {&stnew}
+
+
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+
+
+ PackML Zustandsänderung: von {&old} zu {&new}
+
+
+ PackML 状态变化: {&old} 至 {&new}
+
+
+ PackML State-Change: {&old} to {&new}
+
+
+
+
+ PackML Modusänderung: von {&old} zu {&new}
+
+
+ PackML 模式改变: {&old} 至 {&new}
+
+
+ PackML Mode-Change: {&old} to {&new}
+
+
+
+
+ PackML Substatus-Änderung: von {&old} zu {&new}
+
+
+ PackML 子状态变化: {&old} 至 {&new}
+
+
+ PackML Substate-Change: {&old} to {&new}
+
+
+
+
+ mapp File
+
+
+ {=$MpAudit/SysF/File/{&act}}
+
+
+ {=$MpAudit/SysF/File/{&act}}
+
+
+
+
+ mapp Backup
+
+
+ {=$MpAudit/SysF/Backup/{&act}}
+
+
+ {=$MpAudit/SysF/Backup/{&act}}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/ExportedText/Package.pkg b/mappFramework/Logical/Infrastructure/Audit/ExportedText/Package.pkg
new file mode 100644
index 00000000..f19ad51d
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/ExportedText/Package.pkg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/ExportedText/TxtDatapoints.tmx b/mappFramework/Logical/Infrastructure/Audit/ExportedText/TxtDatapoints.tmx
new file mode 100644
index 00000000..4055c0c3
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/ExportedText/TxtDatapoints.tmx
@@ -0,0 +1,20 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/DP
+
+
+
+
+ Beispieltemperature
+
+
+ 样品温度
+
+
+ Sample Temperature
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/ExportedText/TxtEventF.tmx b/mappFramework/Logical/Infrastructure/Audit/ExportedText/TxtEventF.tmx
new file mode 100644
index 00000000..35083b54
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/ExportedText/TxtEventF.tmx
@@ -0,0 +1,152 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/Event
+
+
+
+
+ {&evtime[TIME=%u%R]} {&op} {=$MpAudit/SysF/Event/{&ev}}
+
+
+ {&evtime[TIME=%u%R]} {&op} {=$MpAudit/SysF/Event/{&ev}}
+
+
+ {&evtime[TIME=%u%R]} {&op} {=$MpAudit/SysF/Event/{&ev}}
+
+
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+
+
+ hat Wert {=$MpAudit/DP/{&dpid}} von {&old|.2f}{&old[UNIT=%s]} auf {&new|.2f}{&new[UNIT=%s]} geändert
+
+
+ 改变的值 {=$MpAudit/DP/{&dpid}} 从 {&old|.2f}{&old[UNIT=%s]} 至 {&new|.2f}{&new[UNIT=%s]}
+
+
+ changed value of {=$MpAudit/DP/{&dpid}} from {&old|.2f}{&old[UNIT=%s]} to {&new|.2f}{&new[UNIT=%s]}
+
+
+
+
+ hat Wert (UserID: {&dpid}) von {&old} auf {&new} geändert
+
+
+ 改变的值 (UserID: {&dpid}) 从 {&old} 至 {&new}
+
+
+ changed value of (UserID: {&dpid}) from {&old} to {&new}
+
+
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+
+
+ hat Wert {=$MpAudit/DP/{&dpid}} von {&old|.2f}{&old[UNIT=%s]} auf {&new|.2f}{&new[UNIT=%s]} geändert
+
+
+ 改变的值 {=$MpAudit/DP/{&dpid}} 从 {&old|.2f}{&old[UNIT=%s]} 至 {&new|.2f}{&new[UNIT=%s]}
+
+
+ changed value of {=$MpAudit/DP/{&dpid}} from {&old|.2f}{&old[UNIT=%s]} to {&new|.2f}{&new[UNIT=%s]}
+
+
+
+
+ Alarm {&name} Status geändert: {&stold} -> {&stnew}
+
+
+ 警报 {&name} 改变状态: {&stold} 至 {&stnew}
+
+
+ Alarm {&name} changed state: {&stold} to {&stnew}
+
+
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+
+
+ PackML Zustandsänderung: von {&old} zu {&new}
+
+
+ PackML 状态变化: {&old} 至 {&new}
+
+
+ PackML State-Change: {&old} to {&new}
+
+
+
+
+ PackML Modusänderung: von {&old} zu {&new}
+
+
+ PackML 模式改变: {&old} 至 {&new}
+
+
+ PackML Mode-Change: {&old} to {&new}
+
+
+
+
+ PackML Substatus-Änderung: von {&old} zu {&new}
+
+
+ PackML 子状态变化: {&old} 至 {&new}
+
+
+ PackML Substate-Change: {&old} to {&new}
+
+
+
+
+ mapp File
+
+
+ {=$MpAudit/SysF/File/{&act}}
+
+
+ {=$MpAudit/SysF/File/{&act}}
+
+
+
+
+ mapp Backup
+
+
+ {=$MpAudit/SysF/Backup/{&act}}
+
+
+ {=$MpAudit/SysF/Backup/{&act}}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Audit/Package.pkg b/mappFramework/Logical/Infrastructure/Audit/Package.pkg
new file mode 100644
index 00000000..fb93965e
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/Audit/Package.pkg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.st b/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.st
index 5cbb4524..a763d0d3 100644
--- a/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.st
+++ b/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.st
@@ -27,8 +27,10 @@ PROGRAM _INIT
MpBackupCoreConfig_0.Enable := TRUE;
MpBackupCoreConfig_0.MpLink := ADR(gMpLinkBackupCore);
- MpBackupCoreConfig_0.Configuration := ADR(MpBackupConfiguration);
- MpBackupCoreConfig_0.Load := TRUE;
+ MpBackupCoreConfig_0.Configuration := ADR(MpBackupConfiguration);
+
+ MpBackupCoreConfig_0.Load := NOT(DiagCpuIsARsim() OR DiagCpuIsSimulated());
+
MpBackupCoreConfig_0();
HmiBackup.Status.DeviceDataProvider[0] := '{"value":"mappBackupFiles","text":"CF/PLC"}';
@@ -36,27 +38,41 @@ PROGRAM _INIT
END_PROGRAM
PROGRAM _CYCLIC
-
- CASE BackupState OF
- BACKUP_IDLE:
- HmiBackup.Status.CreateAllowed := NOT(MpBackupCore_0.Info.Automatic.Backup.InProgress);
- HmiBackup.Status.Busy := FALSE;
- IF (HmiBackup.Commands.Create = TRUE) THEN
- HmiBackup.Commands.Create := FALSE;
- MpBackupCore_0.Create := TRUE;
- HmiBackup.Status.Busy := TRUE;
- HmiBackup.Status.CreateAllowed := FALSE;
- HmiBackup.Status.RestoreAllowed := FALSE;
- MpBackupCore_0.Name := ADR(HmiBackup.Parameters.Name);
- BackupState := BACKUP_CREATING;
- ELSIF (HmiBackup.Commands.Restore = TRUE) THEN
- HmiBackup.Commands.Restore := FALSE;
- MpBackupCore_0.Install := TRUE;
- HmiBackup.Status.Busy := TRUE;
- HmiBackup.Status.CreateAllowed := FALSE;
- HmiBackup.Status.RestoreAllowed := FALSE;
- MpBackupCore_0.Name := ADR(MpFileManagerUIConnect.File.List.Items[HmiBackup.Status.SelectedIndex].Name);
- BackupState := BACKUP_RESTORING;
+ CASE BackupState OF
+ BACKUP_IDLE:
+ HmiBackup.Status.CreateAllowed := NOT(MpBackupCore_0.Info.Automatic.Backup.InProgress) AND NOT HmiBackup.Status.SimulationActive;
+ HmiBackup.Status.Busy := FALSE;
+ IF (MpBackupCore_0.Error = TRUE) THEN
+ MpBackupCore_0.ErrorReset := FALSE;
+ BackupState := BACKUP_ERROR;
+ ELSIF DiagCpuIsARsim() OR DiagCpuIsSimulated() THEN
+ HmiBackup.Status.CreateAllowed := FALSE;
+ HmiBackup.Status.RestoreAllowed := FALSE;
+ BackupState := BACKUP_SIM;
+ ELSIF (HmiBackup.Commands.Create = TRUE) THEN
+ HmiBackup.Commands.Create := FALSE;
+ MpBackupCore_0.Create := TRUE;
+ HmiBackup.Status.Busy := TRUE;
+ HmiBackup.Status.CreateAllowed := FALSE;
+ HmiBackup.Status.RestoreAllowed := FALSE;
+ MpBackupCore_0.Name := ADR(HmiBackup.Parameters.Name);
+ BackupState := BACKUP_CREATING;
+ ELSIF (HmiBackup.Commands.Restore = TRUE) THEN
+ HmiBackup.Commands.Restore := FALSE;
+ MpBackupCore_0.Install := TRUE;
+ HmiBackup.Status.Busy := TRUE;
+ HmiBackup.Status.CreateAllowed := FALSE;
+ HmiBackup.Status.RestoreAllowed := FALSE;
+ MpBackupCore_0.Name := ADR(MpFileManagerUIConnect.File.List.Items[HmiBackup.Status.SelectedIndex].Name);
+ BackupState := BACKUP_RESTORING;
+ ELSIF (HmiBackup.Commands.Update = TRUE) THEN
+ HmiBackup.Commands.Update := FALSE;
+ MpBackupCore_0.Install := TRUE;
+ HmiBackup.Status.Busy := TRUE;
+ HmiBackup.Status.CreateAllowed := FALSE;
+ HmiBackup.Status.RestoreAllowed := FALSE;
+ MpBackupCore_0.Name := ADR(MpBackupCore_0.Info.Automatic.Update.Name);
+ BackupState := BACKUP_UPDATING;
ELSIF (HmiBackup.Commands.Delete = TRUE) THEN
MpFileManagerUIConnect.File.List.Items[HmiBackup.Status.SelectedIndex].IsSelected := TRUE;
HmiBackup.Commands.Delete := FALSE;
@@ -64,96 +80,122 @@ PROGRAM _CYCLIC
BackupState := BACKUP_DELETING;
ELSIF (HmiBackup.Commands.SaveConfig = TRUE) THEN
HmiBackup.Commands.SaveConfig := FALSE;
- SaveBackupConfiguration;
- MpBackupCoreConfig_0.Save := TRUE;
+ SaveBackupConfiguration;
+ MpBackupCoreConfig_0.Save := TRUE;
ELSIF ((HmiBackup.Status.SelectedIndex <> HmiBackup.Status.LastSelectedIndex) AND (MpBackupCore_0.CommandBusy <> TRUE)) THEN
- HmiBackup.Status.LastSelectedIndex := HmiBackup.Status.SelectedIndex;
- MpBackupCore_0.Name := ADR(MpFileManagerUIConnect.File.List.Items[HmiBackup.Status.SelectedIndex].Name);
- MpBackupCore_0.RequestInfo := TRUE;
- ELSIF DiagCpuIsARsim() OR DiagCpuIsSimulated() THEN
- HmiBackup.Status.SimulationActive := TRUE;
- HmiBackup.Status.CreateAllowed := FALSE;
- HmiBackup.Status.RestoreAllowed := FALSE;
- END_IF
+ HmiBackup.Status.LastSelectedIndex := HmiBackup.Status.SelectedIndex;
+ IF (brsstrlen(ADR(MpFileManagerUIConnect.File.List.Items[HmiBackup.Status.SelectedIndex].Name)) > 0) THEN
+ MpBackupCore_0.Name := ADR(MpFileManagerUIConnect.File.List.Items[HmiBackup.Status.SelectedIndex].Name);
+ MpBackupCore_0.RequestInfo := TRUE;
+ END_IF
+ END_IF
- BACKUP_CREATING:
- IF (MpBackupCore_0.CommandDone = TRUE) THEN
+ BACKUP_CREATING:
+ IF (MpBackupCore_0.CommandDone = TRUE) THEN
+ MpBackupCore_0.Create := FALSE;
+ MpBackupCore_0.Install := FALSE;
+ MpBackupCore_0.RequestInfo := FALSE;
+ MpFileManagerUIConnect.File.Refresh := TRUE;
+ BackupState := BACKUP_REFRESHING_LIST;
+ ELSIF (MpBackupCore_0.Error = TRUE) THEN
+ BackupState := BACKUP_ERROR;
+ END_IF
+
+ BACKUP_REFRESHING_LIST:
+ IF MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_REFRESH THEN
+ // Wait for the list to be refreshed with the newly created backup file
+ ELSIF MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE THEN
HmiBackup.Status.LastSelectedIndex := HmiBackup.Status.LastSelectedIndex + 1;
- MpBackupCore_0.Create := FALSE;
- MpBackupCore_0.Install := FALSE;
- MpBackupCore_0.RequestInfo := FALSE;
- MpFileManagerUIConnect.File.Refresh := TRUE;
- BackupState := BACKUP_IDLE;
- ELSIF (MpBackupCore_0.Error = TRUE) THEN
- BackupState := BACKUP_ERROR;
- MpBackupCore_0.Create := FALSE;
- MpBackupCore_0.Install := FALSE;
- MpBackupCore_0.RequestInfo := FALSE;
- END_IF
+ BackupState := BACKUP_IDLE;
+ ELSIF (MpBackupCore_0.Error = TRUE) THEN
+ BackupState := BACKUP_ERROR;
+ END_IF
- BACKUP_RESTORING:
- IF (MpBackupCore_0.CommandDone = TRUE) THEN
- MpBackupCore_0.Create := FALSE;
- MpBackupCore_0.Install := FALSE;
- MpBackupCore_0.RequestInfo := FALSE;
- MpFileManagerUIConnect.File.Refresh := TRUE;
- BackupState := BACKUP_IDLE;
- ELSIF (MpBackupCore_0.Error = TRUE) THEN
- BackupState := BACKUP_ERROR;
- MpBackupCore_0.Create := FALSE;
- MpBackupCore_0.Install := FALSE;
- MpBackupCore_0.RequestInfo := FALSE;
- END_IF
+ BACKUP_RESTORING:
+ IF (MpBackupCore_0.CommandDone = TRUE) THEN
+ MpBackupCore_0.Create := FALSE;
+ MpBackupCore_0.Install := FALSE;
+ MpBackupCore_0.RequestInfo := FALSE;
+ MpFileManagerUIConnect.File.Refresh := TRUE;
+ BackupState := BACKUP_IDLE;
+ ELSIF (MpBackupCore_0.Error = TRUE) THEN
+ BackupState := BACKUP_ERROR;
+ END_IF
+
+ BACKUP_UPDATING:
+ IF (MpBackupCore_0.CommandDone = TRUE) THEN
+ MpBackupCore_0.Create := FALSE;
+ MpBackupCore_0.Install := FALSE;
+ MpBackupCore_0.RequestInfo := FALSE;
+ BackupState := BACKUP_IDLE;
+ ELSIF (MpBackupCore_0.Error = TRUE) THEN
+ BackupState := BACKUP_ERROR;
+ END_IF
- BACKUP_DELETING:
- CASE (MpFileManagerUIConnect.MessageBox.Type) OF
- mpFILE_MSG_CONFIRM_DELETE:
- MpFileManagerUIConnect.MessageBox.Confirm := TRUE;
- mpFILE_MSG_OK:
- IF (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE) THEN
+ BACKUP_DELETING:
+ CASE (MpFileManagerUIConnect.MessageBox.Type) OF
+ mpFILE_MSG_CONFIRM_DELETE:
+ MpFileManagerUIConnect.MessageBox.Confirm := TRUE;
+ mpFILE_MSG_OK:
+ IF (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE) THEN
HmiBackup.Status.LastSelectedIndex := HmiBackup.Status.LastSelectedIndex + 1;
- FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect.File.List.Items[i])/SIZEOF(MpFileManagerUIConnect.File.List.Items[0])) - 1) DO
- MpFileManagerUIConnect.File.List.Items[i].IsSelected := FALSE;
- END_FOR
+ FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect.File.List.Items[i])/SIZEOF(MpFileManagerUIConnect.File.List.Items[0])) - 1) DO
+ MpFileManagerUIConnect.File.List.Items[i].IsSelected := FALSE;
+ END_FOR
+ HmiBackup.Status.SelectedIndex := 0;
MpFileManagerUIConnect.MessageBox.Confirm := FALSE;
- BackupState := BACKUP_IDLE;
- END_IF
+ BackupState := BACKUP_IDLE;
+ END_IF
END_CASE
+
+ BACKUP_SIM:
+ HmiBackup.Status.SimulationActive := TRUE;
- BACKUP_ERROR:
- IF MpBackupCore_0.Info.Diag.StatusID.ID = mpBACKUP_ERR_CREATE_FAILED THEN
+ BACKUP_ERROR:
+ MpBackupCore_0.Create := FALSE;
+ MpBackupCore_0.Install := FALSE;
+ IF MpBackupCore_0.Info.Diag.StatusID.ID <> 0 THEN //-1064159486
HmiBackup.Status.Error := TRUE;
END_IF
- IF HmiBackup.Commands.Reset THEN
+ IF HmiBackup.Commands.Reset OR (MpBackupCore_0.Info.Diag.StatusID.ID = -1064159486) THEN
HmiBackup.Commands.Reset := FALSE;
MpBackupCore_0.ErrorReset := TRUE;
- BackupState := BACKUP_IDLE;
+ BackupState := BACKUP_IDLE;
+ ELSIF ((MpBackupCore_0.Info.Diag.StatusID.ID = 0) AND (MpBackupCore_0.Error = FALSE)) THEN
+ BackupState := BACKUP_IDLE;
END_IF
- END_CASE
+ END_CASE
- // Reset any errors caused by requesting information
- IF ((MpBackupCore_0.Error = TRUE) AND (MpBackupCore_0.RequestInfo = TRUE)) THEN
- MpBackupCore_0.ErrorReset := TRUE;
- MpBackupCore_0.RequestInfo := FALSE;
- brsmemset(ADR(HmiBackup.Status.Info), 0, SIZEOF(HmiBackup.Status.Info));
- END_IF
- MpBackupCore_0.MpLink := ADR(gMpLinkBackupCore);
- MpBackupCore_0.DeviceName := ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[MpFileManagerUIConnect.DeviceList.SelectedIndex]);
- MpBackupCore_0();
- IF (MpBackupCore_0.CommandDone = TRUE) AND (MpBackupCore_0.RequestInfo = TRUE) THEN
- MpBackupCore_0.RequestInfo := FALSE;
- HmiBackup.Status.Info := MpBackupCore_0.Info.Project.Requested;
- END_IF
- IF (MpBackupCore_0.Error = FALSE) THEN
- MpBackupCore_0.ErrorReset := FALSE;
+ // Reset any errors caused by requesting information
+ IF EDGEPOS((MpBackupCore_0.Error = TRUE) AND (MpBackupCore_0.RequestInfo = TRUE)) THEN
+ MpBackupCore_0.ErrorReset := TRUE;
+ MpBackupCore_0.RequestInfo := FALSE;
+ brsmemset(ADR(HmiBackup.Status.Info), 0, SIZEOF(HmiBackup.Status.Info));
+ END_IF
+
+ MpBackupCore_0.MpLink := ADR(gMpLinkBackupCore);
+ MpBackupCore_0.DeviceName := ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[MpFileManagerUIConnect.DeviceList.SelectedIndex]);
+ MpBackupCore_0();
+
+ IF (MpBackupCore_0.CommandDone = TRUE) AND (MpBackupCore_0.RequestInfo = TRUE) THEN
+ MpBackupCore_0.RequestInfo := FALSE;
+ HmiBackup.Status.Info := MpBackupCore_0.Info.Project.Requested;
+ END_IF
+ IF EDGEPOS(MpBackupCore_0.Error = FALSE) THEN
+ MpBackupCore_0.ErrorReset := FALSE;
HmiBackup.Status.Error := FALSE;
- END_IF
+ END_IF
- HmiBackup.Status.RestoreAllowed := (MpFileManagerUIConnect.File.PathInfo.FolderCount > 0) AND NOT(MpBackupCore_0.Info.Automatic.Backup.InProgress);
+ HmiBackup.Status.RestoreAllowed := (MpFileManagerUIConnect.File.PathInfo.FolderCount > 0) AND NOT(MpBackupCore_0.Info.Automatic.Backup.InProgress) AND NOT HmiBackup.Status.SimulationActive;
+ HmiBackup.Status.Update := MpBackupCore_0.Info.Automatic.Update;
+ HmiBackup.Status.BackupCtrlEnabled := (NOT HmiBackup.Status.SimulationActive) AND (MpBackupCore_0.Info.Project.Requested.Name <> '');
// Call all actions
- FileManager;
- ChangeConfiguration;
+ FileManager;
+ IF NOT DiagCpuIsARsim() THEN
+ ChangeConfiguration;
+ END_IF
+
FormatDeviceDataProvider;
// Assign MpLinks
@@ -165,7 +207,6 @@ PROGRAM _CYCLIC
MpBackupCore_0();
MpFileManagerUI_0();
MpBackupCoreConfig_0();
-
END_PROGRAM
PROGRAM _EXIT
diff --git a/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.typ b/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.typ
index f05ce3e8..973c7fd6 100644
--- a/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.typ
+++ b/mappFramework/Logical/Infrastructure/Backup/BackupMgr/BackupMgr.typ
@@ -9,6 +9,7 @@ TYPE
BackupHmiCommandsType : STRUCT (*Structure to hold the commands from the HMI*)
Create : BOOL; (*Create a backup*)
Restore : BOOL; (*Restore a backup*)
+ Update : BOOL; (*Install an update*)
Delete : BOOL; (*Delete a backup*)
SaveConfig : BOOL; (*Save automatic backup configuration settings*)
Reset : BOOL; (*Error reset*)
@@ -24,6 +25,7 @@ TYPE
Error : BOOL; (*Error flag*)
CreateAllowed : BOOL; (*Bit to indicate it is allowable to create a backup right now*)
RestoreAllowed : BOOL; (*Bit to indicate it is allowable to restore a backup right now*)
+ BackupCtrlEnabled : BOOL; (*Disable control panel for Backup with in Sim*)
FileNames : ARRAY[0..49]OF STRING[80]; (*Existing backup file names*)
TimeStamps : ARRAY[0..49]OF DATE_AND_TIME; (*Time stamps for existing backups*)
Size : {REDUND_UNREPLICABLE} ARRAY[0..49]OF UDINT; (*Sizes of existing backup files*)
@@ -32,9 +34,10 @@ TYPE
TableConfig : ARRAY[0..1]OF STRING[120]; (*Table configuration for the list of available backups*)
SimulationActive : BOOL; (*Flag for if simulation is active*)
SelectedIndex : USINT; (*Index of the selected backup file*)
- LastSelectedIndex : USINT; (*Index of the last selected backup file*)
+ LastSelectedIndex : USINT := 255; (*Index of the last selected backup file*)
LastSelectedDeviceIndex : UINT; (*Index of the last selected file device. Compared with MpFileManagerUIConnect.DeviceList.SelectedIndex*)
FileOverMax : BOOL; (*Active when more than 50 items detected*)
+ Update : MpBackupAutoUpdateInfoType;
END_STRUCT;
AutomaticBackupType : STRUCT (*Automatic backup settings*)
Enable : BOOL; (*Enable automatic backup feature*)
@@ -68,8 +71,11 @@ TYPE
( (*States for backup state machine*)
BACKUP_IDLE, (*Wait state*)
BACKUP_CREATING, (*Creating a backup*)
+ BACKUP_REFRESHING_LIST, (*Refreshing backup list*)
BACKUP_RESTORING, (*Restoring a backup*)
+ BACKUP_UPDATING, (*Installing a new version*)
BACKUP_DELETING, (*Deleting a backup*)
+ BACKUP_SIM, (*CPU in simulation mode, don't do anything*)
BACKUP_ERROR (*Error state*)
);
END_TYPE
diff --git a/mappFramework/Logical/Infrastructure/Backup/BackupMgr/HMIActions.st b/mappFramework/Logical/Infrastructure/Backup/BackupMgr/HMIActions.st
index 848713c3..df4dbeba 100644
--- a/mappFramework/Logical/Infrastructure/Backup/BackupMgr/HMIActions.st
+++ b/mappFramework/Logical/Infrastructure/Backup/BackupMgr/HMIActions.st
@@ -28,11 +28,11 @@ ACTION FormatDeviceDataProvider:
// Configure visible file list
ItemCount := MpFileManagerUIConnect.File.PathInfo.FileCount + MpFileManagerUIConnect.File.PathInfo.FolderCount;
- HmiBackup.Status.TableConfig[1] := '{ "specRows": [{"from":';
+ HmiBackup.Status.TableConfig[1] := '{ "specRows": [{"from":';
brsitoa((ItemCount), ADR(HmiBackup.Status.TableConfig[1]) + brsstrlen(ADR(HmiBackup.Status.TableConfig[1])));
brsstrcat(ADR(HmiBackup.Status.TableConfig[1]), ADR(',"to":50, "visible":false}]}'));
- HmiBackup.Status.FileOverMax := ItemCount > 50;
+ HmiBackup.Status.FileOverMax := ItemCount > (SIZEOF(MpFileManagerUIConnect.File.List.Items)/SIZEOF(MpFileManagerUIConnect.File.List.Items[0]));
END_ACTION
@@ -116,7 +116,11 @@ ACTION FileManager:
IF ((MpFileManagerUIConnect.DeviceList.SelectedIndex <> HmiBackup.Status.LastSelectedDeviceIndex) AND (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE)) THEN
HmiBackup.Status.LastSelectedDeviceIndex := MpFileManagerUIConnect.DeviceList.SelectedIndex;
- HmiBackup.Status.LastSelectedIndex := HmiBackup.Status.LastSelectedIndex + 1;
+ IF HmiBackup.Status.LastSelectedIndex > MpFileManagerUIConnect.File.PathInfo.FolderCount THEN
+ HmiBackup.Status.SelectedIndex := 0;
+ ELSE
+ HmiBackup.Status.LastSelectedIndex := HmiBackup.Status.LastSelectedIndex + 1;
+ END_IF
END_IF
END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/File/FileMgr/FIFOOperations.st b/mappFramework/Logical/Infrastructure/File/FileMgr/FIFOOperations.st
index ba25c9c7..92333a7e 100644
--- a/mappFramework/Logical/Infrastructure/File/FileMgr/FIFOOperations.st
+++ b/mappFramework/Logical/Infrastructure/File/FileMgr/FIFOOperations.st
@@ -7,15 +7,26 @@ ACTION FIFOOperation:
IF R_TRIG_CheckStatus.Q OR TON_ScanFolder.Q THEN
HmiFile.Commands.CheckFolder := TRUE;
END_IF
-
+
+ brsmemset(ADR(HmiFile.Status.FifoSelect[0]), 0, SIZEOF(HmiFile.Status.FifoSelect));
+ FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect.DeviceList.DeviceNames)/SIZEOF(MpFileManagerUIConnect.DeviceList.DeviceNames[0])) - 1) DO
+ IF (HmiFile.Parameters.Fifo.DeviceName = MpFileManagerUIConnect.DeviceList.DeviceNames[i]) AND HmiFile.Parameters.Fifo.Enable THEN
+ HmiFile.Status.FifoSelect[i] := 1;
+ EXIT;
+ END_IF
+ END_FOR
+
+
// Autodelete oldest files based on scanning option
CASE HmiFile.Status.DeleteStep OF
FILE_DELETE_WAIT:
// Wait for check the correct device selection
TON_ScanFolder.IN := TRUE;
+ HmiFile.Status.FifoConfigEnable := TRUE;
IF TON_ScanFolder.Q THEN
TON_ScanFolder.IN := FALSE;
+ HmiFile.Status.FifoConfigEnable := FALSE;
Fifo_Count := 0;
HmiFile.Status.DeleteStep := FILE_SCAN_FOLDER_WAIT;
END_IF
@@ -64,12 +75,12 @@ ACTION FIFOOperation:
FILE_GO_TO_END:
IF (MpFileManagerUIConnect_FIFO.Status = mpFILE_UI_STATUS_IDLE) THEN
- IF (HmiFile.Parameters.Fifo.MaxNumberOfFiles >= (SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0]))) THEN
+ FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0])) - 1) DO
+ MpFileManagerUIConnect_FIFO.File.List.Items[i].IsSelected := FALSE;
+ END_FOR
+ IF (MpFileManagerUIConnect_FIFO.File.PathInfo.FileCount >= (SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0]))) THEN
// Page down until we get to the end, then start deleting
IF (MpFileManagerUIConnect_FIFO.File.List.RangeStart <> 0) THEN
- FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0])) - 1) DO
- MpFileManagerUIConnect_FIFO.File.List.Items[i].IsSelected := FALSE;
- END_FOR
MpFileManagerUIConnect_FIFO.File.List.PageDown := TRUE;
HmiFile.Status.DeleteStep := FILE_GO_TO_END_1;
ELSE
@@ -100,7 +111,8 @@ ACTION FIFOOperation:
HmiFile.Status.DeleteStep := SEL(MpFileManagerUIConnect_FIFO.File.PathInfo.FileCount <= HmiFile.Parameters.Fifo.MaxNumberOfFiles, FILE_SELECT_OLDEST_FILES_0, FILE_DELETE_WAIT);
FILE_FIFO_SIZE_OF_FOLDER:
- HmiFile.Status.DeleteStep := FILE_CALC_FOLDER_SIZE;
+ CurrentIndex := 0;
+ HmiFile.Status.DeleteStep := FILE_CALC_FOLDER_SIZE;
END_CASE
FILE_SELECT_OLDEST_FILES_0:
@@ -113,9 +125,7 @@ ACTION FIFOOperation:
// start from the first file to delete and select everything after
// e.g. if there are 100 files and we want to keep 60 files around then we'd start at 60 + 0 MOD 50 = 10 and go to index 49
FileNameArraySize := SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0]);
- IF (MpFileManagerUIConnect_FIFO.File.PathInfo.FileCount >= (HmiFile.Parameters.Fifo.MaxNumberOfFiles * 2)) THEN
- StartIndex := 0;
- ELSIF (HmiFile.Parameters.Fifo.MaxNumberOfFiles >= FileNameArraySize) THEN
+ IF (HmiFile.Parameters.Fifo.MaxNumberOfFiles >= FileNameArraySize) THEN
StartIndex := FileNameArraySize - (UDINT_TO_USINT(MpFileManagerUIConnect_FIFO.File.PathInfo.FileCount - HmiFile.Parameters.Fifo.MaxNumberOfFiles + MpFileManagerUIConnect_FIFO.File.PathInfo.FolderCount) MOD FileNameArraySize);
ELSE
StartIndex := UDINT_TO_USINT(HmiFile.Parameters.Fifo.MaxNumberOfFiles + MpFileManagerUIConnect_FIFO.File.PathInfo.FolderCount) MOD FileNameArraySize;
@@ -124,8 +134,14 @@ ACTION FIFOOperation:
StartIndex := 0;
END_IF
+ IF (StartIndex > 0) THEN
+ FOR i := 0 TO (StartIndex - 1) DO
+ MpFileManagerUIConnect_FIFO.File.List.Items[i].IsSelected := FALSE;
+ END_FOR
+ END_IF
+
FOR i := StartIndex TO (FileNameArraySize - 1) DO
- MpFileManagerUIConnect_FIFO.File.List.Items[0].IsSelected := FALSE;
+ MpFileManagerUIConnect_FIFO.File.List.Items[i].IsSelected := FALSE;
IF (MpFileManagerUIConnect_FIFO.File.List.Items[i].ItemType <> mpFILE_ITEM_TYPE_NONE) AND NOT MpFileManagerUIConnect_FIFO.File.List.Items[i].IsFolder THEN
MpFileManagerUIConnect_FIFO.File.List.Items[i].IsSelected := TRUE;
HmiFile.Status.AutoDeleteSelected := HmiFile.Status.AutoDeleteSelected + 1;
@@ -140,23 +156,33 @@ ACTION FIFOOperation:
END_IF
END_IF
- FILE_CALC_FOLDER_SIZE:
- // Calculate the overall file size in the open folder
- HmiFile.Status.FolderSize := 0;
- FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0])) - 1) DO
- IF MpFileManagerUIConnect_FIFO.File.List.Items[i].ItemType <> mpFILE_ITEM_TYPE_FOLDER THEN
- HmiFile.Status.FolderSize := HmiFile.Status.FolderSize + UDINT_TO_REAL(MpFileManagerUIConnect_FIFO.File.List.Items[i].Size);
- END_IF
- END_FOR
- HmiFile.Status.DeleteStep := SEL(HmiFile.Status.FolderSize > HmiFile.Parameters.Fifo.MaxFolderSize*1000, FILE_RESET_SORT_BY, FILE_SELECT_OLDEST_FILES_1);
-
+ FILE_CALC_FOLDER_SIZE:
+ IF (CurrentIndex = 0) THEN
+ HmiFile.Status.FolderSize := 0;
+ END_IF
+ DirRead_FolderSize.enable := TRUE;
+ DirRead_FolderSize.pDevice := ADR(HmiFile.Parameters.Fifo.DeviceName);
+ DirRead_FolderSize.pPath := 0;
+ DirRead_FolderSize.entry := CurrentIndex;
+ DirRead_FolderSize.option := fiFILE;
+ DirRead_FolderSize.pData := ADR(DirectoryData);
+ DirRead_FolderSize.data_len := SIZEOF(DirectoryData);
+ DirRead_FolderSize();
+ IF ((DirRead_FolderSize.status = ERR_OK) OR (DirRead_FolderSize.status = fiERR_NO_MORE_ENTRIES)) THEN
+ HmiFile.Status.FolderSize := HmiFile.Status.FolderSize + UDINT_TO_REAL(DirectoryData.Filelength);
+ CurrentIndex := CurrentIndex + 1;
+ IF (CurrentIndex >= MpFileManagerUIConnect_FIFO.File.PathInfo.FileCount) THEN
+ HmiFile.Status.DeleteStep := SEL(HmiFile.Status.FolderSize > HmiFile.Parameters.Fifo.MaxFolderSize*1024, FILE_RESET_SORT_BY, FILE_SELECT_OLDEST_FILES_1);
+ END_IF
+ END_IF
+
FILE_SELECT_OLDEST_FILES_1:
// Scan and select all file over the filter setting
IF (MpFileManagerUIConnect_FIFO.Status = mpFILE_UI_STATUS_IDLE) THEN
- LastIndex := (MpFileManagerUIConnect_FIFO.File.PathInfo.FileCount MOD ((SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items)/SIZEOF(MpFileManagerUIConnect_FIFO.File.List.Items[0])) - 1));
- MpFileManagerUIConnect_FIFO.File.List.Items[LastIndex].IsSelected := TRUE;
- HmiFile.Status.DeleteStep := FILE_DELETE_FILES;
- END_IF
+ MpFileManagerUIConnect_FIFO.File.List.Items[0].IsSelected := TRUE;
+ HmiFile.Status.FolderSize := HmiFile.Status.FolderSize - UDINT_TO_REAL(MpFileManagerUIConnect_FIFO.File.List.Items[0].Size);
+ HmiFile.Status.DeleteStep := FILE_DELETE_FILES;
+ END_IF
FILE_DELETE_FILES:
// Set command to delete the selected oldest files
@@ -173,8 +199,9 @@ ACTION FIFOOperation:
IF (MpFileManagerUIConnect_FIFO.MessageBox.Type = mpFILE_MSG_CONFIRM_DELETE) THEN
MpFileManagerUIConnect_FIFO.MessageBox.Confirm := TRUE;
ELSIF (MpFileManagerUIConnect_FIFO.Status = mpFILE_UI_STATUS_IDLE) AND (MpFileManagerUIConnect_FIFO.MessageBox.LayerStatus = 1) THEN
- IF (HmiFile.Parameters.Fifo.FifoType = FILE_FIFO_SIZE_OF_FOLDER) THEN
- HmiFile.Status.DeleteStep := FILE_CALC_FOLDER_SIZE;
+ IF (HmiFile.Parameters.Fifo.FifoType = FILE_FIFO_SIZE_OF_FOLDER) THEN
+ HmiFile.Status.DeleteStep := SEL(HmiFile.Status.FolderSize > HmiFile.Parameters.Fifo.MaxFolderSize*1024, FILE_RESET_SORT_BY, FILE_SELECT_OLDEST_FILES_1);
+ //HmiFile.Status.DeleteStep := FILE_SELECT_OLDEST_FILES_1;
ELSE
MpFileManagerUIConnect_FIFO.File.MultiSelect := FALSE;
// if more files need to be deleted then go back to select the oldest files
@@ -196,7 +223,7 @@ ACTION FIFOOperation:
IF (MpFileManagerUIConnect_FIFO.Status = mpFILE_UI_STATUS_REFRESH) OR (MpFileManagerUIConnect_FIFO.Status = mpFILE_UI_STATUS_IDLE) THEN
HmiFile.Status.DeleteStep := FILE_DELETE_WAIT;
IF (MpFileManagerUIConnect_FIFO.MessageBox.Type = mpFILE_MSG_BUSY) THEN
- MpFileManagerUIConnect_FIFO.MessageBox.Confirm := TRUE;
+ MpFileManagerUIConnect_FIFO.MessageBox.Confirm := TRUE;
END_IF
END_IF
END_CASE
diff --git a/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.st b/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.st
index 2ac2fbc9..d7edd754 100644
--- a/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.st
+++ b/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.st
@@ -14,7 +14,7 @@ PROGRAM _INIT
MpFileManagerUIConnect.DeviceList.DeviceNames[3] := 'mappDataFiles';
MpFileManagerUIConnect.DeviceList.DeviceNames[4] := 'mappBackupFiles';
MpFileManagerUIConnect.DeviceList.DeviceNames[5] := 'mappAlarmXFiles';
- MpFileManagerUIConnect.DeviceList.DeviceNames[6] := 'mappUserXFiles';
+ MpFileManagerUIConnect.DeviceList.DeviceNames[6] := 'mappUserXFiles';
MpFileManagerUI_0.Enable := TRUE;
MpFileManagerUI_0.MpLink := ADR(gMpLinkFileManagerUIFile);
MpFileManagerUI_0.UIConnect := ADR(MpFileManagerUIConnect);
@@ -22,12 +22,25 @@ PROGRAM _INIT
MpFileManagerUI_0();
// Initialize FIFO feature
- HmiFile.Parameters.Fifo.DeviceName := 'mappDataFiles';
- // MaxFolderSize is in kB
- HmiFile.Parameters.Fifo.MaxFolderSize := 1000;
- HmiFile.Parameters.Fifo.MaxNumberOfFiles := 20;
- // ScanInterval is in minutes
- HmiFile.Parameters.Fifo.ScanInterval := 60;
+ HmiFile.Status.FifoConfigEnable := TRUE;
+ IF HmiFile.Parameters.Fifo.DeviceName = '' THEN
+ HmiFile.Parameters.Fifo.DeviceName := 'mappDataFiles';
+ END_IF
+
+ // MaxFolderSize is in kB
+ IF HmiFile.Parameters.Fifo.MaxFolderSize = 0 THEN
+ HmiFile.Parameters.Fifo.MaxFolderSize := 1000;
+ END_IF
+
+ IF HmiFile.Parameters.Fifo.MaxNumberOfFiles = 0 THEN
+ HmiFile.Parameters.Fifo.MaxNumberOfFiles := 20;
+ END_IF
+
+ // ScanInterval is in minutes
+ IF HmiFile.Parameters.Fifo.ScanInterval = 0 THEN
+ HmiFile.Parameters.Fifo.ScanInterval := 60;
+ END_IF
+
// Initialize which folders should exist
PathCheck.DeviceList := MpFileManagerUIConnect.DeviceList;
@@ -63,6 +76,8 @@ PROGRAM _CYCLIC
FileManager;
IF HmiFile.Parameters.Fifo.Enable THEN
FIFOOperation;
+ ELSE
+ brsmemset(ADR(HmiFile.Status.FifoSelect[0]), 0, SIZEOF(HmiFile.Status.FifoSelect));
END_IF
// Error reset
diff --git a/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.typ b/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.typ
index 7509c6ba..695b0644 100644
--- a/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.typ
+++ b/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.typ
@@ -23,6 +23,7 @@ TYPE
Type : ARRAY[0..49]OF DINT; (*List of file types*)
Size : ARRAY[0..49]OF UDINT; (*List of file sizes*)
DeviceDataProvider : ARRAY[0..MAX_IDX_FILE_DEV]OF STRING[100]; (*Data provider for the file device selector*)
+ FifoSelect : ARRAY[0..MAX_IDX_FILE_DEV]OF DINT; (*Indicate FIFO selected file device*)
DeviceName : STRING[50]; (*File device name*)
FileName : STRING[255]; (*Fille name*)
TableConfig : ARRAY[0..1]OF STRING[120]; (*Table configuration for the file explorer (table widget) on the mapp View HMI*)
@@ -32,6 +33,7 @@ TYPE
AutoDeleteSelected : USINT; (*Number of selected items*)
FolderSize : REAL; (*Size of currently selected folder*)
SelectedIndex : USINT; (*Selected index in the file list*)
+ FifoConfigEnable : BOOL; (*Disable FIFO access or change confirmation when FIFO is active*)
END_STRUCT;
FileHmiParaFifoType : STRUCT (*Parameters for the FIFO feature (first-in-first-out)*)
Enable : BOOL; (*FIFO enable*)
@@ -63,6 +65,7 @@ TYPE
FILE_CHECK_FOR_FILTER, (*Check which delete filter is active*)
FILE_SELECT_OLDEST_FILES_0, (*Scan and select all file over the filter setting*)
FILE_CALC_FOLDER_SIZE, (*Calculate the overall file size in the open folder*)
+ FILE_CALC_FOLDER_SCROLL,
FILE_SELECT_OLDEST_FILES_1, (*Scan and select all file over the filter setting*)
FILE_DELETE_FILES, (*Set command to delete the selected oldest files*)
FILE_CONFIRM_DELETE, (*Confirm the file delete*)
diff --git a/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.var b/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.var
index 61378a39..3c0f5b29 100644
--- a/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.var
+++ b/mappFramework/Logical/Infrastructure/File/FileMgr/FileMgr.var
@@ -4,8 +4,11 @@ VAR
MpFileManagerUI_FIFO : MpFileManagerUI; (*MpFileManagerUI instance*)
DirInfo_0 : DirInfo; (*Directory info function block*)
R_TRIG_CheckStatus : R_TRIG; (*Trigger function block*)
- TON_Wait : TON;
+ TON_Wait : TON; (*FIFO handling support*)
TON_ScanFolder : TON; (*Timer to scan for folder*)
+ TON_EnterFolder : TON; (*Time to delay EnterFolder command so file list can refresh*)
+ CurrentIndex : UDINT; (*FIFO handling support deleting more then 50 files*)
+ DirRead_FolderSize : DirRead; (*FIFO handling support reading current folder size*)
END_VAR
(*Constants*)
VAR CONSTANT
@@ -14,9 +17,15 @@ END_VAR
(*Structure Types*)
VAR
MpFileManagerUIConnect : MpFileManagerUIConnectType; (*File manager connection to the HMI*)
- MpFileManagerUIConnect_FIFO : MpFileManagerUIConnectType; (*File manager connection to the HMI*)
+ MpFileManagerUIConnect_FIFO : {REDUND_UNREPLICABLE} MpFileManagerUIConnectType; (*File manager connection to the HMI*)
+END_VAR
+VAR RETAIN
HmiFile : FileHmiInterfaceType; (*HMI interface structure*)
END_VAR
+VAR
+ PathCheck : FilePathCheckType; (*Parameter structure controlling the visible file device based on available folders*)
+ DirectoryData : fiDIR_READ_DATA; (*FIFO handling support reading current folder size*)
+END_VAR
(*Variables*)
VAR
i : USINT; (*Index for FOR loops*)
@@ -24,12 +33,10 @@ VAR
DeviceCount : USINT; (*Counter for available file devices*)
Index : USINT; (*Index for avaliable devices*)
FolderDepthCount : USINT; (*Keeps track of the folder depth location to determine whether or not the back button should be shown*)
- PathCheck : FilePathCheckType; (*Parameter structure controlling the visible file device based on available folders*)
USBOffset : USINT := 0; (*Device list offset where to add USB device*)
MaxDeviceNameIndex : USINT; (*How many devices are configured*)
- tempIdx : USINT;
- FileNameArraySize : USINT;
- StartIndex : USINT;
- LastIndex : UDINT;
- Fifo_Count : USINT;
+ tempIdx : USINT; (*FIFO handling support index variable*)
+ FileNameArraySize : USINT; (*FIFO handling support size of the array*)
+ StartIndex : USINT; (*FIFO handling support *)
+ Fifo_Count : USINT; (*FIFO handling support current file count*)
END_VAR
diff --git a/mappFramework/Logical/Infrastructure/File/FileMgr/HMIActions.st b/mappFramework/Logical/Infrastructure/File/FileMgr/HMIActions.st
index f3a5ec21..633218fe 100644
--- a/mappFramework/Logical/Infrastructure/File/FileMgr/HMIActions.st
+++ b/mappFramework/Logical/Infrastructure/File/FileMgr/HMIActions.st
@@ -33,7 +33,7 @@ ACTION FormatDeviceDataProvider:
DeviceListCount := 0;
END_IF
// copy device name from source list into the actual device list
- MpFileManagerUIConnect.DeviceList.DeviceNames[Index] := PathCheck.DeviceList.DeviceNames[DeviceListCount];
+ MpFileManagerUIConnect.DeviceList.DeviceNames[Index] := PathCheck.DeviceList.DeviceNames[DeviceListCount];
Index := Index + 1;
DeviceListCount := DeviceListCount + 1;
IF (DeviceListCount > ((SIZEOF(PathCheck.DeviceList.DeviceNames) / SIZEOF(PathCheck.DeviceList.DeviceNames[0])) - 1)) THEN
@@ -49,7 +49,7 @@ ACTION FormatDeviceDataProvider:
END_IF
END_IF
- DirInfo_0(enable:= TRUE, pDevice := ADR('UserPartition'), pPath := ADR(PathCheck.Folder[DeviceListCount]));
+ DirInfo_0(enable := TRUE, pDevice := ADR('UserPartition'), pPath := ADR(PathCheck.Folder[DeviceListCount]));
// Configure visible device list
HmiFile.Status.TableConfig[0] := '{ "specRows": [{"from":';
@@ -69,10 +69,10 @@ ACTION FormatDeviceDataProvider:
// Create device data provider for FIFO drop down
FOR i := 0 TO MaxDeviceNameIndex DO
IF (MpFileManagerUIConnect.DeviceList.DeviceNames[i] <> '') THEN
- HmiFile.Status.DeviceDataProvider[i] := '{"value":"';
- brsstrcat(ADR(HmiFile.Status.DeviceDataProvider[i]), ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[i]));
+ HmiFile.Status.DeviceDataProvider[i] := '{"value":"';
+ brsstrcat(ADR(HmiFile.Status.DeviceDataProvider[i]), ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[i]));
brsstrcat(ADR(HmiFile.Status.DeviceDataProvider[i]), ADR('","text":"'));
- brsstrcat(ADR(HmiFile.Status.DeviceDataProvider[i]), ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[i]));
+ brsstrcat(ADR(HmiFile.Status.DeviceDataProvider[i]), ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[i]));
brsstrcat(ADR(HmiFile.Status.DeviceDataProvider[i]), ADR('"}'));
ELSE
brsmemset(ADR(HmiFile.Status.DeviceDataProvider[i]), 0, SIZEOF(HmiFile.Status.DeviceDataProvider[i]));
@@ -116,9 +116,8 @@ ACTION FileManager:
END_IF
END_IF
END_FOR
-
-
- // Read currently selected device name for HMI
+
+ // Read currently selected device name for HMI
IF (MpFileManagerUIConnect.DeviceList.SelectedIndex >= (SIZEOF(MpFileManagerUIConnect.DeviceList.DeviceNames) / SIZEOF(MpFileManagerUIConnect.DeviceList.DeviceNames[0]))) THEN
MpFileManagerUIConnect.DeviceList.SelectedIndex := 0;
END_IF
@@ -131,11 +130,16 @@ ACTION FileManager:
HmiFile.Status.IsFolder := MpFileManagerUIConnect.File.List.Items[HmiFile.Status.SelectedIndex].IsFolder;
// Control the folder structure when entering and leaving folders
- IF (HmiFile.Commands.EnterFolder) AND MpFileManagerUIConnect.File.List.Items[HmiFile.Status.SelectedIndex].IsFolder THEN
- HmiFile.Commands.EnterFolder := FALSE;
- MpFileManagerUIConnect.File.EnterFolder := TRUE;
+ IF (HmiFile.Commands.EnterFolder) AND MpFileManagerUIConnect.File.List.Items[HmiFile.Status.SelectedIndex].IsFolder
+ AND (MpFileManagerUIConnect.File.List.Items[HmiFile.Status.SelectedIndex].IsSelected) THEN
+ TON_EnterFolder.IN := TRUE;
+ IF TON_EnterFolder.Q THEN
+ HmiFile.Commands.EnterFolder := FALSE;
+ MpFileManagerUIConnect.File.EnterFolder := TRUE;
+ TON_EnterFolder.IN := FALSE;
+ END_IF
FolderDepthCount := FolderDepthCount + 1;
- ELSE
+ ELSIF (TON_EnterFolder.IN = FALSE) THEN
HmiFile.Commands.EnterFolder := FALSE;
END_IF
@@ -146,5 +150,7 @@ ACTION FileManager:
END_IF
HmiFile.Status.BackButton := (FolderDepthCount > 0);
+ TON_EnterFolder(PT := t#200ms);
+
END_ACTION
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Package.pkg b/mappFramework/Logical/Infrastructure/Package.pkg
index b81f69e1..363a95a6 100644
--- a/mappFramework/Logical/Infrastructure/Package.pkg
+++ b/mappFramework/Logical/Infrastructure/Package.pkg
@@ -11,5 +11,6 @@
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/FileOperations.st b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/FileOperations.st
deleted file mode 100644
index 51bc74f3..00000000
--- a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/FileOperations.st
+++ /dev/null
@@ -1,111 +0,0 @@
-ACTION FileCopyOperation:
-
- // Export/Import recipes to/from USB
- CASE HmiRecipe.Status.CopyStep OF
- REC_COPY_WAIT:
- // Wait for export/import command
- IF (HmiRecipe.Commands.ExportToUSB = TRUE) THEN
- // Check if USB device is available
- IF (brsstrlen(ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[1])) > 0) THEN
- // USB is available proceed with export: select all files on the CF and trigger copy command
- IF (MpFileManagerUIConnect.DeviceList.SelectedIndex <> 0) THEN
- MpFileManagerUIConnect.DeviceList.SelectedIndex := 0;
- MpFileManagerUIConnect.File.MultiSelect := FALSE;
- ELSIF (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE) THEN
-
- IF NOT MpFileManagerUIConnect.File.MultiSelect THEN
- MpFileManagerUIConnect.File.MultiSelect := TRUE;
- FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect.File.List.Items) / SIZEOF(MpFileManagerUIConnect.File.List.Items[0])) - 1) DO
- MpFileManagerUIConnect.File.List.Items[i].IsSelected := TRUE;
- END_FOR
- ELSIF (brsstrlen(ADR(MpFileManagerUIConnect.File.List.Items[i].Name)) = 0) THEN
- // No files to copy, cancel operation
- HmiRecipe.Commands.ExportToUSB := FALSE;
- ELSE
- MpFileManagerUIConnect.File.Copy := TRUE;
- HmiRecipe.Status.CopyStep := REC_COPY_TO_USB;
- HmiRecipe.Commands.ExportToUSB := FALSE;
- END_IF
-
- END_IF
-
- ELSE
- // No USB disk available, cancel operation
- HmiRecipe.Commands.ExportToUSB := FALSE;
- END_IF
-
- ELSIF HmiRecipe.Commands.ImportFromUSB THEN
- // Check if USB device is available
- IF (brsstrlen(ADR(MpFileManagerUIConnect.DeviceList.DeviceNames[1])) > 0) THEN
- // USB is available proceed with import: select all files on the USB and trigger copy command
-
- IF (MpFileManagerUIConnect.DeviceList.SelectedIndex <> 1) THEN
- MpFileManagerUIConnect.DeviceList.SelectedIndex := 1;
- MpFileManagerUIConnect.File.MultiSelect := FALSE;
- ELSIF MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE THEN
-
- IF NOT MpFileManagerUIConnect.File.MultiSelect THEN
- MpFileManagerUIConnect.File.MultiSelect := TRUE;
- FOR i := 0 TO ((SIZEOF(MpFileManagerUIConnect.File.List.Items)/SIZEOF(MpFileManagerUIConnect.File.List.Items[0])) - 1) DO
- MpFileManagerUIConnect.File.List.Items[i].IsSelected := TRUE;
- END_FOR
- ELSIF (brsstrlen(ADR(MpFileManagerUIConnect.File.List.Items[i].Name)) = 0) THEN
- // No files to copy, cancel operation
- HmiRecipe.Commands.ImportFromUSB := FALSE;
- ELSE
- MpFileManagerUIConnect.File.Copy := TRUE;
- HmiRecipe.Status.CopyStep := REC_COPY_FROM_USB;
- HmiRecipe.Commands.ImportFromUSB := FALSE;
- END_IF
-
- END_IF
- ELSE
- // No USB disk available, cancel operation
- HmiRecipe.Commands.ImportFromUSB := FALSE;
- END_IF
-
- END_IF
-
- REC_COPY_TO_USB:
- // Navigate to USB device and paste files
- IF (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE) THEN
-
- IF (MpFileManagerUIConnect.DeviceList.SelectedIndex <> 1) THEN
- MpFileManagerUIConnect.DeviceList.SelectedIndex := 1;
- MpFileManagerUIConnect.File.MultiSelect := FALSE;
- ELSE
- MpFileManagerUIConnect.File.Paste := TRUE;
- END_IF
-
- END_IF
-
- IF MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_PASTE THEN
- HmiRecipe.Status.CopyStep := REC_COPY_BUSY;
- END_IF
-
- REC_COPY_FROM_USB:
- // Navigate to CF device and paste files
- IF (MpFileManagerUIConnect.DeviceList.SelectedIndex <> 0) THEN
- MpFileManagerUIConnect.DeviceList.SelectedIndex := 0;
- MpFileManagerUIConnect.File.MultiSelect := FALSE;
- ELSIF (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE) THEN
- MpFileManagerUIConnect.File.Paste := TRUE;
- END_IF
-
- IF (MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_PASTE) THEN
- HmiRecipe.Status.CopyStep := REC_COPY_BUSY;
- END_IF
-
- REC_COPY_BUSY:
- // Wait for copying done
- IF (MpFileManagerUIConnect.MessageBox.Type = mpFILE_MSG_CONFIRM_OVERWRITE) OR (MpFileManagerUIConnect.MessageBox.Type = mpFILE_MSG_BUSY) THEN
- // TODO: Replace by confirm dialog
- MpFileManagerUIConnect.MessageBox.Confirm := TRUE;
- ELSIF MpFileManagerUIConnect.Status = mpFILE_UI_STATUS_IDLE THEN
- MpRecipeUIConnect.Recipe.Refresh := (MpRecipeUIConnect.Status = mpRECIPE_UI_STATUS_IDLE);
- HmiRecipe.Status.CopyStep := REC_COPY_WAIT;
- END_IF
-
- END_CASE
-
-END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/HMIActions.st b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/HMIActions.st
index 741d55ac..2c394a1c 100644
--- a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/HMIActions.st
+++ b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/HMIActions.st
@@ -188,7 +188,7 @@ ACTION RecipeHMIcommands:
// Check if the file name has already been used
HmiRecipe.Status.FileDuplicate := FALSE;
- FOR i:= 0 TO ((SIZEOF(MpRecipeUIConnect.Recipe.List.Names) / SIZEOF(MpRecipeUIConnect.Recipe.List.Names[0])) - 1) DO
+ FOR i:=0 TO ((SIZEOF(MpRecipeUIConnect.Recipe.List.Names) / SIZEOF(MpRecipeUIConnect.Recipe.List.Names[0])) - 1) DO
temp := MpRecipeUIConnect.New.FileName;
IF (brsstrcmp(ADR(HmiRecipe.Status.CategoryDropdown), ADR(PARAMETERS_RECIPE)) = 0) THEN
brsstrcat(ADR(temp),ADR('.par'));
diff --git a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/IEC.prg b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/IEC.prg
index fdc82a73..58b33091 100644
--- a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/IEC.prg
+++ b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/IEC.prg
@@ -6,6 +6,5 @@
RecipeMgr.typ
RecipeMgr.var
HMIActions.st
- FileOperations.st
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.st b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.st
index 223bbf07..6782247a 100644
--- a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.st
+++ b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.st
@@ -73,7 +73,7 @@ PROGRAM _INIT
// Load default Machine Settings recipe
HmiRecipe.Parameters.Category := MACHINE_CONFIGURATION_CATEGORY;
- HmiRecipe.Parameters.FileName := DEFAULT_MACHINE_CONFIGURATION;
+ HmiRecipe.Parameters.FileName := DEFAULT_MACHINE_CONFIGURATION;
brsstrcat(ADR(HmiRecipe.Parameters.FileName),ADR(MACHINE_CONFIG_FILE_EXTENSION));
MpRecipe_0.Load := TRUE;
WHILE NOT(MpRecipe_0.CommandDone OR MpRecipe_0.Error) DO
@@ -144,7 +144,6 @@ PROGRAM _CYCLIC
FormatDeviceDataProvider;
LoadPreview;
RecipeHMIcommands;
- FileCopyOperation;
// Reset commands on MpRecipe FUB
IF MpRecipe_0.CommandDone THEN
@@ -152,7 +151,7 @@ PROGRAM _CYCLIC
MpRecipe_0.Save := FALSE;
// Set update notification for machine category
IF ((brsstrcmp(ADR(HmiRecipe.Status.CategoryDropdown), ADR(MACHINE_CONFIGURATION_CATEGORY)) = 0) AND (MpRecipe_0.Save = TRUE)) THEN
- MpRecipe_0.UpdateNotification := TRUE;
+ MpRecipe_0.UpdateNotification := TRUE;
ELSE
MpRecipe_0.UpdateNotification := FALSE;
HmiRecipe.Parameters.Category := PARAMETERS_CATEGORY;
diff --git a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.typ b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.typ
index fc89ca95..3d951c17 100644
--- a/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.typ
+++ b/mappFramework/Logical/Infrastructure/Recipe/RecipeMgr/RecipeMgr.typ
@@ -31,7 +31,6 @@ TYPE
LastMaxSelection : UINT; (*The previous maximum number of recipes*)
LastSelectedIndex : UINT; (*The previous selected index*)
LastStatus : MpRecipeUIStatusEnum; (*The previous UI status*)
- CopyStep : RecipeCopyStepEnum; (*State machine step for copying a recipe to/from a USB drive*)
CategoryDropdown : STRING[50]; (*Category dropdown value*)
EditDialogOpened : BOOL; (*Flag that the edit dialog box was opened*)
CreateDialogOpened : BOOL; (*Flag that the create dialog box was opened*)
@@ -63,13 +62,6 @@ END_TYPE
(*Enumerations*)
TYPE
- RecipeCopyStepEnum :
- ( (*State machine step for copying a recipe to/from a USB drive*)
- REC_COPY_WAIT := 0, (*Wait state*)
- REC_COPY_TO_USB, (*Copy to USB*)
- REC_COPY_FROM_USB, (*Copy from USB*)
- REC_COPY_BUSY (*Busy*)
- );
RecipeHmiStepEnum :
( (*State machine step for HMI commands*)
REC_HMI_WAIT, (*Wait*)
diff --git a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/IEC.prg b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/IEC.prg
index 9f25ae3f..770085b7 100644
--- a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/IEC.prg
+++ b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/IEC.prg
@@ -3,7 +3,7 @@
UsbMgr.st
- UsbMgr.var
UsbMgr.typ
+ UsbMgr.var
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.st b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.st
index d4435c34..69bcf2ba 100644
--- a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.st
+++ b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.st
@@ -19,20 +19,20 @@ PROGRAM _CYCLIC
Node := 1;
USB.Status := ERR_OK;
IF USB.Cmd.AutoScan = TRUE THEN
- TON_10ms_01(IN:=1, PT:=USB.Par.RefreshInterval);
+ TON_01(IN := 1, PT := USB.Par.RefreshInterval);
// Get new USB data
- IF(TON_10ms_01.Q) THEN
- TON_10ms_01(IN:=0);
+ IF(TON_01.Q) THEN
+ TON_01(IN := 0);
USB.Status := ERR_FUB_BUSY;
brsmemset(ADR(Usb_data), 0, SIZEOF(Usb_data));
StateMachine := USB_CREATE_NODE_ID_LIST;
END_IF
ELSE
- TON_10ms_01(IN:=0);
+ TON_01(IN := 0);
END_IF
// Refresh USB data every X seconds when enabled
IF USB.Cmd.ErrorReset = TRUE THEN
- StateMachine := USB_ERROR;
+ StateMachine := USB_ERROR;
END_IF
FOR i := 0 TO IDX_USB_DEV_LIST DO
@@ -44,10 +44,10 @@ PROGRAM _CYCLIC
// -----------------------------------------------------------------------------------------------------------
USB_CREATE_NODE_ID_LIST:
UsbNodeListGet_0.enable := 1;
- UsbNodeListGet_0.pBuffer := ADR(Node_id_buffer);
- UsbNodeListGet_0.bufferSize := SIZEOF(Node_id_buffer);
- UsbNodeListGet_0.filterInterfaceClass := asusb_CLASS_MASS_STORAGE;
- UsbNodeListGet_0.filterInterfaceSubClass := 0;
+ UsbNodeListGet_0.pBuffer := ADR(Node_id_buffer);
+ UsbNodeListGet_0.bufferSize := SIZEOF(Node_id_buffer);
+ UsbNodeListGet_0.filterInterfaceClass := asusb_CLASS_MASS_STORAGE;
+ UsbNodeListGet_0.filterInterfaceSubClass := 0;
UsbNodeListGet_0;
// --------------------------------------------------------------------------------------------------------------------
@@ -82,9 +82,9 @@ PROGRAM _CYCLIC
// -----------------------------------------------------------------------------------------------------------
USB_READ_DEVICE_DATA:
UsbNodeGet_0.enable := 1;
- UsbNodeGet_0.nodeId := Node_id_buffer[Node];
- UsbNodeGet_0.pBuffer := ADR(Usb_data[Node]);
- UsbNodeGet_0.bufferSize := SIZEOF (Usb_data[Node]);
+ UsbNodeGet_0.nodeId := Node_id_buffer[Node];
+ UsbNodeGet_0.pBuffer := ADR(Usb_data[Node]);
+ UsbNodeGet_0.bufferSize := SIZEOF (Usb_data[Node]);
UsbNodeGet_0;
// --------------------------------------------------------------------------------------------------------------------
@@ -186,15 +186,15 @@ PROGRAM _CYCLIC
RETURN;
END_IF
// Create device string
- brsstrcpy(ADR(Device_param), ADR('/DEVICE='));
+ brsstrcpy(ADR(Device_param), ADR('/DEVICE='));
brsstrcat(ADR(Device_param), ADR(Usb_data[Node].ifName));
brsstrcpy(ADR(Device_name), ADR('USB'));
brsitoa(i, ADR(tmpSTR));
brsstrcat(ADR(Device_name), ADR(tmpSTR));
// Link device
DevLink_0.enable := 1;
- DevLink_0.pDevice := ADR(Device_name);
- DevLink_0.pParam := ADR(Device_param);
+ DevLink_0.pDevice := ADR(Device_name);
+ DevLink_0.pParam := ADR(Device_param);
DevLink_0;
// --------------------------------------------------------------------------------------------------------------------
@@ -204,21 +204,21 @@ PROGRAM _CYCLIC
brsmemcpy(ADR(Usb_data_old[i]), ADR(Usb_data[Node]), SIZEOF(Usb_data[Node]));
USB.Par.IsConnected[i] := TRUE;
Link_handle[i] := DevLink_0.handle;
- Node := Node + 1;
+ Node := Node + 1;
StateMachine := USB_LINK_NEW;
// Error
ELSIF DevLink_0.status <> ERR_FUB_BUSY THEN
USB.Status := DevLink_0.status;
USB.Err.State := StateMachine;
USB.Err.Text := 'error linking device';
- StateMachine := USB_ERROR;
- END_IF;
+ StateMachine := USB_ERROR;
+ END_IF;
// -----------------------------------------------------------------------------------------------------------
// UnLink device
// -----------------------------------------------------------------------------------------------------------
USB_UNLINK_DEVICE:
DevUnlink_0.enable := 1;
- DevUnlink_0.handle := Link_handle[Node];
+ DevUnlink_0.handle := Link_handle[Node];
DevUnlink_0;
// --------------------------------------------------------------------------------------------------------------------
@@ -262,7 +262,7 @@ PROGRAM _CYCLIC
// Unlink device
IF(USB.Err.State = USB_LINK_DEVICE) THEN
DevUnlink_0.enable := 1;
- DevUnlink_0.handle := DevLink_0.handle;
+ DevUnlink_0.handle := DevLink_0.handle;
DevUnlink_0;
END_IF
@@ -280,7 +280,7 @@ PROGRAM _EXIT
FOR i:=1 TO MAX_IDX_USB_DEV_LIST DO
REPEAT
DevUnlink_0.enable := 1;
- DevUnlink_0.handle := Link_handle[i];;
+ DevUnlink_0.handle := Link_handle[i];
DevUnlink_0;
UNTIL DevUnlink_0.status <> ERR_FUB_BUSY
END_REPEAT;
diff --git a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.typ b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.typ
index c35a821b..7c491d8a 100644
--- a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.typ
+++ b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.typ
@@ -17,7 +17,7 @@ TYPE
END_STRUCT;
UsbParType : STRUCT
IgnoreDongle : BOOL := TRUE; (*Ignoe B&R license dongle*)
- RefreshInterval : UINT := 300; (*Intervall timer for USB device refresh*)
+ RefreshInterval : TIME := T#3s; (*Intervall timer for USB device refresh*)
IsConnected : ARRAY[0..MAX_IDX_USB_DEV_LIST]OF BOOL; (*Shows if a USB stick is connected*)
END_STRUCT;
UsbErrType : STRUCT
diff --git a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.var b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.var
index d7d853ec..f5c54709 100644
--- a/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.var
+++ b/mappFramework/Logical/Infrastructure/Usb/UsbMgr/UsbMgr.var
@@ -1,36 +1,32 @@
-(*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
+(*Function Blocks*)
VAR
- USB : UsbMainType;
-END_VAR
-(*Local functions*)
-VAR
- TON_10ms_01 : TON_10ms;
+ TON_01 : TON;
UsbNodeListGet_0 : UsbNodeListGet; (*Type of FUB UsbNodeListGet*)
UsbNodeGet_0 : UsbNodeGet; (*Type of FUB UsbNodeGet*)
DevLink_0 : DevLink; (*Type of FUB DevLink*)
DevUnlink_0 : DevUnlink; (*Type of FUB DevUnlink*)
END_VAR
-(*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
-(*Local variables*)
+(*Constants*)
+VAR CONSTANT
+ BRvendorId : UINT := 1615; (*B&R vendor id*)
+ BRproductId : UINT := 1001; (*B&R dongle product id*)
+END_VAR
+(*Structure Types*)
VAR
+ USB : UsbMainType;
StateMachine : UsbStateEnum; (*State machine*)
+ Usb_data : ARRAY[1..MAX_IDX_USB_DEV_LIST] OF usbNode_typ; (*Data of all available USB devices*)
+ Usb_data_old : ARRAY[1..MAX_IDX_USB_DEV_LIST] OF usbNode_typ; (*Old data of all available USB devices*)
+END_VAR
+(*Variables*)
+VAR
Device_param : STRING[80]; (*Connection path of USB device*)
Device_name : STRING[40]; (*Connection path of USB device*)
Link_handle : ARRAY[1..MAX_IDX_USB_DEV_LIST] OF UDINT; (*Link handle for USB device*)
- Usb_data : ARRAY[1..MAX_IDX_USB_DEV_LIST] OF usbNode_typ; (*Data of all available USB devices*)
- Usb_data_old : ARRAY[1..MAX_IDX_USB_DEV_LIST] OF usbNode_typ; (*Old data of all available USB devices*)
Node_id_buffer : ARRAY[1..MAX_IDX_USB_DEV_LIST] OF UDINT; (*Different nodeIDs saved in array-elements*)
Is_linked : BOOL; (*Helper variable that indicates that a USB stick is linked*)
Node : USINT; (*Node number*)
i : USINT;
tmpSTR : STRING[10];
-END_VAR
-(*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*)
-(*Local constants*)
-VAR CONSTANT
- BRvendorId : UINT := 1615; (*B&R vendor id*)
- BRproductId : UINT := 1001; (*B&R dongle product id*)
-END_VAR
-VAR
ERR_MAX_DEVICE : UINT := 50000; (*Maximum number of dongles reached*)
END_VAR
diff --git a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/HMIAction.st b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/HMIAction.st
new file mode 100644
index 00000000..579ea027
--- /dev/null
+++ b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/HMIAction.st
@@ -0,0 +1,60 @@
+
+ACTION HMIAction:
+ // Check if the file name has already been used
+ CASE UserXCheckState OF
+ USERX_START:
+ IF NOT UserXMgrUIConnect.Import.ShowDialog THEN
+ UserXMgrUIConnect.Import.ShowDialog := TRUE;
+ ELSE
+ UserXCheckState := USERX_WAIT_FOR_DIALOG;
+ END_IF
+ USERX_WAIT_FOR_DIALOG:
+ UserXMgrUIConnect.Import.ShowDialog := FALSE;
+ UserXCheckState := USERX_SET_RESPONSE;
+ USERX_SET_RESPONSE:
+ IF NOT(UserXMgrUIConnect.Status = mpUSERX_UI_STATUS_IDLE) THEN
+ UserXMgrUIConnect.Import.Dialog.Cancel := TRUE;
+ ELSE
+ UserXMgrUIConnect.Import.Dialog.Cancel := FALSE;
+ UserXCheckState := USERX_CONFIRM_RESPONSE;
+ END_IF
+ USERX_CONFIRM_RESPONSE:
+ IF UserXMgrUIConnect.Status = mpUSERX_UI_STATUS_WAIT_DLG THEN
+ UserXCheckState := USERX_START;
+ ELSE
+ UserXCheckState := USERX_FINISH;
+ END_IF
+ USERX_NEW_EXPORT:
+ IF NOT UserXMgrUIConnect.Export.ShowDialog AND UserXMgrUIConnect.Status = mpUSERX_UI_STATUS_IDLE THEN
+ UserXCheckState := USERX_START;
+ END_IF
+ USERX_FINISH:
+
+ END_CASE
+ // If new updates are made via export execute a check
+ IF UserXMgrUIConnect.Export.ShowDialog THEN
+ UserXCheckState := USERX_NEW_EXPORT;
+ END_IF
+
+
+ //Duplicate file checks
+ HmiUserX.FileDuplicate := FALSE;
+ FOR i := 0 TO ((SIZEOF(UserXMgrUIConnect.Import.Dialog.List.FileNames) / SIZEOF(UserXMgrUIConnect.Import.Dialog.List.FileNames[0])) - 1) DO
+ temp := UserXMgrUIConnect.Export.Dialog.FileName;
+ brsstrcat(ADR(temp),ADR('.usr'));
+ IF (temp = UserXMgrUIConnect.Import.Dialog.List.FileNames[i]) AND HmiUserX.Export THEN
+ HmiUserX.FileDuplicate := TRUE;
+ END_IF
+ END_FOR
+
+ IF HmiUserX.FileDuplicate AND (HmiUserX.ConfirmOverwrite) THEN
+ UserXMgrUIConnect.Export.Dialog.Confirm := TRUE;
+ HmiUserX.Export := FALSE;
+ HmiUserX.ConfirmOverwrite := FALSE;
+ ELSIF NOT HmiUserX.FileDuplicate AND HmiUserX.Export THEN
+ UserXMgrUIConnect.Export.Dialog.Confirm := TRUE;
+ HmiUserX.Export := FALSE;
+ END_IF
+
+
+END_ACTION
diff --git a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/IEC.prg b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/IEC.prg
index 84f04e9c..fd29ae77 100644
--- a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/IEC.prg
+++ b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/IEC.prg
@@ -1,9 +1,10 @@
-
+
UserXMgr.st
UserXMgr.typ
UserXMgr.var
+ HMIAction.st
\ No newline at end of file
diff --git a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.st b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.st
index a58e8907..a457d7b2 100644
--- a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.st
+++ b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.st
@@ -19,19 +19,19 @@ PROGRAM _INIT
UserXMgrUIConnect.User.Create.Lock := FALSE;
UserXMgrUIConnect.User.Lock := FALSE;
UserXMgrUIConnect.User.Edit.Lock := FALSE;
- UserXMgrUIConnect.User.Create.Dialog.UserName := "";
- UserXMgrUIConnect.User.Create.Dialog.NewPassword := "";
+ UserXMgrUIConnect.User.Create.Dialog.UserName := "";
+ UserXMgrUIConnect.User.Create.Dialog.NewPassword := "";
UserXMgrUIConnect.User.Create.Dialog.ConfirmPassword := "";
UserXMgrUIConnect.User.List.MaxSelection := USER_LIST_MAX_SELECTION;
UserXMgrUIConnect.User.List.RangeStart := USER_LIST_RANGE_START;
UserXMgrUIConnect.User.List.RangeEnd := USER_LIST_RANGE_END;
- MpUserXManagerUI_0.MpLink := ADR(gMpLinkUserXLogin);
- MpUserXManagerUI_0.Enable := TRUE;
- MpUserXManagerUI_0.UIConnect := ADR(UserXMgrUIConnect);
+ MpUserXManagerUI_0.MpLink := ADR(gMpLinkUserXLogin);
+ MpUserXManagerUI_0.Enable := TRUE;
+ MpUserXManagerUI_0.UIConnect := ADR(UserXMgrUIConnect);
MpUserXManagerUI_0();
MpUserXLoginUI_0.MpLink := ADR(gMpLinkUserXLogin);
- MpUserXLoginUI_0.Enable := TRUE;
+ MpUserXLoginUI_0.Enable := TRUE;
MpUserXLoginUI_0.UIConnect := ADR(UserXLoginUIConnect);
MpUserXLoginUI_0();
@@ -39,6 +39,7 @@ PROGRAM _INIT
MpUserXLogin_0.Enable := TRUE;
MpUserXLogin_0();
+
END_PROGRAM
PROGRAM _CYCLIC
@@ -54,7 +55,9 @@ PROGRAM _CYCLIC
IF NOT MpUserXLogin_0.Error THEN
MpUserXLogin_0.ErrorReset := FALSE;
- END_IF
+ END_IF
+
+ HMIAction;
// Assign MpLinks
MpUserXManagerUI_0.MpLink := ADR(gMpLinkUserXLogin);
@@ -65,6 +68,7 @@ PROGRAM _CYCLIC
MpUserXManagerUI_0();
MpUserXLoginUI_0();
MpUserXLogin_0();
+
END_PROGRAM
diff --git a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.typ b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.typ
index e69de29b..38f3310f 100644
--- a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.typ
+++ b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.typ
@@ -0,0 +1,18 @@
+
+TYPE
+ enumCheckState :
+ (
+ USERX_START := 0,
+ USERX_WAIT_FOR_DIALOG := 1,
+ USERX_SET_RESPONSE := 2,
+ USERX_CONFIRM_RESPONSE := 3,
+ USERX_NEW_EXPORT := 4,
+ USERX_FINISH := 5
+ );
+ HMIUser_Typ : STRUCT
+ NewFileName : STRING[255];
+ Export : BOOL;
+ ConfirmOverwrite : BOOL;
+ FileDuplicate : BOOL;
+ END_STRUCT;
+END_TYPE
diff --git a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.var b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.var
index 76611a74..be11019b 100644
--- a/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.var
+++ b/mappFramework/Logical/Infrastructure/UserX/UserXMgr/UserXMgr.var
@@ -16,4 +16,14 @@ END_VAR
VAR
UserXMgrUIConnect : MpUserXMgrUIConnectType; (*UserX manager connection to the HMI*)
UserXLoginUIConnect : MpUserXLoginUIConnectType; (*UserL login connection to the HMI*)
+ i : USINT;
+ HmiUserX : HMIUser_Typ;
+END_VAR
+(*Enumerations*)
+VAR
+ UserXCheckState : enumCheckState; (*Used by the HMI Action to check for duplicate files*)
+END_VAR
+(*Variables*)
+VAR
+ temp : STRING[255]; (*Temporary string holder for checking file names*)
END_VAR
diff --git a/mappFramework/Logical/Libraries/IecCheck/IecCheck.st b/mappFramework/Logical/Libraries/IecCheck/IecCheck.st
index eb727fde..09a61d90 100644
--- a/mappFramework/Logical/Libraries/IecCheck/IecCheck.st
+++ b/mappFramework/Logical/Libraries/IecCheck/IecCheck.st
@@ -1,80 +1,80 @@
(* Check divisor for SINT division *)
FUNCTION CheckDivSint
IF divisor=0 THEN
- CheckDivSint:=1;
- MakeEntry(55555,divisor,'CheckDivSint');
+ CheckDivSint := 1;
+ MakeEntry(55555, divisor, 'CheckDivSint');
ELSE
- CheckDivSint:=divisor;
+ CheckDivSint := divisor;
END_IF
END_FUNCTION
(* Check divisor for USINT division *)
FUNCTION CheckDivUsint
- IF divisor=0 THEN
- CheckDivUsint:=1;
- MakeEntry(55555,divisor,'CheckDivUsint');
+ IF divisor = 0 THEN
+ CheckDivUsint := 1;
+ MakeEntry(55555, divisor, 'CheckDivUsint');
ELSE
- CheckDivUsint:=divisor;
+ CheckDivUsint := divisor;
END_IF
END_FUNCTION
(* Check divisor for INT division *)
FUNCTION CheckDivInt
- IF divisor=0 THEN
- CheckDivInt:=1;
- MakeEntry(55555,divisor,'CheckDivInt');
+ IF divisor = 0 THEN
+ CheckDivInt := 1;
+ MakeEntry(55555, divisor, 'CheckDivInt');
ELSE
- CheckDivInt:=divisor;
+ CheckDivInt := divisor;
END_IF
END_FUNCTION
(* Check divisor for UINT division *)
FUNCTION CheckDivUint
- IF divisor=0 THEN
- CheckDivUint:=1;
- MakeEntry(55555,divisor,'CheckDivUint');
+ IF divisor = 0 THEN
+ CheckDivUint := 1;
+ MakeEntry(55555, divisor, 'CheckDivUint');
ELSE
- CheckDivUint:=divisor;
+ CheckDivUint := divisor;
END_IF
END_FUNCTION
(* Check divisor for DINT division *)
FUNCTION CheckDivDint
- IF divisor=0 THEN
- CheckDivDint:=1;
- MakeEntry(55555,divisor,'CheckDivDint');
+ IF divisor = 0 THEN
+ CheckDivDint := 1;
+ MakeEntry(55555, divisor, 'CheckDivDint');
ELSE
- CheckDivDint:=divisor;
+ CheckDivDint := divisor;
END_IF
END_FUNCTION
(* Check divisor for UDINT division *)
FUNCTION CheckDivUdint
- IF divisor=0 THEN
- CheckDivUdint:=1;
- MakeEntry(55555,divisor,'CheckDivUdint');
+ IF divisor = 0 THEN
+ CheckDivUdint := 1;
+ MakeEntry(55555, divisor, 'CheckDivUdint');
ELSE
- CheckDivUdint:=divisor;
+ CheckDivUdint := divisor;
END_IF
END_FUNCTION
(* Check divisor for REAL division *)
FUNCTION CheckDivReal
- IF divisor=0 THEN
- CheckDivReal:=1;
- MakeEntry(55555,0,'CheckDivReal');
+ IF divisor = 0 THEN
+ CheckDivReal := 1;
+ MakeEntry(55555, 0, 'CheckDivReal');
ELSE
- CheckDivReal:=divisor;
+ CheckDivReal := divisor;
END_IF
END_FUNCTION
(* Check divisor for LREAL division *)
FUNCTION CheckDivLReal
- IF divisor=0 THEN
- CheckDivLReal:=1;
- MakeEntry(55555,0,'CheckDivLReal');
+ IF divisor = 0 THEN
+ CheckDivLReal := 1;
+ MakeEntry(55555, 0, 'CheckDivLReal');
ELSE
- CheckDivLReal:=divisor;
+ CheckDivLReal := divisor;
END_IF
END_FUNCTION
@@ -82,10 +82,10 @@ END_FUNCTION
FUNCTION CheckBounds
IF index < lower THEN
CheckBounds := lower;
- MakeEntry(55555,index,'CheckBounds');
+ MakeEntry(55555, index, 'CheckBounds');
ELSIF index > upper THEN
CheckBounds := upper;
- MakeEntry(55555,index,'CheckBounds');
+ MakeEntry(55555, index, 'CheckBounds');
ELSE
CheckBounds := index;
END_IF
@@ -95,10 +95,10 @@ END_FUNCTION
FUNCTION CheckRange
IF value < lower THEN
CheckRange := lower;
- MakeEntry(55555,value,'CheckRange');
+ MakeEntry(55555, value, 'CheckRange');
ELSIF value > upper THEN
CheckRange := upper;
- MakeEntry(55555,value,'CheckRange');
+ MakeEntry(55555, value, 'CheckRange');
ELSE
CheckRange := value;
END_IF
@@ -108,10 +108,10 @@ END_FUNCTION
FUNCTION CheckSignedSubrange
IF value < lower THEN
CheckSignedSubrange := lower;
- MakeEntry(55555,value,'CheckSignedSubrange');
+ MakeEntry(55555, value, 'CheckSignedSubrange');
ELSIF value > upper THEN
CheckSignedSubrange := upper;
- MakeEntry(55555,value,'CheckSignedSubrange');
+ MakeEntry(55555, value, 'CheckSignedSubrange');
ELSE
CheckSignedSubrange := value;
END_IF
@@ -121,10 +121,10 @@ END_FUNCTION
FUNCTION CheckUnsignedSubrange
IF value < lower THEN
CheckUnsignedSubrange := lower;
- MakeEntry(55555,value,'CheckUnsignedSubrange');
+ MakeEntry(55555, value, 'CheckUnsignedSubrange');
ELSIF value > upper THEN
CheckUnsignedSubrange := upper;
- MakeEntry(55555,value,'CheckUnsignedSubrange');
+ MakeEntry(55555, value, 'CheckUnsignedSubrange');
ELSE
CheckUnsignedSubrange := value;
END_IF
@@ -132,31 +132,31 @@ END_FUNCTION
(* Check address when reading dynamic variables *)
FUNCTION CheckReadAccess
- IF address=0 THEN
+ IF address = 0 THEN
(* TODO: Insert an appropriate code, see AutomationStudio help for further information *)
- MakeEntry(55555,address,'Read from NULL');
+ MakeEntry(55555, address, 'Read from NULL');
END_IF
- CheckReadAccess:=0;
+ CheckReadAccess := 0;
END_FUNCTION
(* Check address when writing dynamic variables *)
FUNCTION CheckWriteAccess
- IF address=0 THEN
+ IF address = 0 THEN
(* TODO: Insert an appropriate code, see AutomationStudio help for further information *)
- MakeEntry(55555,address,'Write to NULL');
+ MakeEntry(55555, address, 'Write to NULL');
END_IF
- CheckWriteAccess:=0;
+ CheckWriteAccess := 0;
END_FUNCTION
(* Makes an entry (log book entry) in the error log book *)
FUNCTION MakeEntry
- status_name := ST_name(0,ADR(taskname),ADR(group));
- brsstrcpy(ADR(out_text),ADR(text));
- brsstrcat(ADR(out_text),ADR(' > in task > '));
- brsstrcat(ADR(out_text),ADR(taskname));
- MakeEntry := ADR(out_text);
+ status_name := ST_name(0, ADR(taskname), ADR(group));
+ brsstrcpy(ADR(out_text), ADR(text));
+ brsstrcat(ADR(out_text), ADR(' > in task > '));
+ brsstrcat(ADR(out_text), ADR(taskname));
+ MakeEntry := ADR(out_text);
ERRxwarning(number, index, ADR(out_text));
// force page fault to get back trace
brsmemcpy(0, 0, 1);
diff --git a/mappFramework/Logical/Libraries/MpAudit/Binary.lby b/mappFramework/Logical/Libraries/MpAudit/Binary.lby
new file mode 100644
index 00000000..ec0a5a7c
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/Binary.lby
@@ -0,0 +1,21 @@
+
+
+
+
+ MpAudit.typ
+ MpAuditError.typ
+ MpAuditAlarm.typ
+ MpAudit.fun
+ TxtEvent.tmx
+ TxtCustom.tmx
+ TxtDatapoints.tmx
+ TxtUser.tmx
+ TxtRecipe.tmx
+ TxtEventF.tmx
+ TxtUserF.tmx
+ TxtRecipeF.tmx
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/MpAudit.fun b/mappFramework/Logical/Libraries/MpAudit/MpAudit.fun
new file mode 100644
index 00000000..e9add073
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/MpAudit.fun
@@ -0,0 +1,204 @@
+
+FUNCTION MpAuditWStringChange : DINT (*Detects the change of a unicode string and creates an event for audit trail*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Old : WSTRING[100]; (*Entered when creating the entry under %old*) (* *) (*#CMD#;*)
+ New : WSTRING[100]; (*Entered when creating the entry under %new*) (* *) (*#CMD#;*)
+ Identifier : STRING[100]; (*Entered when creating the entry under %dpid *) (* *) (*#CMD#;*)
+ END_VAR
+END_FUNCTION
+
+FUNCTION MpAuditStringChange : DINT (*Detects the change of a string and creates an event for audit trail*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Old : STRING[100]; (*Entered when creating the entry under %old *) (* *) (*#CMD#;*)
+ New : STRING[100]; (*Entered when creating the entry under %new*) (* *) (*#CMD#;*)
+ Identifier : STRING[100]; (*Entered when creating the entry under %dpid *) (* *) (*#CMD#;*)
+ END_VAR
+END_FUNCTION
+
+FUNCTION_BLOCK MpAuditTrailConfig (*Configuration for audit trail*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ Configuration : REFERENCE TO MpAuditTrailConfigType; (*Structure used to specify the configuration*) (* *) (*#PAR#;*)
+ Load : BOOL; (*Loads the configuration of the component*) (* *) (*#CMD#;*)
+ Save : BOOL; (*Saves the configuration of the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#;*)
+ CommandBusy : BOOL; (*Function block currently executing command*) (* *) (*#CMD#OPT#;*)
+ CommandDone : BOOL; (*Command successfully executed by function block*) (* *) (*#CMD#;*)
+ Info : MpAuditTrailInfoType; (*Additional information about the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpComInternalDataType;
+ END_VAR
+END_FUNCTION_BLOCK
+
+FUNCTION MpAuditCustomEvent : DINT (*Sets a user-defined event*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Type : WSTRING[100]; (*Entered when creating the entry under %typ*) (* *) (*#CMD#;*)
+ Message : WSTRING[100]; (*Entered when creating the entry under %msg*) (* *) (*#CMD#;*)
+ Comment : WSTRING[100]; (*Entered when creating the entry under %cmt *) (* *) (*#CMD#;*)
+ END_VAR
+END_FUNCTION
+
+FUNCTION_BLOCK MpAuditTrailUI (*UI connection to a VC4 audit trail page*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ UISetup : MpAuditTrailUISetupType; (*Used to configure the elements connected to the HMI application*) (* *) (*#PAR#;*)
+ Refresh : BOOL; (*A rising edge on this command updates the event list (e.g. after the language has been changed)*) (* *) (*#CMD#;*)
+ Language : REFERENCE TO STRING[20]; (*Language ID (and optionally measurement-system) that should be used when exporting data (e,g, "en|metric")*) (* *) (*#CMD#;*)
+ UIConnect : REFERENCE TO MpAuditTrailUIConnectType; (*This structure contains the parameters needed for the connection to the HMI application*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#; *)
+ Info : MpAuditInfoType; (*Additional information about the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR
+ Internal : MpComInternalDataType;
+ END_VAR
+END_FUNCTION_BLOCK
+
+FUNCTION_BLOCK MpAuditTrail (*Centralized event audit trail*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ Language : REFERENCE TO STRING[20]; (*Language ID (and optionally measurement-system) that should be used when exporting data (e,g, "en|metric")*) (* *) (*#CMD#;*)
+ DeviceName : REFERENCE TO STRING[50]; (*File device (data storage medium) where the files are stored*) (* *) (*#CMD#;*)
+ Export : BOOL; (*Saves the currently logged from memory to a file on the specified data storage medium ("DeviceName")*) (* *) (*#CMD#;*)
+ ExportArchive : BOOL; (*Exports the oldest archive to the specified data storage medium ("DeviceName")*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#; *)
+ CommandBusy : BOOL; (*Function block currently executing command*) (* *) (*#CMD#OPT#;*)
+ CommandDone : BOOL; (*Command successfully executed by function block*) (* *) (*#CMD#;*)
+ CurrentRecord : UDINT; (*Counts all events*) (* *) (*#CMD#;*)
+ ArchiveAvailable : BOOL; (*Indicates that an archive is currently available and can be exported*) (* *) (*#CMD#;*)
+ Info : MpAuditTrailInfoType; (*Additional information about the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpComInternalDataType;
+ END_VAR
+END_FUNCTION_BLOCK
+
+FUNCTION MpAuditValueChange : DINT (*Detects the change of a value and creates an event for audit trail*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Old : LREAL; (*Entered when creating the entry under %old*) (* *) (*#CMD#;*)
+ New : LREAL; (*Entered when creating the entry under %new*) (* *) (*#CMD#;*)
+ Identifier : STRING[100]; (*Entered when creating the entry under %dpid*) (* *) (*#CMD#;*)
+ END_VAR
+END_FUNCTION
+
+FUNCTION_BLOCK MpAuditVC4Event (*Collects events from VC4 for the audit trail*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ Localize : BOOL; (*Defines whether the user ID or description of the user ID is used to create an entry*) (* *) (*#CMD#;*)
+ MinUserID : UINT; (*First ID from VC4 for which events are logged*) (* *) (*#CMD#;*)
+ MaxUserID : UINT; (*Last ID from VC4 for which events are logged*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#; *)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpAuditVC4EventInternalType;
+ END_VAR
+END_FUNCTION_BLOCK
+
+FUNCTION_BLOCK MpAuditRegPar (*Register and monitor a PV*)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*The parameter is registered on a positive edge on this input and unregistered on a negative edge*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ PVName : REFERENCE TO STRING[100]; (*Name of PV that should be monitored*) (* *) (*#CMD#;*)
+ Identiffier : REFERENCE TO STRING[100]; (*Identifier for given PV used in MpAudit (optional). If no separate identifier is given than the PV-name will be used*) (* *) (*#CMD#OPT#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#; *)
+ Info : MpAuditTrailInfoType; (*Additional information about the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpComInternalDataType;
+ END_VAR
+END_FUNCTION_BLOCK
+
+FUNCTION MpAuditClearBuffer : DINT (*Clears the audit buffer (archives are not effected)*)
+ VAR_INPUT
+ MpLink : MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ END_VAR
+END_FUNCTION
+
+FUNCTION MpAuditStartBatch : DINT (*Creates a event marking the start of a new batch*)
+ VAR_INPUT
+ MpLink : MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Name : WSTRING[50]; (*Name (unique identifier) of batch*) (* *) (*#CMD#;*)
+ END_VAR
+END_FUNCTION
+
+FUNCTION_BLOCK MpAuditExport (*Advanced export function*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ Filter : REFERENCE TO MpAuditExportFilterType; (*Filter-settings to be applied for data to export*) (* *) (*#CMD#;*)
+ ToRecord : UDINT; (*Record-number up to which (and excluding) data is exported*) (* *) (*#CMD#;*)
+ Language : REFERENCE TO STRING[20]; (*Language ID (and optionally measurement-system) that should be used when exporting data (e,g, "en|metric")*) (* *) (*#CMD#;*)
+ DeviceName : REFERENCE TO STRING[50]; (*File device (data storage medium) where the files are stored*) (* *) (*#CMD#;*)
+ Export : BOOL; (*Execute export*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#; *)
+ CommandBusy : BOOL; (*Function block currently executing command*) (* *) (*#CMD#OPT#;*)
+ CommandDone : BOOL; (*Command successfully executed by function block*) (* *) (*#CMD#;*)
+ Record : UDINT; (*Record-number of last exported record (set after export)*) (* *) (*#CMD#;*)
+ Info : MpAuditInfoType; (*Additional information about the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpComInternalDataType;
+ END_VAR
+END_FUNCTION_BLOCK
+
+FUNCTION_BLOCK MpAuditQuery (*Query Data function*) (* $GROUP=mapp Services,$CAT=Audit Trail,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpAudit.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ Mode : MpAuditQueryModeEnum; (*Kind of query*) (* *) (*#CMD#;*)
+ Name : REFERENCE TO STRING[50]; (*Name of query to execute*) (* *) (*#CMD#;*)
+ Language : REFERENCE TO STRING[20]; (*Language ID (and optionally measurement-system) that should be used when exporting data (e,g, "en|metric")*) (* *) (*#CMD#;*)
+ Execute : BOOL; (*Execute query*) (* *) (*#CMD#;*)
+ Next : BOOL; (*Execute query - get next entries*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly*) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block*) (* *) (*#PAR#; *)
+ CommandBusy : BOOL; (*Function block currently executing command*) (* *) (*#CMD#OPT#;*)
+ CommandDone : BOOL; (*Command successfully executed by function block*) (* *) (*#CMD#;*)
+ Info : MpAuditQueryInfoType; (*Additional information about the component*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpComInternalDataType;
+ END_VAR
+END_FUNCTION_BLOCK
diff --git a/mappFramework/Logical/Libraries/MpAudit/MpAudit.typ b/mappFramework/Logical/Libraries/MpAudit/MpAudit.typ
new file mode 100644
index 00000000..19faee0c
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/MpAudit.typ
@@ -0,0 +1,272 @@
+
+TYPE
+ MpAuditTrailUIStatusEnum :
+ (
+ mpAUDIT_UI_STATUS_IDLE, (*Indicates that no process is currently active*)
+ mpAUDIT_UI_STATUS_UPDATE, (*Performs an update*)
+ mpAUDIT_UI_STATUS_FILTER, (*Displays a window for filtering the results*)
+ mpAUDIT_UI_STATUS_EXPORT, (*Exporting data*)
+ mpAUDIT_UI_STATUS_ERROR (*Error pending*)
+ );
+ MpAuditFileTypeEnum :
+ (
+ mpAUDIT_FILE_TYPE_TXT := 0, (*Export as text file*)
+ mpAUDIT_FILE_TYPE_XML := 1, (*Export as .xml file*)
+ mpAUDIT_FILE_TYPE_PDF := 2 (*Export as .pdf file*)
+ );
+ MpAuditArchiveModeEnum :
+ (
+ mpAUDIT_ARCHIVE_DAILY := 0, (*Creates an archive daily*)
+ mpAUDIT_ARCHIVE_MO_TO_FR := 1, (*Creates an archive from Monday to Friday*)
+ mpAUDIT_ARCHIVE_BATCH := 2 (*Create archives at start of new batch*)
+ );
+ MpAuditFontTypeEnum :
+ (
+ mpAUDIT_FONT_COURIER := 0,
+ mpAUDIT_FONT_HELVETICA := 1,
+ mpAUDIT_FONT_TIMESROMAN := 2,
+ mpAUDIT_FONT_SIMSUN := 3, (*Simplified Chinese*)
+ mpAUDIT_FONT_SIMHEI := 4, (*Simplified Chinese*)
+ mpAUDIT_FONT_MINGLIU := 5, (*Traditional Chinese*)
+ mpAUDIT_FONT_MINCYO := 6, (*Japanese*)
+ mpAUDIT_FONT_GOTHIC := 7, (*Japanese*)
+ mpAUDIT_FONT_PMINCYO := 8, (*Japanese*)
+ mpAUDIT_FONT_PGOTHIC := 9, (*Japanese*)
+ mpAUDIT_FONT_DOTUMCHE := 10, (*Korean*)
+ mpAUDIT_FONT_DOTUM := 11, (*Korean*)
+ mpAUDIT_FONT_BATANGCHE := 12, (*Korean*)
+ mpAUDIT_FONT_BATANG := 13 (*Korean*)
+ );
+ MpAuditPageFormatEnum :
+ (
+ mpAUDIT_PAGE_FORMAT_UNDEFINED := 0,
+ mpAUDIT_PAGE_FORMAT_LETTER := 1,
+ mpAUDIT_PAGE_FORMAT_LEGAL := 2,
+ mpAUDIT_PAGE_FORMAT_A3 := 3,
+ mpAUDIT_PAGE_FORMAT_A4 := 4,
+ mpAUDIT_PAGE_FORMAT_A5 := 5,
+ mpAUDIT_PAGE_FORMAT_B4 := 6,
+ mpAUDIT_PAGE_FORMAT_B5 := 7
+ );
+ MpAuditPageDirectionEnum :
+ (
+ mpAUDIT_PAGE_DIRECTION_UNDEFINED := 0,
+ mpAUDIT_PAGE_DIRECTION_PORTRAIT := 1,
+ mpAUDIT_PAGE_DIRECTION_LANDSCAPE := 2
+ );
+ MpAuditPageMarginEnum :
+ (
+ mpAUDIT_PAGE_MARGIN_NORMAL := 0,
+ mpAUDIT_PAGE_MARGIN_NARROW := 1,
+ mpAUDIT_PAGE_MARGIN_MODERATE := 2,
+ mpAUDIT_PAGE_MARGIN_WIDE := 3
+ );
+ MpAuditQueryModeEnum :
+ (
+ mpAUDIT_QUERY_MODE_ALL, (*Read all elements starting from newest entry*)
+ mpAUDIT_QUERY_MODE_NEW (*Read only new elements (added since last successfull call of MpAuditQuery) - For the first call it behaves like mpAUDIT_QUERY_MODE_ALL*)
+ );
+ MpAuditMemoryEnum :
+ (
+ mpAUDIT_MEM_TEMP := 0, (*Memory location: DRAM (temporary)*)
+ mpAUDIT_MEM_ROM := 1, (*Memory location: USER ROM (memory card)*)
+ mpAUDIT_MEM_SRAM := 2, (*Memory location: SRAM (battery-backed)*)
+ mpAUDIT_MEM_BUFFERD_ROM := 3 (*Memory location: DRAM (temporary)*)
+ );
+ MpAuditDisplayTextSourceType : STRUCT
+ FormatSource : STRING[100]; (*only for With mpAUDIT_TEXT_SOURCE_VC4 as text source: Defines the index of the text group of the visualization object from which the text is added*)
+ Format : STRING[255]; (*With mpAUDIT_TEXT_SOURCE_NONE as text source: This parameter defines how the entry looks.
+With mpAUDIT_TEXT_SOURCE_VC4 as text source: Defines the index in the text group from which the text is added*)
+ END_STRUCT;
+ MpAuditTextSourceType : STRUCT
+ Type : MpAuditTextSourceEnum := mpAUDIT_TEXT_SOURCE_NONE; (*Type of text source*)
+ Name : STRING[50]; (*only for mpAUDIT_TEXT_SOURCE_VC4 as text source: Name of the VC4 visualization application*)
+ OutputFormat : STRING[255] := '[%[TIME=%c]] [%ev] [%op]'; (*With mpAUDIT_TEXT_SOURCE_NONE as text source: This parameter defines how the entry looks.
+With mpAUDIT_TEXT_SOURCE_VC4 as text source: Defines the index in the text group from which the text is added*)
+ OutputFormatSource : STRING[100]; (*only for With mpAUDIT_TEXT_SOURCE_VC4 as text source: Defines the index of the text group of the visualization object from which the text is added*)
+ Display : MpAuditDisplayTextSourceType;
+ ErrorMessage : MpAuditErrorMessageType; (*Replacement text that is added if the specified ID is not found*)
+ END_STRUCT;
+ MpAuditLanguageFontType : STRUCT
+ Language : STRING[20];
+ Font : MpAuditFontTypeEnum;
+ END_STRUCT;
+ MpAuditPdfTitleType : STRUCT
+ Enable : BOOL := TRUE; (*Enable PDF Title page*)
+ Text : STRING[100];
+ END_STRUCT;
+ MpAuditExportPdfType : STRUCT
+ DefaultFont : MpAuditFontTypeEnum;
+ Format : MpAuditPageFormatEnum;
+ Direction : MpAuditPageDirectionEnum;
+ Margins : MpAuditPageMarginEnum;
+ OwnerPassword : STRING[50];
+ UserPassword : STRING[50];
+ AllowPrint : BOOL;
+ AllowCopy : BOOL;
+ AllowEdit : BOOL;
+ Icon : STRING[100];
+ Header : STRING[100];
+ Title : MpAuditPdfTitleType;
+ Fonts : ARRAY[0..4]OF MpAuditLanguageFontType;
+ END_STRUCT;
+ MpAuditExportType : STRUCT
+ FileNamePattern : STRING[50] := 'Audit_%Y_%m_%d_%H_%M'; (*Filename including timestamp. This format can be changed*)
+ ArchiveNamePattern : STRING[50] := 'Archive_%Y_%m_%d_%H_%M'; (*Archive name including timestamp. This format can be changed*)
+ PassPhrase : STRING[100] := 'DefaultPassword1'; (*Password (or phrase) for the encrypted files / archive. Special characters are not permitted*)
+ Encrypt : BOOL := FALSE; (*Encrypted export files*)
+ RawData : BOOL := FALSE; (*Attaches raw data to the export file*)
+ FileType : MpAuditFileTypeEnum := mpAUDIT_FILE_TYPE_TXT; (*File type for the export file*)
+ PDF : MpAuditExportPdfType; (*Settings for PDF-export*)
+ END_STRUCT;
+ MpAuditExportFilterType : STRUCT
+ From : MpAuditTrailUICurrDTFilterType; (*Time from which events are displayed*)
+ Until : MpAuditTrailUICurrDTFilterType; (*Time until which events are displayed*)
+ Event : MpAuditTrailUIEventFilterType; (*Defines which events are displayed*)
+ Operator : MpAuditTrailUIOpFilterType; (*Determines from which user events are displayed*)
+ Pattern : MpAuditTrailUIPatternFilterType; (*Event-message filter (pattern matching)*)
+ Batch : MpAuditTrailUIBatchFilterType; (*Batch filter*)
+ END_STRUCT;
+ MpAuditArchiveType : STRUCT
+ Enable : BOOL := FALSE; (*Switches the archive function on/off*)
+ Mode : MpAuditArchiveModeEnum := mpAUDIT_ARCHIVE_DAILY; (*Defines which weekdays archiving takes place*)
+ Time : TIME_OF_DAY; (*Defines which time archiving takes place*)
+ MaxSize : UDINT := 100; (*If the number of events reaches this size, an archive is created immediately regardless of the day/time [kB]*)
+ END_STRUCT;
+ MpAuditTrailConfigType : STRUCT
+ Events : ARRAY[0..9]OF UINT := [16#10,16#12,8(0)]; (*Defines which events will be logged . This value are only read when the component is initialized (Disabled -> Enabled).*)
+ RecordingSize : UDINT := 200; (*Reserved memory for events [kB]. This value is only read when the component is initialized (Disabled -> Enabled).*)
+ SramBufferSize : UDINT := 20; (*Reserved memory for events in SRAM [kB] (this parameter is only used if "RecordMemory" is set to mpAUDIT_MEM_BUFFERED_ROM). This value is only read when the component is initialized (Disabled -> Enabled).*)
+ RecordMemory : MpAuditMemoryEnum := mpAUDIT_MEM_TEMP; (*Memory where logging is stored while active. This value is only read when the component is initialized (Disabled -> Enabled).*)
+ TextSource : MpAuditTextSourceType; (*Defines the origin of the description text for the various events*)
+ Archive : MpAuditArchiveType; (*Specifies when an archive should be created from the current events*)
+ Export : MpAuditExportType; (*Specifies how the export should proceed*)
+ END_STRUCT;
+ MpAuditErrorMessageType : STRUCT
+ TextNotFound : STRING[20] := '{Err:Text}'; (*Text that is displayed if the desired index was not found*)
+ SpecifierInvalid : STRING[20] := '{Err:Specifier}'; (*Text that is displayed if the desired icon wasn't found or is not available for this event*)
+ END_STRUCT;
+ MpAuditTextSourceEnum :
+ (
+ mpAUDIT_TEXT_SOURCE_NONE := 0, (*Event text from the configuration*)
+ mpAUDIT_TEXT_SOURCE_VC4 := 1, (*Event text taken from VC4*)
+ mpAUDIT_TEXT_SOURCE_TEXTSYS := 2 (*AR TextSystem with Audit-specific notation*)
+ );
+ MpAuditTrailUISetupType : STRUCT
+ EventListSize : UINT := 20; (*Number of events to be displayed on one page of the list in the HMI application*)
+ ScrollWindow : USINT := 0; (*Determines how many entries from the list are displayed in advance when scrolling up and down*)
+ END_STRUCT;
+ MpAuditTrailUIConnectType : STRUCT
+ Status : MpAuditTrailUIStatusEnum; (*Current operation*)
+ Output : MpAuditTrailUIOutputType; (*Indicates the filtered events*)
+ Filter : MpAuditUIFilterType; (*Allows events to be filtered*)
+ Export : BOOL; (*Export audit-data*)
+ MessageBox : MpAuditUIMessageBoxType; (*Controls dialog boxes*)
+ END_STRUCT;
+ MpAuditUIMessageEnum :
+ (
+ mpAUDIT_UI_MSG_NONE := 0, (*No dialog box*)
+ mpAUDIT_UI_MSG_ERROR := 1 (*Dialog box: Errors*)
+ );
+ MpAuditUIMessageBoxType : STRUCT
+ LayerStatus : UINT; (*Visibility of the dialog box *)
+ Type : MpAuditUIMessageEnum; (*Type of dialog box*)
+ ErrorNumber : UINT; (*Current error number to be displayed *)
+ StatusID : DINT;
+ Confirm : BOOL; (*Confirms the operation*)
+ Cancel : BOOL; (*Cancels the operation*)
+ END_STRUCT;
+ MpAuditInfoType : STRUCT
+ Diag : MpAuditDiagType; (*Diagnostic structure for the status ID*)
+ END_STRUCT;
+ MpAuditQueryInfoType : STRUCT
+ AvailableSpace : UDINT; (*Number of available "rows" in the PV configured for the query*)
+ RowsRead : UDINT; (*Actual number of rows read by the query*)
+ HasMoreRows : BOOL; (*Query is complete (alll data read and copied to PV)*)
+ Diag : MpAuditDiagType; (*Diagnostic structure for the status ID*)
+ END_STRUCT;
+ MpAuditTrailInfoType : STRUCT
+ NumberArchives : UINT; (*Number of available archives*)
+ Diag : MpAuditDiagType; (*Diagnostic structure for the status ID*)
+ END_STRUCT;
+ MpAuditDiagType : STRUCT
+ StatusID : MpAuditStatusIDType; (*StatusID diagnostic structure *)
+ END_STRUCT;
+ MpAuditStatusIDType : STRUCT
+ ID : MpAuditErrorEnum; (*Error code for mapp component*)
+ Severity : MpComSeveritiesEnum; (*Describes the type of information supplied by the status ID (success, information, warning, error)*)
+ Code : UINT; (*Code for the status ID. This error number can be used to search for additional information in the help system*)
+ END_STRUCT;
+ MpAuditTrailUIOutputType : STRUCT
+ EventID : ARRAY[0..19]OF UINT; (*List of IDs from all events meeting the current filter criteria*)
+ EventText : ARRAY[0..19]OF WSTRING[100]; (*List of all events meeting the current filter criteria*)
+ PageUp : BOOL; (*Jumps to the start of the current page and then scrolls up one page at a time The size of the page is defined using the "EventListSize" parameter in the MpAuditTrailUISetupType structure*)
+ StepUp : BOOL; (*Selects the previous entry in the list*)
+ StepDown : BOOL; (*Selects the next entry in the list*)
+ PageDown : BOOL; (*Jumps to the end of the current page and then scrolls down one page at a time The size of the page is defined using the "EventListSize" parameter in the MpAuditTrailUISetupType structure*)
+ RangeStart : REAL; (*Shows a bar indicating which part of the list is currently being displayed. Used for the starting value of "Range" for a scaled element in the HMI application*)
+ RangeEnd : REAL; (*Shows a bar indicating which part of the list is currently being displayed. Used for the ending value of "Range" for a scaled element in the HMI application*)
+ END_STRUCT;
+ MpAuditTrailUICurrDTFilterType : STRUCT
+ Enable : BOOL; (*Enables the filter*)
+ DateTime : DATE_AND_TIME; (*Time from/to which filtering should take place*)
+ END_STRUCT;
+ MpAuditTrailUISetDTFilterType : STRUCT
+ Enable : BOOL; (*Enables the filter*)
+ Year : UINT; (*Year from/to which filtering should take place*)
+ Month : USINT; (*Month from/to which filtering should take place*)
+ Day : USINT; (*Day from/to which filtering should take place*)
+ Hour : USINT; (*Hour from/to which filtering should take place*)
+ Minute : USINT; (*Minute from/to which filtering should take place*)
+ END_STRUCT;
+ MpAuditTrailUIEventFilterType : STRUCT
+ Enable : BOOL; (*Enables the filter*)
+ Exclude : BOOL; (*Either only this event type (FALSE) or all but this event type (TRUE)*)
+ Event : ARRAY[0..4]OF UDINT; (*Events that should be filtered*)
+ END_STRUCT;
+ MpAuditTrailUIOpFilterType : STRUCT
+ Enable : BOOL; (*Enables the filter*)
+ Exclude : BOOL; (*Only this user (FALSE) / All other users (TRUE)*)
+ Name : WSTRING[50]; (*Operator name*)
+ END_STRUCT;
+ MpAuditTrailUIPatternFilterType : STRUCT
+ Enable : BOOL; (*Enables the filter*)
+ Exclude : BOOL; (*Select events matching the pattern (FALSE) or all other events (TRUE)*)
+ Compare : WSTRING[50]; (*String Pattern containing wildcards (* and ?) that is applied on the event-message*)
+ END_STRUCT;
+ MpAuditTrailUIBatchFilterType : STRUCT
+ Enable : BOOL; (*Enables the filter*)
+ Name : WSTRING[50]; (*Name (identifier) of batch to be included in output*)
+ END_STRUCT;
+ MpAuditTrailUIFilterDialogType : STRUCT
+ LayerStatus : UINT; (*Status data point for the default layer of the visualization page where the filter is configured*)
+ From : MpAuditTrailUISetDTFilterType; (*Time from which events are displayed*)
+ Until : MpAuditTrailUISetDTFilterType; (*Time until which events are displayed*)
+ Event : MpAuditTrailUIEventFilterType; (*Defines which events are displayed*)
+ Operator : MpAuditTrailUIOpFilterType; (*Determines from which user events are displayed*)
+ Confirm : BOOL; (*Confirms the operation*)
+ Cancel : BOOL; (*Cancels the operation*)
+ Pattern : MpAuditTrailUIPatternFilterType; (*Event-message filter (pattern matching)*)
+ Batch : MpAuditTrailUIBatchFilterType; (*Batch filter*)
+ END_STRUCT;
+ MpAuditTrailUICurrentFilterType : STRUCT
+ From : MpAuditTrailUICurrDTFilterType; (*Time from which events are displayed*)
+ Until : MpAuditTrailUICurrDTFilterType; (*Time until which events are displayed*)
+ Event : MpAuditTrailUIEventFilterType; (*Defines which events are displayed*)
+ Operator : MpAuditTrailUIOpFilterType; (*Determines from which user events are displayed*)
+ Pattern : MpAuditTrailUIPatternFilterType; (*Event-message filter (pattern matching)*)
+ Batch : MpAuditTrailUIBatchFilterType; (*Batch filter*)
+ END_STRUCT;
+ MpAuditUIFilterType : STRUCT
+ ShowDialog : BOOL; (*Command that opens the dialog box*)
+ Dialog : MpAuditTrailUIFilterDialogType; (*Window for selecting an event filter*)
+ Current : MpAuditTrailUICurrentFilterType; (*Displays the current filter*)
+ DefaultLayerStatus : UINT; (*Status data point for the default layer of the visualization page on which the filter options are available*)
+ END_STRUCT;
+ MpAuditVC4EventInternalType : STRUCT
+ hEventSys : UDINT;
+ END_STRUCT;
+ MpAuditMonitorInternalType : STRUCT
+ Handle : UDINT;
+ END_STRUCT;
+END_TYPE
diff --git a/mappFramework/Logical/Libraries/MpAudit/MpAuditAlarm.typ b/mappFramework/Logical/Libraries/MpAudit/MpAuditAlarm.typ
new file mode 100644
index 00000000..d61b184c
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/MpAuditAlarm.typ
@@ -0,0 +1,8 @@
+
+TYPE
+ MpAuditTrailAlarmEnum :
+ ( (* Alarms of MpAudit Trail *)
+ mpAUDIT_ALM_ARCHIVE_AVAILABLE := 0, (* Archive is available for export *)
+ mpAUDIT_ALM_ARCHIVE_OVERFLOW := 1 (* Max. number of archives reached - archiving stopped *)
+ );
+END_TYPE
diff --git a/mappFramework/Logical/Libraries/MpAudit/MpAuditError.typ b/mappFramework/Logical/Libraries/MpAudit/MpAuditError.typ
new file mode 100644
index 00000000..549c0961
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/MpAuditError.typ
@@ -0,0 +1,44 @@
+
+TYPE
+ MpAuditErrorEnum :
+ ( (* Error numbers of library MpAudit *)
+ mpAUDIT_NO_ERROR := 0, (* No error *)
+ mpAUDIT_ERR_ACTIVATION := -1064239103, (* Could not create component [Error: 1, 0xc0910001] *)
+ mpAUDIT_ERR_MPLINK_NULL := -1064239102, (* MpLink is NULL pointer [Error: 2, 0xc0910002] *)
+ mpAUDIT_ERR_MPLINK_INVALID := -1064239101, (* MpLink connection not allowed [Error: 3, 0xc0910003] *)
+ mpAUDIT_ERR_MPLINK_CHANGED := -1064239100, (* MpLink modified [Error: 4, 0xc0910004] *)
+ mpAUDIT_ERR_MPLINK_CORRUPT := -1064239099, (* Invalid MpLink contents [Error: 5, 0xc0910005] *)
+ mpAUDIT_ERR_MPLINK_IN_USE := -1064239098, (* MpLink already in use [Error: 6, 0xc0910006] *)
+ mpAUDIT_ERR_CONFIG_NULL := -1064239096, (* Configuration structure is null pointer [Error: 8, 0xc0910008] *)
+ mpAUDIT_ERR_CONFIG_NO_PV := -1064239095, (* Configuration pointer not PV [Error: 9, 0xc0910009] *)
+ mpAUDIT_ERR_CONFIG_LOAD := -1064239094, (* Error loading configuration [Error: 10, 0xc091000a] *)
+ mpAUDIT_WRN_CONFIG_LOAD := -2137980917, (* Warning loading configuration [Warning: 11, 0x8091000b] *)
+ mpAUDIT_ERR_CONFIG_SAVE := -1064239092, (* Error saving configuration [Error: 12, 0xc091000c] *)
+ mpAUDIT_ERR_CONFIG_INVALID := -1064239091, (* Invalid Configuration [Error: 13, 0xc091000d] *)
+ mpAUDIT_ERR_TEXT_SOURCE := -1064124508, (* Text source not found [Error: 49060, 0xc092bfa4] *)
+ mpAUDIT_ERR_TEXT_NAMESPACE := -1064124507, (* Text not found in text source [Error: 49061, 0xc092bfa5] *)
+ mpAUDIT_ERR_TEXT_IDENT := -1064124506, (* Text ID not found [Error: 49062, 0xc092bfa6] *)
+ mpAUDIT_ERR_LANGUAGE := -1064124505, (* Language not found [Error: 49063, 0xc092bfa7] *)
+ mpAUDIT_WRN_LANGUAGE_FALLBACK := -2137866328, (* Fallback-language being used [Warning: 49064, 0x8092bfa8] *)
+ mpAUDIT_WRN_LANGUAGE_IGNORED := -2137866327, (* "Language" input not evaluated [Warning: 49065, 0x8092bfa9] *)
+ mpAUDIT_ERR_ARCHIVE_NOT_FOUND := -1064124502, (* Archive not found [Error: 49066, 0xc092bfaa] *)
+ mpAUDIT_ERR_ARCHIVE_WRITE := -1064124501, (* Error writing archive [Error: 49067, 0xc092bfab] *)
+ mpAUDIT_ERR_TEXT_OVERFLOW := -1064124500, (* Text too long [Error: 49068, 0xc092bfac] *)
+ mpAUDIT_ERR_BUFFER_CREATE := -1064124499, (* Could not allocate memory [Error: 49069, 0xc092bfad] *)
+ mpAUDIT_ERR_WRITE_EXPORT_FILE := -1064124498, (* Error writing export-file [Error: 49070, 0xc092bfae] *)
+ mpAUDIT_ERR_READ_BUFFER_ENTRIES := -1064124497, (* Error reading events [Error: 49071, 0xc092bfaf] *)
+ mpAUDIT_INF_ARCHIVE_NO_ENTRIES := 1083359152, (* Archive has no entries [Informational: 49072, 0x4092bfb0] *)
+ mpAUDIT_ERR_EVENT_RECORDER := -1064124495, (* Event not recorded [Error: 49073, 0xc092bfb1] *)
+ mpAUDIT_ERR_INVALID_FILE_DEV := -1064124494, (* Invalid file-device [Error: 49074, 0xc092bfb2] *)
+ mpAUDIT_ERR_MAX_ARCHIVES := -1064124493, (* Maximum number of archives reached [Error: 49075, 0xc092bfb3] *)
+ mpAUDIT_ERR_MISSING_UICONNECT := -1064124492, (* Missing value on UIConnect [Error: 49076, 0xc092bfb4] *)
+ mpAUDIT_INF_WAIT_AUDIT_FB := 1083359157, (* UI-FB is waiting for MpAuditTrail to get active [Informational: 49077, 0x4092bfb5] *)
+ mpAUDIT_ERR_READ_VC_EVENTS := -1064124490, (* Could not read VC4-event errors [Error: 49078, 0xc092bfb6] *)
+ mpAUDIT_WRN_OPC_AUDIT_DISABLED := -2137866313, (*Opc Auditing is disabled [Error: 49079, 0x8092bfb7]*)
+ mpAUDIT_ERR_MONITOR_PV := -1064124488, (*PV to monitor not found [Error: 49080, 0xc092bfb8]*)
+ mpAUDIT_ERR_NO_BATCHID := -1064124487, (*No batch-ID given [Error: 49081, 0xc092bfb9]*)
+ mpAUDIT_ERR_MEASUREMENT_SYSTEM := -1064124486, (*Invalid measurement system given [Error: 49082, 0xc092bfba]*)
+ mpAUDIT_ERR_QUERY_NOT_FOUND := -1064124485, (*Query with given name not found [Error: 49083, 0xc092bfbb]*)
+ mpAUDIT_INF_QUERY_NO_DATA := 1083359164 (*No data for query [Error: 49084, 0x4092bfbc]*)
+ );
+END_TYPE
diff --git a/mappFramework/Logical/Libraries/MpAudit/SG4/ARM/MpAudit.br b/mappFramework/Logical/Libraries/MpAudit/SG4/ARM/MpAudit.br
new file mode 100644
index 00000000..f991205d
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpAudit/SG4/ARM/MpAudit.br differ
diff --git a/mappFramework/Logical/Libraries/MpAudit/SG4/ARM/libMpAudit.a b/mappFramework/Logical/Libraries/MpAudit/SG4/ARM/libMpAudit.a
new file mode 100644
index 00000000..1208f088
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpAudit/SG4/ARM/libMpAudit.a differ
diff --git a/mappFramework/Logical/Libraries/MpAudit/SG4/IA32/MpAudit.br b/mappFramework/Logical/Libraries/MpAudit/SG4/IA32/MpAudit.br
new file mode 100644
index 00000000..6f68d3cf
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpAudit/SG4/IA32/MpAudit.br differ
diff --git a/mappFramework/Logical/Libraries/MpAudit/SG4/IA32/libMpAudit.a b/mappFramework/Logical/Libraries/MpAudit/SG4/IA32/libMpAudit.a
new file mode 100644
index 00000000..94c59b0f
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpAudit/SG4/IA32/libMpAudit.a differ
diff --git a/mappFramework/Logical/Libraries/MpAudit/SG4/MpAudit.h b/mappFramework/Logical/Libraries/MpAudit/SG4/MpAudit.h
new file mode 100644
index 00000000..a5069b33
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/SG4/MpAudit.h
@@ -0,0 +1,555 @@
+/* Automation Studio generated header file */
+/* Do not edit ! */
+/* MpAudit 5.18.0 */
+
+#ifndef _MPAUDIT_
+#define _MPAUDIT_
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#ifndef _MpAudit_VERSION
+#define _MpAudit_VERSION 5.18.0
+#endif
+
+#include
+
+#ifndef _BUR_PUBLIC
+#define _BUR_PUBLIC
+#endif
+#ifdef _SG3
+ #include "MpBase.h"
+#endif
+
+#ifdef _SG4
+ #include "MpBase.h"
+#endif
+
+#ifdef _SGC
+ #include "MpBase.h"
+#endif
+
+
+
+/* Datatypes and datatypes of function blocks */
+typedef enum MpAuditTrailUIStatusEnum
+{ mpAUDIT_UI_STATUS_IDLE,
+ mpAUDIT_UI_STATUS_UPDATE,
+ mpAUDIT_UI_STATUS_FILTER,
+ mpAUDIT_UI_STATUS_EXPORT,
+ mpAUDIT_UI_STATUS_ERROR
+} MpAuditTrailUIStatusEnum;
+
+typedef enum MpAuditFileTypeEnum
+{ mpAUDIT_FILE_TYPE_TXT = 0,
+ mpAUDIT_FILE_TYPE_XML = 1,
+ mpAUDIT_FILE_TYPE_PDF = 2
+} MpAuditFileTypeEnum;
+
+typedef enum MpAuditArchiveModeEnum
+{ mpAUDIT_ARCHIVE_DAILY = 0,
+ mpAUDIT_ARCHIVE_MO_TO_FR = 1,
+ mpAUDIT_ARCHIVE_BATCH = 2
+} MpAuditArchiveModeEnum;
+
+typedef enum MpAuditFontTypeEnum
+{ mpAUDIT_FONT_COURIER = 0,
+ mpAUDIT_FONT_HELVETICA = 1,
+ mpAUDIT_FONT_TIMESROMAN = 2,
+ mpAUDIT_FONT_SIMSUN = 3,
+ mpAUDIT_FONT_SIMHEI = 4,
+ mpAUDIT_FONT_MINGLIU = 5,
+ mpAUDIT_FONT_MINCYO = 6,
+ mpAUDIT_FONT_GOTHIC = 7,
+ mpAUDIT_FONT_PMINCYO = 8,
+ mpAUDIT_FONT_PGOTHIC = 9,
+ mpAUDIT_FONT_DOTUMCHE = 10,
+ mpAUDIT_FONT_DOTUM = 11,
+ mpAUDIT_FONT_BATANGCHE = 12,
+ mpAUDIT_FONT_BATANG = 13
+} MpAuditFontTypeEnum;
+
+typedef enum MpAuditPageFormatEnum
+{ mpAUDIT_PAGE_FORMAT_UNDEFINED = 0,
+ mpAUDIT_PAGE_FORMAT_LETTER = 1,
+ mpAUDIT_PAGE_FORMAT_LEGAL = 2,
+ mpAUDIT_PAGE_FORMAT_A3 = 3,
+ mpAUDIT_PAGE_FORMAT_A4 = 4,
+ mpAUDIT_PAGE_FORMAT_A5 = 5,
+ mpAUDIT_PAGE_FORMAT_B4 = 6,
+ mpAUDIT_PAGE_FORMAT_B5 = 7
+} MpAuditPageFormatEnum;
+
+typedef enum MpAuditPageDirectionEnum
+{ mpAUDIT_PAGE_DIRECTION_UNDEFINED = 0,
+ mpAUDIT_PAGE_DIRECTION_PORTRAIT = 1,
+ mpAUDIT_PAGE_DIRECTION_LANDSCAPE = 2
+} MpAuditPageDirectionEnum;
+
+typedef enum MpAuditPageMarginEnum
+{ mpAUDIT_PAGE_MARGIN_NORMAL = 0,
+ mpAUDIT_PAGE_MARGIN_NARROW = 1,
+ mpAUDIT_PAGE_MARGIN_MODERATE = 2,
+ mpAUDIT_PAGE_MARGIN_WIDE = 3
+} MpAuditPageMarginEnum;
+
+typedef enum MpAuditQueryModeEnum
+{ mpAUDIT_QUERY_MODE_ALL,
+ mpAUDIT_QUERY_MODE_NEW
+} MpAuditQueryModeEnum;
+
+typedef enum MpAuditMemoryEnum
+{ mpAUDIT_MEM_TEMP = 0,
+ mpAUDIT_MEM_ROM = 1,
+ mpAUDIT_MEM_SRAM = 2,
+ mpAUDIT_MEM_BUFFERD_ROM = 3
+} MpAuditMemoryEnum;
+
+typedef enum MpAuditTextSourceEnum
+{ mpAUDIT_TEXT_SOURCE_NONE = 0,
+ mpAUDIT_TEXT_SOURCE_VC4 = 1,
+ mpAUDIT_TEXT_SOURCE_TEXTSYS = 2
+} MpAuditTextSourceEnum;
+
+typedef enum MpAuditUIMessageEnum
+{ mpAUDIT_UI_MSG_NONE = 0,
+ mpAUDIT_UI_MSG_ERROR = 1
+} MpAuditUIMessageEnum;
+
+typedef enum MpAuditErrorEnum
+{ mpAUDIT_NO_ERROR = 0,
+ mpAUDIT_ERR_ACTIVATION = -1064239103,
+ mpAUDIT_ERR_MPLINK_NULL = -1064239102,
+ mpAUDIT_ERR_MPLINK_INVALID = -1064239101,
+ mpAUDIT_ERR_MPLINK_CHANGED = -1064239100,
+ mpAUDIT_ERR_MPLINK_CORRUPT = -1064239099,
+ mpAUDIT_ERR_MPLINK_IN_USE = -1064239098,
+ mpAUDIT_ERR_CONFIG_NULL = -1064239096,
+ mpAUDIT_ERR_CONFIG_NO_PV = -1064239095,
+ mpAUDIT_ERR_CONFIG_LOAD = -1064239094,
+ mpAUDIT_WRN_CONFIG_LOAD = -2137980917,
+ mpAUDIT_ERR_CONFIG_SAVE = -1064239092,
+ mpAUDIT_ERR_CONFIG_INVALID = -1064239091,
+ mpAUDIT_ERR_TEXT_SOURCE = -1064124508,
+ mpAUDIT_ERR_TEXT_NAMESPACE = -1064124507,
+ mpAUDIT_ERR_TEXT_IDENT = -1064124506,
+ mpAUDIT_ERR_LANGUAGE = -1064124505,
+ mpAUDIT_WRN_LANGUAGE_FALLBACK = -2137866328,
+ mpAUDIT_WRN_LANGUAGE_IGNORED = -2137866327,
+ mpAUDIT_ERR_ARCHIVE_NOT_FOUND = -1064124502,
+ mpAUDIT_ERR_ARCHIVE_WRITE = -1064124501,
+ mpAUDIT_ERR_TEXT_OVERFLOW = -1064124500,
+ mpAUDIT_ERR_BUFFER_CREATE = -1064124499,
+ mpAUDIT_ERR_WRITE_EXPORT_FILE = -1064124498,
+ mpAUDIT_ERR_READ_BUFFER_ENTRIES = -1064124497,
+ mpAUDIT_INF_ARCHIVE_NO_ENTRIES = 1083359152,
+ mpAUDIT_ERR_EVENT_RECORDER = -1064124495,
+ mpAUDIT_ERR_INVALID_FILE_DEV = -1064124494,
+ mpAUDIT_ERR_MAX_ARCHIVES = -1064124493,
+ mpAUDIT_ERR_MISSING_UICONNECT = -1064124492,
+ mpAUDIT_INF_WAIT_AUDIT_FB = 1083359157,
+ mpAUDIT_ERR_READ_VC_EVENTS = -1064124490,
+ mpAUDIT_WRN_OPC_AUDIT_DISABLED = -2137866313,
+ mpAUDIT_ERR_MONITOR_PV = -1064124488,
+ mpAUDIT_ERR_NO_BATCHID = -1064124487,
+ mpAUDIT_ERR_MEASUREMENT_SYSTEM = -1064124486,
+ mpAUDIT_ERR_QUERY_NOT_FOUND = -1064124485,
+ mpAUDIT_INF_QUERY_NO_DATA = 1083359164
+} MpAuditErrorEnum;
+
+typedef enum MpAuditTrailAlarmEnum
+{ mpAUDIT_ALM_ARCHIVE_AVAILABLE = 0,
+ mpAUDIT_ALM_ARCHIVE_OVERFLOW = 1
+} MpAuditTrailAlarmEnum;
+
+typedef struct MpAuditDisplayTextSourceType
+{ plcstring FormatSource[101];
+ plcstring Format[256];
+} MpAuditDisplayTextSourceType;
+
+typedef struct MpAuditErrorMessageType
+{ plcstring TextNotFound[21];
+ plcstring SpecifierInvalid[21];
+} MpAuditErrorMessageType;
+
+typedef struct MpAuditTextSourceType
+{ enum MpAuditTextSourceEnum Type;
+ plcstring Name[51];
+ plcstring OutputFormat[256];
+ plcstring OutputFormatSource[101];
+ struct MpAuditDisplayTextSourceType Display;
+ struct MpAuditErrorMessageType ErrorMessage;
+} MpAuditTextSourceType;
+
+typedef struct MpAuditLanguageFontType
+{ plcstring Language[21];
+ enum MpAuditFontTypeEnum Font;
+} MpAuditLanguageFontType;
+
+typedef struct MpAuditPdfTitleType
+{ plcbit Enable;
+ plcstring Text[101];
+} MpAuditPdfTitleType;
+
+typedef struct MpAuditExportPdfType
+{ enum MpAuditFontTypeEnum DefaultFont;
+ enum MpAuditPageFormatEnum Format;
+ enum MpAuditPageDirectionEnum Direction;
+ enum MpAuditPageMarginEnum Margins;
+ plcstring OwnerPassword[51];
+ plcstring UserPassword[51];
+ plcbit AllowPrint;
+ plcbit AllowCopy;
+ plcbit AllowEdit;
+ plcstring Icon[101];
+ plcstring Header[101];
+ struct MpAuditPdfTitleType Title;
+ struct MpAuditLanguageFontType Fonts[5];
+} MpAuditExportPdfType;
+
+typedef struct MpAuditExportType
+{ plcstring FileNamePattern[51];
+ plcstring ArchiveNamePattern[51];
+ plcstring PassPhrase[101];
+ plcbit Encrypt;
+ plcbit RawData;
+ enum MpAuditFileTypeEnum FileType;
+ struct MpAuditExportPdfType PDF;
+} MpAuditExportType;
+
+typedef struct MpAuditTrailUICurrDTFilterType
+{ plcbit Enable;
+ plcdt DateTime;
+} MpAuditTrailUICurrDTFilterType;
+
+typedef struct MpAuditTrailUIEventFilterType
+{ plcbit Enable;
+ plcbit Exclude;
+ unsigned long Event[5];
+} MpAuditTrailUIEventFilterType;
+
+typedef struct MpAuditTrailUIOpFilterType
+{ plcbit Enable;
+ plcbit Exclude;
+ plcwstring Name[51];
+} MpAuditTrailUIOpFilterType;
+
+typedef struct MpAuditTrailUIPatternFilterType
+{ plcbit Enable;
+ plcbit Exclude;
+ plcwstring Compare[51];
+} MpAuditTrailUIPatternFilterType;
+
+typedef struct MpAuditTrailUIBatchFilterType
+{ plcbit Enable;
+ plcwstring Name[51];
+} MpAuditTrailUIBatchFilterType;
+
+typedef struct MpAuditExportFilterType
+{ struct MpAuditTrailUICurrDTFilterType From;
+ struct MpAuditTrailUICurrDTFilterType Until;
+ struct MpAuditTrailUIEventFilterType Event;
+ struct MpAuditTrailUIOpFilterType Operator;
+ struct MpAuditTrailUIPatternFilterType Pattern;
+ struct MpAuditTrailUIBatchFilterType Batch;
+} MpAuditExportFilterType;
+
+typedef struct MpAuditArchiveType
+{ plcbit Enable;
+ enum MpAuditArchiveModeEnum Mode;
+ plctod Time;
+ unsigned long MaxSize;
+} MpAuditArchiveType;
+
+typedef struct MpAuditTrailConfigType
+{ unsigned short Events[10];
+ unsigned long RecordingSize;
+ unsigned long SramBufferSize;
+ enum MpAuditMemoryEnum RecordMemory;
+ struct MpAuditTextSourceType TextSource;
+ struct MpAuditArchiveType Archive;
+ struct MpAuditExportType Export;
+} MpAuditTrailConfigType;
+
+typedef struct MpAuditTrailUISetupType
+{ unsigned short EventListSize;
+ unsigned char ScrollWindow;
+} MpAuditTrailUISetupType;
+
+typedef struct MpAuditTrailUIOutputType
+{ unsigned short EventID[20];
+ plcwstring EventText[20][101];
+ plcbit PageUp;
+ plcbit StepUp;
+ plcbit StepDown;
+ plcbit PageDown;
+ float RangeStart;
+ float RangeEnd;
+} MpAuditTrailUIOutputType;
+
+typedef struct MpAuditTrailUISetDTFilterType
+{ plcbit Enable;
+ unsigned short Year;
+ unsigned char Month;
+ unsigned char Day;
+ unsigned char Hour;
+ unsigned char Minute;
+} MpAuditTrailUISetDTFilterType;
+
+typedef struct MpAuditTrailUIFilterDialogType
+{ unsigned short LayerStatus;
+ struct MpAuditTrailUISetDTFilterType From;
+ struct MpAuditTrailUISetDTFilterType Until;
+ struct MpAuditTrailUIEventFilterType Event;
+ struct MpAuditTrailUIOpFilterType Operator;
+ plcbit Confirm;
+ plcbit Cancel;
+ struct MpAuditTrailUIPatternFilterType Pattern;
+ struct MpAuditTrailUIBatchFilterType Batch;
+} MpAuditTrailUIFilterDialogType;
+
+typedef struct MpAuditTrailUICurrentFilterType
+{ struct MpAuditTrailUICurrDTFilterType From;
+ struct MpAuditTrailUICurrDTFilterType Until;
+ struct MpAuditTrailUIEventFilterType Event;
+ struct MpAuditTrailUIOpFilterType Operator;
+ struct MpAuditTrailUIPatternFilterType Pattern;
+ struct MpAuditTrailUIBatchFilterType Batch;
+} MpAuditTrailUICurrentFilterType;
+
+typedef struct MpAuditUIFilterType
+{ plcbit ShowDialog;
+ struct MpAuditTrailUIFilterDialogType Dialog;
+ struct MpAuditTrailUICurrentFilterType Current;
+ unsigned short DefaultLayerStatus;
+} MpAuditUIFilterType;
+
+typedef struct MpAuditUIMessageBoxType
+{ unsigned short LayerStatus;
+ enum MpAuditUIMessageEnum Type;
+ unsigned short ErrorNumber;
+ signed long StatusID;
+ plcbit Confirm;
+ plcbit Cancel;
+} MpAuditUIMessageBoxType;
+
+typedef struct MpAuditTrailUIConnectType
+{ enum MpAuditTrailUIStatusEnum Status;
+ struct MpAuditTrailUIOutputType Output;
+ struct MpAuditUIFilterType Filter;
+ plcbit Export;
+ struct MpAuditUIMessageBoxType MessageBox;
+} MpAuditTrailUIConnectType;
+
+typedef struct MpAuditStatusIDType
+{ enum MpAuditErrorEnum ID;
+ MpComSeveritiesEnum Severity;
+ unsigned short Code;
+} MpAuditStatusIDType;
+
+typedef struct MpAuditDiagType
+{ struct MpAuditStatusIDType StatusID;
+} MpAuditDiagType;
+
+typedef struct MpAuditInfoType
+{ struct MpAuditDiagType Diag;
+} MpAuditInfoType;
+
+typedef struct MpAuditQueryInfoType
+{ unsigned long AvailableSpace;
+ unsigned long RowsRead;
+ plcbit HasMoreRows;
+ struct MpAuditDiagType Diag;
+} MpAuditQueryInfoType;
+
+typedef struct MpAuditTrailInfoType
+{ unsigned short NumberArchives;
+ struct MpAuditDiagType Diag;
+} MpAuditTrailInfoType;
+
+typedef struct MpAuditVC4EventInternalType
+{ unsigned long hEventSys;
+} MpAuditVC4EventInternalType;
+
+typedef struct MpAuditMonitorInternalType
+{ unsigned long Handle;
+} MpAuditMonitorInternalType;
+
+typedef struct MpAuditTrailConfig
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ struct MpAuditTrailConfigType* Configuration;
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ struct MpAuditTrailInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Load;
+ plcbit Save;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+ plcbit CommandBusy;
+ plcbit CommandDone;
+} MpAuditTrailConfig_typ;
+
+typedef struct MpAuditTrailUI
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ struct MpAuditTrailUISetupType UISetup;
+ plcstring (*Language);
+ struct MpAuditTrailUIConnectType* UIConnect;
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ struct MpAuditInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Refresh;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+} MpAuditTrailUI_typ;
+
+typedef struct MpAuditTrail
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ plcstring (*Language);
+ plcstring (*DeviceName);
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ unsigned long CurrentRecord;
+ struct MpAuditTrailInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Export;
+ plcbit ExportArchive;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+ plcbit CommandBusy;
+ plcbit CommandDone;
+ plcbit ArchiveAvailable;
+} MpAuditTrail_typ;
+
+typedef struct MpAuditVC4Event
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ unsigned short MinUserID;
+ unsigned short MaxUserID;
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ /* VAR (analog) */
+ struct MpAuditVC4EventInternalType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Localize;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+} MpAuditVC4Event_typ;
+
+typedef struct MpAuditRegPar
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ plcstring (*PVName);
+ plcstring (*Identiffier);
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ struct MpAuditTrailInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+} MpAuditRegPar_typ;
+
+typedef struct MpAuditExport
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ struct MpAuditExportFilterType* Filter;
+ unsigned long ToRecord;
+ plcstring (*Language);
+ plcstring (*DeviceName);
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ unsigned long Record;
+ struct MpAuditInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Export;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+ plcbit CommandBusy;
+ plcbit CommandDone;
+} MpAuditExport_typ;
+
+typedef struct MpAuditQuery
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ enum MpAuditQueryModeEnum Mode;
+ plcstring (*Name);
+ plcstring (*Language);
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ struct MpAuditQueryInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Execute;
+ plcbit Next;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+ plcbit CommandBusy;
+ plcbit CommandDone;
+} MpAuditQuery_typ;
+
+
+
+/* Prototyping of functions and function blocks */
+_BUR_PUBLIC void MpAuditTrailConfig(struct MpAuditTrailConfig* inst);
+_BUR_PUBLIC void MpAuditTrailUI(struct MpAuditTrailUI* inst);
+_BUR_PUBLIC void MpAuditTrail(struct MpAuditTrail* inst);
+_BUR_PUBLIC void MpAuditVC4Event(struct MpAuditVC4Event* inst);
+_BUR_PUBLIC void MpAuditRegPar(struct MpAuditRegPar* inst);
+_BUR_PUBLIC void MpAuditExport(struct MpAuditExport* inst);
+_BUR_PUBLIC void MpAuditQuery(struct MpAuditQuery* inst);
+_BUR_PUBLIC signed long MpAuditWStringChange(struct MpComIdentType* MpLink, plcwstring* Old, plcwstring* New, plcstring* Identifier);
+_BUR_PUBLIC signed long MpAuditStringChange(struct MpComIdentType* MpLink, plcstring* Old, plcstring* New, plcstring* Identifier);
+_BUR_PUBLIC signed long MpAuditCustomEvent(struct MpComIdentType* MpLink, plcwstring* Type, plcwstring* Message, plcwstring* Comment);
+_BUR_PUBLIC signed long MpAuditValueChange(struct MpComIdentType* MpLink, double Old, double New, plcstring* Identifier);
+_BUR_PUBLIC signed long MpAuditClearBuffer(struct MpComIdentType* MpLink);
+_BUR_PUBLIC signed long MpAuditStartBatch(struct MpComIdentType* MpLink, plcwstring* Name);
+
+
+#ifdef __cplusplus
+};
+#endif
+#endif /* _MPAUDIT_ */
+
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtCustom.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtCustom.tmx
new file mode 100644
index 00000000..5080e8b8
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtCustom.tmx
@@ -0,0 +1,14 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/Custom
+
+
+
+
+ Add Custom event texts here
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtDatapoints.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtDatapoints.tmx
new file mode 100644
index 00000000..9d57d162
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtDatapoints.tmx
@@ -0,0 +1,9 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/DP
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtEvent.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtEvent.tmx
new file mode 100644
index 00000000..2d643bc8
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtEvent.tmx
@@ -0,0 +1,97 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/Event
+
+
+
+
+ [%[TIME=%u%R]] [%op] [%ev$[TEXT=MpAudit/Event]]
+
+
+ [%[TIME=%u%R]] [%op] [%ev$[TEXT=MpAudit/Event]]
+
+
+
+
+ [%act$[TEXT=MpAudit/User]]
+
+
+ [%act$[TEXT=MpAudit/User]]
+
+
+
+
+ hat Wert [%dpid$[TEXT=MpAudit/DP]] von [%old] auf [%new] geändert
+
+
+ changed value of [%dpid$[TEXT=MpAudit/DP]] from [%old] to [%new]
+
+
+
+
+ hat Wert [%dpid$[TEXT=MpAudit/DP]] von [%old] auf [%new] [%unit] geändert
+
+
+ changed value of [%dpid$[TEXT=MpAudit/DP]] from [%old] to [%new] [%unit]
+
+
+
+
+ [%typ$[TEXT=MpAudit/Custom]]
+
+
+ [%typ$[TEXT=MpAudit/Custom]]
+
+
+
+
+ hat Wert [%dpid$[TEXT=MpAudit/DP]] von [%old] auf [%new] geändert
+
+
+ changed value of [%dpid$[TEXT=MpAudit/DP]] from [%old] to [%new]
+
+
+
+
+ Der Alarm [%name] hat einen neuen Status: von [%stold] zu [%stnew]
+
+
+ alarm [%name] changed state: [%stold] to [%stnew]
+
+
+
+
+ [%act$[TEXT=MpAudit/Recipe]]
+
+
+ [%act$[TEXT=MpAudit/Recipe]]
+
+
+
+
+ PackML Zustandsänderung: von [%old] zu [%new]
+
+
+ PackML State-Change: [%old] to [%new]
+
+
+
+
+ PackML Modusänderung: von [%old] zu [%new]
+
+
+ PackML Mode-Change: [%old] to [%new]
+
+
+
+
+ PackML Substatus-Änderung von [%old] zu [%new]
+
+
+ PackML Substate-Change: [%old] to [%new]
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtEventF.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtEventF.tmx
new file mode 100644
index 00000000..2c65791b
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtEventF.tmx
@@ -0,0 +1,97 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/Event
+
+
+
+
+ {&evtime[TIME=%u%R]} {&op} {=$MpAudit/SysF/Event/{&ev}}
+
+
+ {&evtime[TIME=%u%R]} {&op} {=$MpAudit/SysF/Event/{&ev}}
+
+
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+ {=$MpAudit/SysF/User/{&act}}
+
+
+
+
+ hat Wert {&dpid} von {&old} auf {&new} geändert
+
+
+ changed value of {&dpid} from {&old} to {&new}
+
+
+
+
+ hat Wert (UserID: {&dpid}) von {&old} auf {&new} geändert
+
+
+ changed value of (UserID: {&dpid}) from {&old} to {&new}
+
+
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+ {=$MpAudit/Custom/{&typ}}
+
+
+
+
+ hat Wert {=$MpAudit/DP/{&dpid}} von {&old} auf {&new} geändert
+
+
+ changed value of {=$MpAudit/DP/{&dpid}} from {&old} to {&new}
+
+
+
+
+ Alarm {&name} Status geändert: {&stold} -> {&stnew}
+
+
+ alarm {&name} changed state: {&stold} to {&stnew}
+
+
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+ {=$MpAudit/SysF/Recipe/{&act}}
+
+
+
+
+ PackML Zustandsänderung: von {&old} zu {&new}
+
+
+ PackML State-Change: {&old} to {&new}
+
+
+
+
+ PackML Modusänderung: von {&old} zu {&new}
+
+
+ PackML Mode-Change: {&old} to {&new}
+
+
+
+
+ PackML Substatus-Änderung: von {&old} zu {&new}
+
+
+ PackML Substate-Change: {&old} to {&new}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtRecipe.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtRecipe.tmx
new file mode 100644
index 00000000..72b55803
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtRecipe.tmx
@@ -0,0 +1,52 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/Recipe
+
+
+
+
+ Start Laden von Rezept [%dev]:[%file]
+
+
+ Start Loading Recipe [%dev]:[%file]
+
+
+ Bonjour tout le monde!
+
+
+
+
+ Ende Laden von Rezept
+
+
+ End Loading Recipe
+
+
+
+
+ Rezept [%dev]:[%file] gespeichert
+
+
+ Saved Recipe [%dev]:[%file]
+
+
+
+
+ Rezept [%dev]:[%old] umbenannt auf [%new]
+
+
+ Renamed Recipe [%dev]:[%old] to [%new]
+
+
+
+
+ Rezept [%dev]:[%file] gelöscht
+
+
+ Deleted Recipe [%dev]:[%file]
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtRecipeF.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtRecipeF.tmx
new file mode 100644
index 00000000..402a885c
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtRecipeF.tmx
@@ -0,0 +1,49 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/Recipe
+
+
+
+
+ Start Laden von Rezept {&dev}:{&file}
+
+
+ Start Loading Recipe {&dev}:{&file}
+
+
+
+
+ Ende Laden von Rezept
+
+
+ End Loading Recipe
+
+
+
+
+ Rezept {&dev}:{&file} gespeichert
+
+
+ Saved Recipe {&dev}:{&file}
+
+
+
+
+ Rezept {&dev}:{&old} umbenannt auf {&new}
+
+
+ Renamed Recipe {&dev}:{&old} to {&new}
+
+
+
+
+ Rezept {&dev}:{&file} gelöscht
+
+
+ Deleted Recipe {&dev}:{&file}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtUser.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtUser.tmx
new file mode 100644
index 00000000..c9f2ec0b
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtUser.tmx
@@ -0,0 +1,113 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/User
+
+
+
+
+ logged in
+
+
+ Angemeldet
+
+
+
+
+ logged out
+
+
+ Abgemeldet
+
+
+
+
+ was logged out (timeout)
+
+
+ Abgemeldet (Timeout)
+
+
+
+
+ added user [%usr]
+
+
+ Anwender [%usr] zugefügt
+
+
+
+
+ deleted user [%usr]
+
+
+ Anwender [%usr] gelöscht
+
+
+
+
+ locked user [%usr]
+
+
+ Anwender [%usr] gesperrt
+
+
+
+
+ unlocked user [%usr]
+
+
+ Anwender [%usr] entsperrt
+
+
+
+
+ got locked (incorrect password)
+
+
+ Gesperrt (inkorrektes Passwort)
+
+
+
+
+ has changed password
+
+
+ Passwort geändert
+
+
+
+
+ Incorrect name was entered
+
+
+ Falscher Name eingegeben
+
+
+
+
+ Incorrect password was entered
+
+
+ Falsches Passwort eingegeben
+
+
+
+
+ added new role [%usr]
+
+
+ Neue Rolle [%usr] zugefügt
+
+
+
+
+ deleted role [%usr]
+
+
+ Rolle [%usr] gelöscht
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpAudit/TxtUserF.tmx b/mappFramework/Logical/Libraries/MpAudit/TxtUserF.tmx
new file mode 100644
index 00000000..a0f2970c
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpAudit/TxtUserF.tmx
@@ -0,0 +1,113 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ MpAudit/SysF/User
+
+
+
+
+ Angemeldet
+
+
+ logged in
+
+
+
+
+ Abgemeldet
+
+
+ logged out
+
+
+
+
+ Abgemeldet (Timeout)
+
+
+ was logged out (timeout)
+
+
+
+
+ Anwender {&usr} zugefügt
+
+
+ added user {&usr}
+
+
+
+
+ Anwender {&usr} gelöscht
+
+
+ deleted user {&usr}
+
+
+
+
+ Anwender {&usr} gesperrt
+
+
+ locked user {&usr}
+
+
+
+
+ Anwender {&usr} entsperrt
+
+
+ unlocked user {&usr}
+
+
+
+
+ Gesperrt (inkorrektes Passwort)
+
+
+ got locked (incorrect password)
+
+
+
+
+ Passwort geändert
+
+
+ has changed password
+
+
+
+
+ Falscher Name eingegeben
+
+
+ Incorrect name was entered
+
+
+
+
+ Falsches Passwort eingegeben
+
+
+ Incorrect password was entered
+
+
+
+
+ Neue Rolle {&usr} zugefügt
+
+
+ added new role {&usr}
+
+
+
+
+ Rolle {&usr} gelöscht
+
+
+ deleted role {&usr}
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpReport/Binary.lby b/mappFramework/Logical/Libraries/MpReport/Binary.lby
new file mode 100644
index 00000000..d4ed0dfc
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpReport/Binary.lby
@@ -0,0 +1,13 @@
+
+
+
+
+ MpReport.typ
+ MpReportError.typ
+ MpReportAlarm.typ
+ MpReport.fun
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/Libraries/MpReport/MpReport.fun b/mappFramework/Logical/Libraries/MpReport/MpReport.fun
new file mode 100644
index 00000000..a8d361a5
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpReport/MpReport.fun
@@ -0,0 +1,23 @@
+
+FUNCTION_BLOCK MpReportCore (*Component provides the functionality to enerate pdf reports*) (* $GROUP=mapp Services,$CAT=PDF Report,$GROUPICON=Icon_mapp.png,$CATICON=Icon_MpReport.png *)
+ VAR_INPUT
+ MpLink : REFERENCE TO MpComIdentType; (*Connection to mapp*) (* *) (*#PAR#;*)
+ Enable : BOOL; (*Enables/Disables the function block*) (* *) (*#PAR#;*)
+ ErrorReset : BOOL; (*Resets function block errors*) (* *) (*#PAR#;*)
+ Name : REFERENCE TO STRING[50]; (*Name of Report*) (* *) (*#CMD#;*)
+ Language : REFERENCE TO STRING[20]; (*Report language*) (* *) (*#CMD#;*)
+ DeviceName : REFERENCE TO STRING[50]; (*File device (data storage medium) where the files are stored*) (* *) (*#CMD#;*)
+ Generate : BOOL; (*Create Report as PDF*) (* *) (*#CMD#;*)
+ END_VAR
+ VAR_OUTPUT
+ Active : BOOL; (*Indicates whether the function block is active*) (* *) (*#PAR#;*)
+ Error : BOOL; (*Indicates that the function block is in an error state or a command was not executed correctly *) (* *) (*#PAR#;*)
+ StatusID : DINT; (*Status information about the function block *) (* *) (*#PAR#; *)
+ CommandBusy : BOOL; (*Optional: Function block currently executing command*) (* *) (*#CMD#OPT#;*)
+ CommandDone : BOOL; (*Create report as PDF is finished*) (* *) (*#CMD#;*)
+ Info : MpReportCoreInfoType; (*Additional information about the component*) (* *) (*#CMD#; *)
+ END_VAR
+ VAR
+ Internal : {REDUND_UNREPLICABLE} MpComInternalDataType; (*Internal data*)
+ END_VAR
+END_FUNCTION_BLOCK
diff --git a/mappFramework/Logical/Libraries/MpReport/MpReport.typ b/mappFramework/Logical/Libraries/MpReport/MpReport.typ
new file mode 100644
index 00000000..f9bd1701
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpReport/MpReport.typ
@@ -0,0 +1,16 @@
+
+TYPE
+ MpReportCoreInfoType : STRUCT
+ NumberOfReports : UDINT; (*Number of created reports*)
+ GeneratedFileName : STRING[50]; (*File name of created report*)
+ Diag : MpReportDiagType; (*Diagnostic structure for the status ID*)
+ END_STRUCT;
+ MpReportDiagType : STRUCT
+ StatusID : MpReportStatusIDType; (*StatusID diagnostic structure *)
+ END_STRUCT;
+ MpReportStatusIDType : STRUCT
+ ID : MpReportErrorEnum; (*Error code for mapp component*)
+ Severity : MpComSeveritiesEnum; (*Describes the type of information supplied by the status ID (success, information, warning, error)*)
+ Code : UINT; (*Code for the status ID. This error number can be used to search for additional information in the help system*)
+ END_STRUCT;
+END_TYPE
diff --git a/mappFramework/Logical/Libraries/MpReport/MpReportAlarm.typ b/mappFramework/Logical/Libraries/MpReport/MpReportAlarm.typ
new file mode 100644
index 00000000..9277edbe
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpReport/MpReportAlarm.typ
@@ -0,0 +1,7 @@
+
+TYPE
+ MpReportCoreAlarmEnum :
+ ( (* Alarms of MpReport Core *)
+ mpREPORT_ALM_GENERATE_FAILED := 0 (* Report Generation Failed. *)
+ );
+END_TYPE
diff --git a/mappFramework/Logical/Libraries/MpReport/MpReportError.typ b/mappFramework/Logical/Libraries/MpReport/MpReportError.typ
new file mode 100644
index 00000000..6d2f0044
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpReport/MpReportError.typ
@@ -0,0 +1,19 @@
+
+TYPE
+ MpReportErrorEnum :
+ ( (* Error numbers of library MpReport *)
+ mpREPORT_NO_ERROR := 0, (* No error *)
+ mpREPORT_ERR_ACTIVATION := -1064239103, (* Could not create component [Error: 1, 0xc0910001] *)
+ mpREPORT_ERR_MPLINK_NULL := -1064239102, (* MpLink is NULL pointer [Error: 2, 0xc0910002] *)
+ mpREPORT_ERR_MPLINK_INVALID := -1064239101, (* MpLink connection not allowed [Error: 3, 0xc0910003] *)
+ mpREPORT_ERR_MPLINK_CHANGED := -1064239100, (* MpLink modified [Error: 4, 0xc0910004] *)
+ mpREPORT_ERR_MPLINK_CORRUPT := -1064239099, (* Invalid MpLink contents [Error: 5, 0xc0910005] *)
+ mpREPORT_ERR_MPLINK_IN_USE := -1064239098, (* MpLink already in use [Error: 6, 0xc0910006] *)
+ mpREPORT_ERR_CONFIG_INVALID := -1064239091, (* Invalid Configuration [Error: 13, 0xc091000d] *)
+ mpREPORT_ERR_TEXT_IDENT := -1064112128, (* Text not found in text system [Error: 61440, 0xc092f000] *)
+ mpREPORT_ERR_LANGUAGE := -1064112127, (* Language not found [Error: 61441, 0xc092f001] *)
+ mpREPORT_ERR_INVALID_FILE_DEV := -1064112126, (* Invalid file device [Error: 61442, 0xc092f002] *)
+ mpREPORT_ERR_INVALID_REPORT := -1064112125, (* Invalid report name [Error: 61443, 0xc092f003] *)
+ mpREPORT_ERR_GENERATE_REPORT := -1064112124 (* Error during report generation [Error: 61444, 0xc092f004] *)
+ );
+END_TYPE
diff --git a/mappFramework/Logical/Libraries/MpReport/SG4/ARM/MpReport.br b/mappFramework/Logical/Libraries/MpReport/SG4/ARM/MpReport.br
new file mode 100644
index 00000000..976506b8
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpReport/SG4/ARM/MpReport.br differ
diff --git a/mappFramework/Logical/Libraries/MpReport/SG4/ARM/libMpReport.a b/mappFramework/Logical/Libraries/MpReport/SG4/ARM/libMpReport.a
new file mode 100644
index 00000000..0f43dac5
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpReport/SG4/ARM/libMpReport.a differ
diff --git a/mappFramework/Logical/Libraries/MpReport/SG4/IA32/MpReport.br b/mappFramework/Logical/Libraries/MpReport/SG4/IA32/MpReport.br
new file mode 100644
index 00000000..1215f10f
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpReport/SG4/IA32/MpReport.br differ
diff --git a/mappFramework/Logical/Libraries/MpReport/SG4/IA32/libMpReport.a b/mappFramework/Logical/Libraries/MpReport/SG4/IA32/libMpReport.a
new file mode 100644
index 00000000..8ac83db9
Binary files /dev/null and b/mappFramework/Logical/Libraries/MpReport/SG4/IA32/libMpReport.a differ
diff --git a/mappFramework/Logical/Libraries/MpReport/SG4/MpReport.h b/mappFramework/Logical/Libraries/MpReport/SG4/MpReport.h
new file mode 100644
index 00000000..e8506716
--- /dev/null
+++ b/mappFramework/Logical/Libraries/MpReport/SG4/MpReport.h
@@ -0,0 +1,104 @@
+/* Automation Studio generated header file */
+/* Do not edit ! */
+/* MpReport 5.18.0 */
+
+#ifndef _MPREPORT_
+#define _MPREPORT_
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#ifndef _MpReport_VERSION
+#define _MpReport_VERSION 5.18.0
+#endif
+
+#include
+
+#ifndef _BUR_PUBLIC
+#define _BUR_PUBLIC
+#endif
+#ifdef _SG3
+ #include "MpBase.h"
+#endif
+
+#ifdef _SG4
+ #include "MpBase.h"
+#endif
+
+#ifdef _SGC
+ #include "MpBase.h"
+#endif
+
+
+
+/* Datatypes and datatypes of function blocks */
+typedef enum MpReportErrorEnum
+{ mpREPORT_NO_ERROR = 0,
+ mpREPORT_ERR_ACTIVATION = -1064239103,
+ mpREPORT_ERR_MPLINK_NULL = -1064239102,
+ mpREPORT_ERR_MPLINK_INVALID = -1064239101,
+ mpREPORT_ERR_MPLINK_CHANGED = -1064239100,
+ mpREPORT_ERR_MPLINK_CORRUPT = -1064239099,
+ mpREPORT_ERR_MPLINK_IN_USE = -1064239098,
+ mpREPORT_ERR_CONFIG_INVALID = -1064239091,
+ mpREPORT_ERR_TEXT_IDENT = -1064112128,
+ mpREPORT_ERR_LANGUAGE = -1064112127,
+ mpREPORT_ERR_INVALID_FILE_DEV = -1064112126,
+ mpREPORT_ERR_INVALID_REPORT = -1064112125,
+ mpREPORT_ERR_GENERATE_REPORT = -1064112124
+} MpReportErrorEnum;
+
+typedef enum MpReportCoreAlarmEnum
+{ mpREPORT_ALM_GENERATE_FAILED = 0
+} MpReportCoreAlarmEnum;
+
+typedef struct MpReportStatusIDType
+{ enum MpReportErrorEnum ID;
+ MpComSeveritiesEnum Severity;
+ unsigned short Code;
+} MpReportStatusIDType;
+
+typedef struct MpReportDiagType
+{ struct MpReportStatusIDType StatusID;
+} MpReportDiagType;
+
+typedef struct MpReportCoreInfoType
+{ unsigned long NumberOfReports;
+ plcstring GeneratedFileName[51];
+ struct MpReportDiagType Diag;
+} MpReportCoreInfoType;
+
+typedef struct MpReportCore
+{
+ /* VAR_INPUT (analog) */
+ struct MpComIdentType* MpLink;
+ plcstring (*Name);
+ plcstring (*Language);
+ plcstring (*DeviceName);
+ /* VAR_OUTPUT (analog) */
+ signed long StatusID;
+ struct MpReportCoreInfoType Info;
+ /* VAR (analog) */
+ struct MpComInternalDataType Internal;
+ /* VAR_INPUT (digital) */
+ plcbit Enable;
+ plcbit ErrorReset;
+ plcbit Generate;
+ /* VAR_OUTPUT (digital) */
+ plcbit Active;
+ plcbit Error;
+ plcbit CommandBusy;
+ plcbit CommandDone;
+} MpReportCore_typ;
+
+
+
+/* Prototyping of functions and function blocks */
+_BUR_PUBLIC void MpReportCore(struct MpReportCore* inst);
+
+
+#ifdef __cplusplus
+};
+#endif
+#endif /* _MPREPORT_ */
+
diff --git a/mappFramework/Logical/Libraries/Package.pkg b/mappFramework/Logical/Libraries/Package.pkg
index 2cc3a53e..86340b24 100644
--- a/mappFramework/Logical/Libraries/Package.pkg
+++ b/mappFramework/Logical/Libraries/Package.pkg
@@ -30,5 +30,7 @@
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisControlModes.st b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisControlModes.st
index 4069613b..30fc15dc 100644
--- a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisControlModes.st
+++ b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisControlModes.st
@@ -27,9 +27,11 @@ ACTION AxisManual:
MANUAL_STATE_IDLE:
IF ((AxisControl.Command.JogNegative = TRUE) OR (AxisControl.Command.JogPositive = TRUE)) THEN
ManualState := MANUAL_STATE_JOG;
- ELSIF ((AxisControl.Command.MoveAbsolute = TRUE) OR (AxisControl.Command.MoveAdditive = TRUE)) THEN
+ ELSIF ((AxisControl.Command.MoveAbsolute = TRUE) OR (AxisControl.Command.MoveAdditive = TRUE) OR (AxisControl.Command.MoveVelocity = TRUE)) THEN
MpAxisBasic_0.MoveAbsolute := AxisControl.Command.MoveAbsolute;
MpAxisBasic_0.MoveAdditive := AxisControl.Command.MoveAdditive;
+ MpAxisBasic_0.MoveVelocity := AxisControl.Command.MoveVelocity;
+ MpAlarmXControl_SpeedNotSet.Set := (MpAxisParameters.Velocity = 0);
AxisControl.Command.MoveAbsolute := FALSE;
AxisControl.Command.MoveAdditive := FALSE;
ManualState := MANUAL_STATE_MOVE;
@@ -61,6 +63,9 @@ ACTION AxisManual:
MpAxisBasic_0.MoveAdditive := FALSE;
ManualState := MANUAL_STATE_IDLE;
State := STATE_READY;
+ ELSIF (((AxisControl.Command.MoveVelocity = FALSE) AND (MpAxisBasic_0.MoveAbsolute = FALSE) AND (MpAxisBasic_0.MoveAdditive = FALSE)) OR AxisControl.Status.ErrorActive) THEN
+ MpAxisBasic_0.MoveVelocity := FALSE;
+ ManualState := MANUAL_STATE_STOPPING;
ELSIF ((AxisControl.Command.JogNegative = TRUE) OR (AxisControl.Command.JogPositive = TRUE)) THEN
MpAxisBasic_0.MoveAbsolute := FALSE;
MpAxisBasic_0.MoveAdditive := FALSE;
@@ -71,11 +76,13 @@ ACTION AxisManual:
MpAxisBasic_0.JogNegative := FALSE;
MpAxisBasic_0.JogPositive := FALSE;
MpAxisBasic_0.MoveAbsolute := FALSE;
- MpAxisBasic_0.MoveAdditive := FALSE;
+ MpAxisBasic_0.MoveAdditive := FALSE;
+ AxisControl.Command.MoveVelocity := FALSE;
MpAxisBasic_0.Stop := TRUE;
IF (MpAxisBasic_0.MoveActive = FALSE) THEN
MpAxisBasic_0.Stop := FALSE;
+ MpAxisBasic_0.MoveVelocity := FALSE;
ManualState := MANUAL_STATE_IDLE;
State := STATE_READY;
END_IF
diff --git a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.st b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.st
index ca22f7ca..1e74292c 100644
--- a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.st
+++ b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.st
@@ -19,9 +19,12 @@ PROGRAM _INIT
// Call initialization variables
RestorePosition;
+ // Initialize homing mode
+ MpAxisParameters.Homing.Mode := mcHOMING_DEFAULT;
+
// Enable mapp function blocks
- MpAlarmXCore_0.Enable := TRUE;
- MpAxisBasic_0.Enable := TRUE;
+ MpAxisBasic_0.Enable := TRUE;
+ MpAlarmXCore_0.Enable := TRUE;
END_PROGRAM
@@ -29,16 +32,16 @@ PROGRAM _CYCLIC
MpAxisBasic_0.MpLink := ADR(gMpLinkAppAxis_1);
- // Call all actions
+ // Call all actions
SimulationControl;
AxisStateMachine;
AxisCyclic;
RecipeCyclic;
-
- // Assign MpLink
- MpAlarmXCore_0.MpLink := ADR(gMpLinkAlarmXCoreAppAxis_1);
+
+ // Assign MpLink
+ MpAlarmXCore_0.MpLink := ADR(gMpLinkAlarmXCoreAppAxis_1);
- // Call function block
+ // Call function block
MpAlarmXCore_0();
END_PROGRAM
diff --git a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.typ b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.typ
index 2df95e09..e2450457 100644
--- a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.typ
+++ b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/AxisMgr.typ
@@ -18,6 +18,7 @@ TYPE
Reference : {REDUND_UNREPLICABLE} BOOL; (*Cmd home / reference*)
MoveAbsolute : {REDUND_UNREPLICABLE} BOOL; (*Cmd move absolute*)
MoveAdditive : {REDUND_UNREPLICABLE} BOOL; (*Cmd move additive*)
+ MoveVelocity : {REDUND_UNREPLICABLE} BOOL; (*Cmd move velocity*)
MoveToStart : {REDUND_UNREPLICABLE} BOOL; (*Cmd move the start position*)
Abort : {REDUND_UNREPLICABLE} BOOL; (*Cmd abort*)
Stop : {REDUND_UNREPLICABLE} BOOL; (*Cmd stop all movement*)
@@ -55,6 +56,7 @@ TYPE
MotorTemperature : {REDUND_UNREPLICABLE} REAL; (*Motor temperature*)
IsHomed : {REDUND_UNREPLICABLE} BOOL; (*Axis is referenced*)
IsPowered : {REDUND_UNREPLICABLE} BOOL; (*Axis is powered*)
+ PLCopenState : McAxisPLCopenStateEnum; (*Axis PLCopenState*)
END_STRUCT;
AxisControlType : {REDUND_UNREPLICABLE} STRUCT
Command : {REDUND_UNREPLICABLE} AxisControlCommandType; (*Cmd structure*)
diff --git a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/ManualCommand.st b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/ManualCommand.st
index 41443b4a..9c0a229f 100644
--- a/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/ManualCommand.st
+++ b/mappFramework/Logical/MachineControl/AppAxis_1/AppAxis_1/ManualCommand.st
@@ -1,6 +1,6 @@
// Returns True if a manual command is active, false otherwise
FUNCTION ManualCommand
- ManualCommand := Commands.JogNegative OR Commands.JogPositive OR Commands.MoveAbsolute OR Commands.MoveAdditive;
+ ManualCommand := Commands.JogNegative OR Commands.JogPositive OR Commands.MoveAbsolute OR Commands.MoveAdditive OR Commands.MoveVelocity;
END_FUNCTION
diff --git a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisControlModes.st b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisControlModes.st
index fcd404a7..7f7df65e 100644
--- a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisControlModes.st
+++ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisControlModes.st
@@ -25,14 +25,15 @@ ACTION AxisManual:
MANUAL_STATE_IDLE:
IF ((AxisControl.Command.JogNegative = TRUE) OR (AxisControl.Command.JogPositive = TRUE)) THEN
ManualState := MANUAL_STATE_JOG;
- ELSIF ((AxisControl.Command.MoveAbsolute = TRUE) OR (AxisControl.Command.MoveAdditive = TRUE)) THEN
+ ELSIF ((AxisControl.Command.MoveAbsolute = TRUE) OR (AxisControl.Command.MoveAdditive = TRUE) OR (AxisControl.Command.MoveVelocity = TRUE)) THEN
MpAxisBasic_0.MoveAbsolute := AxisControl.Command.MoveAbsolute;
MpAxisBasic_0.MoveAdditive := AxisControl.Command.MoveAdditive;
+ MpAxisBasic_0.MoveVelocity := AxisControl.Command.MoveVelocity;
AxisControl.Command.MoveAbsolute := FALSE;
AxisControl.Command.MoveAdditive := FALSE;
ManualState := MANUAL_STATE_MOVE;
END_IF
- // Jog state
+ // Jog state
MANUAL_STATE_JOG:
MpAxisBasic_0.JogNegative := AxisControl.Command.JogNegative;
MpAxisBasic_0.JogPositive := AxisControl.Command.JogPositive;
@@ -59,6 +60,9 @@ ACTION AxisManual:
MpAxisBasic_0.MoveAdditive := FALSE;
ManualState := MANUAL_STATE_IDLE;
State := STATE_READY;
+ ELSIF (((AxisControl.Command.MoveVelocity = FALSE) AND (MpAxisBasic_0.MoveAbsolute = FALSE) AND (MpAxisBasic_0.MoveAdditive = FALSE)) OR AxisControl.Status.ErrorActive) THEN
+ MpAxisBasic_0.MoveVelocity := FALSE;
+ ManualState := MANUAL_STATE_STOPPING;
ELSIF ((AxisControl.Command.JogNegative = TRUE) OR (AxisControl.Command.JogPositive = TRUE)) THEN
MpAxisBasic_0.MoveAbsolute := FALSE;
MpAxisBasic_0.MoveAdditive := FALSE;
@@ -69,11 +73,13 @@ ACTION AxisManual:
MpAxisBasic_0.JogNegative := FALSE;
MpAxisBasic_0.JogPositive := FALSE;
MpAxisBasic_0.MoveAbsolute := FALSE;
- MpAxisBasic_0.MoveAdditive := FALSE;
- MpAxisBasic_0.Stop := TRUE;
+ MpAxisBasic_0.MoveAdditive := FALSE;
+ AxisControl.Command.MoveVelocity := FALSE;
+ MpAxisBasic_0.Stop := TRUE;
IF (MpAxisBasic_0.MoveActive = FALSE) THEN
MpAxisBasic_0.Stop := FALSE;
+ MpAxisBasic_0.MoveVelocity := FALSE;
ManualState := MANUAL_STATE_IDLE;
State := STATE_READY;
END_IF
diff --git a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.st b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.st
index 0dd8e6fd..88dc3b9e 100644
--- a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.st
+++ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.st
@@ -16,6 +16,12 @@ PROGRAM _INIT
ParameterInit;
AxisInit;
+ // Call initialization variables
+ RestorePosition;
+
+ // Initialize homing mode
+ MpAxisParameters.Homing.Mode := mcHOMING_DEFAULT;
+
// Enable mapp function blocks
MpAlarmXCore_0.Enable := TRUE;
MpAxisBasic_0.Enable := TRUE;
@@ -25,7 +31,6 @@ END_PROGRAM
PROGRAM _CYCLIC
MpAxisBasic_0.MpLink := ADR(gAxisTemplate);
- MC_BR_CheckRestorePositionData_0.Axis := ADR(gAxisTemplate);
// Call all actions
SimulationControl;
diff --git a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.typ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.typ
index b5962895..0ac215e0 100644
--- a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.typ
+++ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.typ
@@ -53,6 +53,7 @@ TYPE
MotorTemperature : {REDUND_UNREPLICABLE} REAL; (*Motor temperature*)
IsHomed : {REDUND_UNREPLICABLE} BOOL; (*Axis is referenced*)
IsPowered : {REDUND_UNREPLICABLE} BOOL; (*Axis is powered*)
+ PLCopenState : McAxisPLCopenStateEnum; (*Axis PLCopenState*)
END_STRUCT;
AxisControlType : {REDUND_UNREPLICABLE} STRUCT
Command : {REDUND_UNREPLICABLE} AxisControlCommandType; (*Cmd structure*)
diff --git a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.var b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.var
index dc6407cd..6b5c1628 100644
--- a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.var
+++ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisMgr.var
@@ -14,7 +14,7 @@ VAR
MpRecipeRegPar_Cfg : {REDUND_UNREPLICABLE} MpRecipeRegPar; (*Register function block for configuration values*)
MpRecipeRegPar_Par : {REDUND_UNREPLICABLE} MpRecipeRegPar; (*Register function block for parameter values*)
MpAlarmXCore_0 : {REDUND_UNREPLICABLE} MpAlarmXCore; (*AlarmX Core function block*)
- MpAxisParameters : {REDUND_UNREPLICABLE} MpAxisBasicParType := (Distance:=70,Velocity:=100,Acceleration:=5000,Deceleration:=5000,Homing:=(Mode:=mcHOMING_RESTORE_POSITION),Jog:=(Velocity:=70,Acceleration:=5000,Deceleration:=5000),AutoTune:=(MaxCurrentPercent:=50,MaxDistance:=720,MaxPositionError:=5)); (*Standard MpAxis parameter structure *)
+ MpAxisParameters : {REDUND_UNREPLICABLE} MpAxisBasicParType := (Distance:=70,Velocity:=100,Acceleration:=5000,Deceleration:=5000,Jog:=(Velocity:=70,Acceleration:=5000,Deceleration:=5000),AutoTune:=(MaxCurrentPercent:=50,MaxDistance:=720,MaxPositionError:=5)); (*Standard MpAxis parameter structure *)
MpAxisBasic_0 : {REDUND_UNREPLICABLE} MpAxisBasic; (*MpAxis main function block*)
MC_BR_ProcessConfig_AX : {REDUND_UNREPLICABLE} MC_BR_ProcessConfig; (*Function block to read and write the axis configuration*)
MC_BR_ProcessConfig_ACP : {REDUND_UNREPLICABLE} MC_BR_ProcessConfig; (*Function block to read and write the ACOPOS configuration*)
@@ -22,7 +22,7 @@ VAR
InPositionEdgePos : {REDUND_UNREPLICABLE} R_TRIG; (*Detecting rising edge for InPosition*)
ReferenceEdgePos : {REDUND_UNREPLICABLE} R_TRIG; (*Detecting rising edge for Referenced*)
MC_BR_ProcessParam_AX : {REDUND_UNREPLICABLE} MC_BR_ProcessParam; (*Function block to read and write the ACOPOS parameters*)
- MpAlarmXControl_SpeedNotSet : MpAlarmXAlarmControl; (*AlarmX control function block*)
+ MpAlarmXControl_SpeedNotSet : {REDUND_UNREPLICABLE} MpAlarmXAlarmControl; (*AlarmX control function block*)
END_VAR
(*Recipe*)
VAR
diff --git a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisStateMachine.st b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisStateMachine.st
index 85496a69..6ddcc6cd 100644
--- a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisStateMachine.st
+++ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/AxisStateMachine.st
@@ -39,7 +39,7 @@ ACTION AxisStateMachine:
// Power on the axis
STATE_POWER_ON:
- AxisControl.Status.Status := 'Waiting for power on';
+ AxisControl.Status.Status := 'Waiting for power on';
IF (MpAxisBasic_0.Info.ReadyToPowerOn = TRUE) THEN
MpAxisBasic_0.Power := AxisControl.Command.Power;
END_IF
@@ -93,6 +93,7 @@ ACTION AxisStateMachine:
IF (InPositionEdgePos.Q = TRUE) THEN
AxisControl.Status.Busy := FALSE;
MpAxisBasic_0.MoveAbsolute := FALSE;
+ MpAxisParameters.Direction := mcDIR_POSITIVE;
State := STATE_READY;
END_IF
@@ -166,11 +167,13 @@ ACTION AxisStateMachine:
// In this State the module attempts to clear any outstanding errors. No hazardous motion should occur in this State.
STATE_RESETTING:
ResetAllAxisCommands;
- IF (AxisControl.Command.Reset = TRUE) THEN
+ IF (AxisControl.Command.Reset = TRUE) OR ((MpAlarmXCheckReaction(gMpLinkAlarmXCore, 'Error') = FALSE) AND EDGEPOS(MpAlarmXCore_0.PendingAlarms = 0)) THEN
AxisControl.Status.Busy := TRUE;
AxisControl.Command.Reset := FALSE;
MpAxisBasic_0.ErrorReset := TRUE;
AxisReset;
+ ManualState := MANUAL_STATE_IDLE;
+ AutomaticState := AUTOMATIC_STATE_IDLE;
ELSE
MpAxisBasic_0.ErrorReset := FALSE;
END_IF
@@ -191,11 +194,12 @@ ACTION AxisStateMachine:
// Cyclic function block calls
MpAxisBasic_0.Parameters := ADR(MpAxisParameters);
MpAxisBasic_0();
-
+
// Status assignments
- AxisControl.Status.ErrorActive := MpAxisBasic_0.Error;
+ AxisControl.Status.ErrorActive := MpAxisBasic_0.Error OR (MpAlarmXCheckReaction(gMpLinkAlarmXCore, 'Error'));
AxisControl.Status.IsHomed := MpAxisBasic_0.IsHomed;
AxisControl.Status.IsPowered := MpAxisBasic_0.PowerOn;
+ AxisControl.Status.PLCopenState := MpAxisBasic_0.Info.PLCopenState;
AxisControl.Status.Position := MpAxisBasic_0.Position;
AxisControl.Status.Velocity := MpAxisBasic_0.Velocity;
diff --git a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/ManualCommand.st b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/ManualCommand.st
index 41443b4a..d837ca5d 100644
--- a/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/ManualCommand.st
+++ b/mappFramework/Logical/MachineControl/AxisTemplate/AxisMgr/ManualCommand.st
@@ -1,6 +1,6 @@
// Returns True if a manual command is active, false otherwise
FUNCTION ManualCommand
- ManualCommand := Commands.JogNegative OR Commands.JogPositive OR Commands.MoveAbsolute OR Commands.MoveAdditive;
+ ManualCommand := Commands.JogNegative OR Commands.JogPositive OR Commands.MoveAbsolute OR Commands.MoveAdditive OR Commands.MoveVelocity;
END_FUNCTION
diff --git a/mappFramework/Logical/UnitTest/File/FileUnitTest/Set_SetupTeardown.c b/mappFramework/Logical/UnitTest/File/FileUnitTest/Set_SetupTeardown.c
index 69469291..a79e22cc 100644
--- a/mappFramework/Logical/UnitTest/File/FileUnitTest/Set_SetupTeardown.c
+++ b/mappFramework/Logical/UnitTest/File/FileUnitTest/Set_SetupTeardown.c
@@ -28,6 +28,7 @@ _SETUP_TEST(void)
HmiFile_UT.Parameters.Fifo.Enable = false;
HmiFile_UT.Parameters.Fifo.ScanInterval = 60;
+ strcpy(HmiFile_UT.Parameters.Fifo.DeviceName, "mappUserXFiles");
switch (SetupState)
{
@@ -379,6 +380,76 @@ _TEST FIFO_MaxFiles120(void)
TEST_BUSY;
}
+_TEST FIFO_MaxFolderSize_30Files(void)
+{
+ switch (TestState)
+ {
+ // Arrange
+ case 0:
+ FileCreate_UT.enable = true;
+ FileCreate_UT.pDevice = (UDINT)&"mappUserXFiles";
+ snprintf2(FileName, sizeof(FileName), "TestFile%d.txt", FileNumber);
+ FileCreate_UT.pFile = (UDINT)&FileName;
+ FileCreate(&FileCreate_UT);
+
+ TEST_BUSY_CONDITION(FileCreate_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileCreate_UT.status != 0);
+ TestState = 1;
+ break;
+
+ case 1:
+ FileWrite_UT.enable = true;
+ FileWrite_UT.ident = FileCreate_UT.ident;
+ FileWrite_UT.offset = 0;
+ FileWrite_UT.pSrc = &testData;
+ FileWrite_UT.len = sizeof(testData);
+ FileWrite(&FileWrite_UT);
+ TEST_BUSY_CONDITION(FileWrite_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileWrite_UT.status != 0);
+ TestState = 2;
+ break;
+
+ case 2:
+ FileClose_UT.enable = true;
+ FileClose_UT.ident = FileCreate_UT.ident;
+ FileClose(&FileClose_UT);
+
+ TEST_BUSY_CONDITION(FileClose_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileClose_UT.status != 0);
+
+ FileNumber++;
+ TestState = (FileNumber >= 30) ? 10 : 0;
+ break;
+
+ // Act
+ case 10:
+ HmiFile_UT.Parameters.Fifo.Enable = true;
+ strcpy(HmiFile_UT.Parameters.Fifo.DeviceName, "mappUserXFiles");
+ HmiFile_UT.Parameters.Fifo.FifoType = FILE_FIFO_SIZE_OF_FOLDER;
+ HmiFile_UT.Parameters.Fifo.MaxFolderSize = 5;
+ HmiFile_UT.Parameters.Fifo.ScanInterval = 0;
+ TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep == FILE_DELETE_WAIT);
+ TestState = 100;
+ break;
+
+ // Assert
+ case 100:
+ TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep != FILE_DELETE_WAIT);
+ HmiFile_UT.Parameters.Fifo.Enable = false;
+
+ DirInfo_UT.enable = true;
+ DirInfo_UT.pDevice = (UDINT)&"mappUserXFiles";
+ DirInfo_UT.pPath = (UDINT)&"";
+ DirInfo(&DirInfo_UT);
+ TEST_BUSY_CONDITION(DirInfo_UT.status == 65535);
+ TEST_ABORT_CONDITION(DirInfo_UT.status != 0);
+ TEST_ASSERT_EQUAL_INT(5, DirInfo_UT.filenum);
+ TEST_DONE;
+ break;
+
+ }
+ TEST_BUSY;
+}
_TEST FIFO_MaxFolderSize_60Files(void)
{
@@ -426,7 +497,7 @@ _TEST FIFO_MaxFolderSize_60Files(void)
HmiFile_UT.Parameters.Fifo.Enable = true;
strcpy(HmiFile_UT.Parameters.Fifo.DeviceName, "mappUserXFiles");
HmiFile_UT.Parameters.Fifo.FifoType = FILE_FIFO_SIZE_OF_FOLDER;
- HmiFile_UT.Parameters.Fifo.MaxFolderSize = 5 * 1024;
+ HmiFile_UT.Parameters.Fifo.MaxFolderSize = 5;
HmiFile_UT.Parameters.Fifo.ScanInterval = 0;
TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep == FILE_DELETE_WAIT);
TestState = 100;
@@ -451,7 +522,147 @@ _TEST FIFO_MaxFolderSize_60Files(void)
TEST_BUSY;
}
+_TEST FIFO_MaxFolderSize_Keep60Files(void)
+{
+ switch (TestState)
+ {
+ // Arrange
+ case 0:
+ FileCreate_UT.enable = true;
+ FileCreate_UT.pDevice = (UDINT)&"mappUserXFiles";
+ snprintf2(FileName, sizeof(FileName), "TestFile%d.txt", FileNumber);
+ FileCreate_UT.pFile = (UDINT)&FileName;
+ FileCreate(&FileCreate_UT);
+
+ TEST_BUSY_CONDITION(FileCreate_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileCreate_UT.status != 0);
+ TestState = 1;
+ break;
+
+ case 1:
+ FileWrite_UT.enable = true;
+ FileWrite_UT.ident = FileCreate_UT.ident;
+ FileWrite_UT.offset = 0;
+ FileWrite_UT.pSrc = &testData;
+ FileWrite_UT.len = sizeof(testData);
+ FileWrite(&FileWrite_UT);
+ TEST_BUSY_CONDITION(FileWrite_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileWrite_UT.status != 0);
+ TestState = 2;
+ break;
+
+ case 2:
+ FileClose_UT.enable = true;
+ FileClose_UT.ident = FileCreate_UT.ident;
+ FileClose(&FileClose_UT);
+
+ TEST_BUSY_CONDITION(FileClose_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileClose_UT.status != 0);
+
+ FileNumber++;
+ TestState = (FileNumber >= 90) ? 10 : 0;
+ break;
+
+ // Act
+ case 10:
+ HmiFile_UT.Parameters.Fifo.Enable = true;
+ strcpy(HmiFile_UT.Parameters.Fifo.DeviceName, "mappUserXFiles");
+ HmiFile_UT.Parameters.Fifo.FifoType = FILE_FIFO_SIZE_OF_FOLDER;
+ HmiFile_UT.Parameters.Fifo.MaxFolderSize = 60;
+ HmiFile_UT.Parameters.Fifo.ScanInterval = 0;
+ TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep == FILE_DELETE_WAIT);
+ TestState = 100;
+ break;
+
+ // Assert
+ case 100:
+ TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep != FILE_DELETE_WAIT);
+ HmiFile_UT.Parameters.Fifo.Enable = false;
+
+ DirInfo_UT.enable = true;
+ DirInfo_UT.pDevice = (UDINT)&"mappUserXFiles";
+ DirInfo_UT.pPath = (UDINT)&"";
+ DirInfo(&DirInfo_UT);
+ TEST_BUSY_CONDITION(DirInfo_UT.status == 65535);
+ TEST_ABORT_CONDITION(DirInfo_UT.status != 0);
+ TEST_ASSERT_EQUAL_INT(60, DirInfo_UT.filenum);
+ TEST_DONE;
+ break;
+
+ }
+ TEST_BUSY;
+}
+
+_TEST FIFO_MaxFolderSize_Keep120Files(void)
+{
+ switch (TestState)
+ {
+ // Arrange
+ case 0:
+ FileCreate_UT.enable = true;
+ FileCreate_UT.pDevice = (UDINT)&"mappUserXFiles";
+ snprintf2(FileName, sizeof(FileName), "TestFile%d.txt", FileNumber);
+ FileCreate_UT.pFile = (UDINT)&FileName;
+ FileCreate(&FileCreate_UT);
+
+ TEST_BUSY_CONDITION(FileCreate_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileCreate_UT.status != 0);
+ TestState = 1;
+ break;
+
+ case 1:
+ FileWrite_UT.enable = true;
+ FileWrite_UT.ident = FileCreate_UT.ident;
+ FileWrite_UT.offset = 0;
+ FileWrite_UT.pSrc = &testData;
+ FileWrite_UT.len = sizeof(testData);
+ FileWrite(&FileWrite_UT);
+ TEST_BUSY_CONDITION(FileWrite_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileWrite_UT.status != 0);
+ TestState = 2;
+ break;
+
+ case 2:
+ FileClose_UT.enable = true;
+ FileClose_UT.ident = FileCreate_UT.ident;
+ FileClose(&FileClose_UT);
+
+ TEST_BUSY_CONDITION(FileClose_UT.status == 65535);
+ TEST_ABORT_CONDITION(FileClose_UT.status != 0);
+
+ FileNumber++;
+ TestState = (FileNumber >= 140) ? 10 : 0;
+ break;
+
+ // Act
+ case 10:
+ HmiFile_UT.Parameters.Fifo.Enable = true;
+ strcpy(HmiFile_UT.Parameters.Fifo.DeviceName, "mappUserXFiles");
+ HmiFile_UT.Parameters.Fifo.FifoType = FILE_FIFO_SIZE_OF_FOLDER;
+ HmiFile_UT.Parameters.Fifo.MaxFolderSize = 120;
+ HmiFile_UT.Parameters.Fifo.ScanInterval = 0;
+ TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep == FILE_DELETE_WAIT);
+ TestState = 100;
+ break;
+
+ // Assert
+ case 100:
+ TEST_BUSY_CONDITION(HmiFile_UT.Status.DeleteStep != FILE_DELETE_WAIT);
+ HmiFile_UT.Parameters.Fifo.Enable = false;
+ DirInfo_UT.enable = true;
+ DirInfo_UT.pDevice = (UDINT)&"mappUserXFiles";
+ DirInfo_UT.pPath = (UDINT)&"";
+ DirInfo(&DirInfo_UT);
+ TEST_BUSY_CONDITION(DirInfo_UT.status == 65535);
+ TEST_ABORT_CONDITION(DirInfo_UT.status != 0);
+ TEST_ASSERT_EQUAL_INT(120, DirInfo_UT.filenum);
+ TEST_DONE;
+ break;
+
+ }
+ TEST_BUSY;
+}
/*
B+R UnitTest: This is generated code.
Do not edit! Do not move!
@@ -466,7 +677,10 @@ UNITTEST_FIXTURES(fixtures)
new_TestFixture("FIFO_140", FIFO_140),
new_TestFixture("FIFO_MaxFiles60", FIFO_MaxFiles60),
new_TestFixture("FIFO_MaxFiles120", FIFO_MaxFiles120),
+ new_TestFixture("FIFO_MaxFolderSize_30Files", FIFO_MaxFolderSize_30Files),
new_TestFixture("FIFO_MaxFolderSize_60Files", FIFO_MaxFolderSize_60Files),
+ new_TestFixture("FIFO_MaxFolderSize_Keep60Files", FIFO_MaxFolderSize_Keep60Files),
+ new_TestFixture("FIFO_MaxFolderSize_Keep120Files", FIFO_MaxFolderSize_Keep120Files),
};
diff --git a/mappFramework/Logical/mappView/Resources/Media/BnR_Logo.ico b/mappFramework/Logical/mappView/Resources/Media/BnR_Logo.ico
new file mode 100644
index 00000000..f8c633f0
Binary files /dev/null and b/mappFramework/Logical/mappView/Resources/Media/BnR_Logo.ico differ
diff --git a/mappFramework/Logical/mappView/Resources/Media/BnR_Logo.svg b/mappFramework/Logical/mappView/Resources/Media/BnR_Logo.svg
new file mode 100644
index 00000000..46bc566d
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/BnR_Logo.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/Package.pkg b/mappFramework/Logical/mappView/Resources/Media/Package.pkg
index 59099c8b..829eaee8 100644
--- a/mappFramework/Logical/mappView/Resources/Media/Package.pkg
+++ b/mappFramework/Logical/mappView/Resources/Media/Package.pkg
@@ -6,5 +6,7 @@
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Export.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Export.svg
new file mode 100644
index 00000000..4f012499
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Export.svg
@@ -0,0 +1,77 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/ExportArchive.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/ExportArchive.svg
new file mode 100644
index 00000000..673bb526
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/ExportArchive.svg
@@ -0,0 +1,86 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Package.pkg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Package.pkg
index 8efb0e06..460cf8dd 100644
--- a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Package.pkg
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/Edit/Package.pkg
@@ -9,6 +9,8 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Empty.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Empty.svg
new file mode 100644
index 00000000..2921ec8e
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Empty.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/FileScan.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/FileScan.svg
new file mode 100644
index 00000000..c7c9d9b4
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/FileScan.svg
@@ -0,0 +1,45 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/PDF.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/PDF.svg
new file mode 100644
index 00000000..3ad31f39
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/PDF.svg
@@ -0,0 +1,54 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Package.pkg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Package.pkg
index 7981772e..916603d9 100644
--- a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Package.pkg
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/Package.pkg
@@ -10,5 +10,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/TXT.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/TXT.svg
new file mode 100644
index 00000000..7c0a21f7
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/TXT.svg
@@ -0,0 +1,54 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/XML.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/XML.svg
new file mode 100644
index 00000000..27ac1139
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/File/XML.svg
@@ -0,0 +1,54 @@
+
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/EditUser.svg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/EditUser.svg
index e07c4b99..3cde603a 100644
--- a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/EditUser.svg
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/EditUser.svg
@@ -1,59 +1,19 @@
-
+
-
-
\ No newline at end of file
+
diff --git a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/Package.pkg b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/Package.pkg
index 1fbdf475..ecf6a2df 100644
--- a/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/Package.pkg
+++ b/mappFramework/Logical/mappView/Resources/Media/SymbolLib/User/Package.pkg
@@ -1,5 +1,5 @@
-
+
diff --git a/mappFramework/Logical/mappView/Resources/Texts/Package.pkg b/mappFramework/Logical/mappView/Resources/Texts/Package.pkg
index a88fa8d8..023e80c0 100644
--- a/mappFramework/Logical/mappView/Resources/Texts/Package.pkg
+++ b/mappFramework/Logical/mappView/Resources/Texts/Package.pkg
@@ -1,7 +1,8 @@
-
-
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/mappView/Resources/Texts/SystemDialog.tmx b/mappFramework/Logical/mappView/Resources/Texts/SystemDialog.tmx
new file mode 100644
index 00000000..ae9be802
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Texts/SystemDialog.tmx
@@ -0,0 +1,225 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ IAT/System/Dialog
+
+
+
+
+ Benutzer
+
+
+ Username
+
+
+
+
+ altes Passwort
+
+
+ Old Password
+
+
+
+
+ neues Passwort
+
+
+ New Password
+
+
+
+
+ Passwort wiederholen
+
+
+ Confirm Password
+
+
+
+
+ Passwort ändern
+
+
+ Change Password
+
+
+
+
+ Abbruch
+
+
+ Cancel
+
+
+
+
+ OK
+
+
+ OK
+
+
+
+
+ Passwort ändern
+
+
+ Change password
+
+
+
+
+ Passwort ändern für {1}
+
+
+ Change password for {1}
+
+
+
+
+ Passwortänderung erfolgreich!
+
+
+ Password changed successfully!
+
+
+
+
+ Passwortänderung fehlgeschlagen!
+
+
+ Password change failed!
+
+
+
+
+ Anmeldedaten (Benutzer und/oder altes Passwort) nicht korrekt.
+
+
+ Invalid credentials (username and/or old password).
+
+
+
+
+ Passwort entspricht nicht den Kriterien.
+
+
+ Password does not meet the password policies.
+
+
+
+
+ Passwortänderung nicht möglich. Verwenden Sie mpUserX anstatt RBAC zur Authentifizierung.
+
+
+ Password change not possible. Use mpUserX instead of RBAC for authentication.
+
+
+
+
+ Zeitüberschreitung.
+
+
+ Timeout.
+
+
+
+
+ Ein unbekannter Fehler ist aufgetreten.
+
+
+ An unknown error has occurred.
+
+
+
+
+ Benutzer darf nicht leer sein.
+
+
+ Username must not be empty.
+
+
+
+
+ Altes Passwort darf nicht leer sein.
+
+
+ Old password must not be empty.
+
+
+
+
+ Neues Passwort darf nicht leer sein.
+
+
+ New password must not be empty.
+
+
+
+
+ Neues Passwort muss sich vom alten Passwort unterscheiden.
+
+
+ New password must be different from the old password.
+
+
+
+
+ Passwortwiederholung stimmt nicht dem neuen Passwort überein.
+
+
+ Password confirmation does not match the new password.
+
+
+
+
+ Dialog wird in {1} Sekunden geschlossen.
+
+
+ Dialog will be closed in {1} seconds.
+
+
+
+
+ Das Passwort muss enthalten
+
+
+ Your password must have
+
+
+
+
+ Mindestens einen Buchstaben und eine Zahl
+
+
+ Alphanumeric and numeric characters
+
+
+
+
+ Groß- und Kleinbuchstaben
+
+
+ Upper and lowercase characters
+
+
+
+
+ {1} oder mehr Zeichen
+
+
+ {1} or more characters
+
+
+
+
+ Mindestens ein Sonderzeichen (z.B. %$ö)
+
+
+ At least one special character (e.g. $%ö)
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/AuditPageTexts.tmx b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/AuditPageTexts.tmx
new file mode 100644
index 00000000..c1feabf6
--- /dev/null
+++ b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/AuditPageTexts.tmx
@@ -0,0 +1,295 @@
+
+
+
+ Change the namespace to define where this text module should be located within the logical structure of your texts
+ IAT/Audit
+
+
+
+
+ Zeitstempel
+
+
+ 时间戳
+
+
+ Timestamp
+
+
+
+
+ Typ - Message - Komment
+
+
+ 类型 - 消息 - 评论
+
+
+ Type - Message - Comment
+
+
+
+
+ Eintrag
+
+
+ 信息
+
+
+ Message
+
+
+
+
+ Anwender
+
+
+ 操作员
+
+
+ Operator
+
+
+
+
+ Exportieren
+
+
+ 出口
+
+
+ Export
+
+
+
+
+ Sortieren
+
+
+ 种类
+
+
+ Sort
+
+
+
+
+ Filtern
+
+
+ 筛选
+
+
+ Filter
+
+
+
+
+ Export Archiv
+
+
+ 导出存档
+
+
+ Export Archive
+
+
+
+
+ Audit Trail
+
+
+ 审计追踪
+
+
+ Audit Trail
+
+
+
+
+ Benutzerdefinierte Ereignisse
+
+
+ 自定义事件
+
+
+ Custom Events
+
+
+
+
+ Anfrage
+
+
+ 询问
+
+
+ Query
+
+
+
+
+ Anfrage starten
+
+
+ 运行查询
+
+
+ Run Query
+
+
+
+
+ Archiv Anzahl
+
+
+ 档案数量
+
+
+ Number of Archives
+
+
+
+
+ Archiv Einstellungen
+
+
+ 存档设置
+
+
+ Archive Setup
+
+
+
+
+ Automatisches Archiv einrichten
+
+
+ 设置自动存档
+
+
+ Set up automatic archiving
+
+
+
+
+ Abrechen
+
+
+ 取消
+
+
+ Cancel
+
+
+
+
+ Speichern
+
+
+ 存储
+
+
+ Save
+
+
+
+
+ Mo-Fr
+
+
+ Mo-Fr
+
+
+ Mo-Fr
+
+
+
+
+ Bei Batch
+
+
+ 按批次
+
+
+ By Batch
+
+
+
+
+ Täglich
+
+
+ 每日
+
+
+ Daily
+
+
+
+
+ :
+
+
+ :
+
+
+ :
+
+
+
+
+ Tageszeit (24 Std.)
+
+
+ 一天中的时间(24 小时)
+
+
+ Time of day (24 hr)
+
+
+
+
+ Intervall
+
+
+ 间隔
+
+
+ Interval
+
+
+
+
+ Maximale Dateigrösse (Kb)
+
+
+ 最大文件大小
+
+
+ Max file size (Kb)
+
+
+
+
+ Einschalten
+
+
+ 使能够
+
+
+ Enable
+
+
+
+
+ Export Format
+
+
+ 导出格式
+
+
+ Export Format
+
+
+
+
\ No newline at end of file
diff --git a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/BackupTexts.tmx b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/BackupTexts.tmx
index 0f4f783e..4992f146 100644
--- a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/BackupTexts.tmx
+++ b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/BackupTexts.tmx
@@ -5,15 +5,26 @@
IAT/Backup
-
+
- Aktivieren Sie die automatische Sicherung
+ Installieren
- 使能自动备份
+ 申请
- Enable Automatic Backup
+ Apply
+
+
+
+
+ Einstellungen
+
+
+ 设置
+
+
+ Settings
@@ -41,37 +52,70 @@
Backups
-
+
- Zeitstempel
+ Abrechen
- 时间戳
+ 取消
- Time Stamp
+ Cancel
-
+
- Größe
+ Möchten Sie die ausgewählte Sicherung wirklich wiederherstellen?
- 大小
+ 确定要还原所选备份?
- Size
+ Are you sure you want to restore selected backup?
-
+
- Fehler zuruecksetzen
+ Konfigurations-ID
- 错误复位
+ Configuration ID
- Error Reset
+ Configuration ID
+
+
+
+
+ Möchten Sie die ausgewählte Sicherung wirklich löschen?
+
+
+ 确定要删除所选备份?
+
+
+ Are you sure you want to delete selected backup?
+
+
+
+
+ Von USB kopieren
+
+
+ 从USB拷贝
+
+
+ Copy from USB
+
+
+
+
+ Auf USB kopieren
+
+
+ 拷贝至USB
+
+
+ Copy to USB
@@ -85,31 +129,37 @@
Create
-
+
- Wiederherstellen
+ Backup wird erstellt, bitte warten!
- 还原
+ 正在创建备份中,请等待!
- Restore
+ Creating the backup is in progress, please wait!
-
+
- Seite nach oben
+ Täglich
+
+
+ 每日
- Page Down
+ Daily
-
+
- Seite nach unten
+ dd-MM-yy hh:mm
+
+
+ MM-dd-yy hh:mm
- Page Up
+ MM-dd-yy hh:mm
@@ -123,114 +173,111 @@
Delete
-
+
- Auf USB kopieren
+ Geräte
- 拷贝至USB
+ 设备
- Copy to USB
+ Devices
-
+
- Von USB kopieren
-
-
- 从USB拷贝
+ Details der ausgewählten Sicherung
- Copy from USB
+ Selected backup details
-
+
- Abrechen
+ Neue Sicherung erstellen
- 取消
+ 创建一个新的备份
- Cancel
+ Create new backup
-
+
- Name
+ Vorhandene Backup löschen
- 名称
+ 删除存在的备份
- Name
+ Delete existing backup
-
+
- Konfigurations-ID
+ Vorherige Backup wiederherstellen
- Configuration ID
+ 还原以前的备份
- Configuration ID
+ Restore previous backup
-
+
- Ausführung
+ Automatisches Backup einrichten
- 版本
+ 设置自动备份
- Version
+ Set up automatic backup
-
+
- Möchten Sie die ausgewählte Sicherung wirklich löschen?
+ Aktivieren Sie die automatische Sicherung
- 确定要删除所选备份?
+ 使能自动备份
- Are you sure you want to delete selected backup?
+ Enable Automatic Backup
-
+
- Möchten Sie die ausgewählte Sicherung wirklich wiederherstellen?
+ Fehler zuruecksetzen
- 确定要还原所选备份?
+ 错误复位
- Are you sure you want to restore selected backup?
+ Error Reset
-
+
- Neues Update verfügbar
+ Freitag
- 新的可用更新
+ 周五
- New Update Available
+ Friday
-
+
- Speichern
+ Std
- 存储
+ 小时
- Save
+ Hrs
@@ -244,26 +291,26 @@
Interval
-
+
- Täglich
+ Max Anzahl
- 每日
+ 最大备份
- Daily
+ Max Backups
-
+
- Wöchentlich
+ min
- 每周
+ 分钟
- Weekly
+ min
@@ -277,313 +324,311 @@
Monday
-
+
- Dienstag
+ Fehler auf Backup Core, bitte überprüfen Sie die folgenden Ursachen
+
+
+
+
+•Prüfen Sie, ob am Eingangsparameter „Name“ ein Backup angegeben wurde.
+
+
+
+
+•Überprüfen Sie, ob das angegebene Datenspeichergerät vorhanden ist.
+
+
+
+
+•Prüfen Sie, ob auf dem angegebenen Datenträger Schreibrechte vorhanden sind.
+
+
+
+
+•Weitere Informationen finden Sie im Logger.
- 周二
+ Backup Core错误,请检查以下原因...
- Tuesday
+
+Error on Backup Core, please check the following causes
+
+•Check whether a backup was specified on input parameter "Name".
+
+
+•Check whether the specified data storage device exists.
+
+
+•Check whether write permissions exist on the specified data storage device.
+
+
+•See the Logger for additional information.
-
+
- Mittwoch
+ Backup Fehler
- 周三
+ 备份错误
- Wednesday
+ Backup Error
-
+
- Donnerstag
+ Backup Funcktion in Simulation nicht verfuegbar
- 周四
+ 在仿真模式下备份功能不可用
- Thursday
+ Backup functionality not available in simulation.
-
+
- Freitag
+ Backup Warnung
- 周五
+ 备份警告
- Friday
+ Backup Warning
-
+
- Samstag
+ Name
- 周六
+ 名称
- Saturday
+ Name
-
+
- Sonntag
+ Neues Update verfügbar
- 周日
+ 新的可用更新
- Sunday
+ New Update Available
-
+
- Präfix
+ Älteste überschreiben
- 前缀
-
-
- Prefix
-
-
-
-
- min
+ 覆盖最早的
- min
+ Overwrite Oldest
-
+
- :
+ Seite nach oben
- :
+ 向下翻页
- :
+ Page Down
-
+
- Std
+ Seite nach unten
+
+
+ 向上翻页
- Hrs
+ Page Up
-
+
- Uhrzeit
+ :
- 时间
+ :
- Time of day
+ :
-
+
- Älteste überschreiben
+ Präfix
- 覆盖最早的
+ 前缀
- Overwrite Oldest
+ Prefix
-
+
- Einstellungen
+ Wiederherstellen
- 设置
+ 还原
- Settings
+ Restore
-
+
- Geräte
+ Wiederherstellung der Sicherung läuft, bitte warten!
- 设备
+ 正在还原备份中,请等待!
- Devices
+ Restoring the backup is in progress, please wait!
-
+
- dd-MM-yy hh:mm
+ Samstag
- MM-dd-yy hh:mm
+ 周六
- MM-dd-yy hh:mm
+ Saturday
-
+
- Backup wird erstellt, bitte warten!
+ Speichern
- 正在创建备份中,请等待!
+ 存储
- Creating the backup is in progress, please wait!
+ Save
-
+
- Wiederherstellung der Sicherung läuft, bitte warten!
+ Größe
- 正在还原备份中,请等待!
+ 大小
- Restoring the backup is in progress, please wait!
+ Size
-
+
- Max Anzahl
+ Sonntag
+
+
+ 周日
- Max Backups
+ Sunday
-
+
- Neue Sicherung erstellen
+ Donnerstag
- 创建一个新的备份
+ 周四
- Create new backup
+ Thursday
-
+
- Vorhandene Backup löschen
+ Uhrzeit
- 删除存在的备份
+ 时间
- Delete existing backup
+ Time of day
-
+
- Vorherige Backup wiederherstellen
+ Zeitstempel
- 还原以前的备份
+ 时间戳
- Restore previous backup
+ Time Stamp
-
+
- Automatisches Backup einrichten
+ Dienstag
- 设置自动备份
+ 周二
- Set up automatic backup
+ Tuesday
-
+
- Backup Funcktion in Simulation nicht verfuegbar
+ Neues Proektupdate verfügbar
- 在仿真模式下备份功能不可用
+ 新项目更新可用
- Backup functionality not available in simulation.
+ New project update available
-
+
- Backup Warnung
+ Ausführung
- 备份警告
+ 版本
- Backup Warning
+ Version
-
+
- Backup Fehler
+ Mittwoch
- 备份错误
+ 周三
- Backup Error
+ Wednesday
-
+
- Fehler auf Backup Core, bitte überprüfen Sie die folgenden Ursachen
-
-
-
-
-•Prüfen Sie, ob am Eingangsparameter „Name“ ein Backup angegeben wurde.
-
-
-
-
-•Überprüfen Sie, ob das angegebene Datenspeichergerät vorhanden ist.
-
-
-
-
-•Prüfen Sie, ob auf dem angegebenen Datenträger Schreibrechte vorhanden sind.
-
-
-
-
-•Weitere Informationen finden Sie im Logger.
+ Wöchentlich
- Backup Core错误,请检查以下原因...
+ 每周
-
-Error on Backup Core, please check the following causes
-
-•Check whether a backup was specified on input parameter "Name".
-
-
-•Check whether the specified data storage device exists.
-
-
-•Check whether write permissions exist on the specified data storage device.
-
-
-•See the Logger for additional information.
+ Weekly
diff --git a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/FileTexts.tmx b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/FileTexts.tmx
index 234a5f01..a51bb43b 100644
--- a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/FileTexts.tmx
+++ b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/FileTexts.tmx
@@ -508,6 +508,14 @@
Delete older than
+
+
+ FIFO Operation in Progress, bitte warten.
+
+
+ FIFO operation in progress, please wait.
+
+
Löschen bei maximale Ordergröße
diff --git a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/Package.pkg b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/Package.pkg
index 70cac1eb..d71d5746 100644
--- a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/Package.pkg
+++ b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/Package.pkg
@@ -1,5 +1,5 @@
-
+
@@ -9,5 +9,6 @@
+
\ No newline at end of file
diff --git a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/RecipePageTexts.tmx b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/RecipePageTexts.tmx
index 54f5cc2c..b2e16132 100644
--- a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/RecipePageTexts.tmx
+++ b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/RecipePageTexts.tmx
@@ -486,6 +486,9 @@
{@IndexTextSnippetRecipeMsgBoxType}
+
+ {@IndexTextSnippetRecipeMsgBoxType}
+
{@IndexTextSnippetRecipeMsgBoxType}
@@ -494,6 +497,9 @@
0
+
+ 0
+
0
@@ -502,6 +508,9 @@
Laden der ausgewaehlten Datei bestaetigen
+
+ 请确认加载此食谱。
+
Please confirm loading this recipe.
@@ -510,6 +519,9 @@
Speichern der ausgewaehlten Datei bestaetigen
+
+ 请确认以该名称保存此食谱。
+
Please confirm saving this recipe under this name.
@@ -519,6 +531,11 @@
Eine Datei mit demselben Namen {@NewRecipeName} existiert bereits!
Möchten Sie fortfahren und die vorhandene überschreiben?
+
+
+ 同名文件 {@NewRecipeName} 已存在!
+
+您要继续并覆盖现有的吗?
A file with the same name {@NewRecipeName} already exists!
@@ -530,6 +547,9 @@ Do you want to continue and overwrite the existing one?
Loeschen der ausgewaehlten Datei bestaetigen
+
+ 请确认删除所选配方。
+
Please confirm deleting the selected recipe.
@@ -538,6 +558,9 @@ Do you want to continue and overwrite the existing one?
Umbenennen der ausgewaehlten Datei bestaetigen
+
+ 请确认重命名所选配方。
+
Please confirm renaming the selected recipe.
@@ -546,6 +569,9 @@ Do you want to continue and overwrite the existing one?
{@NewRecipeName}
+
+ {@NewRecipeName}
+
{@NewRecipeName}
diff --git a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/UserXPageTexts.tmx b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/UserXPageTexts.tmx
index d32b9c2d..96f31ef0 100644
--- a/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/UserXPageTexts.tmx
+++ b/mappFramework/Logical/mappView/Resources/Texts/mappFrameworkTexts/UserXPageTexts.tmx
@@ -41,6 +41,17 @@
Assign Role
+
+
+ Ungültiger Benutzername / Passwort
+
+
+ 无效的用户名/密码
+
+
+ Invalid Username/Password
+
+
Stornieren
@@ -135,1151 +146,1195 @@
Edit User
-
+
- Benutzergruppe exportieren
+ Kein Fehler
- 导出用户组
+ 无错误
- Export User Group
+ No Error
-
+
- Dateiname exportieren
+ Das angegebene Passwort ist ungültig.
- 导出文件名称
+ 密码错误
- Export File Name
+ The specified password is invalid.
-
+
- Benutzer exportieren
+ Der angegebene Benutzer existiert nicht.
- 导出用户
+ 用户名错误
- Export Users
+ The specified user does not exist.
-
+
- Benutzergruppe importieren
+ Der angegebene Benutzer existiert bereits.
- 导入用户组
+ 该用户已存在
- Import User Group
+ The specified user already exists.
-
+
- Dateiliste
+ Das verwendete Anmeldetoken ist für den angegebenen Benutzer ungültig.
- 文件列表
+ 验证码错误
- File List
+ The login token being used is invalid for the specified user.
-
+
- Ausgewählte Datei:
+ Benutzer hat keine Administratorrechte.
- 选择文件:
+ 抱歉,当前用户无访问权限
- Selected File:
+ User has no administrator rights.
-
+
- Rollen importieren
+ Der Benutzer hat keine ausreichenden Zugriffsrechte für die gewünschte Operation.
- 导入角色
+ 抱歉,当前用户无访问权限
- Import Roles
+ The user has insufficient access rights for the desired operation.
-
+
- Benutzer importieren
+ Die angegebene Rolle existiert nicht.
- 导入用户
+ 用户组不存在
- Import Users
+ The specified role does not exist.
-
+
- Einstellungen
+ Das angegebene Passwort ist nicht stark genug.
- 用户设置
+ 密码安全度过低
- User settings
+ The specified password is not strong enough.
-
+
- Letzte Anmeldung
+ Dieser Benutzer ist gesperrt.
- 上次登录
+ 该用户已冻结
- Last Login
+ This user is blocked.
-
+
- Anmeldung
+ Der Benutzer muss das Passwort ändern, bevor zusätzliche Funktionen ausgeführt werden können.
- 登录
+ 完成该操作请先更改密码
- Login
-
-
- 登录
+ The user must change the password before any additional functions can be carried out.
-
+
- Ausloggen
+ Der Benutzer hat zu oft ein falsches Passwort eingegeben und wurde gesperrt.
- 退出
+ 输入错误密码次数过多,该用户已冻结
- Logout
-
-
- 退出
+ The user has entered an incorrect password too often and has been blocked.
-
+
- Neues Kennwort
+ Der angemeldete Benutzer hat keine Administratorrechte.
- 新密码
+ 当前用户无管理员权限
- New Password
+ The logged in user has no administrator rights.
-
+
- Neuer Benutzername
+ Für diese Gruppe ist bereits eine Benutzerverwaltung eingerichtet. Eine zusätzliche Instanz für diesen Funktionsbaustein ist nicht möglich.
- 新用户名称
+ 该用户组的管理项不可更改
- New User Name
-
-
- 新用户名称
+ User management is already in place for this group. An additional instance for this function block is not possible.
-
+
- Passwort
+ Es ist kein Benutzer angemeldet.
- 密码
+ 请先登录
- Password
-
-
- 密码
+ No user is logged in.
-
+
- Aktualisierung
+ Der Index für die ausgewählte Funktion überschreitet den maximalen Index; Rechte können nicht abgefragt werden (reserviert für zukünftige Verwendung).
- 刷新
+ 该功能需要管理员权限
- Refresh
-
-
- 刷新
+ The index for the selected function exceeds the maximum index; rights cannot be queried (reserved for future use).
-
+
- Rolle entfernen
+ Das neue und das alte Passwort sind gleich.
- 角色删除
+ 新密码与旧密码重复
- Remove Role
+ The new and old passwords are the same.
-
+
- Umbenennen
+ Der angegebene Benutzername existiert bereits.
- 用户重 命名
+ 该用户已存在
- Rename
-
-
- 用户重 命名
+ The specified username already exists.
-
+
- Wiederholen
+ Der ausgewählte Benutzer konnte nicht gelöscht werden. Weitere Informationen finden Sie im Logger.
- 重复一遍
+ 该用户无法删除,详情请查看Logger
- Repeat
-
-
- 重复 一 遍
+ The selected user could not be deleted. See the logger for additional information.
-
+
- Rolle
+ Das Passwort ist abgelaufen und muss geändert werden.
- 角色
+ 密码已过期,请设置新密码
- Role
+ The password is expired and must be changed.
-
+
- Rollenoptionen
+ Es wurde ein ungültiger Rollenname (NULL) angegeben.
- 角色可选
+ 无法选择该用户组
- Role Options
+ An invalid role name (NULL) was specified.
-
+
- Benutzer
+ Der angegebene Benutzer ist bereits angemeldet.
- 用户
+ 该用户已登录
- User
-
-
- 用户
+ The specified user is already logged in.
-
+
- Administrator
+ NULL wurde an "UIConnect" angehängt.
- 管理员
+ UI界面输入了无效值
- Administrator
-
-
- Administrator
-
-
- Administrator
+ NULL was appended to "UIConnect".
-
+
- Jeder
+ Es wurde ein ungültiger Benutzername (NULL) angegeben.
- 任何人
+ 用户名错误
- Everyone
-
-
- Jeder
-
-
- Everyone
+ An invalid username (NULL) was specified.
-
+
- Vollständiger Name:
+ Es wurde kein Passwort eingegeben.
- 全名:
+ 没有密码
- Full Name:
-
-
- Vollständiger Name:
-
-
- Full Name:
+ No password was entered.
-
+
- Imperial
+ Funktionsbaustein MpUserXLogin fehlt oder ist nicht richtig konfiguriert.
- 英制
+ MpUserXLogin功能块缺失或配置错误
- Imperial
+ Function block MpUserXLogin is missing or not configured correctly.
-
+
- Imperial-US
+ Das zur Bestätigung eingegebene Passwort stimmt nicht mit dem neuen Passwort überein.
- 英制-US
+ 再次输入的密码不符
- Imperial-US
+ The password entered for confirmation does not match the new password.
-
+
- Sprache
+ Das angegebene Systemrecht wurde nicht gefunden (reserviert für zukünftige Verwendung).
- 语言
+ 无法找到指定的系统权限(该权限为备用权限)
- Language
+ The specified system right was not found (reserved for future use).
-
+
- Deutsch
+ Der Import von Benutzergruppen und/oder Benutzerdaten ist fehlgeschlagen. Weitere Informationen finden Sie im Logger.
- 德语
+ 用户或用户组权限导入失败。详情请查看Logger
- German
+ The import of user groups and/or user data failed. See the logger for additional information.
-
+
- Englisch
+ Beim Laden der Importdatei ist ein Fehler aufgetreten. Weitere Informationen finden Sie im Logger.
- 英语
+ 加载导入文件出现错误。详情请查看Logger
- English
+ An error occurred while loading the import file. See the logger for additional information.
-
+
- Chinesisch
+ Beim Speichern der Exportdatei ist ein Fehler aufgetreten. Weitere Informationen finden Sie im Logger.
- 中文
+ 保存输出文件出现错误。详情请查看Logger
- Chinese
+ An error occurred while saving the export file. See the logger for additional information.
-
+
- Anmeldung
+ Der für die Rolle eingegebene Name ist zu lang (>50 Zeichen).
- 登录
+ 用户组名过长
- Login
-
-
- Anmeldung
-
-
- Login
+ The name entered for the role is too long (>50 characters).
-
+
- Instandhaltung
+ Der für den Benutzer eingegebene Name ist zu lang (>20 Zeichen).
- 维护者
+ 用户名过长
- Maintenance
-
-
- Instandhaltung
-
-
- Maintenance
+ The name entered for the user is too long (>20 characters).
-
+
- Maßeinheit
+ Das eingegebene Passwort ist zu lang (>20 Zeichen).
- 计量单位
+ 密码过长
- Measurement Unit
+ The password entered is too long (>20 characters).
-
+
- Metrisch
+ Diese Komponente kann nur aktiv werden, wenn MpUserXLogin aktiv ist.
- 公制
+ 用户系统未激活
- Metric
+ This component can only become active if MpUserXLogin is active.
-
+
- Nutzername:
+ Der eingegebene Benutzername ist zu kurz
- 用户名:
+ 用户名过短
- User Name:
-
-
- Nutzername:
-
-
- User Name:
+ The username entered is too short
-
+
- Keiner
+ Die angegebene Rolle existiert bereits.
- 无
+ 指定的用户组已存在
- None
-
-
- Keiner
-
-
- None
+ The specified role already exists.
-
+
- Operator
+ Maximale Anzahl an Signaturversuchen überschritten. Der Signaturvorgang wurde unterbrochen.
- 操作者
+ 电子签名错误次数到达上限,无法继续尝试电子签名
- Operator
-
-
- Operator
-
-
- Operator
+ Maximum number of signature attempts exceeded. The signature procedure was interrupted.
-
+
- Passwort:
+ Eine neue Signatur wurde gestartet, bevor die letzte signierte Aktion ausgeführt wurde.
- 密码:
+ 本次电子签名未完成,请勿开启新的电子签名
- Password:
-
-
- Passwort:
-
-
- Password:
+ A new signature was started before the last signed action was executed.
-
+
- Passwortbestätigung:
+ Das eingegebene Passwort wurde bereits verwendet und kann nicht erneut vergeben werden.
- 密码确认:
+ 新密码与旧密码一致,请重新输入新密码
- Password Confirm:
-
-
- Passwortbestätigung:
-
-
- Password Confirm:
+ The entered password has already been used and cannot be specified again.
-
+
- Auswahl der Benutzerrolle
+ Die importierte Datei hat ein ungültiges Format.
- 用户角色选择:
+ 导入的文件格式无效
- User Role Selection
-
-
- Auswahl der Benutzerrollen
-
-
- User Role Selection
+ The file being imported has an invalid format.
-
+
- Aufsicht
+ Benutzergruppe exportieren
- 主管
+ 导出用户组
- Supervisor
-
-
- Supervisor
-
-
- Supervisor
+ Export User Group
-
+
- Nutzerinformation
+ Dateiname exportieren
- 用户信息
+ 导出文件名称
- UserInformation
+ Export File Name
-
+
- Benutzerverwaltung
+ Benutzer exportieren
- 用户管理
+ 导出用户
- User Management
-
-
- 用户管理
+ Export Users
-
+
- Nutzername
+ Der eingegebene Dateiname existiert bereits. Möchten Sie die vorhandene Datei überschreiben?
- 用户
+ 输入的文件名已经存在。是否要覆盖现有文件?
- User Name
-
-
- 用户
+ The filename entered already exists. Would you like to overwrite the existing file?
-
+
- Kein Fehler
+ Benutzergruppe importieren
- 无错误
+ 导入用户组
- No Error
+ Import User Group
-
+
- Das angegebene Passwort ist ungültig.
+ Dateiliste
- 密码错误
+ 文件列表
- The specified password is invalid.
+ File List
-
+
- Der angegebene Benutzer existiert nicht.
+ Ausgewählte Datei:
- 用户名错误
+ 选择文件:
- The specified user does not exist.
+ Selected File:
-
+
- Der angegebene Benutzer existiert bereits.
+ Rollen importieren
- 该用户已存在
+ 导入角色
- The specified user already exists.
+ Import Roles
-
+
- Das verwendete Anmeldetoken ist für den angegebenen Benutzer ungültig.
+ Benutzer importieren
- 验证码错误
+ 导入用户
- The login token being used is invalid for the specified user.
+ Import Users
-
+
- Benutzer hat keine Administratorrechte.
+ Einstellungen
- 抱歉,当前用户无访问权限
+ 用户设置
- User has no administrator rights.
+ User settings
-
+
- Der Benutzer hat keine ausreichenden Zugriffsrechte für die gewünschte Operation.
+ Letzte Anmeldung
- 抱歉,当前用户无访问权限
+ 上次登录
- The user has insufficient access rights for the desired operation.
+ Last Login
-
+
- Die angegebene Rolle existiert nicht.
+ Anmeldung
- 用户组不存在
+ 登录
- The specified role does not exist.
+ Login
-
-
-
- Das angegebene Passwort ist nicht stark genug.
+
+ 登录
+
+
- 密码安全度过低
+ 登录成功
- The specified password is not strong enough.
+ Login Successful
-
-
+
+ 登录成功
+
+
+
- Dieser Benutzer ist gesperrt.
+ Ausloggen
- 该用户已冻结
+ 退出
- This user is blocked.
+ Logout
+
+
+ 退出
-
+
- Der Benutzer muss das Passwort ändern, bevor zusätzliche Funktionen ausgeführt werden können.
+ Bestätigen Sie die Benutzerlöschung
- 完成该操作请先更改密码
+ 确认删除该用户?
- The user must change the password before any additional functions can be carried out.
+ Confirm User Deletion
-
+
- Der Benutzer hat zu oft ein falsches Passwort eingegeben und wurde gesperrt.
+ Bestätigen Sie die Benutzersperre
- 输入错误密码次数过多,该用户已冻结
+ 确认锁定该用户?
- The user has entered an incorrect password too often and has been blocked.
+ Confirm User Locking
-
+
- Der angemeldete Benutzer hat keine Administratorrechte.
+ Bestätigen Sie das Entsperren des Benutzers
- 当前用户无管理员权限
+ 确认解锁该用户?
- The logged in user has no administrator rights.
+ Confirm User Unlocking
-
+
- Für diese Gruppe ist bereits eine Benutzerverwaltung eingerichtet. Eine zusätzliche Instanz für diesen Funktionsbaustein ist nicht möglich.
+ Bestätigen Sie die Rollenlöschung
- 该用户组的管理项不可更改
+ 确认删除该用户组?
- User management is already in place for this group. An additional instance for this function block is not possible.
+ Confirm Role Deletion
-
+
- Es ist kein Benutzer angemeldet.
+ Neues Kennwort
- 请先登录
+ 新密码
- No user is logged in.
+ New Password
-
+
- Der Index für die ausgewählte Funktion überschreitet den maximalen Index; Rechte können nicht abgefragt werden (reserviert für zukünftige Verwendung).
+ Neuer Benutzername
- 该功能需要管理员权限
+ 新用户名称
- The index for the selected function exceeds the maximum index; rights cannot be queried (reserved for future use).
+ New User Name
+
+
+ 新用户名称
-
+
- Das neue und das alte Passwort sind gleich.
+ Passwort
- 新密码与旧密码重复
+ 密码
- The new and old passwords are the same.
+ Password
+
+
+ 密码
-
+
- Der angegebene Benutzername existiert bereits.
+
- 该用户已存在
+
- The specified username already exists.
+
-
+
- Der ausgewählte Benutzer konnte nicht gelöscht werden. Weitere Informationen finden Sie im Logger.
+ Passwortlänge unzureichend
- 该用户无法删除,详情请查看Logger
+ 密码长度不足
- The selected user could not be deleted. See the logger for additional information.
+ Password length insuffiencent
-
+
- Das Passwort ist abgelaufen und muss geändert werden.
+ Alphanumerische Anforderungen nicht erfüllt
- 密码已过期,请设置新密码
+ 密码须包含字母和数字
- The password is expired and must be changed.
+ Alpha-numeric requirements not met
-
+
- Es wurde ein ungültiger Rollenname (NULL) angegeben.
+ Groß- und Kleinschreibung erforderlich
- 无法选择该用户组
+ 密码须包含大小写字母
- An invalid role name (NULL) was specified.
+ Upper and lower case characters required
-
+
- Der angegebene Benutzer ist bereits angemeldet.
+ Das Passwort muss Sonderzeichen enthalten
- 该用户已登录
+ 密码须包含特定字符
- The specified user is already logged in.
+ Password must contain special characters
-
+
- NULL wurde an "UIConnect" angehängt.
+ Bitte loggen Sie sich ein
- UI界面输入了无效值
+ 请登录
- NULL was appended to "UIConnect".
+ Please Login
-
+
- Es wurde ein ungültiger Benutzername (NULL) angegeben.
+ Aktualisierung
- 用户名错误
+ 刷新
- An invalid username (NULL) was specified.
+ Refresh
+
+
+ 刷新
-
+
- Es wurde kein Passwort eingegeben.
+ Rolle entfernen
- 没有密码
+ 角色删除
- No password was entered.
+ Remove Role
-
+
- Funktionsbaustein MpUserXLogin fehlt oder ist nicht richtig konfiguriert.
+ Umbenennen
- MpUserXLogin功能块缺失或配置错误
+ 用户重 命名
- Function block MpUserXLogin is missing or not configured correctly.
+ Rename
+
+
+ 用户重 命名
-
+
- Das zur Bestätigung eingegebene Passwort stimmt nicht mit dem neuen Passwort überein.
+ Wiederholen
- 再次输入的密码不符
+ 重复一遍
- The password entered for confirmation does not match the new password.
+ Repeat
+
+
+ 重复 一 遍
-
+
- Das angegebene Systemrecht wurde nicht gefunden (reserviert für zukünftige Verwendung).
+ Rolle
- 无法找到指定的系统权限(该权限为备用权限)
+ 角色
- The specified system right was not found (reserved for future use).
+ Role
-
+
- Der Import von Benutzergruppen und/oder Benutzerdaten ist fehlgeschlagen. Weitere Informationen finden Sie im Logger.
+ Rollenoptionen
- 用户或用户组权限导入失败。详情请查看Logger
+ 角色可选
- The import of user groups and/or user data failed. See the logger for additional information.
+ Role Options
-
+
- Beim Laden der Importdatei ist ein Fehler aufgetreten. Weitere Informationen finden Sie im Logger.
+ Benutzer
- 加载导入文件出现错误。详情请查看Logger
+ 用户
- An error occurred while loading the import file. See the logger for additional information.
+ User
+
+
+ 用户
-
+
- Beim Speichern der Exportdatei ist ein Fehler aufgetreten. Weitere Informationen finden Sie im Logger.
+ Administrator
- 保存输出文件出现错误。详情请查看Logger
+ 管理员
- An error occurred while saving the export file. See the logger for additional information.
+ Administrator
+
+
+ Administrator
+
+
+ Administrator
-
+
- Der für die Rolle eingegebene Name ist zu lang (>50 Zeichen).
+ Jeder
- 用户组名过长
+ 任何人
- The name entered for the role is too long (>50 characters).
+ Everyone
+
+
+ Jeder
+
+
+ Everyone
-
+
- Der für den Benutzer eingegebene Name ist zu lang (>20 Zeichen).
+ Vollständiger Name:
- 用户名过长
+ 全名:
- The name entered for the user is too long (>20 characters).
+ Full Name:
+
+
+ Vollständiger Name:
+
+
+ Full Name:
-
+
- Das eingegebene Passwort ist zu lang (>20 Zeichen).
+ Imperial
- 密码过长
+ 英制
- The password entered is too long (>20 characters).
+ Imperial
-
+
- Diese Komponente kann nur aktiv werden, wenn MpUserXLogin aktiv ist.
+ Imperial-US
- 用户系统未激活
+ 英制-US
- This component can only become active if MpUserXLogin is active.
+ Imperial-US
-
+
- Der eingegebene Benutzername ist zu kurz
+ Sprache
- 用户名过短
+ 语言
- The username entered is too short
+ Language
-
+
- Die angegebene Rolle existiert bereits.
+ Deutsch
- 指定的用户组已存在
+ 德语
- The specified role already exists.
+ German
-
+
- Maximale Anzahl an Signaturversuchen überschritten. Der Signaturvorgang wurde unterbrochen.
+ Englisch
- 电子签名错误次数到达上限,无法继续尝试电子签名
+ 英语
- Maximum number of signature attempts exceeded. The signature procedure was interrupted.
+ English
-
+
- Eine neue Signatur wurde gestartet, bevor die letzte signierte Aktion ausgeführt wurde.
+ Chinesisch
- 本次电子签名未完成,请勿开启新的电子签名
+ 中文
- A new signature was started before the last signed action was executed.
+ Chinese
-
+
- Das eingegebene Passwort wurde bereits verwendet und kann nicht erneut vergeben werden.
+ Anmeldung
- 新密码与旧密码一致,请重新输入新密码
+ 登录
- The entered password has already been used and cannot be specified again.
+ Login
+
+
+ Anmeldung
+
+
+ Login
-
+
- Die importierte Datei hat ein ungültiges Format.
+ Instandhaltung
- 导入的文件格式无效
+ 维护者
- The file being imported has an invalid format.
+ Maintenance
+
+
+ Instandhaltung
+
+
+ Maintenance
-
+
- Bestätigen Sie die Benutzerlöschung
+ Maßeinheit
- 确认删除该用户?
+ 计量单位
- Confirm User Deletion
+ Measurement Unit
-
+
- Bestätigen Sie die Benutzersperre
+ Metrisch
- 确认锁定该用户?
+ 公制
- Confirm User Locking
+ Metric
-
+
- Bestätigen Sie das Entsperren des Benutzers
+ Nutzername:
- 确认解锁该用户?
+ 用户名:
- Confirm User Unlocking
+ User Name:
+
+
+ Nutzername:
+
+
+ User Name:
-
+
- Bestätigen Sie die Rollenlöschung
+ Keiner
- 确认删除该用户组?
+ 无
- Confirm Role Deletion
+ None
+
+
+ Keiner
+
+
+ None
-
+
-
+ Operator
-
+ 操作者
-
+ Operator
+
+
+ Operator
+
+
+ Operator
-
+
- Passwortlänge unzureichend
+ Passwort:
- 密码长度不足
+ 密码:
- Password length insuffiencent
+ Password:
+
+
+ Passwort:
+
+
+ Password:
-
+
- Alphanumerische Anforderungen nicht erfüllt
+ Passwortbestätigung:
- 密码须包含字母和数字
+ 密码确认:
- Alpha-numeric requirements not met
+ Password Confirm:
+
+
+ Passwortbestätigung:
+
+
+ Password Confirm:
-
+
- Groß- und Kleinschreibung erforderlich
+ Auswahl der Benutzerrolle
- 密码须包含大小写字母
+ 用户角色选择:
- Upper and lower case characters required
+ User Role Selection
+
+
+ Auswahl der Benutzerrollen
+
+
+ User Role Selection
-
+
- Das Passwort muss Sonderzeichen enthalten
+ Aufsicht
- 密码须包含特定字符
+ 主管
- Password must contain special characters
+ Supervisor
+
+
+ Supervisor
+
+
+ Supervisor
+
+
+
+
+ 用户更改为:
+
+
+ User Changed To:
+
+
+ 用户更改为:
+
+
+
+
+ Nutzerinformation
+
+
+ 用户信息
+
+
+ UserInformation
+
+
+
+
+ Benutzerverwaltung
+
+
+ 用户管理
+
+
+ User Management
+
+
+ 用户管理
+
+
+
+
+ Nutzername
+
+
+ 用户
+
+
+ User Name
+
+
+ 用户