Posso passare la form come argomento di una funzione o sub

di il
7 risposte

Posso passare la form come argomento di una funzione o sub

Da form SetPointBC

Private Sub Leggi_Click()
Dim buffer As Variant
Dim arr() As Byte
Dim setpoint(12) As Byte
Dim value As Long

Call modbus2(255, 3, 0, 18, 0, 6)

lenght = 6 * 2 + 5
AllMon.MSComm2.InputLen = lenght
While AllMon.MSComm2.InBufferCount < lenght
Wend

buffer = AllMon.MSComm2.Input
arr = buffer

For x = 1 To lenght
    bufrc2(x - 1) = arr(x - 1)
Next x

mycrc = calccrc2(lenght, 1)

crcl = arr(lenght - 2)
crch = arr(lenght - 1)

Node = arr(0)
func = arr(1)
btor = arr(2)

If ((crcl = crcl2) And (crch = crch2)) Then
    For r = 1 To btor / 2
        value = 256
        value = value * arr(r * 2 + 1)
        value = value + arr(r * 2 + 2)
        setpoint((r - 1) * 2) = arr(r * 2 + 1)
        setpoint((r - 1) * 2 + 1) = arr(r * 2 + 2)
        BCSETPOINT(r) = value
        Me.Text1(r - 1).Text = Format(BCSETPOINT(r), "00000")
    Next r
Else
    response = MsgBox("MODBUS CRC16 ERROR", vbOKOnly)
End If

mycrc = calccrc(10, setpoint())

If mycrc <> BCSETPOINT(6) Then
    response = MsgBox("SETPOINT CRC16 ERROR", vbOKOnly)
Else
    response = MsgBox("SETPOINT CRC16 OK", vbOKOnly)
End If

Me.Salva.Enabled = True
Me.Scrivi.Enabled = True
End Sub

Funzione in modulo1.bas scritta per un' altra form (AllMon) Form

ho cercato di evidenziare nel codice ma non funziona

Function modbus2(Node As Byte, func As Byte, sah, sal, nrh, nrl)

buftc2(0) = Node
buftc2(1) = func
buftc2(2) = sah
buftc2(3) = sal
buftc2(4) = nrh
buftc2(5) = nrl
mycrc = calccrc2(6, 0)
buftc2(6) = crcl2
buftc2(7) = crch2
AllMon.MSComm2.SThreshold = 8
AllMon.MSComm2.Output = buftc2()

AllMon.Text20.Text = AllMon.Text20.Text & Time & vbCrLf
If crcok2 = True Then
    AllMon.Text20.Text = AllMon.Text20.Text & "BC Modbus Req = Node=" & Node & ", Func=" & func & ", Addr=" & sal & ", Nreg=" & nrl & ", CRC16=" & Format(Hex(crcl2), "00") & Format(Hex(crch2), "00") & " OK" & vbCrLf
Else
    AllMon.Text20.Text = AllMon.Text20.Text & "BC Modbus Req = Node=" & Node & ", Func=" & func & ", Addr=" & sal & ", Nreg=" & nrl & ", CRC16=" & Format(Hex(crcl2), "00") & Format(Hex(crch2), "00") & " KO" & vbCrLf
End If

If (sah And sal) = 0 Then
    Flag2addr_0 = True
Else
    Flag2addr_0 = False
End If

End Function

