Standardwaagenprofil-Unterstützung: Aeinswiege

 

AeinsWiege ist ein Programm, welches das Wiegen von solchen Waage-Protokollen unterstützen soll, bei denen die Bordmittel von Aeins nicht ausreichen. 

AeinsWiege ist so konzipiert das es "einfach" mit Hilfe des Standard-Waagenprofils in Aeins angesprochen wird. 

In der jetzigen Ausbaustufe wird AeinsWiege durch eine XML gesteuert. 

Da hier mit XML hantiert wird werden statt der sonst aus dem WAM gewohnten <STX>,<ETX>,usw. eben [STX],[ETX],usw. verwendet.

 

Interessant sind u.a. 3 neue "Direktiven":

1.   BCC

Vom WAM her dürfte schon die Möglichkeit bekannt sein die Prüfsumme für ausgehende Kommandos zu berechnen. AeinsWiege kann das auch für eingehende Waagendaten. Das ist wichtig, da manche Protokolle nach Sendung der Wiegedaten ( die mit BCC von der Waage aus gesendet werden ) noch eine positive Quittierung brauchen. Es ist einfach viel geschickter, wenn AeinsWiege diese BCC auch geprüft hat und dann entsprechend verfährt!

Beispiel:

<Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX]([DATA][ETX])[BCC]" Result="1"/>

Hinweis: Ausgehend - also im Send - ist die %BCC%-Syntax, eingehend - also im Expect - ist die [BCC]-Syntax.

2.   DATA

Steht für eine beliebige Anzahl von unbekannten Zeichen.

Beispiel hierfür ist die obige Sequenz. AeinsWiege schickt an die Waage "[SOH]Ap[ENQ]", die Waage sendet daraufhin "[SOH]A[STX]QA[SP]0016060000000025140206144407[ETX]6" zurück. Der gesamte Anteil zwischen [STX]…[ETX] entspricht dabei ohne dass STX und ETX eben DATA, wobei die Prüfsumme von der Waage über [DATA] incl. [ETX] gebildet wurde und in diesem Falle 6 ist.

3.   DATE

Mit Hilfe dieser Konstruktion lassen sich formatierte Zeitwerte innerhalb eines Send-Strings definieren.

Beispiel:

<Sequence

Send="[SOH]A[STX](ZSD{ddMMyyyyHHmm}%DATE%[ETX])%BCC%[ENQ]" Expect="[ACK]" Wait="1000" />

Innerhalb der geschweiften Klammern steht der Format-String für die C#-Funktion ToString von DateTime-Objekt.

Alle Möglichkeiten hierzu lassen sich am besten übers Internet recherchieren.

In diesem Beispiel bedeutet:

Format

Bedeutung

dd

Tagesangabe 2-stellig

MM

Monatsangabe 2-stellig

yyyy

Jahresangabe 4-stellig

HH

Stundenangabe 2-stellig

mm

Minutenangabe 2-stellig

 

XML-Session-Beschreibung:

Session-Attribut

Beispiel

Anmerkung

PortName

COM1

Legt den Anschluss für die Kommunikation fest, einschließlich

aller verfügbaren COM-Anschlüsse, aber nicht beschränkt auf diese.

 

Ausnahmen:

   System.ArgumentException:

Die System.IO.Ports.SerialPort.PortName-Eigenschaft wurde auf einen Wert mit einer Länge von 0 festgelegt.

- oder -

Die System.IO.Ports.SerialPort.PortName-Eigenschaft wurde auf einen Wert festgelegt, der mit "\\" beginnt.

- oder -

Der Anschlussname war nicht gültig.

  

System.ArgumentNullException:

  Die System.IO.Ports.SerialPort.PortName-Eigenschaft wurde auf null festgelegt.

 

System.InvalidOperationException:

   Der angegebene Anschluss ist offen.

BaudRate

9600

Legt die serielle Baudrate fest.

 

Ausnahmen:

  System.ArgumentOutOfRangeException:

