Ausschaltverzögerungszeit wird aus HMI nicht in SPS verarbeitet, Hersteller weiß nicht weiter

Vielleicht nach "Backup_Outfeed_1_CTU" ohne ".Q" suchen.
Ich sehe dass die B&R Programmsoftware nicht besser geworden ist seit ich es mit das 2003 System berührt habe.
Man muss tatsächlich eine Suchtext selber sammeln und dann suchen. Es gibt keine Querverweiss wie man es für eine SPS Programmiersoftware erwarten wurde.
Und Logik-Programmierung in Structured Text ... urk.

Ich wurde wie vorgeschlagen in die andere Richtung gehen.
Den Startbefehl für die FU finden, online beobachten, sehen warum es nicht kommt, und dann rückwärts gehen (immer online) bis man die Verknüpfung mit den Lichtgitter und/oder den Timer findet.

Noch eine Start-Ansatz, in den HMI Programm den problematische Timer finden, mit welche SPS Variabel ist es verknüpft ?
 
Die Erinnerung kommt zurück. Ich habe es wahrscheinlich verdrängt weil es zu traumatisch war.
Wenn ich mich nicht irre, besteht die einzige Möglichkeit das ST- oder C-Programm in B&R zu debuggen, darin die Variablen in Watch-Tabellen zu beobachten.
 
@JesperMP :
Es gibt nicht nur ein Watch-Fenster. Zeilenüberwachung, gezieltes Suchen und Querverweisliste sind vorhanden.
Also das Automation Studio ist generell besser wie dieses Zeitlupen-TIA und es ist alles dabei...
 
Ich verstehe bei der Programmiersprache nur Bahnhof.

Bei FUP, AWL würde ich es etwas verstehen.

Wenn ich nach Backup_Outfeed_1_CTU suche, kommt folgendes:

