B&R Rezeptverwaltung / USB-Stick

Lazarus™

Level-2
Beiträge
434
Reaktionspunkte
52
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich würde gerne eine Rezeptverwaltung realisieren, idealerweise auf einem USB Stick als CSV-Datei.
Benutzt wird ein PP500. Wie macht Ihr sowas ?? Oder gibt es sogar ein Beispiel irgendwo (nicht die Coffemachine :ROFLMAO:) ??

Vielen Dank für Eure Hilfe :D
 
Hallo zusammen.

@Lazarus: Ich habe dies mit Hilfe der Bibliotheks-Funktionen 'FileWrite' und ähnliche realisiert, so wie es B&R auch bei den von Bitmanipulator erwähnten CSV_File-Libraryfunktionen tut. Ich habe mich aber für eine selbstentwickelte Dateistruktur entschieden, da wir auch Siemens-Steuerungen bzw. -HMI einsetzen und ich dieses Dateiformat für alle Maschinen einsetzen wollte.


@Schleppfehler: Wie habt ihr das Speichern als XML-Datei (und natürlich auch das Parsen) realisiert? Gibt es dafür eine Bibliothek von B&R? Wie verwendet ihr diese Dateien weiter?


Gruß, Fred
 
Das geht auch über die B&R Bibliothek. Du erstellst eine zweite Partition auf der MEM Card, dort wird ein Verzeichnis angelegt in dem sich ein XML Template befindet, dort brauchst du dann bloss die Varaiblen rein schreiben, die du als Rezept sichern willst.
Wird das speichern über die HMI angestossen, erstellen wir ein neues Verzeichnis mit dem Namen der Rezeptur.
In diesem Verzeichnis wird dann ein XML File abgelegt, in dem dann die Werte der eingetragenen Variablen stehen.
Dann kann man über die HMI entsprechend die Rezepte auswählen und auf den Stick als Backup kopieren.
Das gute ist, man kann über FTP auf diese Partition zugreifen und die Sachen so auch raus kopieren.

Beste Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Schleppfehler,

hast du eventuell eine Beispieldatei zur Hand, die ich einsehen dürfte?

Ich hätte auch noch zwei Fragen:
1. Wie lest ihr diese XML-Rezeptdatei denn ein?
2. Werden Fehlermeldungen/-nummern zurückgegeben, wenn das Schreiben/Lesen der XML-Datei fehlschlägt? Wenn ja, welche?


Danke dir schon einmal im Voraus und Gruß,
Fred
 
Das laden funkt auch über eine Bibliothek. Namen hab ich gerade nicht zur Hand.
Es gibt Fehlermeldungen, wenn zb verzeichnis nicht existiert oder Variable nicht bekannt ist.
Zu der Xml datei gehört narürlich noch eine xsl datei, somit kann der kunde sich die daten mit zb dem IExplorer ausdrucken!
Beispiel gibt montag!

Schönen Abend.
 
Ich muss mich korrigieren, das Laden/Speichern und parsen wird nicht über eine Standard Libary gemacht, sondern über eine
ANSI-C Library, die wir mal von B&R bekommen hatten.

Hier einmal eine Beispiel xml Datei zum speichern von Variablen :

Code:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="asms.xsl"?>
<assignmentsfile filename="recipe.xml" changed="2006-07-03-11:34:23" key="BABE1234">
 <valuesfile filename="format.xml">                     
 <!--=========================================-->
 <!-- Overview                                -->
 <!--=========================================-->
 <!-- MACHINE NO.                             -->
 <!-- PAGE FORMAT                     -->
 <!-- PAGE MECHANICAL SETTINGS                -->

  <!--=================================================================-->
  <!-- MACHINE NO.                                                     -->
  <!--=================================================================-->
  <section name="MACHINE NAME">   
         <assign name="Machine number">  
            <plc_var>sMachineName</plc_var>
            <var_default>"form"</var_default>            
         </assign>
      </section>
      
  <!--=================================================================-->
  <!-- PAGE Format                                                     -->
  <!--=================================================================-->
  <section name="FORMAT">   
         <assign name="Format name">  
            <plc_var>sDirFormat</plc_var>
            <var_default>"form"</var_default>            
         </assign>
      </section>
  <!--=================================================================-->
  <!-- PAGE MECHANICAL SETTINGS                           -->
  <!--=================================================================-->
  <section name="MECHANICAL SETTINGS">
    <!--========================================================-->  
   <assign name="Example setting 1">  
         <plc_var>fSetting1</plc_var>
          <var_default>0</var_default>
   </assign>
   <!--========================================================-->   
   <assign name="Example setting 2">  
        <plc_var>fSetting1</plc_var>
         <var_default>0</var_default>
    </assign>    
    </section>
 </valuesfile>
</assignmentsfile>
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für Eure Antworten.
Ich weiss zwar immer noch nicht genau, was für mich auf Dauer der ideale Ansatz ist, aber ich habe was zum nachdenken.
Hat vielleicht jemand ein Beispielprogramm, wo man mal reinschauen kann ? Ich würde mich sehr freuen ...

