Page 1 of 1

Soladin 600

Posted: Sat Jan 19, 2013 5:04 pm
by Peterpc
Ik heb sinds kort 3 zonnepanelen op het dak van mijn schuur geplaatst.
De energie wordt door een Soladin 600 aan het lichtnet geleverd.
De Soladin 600 is met een seriele aansluiting uit te lezen.
Hiervoor is bijvoorbeeld 'Masterlog' software beschikbaar.
Via deze software is de com port prima uit te lezen. Maar de data wordt in een SQL file bewaard, waar ik niet in kan komen.
Nu wil ik in Homeseer door middel van een stript de data uitlezen.
Ik weet inmiddels wat ik naar de com port moet sturen om data terug te krijgen.
Alleen in plaats van 30 data bits krijg ik er maar 15 of 16 terug.
Met 'device monitoring Studio' kan ik de communicatie volgen, maar met mijn script gaat het steeds fout.
Dit is het gedeelte dat de communicatie doet.:

Code: Select all


    SerialPort1.Open()

    SerialPort1.Write(P_rqb, 0, P_rqb.Length)
    system.threading.thread.sleep(p_sleep)
    Try
        For I = 0 To 8
            system.threading.thread.sleep(p_sleept)
            P_antwb(I) = SerialPort1.ReadByte()
            If debug = 2 Then hs.writelog("Zonnepaneelb " & I, P_antwb(I))
        Next
    Catch ex As Exception
    End Try
    SerialPort1.Write(P_rqa, 0, P_rqa.Length)
    system.threading.thread.sleep(p_sleep)
    Try


        For I = 0 To 30
            system.threading.thread.sleep(p_sleept)
            P_antwa(I) = SerialPort1.ReadByte()
            If debug = 2 Then hs.writelog("Zonnepaneela " & I, P_antwa(I))
        Next

    Catch ex As Exception
    End Try
Eerst worden er 9 bytes ingelezen, dat gaat goed.
Bij de tweede write actie moeten er 30 bytes terug komen, maar dat zijn er dus altijd maar 15 of 16
Iemand een idee waarom niet alle bytes ingelezen worden?

Re: Soladin 600

Posted: Sat Jan 19, 2013 5:25 pm
by labium
il lees de virtuele seriele poort van mijn plugwise stick uit met dit idee als thread, en werkt minimaal 1 week goed. is wel c#.

Code: Select all

    public void hosttoclient()
        {
            while (Hconnected)
            {
                byte[] UsbHostReadBuffer = new byte[256];
                byte HostorClient = 2;
                int NumberOfReadBytes;

                NumberOfReadBytes = serialUSBHost.Read(UsbHostReadBuffer, 0, 256);

                if (NumberOfReadBytes > 0)
                {
                   // usbSerial.SerialLine.Write(UsbHostReadBuffer, 0, NumberOfReadBytes);

                    netmfcom.Write(UsbHostReadBuffer, 0, NumberOfReadBytes);

                    Debug.Print("stick:  " + NumberOfReadBytes.ToString());
                  

                    //cdcwrite1(UsbHostReadBuffer, NumberOfReadBytes, HostorClient);
                }
            }

            //Thread.Sleep(10);
        }

Re: Soladin 600

Posted: Sat Jan 19, 2013 5:26 pm
by Digit
Het zal er wel niks mee te maken hebben, maar waarom doe je een sleep als ReadByte() toch synchroon werkt (oftewel, die wacht tot er een byte is gelezen of geeft een timeout(exception))?

Re: Soladin 600

Posted: Sat Jan 19, 2013 6:12 pm
by Peterpc
Ik heb al allerlei manieren geprobeerd en dat is blijven 'hangen' ; van een van de probeersels. De Ik zal het morgen eens proberen zonder die vertraging. De Ik kan helaas alleen maar testen als er voldoende licht is, kan anders werkt de soladin niet.

Re: Soladin 600