Die angegebene Baudrate ist kleiner oder gleich 0 oder größer als die maximal für das Gerät zulässige Baudrate.

  System.IO.IOException:

Der Anschluss befindet sich in einem ungültigen Zustand.

- oder -

Fehler  beim Versuch, den Zustand des zugrunde liegenden Anschlusses festzulegen.

Beispielsweise waren die von diesem System.IO.Ports.SerialPort-Objekt übergebenen Parameter ungültig.

DataBits

8

Legt die Standardlänge der Datenbits pro Byte fest.

 

Ausnahmen:

  System.IO.IOException:

Der Anschluss befindet sich in einem ungültigen Zustand.

- oder -

Fehler beim Versuch, den Zustand des zugrunde liegenden Anschlusses festzulegen. Beispielsweise  waren die von diesem System.IO.Ports.SerialPort-Objekt übergebenen Parameter  ungültig.

   

  System.ArgumentOutOfRangeException:

Der Datenbitwert ist kleiner als 5 oder höher als 8.

StopBits

1

Legt die Standardanzahl von Stoppbits pro Byte fest.

 

Ausnahmen:

  System.ArgumentOutOfRangeException:

Der System.IO.Ports.SerialPort.StopBits-Wert ist keiner der Werte aus der System.IO.Ports.StopBits-Enumeration.

 

  System.IO.IOException:

Der Anschluss befindet sich in einem ungültigen Zustand.

- oder -

Fehler beim Versuch, den Zustand des zugrunde liegenden Anschlusses festzulegen.

Beispielsweise waren die von diesem System.IO.Ports.SerialPort-Objekt übergebenen Parameter ungültig.

Parity

 

(Parität)

2

 

 

0-None

1-Odd

2-Even

3-Mark

4-Space

Legt das Paritätsprüfungsprotokoll fest.

 

Ausnahmen:

  System.IO.IOException:

Der Anschluss befindet sich in einem ungültigen Zustand.

- oder -

Fehler  beim Versuch, den Zustand des zugrunde liegenden Anschlusses festzulegen. Beispielsweise waren die von diesem System.IO.Ports.SerialPort-Objekt übergebenen Parameter ungültig.

  System.ArgumentOutOfRangeException:

Der übergebene System.IO.Ports.SerialPort.Parity-Wert ist kein gültiger Wert in der System.IO.Ports.Parity-Enumeration.

Technik

Seriell

Standard! Schaltet in den seriellen Modus, d.h. die Kommunikation geht über serielle Ports

Technik

Tcpip

Verwendet stattdessen TCPIP-Methoden

ServerIP

192.168.241.19

Ip des Hostes

ServerPort

4711

Port des Hostes

ReceiveTimeout

0

Gleichnamiges Socket-Property.

Timeout-Wert in Millisekunden (Standard ist 0, das ist gleichbedeutend mit unendlicher Wartezeit – ebenso wie -1)

Siehe auch Socket.ReceiveTimeout Property.

Continue

 

Standard ist false

Globale Setzung hier überschreibt gleichnamiges Sequence-Feature Continue

Result

 

Standard ist false

Globale Setzung hier überschreibt gleichnamiges Sequence-Feature Result

 

 

XML-Sequence-Beschreibung

Sequence-Attribut

Beispiel

Anmerkung

Send

[SOH]A[STX](WA[ETX])%BCC%[ENQ]

Hier Beispiel für abgehende BCC-Berechnung

Expect

[EOT]

Antwort der Waage

Retry

[ACK]

Wenn der Wert für Expect nicht empfangen wurde, dann besteht die Möglichkeit einer Wiederholung der Sequenz bei der vorher nochmal der  Wert von Retry gesendet wird.

 

Standard ist leer.

 

In diesem Beispiel bedeutet das, wenn das erwartete [EOT] nicht kam, dann wird [ACK] gesendet und danach nochmal der Inhalt von Send.

 

