Commit 5cbbdcc6 authored by Claes Sjöfors's avatar Claes Sjöfors

MPC controller update with monitor object

parent c64855dc
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <math.h> #include <math.h>
#include "co_dcli.h" #include "co_dcli.h"
#include "simul.h" #include "simul.h"
#include "rt_plc_msg.h"
typedef enum { typedef enum {
mlp_eActivation_No = 0, mlp_eActivation_No = 0,
...@@ -60,10 +61,12 @@ typedef struct { ...@@ -60,10 +61,12 @@ typedef struct {
double aval[20]; double aval[20];
} mlp_sCtx, *mlp_tCtx; } mlp_sCtx, *mlp_tCtx;
#define mlp_scale(value, idx) ((value) * co->ScaleCoeff1[(idx)] + co->ScaleCoeff0[(idx)])
#define mlp_rescale(value, idx) (((value) - co->ScaleCoeff0[(idx)]) / co->ScaleCoeff1[(idx)])
int mlp_import(const char *file, mlp_sCtx *mlp);
void mlp_free(mlp_sCtx *mlp); void mlp_free(mlp_sCtx *mlp);
void mlp_model(mlp_tCtx mlp, double *x, double *out); static int mlp_import(pwr_sClass_Sim_ModelMLP* co, const char *file, mlp_sCtx *mlp);
static void mlp_model(mlp_tCtx mlp, double *x, double *out);
void Sim_ModelMLP_Fo_init(pwr_sClass_Sim_ModelMLP_Fo* o) void Sim_ModelMLP_Fo_init(pwr_sClass_Sim_ModelMLP_Fo* o)
{ {
...@@ -78,19 +81,33 @@ void Sim_ModelMLP_Fo_init(pwr_sClass_Sim_ModelMLP_Fo* o) ...@@ -78,19 +81,33 @@ void Sim_ModelMLP_Fo_init(pwr_sClass_Sim_ModelMLP_Fo* o)
o->PlcConnectP = 0; o->PlcConnectP = 0;
co = (pwr_sClass_Sim_ModelMLP *)o->PlcConnectP; co = (pwr_sClass_Sim_ModelMLP *)o->PlcConnectP;
if (!co) { if (!co)
co->Status = 2;
return; return;
}
o->ModelP = (mlp_tCtx)calloc(1, sizeof(mlp_sCtx)); o->ModelP = (mlp_tCtx)calloc(1, sizeof(mlp_sCtx));
co->Status = mlp_import(co->ModelFile, (mlp_tCtx)o->ModelP); co->Status = mlp_import(co, co->ModelFile, (mlp_tCtx)o->ModelP);
if (EVEN(co->Status)) if (EVEN(co->Status))
return; return;
co->Layers = ((mlp_tCtx)o->ModelP)->layers; co->Layers = ((mlp_tCtx)o->ModelP)->layers;
for (i = 0; i < MIN(co->Layers, sizeof(co->LayerSizes)/sizeof(co->LayerSizes[0])); i++) for (i = 0; i < MIN(co->Layers, sizeof(co->LayerSizes)/sizeof(co->LayerSizes[0])); i++)
co->LayerSizes[i] = ((mlp_tCtx)o->ModelP)->layer_sizes[i]; co->LayerSizes[i] = ((mlp_tCtx)o->ModelP)->layer_sizes[i];
switch (((mlp_tCtx)o->ModelP)->activation) {
case mlp_eActivation_Tanh:
strcpy(co->Activation, "tanh");
break;
case mlp_eActivation_Identity:
strcpy(co->Activation, "identity");
break;
case mlp_eActivation_Relu:
strcpy(co->Activation, "relu");
break;
case mlp_eActivation_Logistic:
strcpy(co->Activation, "logistic");
break;
default:
strcpy(co->Activation, "unknown");
}
((mlp_tCtx)o->ModelP)->inputs = (double *)calloc(((mlp_tCtx)o->ModelP)->layer_sizes[0], ((mlp_tCtx)o->ModelP)->inputs = (double *)calloc(((mlp_tCtx)o->ModelP)->layer_sizes[0],
sizeof(double)); sizeof(double));
...@@ -106,20 +123,22 @@ void Sim_ModelMLP_Fo_exec(plc_sThread* tp, pwr_sClass_Sim_ModelMLP_Fo* o) ...@@ -106,20 +123,22 @@ void Sim_ModelMLP_Fo_exec(plc_sThread* tp, pwr_sClass_Sim_ModelMLP_Fo* o)
return; return;
for (i = 0; i < co->LayerSizes[0]; i++) { for (i = 0; i < co->LayerSizes[0]; i++) {
((mlp_tCtx)o->ModelP)->inputs[i] = (double)(**(pwr_tFloat32 **)((char *)&o->In1P + pwr_cInputOffset * i)); ((mlp_tCtx)o->ModelP)->inputs[i] = (double)mlp_scale((**(pwr_tFloat32 **)((char *)&o->In1P + pwr_cInputOffset * i)), i+1);
} }
mlp_model((mlp_tCtx)o->ModelP, ((mlp_tCtx)o->ModelP)->inputs, &out); mlp_model((mlp_tCtx)o->ModelP, ((mlp_tCtx)o->ModelP)->inputs, &out);
o->Out = (pwr_tFloat32)out; o->Out = (pwr_tFloat32)mlp_rescale(out, 0);
co->Value = o->Out;
} }
int mlp_import(const char *file, mlp_sCtx *mlp) static int mlp_import(pwr_sClass_Sim_ModelMLP* co, const char *file, mlp_sCtx *mlp)
{ {
pwr_tFileName fname; pwr_tFileName fname;
FILE *fp; FILE *fp;
char line[2000]; char line[2000];
unsigned int i, j, k; unsigned int i, j, k;
unsigned int size, num;
char *s; char *s;
dcli_translate_filename(fname, file); dcli_translate_filename(fname, file);
...@@ -128,26 +147,48 @@ int mlp_import(const char *file, mlp_sCtx *mlp) ...@@ -128,26 +147,48 @@ int mlp_import(const char *file, mlp_sCtx *mlp)
return 0; return 0;
while (dcli_read_line(line, sizeof(line), fp)) { while (dcli_read_line(line, sizeof(line), fp)) {
if (strncmp(line, "Layers ", 7) == 0) { if (strncmp(line, "Scaler ", 7) == 0) {
if (sscanf(&line[7], "%d", &mlp->layers) != 1) { char sarray[20][40];
printf("Syntax error\n"); if (sscanf(&line[7], "%d", &size) != 1)
return 0; return PLC__FILESYNTAX;
dcli_read_line(line, sizeof(line), fp);
num = dcli_parse(line, " ", "", (char*)sarray,
sizeof(sarray) / sizeof(sarray[0]), sizeof(sarray[0]),
0);
if (num < size)
return PLC__FILESYNTAX;
for (i = 0; i < size; i++) {
if (sscanf(sarray[i], "%f", &co->ScaleCoeff0[i]) != 1)
return PLC__FILESYNTAX;
} }
dcli_read_line(line, sizeof(line), fp);
num = dcli_parse(line, " ", "", (char*)sarray,
sizeof(sarray) / sizeof(sarray[0]), sizeof(sarray[0]),
0);
if (num < size)
return PLC__FILESYNTAX;
for (i = 0; i < size; i++) {
if (sscanf(sarray[i], "%f", &co->ScaleCoeff1[i]) != 1)
return PLC__FILESYNTAX;
}
}
if (strncmp(line, "Layers ", 7) == 0) {
if (sscanf(&line[7], "%d", &mlp->layers) != 1)
return PLC__FILESYNTAX;
} }
else if (strncmp(line, "LayerSizes ", 11) == 0) { else if (strncmp(line, "LayerSizes ", 11) == 0) {
mlp->layer_sizes = (unsigned int *)calloc(mlp->layers, sizeof(int)); mlp->layer_sizes = (unsigned int *)calloc(mlp->layers, sizeof(int));
s = line; s = line;
for (i = 0; i < mlp->layers; i++) { for (i = 0; i < mlp->layers; i++) {
s = strchr(s, ' '); s = strchr(s, ' ');
if (!s) { if (!s)
printf("Syntax error\n"); return PLC__FILESYNTAX;
return 0;
}
s++; s++;
if (sscanf(s, "%d", &mlp->layer_sizes[i]) != 1) { if (sscanf(s, "%d", &mlp->layer_sizes[i]) != 1)
printf("Syntax error\n"); return PLC__FILESYNTAX;
return 0;
}
} }
} }
else if (strncmp(line, "Activation ", 11) == 0) { else if (strncmp(line, "Activation ", 11) == 0) {
...@@ -174,10 +215,8 @@ int mlp_import(const char *file, mlp_sCtx *mlp) ...@@ -174,10 +215,8 @@ int mlp_import(const char *file, mlp_sCtx *mlp)
s = strchr(s, ' '); s = strchr(s, ' ');
s++; s++;
} }
if (sscanf(s, "%lf", &mlp->intercepts[i][j]) != 1) { if (sscanf(s, "%lf", &mlp->intercepts[i][j]) != 1)
printf("Syntax error\n"); return PLC__FILESYNTAX;
return 0;
}
} }
} }
} }
...@@ -197,7 +236,7 @@ int mlp_import(const char *file, mlp_sCtx *mlp) ...@@ -197,7 +236,7 @@ int mlp_import(const char *file, mlp_sCtx *mlp)
dcli_read_line(line, sizeof(line), fp); dcli_read_line(line, sizeof(line), fp);
sscanf(line, "%d %d %d %lf", &i1, &j1, &k1, &mlp->coefs[i][j][k]); sscanf(line, "%d %d %d %lf", &i1, &j1, &k1, &mlp->coefs[i][j][k]);
if (i1 != i || j1 != j || k1 != k) if (i1 != i || j1 != j || k1 != k)
printf("Syntax error\n"); return PLC__FILESYNTAX;
} }
} }
} }
...@@ -211,7 +250,7 @@ int mlp_import(const char *file, mlp_sCtx *mlp) ...@@ -211,7 +250,7 @@ int mlp_import(const char *file, mlp_sCtx *mlp)
for (i = 0; i < mlp->layers - 1; i++) { for (i = 0; i < mlp->layers - 1; i++) {
mlp->h[i] = (double *)calloc(mlp->layer_sizes[i+1], sizeof(double)); mlp->h[i] = (double *)calloc(mlp->layer_sizes[i+1], sizeof(double));
} }
return 1; return PLC__SUCCESS;
} }
void mlp_free(mlp_sCtx *mlp) void mlp_free(mlp_sCtx *mlp)
...@@ -235,7 +274,7 @@ void mlp_free(mlp_sCtx *mlp) ...@@ -235,7 +274,7 @@ void mlp_free(mlp_sCtx *mlp)
free(mlp); free(mlp);
} }
void mlp_model(mlp_tCtx mlp, double *x, double *out) static void mlp_model(mlp_tCtx mlp, double *x, double *out)
{ {
unsigned int i, j, k; unsigned int i, j, k;
......
...@@ -113,6 +113,43 @@ void Sim_SignalGeneratorFo_exec(plc_sThread* tp, pwr_sClass_Sim_SignalGeneratorF ...@@ -113,6 +113,43 @@ void Sim_SignalGeneratorFo_exec(plc_sThread* tp, pwr_sClass_Sim_SignalGeneratorF
if ( value > co->Bias + co->Amplitude) if ( value > co->Bias + co->Amplitude)
value -= co->Amplitude; value -= co->Amplitude;
break; break;
case pwr_eSim_SignalGeneratorType_Triangular: {
if ( co->Period < FLT_MIN)
break;
co->Accum += *o->ScanTime;
if ( co->Accum / co->Period > (int)(1000.0f / co->Period))
co->Accum -= co->Period * (int)(1000.0f / co->Period);
float p = co->Accum / co->Period - (int)(co->Accum / co->Period);
if ( p <= co->PulseWidth/100)
value += co->Amplitude * p / (co->PulseWidth/100);
else
value += co->Amplitude * (1 - p) / (1 - (co->PulseWidth/100));
break;
}
case pwr_eSim_SignalGeneratorType_StepPyramid: {
if ( co->Period < FLT_MIN)
break;
co->Accum += *o->ScanTime;
if ( co->Accum / co->Period > (int)(1000.0f / co->Period))
co->Accum -= co->Period * (int)(1000.0f / co->Period);
float p = co->Accum / co->Period - (int)(co->Accum / co->Period);
int steps = (int)(1.0f / (co->PulseWidth/100));
if (ODD(steps))
steps -= 1;
int current = (int)(p * steps);
int height = steps/2;
if ( current <= steps/2 - 1)
value += co->Amplitude / height * (current + 1);
else if (current < steps - 1)
value += co->Amplitude / height * (steps - current - 1);
break;
}
} }
if ( co->FilterTime > 0.001f) { if ( co->FilterTime > 0.001f) {
...@@ -124,6 +161,11 @@ void Sim_SignalGeneratorFo_exec(plc_sThread* tp, pwr_sClass_Sim_SignalGeneratorF ...@@ -124,6 +161,11 @@ void Sim_SignalGeneratorFo_exec(plc_sThread* tp, pwr_sClass_Sim_SignalGeneratorF
value += (float)rand() / RAND_MAX * co->Noise * 2 - co->Noise; value += (float)rand() / RAND_MAX * co->Noise * 2 - co->Noise;
} }
if (co->RampUp != 0.0f && value - o->ActualValue > co->RampUp * tp->f_scan_time)
o->ActualValue += co->RampUp * tp->f_scan_time;
else if (co->RampDown != 0.0f && value - o->ActualValue < -co->RampDown * tp->f_scan_time)
o->ActualValue -= co->RampDown * tp->f_scan_time;
else
o->ActualValue = value; o->ActualValue = value;
co->ActualValue = o->ActualValue; co->ActualValue = o->ActualValue;
} }
......
This diff is collapsed.
...@@ -29,22 +29,26 @@ ...@@ -29,22 +29,26 @@
100 20 100 20
135 20 135 20
101 20 101 20
102 92 102 234
103 7 103 258
104 2.9419 104 2.73887
136 2.9419 136 2.73887
105 100 105 100
106 13 106 28
107 1 107 2
108 53 108 53
109 10.5 109 10.5
110 40.8 110 40.8
111 0.831579 111 0.831579
116 0 112 758
117 0 113 613
118 110 114 196
119 89 115 117
120 1 116 4
117 33
118 107
119 117
120 0
121 Claes context 121 Claes context
122 0 122 0
126 0.5 126 0.5
...@@ -63,7 +67,7 @@ ...@@ -63,7 +67,7 @@
134 134
22 22
2200 0 2200 0
2201 536 2201 540
2202 pwr_c_sim_signalgenerator 2202 pwr_c_sim_signalgenerator
2203 310 2203 310
2205 0 2205 0
...@@ -3714,10 +3718,10 @@ pwr_exe: ...@@ -3714,10 +3718,10 @@ pwr_exe:
99 99
30 30
3004 O75 3004 O75
3000 0.63148 3000 0.58148
3001 0.23148 3001 0.23148
3002 0.696505 3002 0.696505
3003 0.246505 3003 0.196505
3008 0 3008 0
3010 4 3010 4
3011 2 3011 2
...@@ -8273,10 +8277,10 @@ pwr_exe: ...@@ -8273,10 +8277,10 @@ pwr_exe:
99 99
30 30
3004 O376 3004 O376
3000 17.6556 3000 17.6056
3001 13.2056 3001 13.2056
3002 22.4097 3002 22.5097
3003 21.5597 3003 21.7097
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -8301,7 +8305,7 @@ pwr_exe: ...@@ -8301,7 +8305,7 @@ pwr_exe:
2802 12.1056 2802 12.1056
2803 0 2803 0
2804 1 2804 1
2805 19.7597 2805 19.8597
2806 0 2806 0
99 99
99 99
...@@ -9161,10 +9165,10 @@ pwr_exe: ...@@ -9161,10 +9165,10 @@ pwr_exe:
99 99
30 30
3004 O503 3004 O503
3000 14.8056 3000 14.7556
3001 13.2056 3001 13.2056
3002 25.3597 3002 25.4597
3003 24.5097 3003 24.6597
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -9189,7 +9193,7 @@ pwr_exe: ...@@ -9189,7 +9193,7 @@ pwr_exe:
2802 12.1056 2802 12.1056
2803 0 2803 0
2804 1 2804 1
2805 22.7097 2805 22.8097
2806 0 2806 0
99 99
99 99
...@@ -9478,7 +9482,7 @@ pwr_exe: ...@@ -9478,7 +9482,7 @@ pwr_exe:
6967 6967
6968 6968
6969 0 6969 0
6900 31 6900 127
6901 Straight 6901 Straight
6933 0 6933 0
6902 Sine 6902 Sine
...@@ -9489,6 +9493,10 @@ pwr_exe: ...@@ -9489,6 +9493,10 @@ pwr_exe:
6936 3 6936 3
6905 SawTooth 6905 SawTooth
6937 4 6937 4
6906 Triangular
6938 5
6907 StepPyramid
6939 6
99 99
99 99
99 99
...@@ -9497,7 +9505,7 @@ pwr_exe: ...@@ -9497,7 +9505,7 @@ pwr_exe:
3000 14.9556 3000 14.9556
3001 13.2056 3001 13.2056
3002 23.8597 3002 23.8597
3003 23.0097 3003 23.0597
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -9803,10 +9811,10 @@ pwr_exe: ...@@ -9803,10 +9811,10 @@ pwr_exe:
99 99
30 30
3004 O510 3004 O510
3000 17.0556 3000 17.1056
3001 13.2056 3001 13.2056
3002 27.5997 3002 27.6497
3003 26.7497 3003 26.8497
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -9831,7 +9839,7 @@ pwr_exe: ...@@ -9831,7 +9839,7 @@ pwr_exe:
2802 12.1056 2802 12.1056
2803 0 2803 0
2804 1 2804 1
2805 24.9497 2805 24.9997
2806 0 2806 0
99 99
99 99
...@@ -10263,10 +10271,10 @@ pwr_exe: ...@@ -10263,10 +10271,10 @@ pwr_exe:
99 99
30 30
3004 O515 3004 O515
3000 15.6056 3000 15.5056
3001 13.2056 3001 13.2056
3002 29.8397 3002 29.8397
3003 28.9897 3003 29.0397
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -10723,10 +10731,10 @@ pwr_exe: ...@@ -10723,10 +10731,10 @@ pwr_exe:
99 99
30 30
3004 O520 3004 O520
3000 17.5556 3000 17.4556
3001 13.2056 3001 13.2056
3002 32.0797 3002 32.1797
3003 31.2297 3003 31.3797
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -10751,7 +10759,7 @@ pwr_exe: ...@@ -10751,7 +10759,7 @@ pwr_exe:
2802 12.1056 2802 12.1056
2803 0 2803 0
2804 1 2804 1
2805 29.4297 2805 29.5297
2806 0 2806 0
99 99
99 99
...@@ -11183,10 +11191,10 @@ pwr_exe: ...@@ -11183,10 +11191,10 @@ pwr_exe:
99 99
30 30
3004 O525 3004 O525
3000 15.3556 3000 15.2556
3001 13.2056 3001 13.2056
3002 34.3197 3002 34.4197
3003 33.4697 3003 33.6197
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -11211,7 +11219,7 @@ pwr_exe: ...@@ -11211,7 +11219,7 @@ pwr_exe:
2802 12.1056 2802 12.1056
2803 0 2803 0
2804 1 2804 1
2805 31.6697 2805 31.7697
2806 0 2806 0
99 99
99 99
...@@ -11643,10 +11651,10 @@ pwr_exe: ...@@ -11643,10 +11651,10 @@ pwr_exe:
99 99
30 30
3004 O530 3004 O530
3000 16.8056 3000 16.9056
3001 13.2056 3001 13.2056
3002 36.5597 3002 36.5597
3003 35.7097 3003 35.7597
3008 326 3008 326
3010 4 3010 4
3011 2 3011 2
...@@ -12318,5 +12326,375 @@ pwr_exe: ...@@ -12318,5 +12326,375 @@ pwr_exe:
99 99
99 99
99 99
30
3004 O536
3000 28.9056
3001 25.6556
3002 22.5097
3003 21.7097
3008 326
3010 4
3011 2
3007 0
3006
3005
9
900 4
901 303
904 326
902 RampUp
903
7
700 1.1
701 2.5
99
99
3009
28
2800 1
2801 0
2802 24.5556
2803 0
2804 1
2805 19.8597
2806 0
99
99
27
2703 334
2704 330
2731 310
2722 338
2705 330
2723 338
2706 334
2732 10000
2708 0
2709 0
2710 0
2711 0
2712 0
2713 0
2714 0
2715 0
2720 0
2725 0
2726 0
2702 0
2701
2700
10
1000 pwrct_valueinputmediumbg
1002 O537
1005
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1006 36.594
1007 30.7458
1008 22.8467
1009 21.4902
1013 36.594
1014 30.7458
1015 22.8467
1016 21.4902
1003
0
0
0
0
0
0
0
0
0
0
1004
1001
7
700 8.5
701 7.9
99
1010
1011
1018
1019
1020
1021
1022
1023
1024
1025
1012 0
1017 9999
1027 9999
1026 35454972
1028 0
1029
99
2707
28
2800 1.77219
2801 0
2802 31.0116
2803 0
2804 1.04348
2805 21.6467
2806 0
99
2716 0
2718
2717
2719 0
2724 1
2727 0
2728 303
2729 4
2730 0
2721
1
100 1024
105 0
101 4096
106 0
102 6
103 0
12
1200 $object.RampUp##Float32
1201 %10.3f
1202 1
1203 1
1204 0
1205
1206 0
99
13
1302 0
1303 0
1304 0
1305 0
1306 0
1307
1308
1309 0
1310 0
1311 0
99
99
99
30
3004 O538
3000 30.0056
3001 25.6556
3002 23.9597
3003 23.1597
3008 326
3010 4
3011 2
3007 0
3006
3005
9
900 4
901 303
904 326
902 RampDown
903
7
700 1.1
701 2.5
99
99
3009
28
2800 1
2801 0
2802 24.5556
2803 0
2804 1
2805 21.3097
2806 0
99
99
27
2703 334
2704 330
2731 310
2722 338
2705 330
2723 338
2706 334
2732 10000
2708 0
2709 0
2710 0
2711 0
2712 0
2713 0
2714 0
2715 0
2720 0
2725 0
2726 0
2702 0
2701
2700
10
1000 pwrct_valueinputmediumbg
1002 O539
1005
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1006 36.594
1007 30.7458
1008 24.2967
1009 22.9402
1013 36.594
1014 30.7458
1015 24.2967
1016 22.9402
1003
0
0
0
0
0
0
0
0
0
0
1004
1001
7
700 8.5
701 7.9
99
1010
1011
1018
1019
1020
1021
1022
1023
1024
1025
1012 0
1017 9999
1027 9999
1026 35454972
1028 0
1029
99
2707
28
2800 1.77219
2801 0
2802 31.0116
2803 0
2804 1.04348
2805 23.0967
2806 0
99
2716 0
2718
2717
2719 0
2724 1
2727 0
2728 303
2729 4
2730 0
2721
1
100 1024
105 0
101 4096
106 0
102 6
103 0
12
1200 $object.RampDown##Float32
1201 %10.3f
1202 1
1203 1
1204 0
1205
1206 0
99
13
1302 0
1303 0
1304 0
1305 0
1306 0
1307
1308
1309 0
1310 0
1311 0
99
99
99
99 99
99 99
! Generated by wb_print_wbl 07-NOV-2019 13:42:48.29 ! Generated by wb_print_wbl 10-FEB-2020 16:09:47.11
! Volume Simul ! Volume Simul
! Version V5.7.0 ! Version V5.7.0
Volume Simul $ClassVolume 0.0.0.8 Volume Simul $ClassVolume 0.0.0.8
Body SysBody 01-JAN-1970 01:00:00.00 Body SysBody 01-JAN-1970 01:00:00.00
Attr NextOix = "_X80" Attr NextOix = "_X82"
Attr NextCix = "_X28" Attr NextCix = "_X28"
Attr NextTix[0] = "_X8" Attr NextTix[0] = "_X8"
EndBody EndBody
...@@ -81,6 +81,20 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -81,6 +81,20 @@ Volume Simul $ClassVolume 0.0.0.8
Attr Value = 4 Attr Value = 4
EndBody EndBody
EndObject EndObject
Object Triangular $Value 81 28-JAN-2020 15:27:17.79
Body SysBody 28-JAN-2020 15:27:31.71
Attr Text = "Triangular"
Attr PgmName = "Triangular"
Attr Value = 5
EndBody
EndObject
Object StepPyramid $Value 82 28-JAN-2020 15:31:53.16
Body SysBody 28-JAN-2020 15:32:05.53
Attr Text = "StepPyramid"
Attr PgmName = "StepPyramid"
Attr Value = 6
EndBody
EndObject
EndObject EndObject
EndObject EndObject
Object Class $ClassHier 21 28-FEB-2016 17:06:54.40 Object Class $ClassHier 21 28-FEB-2016 17:06:54.40
...@@ -1581,7 +1595,7 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -1581,7 +1595,7 @@ Volume Simul $ClassVolume 0.0.0.8
Object RtBody $ObjBodyDef 1 06-FEB-2019 15:11:38.90 Object RtBody $ObjBodyDef 1 06-FEB-2019 15:11:38.90
Body SysBody 06-FEB-2019 15:11:38.90 Body SysBody 06-FEB-2019 15:11:38.90
Attr StructName = "Sim_SignalGenerator" Attr StructName = "Sim_SignalGenerator"
Attr NextAix = "_X41" Attr NextAix = "_X43"
EndBody EndBody
Object Description $Attribute 21 06-FEB-2019 15:11:38.90 Object Description $Attribute 21 06-FEB-2019 15:11:38.90
Body SysBody 06-FEB-2019 15:11:38.90 Body SysBody 06-FEB-2019 15:11:38.90
...@@ -1651,6 +1665,20 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -1651,6 +1665,20 @@ Volume Simul $ClassVolume 0.0.0.8
Attr TypeRef = "pwrs:Type-$Float32" Attr TypeRef = "pwrs:Type-$Float32"
EndBody EndBody
EndObject EndObject
Object RampUp $Attribute 41 28-JAN-2020 17:17:09.14
Body SysBody 28-JAN-2020 17:17:10.50
Attr PgmName = "RampUp"
Attr Size = 4
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
Object RampDown $Attribute 42 28-JAN-2020 17:17:19.26
Body SysBody 28-JAN-2020 17:17:21.07
Attr PgmName = "RampDown"
Attr Size = 4
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
Object ActualValueMin $Attribute 30 06-FEB-2019 15:11:38.90 Object ActualValueMin $Attribute 30 06-FEB-2019 15:11:38.90
Body SysBody 06-FEB-2019 15:11:38.90 Body SysBody 06-FEB-2019 15:11:38.90
Attr PgmName = "ActualValueMin" Attr PgmName = "ActualValueMin"
...@@ -2227,7 +2255,7 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -2227,7 +2255,7 @@ Volume Simul $ClassVolume 0.0.0.8
! For plc coding the function object Sim_ModelMLP_Fo is used. ! For plc coding the function object Sim_ModelMLP_Fo is used.
! Create a function object in the plc editor and connect it to the ! Create a function object in the plc editor and connect it to the
! current object with the connect function. ! current object with the connect function.
! !
! @b See also ! @b See also
! @classlink Sim_ModelMLP_Fo basecomponent_sim_modelmlp_fo.html ! @classlink Sim_ModelMLP_Fo basecomponent_sim_modelmlp_fo.html
!*/ !*/
...@@ -2240,8 +2268,15 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -2240,8 +2268,15 @@ Volume Simul $ClassVolume 0.0.0.8
Object RtBody $ObjBodyDef 1 07-NOV-2019 12:25:46.68 Object RtBody $ObjBodyDef 1 07-NOV-2019 12:25:46.68
Body SysBody 07-NOV-2019 12:26:18.41 Body SysBody 07-NOV-2019 12:26:18.41
Attr StructName = "Sim_ModelMLP" Attr StructName = "Sim_ModelMLP"
Attr NextAix = "_X22" Attr NextAix = "_X28"
EndBody EndBody
Object Description $Attribute 27 10-FEB-2020 16:09:23.86
Body SysBody 10-FEB-2020 16:09:23.86
Attr PgmName = "Description"
Attr Size = 80
Attr TypeRef = "pwrs:Type-$String80"
EndBody
EndObject
!/** !/**
! Model file exported from the sev_analyser. ! Model file exported from the sev_analyser.
!*/ !*/
...@@ -2252,6 +2287,24 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -2252,6 +2287,24 @@ Volume Simul $ClassVolume 0.0.0.8
Attr TypeRef = "pwrs:Type-$String40" Attr TypeRef = "pwrs:Type-$String40"
EndBody EndBody
EndObject EndObject
Object ScaleCoeff0 $Attribute 22 04-FEB-2020 16:45:53.94
Body SysBody 04-FEB-2020 16:46:15.09
Attr PgmName = "ScaleCoeff0"
Attr Size = 68
Attr Flags = 2
Attr Elements = 17
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
Object ScaleCoeff1 $Attribute 23 04-FEB-2020 16:46:20.26
Body SysBody 04-FEB-2020 16:46:20.26
Attr PgmName = "ScaleCoeff1"
Attr Size = 68
Attr Flags = 2
Attr Elements = 17
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
!/** !/**
! Number of hidden layers. ! Number of hidden layers.
!*/ !*/
...@@ -2297,6 +2350,28 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -2297,6 +2350,28 @@ Volume Simul $ClassVolume 0.0.0.8
Attr TypeRef = "pwrs:Type-$Status" Attr TypeRef = "pwrs:Type-$Status"
EndBody EndBody
EndObject EndObject
Object Value $Attribute 24 10-FEB-2020 15:05:29.56
Body SysBody 10-FEB-2020 15:05:45.84
Attr PgmName = "Value"
Attr Size = 4
Attr Flags = 1040
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
Object ValueMin $Attribute 26 10-FEB-2020 15:10:54.88
Body SysBody 10-FEB-2020 15:11:23.85
Attr PgmName = "ValueMin"
Attr Size = 4
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
Object ValueMax $Attribute 25 10-FEB-2020 15:11:05.33
Body SysBody 10-FEB-2020 15:11:31.33
Attr PgmName = "ValueMax"
Attr Size = 4
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
!/** !/**
! @Summary The plc function object connected to this object. ! @Summary The plc function object connected to this object.
! The plc function object connected to this object. ! The plc function object connected to this object.
...@@ -2312,7 +2387,25 @@ Volume Simul $ClassVolume 0.0.0.8 ...@@ -2312,7 +2387,25 @@ Volume Simul $ClassVolume 0.0.0.8
EndObject EndObject
EndObject EndObject
Object Template Sim_ModelMLP 2154528768 07-NOV-2019 12:25:46.68 Object Template Sim_ModelMLP 2154528768 07-NOV-2019 12:25:46.68
Body RtBody 01-JAN-1970 01:00:00.00 Body RtBody 10-FEB-2020 16:09:43.26
Attr ScaleCoeff1[0] = 1.000000e+00
Attr ScaleCoeff1[1] = 1.000000e+00
Attr ScaleCoeff1[2] = 1.000000e+00
Attr ScaleCoeff1[3] = 1.000000e+00
Attr ScaleCoeff1[4] = 1.000000e+00
Attr ScaleCoeff1[5] = 1.000000e+00
Attr ScaleCoeff1[6] = 1.000000e+00
Attr ScaleCoeff1[7] = 1.000000e+00
Attr ScaleCoeff1[8] = 1.000000e+00
Attr ScaleCoeff1[9] = 1.000000e+00
Attr ScaleCoeff1[10] = 1.000000e+00
Attr ScaleCoeff1[11] = 1.000000e+00
Attr ScaleCoeff1[12] = 1.000000e+00
Attr ScaleCoeff1[13] = 1.000000e+00
Attr ScaleCoeff1[14] = 1.000000e+00
Attr ScaleCoeff1[15] = 1.000000e+00
Attr ScaleCoeff1[16] = 1.000000e+00
Attr ValueMax = 1.000000e+02
EndBody EndBody
EndObject EndObject
EndObject EndObject
......
...@@ -8,6 +8,13 @@ class Error(Exception): ...@@ -8,6 +8,13 @@ class Error(Exception):
def __str__(self): def __str__(self):
return self.str return self.str
class SyntaxError(Error):
def __init__(self, status, str):
self.str = str
super(Error, self).__init__(status, str)
def __str__(self):
return self.str
def translateFilename(name): def translateFilename(name):
if name[:1] == '$': if name[:1] == '$':
idx = name.find('/') idx = name.find('/')
......
...@@ -75,7 +75,47 @@ def hinton(matrix, max_weight=None, ax=None): ...@@ -75,7 +75,47 @@ def hinton(matrix, max_weight=None, ax=None):
ax.autoscale_view() ax.autoscale_view()
ax.invert_yaxis() ax.invert_yaxis()
def minmax_scale(ser):
"""MinMax scaler [0,1]."""
max = ser.max()
min = ser.min()
if min == max:
coeff0 = 0.0
coeff1 = 1.0 / max
ser = ser / max
else:
coeff0 = -min/(max - min)
coeff1 = 1.0/(max - min)
ser = ser * coeff1 + coeff0
return ser, coeff0, coeff1;
def minmax2_scale(ser):
"""MinMax scaler [-1,1]."""
max = ser.max()
min = ser.min()
if min == max:
coeff0 = 0.0
coeff1 = 1.0 / max
ser = ser / max
else:
coeff0 = -2.0*min/(max - min) - 1
coeff1 = 2.0/(max - min)
ser = ser * coeff1 + coeff0
return ser, coeff0, coeff1;
def standard_scale(ser):
"""Standard scaler."""
mean = ser.mean()
std = ser.std()
if std == 0:
coeff0 = 0.0
coeff1 = 1.0 / mean
ser = ser / mean
else:
coeff0 = -mean/std
coeff1 = 1.0/std
ser = ser * coeff1 + coeff0
return ser, coeff0, coeff1;
class WData: class WData:
"""WData class, container for measuring data. """WData class, container for measuring data.
...@@ -102,6 +142,8 @@ class WData: ...@@ -102,6 +142,8 @@ class WData:
OP_CURVE = 13 OP_CURVE = 13
OP_CONSTANT = 14 OP_CONSTANT = 14
OP_SHIFT = 15 OP_SHIFT = 15
OP_SCALE = 16
OP_MSHIFT = 17
operations = ((OP_NO, 'No'), operations = ((OP_NO, 'No'),
(OP_COPY, 'Copy'), (OP_COPY, 'Copy'),
...@@ -118,7 +160,9 @@ class WData: ...@@ -118,7 +160,9 @@ class WData:
(OP_DIVIDE, 'Divide'), (OP_DIVIDE, 'Divide'),
(OP_CURVE, 'Curve'), (OP_CURVE, 'Curve'),
(OP_CONSTANT, 'Const'), (OP_CONSTANT, 'Const'),
(OP_SHIFT, 'Shift')) (OP_SHIFT, 'Shift'),
(OP_SCALE, 'Scale'),
(OP_MSHIFT, 'MShift'))
def __init__(self): def __init__(self):
self.set = False self.set = False
...@@ -382,7 +426,7 @@ class WData: ...@@ -382,7 +426,7 @@ class WData:
i += 1 i += 1
if len(cix) != 1: if len(cix) != 1:
raise co.Error(0, "Select one attributes") raise co.Error(0, "Select one attribute")
return return
if cix[0] == len(self.wdname) - 1: if cix[0] == len(self.wdname) - 1:
...@@ -586,7 +630,7 @@ class WData: ...@@ -586,7 +630,7 @@ class WData:
i = len(opv) - 1 i = len(opv) - 1
for op in reversed(opv): for op in reversed(opv):
self.exec_op(op, par1v[i], par2v[i]) self.exec_op(op, par1v[i], par2v[i], 0)
i -= 1 i -= 1
self.formula_trim(formulas) self.formula_trim(formulas)
...@@ -631,7 +675,7 @@ class WData: ...@@ -631,7 +675,7 @@ class WData:
i += 1 i += 1
self.wd.columns = self.wdcol self.wd.columns = self.wdcol
def exec_op(self, op, par1, par2): def exec_op(self, op, par1, par2, par3):
arg1 = None arg1 = None
found1 = False found1 = False
...@@ -646,6 +690,9 @@ class WData: ...@@ -646,6 +690,9 @@ class WData:
if op == self.OP_SHIFT: if op == self.OP_SHIFT:
arg1 = par2 arg1 = par2
if op == self.OP_MSHIFT:
arg1 = par2
arg2 = par3
elif op == self.OP_CURVE: elif op == self.OP_CURVE:
arg1 = par2 arg1 = par2
elif op == self.OP_CONSTANT: elif op == self.OP_CONSTANT:
...@@ -658,9 +705,9 @@ class WData: ...@@ -658,9 +705,9 @@ class WData:
break break
i2 += 1 i2 += 1
self.op_exec(op, i1, i2, arg1) self.op_exec(op, i1, i2, arg1, 0)
def op_exec(self, op, cix1, cix2, arg1): def op_exec(self, op, cix1, cix2, arg1, arg2):
if cix1 != -1: if cix1 != -1:
ser = pd.Series(self.wd[self.wdcol[cix1]]) ser = pd.Series(self.wd[self.wdcol[cix1]])
...@@ -755,7 +802,7 @@ class WData: ...@@ -755,7 +802,7 @@ class WData:
elif op == self.OP_CURVE: elif op == self.OP_CURVE:
if arg1 == '': if arg1 == '':
raise co.Error(0, 'No curve file is supplied') raise co.SyntaxError(0, 'No curve file is supplied')
fname = co.translateFilename(arg1) fname = co.translateFilename(arg1)
curveframe = pd.read_csv(fname, header=None) curveframe = pd.read_csv(fname, header=None)
...@@ -766,14 +813,20 @@ class WData: ...@@ -766,14 +813,20 @@ class WData:
colname = "Curve(" + self.wdname[cix1] + "," + arg1 + ")" colname = "Curve(" + self.wdname[cix1] + "," + arg1 + ")"
elif op == self.OP_CONSTANT: elif op == self.OP_CONSTANT:
value = float(arg1) try:
value = float(arg1)
except:
raise co.SyntaxError(0, 'Missing value or sytax error')
const = [value] * len(self.wd) const = [value] * len(self.wd)
ser = pd.Series(const) ser = pd.Series(const)
colname = "Const(" + str(value) + ")" colname = "Const(" + str(value) + ")"
elif op == self.OP_SHIFT: elif op == self.OP_SHIFT:
shiftvalue = int(arg1) try:
shiftvalue = int(arg1)
except:
raise co.SyntaxError(0, 'Missing value or syntax error')
shift = [] shift = []
i = 0 i = 0
...@@ -792,6 +845,47 @@ class WData: ...@@ -792,6 +845,47 @@ class WData:
i += 1 i += 1
ser = pd.Series(shift) ser = pd.Series(shift)
colname = "Shift(" + self.wdname[cix1] + "," + str(shiftvalue) + ")" colname = "Shift(" + self.wdname[cix1] + "," + str(shiftvalue) + ")"
elif op == self.OP_MSHIFT:
try:
shiftnum = int(arg2)
shiftarg1 = int(arg1)
except:
raise co.SyntaxError(0, 'Missing value or syntax error')
j = 0
while j < shiftnum:
shiftvalue = shiftarg1 * (j + 1)
shift = []
i = 0
for val in ser.values:
if shiftvalue > 0:
if i < shiftvalue:
val = 0
else:
val = ser.values[i-shiftvalue]
else:
if i - shiftvalue >= len(self.wd):
val = 0
else:
val = ser.values[i-shiftvalue]
shift.append(val)
i += 1
ser_shift = pd.Series(shift)
colname = "Shift(" + self.wdname[cix1] + "," + str(shiftvalue) + ")"
if j < shiftnum - 1:
idx = len(self.wdname)
self.wdname.append(colname)
colname = "A" + str(idx+1)
self.wdcol.append(colname)
self.wd[self.wdcol[idx]] = ser_shift
j += 1
ser = ser_shift
elif op == self.OP_SCALE:
ser, coeff0, coeff1 = minmax_scale(ser)
colname = "Scale(" + self.wdname[cix1] + ")"
print 'Scale Coeff0', coeff0, 'Coeff1', coeff1
else: else:
raise co.Error(0, 'No action is selected') raise co.Error(0, 'No action is selected')
......
...@@ -76,4 +76,5 @@ reduinit <Redundancy init error> /error ...@@ -76,4 +76,5 @@ reduinit <Redundancy init error> /error
reduconfig <Redundancy not configured> /error reduconfig <Redundancy not configured> /error
filesyntax <Syntax error in file> /error filesyntax <Syntax error in file> /error
file <No such file> /error file <No such file> /error
mpc_shiftval <Number of shift values not matching model size> /error
.end .end
...@@ -290,6 +290,9 @@ static wbl_sSym classes[] = { { "pwr_eClass_ClassDef", pwr_eClass_ClassDef }, ...@@ -290,6 +290,9 @@ static wbl_sSym classes[] = { { "pwr_eClass_ClassDef", pwr_eClass_ClassDef },
{ "BaseComponent:Class-CompModePID", pwr_cClass_CompModePID }, { "BaseComponent:Class-CompModePID", pwr_cClass_CompModePID },
{ "BaseComponent:Class-CompPID", pwr_cClass_CompPID }, { "BaseComponent:Class-CompPID", pwr_cClass_CompPID },
{ "BaseComponent:Class-CompModeIMC", pwr_cClass_CompModeIMC }, { "BaseComponent:Class-CompModeIMC", pwr_cClass_CompModeIMC },
{ "BaseComponent:Class-CompMPC", pwr_cClass_CompMPC },
{ "BaseComponent:Class-CompMPC_MLP", pwr_cClass_CompMPC_MLP },
{ "BaseComponent:Class-CompMPC_Monitor", pwr_cClass_CompMPC_Monitor },
{ "BaseComponent:Class-CompIMC", pwr_cClass_CompIMC }, { 0, 0 } }; { "BaseComponent:Class-CompIMC", pwr_cClass_CompIMC }, { 0, 0 } };
/* Datatypes */ /* Datatypes */
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment