Ausgabe von Statusmeldungen in ST

Luzie

Level-1
Beiträge
77
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich bin neu hier und schon gleich eine Frage die ich "da Anfänger" noch nicht so lösen kann.
Mein Problem ist.
Ich habe ein Programm geschrieben wo ich Fehlermeldungen mit ausgeben möchte. Soweit so gut. Die einzelnen Bausteine (ST) geben auch die Werte aus so wie sie Sollen. Aber nun möchte ich das ganze als eine Zusammenfassung ausgeben.
Code:
                                  HEX           DEC   
ReVPI 16#04 Rot Anlage aus      00000100         4
ReVPI 16#03 Grün Anlage ein     00000010         3

*** PH ORP Regelung ***
PH< ORP<    16#0A               10100000        10
PH< ORP>    16#0C               00001100        12
PH> ORP>    16#14               00010100         20
PH> ORP<    16#12               00010010        18
PH= ORP>    16#04               00000100         4
PH= ORP<    16#02               00000010          2
ORP= PH<    16#08               00000100         8
ORP= PH>    16#10               00010000        16

*** Füllstandskontrolle ***
Füllstand>1360 16#01            00000001          1
Füllstand< 500 16#02            00000010         2

*** Fehler Solaranlage ***
BT>   33    16#02               00000010          2
ST>  150    16#04               00000100         4
SPT>  60    16#08               00000100         8
WWT>  60    16#10               00010000        16

*** Taktgeber ***
16#01 Pumpe 100% kein Fehler    00000001         1
16#00 Pumpe 75%  kein Fehler    00000000         0
16#11 Pumpe 50%  kein Fehler    00010001        17
16#1E Pumpe mit 10%             00011110         30

*** Flowmeter ***
16#1C  kein-Durchfluss.         00011100        28

***Fehler Flowmeter und Takt ***
16#1E,16#1E                     00111010        58

*** Fehler FM,Takt und PH ORP ***