Und nochmals, VIELEN DANK FÜR EURE HILFE :D
 
Wie genau geht denn die CSV Rezeptur ???
Meine Rezept (Zum testen) sieht derzeit so aus:
Code:
TYPE
    Rezeptspeicher :     STRUCT 
        Daten : ARRAY[0..99]OF Rezept;
    END_STRUCT;
    Rezept :     STRUCT 
        Name : STRING[20];
        Parameter_1 : USINT := 0;
        Parameter_2 : DWORD := 0;
        Parameter_3 : REAL := 0.0;
        Parameter_4 : BYTE := 0;
    END_STRUCT;
END_TYPE

Code:
VAR
    Rezeptdaten : Rezeptspeicher;
    Aktuelles_Rezept : Rezept;
END_VAR

Aber ich verstehe irgendwie die CSV_File Library nicht :-(

Vielleicht hat ja jemand ein Programmfragment zum "studieren" :)

Danke ...
 
Ich hab etwas, womit ich eine Sollwert-Struktur auf einen USB-Stick speichern / von einem USB-Stick lesen kann.
Ich weiß nicht ob du damit was anfangen kannst, müsste aber deine Anforderungen abdecken:

// Fehler rücksetzen
//******************


IF (Fehler AND Quit_Fehler) THEN
Fehler:= FALSE;
END_IF



//Schrittschaltwerk Datentransfer
//********************************

CASE StepNr OF


// Action 0 : Stillstand
// *********************

0:

//Bei Fehler = Befehle rücksetzen
IF (Fehler) THEN
Schreiben:= 0;
Lesen:= 0;
END_IF


// Daten schreiben oder lesen
IF (Lesen OR Schreiben) AND (NOT Fehler) THEN
StepNr:= 1;
END_IF


// Action 1 : Dateiüberprüfung
// ***************************
1:

FOpen.enable:= 1;
FOpen.pDevice:= ADR('USB_STICK');
FOpen.pFile:= ADR('Rezept'); //Name der Datei
FOpen.mode:= 2; // Modus schreiben + lesen

FOpen();

IdentNr:= FOpen.ident;

// Datei existiert nicht
IF (FOpen.status= 20708) THEN
StepNr:= 2;

// Daten schreiben
ELSIF (FOpen.status= 0) AND (Schreiben) THEN
StepNr:= 3;

// Daten lesen
ELSIF (FOpen.status= 0) AND (Lesen) THEN
StepNr:= 4;

// Fehler
ELSIF (FOpen.status <> 65535) THEN
Fehler:= TRUE;
StepNr:= 0;
IF (FOpen.status= 20799) THEN
Error:= FileIoGetSysError();
END_IF
END_IF




// Action 2 : Datei erzeugen
// =========================
2:

FCreate.enable:= 1;
FCreate.pDevice:= ADR('USB_STICK');
FCreate.pFile:= ADR('Rezept');

FCreate();

IdentNr:= FCreate.ident;

// Daten schreiben
IF (FCreate.status= 0) THEN
StepNr:= 3;

//Fehler
ELSIF (FCreate.status <> 65535) THEN
Fehler:= TRUE;
StepNr:= 0;
IF (FCreate.status= 20799) THEN
Error:= FileIoGetSysError();
END_IF
END_IF



// Action 3 : Datei schreiben
// ==========================
3:

FWrite.enable:= 1;
FWrite.ident:= IdentNr;
FWrite.offset:= 0;
FWrite.pSrc:= ADR(Rezept); //Strukur, die geschrieben werden soll
FWrite.len:= SIZEOF(Rezept);

FWrite();


// Daten schreiben O.K.
IF (FWrite.status= 0) THEN
Schreiben:= FALSE;
StepNr:= 5;

// Fehler
ELSIF (FWrite.status <> 65535) THEN
Fehler:= TRUE;
StepNr:= 0;
IF (FWrite.status= 20799) THEN
Error:= FileIoGetSysError();
END_IF
END_IF



// Action 4 : Datei lesen
// ======================
4:

FRead.enable:= 1;
FRead.ident:= IdentNr;
FRead.offset:= 0;
FRead.pDest:= ADR(Rezept);
FRead.len:= SIZEOF(Rezept);

FRead();

// Daten lesen O.K.
IF (FRead.status= 0) THEN
Lesen:= FALSE;
StepNr:= 5;

// Fehler
ELSIF (FRead.status <> 65535) THEN
Fehler:= TRUE;
StepNr:= 0;
IF (FRead.status= 20799) THEN
Error:= FileIoGetSysError();
END_IF
END_IF



// Action 5 : Datei schließen
// ==========================
5:

FClose.enable:= 1;
FClose.ident:= IdentNr;

FClose();

// Datei geschlossen O.K.
IF (FClose.status= 0) THEN
StepNr:= 0;

// Fehler
ELSIF (FClose.status <> 65535) THEN
Fehler:= TRUE;
StepNr:= 0;
IF (FClose.status= 20799) THEN
Error:= FileIoGetSysError();
END_IF
END_IF


END_CASE

Wenn du mehr Infos brauchst, einfach eine PN ;)
 
Zurück
Oben