[gelöst]Foto beim Packen erstellen

2. Februar 2009 17:01

Entschuldigt, dass ich den Thread jetzt zum zweiten Mal poste, aber bin wohl ins falsche Forum gerutscht :-(

Hallo,

ich habe ein Problem, was ich alleine, denke ich, nicht lösen kann, da ich leider auch noch nicht wirklich so bewandert in Navision bin.

In der Konstruktion läuft ein zu packendes Paket über ein Band auf eine digitale Waage, darüber befindet sich zusätzlich noch eine Kamera.
Wir haben als Ziel, dass beim Aktivieren eines oder auch zweier Trigger, ein Foto und das Gewicht eingelesen werden soll.

Nun, bisher haben wir weder die Waage noch die Kamera :wink: , aber ich würde trotzdem schon mal wissen, ob das überhaupt möglich wäre und wie es denn ca. aussehen würde.

Gäbe es eine Möglichkeit, über einen Schalter ein Event zu starten, was automatisch ein Foto schießen kann (müsste doch sicherlich nur ein bisher unbekanntes Startevent an die Kamera sein) und kurz darauf das Foto einliest (dafür kann ich ja sicherlich auch das Tutorial zum einlesen von Artikelfotos nutzen und etsprechend anpassen)?

Das einlesen der Gewichtsdaten sollte doch denke ich auch nicht so das Problem sein, wenn man die entsprechende Schnittstelle hat, von der die Daten eingelesen werden müssen.

Die gewählten Informationen sollten dann natürlich beim etsprechenden Auftrag gespeichert werden.

Könnt ihr mir da helfen oder stell ich mir das alles zu einfach vor?

Freundliche Grüße

Steffen
Zuletzt geändert von Steffen am 28. August 2009 13:36, insgesamt 1-mal geändert.

Re: Foto beim Packen erstellen

3. Februar 2009 09:17

Hallo Steffen,

du hast da ja eine sehr anspruchsvolle Aufgabe, die in NAV wahrscheinlich nicht so einfach zu lösen ist.
Zunächst sind da noch ein paar Fragen zu klären.
  • Woher weiß das System zu welchem Auftrag die fotografierte Kiste gehört?
  • Ist dort ein Arbeitsplatz oder soll das ganz automatisch ablaufen?

Und Antworten:
  • Ich denke es macht keinen großen Sinn die Bilder in NAV abzuspeichern, da ich glaube, das Ihr sicherlich ein paar Aufträge mehr pro Tag abwickelt, und die Bilder sicherlich nicht mit einer schwarzweiß 640x480 Auflösung fotografiert werden sollen. Da NAV außerdem keine JPEGs verarbeiten und anzeigen kann, kannst du dir selbst ausrechnen, was bei eurerem Auftragsvolumen eine 2MPixel- Foto (in JPEG ca. 800KB - 1MB groß) als BMP mit eurer Datenbank macht. Daher lege die Fotos lieber in einem Netzwerkverzeichnis ab, und verweise mit einer Referenz darauf.
  • Wenn dort ein Arbeitsplatz vorhanden ist, und du Kamera und Waage findest, die du per Automation oder Programmaufruf steuern kannst, dürfte der Rest kein allzu großes Problem sein.

Gruß, Fiddi

Re: Foto beim Packen erstellen

3. Februar 2009 12:15

Achso, erstmal noch, es handelt sich um die Form 60022, in der ich das alles umsetzen möchte.
fiddi hat geschrieben:
  • Woher weiß das System zu welchem Auftrag die fotografierte Kiste gehört?

In der Form 60022 wird manuell über einen Scanner der Auftrag (Packschein) eingescannt, dann werden die einzelnen Artikel dem Karton zugeordnet und mit einem Klick auf abschließen, wird dem Karton eine Nummer zugewiesen (Packscheinnr. + Kartonnr.) und das ist der Moment in dem er ein Foto erstellen soll und das Gewicht auslesen soll. Zusätzlich soll er ein Soll Gewicht des Kartons mit dem Ist Gewicht vergleichen und eventuell warnen. Das ist aber eher nebensächlich, denn wenn ich einmal das Gewicht habe, ist es ja kein Problem, das eben mit dem SOLL abzugleichen.
  • Ist dort ein Arbeitsplatz oder soll das ganz automatisch ablaufen?

  • Dort ist ein Arbeitsplatz, an dem ein Mitarbeiter steht, den Lieferschein einscannt und die enstprechenden Paketscheine druckt.

    Und Antworten:
    • Ich denke es macht keinen großen Sinn die Bilder in NAV abzuspeichern, da ich glaube, das Ihr sicherlich ein paar Aufträge mehr pro Tag abwickelt, und die Bilder sicherlich nicht mit einer schwarzweiß 640x480 Auflösung fotografiert werden sollen. Da NAV außerdem keine JPEGs verarbeiten und anzeigen kann, kannst du dir selbst ausrechnen, was bei eurerem Auftragsvolumen eine 2MPixel- Foto (in JPEG ca. 800KB - 1MB groß) als BMP mit eurer Datenbank macht. Daher lege die Fotos lieber in einem Netzwerkverzeichnis ab, und verweise mit einer Referenz darauf.

    Jupp, das ist klar :lol: . Daher sollte er am besten ein Auslöse Befehl schicken, und irgendwo da drin müssen auch die Parameter für Namen und Ort enthalten sein. Das kann eh noch was werden, irgendwie über navision diese Parameter an eine wahrscheinliche USB Schnittstelle zu geben.
  • Wenn dort ein Arbeitsplatz vorhanden ist, und du Kamera und Waage findest, die du per Automation oder Programmaufruf steuern kannst, dürfte der Rest kein allzu großes Problem sein.

  • Naja, da schauen wa mal ;-)


    So, ich bin nun beim ersten Schritt angelangt, ich habe die Befehlssyntax der Waage, ich muss Ihr den Befehl <GB1%.4f kg> schicken und würde dann das aktuelle Gewicht zurückbekommen.

    In einem anderem Forum habe ich gesehen, dass dies wohl mittels CommCtrl. geschehen muss(dort wurde es für einen barcodescanner genutzt), um den den COMport anzusteuern. Mal schauen, was da so bei herumkommt.

    Re: Foto beim Packen erstellen

    3. Februar 2009 12:28

    Hallo Steffen,

    nach deiner Bemerkung macht Ihr nicht nur 10 Aufträge am Tag :wink:. Für die Kamera würde ich mich mal bei Netzwerkkameras umsehen, und zwar bei Profigeräten. Mir fällt da spontan z.B Axis ein. Diese Kameras sind evtl. übers Netzwerk einfacher aus NAV zu steuern, als ein USB-Gerät, und können die Fotos evtl. selbst auf den Server bringen, ohne kompliziert durch andere Programme gesteuert werden zu müssen. Aus NAV kannst du dann die Socket-Schnittstelle benutzen(Infos dazu im Forum)


    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    3. Februar 2009 13:00

    Ja, es sind schon ein paar mehr Aufträge, aber ob das wirklich Anschaffungen lohnt, die 200-300€ x 4 (da vier Arbeitsplätze so ausgestattet werden) wage ich zu bezweifeln. Habe gerade ein wenig rumgeschaut, es gibt auch schon Netzwerkkameras für 100€, vielleicht reicht das ja auch...

    Den Dev_guide, den Du in nem anderen Thread beschreibst habe ich nicht drauf, aber da gibts ja reichlich Infos im WeltWeitenWeb, nur bevor ich mich da jetzt kaputt suche (ist gerade, wie ne neue Sprache lernen für mich ;-)) frag ich lieber mal nach und gehe erst in den Bereich, wenns dann wirklich zu einer TCP Realisierung kommt.

    Die Sache mit den Sockets, gilt das wirklich nur für TCP/IP Verbindungen oder kann man das eventuell auch auf Serielle Ports umschreiben?

    Die Serielle Verbindung (erstmal für die Waage) werde ich sonst auf Grundlage dieser Infos (aus dem Thread Com Port with mscomm32.ocx):

    Code:
    CommCtrl.InBufferSize := 1024;
    CommCtrl.OutBufferSize := 512;
    CommCtrl.Settings = '9600,n,8,1';


    Open the COM port to communication:


    Code:
    CommCtrl.CommPort := 1;
    CommCtrl.RThreshold := 1;
    CommCtrl.InputLen := 1;
    CommCtrl.PortOpen := TRUE;



    The code within the Timer event may look something like this

    Code:
    IF CommCtrl.InBufferCount > 0 THEN BEGIN

      CommCtrl.RThreshold := 0; // Switch off receive event

      Buffer := CommCtrl.Input;

    END;

    CommCtrl.RThreshold := 1;  // Switch on receive event


    irgendwie basteln.

    Re: Foto beim Packen erstellen

    3. Februar 2009 13:38

    Hallo Steffen,

    das mit den Sockets, solltest du auch auf der NAV-CD finden und zwar unter 'Client\Common\Navision\Communication Component' bei 4.0Sp3. Wenn die DLLs nicht dort sind, wo ich sie in meinem Post angegeben habe, musst du sie von Hand dort hin kopieren, und mit regsvr32 registrieren.


    Ein Tipp von einem meiner Kunden: Er wollte auch sparen, hat sich ein billiges Gerät gekauft für 3000€, sich ein halbes Jahr jeden Tag darüber geärgert, und sich dann für das 10fache was vernünftiges gekauft.
    Du solltest bei den Komponenten nicht sparen, denn du musst sie supporten, und wenn es nicht funktioniert stockt eure Auftragsabwicklung. Ich weiß nicht ob deinem Chef das auf Dauer gefällt.

    So viel ich weiß kann man die Socketverbindung nicht für direkte serielle Verbindungen benutzen (PPP über eine Modemstrecke mal ausgenommen).

    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    4. Februar 2009 09:09

    So, nicht das man denkt, ich bin nu weg.
    Nachdem ich gestern ca 1 1/2 Stunden gebraucht habe um zu verstehen, wie ich mittels einer OCX (erstmal irgendwie einbinden das Ding) eine Schnittstelle ansteuern kann, ruht das Projekt nun erstmal, da weder eine Waage noch eine Kamera zur Verfügung stehen und ich das eher praktisch als theoretisch durchprobieren möchte.

    Und zur Kamera, wir schauen nun nach ner vernünftigen Kamera, jedoch sind die Axis vollkommen überdimensioniert. 30 b/s und was weiß ich, wir brauchen aber lediglich ein einfaches Foto alle maximal 30s :-D. Mal schauen ob es sowas auch in einer einfacheren Ausführung gibt.

    Re: Foto beim Packen erstellen

    4. Februar 2009 09:45

    Hallo Steffen,

    die Axis ist zwar eine Video-Kamera (wie die meisten in dem Bereich), aber sie kann aus dem Video-Strom auch Einzelbilder separieren. Außerdem gibt es eine API und diverse Kommunikationsprotokolle, mit der man die Kamera auf viele verschiedene Arten ansteuern kann.

    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    6. Februar 2009 11:42

    So am Montag kommen wahrscheinlich Waage, sowie eine Axxis Kamera ;-), dann schau ich mal weiter.

    Re: Foto beim Packen erstellen

    12. Februar 2009 11:31

    So, ich bin jetzt eine ganze Ecke weiter, jedoch bekomme ich einfach keine Ausgabe von der Waage :-( .

    Ich habe die MSCOMM32.ocx eingebunden um die notwendigen Funktionen für die Schnittstelle zu bekommen.
    Ich schaffe es auch ohne weiteres Befehle an die Waage zu schicken, aber ich bekomme einfach keine zurück.


    Nach diversen Recherchen habe ich herausgefunden, dass ich wohl ein Timer Event brauche, und daran versuche ich mich gerade;
    hier mein Code hinter dem Waage Button in Navision (die Com Parameter werden bei der Forminit() vergeben):

    Code:
    <Control1000000001> - OnPush()

    //comport öffnen

    CommCtrl.CommPort := 1;
    CommCtrl.RThreshold := 1;
    CommCtrl.InputLen := 1;
    CommCtrl.PortOpen := TRUE;

    //eingabe an Waage schicken
    CommCtrl.Output:='<GB1%.4f kg>';      //Ausgabe Befehl für die Waage

    //Timer starten
    IF ISCLEAR(Timer) THEN BEGIN
      CREATE(Timer);
      Timer.Interval := 100;                    // Jede Zehntel Sekunde
      Timer.Enabled(TRUE);
    END;

    Timer::Timer(Milliseconds : Integer)
    IF CommCtrl.InBufferCount > 0 THEN BEGIN //Prüfung ob was im Input liegt
      Gewicht := CommCtrl.Input;             //Einlesen der Ausgabe
      CommCtrl.RThreshold := 0;              // Switch off receive event
      CommCtrl.PortOpen :=FALSE;           //Port schließen
      Timer.Enabled(FALSE);                    //Timer Beenden
    END;
    //Abbruchbedingung
    i:=i+1;
    IF i=50 THEN BEGIN
      MESSAGE('Feddich');
      CommCtrl.PortOpen:=FALSE;
      Timer.Enabled(FALSE);
    END;

    //CommCtrl.RThreshold := 1;  // Switch on receive event

    Timer::TimerError(ErrorString : Text[1024])
    MESSAGE('Timer Fehler');


    Mein Problem ist, dass die Waage mir einen Fehler bringt, der sagt, dass die Schnittstelle nicht bereit ist.
    Ohne Timer Event, meckert sie nicht, ich schaffe es aber nicht die Antwort abzufangen.

    Muss der Timer zwingend in eine Codeunit oder müsste das so gehen?

    Ich hoffe mir kann da jemand helfen.

    Re: Foto beim Packen erstellen

    12. Februar 2009 12:39

    Hallo Steffen,

    ich würde mal die Inputlen etwas höher drehen (so 512), dann kann der COM-Port die Daten zwischenspeichern, und du benötigst keinen OnTimer.
    Außerdem solltest du daran denken, das die Schnittstelle u.U. nicht den kompletten Antwortstring auf einmal liefert, sondern in Häppchen.

    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    12. Februar 2009 12:58

    Hallo Fiddi,

    also wenn ich Dich richtig verstehe meinst du das so:


    Code:
    <Control1000000001> - OnPush()
    //comport öffnen

    CommCtrl.CommPort := 1;
    CommCtrl.RThreshold := 1;
    CommCtrl.InputLen := 512;
    CommCtrl.PortOpen := TRUE;

    //eingabe an Waage schicken
    CommCtrl.Output:='<GB1%.4f kg>'; //Ausgabe Befehl für die Waage
    //Ausgabe einlesen und ausgeben
    Gewicht:=CommCtrl.Input;
    Message(Gewicht);

    //Port schließen
    CommCtrl.PortOpen:=FALSE;


    So erscheint auch wieder mal kein Fehler bei der Waage, aber ich bekomme auch nichts aus dem Input herraus.
    Wenn ich das aber richtig verstanden habe, ist doch InputLen einfach nur die Anzahl an zurückgegeben Characters, eine Prüfung ob und wieviele drinn sind, wird, denke ich, über das CommCtrl.InBufferCount gemacht.

    Es scheint mir, als lese er den Input aus, bevor was drin ist, und schließt dann den Port. Daher habe ich den Timer gesetzt, um das in ne Schleife zu packen, damit er so lange fragt, bis was drin ist und dann erst alles schließt.

    Re: Foto beim Packen erstellen

    12. Februar 2009 14:58

    Hallo Steffen,

    in etwa schon, nur glaube ich das dein Programm schneller ist, als die Waage :wink:, will sagen dein Programm liest schon Daten, während die Anfrage noch an die Waage gesendet wird. (12 Zeichen+ Antwort/960 Zeichen pro Sekunde (ca. 0,03 Sek.) sind für einen PC schon eine halbe Ewigkeit) Deshalb solltest du die COM-Schnittstelle immer auf Empfang lassen, sie vor dem Senden eines Kommandos komplett auslesen, und nach dem Senden den Buffer mit Timeout auslesen, bis alle Zeichen von der Waage da sind.
    Aber bitte dran denken, die Geräte sind nicht unendlich schnell.

    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    12. Februar 2009 15:17

    Hallo Fiddi,

    das wollte ich gerade in nem Edit schreiben, denke auch der ist fertig mit allem, bevor die Waage überhaupt den Befehl bekommen hat.

    na da dachte ich mir doch ich schick ihm den Befehl und mit nem zweiten Button lese ich das einfach aus, aber ne, is nicht.
    Wieder das Problem der Waage, so bald der Befehl gesendet ist und der Code abgearbeitet ist, scheint Navision auch die Eingabe zu blocken, da mir die Waage mal wieder sagt, keine Schnittstelle, obwohl der Comport offen ist.
    Mit dem zweiten Button, der den Imput lesen soll und auch den Comport wieder schließt, empfange ich dann natürlich nix.

    Wie genau meinst Du das mit dem Timeout, genau dafür war ja eigentlich auch mein Timer Event da, es hat jede Sekunde mal geschaut, ob was drin liegt.

    Das Problem ist, ich habe schon mit einem Sleep(), einem Repeat .. untill und dem Timer Event (quellcode oben) versucht auf die Eingabe zu warten.
    Es scheint aber so, dass immer wenn Navision in dem Moment, wo die Waage mir was schicken will, irgendwas macht, und sei es ein Sleep, läuft die Waage auf nen Error.
    Wenn ich zb. repeat i:=+1 untill i=10000 mache, sendet die Waage, ich kann es aber nicht empfangen, wenn ich dagegen ein Repeat i:=i+1 untill i=100000 mache läuft die Waage auf den blöden Fehler...

    Gruß,
    Steffen
    Zuletzt geändert von Steffen am 12. Februar 2009 15:31, insgesamt 1-mal geändert.

    Re: Foto beim Packen erstellen

    12. Februar 2009 15:30

    Hallo Steffen,

    ist CommCtrl eine lokale Variable?

    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    12. Februar 2009 15:32

    CommCtrl ist die Globale Variable um die MSCOMM32.OCX einzubinden.

    Re: Foto beim Packen erstellen

    12. Februar 2009 16:22

    Hallo Steffen,

    mit wieviel Drähten ist den die Waage denn an deinen COM-Port angeschlossen? (3 oder mehr, egal wieviele Stifte der Stecker hat, welche sind belegt). Hast du ein Kabel bei dem auch RTS verwendet wird, schickt die Waage solange nichts bis RTS an der COM-Schnittstelle eingeschaltet wird.

    Dazu füge noch folgendes in deinen Code ein, wenn du den Empfang freigibst.
    Code:
    CommCtrl.RTSEnable:=True


    Übgrigens: CommCtrl.Inputlen gibt die Pufferlänge an, die beim input- Befehl gelesen wird. Wenn Inputlen =1 ist, wird also immer nur ein Byte aus der Schnittstelle gelesen.

    Gruß, Fiddi

    Re: Foto beim Packen erstellen

    12. Februar 2009 17:15

    Hallo Fiddi,

    ich danke Dir vielmals :-D.

    Das mit den Drähten weiß ich zwar jetzt nicht, da es nur eine geliehene Waage ist und alles fest verdrahtet ist, da schraub ich nix auf ;-), aber die Sache mit dem dem RTSEnable:= True war goldrichtig. Da sagt mein Compi der Waage ja, dass er bereit ist und die Waage macht dann keine Rückfrage mehr, so habe ich das jetzt verstanden.
    Darauf soll mal einer kommen, umso mehr ich gelesen habe um so mehr Befehle wurden es und da habe ich langsam auch die Übersicht über wichtig und nicht wichtig verloren.

    So und fürs Protokoll:
    hier der fertige Quellcode um eine Rhewa Waage an Navision anzubinden:

    Zwei Globale Variablen:

    Gewicht:String;
    CommCtrl:MSCOMM32.OCX;

    Für die gesamte Form:
    Code:
    Form - OnInit()
    //möglich Comport werte
    CommCtrl.InBufferSize := 1024;
    CommCtrl.OutBufferSize := 512;
    CommCtrl.Settings := '9600,n,8,1';


    Button zum Gewicht holen:
    Code:
    <Control1000000001> - OnPush()
    //comport öffnen

    CommCtrl.CommPort := 1;
    CommCtrl.RThreshold := 1;
    CommCtrl.InputLen := 512;
    CommCtrl.PortOpen := TRUE;

    //eingabe an Waage schicken
    CommCtrl.Output:='<GB1%.3f kg>'; //Ausgabe Befehl für die Waage
    CommCtrl.RTSEnable:=True;
    SLEEP(500);
    Gewicht:=CommCtrl.Input;
    Gewicht :=DELSTR(Gewicht,9,4); //Antwort String etwas beschneiden

    //comport schließen
    CommCtrl.RThreshold := 0;
    CommCtrl.PortOpen:=FALSE;


    Aber eine abschließende Frage zum Thema Waage habe ich noch.
    Würde es Sinn machen, das öffnen und schließen des Comports mit in die Form zu ziehen, so spart man ja ein paar Systemressourcen beim Ausführen des Gewicht holen? Oder ist das vernachlässigbar und ich lasse das lieber Alles in der einen Funktion, wodurch keine möglichen Komplikationen durch den noch offenen Port bestehen.

    Gruß,
    Steffen

    Re: Foto beim Packen erstellen

    12. Februar 2009 17:29

    Hallo Steffen,

    so wie du das hier programmiert hast, kannst du die komplette Comm-Programmierung in die Funktion reinziehen, dann hast du immer einen definierten Zustand. Im Form macht das nur Sinn, wenn du aus unterschiedlichen Funktionen sendest und empfängst. Dann solltest du aber die Einrichtung, das Öffnen und Schließen auch auf Form- Ebene machen.

    Wenn RTSEnable funktioniert, hast du wahrscheinlich ein Anschlusskabel mit mehr als 3 Drähten.