Dieses wird Tries-Mal wiederholt bevor abgebrochen wird.

Tries

10

Siehe Erläuterungen bei Retry.

 

Standard ist 10.

Wait

10000

Anzahl der Millisekunden, die gewartet werden, soll bis ein Ergebnis aufgelaufen ist.
Es kann sein das eine Waage nur einen Teil der "Expected" schickt bis zum Timeout, oder gar nichts, was fast dasselbe ist. Dann ist die Wiegung fehlgeschlagen.

Es kann sein, das weit vor dem Timeout die Waagenrückgabe schon anders als erwartet ist, dann ist auch fehlgeschlagen …

Genauso gut kann es aber sein das die Waage schon erheblich früher die erwartete Antwort gesendet hat, dann ist ja alles gut und es geht sofort weiter.

(Standard ist 100 Millisekunden)

Pause

10000

So viele Millisekunden werden nach Ausführung einer Sendung und eines Empfangs pausiert. (Standard ist 0 Millisekunden)

Delay

500

So viele Millisekunden werden nach Senden gewartet, bevor Empfang abgefragt wird. (Standard: 500 Millisekunden)

Result

1

Eine so ausgewiesene Sequence liefert Daten der Wiegung.

 

Dabei können mehrere Sequencen mit Result=1 gekennzeichnet werden. Die Daten werden dann aneinandergereiht (konkateniert).

 

(Standard: 0 )
 

Continue

1

Es gibt Fälle in denen Waagen/Wiegesysteme kein Ende-Kennzeichen bzw. Begrenzer senden, aber trotzdem noch eine abschließende Quittung benötigen. Mit Hilfe der Continue-Anweisung und dem DATA-Konstrukt lässt sich so ein Workaround schaffen, indem man die DATA-Anweisung so formuliert das sie die zu erwartende Rückgabe aufnimmt und Continue=1 AeinsWiege anweist weiter zu machen.

 

Beispiel:

([DATA]X)

 

Wobei man sicherstellen muss das das X nicht vorkommt. AeinsWiege wird bis zum Timeout versuchen das X zubekommen – was aber nicht kommen kann und normalerweise mit einem nicht erfolgreichen Abbruch quittiert wird.

Mit Continue=1 wird dann aber weiter gemacht!

 

Kommandozeilen-parameter

 

0

0: Normalmodus
1: Gui-Modus (dieser Modus ist noch Entwicklung und wird bei Anschluss neuer

Waagensysteme über dieses Programm entsprechend weiterentwicklet)

Beispiel für Start im Analyse-Modus: Aeinswiege 1

Beispiel für Start im Aeins-Modus:

' funktionsfähiges Standard-Script für das Standardwaagenprofil AMIC STANDARDWAAGE.

Der Zubringer erzeugt zufällige Wiegeergebnisse

 

' das Kundenergebnis wird standardmäßig im A.eins-Import-Verzeichnis erwartet und heisst

standardmäßig AMIC_STANDARDWAAGE.TXT

' Erzeugt wird das Kundenergebnis durch ein Script/ einen Programmaufruf der die Wiegung initiert und standardmäßig das Ergebnis in der Form

' Gewicht;Wiegnummer zurückliefert.

' Für das AMIC_STANDARDWAAGE - Profil wird eine kleine Demo-Applikation ( amic_standardwaage.exe ) im Bin-Verzeichnis mit ausgeliefert

 

' Schritt1 : Waageinitiierung

' --------------------------------------------------------------------

' Bestimmung der Lage des Kundenergebnisses

' --------------------------------------------------------------------

dim kundenergebnis

 

dim aeinsrootverz

aeinsrootverz = Aeins.param( "ahoiroot" )

kundenergebnis = aeinsrootverz &  "\import" & "\" & "AMIC_STANDARDWAAGE.TXT"

kundenergebnis = "C:\Users\ah\Documents\Entwicklung\Kairo\Aeins\A.eins.Net