// Supervise bottle conveyor backup.
Backup_Outfeed_1_CTU.CU=TrackRoutePtr_Main->PeriodicPitchSignal;
Backup_Outfeed_1_CTU.RESET=(!BottleDetection.DI_Backup_Outfeed_1 || Safety.ResetMessages);
CTU(&Backup_Outfeed_1_CTU);
TransportSystem.Outfeed_1_Backup_Cnt=Backup_Outfeed_1_CTU.CV;
//
Backup_Outfeed_2_CTU.CU=TrackRoutePtr_Main->PeriodicPitchSignal;
Backup_Outfeed_2_CTU.RESET=(!BottleDetection.DI_Backup_Outfeed_2 || Safety.ResetMessages);
CTU(&Backup_Outfeed_2_CTU);
if (Backup_Outfeed_2_CTU.CV>4) {
SetMessage(20,1);
}
// Head height adjustment.
{
static int nState=0;
static REAL fDeltaRangeEnc;
static REAL fDeltaEnc;
static REAL fDeltaRangePhys;
static REAL fCurrentPosition;
if (GlobalState.MachineType==540) {
// Linear potentiometer.
TrackingParams.HeightAdj.CurrentPositionEnc=TrackingParams.HeightAdj.AI_HeightAdj/32767.0f;
} else {
// Absolute encoder.
TrackingParams.HeightAdj.CurrentPositionEnc=((((DINT)(TrackingParams.HeightAdj.AbsEncPos<<10))/(1<<10)))/((REAL)(1<<18));
}
fDeltaRangeEnc=(TrackingParams.HeightAdj.RangeEnc[1]-TrackingParams.HeightAdj.RangeEnc[0]);
if (fabsf(fDeltaRangeEnc)>0.0001f) {
static REAL faFilterArray[200];
static int nFilterIndex=0;
static REAL fFilterSum=0;
fDeltaEnc=TrackingParams.HeightAdj.CurrentPositionEnc-TrackingParams.HeightAdj.RangeEnc[0];
fDeltaRangePhys=TrackingParams.HeightAdj.RangePhys[1]-TrackingParams.HeightAdj.RangePhys[0];
fCurrentPosition=TrackingParams.HeightAdj.RangePhys[0]+(fDeltaEnc*fDeltaRangePhys)/fDeltaRangeEnc;
fFilterSum+=fCurrentPosition;
fFilterSum-=faFilterArray[nFilterIndex];
faFilterArray[nFilterIndex]=fCurrentPosition;
nFilterIndex=(nFilterIndex+1)%200;
TrackingParams.HeightAdj.CurrentPositionPhys=fFilterSum/200;
}
// Reset contactors.
TrackingParams.HeightAdj.DO_HeightAdj_Neg=0;
TrackingParams.HeightAdj.DO_HeightAdj_Pos=0;
// Drive to target position if requested.
if (TrackingParams.HeightAdj.MoveToTargetPositionReq) {
static REAL fHysteresis=2.0f;
static REAL fBrakeDistance=0.05f;
static TOF_typ tof;
tof.PT=1000;
tof.IN=(nState==10 || nState==20);
TOF(&tof);
if (nState==0) {
if (TrackRoutePtr_Main->PresentTrackItemCount>0) {
SetMessage(21,1);
} else if (TransportSystem.MachineActualVelocityBph>1) {
SetMessage(22,1);
} else {
static REAL f1;
f1=TrackingParams.HeightAdj.TargetPosition+fHysteresis+fBrakeDistance;
if (fCurrentPosition<f1) {
nState=10;
} else {
nState=20;
}
}
}
if (nState==10) {
// Move up to hysteresis.
if (fCurrentPosition<(TrackingParams.HeightAdj.TargetPosition+fHysteresis+fBrakeDistance)) {
TrackingParams.HeightAdj.DO_HeightAdj_Pos=1;
} else {
nState=12;
}
} else if (nState==12) {
if (tof.Q) {
nState=20;
}
} else if (nState==20) {
// Move down to target position.
if (fCurrentPosition>TrackingParams.HeightAdj.TargetPosition+fBrakeDistance) {
TrackingParams.HeightAdj.DO_HeightAdj_Neg=1;
} else {
nState=22;
}
} else if (nState==22) {
// Wait until standstill.
if (tof.Q) {
float fDelta=fCurrentPosition-TrackingParams.HeightAdj.TargetPosition;
if (fabsf(fDelta)<0.10f) {
TrackingParams.HeightAdj.MoveToTargetPositionDone=1;
nState=90;
} else {
fBrakeDistance-=fDelta;
nState=10;
}
}
} else if (nState==90) {
}
// Limit movement to positioning range.
if (TrackingParams.HeightAdj.DO_HeightAdj_Pos && TrackingParams.HeightAdj.CurrentPositionPhys>TrackingParams.HeightAdj.RangePhys[1]+fHysteresis+1.0f) {
SetMessage(23,1);
TrackingParams.HeightAdj.DO_HeightAdj_Pos=0;
} else if (TrackingParams.HeightAdj.DO_HeightAdj_Neg && TrackingParams.HeightAdj.CurrentPositionPhys<TrackingParams.HeightAdj.RangePhys[0]-1.0f) {
SetMessage(23,2);
TrackingParams.HeightAdj.DO_HeightAdj_Neg=0;
} else if (TrackingParams.HeightAdj.CurrentPositionPhys<TrackingParams.HeightAdj.RangePhys[0]-5.0f || TrackingParams.HeightAdj.CurrentPositionPhys>TrackingParams.HeightAdj.RangePhys[1]+fHysteresis+5.0f) {
SetMessage(23,3);
TrackingParams.HeightAdj.DO_HeightAdj_Pos=0;
TrackingParams.HeightAdj.DO_HeightAdj_Neg=0;
}
} else {
TrackingParams.HeightAdj.MoveToTargetPositionDone=0;
nState=0;
}
}
 

