Step 7 FB41: Variable an TI

kai9r

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe folgendes Problem: Eine einfache Regelung mit einem PI-Regler soll mit einem FB41 realisiert werden. Von einem Simulationsprogramm (Promod-Pro) bekomme ich für die Verstärkung P und die Nachstellzeit I jeweils ein Eingangsbyte. Nun rangiere ich die Bytes in einen Datenbaustein und arbeite in meinem Programm nur noch mit den Datenbausteinen. Problem ist nun, dass der Regler nur als reiner P-Regler arbeitet und meinen I-Anteil nicht erkennt. Wenn ich im Programm direkt an den FB41 schreibe " Ti --> t#10s " dann funktioniert es.

Ich habe die Umwandlung wie folgt gemacht:

EB1 --> rangiert als WORD auf DB10.DBW2

DB10.DBW2 über folgenden Code in ein DB10.DBD4 (TIME) normiert:

//
L DB10.DBW2
ITD
DTR
T DB10.DBD4
//

Ich hoffe mir kann jemand helfen! Danke im Vorraus!
Kai
 
Was für eine Einheit hat die Nachstellzeit am Eingangsbyte?
Das müsste man noch berücksichtigen, weil sich der TI ms erwartet.
Also wenn das EB in Sekunden daherkommt, vorher mit 1000 multiplizieren.
 
Wie ist den Wert in DB10.DBW2 formattiert ?
Ist es vielleicht Sekunden ?
Wenn Ja, dann muss ein bisschen konvertierung zu, weil TIME zählt in Milli-Sekunden.

Code:
[COLOR=#333333]L      DB10.DBW2[/COLOR]
[COLOR=#333333]ITD[/COLOR]
[COLOR=#333333]L      L#1000
[/COLOR]*D                    // Von Sekunden nach Milli-Sekunden.
[COLOR=#333333]T      DB10.DBD4[/COLOR]
 
Danke für die bisherigen Antworten!

Also ich kann die Anteile P und I verstellen von 0,1 bis 25,5 im Promod-Pro. 0,1 entspricht dann einer 1 im EB1. 25,5 würde einer 255 im EB1 entsprechen.

Wenn ich nun das EB in einen Datenbaustein rangieren möchte, deklariere ich diesen dann als BYTE oder als WORD? Also DB10.DBB2 oder DBW2?
 
Nimm ruhig DBW2, mit WORD zu hantieren ist meiner Meinung nach sauberer, als mit BYTE, ganz sauber wird's, wenn Du den Wert als INT deklarierst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie du es erklärt handelt es um ein Wert als Zehntel-Sekunden.
Um es ins Milli-Sekunden zu konvertieren:

Code:
[COLOR=#333333]L       EB1
[/COLOR][COLOR=#333333]ITD     // Ist vielleicht redundant, aber ich finde es schöner wenn man sofort ins Ziel-Format umwandle
[/COLOR][COLOR=#333333]L       L#100
[/COLOR]*D      // Von 1/10-Sekunden nach Milli-Sekunden.
[COLOR=#333333]T       DB10.DBD4[/COLOR]

Du brauchst nicht EB1 symbolisch zu deklarieren.
Wenn du willst, dann einfach als BYTE.
Wenn du den Konvertierung in AWL programmierst gibt es kein Typechecking, ist also nicht wichtig mit ein symbolische Deklaration.
Und du brauchst auch kein Zwischenspeicher (DB10.DBW2). Siehe Codesnipsel.
 
Es funktioniert, vielen Dank!

Folgendes habe ich nun gemacht:

EB1 rangiert in DB10.DBW2 ( im DB als INT deklariert )

DB10.DBW2 über einen FC in DB10.DBD4 normiert mit folgendem Code:

//
L DB10.DBW2
ITD
L 100
*D
T DB10.DBD4
//

Der Fehler lag wohl doch daran, dass ich nur Milli Sekunden bekommen habe.
 
Es funktioniert, vielen Dank! [...]
Der Fehler lag wohl doch daran, dass ich nur Milli Sekunden bekommen habe.
:confused: Wenn Dir Dein Simulationsprogramm tatsächlich Millisekunden geben würde, dann wäre die Multiplikation mit 100 schlichtweg falsch und Deine von Jesper übernommene Lösung würde nicht funktionieren ...

Im übrigen hat die ITD-Operation in der Umrechnung nichts zu suchen - es gibt keine negative TIME.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Simulationsprogramm schreibe ich Beispielsweise 10,0 Sekunden rein. In meinem EB steht dann Dezimal eine "100" weil der Wert im EB immer das 10-fache ist (gibt das Programm so vor). Nach der Rangierung in das DB10.DBW2 habe ich Dezimal immer noch eine 100 stehen.

Nach der Normierung habe ich dann im DB10.DBD4 eine T#10S. Vorher hatte ich das ganze nicht mit 100 Multipliziert und dementsprechend nur T#100MS am Regler. Was ich übrigens noch geändert habe war der Tip von WORD auf INT zu schreiben.
 
Zurück
Oben