16#0A,16#1C,16#1E               01000100         68
16#0C,16#1C,16#1E               01000110        70
16#14,16#1C,16#1E               01001110         78
16#12,16#1C,16#1E               01001100         76
16#04,16#1C,16#1E               00111110        62
16#02,16#1C,16#1E               00111100        60
16#08,16#1C,16#1E               01000010         66
16#10,16#1C,16#1E               01001010         74
Dies wären die Meisten Meldungen die ich ausgeben möchte, Aber wie Fasse ich diese in ST zusammen so das er nicht immer nur einen Fehler anzeigt sondern diese zusammen rechnet und dann den Fehlerwert ausgibt?
Leider habe ich keine Ahnung wie ich das anstellen soll, da es auf diese Art nicht Funktioniert
Code:
    if (PH_OPR_Regelung =16#02
        OR PH_OPR_Regelung =16#04 
        OR PH_OPR_Regelung =16#04 
        OR PH_OPR_Regelung =16#08 
        OR PH_OPR_Regelung =16#10 
        OR PH_OPR_Regelung =16#12
        OR PH_OPR_Regelung =16#14 
        OR PH_OPR_Regelung =16#0A 
        OR PH_OPR_Regelung =16#0C 
        OR Taktgeber       =16#01 
        OR Taktgeber       =16#11 
        OR Taktgeber       =16#1E
        OR WinterControl   =16#01
        OR WinterControl   =16#02
        OR Solarregelung   =16#02
        OR Solarregelung   =16#04
        OR Solarregelung   =16#08
        OR Solarregelung   =16#10
        OR Flowmeter       =16#1C)THEN 
        Wert := TRUE; 
END_IF;
Kann mir da einer einen Tip geben wie das ganze Funktioniert?

Danke im Vorraus
 
Beschreibe mal dein Problem etwas einfacher mit einem Beispiel.
Wie soll die Ausgabe denn sein?

VG CAS
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alo ich habe in einen Baustein die Meldung 16#01 stehen und in einem anderen die Meldung 16#10. diese sollen zusammengefasst werden und dann als eine meldung wieder raus.
Ich möchte das ganze dann auf der Visualisierung als eine Fehlermeldung mit text angezeigt bekommen.
Also wenn z.b. 16#01 fehler x ist und 16#10 fehler y dann soll er diese zusammen als eine zahl ausgeben wo ich dann sagen kann Fehler x,y ist aufgetreten.
wenn es x,y und z gibt soll er eben das ausgeben als eine nummer.
 
Ganz einfach.....
16#01=0001
16#10=0010
AND-----------
16#11=0011

Im Programm:
Ausgabe:INT;
INT:=0;
Ausgabe.0=Stoerung1;
Ausgabe.1=Stoerung2;

VG CAS
 
Danke Cas
es Funktioiert nun so wie es soll. einzige was ich noch habe ist da es ja ein BYTE wert ist was als IN kommt und ich es in WORD wieder weiterreiche.

nun wollte ich das ganze als INT wert ausgebenhabe dazu

_Ausgabe := TO_INT (Ausgabe) *10; eingeben. Es wird kein Fehler angezeigt das es Falsch wäre, aber leider steht dann als Ausgabe eine 0 da und kein andere Wert wenn ich diesen absichtlich veruhrsache.

Wenn ich dies so lasse BYTE als IN und WORD als Out bekomme ich in der Anzeige eine Kommastelle. Also nicht 1 sondern 0.1 oder ensprechende werte
Wie kann ich das ganze *10 nehmen so das es passt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ganz einfach.....
16#01=0001
16#10=0010
AND-----------
16#11=0011
Gut gemeint, aber falsch formuliert: Das Beispiel zeigt eine ODER-Verknüpfung (richtig!), behauptet aber AND(falsch!).

Luzie.jpg
Ein Teil der Aufgabenstellung ist leider auch schon widersprüchlich bzw. rätselhaft.
Dort, wo ich ODER erwartet hätte, sind Summen berechnet.
Das, was als HEX bezeichnet ist, ist BINÄR.
Ob nun HEX oder BINARY oder DEC gelten soll, wenn sie unterschiedliches aussagen ...
Zusamenfassen klingt nach einem guten Vorsatz. Die Wirkungsweise wird aber erst langsam sichtbar: also jede Meldung belegt ein anderes Bit und man kann sie deshalb mittels ODER zusammenfassen und später wieder eindeutig aufdrieseln und zuordnen.
Die gezeigte Addition, die anscheinend hinter z.B. "16#0A,16#1C,16#1E" steckt, ist dann allerdings nicht sehr "zweckdienlich".
Gruss, Heinileini

PS: in ...
Code:
[LEFT][COLOR=#222222][FONT=Tahoma]if (PH_OPR_Regelung =16#02[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#04 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#04 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#08 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#10 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#12[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#14 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#0A [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR PH_OPR_Regelung =16#0C [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Taktgeber       =16#01 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Taktgeber       =16#11 [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Taktgeber       =16#1E[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR WinterControl   =16#01[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR WinterControl   =16#02[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Solarregelung   =16#02[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Solarregelung   =16#04[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Solarregelung   =16#08[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Solarregelung   =16#10[/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        OR Flowmeter       =16#1C)THEN [/FONT][/COLOR]
[COLOR=#222222][FONT=Tahoma]        Wert := TRUE; [/FONT][/COLOR][/LEFT]

... fehlt der ELSE-Zweig, der Wert auf FALSE setzt, wenn kein Fehler ansteht.
Gebildet wird hier auch nur 1 Bit, das als SammelMeldung benutzt werden kann, sich aber nicht wieder in einzelne Meldungen aufsplitten lässt.
Die Vergleiche mit den Konstanten in den Abfragen sind auch nur dann TRUE, wenn in dem jeweiligen Byte keine Einsen von anderen Meldungen gesetzt sind.
Am sinnvollsten statt 5 Bytes nur 4 Bytes belegen und in ein DWORD legen und vorsichtshalber das höchstwertige Bit nicht belegen.
Z.B. Meldung = Byte0 * 2^24 + Byte1 * 2^16 + Byte2 * 2^8 + Byte3
 
Zuletzt bearbeitet:
... Wenn ich dies so lasse BYTE als IN und WORD als Out bekomme ich in der Anzeige eine Kommastelle. Also nicht 1 sondern 0.1 oder ensprechende werte
Wie kann ich das ganze *10 nehmen so das es passt?
Wenn die Ausgabe INT ist, dann dürfte kein DezimalPunkt erscheinen.

Wieviele MeldungsBits hast Du denn insgesamt?

...
nun wollte ich das ganze als INT wert ausgeben habe dazu _Ausgabe := TO_INT (Ausgabe) *10; eingeben. Es wird kein Fehler angezeigt das es Falsch wäre
...

Multiplizieren mit 10 ist ja auch nicht verboten! Anders Division durch 0 oder Wurzel aus negativer Zahl.
Wenn der Computer Deine Gedanken lesen könnte, bräuchtest Du nicht selbst zu programmieren ;o)
Gruss, Heinileini
 
Danke Heinilein,

Leider bin ich noch nicht so Begabt was Programmieren angeht. Ich versuche mich aber daran und immer was dazu zu lernen.
zum besseren Verständniss des ganzen hier mal der Komplette Code den ich zusammengeschustert habe.

Code:
FUNCTION_BLOCK error_log {altName := "error_log"; vNameAlignment := "top"; width := 400; bgColor := "green"; }

VAR_INPUT
    Normalbetrieb   : BYTE := 0; 
    Filterregelung  : BYTE := 0; 
    Pumpenstrg      : BYTE := 0; 
    WinterControl   : BYTE := 0; 
    Taktgeber       : BYTE := 0; 
    Solarregelung   : BYTE := 0; 
    PH_OPR_Regelung : BYTE := 0; 
    Flowmeter        : BYTE := 0;
END_VAR

VAR_OUTPUT
    SPS_Status        : WORD;
    Wert            : WORD;
END_VAR

IF (Normalbetrieb = 16#03)      THEN Wert := 1; // Störung, Anlage ausgeschaltet
END_IF;

IF (WinterControl = 16#01)      THEN Wert := 2; // Wasserstand über max
END_IF;
IF (WinterControl = 16#02)      THEN Wert := 3; // Wasserstand unter min
END_IF;

IF (Taktgeber = 16#1E)            THEN Wert := 4; // Pumpenfehler, Motor Defekt, Kabelbruch 
END_IF;

IF (Flowmeter = 16#1C)            THEN Wert := 5; // Flowmeter defekt,Kabelbruch, Verstopft, Wasserverlust 
END_IF;

IF (PH_OPR_Regelung = 16#02)    THEN Wert := 6; //  ORP unter min
END_IF;
IF (PH_OPR_Regelung = 16#04)    THEN Wert := 7; //  ORP über max
END_IF;
IF (PH_OPR_Regelung = 16#08)    THEN Wert := 8; //  PH unter min
END_IF;
IF (PH_OPR_Regelung = 16#10)    THEN Wert := 9; //  PH über max
END_IF;
IF (PH_OPR_Regelung = 16#12)    THEN Wert := 10; //  PH über max ORP unter min
END_IF;
IF (PH_OPR_Regelung = 16#14)    THEN Wert := 11; //  PH ORP über max
END_IF;
IF (PH_OPR_Regelung = 16#0C)    THEN Wert := 12; //  PH unter min ORP über max
END_IF;
IF (PH_OPR_Regelung = 16#0A)    THEN Wert := 13; //  PH ORP uner min
END_IF;

END_FUNCTION_BLOCK

so wie es nun ist übergibt er es so wie es sein sollte an den Modbus. Dadurch das ich das aber als WORD ausgebe habe ich aber die kommastelle drinne, diese wollte ich aber weg bekommen indem ich das *10 rechne oder gibt es eine andere Lösung dafür diese werte Auszugeben?

gruß
 
Hallo PN/DP

Wenn ich das ganze auf der Weboberfläche habe
Ausgabe Modbus.JPG

Da es als Word ausgeben wird habe ich die Kommastelle in der Anzeige, dort soll aber nur eine 1 stehen und keine 0.1
 
Wenn ich dies so lasse BYTE als IN und WORD als Out bekomme ich in der Anzeige eine Kommastelle. Also nicht 1 sondern 0.1 oder ensprechende werte
so wie es nun ist übergibt er es so wie es sein sollte an den Modbus. Dadurch das ich das aber als WORD ausgebe habe ich aber die kommastelle drinne
Da es als Word ausgeben wird habe ich die Kommastelle in der Anzeige
Die Kommastelle kommt sicher nicht davon, ob Du den Wert als WORD oder BYTE oder INT ausgibst.

Was hat es mit dem erwähnten Modbus auf sich? Da über Modbus so ziemlich alles in Words "gequetscht" wird und als Word oder mehrere Words übertragen wird, kommt es auf den Empfänger drauf an, die Bitmuster in den Words richtig zu interpretieren und die ursprünglichen Datentypen zu rekonstruieren (und evtl. zu konvertieren). Was ist der Modbus-Empfänger, wie verarbeitet der die Daten?

Wie ist bei der Weboberfläche-Programmierung die Ausgabe des Wertes programmiert? Hattest Du schon mal eine Anzeige ohne Kommastelle? Kann der Wert auch hexadezimal ausgegeben werden?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das ist etwas Kompliziert das ganze zu erklären. Aber ich versuche es mal.
Basis RevolutionPi mit Virtuellen Modbusgeräten.
Webserver mit modbus über winsocket
zur verarbeitung der Daten für die Visu hilt Javascript.
Ok das mit dem 0.1 habe ich behoben nun steht alles ohne . da musste in die js datei noch mit *10 gerechnet werden.

Aber es ist gelöst nun. Ansicht stimmt Ausgabetext anhand der einzelnen Bits wird auch angezeigt. Somit ist das Problem nun vom Tisch.

gruß
 
Zurück
Oben