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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
| ' IMPORTANT -> Ne pas oublier d'inclure dans les références -> libnodave.net.dll de Libnodave
' Module sur les paramètres de la communication avec le libraire Libnodave
' Com S7-200 via porta Série
' Com S7-200 via ethernet CP243
Module mdlLibnodave
' Deux types de communication possible
Enum Communication
Serie
Ethernet
End Enum
Private Sub Comms()
Dim TypeComm As Communication
Dim localMPI As Integer = 0 'Configuration des adresses PPI / MPI du PC (normalement à 0)
Dim plcMPI As Integer = 2 ' Configuration des adresses PPI / MPI de l'automate (normalement à 2)
Dim IP_Adress As String = "192.168.1.30" ' Configuration de l'adresse IP de la carte CP243
Dim fds As libnodave.daveOSserialType
Dim di As libnodave.daveInterface
Dim dc As libnodave.daveConnection
Dim res As Integer
Dim buf(1000) As Byte
Dim inputsRes As Integer
Dim InputBuffer(1000) As Byte ' Buffer pour lire / écrire des entrées
Dim Inputs(6 * 8) As Integer ' Entrées de l'automate -> 6 octets IB0 .. IB5
Dim outputsRes As Integer
Dim OutputBuffer(1000) As Byte ' Buffer pour lire / écrire les sorties
Dim Outputs(6 * 8) As Integer ' Sorties de l'automate -> 6 octets QB0 .. QB5
Dim memoryRes As Integer
Dim MemoryBuffer(1000) As Byte ' Buffer pour lire / écrire des mémoires M
Dim Memory(15 * 8) As Integer ' Memoire M de l'automate -> 15 octets MB0 .. MB14
Dim XMTBuffer(100) As Byte ' Buffer de données transmises à l'automate
If TypeComm = Communication.Serie Then
' Ouverture du port COM en mode lecture
fds.rfd = libnodave.setPort("com1", "19200", AscW("E")) ' Port=COM1, BaudRate=19200, Parité= Pair
ElseIf TypeComm = Communication.Ethernet Then
' Ouverture du Socket en mode lecture
fds.rfd = libnodave.openSocket(102, IP_Adress)
Else
' génération d'une erreur
fds.rfd = -10000
End If
' Ouverture de la communication en mode écriture
fds.wfd = fds.rfd
'S'il n'y a pas d'erreur sur l'ouverture du port de communication
If fds.rfd > 0 Then
' Création d'une nouvelle interface
If TypeComm = Communication.Serie Then
' daveProtoMPI3 ' MPI pour S7 300/400, Step 7 Version
' vitesse fixé au hasard
di = New libnodave.daveInterface(fds, "My Interface 1", localMPI, libnodave.daveProtoMPI3, libnodave.daveSpeed500k) ' Importante, caso não estejamos a usar PPI, devemos alterar o daveProtoPPI, e caso o baudrate seja diferente, também devemos alterar
ElseIf TypeComm = Communication.Ethernet Then
'
di = New libnodave.daveInterface(fds, "IF1", localMPI, libnodave.daveProtoISOTCP243, libnodave.daveSpeed187k)
End If
di.setTimeout(100000) ' S'il y a trop d'erreur de reception augemetez la valeur
res = di.initAdapter ' Début de l'adaptation
If res = 0 Then
' Si l'adaptation c'est bien passé
dc = New libnodave.daveConnection(di, plcMPI, 0, 2) ' créer une nouvelle connexion, Note: le support MPI et l'emplacement ne sont pas importants
res = dc.connectPLC() ' On appel l'automate
If res = 0 Then
' Si l'appel c'est bien passé
inputsRes = dc.readBytes(libnodave.daveInputs, 0, 0, 6, InputBuffer) ' Lecture des entrées
outputsRes = dc.readBytes(libnodave.daveOutputs, 0, 0, 6, OutputBuffer) ' Lecture des sorties
memoryRes = dc.readBytes(libnodave.daveFlags, 0, 0, 16, MemoryBuffer) ' Lecture des mémoires
' A chaque lecture on prend du temps/performances
' Il est préférable de lire un grand nombre de données et de les utiliser quand on en a besoin
If inputsRes = 0 And outputsRes = 0 And memoryRes = 0 Then
' Si la lecture c'est bien passée
Dim h As Integer = 0
' Dans cet exemple, nous avons reçu octets, mais nous voulons bits, il est nécessaire de convertir
For i As Integer = 0 To 5
For j As Integer = i * 8 To (i * 8 + 7)
Inputs(j) = InputBuffer(i) And (2 ^ h)
Outputs(j) = OutputBuffer(i) And (2 ^ h)
Memory(j) = MemoryBuffer(i) And (2 ^ h)
If Inputs(j) > 1 Then Inputs(j) = 1
If Outputs(j) > 1 Then Outputs(j) = 1
If Memory(j) > 1 Then Memory(j) = 1
h += 1
Next
h = 0
Next
' On récupére toutes les valeurs des entrées/sorties/memoires en décimale
If Inputs(0) = 0 Then
' fazer código para ZERO
Else
' fazer código para UM
End If
' Fazer o mesmo ou equivalente para os restantes valores
' Não esquecer que agora os bits estão todos seguidos e não agrupados em bytes, ou seja:
' I0.0 corresponde a Inputs(0), I1.0 corresponde a Inputs(8), I2.0 correspondente a Inputs(16), etc...
' Organizar os valores e metê-los no array XMTBuffer para serem enviados para o autómato
' Escreve nas memórias V
If dc.writeBytes(libnodave.daveDB, 1, 1020, 16, XMTBuffer) <> 0 Then
' Se o resultado for diferente de ZERO, então houve um erro
MsgBox(TimeOfDay & " - Erro na escrita de Ordens VB1020 -> " & res & vbCrLf) ' " <> " & libnodave.daveStrerror(res) & vbCrLf)
End If
Else
' Erreur de lecture des valeurs
MsgBox("Error {0:d}={1:s} in readBytes.res = " & res & vbCrLf)
End If
dc.disconnectPLC() ' Déconnexion de l'automate
Else
' Erreur de connexion avec la carte
MsgBox("Error {0:d}={1:s} in connectPLC.res = " & res & vbCrLf)
End If
di.disconnectAdapter() ' Deconnexion de la carte
Else
' Erreur dans la carte
MsgBox("Error {0:d}={1:s} in initAdapter.res = " & res & vbCrLf)
End If
' Fermeture du PORT
libnodave.closePort(fds.rfd) ' Clean up
Else
' Erreur à l'ouverture du PORT
MsgBox("Erro ao abrir a porta de comunicação!" & vbCrLf)
End If
End Sub
End Module |
Partager