Anhänge

  • 123.JPG
    123.JPG
    46,4 KB · Aufrufe: 9
Diese Zeile ist die Zähler:
CTU(&Backup_Outfeed_1_CTU);

In diese Zeile wird den Zählerwert an TransportSystem.Outfeed_1_Backup_Cnt weitergegeben:
TransportSystem.Outfeed_1_Backup_Cnt=Backup_Outfeed_1_CTU.CV;

Ich finde in den Code keine weitere Ausgabefunktionen für den Zähler.
Also, mit TransportSystem.Outfeed_1_Backup_Cnt weitersuchen.
Oder wie vorgeschlagen, den Startbefehl oder den HMI Timereingabe finden, und damit die Suche machen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Im HMI heißt das Eingabefeld für die Nachlaufzeit Tracking.

IM B&R Studios gibt es auch die Reiter Tracking, mit den oben genannten Codes und der Variable Backup_Outfeed1_CTU.
 

Anhänge

  • 123.JPG
    123.JPG
    153,1 KB · Aufrufe: 25
Tracking Task ist die Programmbaustein.
Backup_Outfeed1_CTU ist eine Variabel der für den Baustein deklariert ist.
Da ist nichts neues.

Wiederhole:
Also, mit TransportSystem.Outfeed_1_Backup_Cnt weitersuchen.
Oder wie vorgeschlagen, den Startbefehl oder den HMI Timereingabe finden, und damit die Suche machen.

Im HMI heißt das Eingabefeld für die Nachlaufzeit Tracking.
Jetzt musst du finden mit welchen SPS Variabel den Eingabefeld verknüpft ist. Und dann weitersuchen ...
 
Kann es sein, dass es der untere Code ist? Ich verstehe leider nur Bahnhof


// Conveyor outfeed 1.
TP_Backup_Outfeed_1.IN=(TransportSystem.Outfeed_1_Backup_Cnt>1);
TP(&TP_Backup_Outfeed_1);
if (GlobalState.MachineType==540) {
TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);
TOF_Conveyor_Outfeed_1.IN=SplitStarwheelDrive.DO_Enable_Bottom;
TOF(&TOF_Conveyor_Outfeed_1);
DO_Conveyor_Outfeed_1_Enable=TOF_Conveyor_Outfeed_1.Q;
AO_Conveyor_Outfeed_1_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_1_GearFactor));
}
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bahnhof:
Code:
if (GlobalState.MachineType==540) {
wenn Maschinentyp 540 alles folgende in der geschweiften Klammer ausführen

TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);
Sollwert Timer festlegen

TOF_Conveyor_Outfeed_1.IN=SplitStarwheelDrive.DO_Enable_Bottom;
Bedingung Start Timer

TOF(&TOF_Conveyor_Outfeed_1);
Aufruf Timerinstanz

DO_Conveyor_Outfeed_1_Enable=TOF_Conveyor_Outfeed_1.Q;
Verschaltung vom ausschaltverzögerten Ausgang des Timers auf die Freigabe des Antriebs

AO_Conveyor_Outfeed_1_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_1_GearFactor));
}
Geschwindigkeitssollwert analog ausgeben

das DINT in der ersten Klammer bei

TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);

scheint eine Typfestlegung zu sein, kann dazu aber leider nichts sagen mangels B&R Kenntnissen.
 
C:
AO_Conveyor_Outfeed_1_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_1_GearFactor));
Das MIN sagt noch, dass mindestens 1.0 ausgegeben wird. Sieht aus als würde der Geschwindigkeitssollwert in der Funktion nochmal zumindest gewandelt werden.
Denn die Eingangsvariable ist eine REAL und ein Analogwert ein INT. Zumindest wenn die Variable direkt auf einen Analog Output gemappt wird worauf das Präfix AO hindeutet.
 
