Errore 6 Overflow Assurdo

di il
16 risposte

16 Risposte - Pagina 2

  • Re: Errore 6 Overflow Assurdo

    Di nuovo lo stesso errore?

    22/03/2025 - Numero5 ha scritto:

    e ho risolto come al solito assegnando il valore più grande a Long tabella

    Ma perché? Allora non è servito a nulla quello che ti ho scritto? Basta che la costante sia di tipo Long e questo lo ottieni nell'espressione in due modi, aggiungendo il carattere & alla costante o usando la funzione CLng

    tabella = 1000& * x * y

    oppure

    tabella = CLng(1000) * x * y

    Direi di finirla qui

    Concordo, tu riparti sempre dagli stessi errori.

    cosa potrei fare ? passare per una stringa ? altre idee ?

    Devi usare delle funzioni di conversioni che utilizzino un Double dato che un unsigned int ha un range superiore al Long (potresti usare un Single ma è più preciso il Double). Ad esempio

    Private Const OFFSET_4 = 4294967296#
    Private Const MAXINT_4 = 2147483647
    
    
    Function LongToUnsigned(ByVal Value As Long) As Double
        LongToUnsigned = Value
        If Value < 0 Then
            LongToUnsigned = Value + OFFSET_4
        End If
    End Function
     
    Function UnsignedToLong(ByVal Value As Double) As Long
        If Value < 0 Or Value >= OFFSET_4 Then Error 6
        If Value > MAXINT_4 Then
            UnsignedToLong = Value - OFFSET_4
            Exit Function
        End If
        UnsignedToLong = Value
    End Function
    

    ma dovresti rivedere molta parte del codice con accortezza.

  • Re: Errore 6 Overflow Assurdo

    22/03/2025 - Numero5 ha scritto:

    ...ma a volte il valore di un registro modbus è negativo ...

    "L'unità di misura" della comunicazione modbus è una Word a 16 bit che va "maneggiata" sapendo cosa rappresenta.

    Il primo aspetto da considerare è che il registro modbus (16 bit) in realtà va considerato come l'unione di 2 bytes e l'ordine con cui questi 2 bytes sono inseriti nel registro è la prima fonte di 'problemi'. L'ordine (endianness) lo definisce l'architettura della CPU.

    Quando si leggono (scrivono) dati tramite modbus occorre quindi sapere i registri cosa contengono e si possono avere le seguenti casistiche :

    1) - registro che va interpretato come array di 16 bits

    2) - registro che va interpretato come insieme di 2 bytes (word / intero non segnato)

    3) - registro che va interpretato come numero intero a 16 bits (di cui 1 è il segno)

    4) - doppio registro (2 registri consecutivi) che vanno interpretati come insieme di 4 bytes (doppia word / doppio intero non segnato)

    5) - doppio registro (2 registri consecutivi) che vanno interpretati come doppio intero a 32 bits (di cui 1 è il segno)

    6) - doppio registro (2 registri consecutivi) che vanno interpretati come floating point a 32 bits (sempre con segno con codifica IEEE 754)

    Nei casi 1,2,3 occorre considerare l'ordine dei byte per la corretta interpretazione del dato

    Nei casi 4,5,6 occorre considerare l'ordine dei byte del singolo registro e anche l'ordine dei singoli registri per la corretta interpretazione del dato

    Esiste anche un caso 7 : alcuni PLC/Dispositivi dispongono di variabili a 64 bit e quindi lo scambio avviene utilizzando 4 registri da 16 bits consecutivi (che vanno poi correttamente assemblati come QuadWord,LongLongInteger, Real), ma dubito che si riesca a gestirli in VB6.

Devi accedere o registrarti per scrivere nel forum
16 risposte