Posted: Sun Jan 20, 2013 1:51 pm
by AshaiRey
Bij de tweede write actie moeten er 30 bytes terug komen, maar dat zijn er dus altijd maar 15 of 16
Iemand een idee waarom niet alle bytes ingelezen worden?
Dat klinkt als het gebruiken van een verkeerde type variabele voor P_antwb(I). {er is niet genoeg code gepost om dit met zekerheid te zeggen}
Eentje dus die te klein is om 30 bits in op te slaan. Waarschijnelijk moet je een long of een double gebruik. Google anders eens op variabeltypen om te kijken welke je nodig heb.

Re: Soladin 600

Posted: Sun Jan 20, 2013 4:45 pm
by Peterpc
Ik heb de variable getest of er 30 waarden konden worden opgeborgen en dat is geen probleem.
Dit is de volledige code voor het uitlezen van de poort:

Code: Select all

Sub Main(ByVal Params As String)
    Dim P_antwa(30) As Byte
    Dim P_antwb(8) As Byte
    Dim p_sleep
    Dim p_sleept
    Dim I, J, a, aa, b, c, d, da
    p_sleep = 0
    p_sleept = 0
    Dim debug, vraag

    Dim Serialport1 As New IO.Ports.SerialPort
    Dim P_rqa() As Byte = New Byte() {17, 0, 255, 255, 182, 0, 0, 0, 197}
    ' 11 00 AA AA 9A 00 00 00 FF gemeten {17, 0, 170, 170, 154, 0, 0, 0, 255} request voor actuele waarde 9
    Dim P_rqb() As Byte = New Byte() {17, 0, 170, 170, 154, 0, 0, 0, 255}
    ' 11 00 FF FF B6 00 00 00 C5 gemeten {17, 0, 255, 255, 182, 0, 0, 0, 197} request voor alle waarden 31


    debug = 2
    vraag = 0 '0 = eerste aanvraag overslaan
    SerialPort1.PortName = "COM4" 'zonnepaneel
    For I = 0 To 30 'test of alle bytes te beschrijven zijn
        P_antwa(I) = 0
    Next
    ' Set the read/write timeouts
    SerialPort1.ReadTimeout = 5000
    SerialPort1.WriteTimeout = 5000
    SerialPort1.ReadBufferSize = 2

    SerialPort1.Open()
    If vraag = 1 Then
        SerialPort1.Write(P_rqb, 0, P_rqb.Length)
        system.threading.thread.sleep(p_sleep)
        Try
            For I = 0 To 8
                system.threading.thread.sleep(p_sleept)
                P_antwb(I) = SerialPort1.ReadByte()
                If debug = 2 Then hs.writelog("Zonnepaneelb " & I, P_antwb(I))
            Next
        Catch ex As Exception
        End Try
        system.threading.thread.sleep(p_sleep)
    End If

    SerialPort1.Write(P_rqa, 0, P_rqa.Length)
    system.threading.thread.sleep(p_sleep)

    Try
        For I = 0 To 30
            system.threading.thread.sleep(p_sleept)
            P_antwa(I) = SerialPort1.ReadByte()
            If debug = 2 Then hs.writelog("Zonnepaneela " & I, P_antwa(I))
        Next
    Catch ex As Exception
    End Try
    SerialPort1.Close()
Als ik de poort test met het programma serial communication tester, dan wordt er elke keer keurig 30 bytes uitgelezen, zie bijgevoegd plaatje.
Maar met mijn VB script wil het maar niet lukken.
result.png
result.png (40.29 KiB) Viewed 7401 times

Re: Soladin 600

Posted: Sun Jan 20, 2013 4:57 pm
by Digit
Ehh, "0 TO 30" is toch 31 bytes proberen te lezen?

Re: Soladin 600

Posted: Sun Jan 20, 2013 5:25 pm
by Peterpc
Het zijn inderdaad 31 bytes die moeten worden uitgelezen.

Re: Soladin 600

Posted: Sun Jan 20, 2013 5:49 pm
by Digit
OK... ik las overal het getal 30, als er dan idd maar 30 bytes komen dan gaat ie in een timeout want je probeert er 31 te lezen.