laatzen/Pruef2000/source/Waage.cls
2021-10-01 11:11:04 +02:00

681 lines
20 KiB
OpenEdge ABL

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "CWaage"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
' Private Member
' --------------
' Comm Objekt, sollte vorher im g_App initialisiert sein
Private WithEvents m_comm As MSComm
Attribute m_comm.VB_VarHelpID = -1
' Angewählte Waaeg merken
Private m_Angewaehlt As Integer
' Letzter Fehlercode der seriellen Schnittstelle
Private m_nError As Integer
' Software Inputbuffer der seriellen Kommunikation
Private m_sInputBuffer As String
Private m_sStatus As String
Public m_strFehler As String
Public sLastAnswer As String
Public SoftTaraGewicht As Double
' Ruhe Parameter
Private m_RuheWdh As Integer
Private m_RuheGrenzwert As Double
Private m_ObererGrenzwert As Double ' wichtig für Grenzwert setzen
Public m_Waagenart As Integer
Private m_Nr As Integer
Public Function BefehlAnWaage(sBefehl As String, sBedeutung As String) As Boolean
Dim sAntwort As String
Call COMPufferleeren
send (sBefehl)
sAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
Select Case sAntwort
Case "w0"
BefehlAnWaage = True
Case "w5"
BefehlAnWaage = True
Case Else
DebugMsg sBedeutung & " ist 1. mal fehlgeschlagen: '" & sAntwort & "'"
Sleep 1000
send (sBefehl)
sAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
If sAntwort = "w0" Or sAntwort = "w5" Then
BefehlAnWaage = True
Exit Function
Else
DebugMsg sBedeutung & " ist 2. mal fehlgeschlagen: '" & sAntwort & "'"
Exit Function
End If
End Select
Exit Function
BefehlAnWaageFehler:
ErrorMsg ("Waagenstörung! Funktion " & sBedeutung & " fehlgeschlagen. Abbruch empfohlen.")
BefehlAnWaage = False
End Function
Public Function TaraReset() As Boolean
Dim strAntwort As String
Select Case m_Waagenart
Case WAAGENART_BIZERBA
TaraReset = BefehlAnWaage("q#", "TaraReset")
Case WAAGENART_METTLER
send ("T ")
strAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
If Left(strAntwort, 2) = "TB" Then
TaraReset = True
Else
TaraReset = False
End If
Case WAAGENART_METTLER_2
send ("TAC")
strAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
If Left(strAntwort, 5) = "TAC A" Then
TaraReset = True
Else
TaraReset = False
End If
End Select
End Function
' Setzt Grenzwert 1 für Nettovergleich
Public Function SetNettoGrenzwert1(Grenzwert As Double, Optional sFormat = "0.0") As Boolean
Dim sBefehl As String
Dim strAntwort As String
SetNettoGrenzwert1 = False
Select Case m_Waagenart
Case WAAGENART_BIZERBA
sBefehl = Chr$(39) & Chr$(49) & Format(Format(Grenzwert, sFormat), "@@@@@@@@") & "kg"
SetNettoGrenzwert1 = BefehlAnWaage(sBefehl, "SetNettoGrenzwert1")
Case WAAGENART_METTLER
sBefehl = "AW020 "
send (sBefehl)
strAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
' Grenzwert, uToleranz, oToleranz, Startwert
sBefehl = "AW020 " & FormatMETTLERGrenzwert(Grenzwert, "kg") & Chr(9) & FormatMETTLERGrenzwert(0.1, "kg") & Chr(9) & FormatMETTLERGrenzwert(0.1, "kg") & Chr(9) & FormatMETTLERGrenzwert(0, "kg")
send (sBefehl)
strAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
If strAntwort = "AB" Then
SetNettoGrenzwert1 = True
End If
Case WAAGENART_METTLER_2
' oberer Grenzwert, unterer Grenzwert TODO
Select Case g_App.PruefstationNr
Case 2007, 2005
sBefehl = "PMW ABS " & FormatMETTLERGrenzwert(Grenzwert, "") & " 250 kg"
Case Else
If m_ObererGrenzwert > 0 Then
sBefehl = "PMW ABS " & Replace(Format(Grenzwert, "0.00"), ",", ".") & " " & Replace(Format(m_ObererGrenzwert, "0.00"), ",", ".") & " kg"
Else
sBefehl = "PMW ABS " & FormatMETTLERGrenzwert(Grenzwert, "") & " 150 kg"
End If
End Select
send (sBefehl)
strAntwort = receive(WAAGE_DEFAULT_TIMEOUT)
If strAntwort = "PMW A" Then
SetNettoGrenzwert1 = True
End If
Case WAAGENART_FUELLSTAND
' nicht vorgsehen
SetNettoGrenzwert1 = True
End Select
End Function
Public Function Anwahl(iAnwahl As Integer) As Boolean
Dim Count As Integer
If iAnwahl = 0 Then
' nur die Prüfstationen 2000/2001 und 2015/2016 benötigen die Waagen-Anwahl
' alle anderen brauchen diesen Befehl nicht
Anwahl = True
Exit Function
End If
Select Case m_Waagenart
Case WAAGENART_BIZERBA
Do
Anwahl = BefehlAnWaage("qV" & Right(Str(iAnwahl), 1), "Anwahl")
If Anwahl = False Then
Sleep 1000
End If
Count = Count + 1
Loop Until Anwahl = True Or Count > 3
Case WAAGENART_METTLER, WAAGENART_METTLER_2
' nicht implementert
Debug.Print "Anwahl für Mettler nicht implementert"
Anwahl = True
End Select
End Function
'Public Function AufNullStellenOderTara()
' If g_App.Settings.GetWaageTaraStattNullstellen(m_Nr) = True Then
' Me.SoftTaraReset
' Me.Tara
' Else
' Me.Nullstellen
' End If
'End Function
' Hier läd die Klasse seine Einstellungen selbst aus der ini
Public Sub Initialize(iNr As Integer)
On Error GoTo Errorhandler
m_Nr = iNr
' Port Schließen
If m_comm.PortOpen = True Then
m_comm.PortOpen = False
Debug.Print "Waage COMPort " & m_comm.CommPort & " geschlossen"
End If
' Port wechseln
If g_App.Settings.GetWaageCOMPort(iNr) <> 0 Then
m_comm.CommPort = g_App.Settings.GetWaageCOMPort(iNr)
End If
' RS232 Parameter ändern
If g_App.Settings.GetWaageCOMSettings(iNr) <> "" Then
m_comm.Settings = g_App.Settings.GetWaageCOMSettings(iNr)
End If
If g_App.Settings.GetWaageObererGrenzwert(iNr) <> "" Then
m_ObererGrenzwert = g_App.Settings.GetWaageObererGrenzwert(iNr)
Else
m_ObererGrenzwert = 0
End If
' Waagen Art ändern
If g_App.Settings.GetWaageArt(iNr) <> "" Then
Select Case g_App.Settings.GetWaageArt(iNr)
Case "METTLER"
m_Waagenart = WAAGENART_METTLER
Case "BIZERBA"
m_Waagenart = WAAGENART_BIZERBA
Case "METTLER_2"
m_Waagenart = WAAGENART_METTLER_2
Case "FUELLSTAND"
m_Waagenart = WAAGENART_FUELLSTAND
Case Else
MsgBox "Unbekannte Waagenart in ini: " & m_Waagenart
End Select
End If
If m_comm.PortOpen = False Then
m_comm.PortOpen = True
Debug.Print "Waage an COM-" & m_comm.CommPort & " geöffnet"
End If
Exit Sub
Errorhandler:
ErrorMsg "Waage konnte nicht an COM" & g_App.Settings.GetWaageCOMPort(iNr) & " initialisiert werden: Fehler " & Err.Number & vbCrLf & Err.Description
Exit Sub
Resume
End Sub
Public Function Nullstellen() As Boolean
Dim strTmp As String
Select Case m_Waagenart
Case WAAGENART_BIZERBA
Nullstellen = BefehlAnWaage("q!", "Nullstellen")
Case WAAGENART_METTLER
send ("Z")
strTmp = receive(WAAGE_DEFAULT_TIMEOUT)
Select Case Left(strTmp, 2)
Case "ZB", "TA"
Nullstellen = True
Case Else
Nullstellen = False
End Select
Case WAAGENART_METTLER_2
send ("ZI")
strTmp = receive(WAAGE_DEFAULT_TIMEOUT)
Select Case Left(strTmp, 4)
Case "ZI D", "ZI S"
Nullstellen = True
Case Else
Nullstellen = False
End Select
Case Else
End Select
If Nullstellen = False Then
DebugMsg "Nullstellen fehlgeschlagen"
End If
End Function
' Warte bis Waage in Ruhe
Public Function WarteAufRuhe()
FrmWaagenRuhe.m_sFormat = "0.00"
FrmWaagenRuhe.Show vbModal
End Function
' @return Bruttogewicht der ausgewählten Waage in kg
' -1 wenn das Gewicht nicht ermittelt werden kann
Public Function GetGewicht() As Double
Dim strTmp As String
Dim versuchzaehler As Integer
GetGewicht = -9999
On Error Resume Next
If m_comm.PortOpen = False Then
m_comm.PortOpen = True
End If
nochmal:
versuchzaehler = versuchzaehler + 1
If versuchzaehler > 20 Then
GetGewicht = -9999
Exit Function
ElseIf versuchzaehler > 1 Then
' Wiederholung
DebugMsg "Gewicht konnte das " & versuchzaehler & ". mal nicht gelesen werden!"
End If
Call COMPufferleeren
Select Case m_Waagenart
Case WAAGENART_BIZERBA
If send("q%") Then
strTmp = receive(WAAGE_DEFAULT_TIMEOUT)
If Len(strTmp) = 13 Then
m_sStatus = Mid$(strTmp, 2, 1)
If Right$(strTmp, 2) = "kg" Then
'GetGewicht = CDbl(Mid(strTmp, 3, 8))
strTmp = Right(strTmp, 11)
If InStr(1, strTmp, "?") Then
DebugMsg "ungültiges Gewicht von der Waage: '" & strTmp & "'"
GoTo nochmal
End If
strTmp = Replace(strTmp, ",", ".")
GetGewicht = Val(strTmp)
Else
m_nError = WAAGE_ERR_UNKNOWNANSWER
DebugMsg "Gewicht konnte nicht ermittelt werden (unknown Answer): " & vbCrLf & Err.Description & vbCrLf & "Antwort: " & strTmp
DebugMsg m_strFehler
End If
Else
m_nError = WAAGE_ERR_UNKNOWNANSWER
DebugMsg "Gewicht konnte nicht ermittelt werden (unknown Answer): " & vbCrLf & Err.Description
DebugMsg m_strFehler
End If
Else
m_nError = WAAGE_ERR_COM
DebugMsg "Gewicht konnte nicht ermittelt werden (COM Error): " & vbCrLf & Err.Description
DebugMsg m_strFehler
End If
GetGewicht = GetGewicht - SoftTaraGewicht
Case WAAGENART_METTLER, WAAGENART_METTLER_2
send ("SXI")
strTmp = receive(WAAGE_DEFAULT_TIMEOUT)
If Left(strTmp, 4) = "SX D" Or Left(strTmp, 4) = "SX S" Or Left(strTmp, 5) = "SX G" Or Left(strTmp, 5) = "SXD G" Then
'SX D G 0.081 kg N 0.081 kg T 0.000 kg '
'SX S G -0.022 kg N -0.022 kg T 0.000 kg '
'SX G 1.0 kg N 1.0 kg T 0.0 kg ' ==> 2020 3.2.2015
'SXD G 467.6 kg N 467.6 kg T 0.0 kg ' ==> 2020 3.2.2015
strTmp = Mid(strTmp, 24, 12)
' todo: testen ab ab Position 25 auf der 2020
strTmp = Replace(strTmp, "N", "")
GetGewicht = Val(strTmp)
GetGewicht = GetGewicht - SoftTaraGewicht
Else
Unknown_Answer:
m_nError = WAAGE_ERR_UNKNOWNANSWER
Select Case strTmp
Case "SI"
DebugMsg "Waage: ungültiger Wert"
Case "SI-", "SX -"
DebugMsg "Waage im Unterlastbereich"
Case "SI+", "SX +"
DebugMsg "Waage im Überlastbereich"
Case Else
DebugMsg "Waage: unbekannte Antwort '" & strTmp & "', info: '" & m_strFehler & "'"
End Select
If g_Abbruch = True Then Exit Function
GoTo nochmal
End If
Case Else
End Select
End Function
Public Function Tara() As Boolean
Dim strTemp As String
Call COMPufferleeren
Select Case m_Waagenart
Case WAAGENART_BIZERBA
Tara = BefehlAnWaage("q" & Chr$(34), "Tara")
Case WAAGENART_METTLER
send ("T")
strTemp = receive(WAAGE_DEFAULT_TIMEOUT)
Select Case Left(strTemp, 2)
Case "TB", "ZA"
Tara = True
Case "T-", "Z-"
DebugMsg "TARA-Fehler, Tarabereich unterschritten!"
Case "T+", "Z+"
DebugMsg "TARA-Fehler, Tarabereich überschritten!"
Case Else
DebugMsg "TARA-Fehler, Waage antwortetet mit '" & strTemp & "'"
End Select
Case WAAGENART_METTLER_2
send ("TI")
strTemp = receive(WAAGE_DEFAULT_TIMEOUT)
Select Case Left(strTemp, 4)
Case "TI S", "TI D"
Tara = True
Case Else
Tara = False
End Select
End Select
End Function
Public Function Reset() As Boolean
If m_comm.PortOpen = False Then
m_comm.PortOpen = True
End If
Select Case m_Waagenart
Case WAAGENART_BIZERBA
Call COMPufferleeren
If send("q ") Then
'Eingefügt am 24.6.2002 (Dirk Pulwer)
Sleep 10000
If InStr(1, receive(WAAGE_DEFAULT_TIMEOUT), "w0") > 0 Then
Reset = True
Else
DebugMsg m_strFehler
DebugMsg "Reset wird wiederholt"
COMPufferleeren
Sleep 7000, True
send ("q " & vbCrLf)
'Eingefügt am 24.6.2002 (Dirk Pulwer)
Sleep 10000
If InStr(1, receive(WAAGE_DEFAULT_TIMEOUT), "w0") > 0 Then
Reset = True
Else
DebugMsg m_strFehler
Reset = False
End If
End If
End If
'sleep 6000
Case WAAGENART_METTLER
DebugMsg "Reset bei Mettler nicht implementiert"
Reset = True
Case WAAGENART_METTLER_2
Call COMPufferleeren
send ("@")
receive (WAAGE_DEFAULT_TIMEOUT)
Reset = True
End Select
End Function
Public Sub OpenMSComm()
On Error GoTo Errorhandler
If m_comm.PortOpen = False Then
m_comm.PortOpen = True
End If
Exit Sub
Errorhandler:
ErrorMsg ("OpenMSComm COM Port der Waage konnte nicht geöffnet werden")
End Sub
Public Sub setMScomm(comm As MSComm)
Dim comport As Integer
On Error Resume Next
Set m_comm = comm
comport = g_App.Settings.getCOMPort(DEVPORT_Waage)
If comport <> 0 Then
' aus Inifile
Debug.Print "Waage an COM " & comport & "!"
m_comm.CommPort = comport
End If
m_comm.DTREnable = True ' notwendig für FM85.P, für Waage ?
m_comm.EOFEnable = False ' evtl. noch zu klären
m_comm.Settings = "9600,E,7,1" ' notwendig
m_comm.InputLen = 0
m_comm.RThreshold = 1 'Event bei jedem Empfang
End Sub
'
' Daten auf serielle Schnittstelle senden
' @return true wenn erfolgreich, false wenn Fehler
Public Function send(s As String) As Boolean
On Error GoTo WaageSendErr
If m_comm.PortOpen = False Then
m_comm.PortOpen = True
End If
m_strFehler = "An Waage gesendet: '" & s & "'"
DebugMsg "An Waage gesendet: '" & s & "'"
m_sInputBuffer = ""
m_comm.Output = s & vbCrLf
send = True
Exit Function
WaageSendErr:
send = False
' Fehler sichtbar machen, protokollieren...
DebugMsg "Konnte '" & s & "' nicht an Waage senden."
Exit Function
End Function
'
' Eingabe von serieller Schnittstelle
'
' @param nTimeoutMillis Anzahl der max. zu wartenden Millisekunden
'
Public Function receive(nTimeoutMillis As Integer) As String
DoEvents
Dim msEnd As Long
receive = ""
On Error GoTo WaageReceiveErr
msEnd = GetTickCount() + nTimeoutMillis
Do
' TODO: Von Serieller lesen!
DoEvents
If Right(m_sInputBuffer, 2) = Chr(13) + Chr(10) Then
' ganze Zeile von Waage empfangen
Exit Do
End If
Loop While GetTickCount() <= msEnd
If GetTickCount() > msEnd Then
' Todo Fehlerbehandlung optimieren
m_nError = WAAGE_ERR_NOANSWER
DebugMsg "Keine Antwort von Waage "
receive = ""
Exit Function
End If
' CR LF abschneiden
receive = Mid(m_sInputBuffer, 1, Len(m_sInputBuffer) - 2)
m_strFehler = m_strFehler & vbCrLf & "Von Waage empfangen: '" & receive & "'"
sLastAnswer = m_sInputBuffer
m_sInputBuffer = ""
Exit Function
WaageReceiveErr:
receive = ""
DebugMsg ("WaageRecieveErr: '" & Err.Description) & "'"
Exit Function
End Function
' @return Daten aus Inputbuffer
'
Public Function getData() As String
getData = m_sInputBuffer
End Function
Private Sub Class_Initialize()
m_Angewaehlt = 0
m_Waagenart = WAAGENART_BIZERBA
End Sub
Private Sub Class_Terminate()
On Error Resume Next
m_comm.PortOpen = False
End Sub
' Event-Handler für das MS-Comm Control
'
Private Sub m_comm_OnComm()
Dim nEvent As Integer
Dim sTmp As String
nEvent = m_comm.CommEvent
Select Case nEvent
Case comEvReceive
sTmp = m_comm.Input
m_sInputBuffer = m_sInputBuffer & sTmp
DebugMsg "Waage sendet: " & m_sInputBuffer
Case Default
m_nError = WAAGE_ERR_COM
DebugMsg "Serial Event: " & nEvent & vbCrLf
End Select
End Sub
' Liegt ein Fehler vor?
'
' @return true = Fehler liegt vor, Fehlerbeschreibung kann
' mit getErrorCode/getErrorDesc eingeholt
' werden
' false = alles OK
'
Public Function hasError() As Boolean
hasError = (m_nError <> 0)
End Function
' @return Interner Code des letzten Fehlers
' (siehe modFM85P.bas)
'
Public Function getErrorCode() As Integer
getErrorCode = m_nError
End Function
' @return Erläuterung zu dem letzten Fehler
'
Public Function getErrorDesc() As String
Select Case m_nError
Case WAAGE_ERR_NOANSWER
getErrorDesc = WAAGE_ERR_NOANSWER_D
Case Default
getErrorDesc = ""
End Select
End Function
' Funktion kehrt erst Zurück, wenn Waage ein
' Gewicht mit gesetztem Ruhe-Bit zurück gibt
'
Public Function WarteBisRuhe()
DebugMsg "Warte bis Waage in Ruhe"
Do While True
If GetGewicht() <> -1 Then
If Asc(m_sStatus) And 1 = 1 Then
Exit Do
End If
Else
MsgBox ("Waagen fehler: gewicht = -1")
Exit Do
End If
Loop
End Function
Public Sub releaseMScomm()
DebugMsg "releaseMScomm"
On Error Resume Next
If m_comm.PortOpen = True Then
m_comm.PortOpen = False
End If
If Err Then
DebugMsg "releaseMScomm Fehler: " & Err.Number & ": " & Err.Description
' MsgBox ("Fehler beim Schließen des Comm port für Waage: " & Err.Description)
End If
End Sub
Public Sub SoftTara()
SoftTaraGewicht = 0
SoftTaraGewicht = GetGewicht
DebugMsg "Softtara bei " & SoftTaraGewicht
End Sub
Public Sub SoftTaraReset()
SoftTaraGewicht = 0
End Sub
Private Function COMPufferleeren()
Dim sTmp As String
' m_sInputBuffer = ""
'Exit Function
If m_comm.PortOpen = False Then
m_comm.PortOpen = True
End If
On Error Resume Next
sTmp = m_comm.Input
If Err.Number > 0 Then
DebugMsg "Fehler " & Err.Number & " in COMPufferleeren: " & Err.Description
End If
If sTmp <> "" Then
DebugMsg "Waagen COM-Puffer war nicht leer: '" & sTmp & "'"
End If
End Function
Private Function FormatMETTLERGrenzwert(eingabe As Double, unit As String) As String
FormatMETTLERGrenzwert = Replace(Format(eingabe, "0.00"), ",", ".") & " " & Mid(Trim(unit) & " ", 1, 3)
End Function