This commit is contained in:
Samuele E. Locatelli
2021-02-25 18:28:24 +01:00
63 changed files with 467 additions and 304 deletions
+6
View File
@@ -21,3 +21,9 @@ Output/
*.njsproj
/ConsoleApp1
/WindowsFormsApp1
!Thermo.Active/wwwroot/thermoprophet/colored/_last.jpg
Thermo.Active/wwwroot/thermoprophet/colored/*.jpg
!Thermo.Active/wwwroot/thermoprophet/original/_last.jpg
Thermo.Active/wwwroot/thermoprophet/original/*.jpg
!Thermo.Active/wwwroot/thermoprophet/data/_last.dat
Thermo.Active/wwwroot/thermoprophet/data/*.dat
+5 -5
View File
@@ -1,7 +1,7 @@
{
"MeasPoints": [],
"CameraName": "FLIR AX5",
"CameraAddress": "",
"CameraName": "Camera Emulator",
"DestPoints": {
"Coords": [
"0, 0",
@@ -13,10 +13,10 @@
},
"OrigPoints": {
"Coords": [
"55, 214",
"49, 68",
"218, 80",
"197, 226"
"20, 501",
"16, 95",
"390, 128",
"279, 506"
],
"curr": 4
},
@@ -26,7 +26,7 @@
</softKey_procedure>
<softKey_procedure>
<active>false</active>
<active>true</active>
<category>2</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>3</plcId>
@@ -35,6 +35,7 @@
<lang langKey="it">Termoregolatori</lang>
</localizedNames>
<visible>true</visible>
<starred>true</starred>
<refCallParam>options_thermoregulator_enable</refCallParam>
<refCallLabel>options_thermoregulator_enable_button</refCallLabel>
</softKey_procedure>
@@ -101,7 +102,7 @@
<lang langKey="it">Riscaldi indietro</lang>
</localizedNames>
<visible>true</visible>
<starred>true</starred>
<starred>false</starred>
</softKey_procedure>
<softKey_procedure>
@@ -467,22 +468,44 @@
<refCallLabel>dash_setpoint_minus_button</refCallLabel>
</softKey_procedure>
<!--softKey_group>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<softKey_procedure>
<active>true</active>
<category>3</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<plcId>39</plcId>
<localizedNames>
<lang langKey="en">aaa:</lang>
<lang langKey="it">aaa</lang>
<lang langKey="en">Mould heating</lang>
<lang langKey="it">Riscaldo stampo</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="21"> B </subKey>
<subKey active="true" plcId="22"> C </subKey>
</subKeys>
<visible>true</visible>
</softKey_group-->
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>2</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<plcId>40</plcId>
<localizedNames>
<lang langKey="en">Frame X+Y</lang>
<lang langKey="it">Cornice X+Y</lang>
</localizedNames>
<visible>true</visible>
<refCallParam>dimensions_frame_setupall</refCallParam>
<refCallLabel>dimensions_frame_setupall_button</refCallLabel>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>2</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<plcId>41</plcId>
<localizedNames>
<lang langKey="en">Windowplate X+Y</lang>
<lang langKey="it">Piastrafinestra X+Y</lang>
</localizedNames>
<visible>true</visible>
<refCallParam>dimensions_plate_setupall</refCallParam>
<refCallLabel>dimensions_plate_setupall_button</refCallLabel>
</softKey_procedure>
</userSoftKeys>
@@ -229,7 +229,9 @@
<SubType>Designer</SubType>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<None Include="Config\ThermoConf.json" />
<None Include="Config\ThermoConf.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
<None Include="Recipes\testa.rcp">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+1
View File
@@ -32,6 +32,7 @@ using System.Configuration;
using Thermo.Active.Model.DTOModels.ThIO;
using Thermo.Active.Thermocamera;
public static class ThreadsFunctions
{
#region Private Fields
@@ -45,14 +45,17 @@ namespace Thermo.Active.Database.Migrations
// Main Areas
new FunctionAccessModel() { Name = "productionArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 20, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "reportArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 30, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "alarmsArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 1, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "maintenanceArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 1, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "scadaArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 1, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "usersArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 30, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "jobeditorArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 20, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "utilitiesArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 1, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "setupArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 20, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "progrpreriscArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 20, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "thermoHoodArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 30, ReadLevelMin = 1, PlcId = 0 },
new FunctionAccessModel() { Name = "modal-load-programArea", Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 20, ReadLevelMin = 1, PlcId = 0 },
// thermo functions
new FunctionAccessModel() { Name = RECIPE_MANAGER, Area = GENERAL_KEY, Enabled = true, WriteLevelMin = 1, ReadLevelMin = 1, PlcId = 0 }
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

@@ -22,10 +22,9 @@
.tab-header {
width: 70%;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 200px));
display: flex;
align-items: center;
justify-content: flex-end;
grid-column-gap: 10px;
.totp{
margin-right: 10px;
@@ -36,6 +35,7 @@
border-radius: 2px;
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
height: 48px;
width: 150px;
span {
margin: auto;
@@ -54,6 +54,8 @@
justify-self: flex-end;
font-size: 32px;
line-height: 1;
width: 150px;
margin-left: 30px;
div{
display: flex;
justify-content: center;
@@ -5463,10 +5463,9 @@ article .box .body {
.modal.processo-info header .tab-header {
width: 70%;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 200px));
display: flex;
align-items: center;
justify-content: flex-end;
grid-column-gap: 10px;
}
.modal.processo-info header .tab-header .totp {
margin-right: 10px;
@@ -5476,6 +5475,7 @@ article .box .body {
border-radius: 2px;
background-image: linear-gradient(to bottom, #f1f1f1 0%, #bbbcbc 98%);
height: 48px;
width: 150px;
}
.modal.processo-info header .tab-header button span {
margin: auto;
@@ -5491,6 +5491,8 @@ article .box .body {
justify-self: flex-end;
font-size: 32px;
line-height: 1;
width: 150px;
margin-left: 30px;
}
.modal.processo-info header .tab-header label div {
display: flex;
+1
View File
@@ -14,6 +14,7 @@ declare module Prod {
vacuumReadVal: number;
mouldEnergyOUT: number;// Generated by https://quicktype.io
isScrap: boolean;
thermoImage: string;
}
interface IProdPanel {
+1
View File
@@ -31,6 +31,7 @@
<button class="gray square close" @click="sendMessage('close')">&times;</button>
</div>
<modal-container name="modal" :class="{'blur':applyBlurNc}"></modal-container>
<modal-container container-name="modal2" :class="{'blur':applyBlurNc}"></modal-container>
<modal-nc-container name="modal-nc"></modal-nc-container>
</div>
</template>
@@ -67,7 +67,7 @@ export default class Login extends Vue {
})
}
checkIfUserIsAuthorized(): boolean {
checkIfUserIsAuthorized(): boolean {
return machineStatusActions.isAreaVisible(store, this.URLS_TO_FUNCTIONS_BINDING[this.$route.path]);
}
@@ -75,17 +75,14 @@ export default class Login extends Vue {
return machineStatusActions.isAreaVisible(store, "thermoHood");
}
URLS_TO_FUNCTIONS_BINDING = {
"/production": "production",
"/tooling": "tooling",
"/report": "report",
"/alarms": "alarms",
"/maintenance": "maintenance",
"/scada": "scada",
"/users": "users",
"/jobeditor": "job-editor",
"/utilities": "utilities"
"/setup": "setup",
"/progrprerisc": "progrprerisc",
"/modal-load-program": "modal-load-program",
}
}
@@ -6,6 +6,8 @@ import Slider from "@/app_modules_thermo/components/slider.vue";
@Component({name:"scheda",components: { slider:Slider} })
export default class Scheda extends Vue{
@Prop({})
id:string;
@Prop({})
portata:Recipe.IValue;
@Prop({})
@@ -4,7 +4,7 @@
<template v-if="portata.status.visible">
<div class="input-area">
<label>{{portata.key | localize(portata.key)}}</label>
<numeric v-model="portata" />
<numeric v-model="portata" :id="id" />
</div>
<slider v-model="portata"></slider>
</template>
@@ -27,7 +27,19 @@ export default class SVGChart extends Vue {
@Prop({ default: null })
maxY: number;
step: number = 50;
step: number = 50;
@Prop({ default: function () { return [] } })
ids: string[]
click(idx){
if(idx > this.ids.length -1 )
return
var elem = document.getElementById(this.ids[idx]);
if(elem){
elem.focus();
}
}
startXOf(barindex: number) {
return this.bars.slice(0, barindex).reduce((p, c) => c.width + p, 0);
@@ -81,6 +81,9 @@
:height="scaleY(b.height)"
:fill="b.backgroundColor"
:stroke="b.borderColor"
stroke-width="6"
@click="click(idx)"
class="pointer"
/>
<line
@@ -99,6 +102,9 @@
.chart {
overflow: hidden;
}
.pointer {
cursor: pointer;
}
.chart svg {
width: 100%;
@@ -41,6 +41,17 @@ export default class Gantt extends Vue {
return (this.$store.state as AppModel).prod.panel;
}
get prod() {
return (this.$store.state as AppModel).prod;
}
get isSection1Active() {
return this.prod.fase <= 1;
}
get isSection2Active() {
return this.prod.fase <= 2;
}
get ganttHeight() {
return (this.$refs.section1 as any).rowHeight +
@@ -18,6 +18,7 @@
:transform="`translate(0 ${Math.min(ganttOptions.stepDuration * ganttOptions.secondSize + PadY,40) })`"
>
<gantt-row
v-if="isSection1Active"
:section="1"
:blocks="blocks"
ref="section1"
@@ -31,7 +32,7 @@
<gantt-row
v-if="getRowHeight($refs.section1)"
:padding-horizontal="PadX "
:padding-vertical="getRowHeight($refs.section1) + ganttOptions.elementPadding"
:padding-vertical="(isSection1Active ?getRowHeight($refs.section1) + ganttOptions.elementPadding:0)"
:section="2"
:blocks="blocks"
:zoom-factor="zoomFactor"
@@ -46,7 +47,7 @@
:padding-horizontal="PadX "
ref="section3"
@heightChanged="updateRow"
:padding-vertical="getRowHeight($refs.section1) + getRowHeight($refs.section2) + ganttOptions.elementPadding*2"
:padding-vertical="isSection1Active?getRowHeight($refs.section1)+ganttOptions.elementPadding:0 + isSection2Active?getRowHeight($refs.section2)+ganttOptions.elementPadding:0 "
:section="3"
:blocks="blocks"
:zoom-factor="zoomFactor"
@@ -13,19 +13,19 @@ export default class AriaControstampo extends Vue {
return [
{
backgroundColor: "#fff",
borderColor: "#848484",
borderColor: "#9e9e9e",
height: this.recipe.upperplate_air_1_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_air_1_chart_setpointx.setpointHMI
},
{
backgroundColor: "#e5f3ff",
borderColor: "#848484",
borderColor: "#79a9d2",
height: this.recipe.upperplate_air_2_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_air_2_chart_setpointx.setpointHMI
},
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.upperplate_air_3_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_air_3_chart_setpointx.setpointHMI
}
@@ -36,16 +36,19 @@
class="box-500 mb-10"
:portata="recipe.upperplate_air_1_chart_setpointy"
:durata="recipe.upperplate_air_1_chart_setpointx"
id="upperplate_air_1_chart_setpointy"
></scheda>
<scheda
class="box-500 mb-10 color_2"
:portata="recipe.upperplate_air_2_chart_setpointy"
:durata="recipe.upperplate_air_2_chart_setpointx"
id="upperplate_air_2_chart_setpointy"
></scheda>
<scheda
class="box-500 mb-10 color_3"
:portata="recipe.upperplate_air_3_chart_setpointy"
:durata="recipe.upperplate_air_3_chart_setpointx"
id="upperplate_air_3_chart_setpointy"
></scheda>
</article>
<article>
@@ -54,6 +57,7 @@
:bars="bars"
:lines="lines"
:unitx="'s'"
:ids="['upperplate_air_1_chart_setpointy','upperplate_air_2_chart_setpointy','upperplate_air_3_chart_setpointy']"
:max-y="Math.max(recipe.upperplate_air_1_chart_setpointy.range.max , recipe.upperplate_air_2_chart_setpointy.range.max ,recipe.upperplate_air_3_chart_setpointy.range.max)"
:max-x="Math.max(recipe.upperplate_air_1_chart_setpointx.setpointHMI+ recipe.upperplate_air_2_chart_setpointx.setpointHMI+recipe.upperplate_air_3_chart_setpointx.setpointHMI, recipe.upperplate_air_max_time.setpointHMI)"
></svg-chart>
@@ -15,7 +15,7 @@ export default class EstrazioneControstampo extends Vue {
return [
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#9e9e9e",
height: this.recipe.upperplate_extraction_1_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_extraction_1_chart_setpointx.setpointHMI
}
@@ -36,12 +36,14 @@
class="box-500 color_3"
:portata="recipe.upperplate_extraction_1_chart_setpointy"
:durata="recipe.upperplate_extraction_1_chart_setpointx"
id="upperplate_extraction_1_chart_setpointy"
></scheda>
</article>
<article>
<svg-chart
line-bar-color="#848484"
:bars="bars"
:ids="['upperplate_extraction_1_chart_setpointy']"
:max-y="recipe.upperplate_extraction_1_chart_setpointy.range.max"
:max-x="recipe.upperplate_extraction_1_chart_setpointx.range.max"
></svg-chart>
@@ -14,20 +14,20 @@ export default class VuotoControstampo extends Vue {
get bars() {
return [
{
backgroundColor: "#fff",
borderColor: "#848484",
backgroundColor: "#ededed",
borderColor: "#9e9e9e",
height: this.recipe.upperplate_vacuum_1_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_vacuum_1_chart_setpointx.setpointHMI
},
{
backgroundColor: "#e5f3ff",
borderColor: "#848484",
borderColor: "#79a9d2",
height: this.recipe.upperplate_vacuum_2_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_vacuum_2_chart_setpointx.setpointHMI
},
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.upperplate_vacuum_3_chart_setpointy.setpointHMI,
width: this.recipe.upperplate_vacuum_3_chart_setpointx.setpointHMI
}
@@ -36,16 +36,19 @@
class="box-500 mb-10"
:portata="recipe.upperplate_vacuum_1_chart_setpointy"
:durata="recipe.upperplate_vacuum_1_chart_setpointx"
id="upperplate_vacuum_1_chart_setpointy"
></scheda>
<scheda
class="box-500 mb-10 color_2"
:portata="recipe.upperplate_vacuum_2_chart_setpointy"
:durata="recipe.upperplate_vacuum_2_chart_setpointx"
id="upperplate_vacuum_2_chart_setpointy"
></scheda>
<scheda
class="box-500 mb-10 color_3"
:portata="recipe.upperplate_vacuum_3_chart_setpointy"
:durata="recipe.upperplate_vacuum_3_chart_setpointx"
id="upperplate_vacuum_3_chart_setpointy"
></scheda>
</article>
<article>
@@ -53,6 +56,7 @@
line-bar-color="#848484"
:bars="bars"
:lines="lines"
:ids="['upperplate_vacuum_1_chart_setpointy','upperplate_vacuum_2_chart_setpointy','upperplate_vacuum_3_chart_setpointy']"
:max-y="Math.max(recipe.upperplate_vacuum_1_chart_setpointy.range.max, recipe.upperplate_vacuum_2_chart_setpointy.range.max,recipe.upperplate_vacuum_3_chart_setpointy.range.max)"
:max-x="Math.max(recipe.upperplate_vacuum_1_chart_setpointx.setpointHMI +recipe.upperplate_vacuum_2_chart_setpointx.setpointHMI +recipe.upperplate_vacuum_3_chart_setpointx.setpointHMI,recipe.upperplate_vacuum_max_time.setpointHMI)"
></svg-chart>
@@ -23,7 +23,7 @@ export default class EstrazionePrincipale extends Vue {
return [
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.extraction_main_1_chart_setpointy.setpointHMI,
width: this.recipe.extraction_main_1_chart_setpointx.setpointHMI
}
@@ -40,12 +40,14 @@
class="box-500 color_3"
:portata="recipe.extraction_main_1_chart_setpointy"
:durata="recipe.extraction_main_1_chart_setpointx"
id="extraction_main_1_chart_setpointy"
></scheda>
</article>
<article>
<svg-chart
line-bar-color="#848484"
:bars="bars"
:ids="['extraction_main_1_chart_setpointy']"
:max-y="recipe.extraction_main_1_chart_setpointy.range.max"
:max-x="recipe.extraction_main_1_chart_setpointx.range.max"
></svg-chart>
@@ -23,7 +23,7 @@ export default class EstrazioneSecondaria extends Vue {
return [
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.extraction_aux_1_chart_setpointy.setpointHMI,
width: this.recipe.extraction_aux_1_chart_setpointx.setpointHMI
}
@@ -36,12 +36,14 @@
class="box-500 color_3"
:portata="recipe.extraction_aux_1_chart_setpointy"
:durata="recipe.extraction_aux_1_chart_setpointx"
id="extraction_aux_1_chart_setpointy"
></scheda>
</article>
<article>
<svg-chart
line-bar-color="#848484"
:bars="bars"
:ids="['extraction_aux_1_chart_setpointy']"
:max-y="recipe.extraction_aux_1_chart_setpointy.range.max"
:max-x="recipe.extraction_aux_1_chart_setpointx.range.max"
></svg-chart>
@@ -30,7 +30,7 @@ export default class ShowImbutituraInfo extends Vue {
return [
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.drawing_1_chart_setpointy.setpointHMI,
width: this.recipe.drawing_1_chart_setpointx.setpointHMI
}
@@ -71,12 +71,14 @@
class="box-500 color_3"
:portata="recipe.drawing_1_chart_setpointy"
:durata="recipe.drawing_1_chart_setpointx"
id="drawing_1_chart_setpointy"
></scheda>
</article>
<article>
<svg-chart
line-bar-color="#848484"
:bars="bars"
:ids="['drawing_1_chart_setpointy']"
:max-x="recipe.drawing_1_chart_setpointx.range.max"
:max-y="recipe.drawing_1_chart_setpointy.range.max"
></svg-chart>
@@ -52,8 +52,7 @@
</template>
<style scoped>
.svg-area.pirometro {
padding: 50px;
width: calc(100% - 100px) !important;
width: 100% !important;
}
</style>
<script lang="ts" src="./SVG-termo-inferiore.ts"></script>
@@ -52,8 +52,7 @@
</template>
<style scoped>
.svg-area.pirometro {
padding: 50px;
width: calc(100% - 100px) !important;
width: 100% !important;
}
</style>
<script lang="ts" src="./SVG-termo-superiore.ts"></script>
@@ -1,6 +1,6 @@
<template>
<div class="chart">
<svg :viewBox="`${-2*step} ${-step} ${scaleX(MaxX) *1.2 + step} ${scaleY(MaxY) * 1.2 + step} `">
<svg :viewBox="`${-2*step} ${-step} ${scaleX(MaxX) *1.2 + step} ${scaleY(MaxY) * 1.2 + step +90} `">
<g>
<line
:x1="0"
@@ -30,6 +30,15 @@
:y2="scaleY(MaxY) - scaleY(y2)"
:stroke="lineBarColor"
/>
<line
x1="-100"
:x2="0"
:y1="scaleY(MaxY) - scaleY(y2)"
:y2="scaleY(MaxY) - scaleY(y2)"
:stroke="lineBarColor"
stroke-dasharray="4"
/>
<!-- line-v-1: prima riga verticale da sinistra -->
<line
@@ -44,18 +53,34 @@
<line
:x1="scaleX(x2)"
:x2="scaleX(x2)"
:y1="scaleY(MaxY) "
:y2="scaleY(MaxY) - scaleY(y3)"
:y1="scaleY(MaxY) - scaleY(y3)"
:y2="scaleY(MaxY)"
:stroke="lineBarColor"
/>
<line
:x1="scaleX(x2)"
:x2="scaleX(x2)"
:y1="scaleY(MaxY)"
:y2="scaleY(MaxY) + 70"
:stroke="lineBarColor"
stroke-dasharray="4"
/>
<!-- line-v-3 -->
<line
:x1="scaleX(x3)"
:x2="scaleX(x3)"
:y1="scaleY(MaxY) "
:y2="scaleY(MaxY) - scaleY(y2)"
:y1="scaleY(MaxY) - scaleY(y2)"
:y2="scaleY(MaxY)"
:stroke="lineBarColor"
/>
<line
:x1="scaleX(x3)"
:x2="scaleX(x3)"
:y1="scaleY(MaxY)"
:y2="scaleY(MaxY) + 140"
:stroke="lineBarColor"
stroke-dasharray="4"
/>
@@ -94,7 +119,7 @@
class="foreignControlBox"
:width="controlWidth"
:height="controlHeight"
:x="-step"
:x="-step -100"
:y="scaleY(MaxY) - scaleY(y2) - controlHeight/2"
>
<slot name="y2" />
@@ -113,7 +138,7 @@
class="foreignControlBox"
:width="controlWidth"
:height="controlHeight"
:y="scaleY(MaxY) "
:y="scaleY(MaxY) +70 "
:x="scaleX(x2) - controlWidth/2"
>
<slot name="x2" />
@@ -122,7 +147,7 @@
class="foreignControlBox"
:width="controlWidth"
:height="controlHeight"
:y="scaleY(MaxY) "
:y="scaleY(MaxY) + 140 "
:x="scaleX(x3) - controlWidth/2"
>
<slot name="x3" />
@@ -131,7 +156,7 @@
class="foreignControlBox"
:width="controlWidth"
:height="controlHeight"
:y="scaleY(MaxY) "
:y="scaleY(MaxY)"
:x="scaleX(x4) - controlWidth/2"
>
<slot name="x4" />
@@ -122,4 +122,8 @@ export default class Resistance extends Vue {
}
get Watt() {
return (this.channel.maxPower * this.channel.setpointHMI) / 100;
}
}
@@ -24,7 +24,7 @@
@click="click"
v-on:touchend="click"
:style="{backgroundColor:`rgba(${currentColor})`}"
>{{channel.actualCurrent}}&nbsp;W</div>
>{{Watt}}&nbsp;W</div>
<div
class="resistance id"
:class="{'disabled':!editable}"
@@ -2,6 +2,25 @@
width: 990px;
height: 835px;
}
.modal.prophetimages .measure {
position: absolute;
background-image: url(/assets//icons/png/termo-inspection.png);
width: 72px;
height: 56px;
background-size: cover;
transform: translateX(-36px) translateY(-12px);
}
.modal.prophetimages .measure > span {
font-size: 18px;
font-weight: bold;
color: #002680;
position: absolute;
height: 21px;
bottom: 3px;
left: 6px;
right: 6px;
text-align: right;
}
.modal.prophetimages header {
padding: 0 16px;
display: flex;
@@ -26,7 +45,7 @@
width: 100%;
height: 100%;
}
.modal.prophetimages section .imagecontainer span {
.modal.prophetimages section .imagecontainer > span {
position: absolute;
bottom: -20px;
width: 400px;
@@ -73,6 +92,7 @@
height: 140px;
transform: translateX(-100px);
bottom: 70px;
box-shadow: 0 2px 8px 0 rga(0, 0, 0, 0.5);
}
.modal.prophetimages section .color-bar {
display: grid;
@@ -1,4 +1,24 @@
.modal.prophetimages {
.measure {
position: absolute;
background-image: url(/assets//icons/png/termo-inspection.png);
width: 72px;
height: 56px;
background-size: cover;
transform: translateX(-36px) translateY(-12px);
> span {
font-size: 18px;
font-weight: bold;
color: #002680;
position: absolute;
height: 21px;
bottom: 3px;
left: 6px;
right: 6px;
text-align: right;
}
}
header {
padding: 0 16px;
display: flex;
@@ -24,7 +44,7 @@
width: 100%;
height: 100%;
}
span {
> span {
position: absolute;
bottom: -20px;
width: 400px;
@@ -76,6 +96,7 @@
height: 140px;
transform: translateX(-100px);
bottom: 70px;
box-shadow: 0 2px 8px 0 rga(0, 0, 0, 0.5);
}
}
@@ -1,138 +1,72 @@
import Component from "vue-class-component";
import Vue from "vue";
import { ModalHelper, Modal } from "@/components/modals";
import { Prop, Watch } from "vue-property-decorator";
import { warmersService } from "@/services/warmersService";
import { prodService } from "@/services/prodService";
import { AppModel } from "@/store";
import { debounce } from "@/_base/debounce";
@Component({
components: { modal: Modal },
})
export default class ThermoModal extends Vue {
TCamData: {
imageSize: { x: number, y: number },
rangeTemperature: { max: number, min: number },
} = {
imageSize: { x: 1024, y: 768 },
rangeTemperature: { max: 100, min: 0 }
}
get tstep() {
return (this.TCamData.rangeTemperature.max - this.TCamData.rangeTemperature.min) / 6;
}
measurePoints: {
x: number, y: number, temperature: number
}[] = [];
showPreview = 0;
selectedImage: number = 0;
serverPath = "/thermoprophet/colored";
images = ['20201104-163047.jpg',
'20201104-163309.jpg',
'20201104-163547.jpg',
'20201104-163826.jpg',
'20201104-164544.jpg',
'20201104-164850.jpg',
'20201104-165142.jpg',
'20201104-165418.jpg',
'20201104-165658.jpg',
'20201104-170154.jpg',
'20201104-170504.jpg',
'20201104-170741.jpg',
'20201104-171015.jpg',
'20201104-171256.jpg',
'20201110-141036.jpg',
'20201110-141318.jpg',
'20201110-141600.jpg',
'20201110-141842.jpg',
'20201110-142125.jpg',
'20201110-142333.jpg',
'20201110-142610.jpg',
'20201110-142852.jpg',
'20201110-143132.jpg',
'20201110-143434.jpg',
'20201110-155540.jpg',
'20201112-161151.jpg',
'20201112-161427.jpg',
'20201112-161701.jpg',
'20201112-161935.jpg',
'20201112-162221.jpg',
'20201112-163046.jpg',
'20201112-163107.jpg',
'20201112-163134.jpg',
'20201112-163141.jpg',
'20201112-163152.jpg',
'20201112-163235.jpg',
'20201112-163249.jpg',
'20201112-163313.jpg',
'20201112-163355.jpg',
'20201112-163435.jpg',
'20201112-163946.jpg',
'20201112-165438.jpg',
'20201112-165908.jpg',
'20201112-165931.jpg',
'20201112-165952.jpg',
'20201112-170518.jpg',
'20201112-170531.jpg',
'20201112-170604.jpg',
'20201112-170654.jpg',
'20201112-171322.jpg',
'20201112-171842.jpg',
'20201112-171946.jpg',
'20201112-172249.jpg',
'20201112-172440.jpg',
'20201112-172636.jpg',
'20201112-172834.jpg',
'20201112-173642.jpg',
'20201112-174108.jpg',
'20201112-174216.jpg',
'20201112-175159.jpg',
'20201113-141151.jpg',
'20201113-145345.jpg',
'20201113-145524.jpg',
'20201113-145707.jpg',
'20201113-145915.jpg',
'20201113-150118.jpg',
'20201113-150321.jpg',
'20201113-150527.jpg',
'20201113-150740.jpg',
'20201113-150959.jpg',
'20201113-153100.jpg',
'20201113-153143.jpg',
'20201113-153302.jpg',
'20201113-162158.jpg',
'20201113-162335.jpg',
'20201116-091043.jpg',
'20201116-091230.jpg',
'20201116-091419.jpg',
'20201116-091615.jpg',
'20201116-091828.jpg',
'20201116-092041.jpg',
'20201116-092301.jpg',
'20201116-092528.jpg',
'20201116-092802.jpg',
'20201116-093040.jpg',
'20201116-093327.jpg',
'20201116-093616.jpg',
'20201116-093914.jpg',
'20201116-100141.jpg',
'20201116-100404.jpg',
'20201116-100632.jpg',
'20201116-100858.jpg',
'20201116-101125.jpg',
'20201116-101403.jpg',
'20201116-101629.jpg',
'20201116-101858.jpg',
'20201116-102128.jpg',
'20201116-102356.jpg',
'20201116-102623.jpg',
'20201116-102847.jpg',
'20201116-103108.jpg',
'20201116-103332.jpg',
'20201116-103557.jpg',
'20201116-103819.jpg',
'20201116-104042.jpg',
'20201116-104305.jpg',
'20201116-104529.jpg',
'20201116-104756.jpg',
'20201116-105023.jpg',
'20201116-105251.jpg',
'20201116-105520.jpg',
'20201116-105751.jpg',
'20201116-110020.jpg',
'20201116-110349.jpg',
'20201116-110618.jpg'];
items: Prod.IProd[] = [];
get images() {
return this.items.map(i => i.thermoImage)
}
close() {
ModalHelper.HideModal();
ModalHelper.HideModal("modal2");
}
mounted() {
for (const iterator of this.images) {
}
get lastItem() {
return (this.$store.state as AppModel).prod.prod;
}
async mounted() {
this.TCamData = await warmersService.GetTCamData();
await warmersService.ResetMeasurePoints();
let min = Math.min(this.lastItem.numDone);
this.items.push(...await prodService.History(min - 1, min - 1))
}
async imageclick(evt: MouseEvent) {
let t = evt.target as HTMLImageElement;
let x = (evt.offsetX / t.clientWidth) * t.naturalWidth;
let y = (evt.offsetY / t.clientHeight) * t.naturalHeight;
await warmersService.SetMeasurePoints(x, y);
this.measurePoints.push({ x, y, temperature: 0 })
this.reloadMeasuresDelayed();
}
@Watch("selectedImage")
reloadMeasuresDelayed = debounce(async () => this.measurePoints = await warmersService.GetMeasurePoints(this.images[this.selectedImage]), 500);
}
@@ -4,33 +4,42 @@
<i class="fa fa-remove"></i>
</button>
<div class="imagecontainer">
<img :src="`${serverPath}/${images[parseInt(selectedImage)]}`" />
<img
:src="`${serverPath}/${images[parseInt(selectedImage)]}.jpg`"
@click="imageclick"
v-if="images.length"
ref="mainimage"
/>
<span>{{'thermo-long-tap-info' | localize("Long tap on image to add temperature inspectors")}}</span>
<div
class="measure"
:style="`left:${m.x / $refs.mainimage.naturalWidth * $refs.mainimage.clientWidth }px; top:${m.y/ $refs.mainimage.naturalHeight * $refs.mainimage.clientHeight}px`"
v-for="(m,idx) in measurePoints"
:key="idx"
>
<span>{{m.temperature}} °C</span>
</div>
</div>
<div class="color-bar">
<div class="color-line"></div>
<div class="legend">
<span>300° C</span>
<span>270° C</span>
<span>240° C</span>
<span>210° C</span>
<span>180° C</span>
<span>150° C</span>
<span>120° C</span>
<span v-for="c in 7" :key="c">{{Math.round(TCamData.rangeTemperature.max - tstep*(c-1))}}° C</span>
</div>
</div>
<div class="image-selector">
<div class="timeseries">
<time>{{'first-image' | localize("First image")}}</time>
<time>{{'last-image' | localize("Last image")}}</time>
<!-- <time>{{'first-image' | localize("First image")}}</time>
<time>{{'last-image' | localize("Last image")}}</time>-->
</div>
<img
:src="`${serverPath}/${images[parseInt(selectedImage)]}`"
:src="`${serverPath}/${images[parseInt(selectedImage)]}.jpg`"
v-if="showPreview"
class="selector"
:style="`left:${(parseInt(selectedImage) / images.length) * 858}px`"
:style="`left:${(parseInt(selectedImage) / (images.length-1)) * 858}px`"
/>
<input
v-if="images.length"
type="range"
:min="0"
:max="images.length-1"
@@ -41,7 +50,7 @@
<div class="selectorarea">
<span
class="selector"
:style="`left:${(parseInt(selectedImage) / images.length) * 858}px`"
:style="`left:${(parseInt(selectedImage) / (images.length-1)) * 858}px`"
>{{'thermo-cycle' | localize("Cycle")}} {{selectedImage}}</span>
</div>
</div>
@@ -29,6 +29,11 @@ export default class Thermocamera extends Vue {
thermoImageOpacity: number = 0;
resistanceMode = 0;
TCamData: {
imageSize: { x: number, y: number },
rangeTemperature: { max: number, min: number },
} = null;
@Watch("warmers", { deep: true })
async ChangedTemps() {
@@ -47,6 +52,7 @@ export default class Thermocamera extends Vue {
}
async mounted() {
this.ChangedTemps();
this.TCamData = await warmersService.GetTCamData();
}
get selectedChannels(): Warmers.IChannel[] {
@@ -169,6 +175,6 @@ export default class Thermocamera extends Vue {
}
async openThermoModal() {
ModalHelper.ShowModal(termoModal);
ModalHelper.ShowModal(termoModal, "modal2");
}
}
@@ -14,20 +14,20 @@ export default class Prevuoto extends Vue {
get bars() {
return [
{
backgroundColor: "#fff",
borderColor: "#848484",
backgroundColor: "#ededed",
borderColor: "#9e9e9e",
height: this.recipe.vacuum_pre_1_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_pre_1_chart_setpointx.setpointHMI
},
{
backgroundColor: "#e5f3ff",
borderColor: "#848484",
borderColor: "#79a9d2",
height: this.recipe.vacuum_pre_2_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_pre_2_chart_setpointx.setpointHMI
},
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.vacuum_pre_3_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_pre_3_chart_setpointx.setpointHMI
}
@@ -28,16 +28,19 @@
<article class="shrink ml-10">
<scheda
class="box-500 mb-10"
id="vacuum_pre_1_chart_setpointy"
:portata="recipe.vacuum_pre_1_chart_setpointy"
:durata="recipe.vacuum_pre_1_chart_setpointx"
></scheda>
<scheda
class="box-500 mb-10 color_2"
id="vacuum_pre_2_chart_setpointy"
:portata="recipe.vacuum_pre_2_chart_setpointy"
:durata="recipe.vacuum_pre_2_chart_setpointx"
></scheda>
<scheda
class="box-500 mb-10 color_3"
id="vacuum_pre_3_chart_setpointy"
:portata="recipe.vacuum_pre_3_chart_setpointy"
:durata="recipe.vacuum_pre_3_chart_setpointx"
></scheda>
@@ -47,6 +50,7 @@
line-bar-color="#848484"
:bars="bars"
:lines="lines"
:ids="['vacuum_pre_1_chart_setpointy','vacuum_pre_2_chart_setpointy','vacuum_pre_3_chart_setpointy']"
:max-y="Math.max(recipe.vacuum_pre_1_chart_setpointy.range.max , recipe.vacuum_pre_2_chart_setpointy.range.max ,recipe.vacuum_pre_3_chart_setpointy.range.max)"
:max-x="Math.max(recipe.vacuum_pre_1_chart_setpointx.setpointHMI +recipe.vacuum_pre_2_chart_setpointx.setpointHMI+recipe.vacuum_pre_3_chart_setpointx.setpointHMI,recipe.vacuum_pre_max_time.setpointHMI)"
></svg-chart>
@@ -14,20 +14,20 @@ export default class VuotoAusiliario extends Vue {
get bars() {
return [
{
backgroundColor: "#fff",
borderColor: "#848484",
backgroundColor: "#ededed",
borderColor: "#9e9e9e",
height: this.recipe.vacuum_aux_1_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_aux_1_chart_setpointx.setpointHMI
},
{
backgroundColor: "#e5f3ff",
borderColor: "#848484",
borderColor: "#79a9d2",
height: this.recipe.vacuum_aux_2_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_aux_2_chart_setpointx.setpointHMI
},
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.vacuum_aux_3_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_aux_3_chart_setpointx.setpointHMI
}
@@ -36,16 +36,19 @@
<article class="shrink ml-10">
<scheda
class="box-500 mb-10"
id="vacuum_aux_1_chart_setpointy"
:portata="recipe.vacuum_aux_1_chart_setpointy"
:durata="recipe.vacuum_aux_1_chart_setpointx"
></scheda>
<scheda
class="box-500 mb-10 color_2"
id="vacuum_aux_2_chart_setpointy"
:portata="recipe.vacuum_aux_2_chart_setpointy"
:durata="recipe.vacuum_aux_2_chart_setpointx"
></scheda>
<scheda
class="box-500 mb-10 color_3"
id="vacuum_aux_3_chart_setpointy"
:portata="recipe.vacuum_aux_3_chart_setpointy"
:durata="recipe.vacuum_aux_3_chart_setpointx"
></scheda>
@@ -55,6 +58,7 @@
line-bar-color="#848484"
:bars="bars"
:lines="lines"
:ids="['vacuum_aux_1_chart_setpointy','vacuum_aux_2_chart_setpointy','vacuum_aux_3_chart_setpointy']"
:max-y="Math.max(recipe.vacuum_aux_1_chart_setpointy.range.max , recipe.vacuum_aux_2_chart_setpointy.range.max ,recipe.vacuum_aux_3_chart_setpointy.range.max)"
:max-x="Math.max(recipe.vacuum_aux_1_chart_setpointx.setpointHMI+recipe.vacuum_aux_2_chart_setpointx.setpointHMI+recipe.vacuum_aux_3_chart_setpointx.setpointHMI, recipe.vacuum_aux_max_time.setpointHMI)"
></svg-chart>
@@ -163,20 +163,20 @@ export default class VuotoPrincipale extends Vue {
get bars() {
return [
{
backgroundColor: "#fff",
borderColor: "#848484",
backgroundColor: "#ededed",
borderColor: "#9e9e9e",
height: this.recipe.vacuum_main_1_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_main_1_chart_setpointx.setpointHMI
},
{
backgroundColor: "#e5f3ff",
borderColor: "#848484",
borderColor: "#79a9d2",
height: this.recipe.vacuum_main_2_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_main_2_chart_setpointx.setpointHMI
},
{
backgroundColor: "#b3dbff",
borderColor: "#848484",
borderColor: "#538fc6",
height: this.recipe.vacuum_main_3_chart_setpointy.setpointHMI,
width: this.recipe.vacuum_main_3_chart_setpointx.setpointHMI
}
@@ -33,16 +33,19 @@
<article class="shrink ml-10">
<scheda
class="box-500 mb-10"
id="vacuum_main_1_chart_setpointy"
:portata="recipe.vacuum_main_1_chart_setpointy"
:durata="recipe.vacuum_main_1_chart_setpointx"
></scheda>
<scheda
class="box-500 mb-10 color_2"
id="vacuum_main_2_chart_setpointy"
:portata="recipe.vacuum_main_2_chart_setpointy"
:durata="recipe.vacuum_main_2_chart_setpointx"
></scheda>
<scheda
class="box-500 mb-10 color_3"
id="vacuum_main_3_chart_setpointy"
:portata="recipe.vacuum_main_3_chart_setpointy"
:durata="recipe.vacuum_main_3_chart_setpointx"
></scheda>
@@ -52,6 +55,7 @@
line-bar-color="#848484"
:bars="bars"
:lines="lines"
:ids="['vacuum_main_1_chart_setpointy','vacuum_main_2_chart_setpointy','vacuum_main_3_chart_setpointy']"
:max-y="Math.max(recipe.vacuum_main_1_chart_setpointy.range.max , recipe.vacuum_main_2_chart_setpointy.range.max ,recipe.vacuum_main_3_chart_setpointy.range.max)"
:max-x="Math.max(recipe.vacuum_main_1_chart_setpointx.setpointHMI+recipe.vacuum_main_2_chart_setpointx.setpointHMI+recipe.vacuum_main_3_chart_setpointx.setpointHMI,recipe.vacuum_main_max_time.setpointHMI)"
></svg-chart>
@@ -41,4 +41,17 @@ export default class IO extends Vue {
}
isConfigVisible(group,bankid){
var vis = false;
var it = this.items[group].filter(i => i.bank == bankid);
for (let index = 0; index < it.length; index++) {
if(it[index].visible){
vis = true;
break;
}
}
return vis
}
}
@@ -5,12 +5,14 @@
<div class="row-list">
<a @click="scrollto(true,`input-pinned`)">Pinned</a>
<template v-for="(group, idx) in ['di','ai']">
<a
@click="scrollto(true,`input-${group}-${inputid}`)"
class="upper"
v-for="(inputid, idx2) in config[group]"
:key="`h-${idx}-${idx2}`"
>{{`${group} ${inputid}`}}</a>
<template v-for="(inputid, idx2) in config[group]">
<a
@click="scrollto(true,`input-${group}-${inputid}`)"
class="upper"
v-if="isConfigVisible(group,inputid)"
:key="`h-${idx}-${idx2}`"
>{{`${group} ${inputid}`}}</a>
</template>
</template>
</div>
<InputTable></InputTable>
@@ -20,12 +22,14 @@
<div class="row-list">
<a @click="scrollto(false,`output-pinned`)">Pinned</a>
<template v-for="(group, idx) in ['do','ao']">
<a
@click="scrollto(false,`output-${group}-${inputid}`)"
class="upper"
v-for="(inputid, idx2) in config[group]"
:key="`h-${idx}-${idx2}`"
>{{`${group} ${inputid}`}}</a>
<template v-for="(inputid, idx2) in config[group]">
<a
@click="scrollto(false,`output-${group}-${inputid}`)"
class="upper"
v-if="isConfigVisible(group,inputid)"
:key="`h-${idx}-${idx2}`"
>{{`${group} ${inputid}`}}</a>
</template>
</template>
</div>
<OutputTable></OutputTable>
@@ -1,5 +1,5 @@
<template>
<tr>
<tr v-if="item.visible">
<td class="pointer">
<button class="pointer" @click="$emit('click')">
<img
@@ -32,4 +32,18 @@ export default class InputTable extends Vue {
get config(): { [id: string]: number[] } {
return store.state.underTheHood.ioChannelsConfig;
}
isConfigVisible(group,bankid){
var vis = false;
var it = this.items[group].filter(i => i.bank == bankid);
for (let index = 0; index < it.length; index++) {
if(it[index].visible){
vis = true;
break;
}
}
return vis
}
}
@@ -29,7 +29,7 @@
<template v-for="(group, idx) in ['di','ai']">
<template v-for="(bankid, idx2) in config[group]">
<tr class="group-row" :key="`h-${idx}-${idx2}`" :id="`input-${group}-${bankid}`" >
<tr class="group-row" :key="`h-${idx}-${idx2}`" :id="`input-${group}-${bankid}`" v-if="isConfigVisible(group,bankid)" >
<td colspan="6">{{ `${group} ${bankid}`}}</td>
</tr>
<input-row
@@ -1,5 +1,5 @@
<template>
<tr>
<tr v-if="item.visible">
<td class="pointer">
<button class="pointer" @click="$emit('click')">
<img
@@ -31,4 +31,17 @@ export default class OutputTable extends Vue {
get config(): { [id: string]: number[] } {
return store.state.underTheHood.ioChannelsConfig;
}
isConfigVisible(group,bankid){
var vis = false;
var it = this.items[group].filter(i => i.bank == bankid);
for (let index = 0; index < it.length; index++) {
if(it[index].visible){
vis = true;
break;
}
}
return vis
}
}
@@ -29,9 +29,9 @@
</template>
<template v-for="(group, idx) in ['do','ao']">
<template v-for="(bankid, idx2) in config[group]">
<template v-for="(bankid, idx2) in config[group]" >
<tr class="group-row" :key="`h-${idx}-${idx2}`"
:id="`output-${group}-${bankid}`">
:id="`output-${group}-${bankid}`" v-if="isConfigVisible(group,bankid)">
<td colspan="7">{{ `${group} ${bankid}`}}</td>
</tr>
<output-row
@@ -1,45 +0,0 @@
import { store, machineStatusActions } from "@/store";
import { machineService } from "@/services/machineService";
import { loginService } from "@/services/loginService";
import Vue from "vue";
import Component from "vue-class-component";
@Component({})
export default class Home extends Vue{
URLS_TO_FUNCTIONS_BINDING : {
"/production": "production",
"/tooling": "tooling",
"/report": "report",
"/alarms": "alarms",
"/maintenance": "maintenance",
"/scada": "scada",
"/users": "users",
"/jobeditor": "job-editor",
"/utilities": "utilities"
};
mounted(){
let machine = new machineService();
loginService.getAuthorizationFunction()
.then(() => {
// If not authorized redirect to the first available page
if(!machineStatusActions.userCanAccessToArea(store, this.URLS_TO_FUNCTIONS_BINDING["/production"])) {
for(var k in this.URLS_TO_FUNCTIONS_BINDING) {
if(machineStatusActions.userCanAccessToArea(store, this.URLS_TO_FUNCTIONS_BINDING[k])) {
this.$router.push(this.URLS_TO_FUNCTIONS_BINDING[k])
break;
}
}
}
else {
this.$router.push("production")
}
});
}
};
+43 -1
View File
@@ -1,4 +1,46 @@
<template>
</template>
<script src="./Home.ts" lang="ts" />
<script>
import { store, machineStatusActions } from "src/store";
import { machineService } from "src/services/machineService";
import { loginService } from "src/services/loginService";
export default {
components: { },
data() {
return {
URLS_TO_FUNCTIONS_BINDING : {
"/production": "production",
"/modal-load-program": "modal-load-program",
"/setup": "setup",
"/alarms": "alarms",
"/maintenance": "maintenance",
"/progrprerisc": "progrprerisc",
"/users": "users",
}
};
},
mounted: function(){
let machine = new machineService();
loginService.getAuthorizationFunction()
.then(() => {
// If not authorized redirect to the first available page
if(!machineStatusActions.userCanAccessToArea(store, this.URLS_TO_FUNCTIONS_BINDING["/production"])) {
for(var k in this.URLS_TO_FUNCTIONS_BINDING) {
if(machineStatusActions.userCanAccessToArea(store, this.URLS_TO_FUNCTIONS_BINDING[k])) {
this.$router.push(this.URLS_TO_FUNCTIONS_BINDING[k])
break;
}
}
}
else {
this.$router.push("production")
}
});
}
};
</script>
@@ -5,7 +5,7 @@
@click="openProgram('/modal-load-program')"
:title="'footer_tooltip_ricetta' | localize('Apertura Ricetta')"
:disabled="false"
v-if="true"
v-if="isAreaVisible('modal-load-program')"
class="oval ricetta"
:class="{ big:isInPath('modal-load-program') && !state.isMainViewLiftedUp}"
></button>
@@ -14,7 +14,7 @@
@click="openProgram('/setup')"
:title="'footer_tooltip_setup' | localize('Setup')"
:disabled="false"
v-if="true"
v-if="isAreaVisible('setup')"
class="oval jobeditor"
:class="{ big:isInPath('setup') && !state.isMainViewLiftedUp}"
></button>
@@ -23,7 +23,7 @@
@click="openProgram('/production')"
:title="'footer_tooltip_production' | localize('Production')"
:disabled="false"
v-if="true"
v-if="isAreaVisible('production')"
class="oval main-production"
:class="{ big:(isInPath('production') || isInMainPage()) && !state.isMainViewLiftedUp}"
></button>
@@ -42,7 +42,7 @@
@click="openProgram('/progrprerisc')"
:title="'footer_tooltip_progr_prerisc' | localize('Programmazione Preriscaldo')"
:disabled="false"
v-if="true"
v-if="isAreaVisible('progrprerisc')"
class="oval progrprerisc"
:class="{ big:isInPath('progrprerisc') && !state.isMainViewLiftedUp}"
></button>
@@ -119,22 +119,5 @@
><img src="assets/icons/png/auto.png" />{{'run_auto' | localize("Auto")}}</button>
</div>
</footer>
<!--
<div class="machine-area">
<button
class="under"
@mouseup="toggleMainView()"
:class="{'pressed':state.isMainViewLiftedUp}"
:title="'footer_tooltip_under_hood' | localize('Open/Close Under-the-hood area')"
>
<img src="assets/icons/png/siemens-logo.png" v-if="isSiemens()" />
<img src="assets/icons/png/fanuc-logo.png" v-if="isFanuc()" />
<img src="assets/icons/png/osai-logo.png" v-if="isOsai()" />
<span v-if="isDemo()" class="btn-demo">DEMO</span>
</button>
</div>
</footer>
-->
</template>
<script lang="ts" src="./app-footer.ts"></script>
@@ -3,6 +3,7 @@ import { CONFIGURATION } from "@/config";
import { warmersActions } from "@/store/warmers.store";
import { store } from "@/store";
import Warmers from "@/app_modules_thermo/setup/riscaldi/components/base-components/warmers";
import Numeric from "@/app_modules_thermo/components/numeric";
export class WarmersService extends baseRestService {
@@ -10,7 +11,7 @@ export class WarmersService extends baseRestService {
async GetThermocameraStatus() {
let result = await this.Get((await this.BASE_URL()) + "TCamData");
warmersActions.setTcamStatus(store, result as Warmers.ICamStatus );
warmersActions.setTcamStatus(store, result as Warmers.ICamStatus);
return result;
}
@@ -42,12 +43,12 @@ export class WarmersService extends baseRestService {
}
async setTCamMode(model: boolean) {
let result = await this.Put<any>((await this.BASE_URL()) + "setTCamMode?enableTCam="+model, {}, true);
let result = await this.Put<any>((await this.BASE_URL()) + "setTCamMode?enableTCam=" + model, {}, true);
return result;
}
async setTCamOn(model: boolean) {
let result = await this.Put<any>((await this.BASE_URL()) + "setTCamOn?setTCamOn="+model,{}, true);
let result = await this.Put<any>((await this.BASE_URL()) + "setTCamOn?setTCamOn=" + model, {}, true);
return result;
}
@@ -66,5 +67,24 @@ export class WarmersService extends baseRestService {
return result;
}
async GetTCamData() {
let result = await this.Get<{
imageSize: { x: number, y: number },
rangeTemperature: { max: number, min: number },
}>((await this.BASE_URL()) + "TCamData", true);
return result;
}
async GetMeasurePoints(setname: string): Promise<any> {
return await this.Get<any>((await this.BASE_URL()) + `getMeasurePoints?setName=${setname}`, true);
}
async SetMeasurePoints(x: number, y: number) {
return await this.Put((await this.BASE_URL()) + `addMeasurePoint?posX=${Math.round(x)}&posY=${Math.round(y)}`, null, true);
}
async ResetMeasurePoints() {
return this.Put((await this.BASE_URL()) + `resetMeasurePoint`, null, true);
}
}
export const warmersService = new WarmersService();
@@ -364,10 +364,13 @@ export const machineStatusStore = {
}
}
//Patch per Thermoactive N.C.
if(areaname == 'setup' || areaname == 'modal-load-program')
return areaUserEnabled;
for (const key in areaconfig) {
if (areaconfig.hasOwnProperty(key)) {
const config = areaconfig[key];
if (config && config.name && config.name == areaname) {
if (inBrowser) return config.allowExternalBrowser && config.enabled && areaUserEnabled;
return config.enabled && areaUserEnabled;
@@ -3,6 +3,7 @@ import Vue from "vue";
export interface ProdStoreModel {
prod: Prod.IProd;
panel: Prod.IProdPanel;
fase: number;
}
@@ -21,7 +22,7 @@ export const prodStore = {
state: {
prod: {},
panel: {}
panel: {}, fase: 0
} as ProdStoreModel,
getters: {
@@ -49,7 +50,7 @@ export const prodStore = {
};
state.panel = {
numTarget: 0,
numDone: 0, inizioProd: 0,
numDone: 0, inizioProd: 0,
stimaDurata: 0,
tempAct: 0,
tempSetpoint: 0,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

After

Width:  |  Height:  |  Size: 155 KiB

File diff suppressed because one or more lines are too long
Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 682 KiB