Mehrere Prozesse greifen auf der selben Datei zu

der.simo

Level-2
Beiträge
18
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte von mehreren Task auf eine Datei zugreifen. Wie kann ich das am besten machen. Bin für jede Antwort sehr dankbar.
es geht um einem Wago-Controller 750-880 und Codesys 2.3

Die Datei habe in einem Programmbaustein implementiert und den ruf ich in andere Tasks auf, Leider irgendwann ist kein Zugriff auf die Datei möglich, da vllt gleichzeitig auf die Datei zugegriffen wird!

Gruß
Lawkan
 
Hallo,
ich würde mir ein Bit setzen, sobald der Zugriff aktiv ist und es wieder löschen wenn beendet.
Jede der Routinen, die auf die Datei zugreift fragt immer zuerst ab, ob das Bit gesetzt ist - hat einer es gesetzt kann der Nächste nicht mehr an die Datei. So in etwa ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
Danke erstmal für deine Antwort.
Das hab ich schon probiert, Deswegen soll ich hier noch erwähnen dass ich noch zwei andere Dateien erstelle.
Also jetzt mal bissel ausführlicher und detaillierter:
Es ist so dass ich zwei Archivdateien erstelle, der M-Archiv ist jedes mal erstellt wenn eine Änderung eines Bitzustands vorkommt, und der MG-Archiv wird jede Viertelstunde erstellt.
Soweit so gut. Dann kommt jetzt die Debug-Datei, die im Moment Probleme macht. Also die Debug-Datei wird jedes mal aufgerufen wenn ein bestimmter Programmteil bzw -schritt abgearbeitet wird. Da habe ich ein bit gesetzt, wie du gemeint hast, und wieder gelöscht wenn die Datei geschlossen wird. Aber die Datei kann irgendwann nicht geschlossen wird (wegen ein anderer Zugriff von einem anderen Task oder ein Befehl zum öffnen eine andere Datei vermute ich) und da kann der gesetzte Bit nicht mehr gelöscht werden und somit hängt es.

ich hoffe damit habe ich das Problem noch mehr klar beschrieben, und hoffe auf noch mehr Ideen. Danke
 
Aber die Datei kann irgendwann nicht geschlossen wird (wegen ein anderer Zugriff von einem anderen Task oder ein Befehl zum öffnen eine andere Datei vermute ich) und da kann der gesetzte Bit nicht mehr gelöscht werden und somit hängt es.

Naja ... ich meinte ja auch, dass du diesen anderen Zugriff dann auch sperren sollst (mit dem gleiche Bit).
Im Prinzip so : hat einer eine Arbeit angefangen so dürfen alle anderen (Tasks , Threads) nicht die gleiche Arbeit machen bis der Eine (!!!) seine Arbeit abgeschlossen hat ...
 
ja okay.
Also hier ist der Code wie ich das realisiert habe:

IF Debug_aktiv AND (NOT Debug_Freigabe) THEN
Debug_Freigabe := TRUE;
sZeit := REPLACE(DELETE(DT_TO_STRING(SysRtcGetTime(TRUE)),3,1),' ',1,11);
Write_to_Logfile(
DataString:= CONCAT(sZeit,' Task PLC_MW: Mittelwert-Erfassung.$R$N'),
sStatus=> LogFile_sStatus,
xStatus=> LogFile_xStatus);
IF LogFile_xStatus THEN
Debug_Freigabe := FALSE;
END_IF
END_IF

und so in jedem Task den gleichen Code eingefügt wo ich den Schritt erfassen will.

Deklaration ist folgendermaßen:
Debug_aktiv : bool ==> globale Variable um die Debugfunktion ein/ausschlaten
Debug_Freigabe : bool ==> globale Var um andere Zugriff zu sperren
Write_to_Logfile : PRG ==> Programmbaustein wo die Filezugriffe durchgeführt werden (also FileOpen, FileWrite, FileClose: FC von SysLibFile.lib)
LogFile_xStatus : bool ==> ist TRUE wenn Datei geschlossen wurde, FALSE wenn nicht​
 
Zurück
Oben