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

bier1903

Level-2
Beiträge
156
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

vorne weg, ich bin kein Programmierer. Kenne mich zwar mit TIA aus, aber von B&R habe ich keine Ahnung.

Ich habe eine Maschine BJ 2018, bei der der Hersteller leider nicht mehr weiter weiß bzgl. eines Software Fehlers.

Es gibt im HMI ein Eingabefeld für die Nachlaufzeit der Maschine, wenn die Lichtschranke (Stau) im Auslauf belegt ist, bis die Maschine stehen bleibt.
Die Lichtschranke (im Bild Digitaleingang 11) schaltet und das Signal kommt in der B&R Studios im Beobachtungsmodus an. Wechselt von TRUE auf FALSE.

Leider wird das Signal nicht verarbeitet und die Maschine stoppt nach ca. 20 sec. egal welchen Wert ich im HMI eingebe.

Weiß jemand, wie ich die Verknüfung wieder herstelle? Könnte ich im B&R Studios suchen, wo die Lichtschranke überall verwendet wird?


Besten Dank
 

Anhänge

  • WhatsApp Image 2024-05-15 at 12.04.06(1).jpeg
    WhatsApp Image 2024-05-15 at 12.04.06(1).jpeg
    279 KB · Aufrufe: 105
  • WhatsApp Image 2024-05-15 at 12.04.06.jpeg
    WhatsApp Image 2024-05-15 at 12.04.06.jpeg
    425,6 KB · Aufrufe: 106
  • WhatsApp Image 2024-05-15 at 12.04.05.jpeg
    WhatsApp Image 2024-05-15 at 12.04.05.jpeg
    242,4 KB · Aufrufe: 107
und die Maschine stoppt nach ca. 20 sec. egal welchen Wert ich im HMI eingebe.
der der Hersteller leider nicht mehr weiter weiß
Jetzt muss ich mal ganz blöd fragen. Warum weiß der Hersteller nicht weiter? Das ist doch eine relativ simple Sache.
Hat es denn mal funktioniert? Wenn ja, was wurde verändert? Alternativ könntet ihr euch vorerst damit behelfen, die Lichtschranke zu versetzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Am besten du fängst an, an der Eingangsbaugruppe. Dann nimmst du die Variable die auf die Lichtschranke verknüpft ist. Dann mit STRG+Umschalt+F kannst du in allen Dateien suchen.

Wenn es aber schon mal funktioniert hat, das jetzt aber nicht mehr tut und ihr aber nichts geändert habt glaube ich nicht dass du ein Softwareproblem hast...

Viel Glück...
 
Jetzt muss ich mal ganz blöd fragen. Warum weiß der Hersteller nicht weiter? Das ist doch eine relativ simple Sache.
Hat es denn mal funktioniert? Wenn ja, was wurde verändert? Alternativ könntet ihr euch vorerst damit behelfen, die Lichtschranke zu versetzen.
Hallo, nein es hat leider noch nie funktioniert.
Der Hersteller hat das in der Software irgendwo hart 10 sec. programmiert, damit haben wir uns abgefunden.
Jetzt wurde ein Backup eingespielt und es funktioniert wieder nicht mehr.

Der "alte" Programmierer ist weg und der neue bekommt es nicht hin.
Wenn wir die Lichtschranke versetzen, dann ist die Lücke zu groß und die Maschine holt bei wiederanlauf die Lücke nicht mehr auf.

Ich weiß leider nicht genau, warum er es nicht findet. Wie geschrieben bin ich kein Programmierer.
 
nein es hat leider noch nie funktioniert.
und es funktioniert wieder nicht mehr.
:unsure:

Es hat noch nie funktioniert und jetzt funktioniert es wieder nicht?? Irgendwie ein Widerspruch, oder?

irgendwo hart 10 sec. programmiert
stoppt nach ca. 20 sec.
??

Ich weiß leider nicht genau, warum er es nicht findet.
War denn schon mal jemand vor Ort?
 
Könnte ich im B&R Studios suchen, wo die Lichtschranke überall verwendet wird?
Es ist die FU der startet und stoppt ?
Ich wurde die Startbefehl finden, und dann rückwärts gehen bis den Zusammenhang mit die Timer gefunden ist.
Dann online beobachten.
Kommt die Eingabe von die HMI korrekt als Sollwert für die Timer ?

edit: Die Lichtschranke zu suchen ist auch möglich, aber von den Startbefehl zu beginnen muss schneller sein, weil es sollte nur 1 Startbefehel geben (hoffentlich).
 
