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.