Added minimal functionality for Robot teaching

- Added minimal HMI
- Added possibility to open and close all chamber doors
This commit is contained in:
2026-01-17 09:20:39 +01:00
parent 9f058db2a3
commit 2d11c43579
2274 changed files with 912690 additions and 162 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

View File

@@ -0,0 +1,8 @@
{
"$schema": "../../../TwinCAT-HMI-Common/JsonSchemas/Language.Schema.json",
"locale": "de",
"localizedText": {
"Tooltip_LessThanMin_Text": "Der aktuelle Wert ist kleiner als das Minimum: {0}",
"Tooltip_GreaterThanMax_Text": "Der aktuelle Wert ist größer als das Maximum: {0}"
}
}

View File

@@ -0,0 +1,8 @@
{
"$schema": "../../../TwinCAT-HMI-Common/JsonSchemas/Language.Schema.json",
"locale": "en",
"localizedText": {
"Tooltip_LessThanMin_Text": "The current value is less than the minimum: {0}",
"Tooltip_GreaterThanMax_Text": "The current value is greater than the maximum: {0}"
}
}

View File

@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-04/schema",
"definitions": {
"TcHmi.Controls.Beckhoff.TcHmiTachometer": {
"$schema": "http://json-schema.org/draft-04/schema",
"type": "object",
"frameworkInstanceOf": "TcHmi.Controls.System.TcHmiControl",
"frameworkControlType": "TcHmiTachometer",
"frameworkControlNamespace": "TcHmi.Controls.Beckhoff"
},
"TcHmiTachometer": {
"$ref": "tchmi:framework#/definitions/TcHmi.Controls.Beckhoff.TcHmiTachometer"
},
"TcHmi.Controls.Beckhoff.TcHmiTachometer.LabelPosition": {
"title": "LabelPosition",
"type": "string",
"enum": ["Outside", "Inside"],
"default": "Inside"
},
"TcHmi.Controls.Beckhoff.TcHmiTachometer.GaugeAlignment": {
"title": "GaugeAlignment",
"type": "string",
"enum": ["Start", "Center", "End"],
"default": "Inside"
}
}
}

View File

