1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| ###############################################################################################
'########## PROCEDURE LECTURE DE N MOTS #########
'###############################################################################################
Public Sub Acquisition(cent, Nb_mots, adresse_poidsfort, adresse_poidsfaible, Index)
Dim i, j As Integer
'Création d'un tableau pour sauvegarder les valeurs
For i = 0 To 55
TABLEAU(i, Index) = 0
Next i
Sleep (80)
'''''''''''''''''''''''''''''''''' Constitution de la trame d'emission''''''''''''''''''''''''''''''''''
TRAME(0) = cent 'adresse modbus du guide coke choisi
TRAME(1) = 3 'code requete modbus permettant la lecture de N mot
TRAME(2) = adresse_poidsfort 'adresse poids fort de début de lecture des mots
TRAME(3) = adresse_poidsfaible 'adresse poids faible de début de lecture des mots
TRAME(4) = 0 'nombre de mots poids fort, ici zéro met en evidence qu'on ne lit pas plus de F mots
TRAME(5) = Nb_mots 'nombre de mots poids faible (Fh max, ou 15d)
'Calcul du CRC
CRC = &HFFFF&
For i = 0 To 5
CRC = TRAME(i) Xor CRC
For j = 0 To 7
R = CRC Mod 2 'donne le retenue de la division par 2
CRC = Fix(CRC / 2) 'decalage vers la droite d'1 bit en divisant par 2
If R = 1 Then 'test depassement de capacité
CRC = CRC Xor &HA001&
End If
Next j
Next i
CRC_MSB = Fix(CRC / 256)
CRC_LSB = CRC And 255
TRAME(6) = CRC_LSB
TRAME(7) = CRC_MSB
'''''''''''''''''''''''''''''''''''' Envoie de la trame ''''''''''''''''''''''''''''''''''''
Form1.MSComm1.Output = Chr$(TRAME(0)) 'Adresse station
Form1.MSComm1.Output = Chr$(TRAME(1)) 'Code requete de lecture
Form1.MSComm1.Output = Chr$(TRAME(2)) 'Adresse debut poids fort
Form1.MSComm1.Output = Chr$(TRAME(3)) 'Adresse debut poids faible
Form1.MSComm1.Output = Chr$(TRAME(4)) 'Nombre de mots a lire poids fort
Form1.MSComm1.Output = Chr$(TRAME(5)) 'Nombre de mots a lire poids faible
Form1.MSComm1.Output = Chr$(TRAME(6)) 'CRC poids faible
Form1.MSComm1.Output = Chr$(TRAME(7)) 'CRC poids fort
'''''''''''''''''''''''''''''' Lecture de la trame de reponse '''''''''''''''''''''''''''''''
TRAME(0) = Input_comm(1) 'Adresse station
TRAME(1) = Input_comm(1) 'Code requete de lecture
TRAME(2) = Input_comm(1) 'Nombre d'octets envoyes
For i = 0 To TRAME(2) - 1
TRAME(3 + i) = Input_comm(1) 'Lecture des mots
DoEvents
Sleep (10)
Next i
TRAME(3 + TRAME(2)) = Input_comm(1) 'CRC poids faible
TRAME(4 + TRAME(2)) = Input_comm(1) 'CRC poids fort
''''''''''''''''''''''''''''''''''' Verification CRC '''''''''''''''''''''''''''''''''''''''''
'Calcul du CRC
CRC = &HFFFF&
For i = 0 To (2 + TRAME(2))
CRC = TRAME(i) Xor CRC
For j = 0 To 7
R = CRC Mod 2
CRC = Fix(CRC / 2)
If R = 1 Then
CRC = CRC Xor &HA001&
End If
Next j
Next i
CRC_MSB = Fix(CRC / 256)
CRC_LSB = CRC And 255
'Test validite du CRC
If CRC_MSB = TRAME(4 + TRAME(2)) And CRC_LSB = TRAME(3 + TRAME(2)) Then
For i = 1 To TRAME(2) Step 2
TR = TRAME(3 + i - 1) * 256 + TRAME(3 + i)
TRAME(3 + i - 1) = Int(TR / 100)
TRAME(3 + i) = Int(TR - (TRAME(3 + i - 1) * 100))
TABLEAU(i, Index) = TRAME(3 + i)
TABLEAU(i - 1, Index) = TRAME(3 + i - 1)
Next i
Else
Error 1003
End If
End Sub |
Partager