Soweit, so gut...
Hallo Jens,
habe deinen Code um ein Sub ergänzt, Request und Response funktionieren jetzt soweit.
Mein bisheriger Code:
Allerdings klappt das mit dem Parsen irgendwie noch nicht bzw. kann ich mir die Ergebnisse nicht anzeigen lassen. Habe ich hier irgendwo einen Fehler oder dergleichen. Kann auch gerne mal die zip-Datei anhängen.
Noch kurz eine andere Frage. Um immer aktuelle Werte zu erhalten, wäre es sinnvoll, den Request jede Sekunde abzusenden. Sind hier Probleme bezüglich der Performance zu erwarten, da die Daten ja immer erst gespeichert und wieder geöffent werden. Oder habe ich das falsch verstanden?
Schöne Grüße
Daniel
Hallo Jens,
habe deinen Code um ein Sub ergänzt, Request und Response funktionieren jetzt soweit.
Mein bisheriger Code:
B4X:
'Activity module
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
Dim HC As HttpClient
Dim PARSER As SaxParser
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.
Dim TxtList As List
Dim SPSDataTypes As Map
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("layout1")
If FirstTime Then
HC.Initialize("HC")
End If
PARSER.Initialize
'Laden von layout1
End Sub
Sub Activity_Resume
Dim Query As String
Dim PDD_CSV As String
TxtList.Initialize
SPSDataTypes.Initialize
' ** Initialisiere Vars
Load_Defaults
PDD_CSV = XMLString
Query = "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>" & _
"<body><version>1.0</version><client>IMasterPhoenix5_14_05" & _
"</client><client_ver>5.14.0501</client_ver><item_list_size>" & PDD_CSV
Send2SPS(Query,1)
End Sub
Sub Load_Defaults
'SPSDataTypes = File.ReadMap (File.DirDefaultExternal,"pdd.csv")
SPSDataTypes = File.ReadMap (File.DirAssets,"pdd.csv")
' Format eg. ONBOARD_INPUT:WORD
'**Manuelles Laden der MAP
'SPSDataTypes.Put("ONBOARD_INPUT","WORD")
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub HC_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int )
Log("Error: " & Reason & ", StatusCode: " & StatusCode)
If Response <> Null Then
Log(Response.GetString("UTF8"))
Response.Release
End If
End Sub
Sub Send2SPS(Query As String, TaskId As Int)
Dim Req As HttpRequest
ProgressDialogShow("connecting...")
Req.InitializePost2("http://192.168.3.150/cgi-bin/ILRReadValues.exe", Query.GetBytes("UTF8"))
HC.Execute(Req,TaskId)
ProgressDialogHide
End Sub
Sub HC_ResponseSuccess (Response As HttpResponse, TaskId As Int)
Dim Res As String
Dim In As InputStream
Res = Response.GetString("UTF8")
Log("Response from server: " & Res)
'Msgbox(Res,"Result")
Select TaskId
Case 1
' Msgbox(Res,"Result") ' fail = -1
' Response.GetAsynchronously("XMLResponse", File.OpenOutput(File.DirInternalCache, "Rss.txt", False), True, TaskId)
Response.GetAsynchronously("XMLResponse", File.OpenOutput(File.DirDefaultExternal , "sps.xml", False), True, TaskId)
'Response.GetAsynchronously("XMLResponse", File.OpenOutput(File.DirInternalCache , "sps.xml", False), True, TaskId)
'Response von der SPS:
'<?xml version="1.0"encoding="UTF-8"?>
'<body>
'<version>1.0</version>
'<client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver>
'<item_list_size>11</item_list_size>
' <item_list>
'<i><n>@GV.Input_Analog</n><v>914</v></i>
'<i><n>@GV.Output_Analog</n><v>1992</v></i>
'<i><n>@GV.TestOutputs</n><v>0</v></i>
'<i><n>@GV.PLCMODE_ON</n><v>0</v></i>
'<i><n>@GV.ONBOARD_INPUT_BIT1</n><v>0</v></i>
'<i><n>@GV.Test_BOOL</n><v>0</v></i>
'<i><n>Main.Q_Bool</n><v>0</v></i>
'<i><n>Main.V001</n><v>0</v></i>
'<i><n>Main.Test1</n><v>0</v></i>
'<i><n>Main.V005</n><v>0.000000</v></i>
'<i><n>Main.V004</n><v></v></i>
'</item_list>
'</body>
End Select
End Sub
Sub XMLResponse_StreamFinish (Success As Boolean, TaskId As Int)
Dim In As InputStream
If Success = False Then
Msgbox(LastException.Message, "Error")
Return
End If
' parse the xml file
In = File.OpenInput(File.DirDefaultExternal, "sps.xml")
'In = File.OpenInput(File.DirInternalCache, "sps.xml")
PARSER.Parse(In, "Parser")
In.Close
End Sub
Sub Parser_StartElement (Uri As String, Name As String, Attributes As Attributes)
End Sub
Sub Parser_EndElement (Uri As String, Name As String, Text As StringBuilder)
'*** Hole die Anzahl der Werte
If PARSER.Parents.IndexOf("body") > -1 Then
If Name = "item_list_size" Then
TxtList.add(Text.ToString)
End If
End If
' If PARSER.Parents.IndexOf("item_list") > -1 Then
' If Name = "b" Then
' TxtList.add(Text.ToString)
' End If
' End If
' *** Abschnitt item_list
' *** wenn das �bergeordnete Element item_list ist
If PARSER.Parents.IndexOf("item_list") > -1 Then
' *** wenn das �bergeordnete Element n ist
If PARSER.Parents.IndexOf("n") > -1 Then
' *** wenn das aktuelle Element b ist
' If Name = "b" Then
' TxtList.add(Text.ToString)
'End If
End If
' *** wenn das �bergeordnete Element v ist
If PARSER.Parents.IndexOf("v") > -1 Then
' *** wenn das aktuelle Element i ist
If Name = "i" Then
TxtList.add(Text.ToString)
End If
End If
End If
End Sub
Sub XMLString As String
Dim su As StringUtils
Dim i, j, ColCount, RowCount, AnzV As Int
Dim Table, CSV As List
Dim XMLString As String
Dim sb As StringBuilder
Dim sbXML2 As StringBuilder
Table = su.LoadCSV(File.DirAssets, "pdd.csv", ",")
'pdd.csv:
'Name,Data Type
'@GV.Input_Analog,WORD
'@GV.Output_Analog,WORD
'@GV.TestOutputs,BOOL
'@GV.PLCMODE_ON,BOOL
'@GV.ONBOARD_INPUT_BIT1,BOOL
'@GV.Test_BOOL,BOOL
'Main.Q_Bool,BOOL
'Main.V001,BOOL
'Main.Test1,BOOL
'Main.V005,REAL
'Main.V004,String(80)
RowCount=Table.Size
AnzV = RowCount-1
ColCount=2
Dim MyArray(RowCount, ColCount), aRow() As String
For i=0 To RowCount-1
aRow=Table.Get(i)
For j=0 To ColCount-1
MyArray(i, j)=aRow(j)
Next
'Log(MyArray(i, 0))
Next
sb.Initialize
For i = 1 To RowCount-1
sb.Append("<i><n>").Append(MyArray(i, 0)).Append("</n></i>")
Next
sbXML2.Initialize
sbXML2.Append(AnzV).Append("</item_list_size><item_list>").Append(sb).Append("</item_list></body>")
Return sbXML2
End Sub
Allerdings klappt das mit dem Parsen irgendwie noch nicht bzw. kann ich mir die Ergebnisse nicht anzeigen lassen. Habe ich hier irgendwo einen Fehler oder dergleichen. Kann auch gerne mal die zip-Datei anhängen.
Noch kurz eine andere Frage. Um immer aktuelle Werte zu erhalten, wäre es sinnvoll, den Request jede Sekunde abzusenden. Sind hier Probleme bezüglich der Performance zu erwarten, da die Daten ja immer erst gespeichert und wieder geöffent werden. Oder habe ich das falsch verstanden?
Schöne Grüße
Daniel