\Support\ComportTester\ComportTester\bin\Debug\aeinswiege.txt"

 

dim xmlsteuerdatei

xmlsteuerdatei = "C:\Users\ah\Documents\Entwicklung\Kairo\Aeins\A.eins.Net

\Support\ComportTester\ComportTester\bin\Debug\aeinswiege.xml"

 

'msgbox kundenergebnis

 

' --------------------------------------------------------------------

' Löschen eines evtl. vorherigen Kundenergebnisses

' --------------------------------------------------------------------

dim hdl

hdl = "fso"

Aeins.jpp_new hdl , "JFileSystem"

Aeins.jpp_in  hdl , "file" , kundenergebnis

Aeins.jpp_ex  hdl , "DeleteFile"

Aeins.jpp_delete hdl

 

' --------------------------------------------------------------------

' Veranlassen des neuen Kundenergebnisses

' --------------------------------------------------------------------

dim fso:set fso = CreateObject("Scripting.FileSystemObject")

dim wiege_client

dim aeinsverz

aeinsverz = Aeins.param( "exepath" )

wiege_client = "C:\Users\ah\Documents\Entwicklung\Kairo\Aeins\A.eins.Net

\Support\ComportTester\ComportTester\bin\Debug" & "\aeinswiege.exe 0 " & xmlsteuerdatei & " " & kundenergebnis

 

ExecuteDOS wiege_client , 0 , 1

1

Location der Aeinswiege.xml. Ist keine angegeben, dann ist es standardmäßig Aeinswiege.xml

2

Location der Aeinswiege.txt. Ist keine angegeben, dann ist es standardmäßig
Aeinswiege.txt

 

Beispiel-Sitzung:

 

 

XML-Steuerdatei

<?xml version="1.0" encoding="utf-8" ?>

<!--

  PR 1613

-->

<Session ServerIP="192.168.241.93"

         ServerPort="950"

        

         Technik="tcpip"

        

         PortName="COM8"

         BaudRate="4800"

         DataBits="7"

         StopBits="1"

         Parity="2"

 

         Logging="log.txt"

  <Sequences>

    <!-- Pollen bis EOT kommt -->

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

    <Sequence Send="[EOT]" />

 

    <!-- Gewichtsanforderung -->

    <Sequence Send="[SOH]A[STX]WGA[ETX]R[ENQ]" Expect="[ACK]" />

    <Sequence Send="[EOT]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX]([DATA][ETX])[BCC]" Wait="10000" Result="1"/>

    <Sequence Send="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

    <!-- ZSD -->

    <Sequence Send="[SOH]A[STX](ZSD{ddMMyyyyHHmm}%DATE%[ETX])%BCC%[ENQ]" Expect="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX](QZSD[ETX])[BCC]" />

    <Sequence Send="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

    <!-- ZVWA -->

    <Sequence Send="[SOH]A[STX](ZVWA    0000011[ETX])%BCC%[ENQ]" Expect="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX](Q[ETX])[BCC]" />

    <Sequence Send="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

    <!-- ZVSEQ -->

    <Sequence Send="[SOH]A[STX](ZVSEQ   [ETX])%BCC%[ENQ]" Expect="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX](QVSEQ[DATA][ETX])[BCC]" Result="1"/>

    <Sequence Send="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

    <!-- BSPRINT -->

    <Sequence Send="[SOH]A[STX](BSPRINT [ETX])%BCC%[ENQ]" Expect="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX](Q[ETX])[BCC]" />

    <Sequence Send="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

    <!-- ZVFA -->

    <Sequence Send="[SOH]A[STX](ZVFA    [ETX])%BCC%[ENQ]" Expect="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[SOH]A[STX](QVFA[DATA][ETX])[BCC]" />

    <Sequence Send="[ACK]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

    <!-- AZM -->

    <Sequence Send="[SOH]AZM" Expect="[EOT]" />

    <Sequence Send="[SOH]Ap[ENQ]" Expect="[EOT]" Retry="[ACK]" />

 

  </Sequences>