Bahnhof:
Code:
if (GlobalState.MachineType==540) {
wenn Maschinentyp 540 alles folgende in der geschweiften Klammer ausführen

TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);
Sollwert Timer festlegen

TOF_Conveyor_Outfeed_1.IN=SplitStarwheelDrive.DO_Enable_Bottom;
Bedingung Start Timer

TOF(&TOF_Conveyor_Outfeed_1);
Aufruf Timerinstanz

DO_Conveyor_Outfeed_1_Enable=TOF_Conveyor_Outfeed_1.Q;
Verschaltung vom ausschaltverzögerten Ausgang des Timers auf die Freigabe des Antriebs

AO_Conveyor_Outfeed_1_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_1_GearFactor));
}
Geschwindigkeitssollwert analog ausgeben

das DINT in der ersten Klammer bei

TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);

scheint eine Typfestlegung zu sein, kann dazu aber leider nichts sagen mangels B&R Kenntnissen.

So hab ich mir es auch zusammengereimt ohne weitere Erfahrungen.

Wenn ich nach TransportSystem.Conveyor_Outfeed_1_OffDelay suche, kommt nur ein Eintrag.
Der Datentyp DINT passt aber nicht zum Eingabefeld im HMI, da kann man Zahlen mit Koma eingeben.

Suchen wir bei B&R nach einem Real oder Time oder nach was ganz anderem?
 
Kann es sein, dass es der untere Code ist? Ich verstehe leider nur Bahnhof


// Conveyor outfeed 1.
TP_Backup_Outfeed_1.IN=(TransportSystem.Outfeed_1_Backup_Cnt>1);
TP(&TP_Backup_Outfeed_1);
if (GlobalState.MachineType==540) {
TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);
TOF_Conveyor_Outfeed_1.IN=SplitStarwheelDrive.DO_Enable_Bottom;
TOF(&TOF_Conveyor_Outfeed_1);
DO_Conveyor_Outfeed_1_Enable=TOF_Conveyor_Outfeed_1.Q;
AO_Conveyor_Outfeed_1_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_1_GearFactor));
}
TOF ist der Funktionsaufruf mit der Adresser der Angegebenen Structur.
In der Hilfe kannst du nach TOF suchen, da gibt es dann auch das Beispiel in C.
PT ist angabe in milli Sekunden. alse wenn OffDely = sekunden sind ist die multiplikation mit 1000 mal logisch

Welche Visulisierung ist dass.
Bei des Task in einem oberen Screenshot ist diese nicht zu finden, da nicht alle Objekte angezeigt werden.
Wenn es eine VNC Visualisierung ist, dann ist das eher ein grünes symbol
Da kannst du einen Doppelklick machen und es öffnet sich der VNC Editor. Hier hast du wieder eine Navigationsleiste.
Dieser muss unter Page die einzelenen Bilder enthalten. Dein Bild suchen und auf das Feld klicken. Linke Mousetaste Properties öffnen.
Da findest du den Datenpunkt. Viellecht weisst diser auf das TransportSystem.Converyer_Outfeed_1_OffDelay hin.

Wenn das zu kompliziert ist, im Watch den Datenpunkt anzeigen lassen, und überprüfen ob dieser mit der Visulisierung geändert wird.

Weil du oben mal geschrieben hast, dass eine Variable in zwei Variabendeklerationen zu finden.
Das sind dann zwei verschiende Variablen die nicht gemeinsam haben.
Also wenn der Task auf die Lokale Dekleration zugrifft und die Visualisierung auf die Globale Dekleration zugreift, dann werden diese nicht gegenseitig beeinflusst.
 
Ich bin mir fast sicher, das das Eingabefeld im HMI hier auf diesen Wert geht
Conveyor_Outfeed_1_OffDelay

Was heißt die 0.0 in der Spalte Wert?
 

Anhänge

  • 123.JPG
    123.JPG
    47,2 KB · Aufrufe: 35
Zurück
Oben