246 lines
5.3 KiB
OpenEdge ABL
246 lines
5.3 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 = "CFM85P"
|
|
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"
|
|
'==============================================================================
|
|
'
|
|
' File : CFM85P
|
|
' Author : Andreas Schmidt
|
|
' Date : 27.01.1999
|
|
' Version: 0.01
|
|
'
|
|
'==============================================================================
|
|
'
|
|
' History:
|
|
'
|
|
' Author : Andreas Schmidt
|
|
' Date : 27.01.1999
|
|
' Version: 0.01
|
|
'
|
|
' Erste Version mit rh.
|
|
'
|
|
'==============================================================================
|
|
|
|
Option Explicit
|
|
|
|
' Parent jedes FM85P-Objekts ist der CFMBus
|
|
Private m_FMBus As CFMBus
|
|
|
|
' Adresse dieses FM85P im FM-BUS
|
|
Private m_Address As Integer
|
|
|
|
' Letzter Fehlercode des FM85P
|
|
Private m_nError As Integer
|
|
|
|
' Letzte Antwort des FM85P
|
|
Private m_sAnswer
|
|
|
|
' Maximale Wartezeit auf eine Antwort
|
|
Const DEFAULT_TIMEOUT = 1100
|
|
|
|
'
|
|
' FM85P neu initialisieren, evtl. gespeicherten Fehlercode
|
|
' zurücksetzen etc.
|
|
'
|
|
Public Function Reset()
|
|
' TODO: FM ansprechen, resetten. Nur true zurückgeben,
|
|
' wenn hardware-reset erfolgreich war
|
|
|
|
clearStateMembers
|
|
|
|
Reset = True
|
|
End Function
|
|
|
|
'
|
|
' Objektmember, die über den Zustand der letzten
|
|
' Kommunikation Auskunft geben, zurücksetzen.
|
|
'
|
|
Private Sub clearStateMembers()
|
|
m_nError = 0
|
|
m_sAnswer = ""
|
|
End Sub
|
|
|
|
|
|
'
|
|
' @param FMBus Bus, dem der FM85P zugeordnet ist
|
|
'
|
|
Public Sub setFMBus(FMBus As CFMBus)
|
|
Set m_FMBus = FMBus
|
|
End Sub
|
|
|
|
|
|
'
|
|
' @param nAdresse Adresse des FM85P im Bus
|
|
'
|
|
Public Sub setAdress(nAdress As Integer)
|
|
m_Address = nAdress
|
|
End Sub
|
|
|
|
'
|
|
' @return Adresse des FM85P
|
|
'
|
|
Public Function getAdress() As Integer
|
|
getAdress = m_Address
|
|
End Function
|
|
|
|
'
|
|
' 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 FM85P_ERR_TIMEOUT:
|
|
getErrorDesc = FM85P_ERR_TIMEOUT_D
|
|
Case FM85P_ERR_UNKNOWNANSWER:
|
|
getErrorDesc = FM85P_ERR_UNKNOWNANSWER_D + " (" + m_sAnswer + ")"
|
|
Case FM85P_ERR_NOANSWER:
|
|
getErrorDesc = FM85P_ERR_NOANSWER_D
|
|
Case FM85P_ERR_BUS:
|
|
getErrorDesc = FM85P_ERR_BUS_D
|
|
Case Default
|
|
getErrorDesc = ""
|
|
End Select
|
|
End Function
|
|
|
|
'
|
|
' FM85P ansprechen
|
|
'
|
|
' @return true = OK,
|
|
' false = Fehler beim Senden oder keine Antwort erhalten
|
|
'
|
|
Public Function sendAttention() As Boolean
|
|
Dim nAddress As Integer
|
|
clearStateMembers
|
|
nAddress = getAdress()
|
|
|
|
If nAddress = 0 Then
|
|
Stop
|
|
End If
|
|
|
|
|
|
If Not m_FMBus.send("**" & nAddress & "@") Then
|
|
m_nError = FM85P_ERR_BUS
|
|
Exit Function
|
|
End If
|
|
|
|
' zuletzt angesprochenen Zähler merken
|
|
m_FMBus.SetLastFM (nAddress)
|
|
|
|
|
|
m_sAnswer = m_FMBus.receive(DEFAULT_TIMEOUT)
|
|
|
|
If m_FMBus.getErrorCode() <> 0 Then
|
|
m_nError = FM85P_ERR_BUS
|
|
Exit Function
|
|
End If
|
|
|
|
If Left$(m_sAnswer, 6) = "*FM85P" Or Left$(m_sAnswer, 7) = "*FM2014" Then
|
|
sendAttention = True
|
|
ElseIf Left$(m_sAnswer, 8) = " TIMEOUT" Then
|
|
m_nError = FM85P_ERR_TIMEOUT
|
|
ElseIf InStr(1, m_sAnswer, Hex(nAddress)) > 0 Then
|
|
sendAttention = True
|
|
ElseIf m_sAnswer <> "" Then
|
|
m_nError = FM85P_ERR_UNKNOWNANSWER
|
|
Else
|
|
m_nError = FM85P_ERR_NOANSWER
|
|
End If
|
|
End Function
|
|
|
|
'
|
|
'Daten an FM85P senden
|
|
'
|
|
'@return true = OK,
|
|
' false = Fehler beim Senden
|
|
'
|
|
Public Function send(data As String) As Boolean
|
|
send = True
|
|
Dim nAddress As Integer
|
|
|
|
If m_Address <> m_FMBus.GetLastFM Then
|
|
' Todo:
|
|
If sendAttention() Then
|
|
Else
|
|
End If
|
|
End If
|
|
|
|
clearStateMembers
|
|
If Not m_FMBus.send(data) Then
|
|
m_nError = FM85P_ERR_BUS
|
|
send = False
|
|
Exit Function
|
|
End If
|
|
End Function
|
|
|
|
'
|
|
' @return letzte Antwort des FM85P
|
|
'
|
|
Public Function getLastAnswer()
|
|
getLastAnswer = m_sAnswer
|
|
End Function
|
|
|
|
'
|
|
'
|
|
' @ return true = OK
|
|
' false = keine Antwort oder Timeout bekommen
|
|
'
|
|
Public Function receive()
|
|
m_sAnswer = m_FMBus.receive(DEFAULT_TIMEOUT)
|
|
If m_FMBus.getErrorCode() <> 0 Then
|
|
m_nError = FM85P_ERR_BUS
|
|
Exit Function
|
|
End If
|
|
If Left$(m_sAnswer, 8) = " TIMEOUT" Then
|
|
m_nError = FM85P_ERR_TIMEOUT
|
|
Exit Function
|
|
Else
|
|
If m_sAnswer = "" Then
|
|
m_nError = FM85P_ERR_NOANSWER
|
|
Exit Function
|
|
Else
|
|
receive = True
|
|
End If
|
|
End If
|
|
End Function
|
|
|
|
|
|
' sendet einen String zum FM85 und gibt die Antwort zurück
|
|
Public Function dialog(data)
|
|
send (data)
|
|
If receive() Then
|
|
dialog = getLastAnswer()
|
|
Else
|
|
dialog = ""
|
|
End If
|
|
End Function
|