7 Risposte

  • Re: Posso passare la form come argomento di una funzione o sub

    Impiega qualche frase in più per spiegarti

  • Re: Posso passare la form come argomento di una funzione o sub

    Giusto

    vorrei scrivere una funzione o una sub

    che funzioni anche se chiamata da form diverse

    Function modbus2(Node As Byte, func As Byte, sah, sal, nrh, nrl)
    
    buftc2(0) = Node
    buftc2(1) = func
    buftc2(2) = sah
    buftc2(3) = sal
    buftc2(4) = nrh
    buftc2(5) = nrl
    mycrc = calccrc2(6, 0)
    buftc2(6) = crcl2
    buftc2(7) = crch2
    
    AllMon.MSComm2.Output = buftc2()

    questo è il prototipo della funzione attuale

    ma a tutti gli effetti modbus2 perche usa la porta 2 per la comunicazione

    usa buftc2 definito come public nel modulo che contiene la funzione

    MsComm2 è un activex nella form AllMon Form

    vorrei fare una funzione il cui prototipo sia

    function modbus ( Form,  Port,  BufTX,  Node, Func, Sah, Sal, Nrh, Nrl )  as SA

    con as SA intendo che potrebbe essere utile conoscere l' indirizzo modbus sah sal qundo si analizza la risposta della richiesta sulla porta di comunicazione

    non so se mi sono spiegato meglio !!! 

  • Re: Posso passare la form come argomento di una funzione o sub

    01/04/2025 - Numero5 ha scritto:

    non so se mi sono spiegato meglio !!! 

    Quasi ...

    Per la questione del passaggio del riferimento al Form, scrivi in un modulo una Function così

    Function modbus2(frm As Form, ...) As ...

    e poi dalla tua form puoi scrivere

    ret = modbus2(Me, ...)

    Ma per la questione del valore da restituire (As SA) e tutto il resto, non ho capito.

  • Re: Posso passare la form come argomento di una funzione o sub

    OK per il riferimento al form più semplice di quanto pensassi

    sah e sal sono un indirizzo del modbus byte alto e byte basso

    anzi nella mia applicazione che si interfaccia con un PIC gli indirizzi non superano il byte (non standard)

    è utile conoscere l' indirizzo richiesto perchè nella risposta questo dato non c' è anche se so cosa ho chiesto

    se oltre al form dovessi far riferimento anche a un textbox per scrivere le risposte come si vede nel primo post

    come dovrei scrivere i riferimenti nella call e nella function ?

  • Re: Posso passare la form come argomento di una funzione o sub

    Cerco di interpretare quello che dici ma prima ti chiedo perchè non passi l'indirizzo intero e non separi le parti all'interno della funzione?

    Come ottieni sal e sah prima di passarli?

    P.S. perchè non usi un linguaggio più moderno come il C# o un linguaggio che conosci?

  • Re: Posso passare la form come argomento di una funzione o sub

    Gli indirizzi li conosco perchè sono nel software del microcontroller sulla scheda con cui devo comunicare.

    come gia detto sah è sempre 0 i registri interni non sono più di 100 quindi si usa solo sal

    e anche nrh è sempre 0 non si fanno trasmissioni di più di 125 registri consecutivi, anche se ci fossero

    la chiamata si riduce a modbus( indirizzo server, funzione, 0, indirizzo base, 0, numero di registri consecutivi)

    quindi si calcola il CRC16 ModBus si aggiungo i due byte ai 6 precedenti CRCL e CRCH e si trasmette la richiesta

    CRC16 è calcolato così

    Function calccrc(mylen As Byte, buffer() As Byte) As Long
    Dim curcrc As Long
    Dim i As Byte
    Dim l As Byte
    
    curcrc = 65535
    l = 0
    
    Do
        i = 8
        curcrc = curcrc Xor buffer(l)
        Do
            If (curcrc And 1) Then
                curcrc = Int(curcrc / 2)
                curcrc = curcrc Xor 40961
            Else
                curcrc = Int(curcrc / 2)
            End If
            i = i - 1
        Loop Until i = 0
        l = l + 1
    Loop Until l = mylen
    
    crch = Int(curcrc / 256)
    crcl = curcrc And 255
    
    calccrc = 256
    calccrc = calccrc * crcl + crch
    
    End Function

    E' tradotta da una funzione C

    FUNZIONI PER IL CALCOLO DI CRC - Senza tabella
    unsigned short ModBus_CRC16( unsigned char * Buffer, unsigned short Length )
    {
    /* ModBus_CRC16 Calculatd CRC16 with polynome 0xA001 and init value 0xFFFF
    Input *Buffer - pointer on data
    Input Lenght - number byte in buffer
    Output - calculated CRC16
    */
    unsigned int cur_crc;
    cur_crc=0xFFFF;
    do
    {
    unsigned int i = 8;
    cur_crc = cur_crc ^ *Buffer++;
    do
    {
    if (0x0001 & cur_crc)
    {
    cur_crc >>= 1;
    cur_crc ^= 0xA001;
    }
    else
    {
    cur_crc >>= 1;
    }
    }
    while (--i);
    }
    while (--Length);
    return cur_crc;
    }

    quindi si aspetta la risposta

    indirizzo server = ?

    funzione = ? se funzione + 128 errore e byte seguente codice errore 1 - 4 2 byte seguenti CRC16 dei primi 3 byte

    byte da leggere = registri chiesti x 2

    2 byte x registro RH RL

    CRC16 ( CRCL - CRCH ) da verificare che sia corretto per i precedenti byte ricevuti

    P.S. ho acquistato da poco una licenza per visual studio 2019 ma ancora non l' ho provato devo prima finire ciò che ho cominciato in VB6

    Ho usato molto VBA di Access 2002 dal 2004 in avanti per una decina di anni, anche se non sono un programmatore mi cimento per diletto.

  • Re: Posso passare la form come argomento di una funzione o sub

    E di nuovo non si capisce cosa vuoi ...

    Puoi fare una domanda precisa senza divagare?

Devi accedere o registrarti per scrivere nel forum
7 risposte