@@ -0,0 +1,101 @@
/** Styles for all themes */
/* Style for the main element */
.TcHmi_Controls_Beckhoff_TcHmiTachometer {
/* Prevent overflow if the border radius is huge */
overflow: hidden;
--square-size: 300px;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template {
position: relative;
display: grid;
width: 100%;
height: 100%;
overflow: hidden;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-main-tick,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-sub-tick {
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-label {
text-anchor: middle;
dominant-baseline: central;
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-range-container path {
fill: none;
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-circle-under,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-circle-over {
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-value,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-unit {
text-anchor: middle;
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-svg {
position: relative;
height: var(--square-size);
width: var(--square-size);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-invalid-notification {
position: absolute;
width: 30px; /* is used for internal calc*/
height: 30px; /* is used for internal calc*/
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer.TcHmi_Controls_System_TcHmiControl-disabled::after {
/* hide generic highlighter which is at the wrong position */
display: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer.TcHmi_Controls_System_TcHmiControl-disabled
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template::after {
content: '';
position: absolute;
top: auto;
left: auto;
z-index: 100;
height: calc(var(--square-size));
width: calc(var(--square-size));
border-radius: calc(var(--square-size) / 2);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-legend {
display: flex;
flex-wrap: wrap; /* ensures automatic wrapping */
gap: 10px; /* spacing between items */
overflow: hidden;
justify-self: center;
align-self: start;
padding: 5px;
width: 100%;
box-sizing: border-box;
position: relative;
justify-content: center;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-legend-item {
flex: 0 1 auto; /* allows the items to shrink but not grow */
padding: 2px;
white-space: nowrap; /* prevents line breaks in the content */
display: flex;
flex-direction: row;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-legend-item-color {
height: 2px;
width: 10px;
align-self: center;
margin-right: 5px;
}

View File

@@ -0,0 +1,44 @@
<div class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template tchmi-box">
<svg
class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-svg"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
width="100%"
height="100%"
>
<circle
cx="150"
cy="150"
r="150"
class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-circle-outside"
></circle>
<g
class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-main-tick-container"
transform="translate(150, 150)"
></g>
<g
class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-sub-tick-container"
transform="translate(150, 150)"
></g>
<g class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-label-container"></g>
<g class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-range-container"></g>
<g class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle">
<line
class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle-pointer"
y1="40"
x1="40"
x2="40"
y2="30"
/>
<circle class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle-base" r="1.5" cy="40" cx="40" />
</g>
<text class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-value" x="150" y="150" dy="0.25em"></text>
<text
class="TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-unit"
x="150"
y="150"
transform="translate(0, 5)"
dy="0.8em"
></text>
</svg>
</div>

View File

@@ -0,0 +1 @@
<svg id="Inhalt" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80"><defs><style>.cls-2{fill:#fff;}</style></defs><title>icons_error_normal</title><path class="cls-2" d="M 40 49.5 C 38.7 49.5 37.6 48.5 37.5 47.1 C 37.5 45.8 38.6 44.7 40 44.7 C 41.3 44.7 42.4 45.8 42.4 47.1 C 42.4 48.4 41.3 49.5 40 49.5 Z M 41.4 41 c -0.1 0.5 -0.2 0.5 -0.6 0.5 H 39.2 c -0.4 0 -0.5 0 -0.6 -0.5 l -0.6 -11.3 c 0 -0.5 0 -0.5 0 -0.7 C 37.9 28.9 38 28.8 38.1 28.7 C 38.2 28.6 38.3 28.5 38.4 28.5 H 41.5 C 41.6 28.5 41.8 28.6 41.9 28.7 C 42 28.8 42.1 28.9 42.1 29.1 c 0 0.2 0 0.1 0 0.6 Z"/></svg>

After

Width:  |  Height:  |  Size: 580 B

View File

@@ -0,0 +1,64 @@
/** Styles for the theme: Base-Dark */
.TcHmi_Controls_Beckhoff_TcHmiTachometer {
--tchmi-background: var(--tchmi-background-color-1);
--tchmi-tick-stroke: var(--tchmi-foreground-color-1);
--tchmi-label-fill: var(--tchmi-foreground-color-1);
--tchmi-label-legend: var(--tchmi-foreground-color-1);
--tchmi-unit-color: var(--tchmi-foreground-color-1);
--tchmi-needle-base-color: var(--tchmi-highlight-color-1);
--tchmi-needle-pointer-color: var(--tchmi-highlight-color-1);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-circle-outside {
fill: var(--tchmi-background);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-main-tick,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-sub-tick {
stroke: var(--tchmi-tick-stroke);
stroke-width: 2;
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-label {
font-size: 12px;
fill: var(--tchmi-label-fill);
font-weight: bold;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-value,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-unit {
fill: var(--tchmi-unit-color);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle-pointer {
stroke: var(--tchmi-needle-pointer-color);
fill: none;
stroke-width: 2px;
stroke-linecap: round;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle-base {
fill: var(--tchmi-needle-base-color);
stroke: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-invalid-notification {
background-image: url('Images/invalid-notification.svg');
background-size: 200% 200%;
background-color: var(--tchmi-error-color);
background-position: 50% 50%;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-svg {
border-radius: 50%;
box-shadow: var(--tchmi-card-shadow);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer.TcHmi_Controls_System_TcHmiControl-disabled
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template::after {
background-color: var(--tchmi-disabled-color);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-legend-item-label {
color: var(--tchmi-label-legend);
}

View File

@@ -0,0 +1 @@
<svg id="Inhalt" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80"><defs><style>.cls-2{fill:#fff;}</style></defs><title>icons_error_normal</title><path class="cls-2" d="M 40 49.5 C 38.7 49.5 37.6 48.5 37.5 47.1 C 37.5 45.8 38.6 44.7 40 44.7 C 41.3 44.7 42.4 45.8 42.4 47.1 C 42.4 48.4 41.3 49.5 40 49.5 Z M 41.4 41 c -0.1 0.5 -0.2 0.5 -0.6 0.5 H 39.2 c -0.4 0 -0.5 0 -0.6 -0.5 l -0.6 -11.3 c 0 -0.5 0 -0.5 0 -0.7 C 37.9 28.9 38 28.8 38.1 28.7 C 38.2 28.6 38.3 28.5 38.4 28.5 H 41.5 C 41.6 28.5 41.8 28.6 41.9 28.7 C 42 28.8 42.1 28.9 42.1 29.1 c 0 0.2 0 0.1 0 0.6 Z"/></svg>

After

Width:  |  Height:  |  Size: 580 B

View File

@@ -0,0 +1,66 @@
/** Styles for the theme: Base */
.TcHmi_Controls_Beckhoff_TcHmiTachometer {
--tchmi-background: var(--tchmi-background-color-1);
--tchmi-tick-stroke: var(--tchmi-highlight-color-1);
--tchmi-label-fill: var(--tchmi-highlight-color-1);
--tchmi-label-legend: var(--tchmi-highlight-color-1);
--tchmi-unit-color: var(--tchmi-highlight-color-1);
--tchmi-needle-base-color: var(--tchmi-foreground-color-1);
--tchmi-needle-pointer-color: var(--tchmi-foreground-color-1);
overflow: visible;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-circle-outside {
fill: var(--tchmi-background);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-main-tick,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-sub-tick {
stroke: var(--tchmi-tick-stroke);
stroke-width: 2;
pointer-events: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-label {
font-size: 12px;
fill: var(--tchmi-label-fill);
font-weight: bold;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-value,
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-display-unit {
fill: var(--tchmi-unit-color);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle-pointer {
stroke: var(--tchmi-needle-pointer-color);
fill: none;
stroke-width: 2px;
stroke-linecap: round;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-needle-base {
fill: var(--tchmi-needle-base-color);
stroke: none;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-invalid-notification {
background-image: url('Images/invalid-notification.svg');
background-size: 200% 200%;
background-color: var(--tchmi-error-color);
background-position: 50% 50%;
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-svg {
border-radius: 50%;
box-shadow: var(--tchmi-card-shadow);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer.TcHmi_Controls_System_TcHmiControl-disabled
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template::after {
background-color: var(--tchmi-disabled-color);
}
.TcHmi_Controls_Beckhoff_TcHmiTachometer-template-legend-item-label {
color: var(--tchmi-label-legend);
}