Zuletzt bearbeitet:
Also, die Programmiersoftware hast du, oder der Hersteller ist online ?
Es ist eine klassische Fall für die Fehlersuche.
Offline kann man stundenlang theoretizieren.
Online gehen und dann findet ein kompetente Programmierer die Ursache in 5 Minuten.
Ich denke auch das ein "Ordentlicher Instandhalter" mit einigermaßen Programmiererfahrung das hinbekommen. Ich bin auch gerade dabei eine ~9 Jahre alte Anlage Softwaretechnisch auf Stand zu bringen. Da hat der Hersteller auch solange Programmzeilen hinzugefügt bis die Anlage die Abnahme bestanden hat. Es sind eklatante Programmfehler drin die irgendwo anders behoben werde, manchmal gehts ein andermal nicht...

Das B&R Studio ist doch auch Codesys basierend? Ich persönlich würde die Fehlfunktion rückwärts suchen.
> FU läuft nicht > was fehlt dazu...

@da_kine nicht immer kann ein Rückschluss von Hardware zu Software gezogen werden.
 
Am besten du fängst an, an der Eingangsbaugruppe. Dann nimmst du die Variable die auf die Lichtschranke verknüpft ist. Dann mit STRG+Umschalt+F kannst du in allen Dateien suchen.

Wenn es aber schon mal funktioniert hat, das jetzt aber nicht mehr tut und ihr aber nichts geändert habt glaube ich nicht dass du ein Softwareproblem hast...

Viel Glück...
Habe mal nach dem Namen der Lichtschranke im Auslauf gesucht, da kamen 3 Ergebnisse. Zwei Einträge aus der Variablenliste und ein Eintrag in der Programmierung.

// Set test variables with bottle positions on main conveyor.
{
static int i;
for (i=0;i<10;i++) {
UDINT nTrackItemPtr=TrackPoint_GetTrackItemAt(TrackRoutePtr_Main->TrackRouteEndDest.Tp,i);
if (nTrackItemPtr) {
Test_BottlePos=TrackRoute_GetTrackItemPosition(TrackRoutePtr_Main,nTrackItemPtr);
} else {
Test_BottlePos=0;
}
}
}
// 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;
}
}
 
Habe mal nach dem Namen der Lichtschranke im Auslauf gesucht, da kamen 3 Ergebnisse. Zwei Einträge aus der Variablenliste und ein Eintrag in der Programmierung
[..]
Backup_Outfeed_1_CTU.RESET=(!BottleDetection.DI_Backup_Outfeed_1 || Safety.ResetMessages);
Dann weitermachen mit die Fehlersuche.
Nach Backup_Outfeed_1_CTU.RESET suchen.
Und dann die nächste, usw..

20 Jahre Erfahrung
*hust* neuling *hust*
 
Dann weitermachen mit die Fehlersuche.
Nach Backup_Outfeed_1_CTU.RESET suchen.
Und dann die nächste, usw..


*hust* neuling *hust*
Ich denke du meinst eher Backup_Outfeed_1_CTU.Q suchen oder TransportSystem.Outfeed_1_Backup_Cnt=Backup_Outfeed_1_CTU.CV weiterverfolgen...

Kommt die LS !BottleDetection.DI_Backup_Outfeed_1 dann wird der CountUp zurückgesetzt

Zum Thema: *hust* Neuling *hust* bin auch schon im 34. Ausbildungsjahr :ROFLMAO:
 
Wenn ich nach Backup_Outfeed_1_CTU.Q suche, dann findet er nichts.

Bei TransportSystem.Outfeed_1_Backup_Cnt findet er 5 Übereinstimmungen.

Die ersten 4 Übereinstimmungen sind alle in einem Baustein.

// Automatik operation.
if (GlobalState.MachineType==540) {
TransportSystem.MachineTargetVelocity=GetRelativeVelocityFromRegisterValue(AI_TargetVelocity)*TransportSystem.AutoVelocity*(TP_Backup_Outfeed_1.Q?0.80f:1.00f);
} else {
TransportSystem.MachineTargetVelocity=TransportSystem.AutoVelocity*(TP_Backup_Outfeed_1.Q?0.80f:1.00f);
}
if (TransportSystem.AutoRequest) {
if (GlobalState.MachineType==540) {
SplitStarwheelDrive.AO_Velocity=GetRegisterValueFromRelativeVelocity(TransportSystem.MachineTargetVelocity);
// Control infeed bottle stream.
// Gap at the bottle present sensor -> machine stop and error message.
if (!BottleDetection.DI_BottlePresent_Infeed) {
SetMessage(25,1);
}
// Gap at the bottle backup sensor -> machine halt and warning message.
if (!BottleDetection.DI_Backup_Infeed) {
// Gap in bottle stream at infeed -> make machine halt.
SplitStarwheelDrive.DO_Enable_Bottom=0;
SetMessage(202,1);
} else if (!Peripheral.DI_ExternalEnable) {
// External enable missing -> make machine halt.
SplitStarwheelDrive.DO_Enable_Bottom=0;
SetMessage(203,1);
} else if (TransportSystem.Outfeed_1_Backup_Cnt>3) {
// Backup on production outfeed conveyor -> make machine halt.
SplitStarwheelDrive.DO_Enable_Bottom=0;
SetMessage(204,1);
} else {
// Regular automatic operation.
SplitStarwheelDrive.DO_Enable_Bottom=1;
SetMessage(202,0);
SetMessage(203,0);
SetMessage(204,0);
}
} else if (GlobalState.MachineType==550) {
// Control infeed bottle stream.
Peripheral.DI_ExternalEnable=1;
// Gap at the bottle backup sensor -> machine halt and warning message.
/*if (!BottleDetection.DI_Backup_Infeed) {
// Gap in bottle stream at infeed -> make machine halt.
LinosBeltDrive.EnableMovement=0;
SetMessage(202,1);
} else */if (!Peripheral.DI_ExternalEnable) {
// External enable missing -> make machine halt.
LinosBeltDrive.EnableMovement=0;
SetMessage(203,1);
} else if (TransportSystem.Outfeed_1_Backup_Cnt>40) {
// Backup on production outfeed conveyor -> make machine halt.
LinosBeltDrive.EnableMovement=0;
Peripheral.PausedWithAutoRestart=1;
SetMessage(204,1);
} else {
// Regular automatic operation.
LinosBeltDrive.EnableMovement=1;
SetMessage(202,0);
SetMessage(203,0);
SetMessage(204,0);
}
}
} else {
if (GlobalState.MachineType==540) {
SplitStarwheelDrive.DO_Enable_Bottom=0;
} else if (GlobalState.MachineType==550) {
LinosBeltDrive.EnableMovement=0;
}
TransportState=1000;
}
}
//----------------------------------------------------------------------------
// Compute actual values.
if (GlobalState.MachineType==540) {
TransportSystem.MachineActualPositionInc=SplitStarwheelDrive.DC_Position_Bottom-DC_PosAtRef_Bottom;
// Measure difference of top and bottom drive.
if (PrevPosInc_Bottom>16000 && SplitStarwheelDrive.DC_Position_Bottom<-16000) {
EncCycle_Bottom++;
} else if (PrevPosInc_Bottom<-16000 && SplitStarwheelDrive.DC_Position_Bottom>16000) {
EncCycle_Bottom--;
}
PrevPosInc_Bottom=SplitStarwheelDrive.DC_Position_Bottom;
if (PrevPosInc_Top>16000 && SplitStarwheelDrive.DC_Position_Top<-16000) {
EncCycle_Top++;
} else if (PrevPosInc_Top<-16000 && SplitStarwheelDrive.DC_Position_Top>16000) {
EncCycle_Top--;
}
PrevPosInc_Top=SplitStarwheelDrive.DC_Position_Top;
SplitStarwheelDrive.TopBottomDiffInc=(EncCycle_Top-EncCycle_Bottom)*0x10000+((SplitStarwheelDrive.DC_Position_Top-DC_PosAtRef_Top)-(SplitStarwheelDrive.DC_Position_Bottom-DC_PosAtRef_Bottom));
SplitStarwheelDrive.TopBottomDiffMm=(SplitStarwheelDrive.TopBottomDiffInc*TrackingParams.CycleLength)/((float)0x10000);
} else if (GlobalState.MachineType==550) {
TransportSystem.MachineActualPositionInc=LinosBeltDrive.DC_PositionL;
}
//----------------------------------------------------------------------------
// 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));
}
//----------------------------------------------------------------------------
// Conveyor outfeed 2.
TOF_Conveyor_Outfeed_2.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_2_OffDelay);
if (GlobalState.MachineType==540) {
TOF_Conveyor_Outfeed_2.IN=SplitStarwheelDrive.DO_Enable_Bottom;
} else if (GlobalState.MachineType==550) {
TOF_Conveyor_Outfeed_2.IN=LinosBeltDrive.EnableMovement;
}
TOF(&TOF_Conveyor_Outfeed_2);
DO_Conveyor_Outfeed_2_Enable=TOF_Conveyor_Outfeed_2.Q;
AO_Conveyor_Outfeed_2_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_2_GearFactor));
//----------------------------------------------------------------------------
// Enable preceding machine and conveyor.
if (GlobalState.MachineType==550) {
TON_DO_ExternalEnable.IN=LinosBeltDrive.EnableMovement;
TON(&TON_DO_ExternalEnable);
Peripheral.DO_ExternalEnable=TON_DO_ExternalEnable.Q && ((TransportSystem.AutoRequest && TransportSystem.Outfeed_1_Backup_Cnt<3));
}
//----------------------------------------------------------------------------
 

Anhänge

  • 123.JPG
    123.JPG
    51,5 KB · Aufrufe: 8
Zuletzt bearbeitet:
Die 5. Übereinstimmung ist wieder beim BottleDetection.DI_Backup_Outfeed_1

// 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);
}
 
Zurück
Oben