</Session>

 

Beispiel-LOG

Timestamp            |Sended                                            |Readed                                              |Status   |Expected

27.03.14 09:21:15.859|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:17.073|[EOT]                                             |                                                    |Exakt    |

27.03.14 09:21:17.576|[SOH]A[STX]WGA[ETX]R[ENQ]                         |[ACK]                                               |Exakt    |[ACK]

27.03.14 09:21:18.078|[EOT]                                             |                                                    |Exakt    |

27.03.14 09:21:19.348|[SOH]Ap[ENQ]                                      |[SOH]A[STX]QGA[SP]00772610[ETX]q                    |Exakt    |[SOH]A[STX]([DATA][ETX])[BCC]

27.03.14 09:21:19.852|[ACK]                                             |                                                    |Exakt    |

27.03.14 09:21:20.354|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:20.857|[SOH]A[STX]ZSD270320140921[ETX]E[ENQ]             |[ACK]                                               |Exakt    |[ACK]

27.03.14 09:21:21.364|[SOH]Ap[ENQ]                                      |[SOH]A[STX]QZSD[ETX][US]                            |Exakt    |[SOH]A[STX](QZSD[ETX])[BCC]

27.03.14 09:21:21.866|[ACK]                                             |                                                    |Exakt    |

27.03.14 09:21:22.369|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:22.870|[SOH]A[STX]ZVWA[SP][SP][SP][SP]0000011[ETX])[ENQ] |[ACK]                                               |Exakt    |[ACK]

27.03.14 09:21:23.377|[SOH]Ap[ENQ]                                      |[SOH]A[STX]Q[ETX]R                                  |Exakt    |[SOH]A[STX](Q[ETX])[BCC]

27.03.14 09:21:23.879|[ACK]                                             |                                                    |Exakt    |

27.03.14 09:21:24.381|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:24.884|[SOH]A[STX]ZVSEQ[SP][SP][SP][ETX]h[ENQ]           |[ACK]                                               |Exakt    |[ACK]

27.03.14 09:21:25.394|[SOH]Ap[ENQ]                                      |[SOH]A[STX]QVSEQ[SP][SP][SP][SP]0000000057[ETX]A    |Exakt    |[SOH]A[STX](QVSEQ[DATA][ETX])[BCC]

27.03.14 09:21:25.897|[ACK]                                             |                                                    |Exakt    |

27.03.14 09:21:26.399|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:26.901|[SOH]A[STX]BSPRINT[SP][ETX]c[ENQ]                 |[ACK]                                               |Exakt    |[ACK]

27.03.14 09:21:27.407|[SOH]Ap[ENQ]                                      |[SOH]A[STX]Q[ETX]R                                  |Exakt    |[SOH]A[STX](Q[ETX])[BCC]

27.03.14 09:21:27.909|[ACK]                                             |                                                    |Exakt    |

27.03.14 09:21:28.412|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:28.914|[SOH]A[STX]ZVFA[SP][SP][SP][SP][ETX][BS][ENQ]     |[ACK]                                               |Exakt    |[ACK]

27.03.14 09:21:29.423|[SOH]Ap[ENQ]                                      |[SOH]A[STX]QVFA[SP][SP][SP][SP]0[ETX]3              |Exakt    |[SOH]A[STX](QVFA[DATA][ETX])[BCC]

27.03.14 09:21:29.925|[ACK]                                             |                                                    |Exakt    |

27.03.14 09:21:30.427|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:30.929|[SOH]AZM                                          |[EOT]                                               |Exakt    |[EOT]

27.03.14 09:21:31.431|[SOH]Ap[ENQ]                                      |[EOT]                                               |Exakt    |[EOT]

 

Beispiel-Ergebnis

<SOH>A<STX>QGA<SP>00772610<ETX>q<SOH>A<STX>QVSEQ<SP><SP><SP><SP>0000000057<ETX>A