Anguel
Messages postés31Date d'inscriptionmardi 8 novembre 2005StatutMembreDernière intervention15 septembre 2011
-
31 mai 2007 à 19:02
Anguel
Messages postés31Date d'inscriptionmardi 8 novembre 2005StatutMembreDernière intervention15 septembre 2011
-
4 juin 2007 à 13:14
Bonjour
S'il vous plait
Es ce que
quelqu'un
(une)
peu m'aider de convertir le code GW Basic en Visual basic
sa sert a diriger des cameras speed dômes en travers le rs 232
Merci d'avance. A bientôt<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Anguel
voila le code :
10 CLS: REV$ = "$Header: d:/protocol/p/RCS/pproto.bas 1.3 2000-11-21 07:41:57-08 Hamilton Exp Hamilton $"
20 PRINT REV$
30 PRINT "Example P-Protocol Commands"
40 PRINT "Unsupported software from Pelco"
50 '
60 OPEN "COM1:4800,N,8,1" AS #2
70 CMNDCOUNT = 0
80 PANSPEED = 32
90 TILTSPEED = 32
100 SOM = &HA0: REM Start of message
110 EOM = &HAF: REM End of message
120 ADDRESS = 2
130 CMND1 = 0
140 CMND2 = 0
150 DATA1 = 0
160 DATA2 = 0
170 '
180 REM Get direction to move the dome
190 KPAD$ = INKEY$
200 IF LEN(KPAD$) = 0 THEN 180
210 IF KPAD$ "x" OR KPAD$ "X" THEN 750
220 IF KPAD$ "s" OR KPAD$ "S" THEN 390
230 IF KPAD$ "a" OR KPAD$ "A" THEN 480
240 IF LEN(KPAD$) 1 THEN BYTE3 ASC(KPAD$): GOTO 560
250 IF LEN(KPAD$) <> 2 THEN 180
260 BYTE3 = ASC(MID$(KPAD$,2,1))
270 '
280 REM &Hxx is used to indicate hex numbers
290 IF BYTE3 &H4D THEN CMND2 &H2: DATA1 = PANSPEED: ID$ = "R": GOTO 560: REM Right
300 IF BYTE3 &H4B THEN CMND2 &H4: DATA1 = PANSPEED: ID$ = "L": GOTO 560: REM Left
310 IF BYTE3 &H48 THEN CMND2 &H8: DATA2 = TILTSPEED: ID$ = "U": GOTO 560: REM Up
320 IF BYTE3 &H50 THEN CMND2 &H10: DATA2 = TILTSPEED: ID$ = "D": GOTO 560: REM Down
330 IF BYTE3 &H47 THEN CMND2 &H40: ID$ = "W": GOTO 560: REM Wide angle
340 IF BYTE3 &H49 THEN CMND2 &H20: ID$ = "T": GOTO 560: REM Tele
350 REM Woops it's not a used code, print it out and try again
360 PRINT "'";HEX$(BYTE3);"'";
370 GOTO 180
380 '
390 REM Ask for a new speed
400 INPUT "Enter in a new positive speed less than 64 (cr = 32)";SPEED
410 IF SPEED 0 THEN SPEED 32
420 IF SPEED > 64 OR SPEED < 0 THEN 400
430 PANSPEED = SPEED
440 TILTSPEED SPEED: IF SPEED 64 THEN TILTSPEED = 63
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 3 juin 2007 à 05:14
Salut
Bon, tu as avancé.
Corrections :
Public Function monCheckSum(...) As Byte
Public Function Envois(...) As String ' C'est la chaine que tu veux envoyée
Tu t'es brèlé les pinceaux :
Il ne faut surtout pas appeler une Sub/Function par elle-même, c'est le clash assuré !
Après "Public Function Envois" tu renseignes les valeurs des variables alors que c'est AVANT de lancer la fonction qu'il faut le faire. Dans ton cas, le résultat donnerait la même chose, mais le paramétrage de la fonction ne sert à rien dans ce cas.
SendCom doit être dimensionné comme une chaine pour recevoir les données à expédier.
SendCom ne peut pas être dimensionné dans la fonction Envois et utilisée à l'extérieur de cette fonction (pas possible).
SendCom doit recevoir une chaine contenant l'équivalent des Bytes --> Utilise Chr$ comme dans l'original
La prochaine fois, essaye d'écrire ce que veux dire l'erreur, le numéro seulement ne nous dis pas grand chose : ça nous oblige à ouvrir VB et à rechercher le message associé, c'est pas long à faire, mais ça fait gagner du temps.
Ce qui donne :
Private Const SOM As Byte = &HA0
Private Const EOM As Byte = &HAF
Dim CmndCount As Byte, panspeed As Byte, tiltspeed As Byte, CheckSum As Byte
Dim SendCom As String
Dim Addres As Byte, CMND1 As Byte, CMND2 As Byte, DATA1 As Byte, DATA2 As Byte
Public Function monCheckSum(SOM, Addres, CMND1, CMND2, DATA1, DATA2, EOM) As Byte CheckSum = SOM Xor EOM
CheckSum = CheckSum Xor Addres
CheckSum = (CheckSum Xor CMND1) Xor CMND2
CheckSum = (CheckSum Xor DATA1) Xor DATA2
CheckSum = CheckSum And 255
monCheckSum = CheckSum
End Function
Public Function Envois(...) As String
Envois = Chr$(SOM) & Chr$(Addres) ...
End Function
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 31 mai 2007 à 19:57
Salut
Pas de grandes difficultés :
- Les Basic (QB, Quick Basic, Basica, ...) ne s'adressaient qu'à un écran de type DOS (25 lignes, 80 colonnes)
Donc, les instructions PRINT peuvent être remplacées la gestion d'une TextBox dans laquelle tu ajouteras le texte (ou variable) désigné par le PRINT. Il faudra penser à ajouter les retours chariot (vbCrLf) à chaque PRINT.
Exemple :
PRINT "'";HEX$(BYTE3);"'";
peut se transformer en
maTextBox.Text = maTextBox.Text & "'" & HEX$(BYTE3) & "'"
Si la commande PRINT se termine par un ; ou une , il ne faut pas ajouter de passage à la ligne vbCrLf (les données suivantes seront collées aux précédentes avec un ; et séparées par une tabulation avec une virgule)
- Les REM sont des REMarques = commentaires, équivalents de l'apostrophe du début de ligne
REM GOSUB 770 n'exécute rien. C'est un moyen de ne pas exécuter une ligne sans la détruire
- Les variables suivies d'un $ sont des String, comme sous VB
- Les variables non définies étaient considérées comme des entiers --> Integer (VB6) ou Short (.Net) il me semble
Tu peux les dimensionner de toute façon en Integer, ça passera (bien qu'apparemment, il s'agit de Byte)
- Les numéros de lignes ne servent que de Label | Etiquette :
Goto 180
...
180 Print "Toto"
est la même chose que
Goto monLabel
...
monLabel:
Print "Toto"
- GOSUB 770
Signifie qu'on fait appel à une portion du programme duquel on va revenir lorsqu'il aura rencontré un RETURN
Peut être remplacé par une SUB ou une FUNCTION, suffira de lui passer en paramètres les élements dont il a besoin
- OPEN "COM1 ..." As #2
C'est la méthode d'ouverture du port COM1
Là, il faut passer par un objet MSComm qui fera la même chose.
La méthode PRINT #2, "tralala" permettait d'écrire sur le port COM
Les autres commandes restent les mêmes
- INKEY$
Cette instruction captait les touches du clavier.
Dans Form_KeyPress ou _KeyDown, tu peux faire le même genre d'interception (si l'application à le focus et que la propriété KeyPreview de la forme est à True)
- IF THEN : Pas de changement
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 31 mai 2007 à 20:15
Bonsoir jack,
Je te salue avec beaucoup de respect pour avoir su faire là ce qu'il convenait de faire : tout sauf traduire directement la totalité d'une syntaxe à l'autre.
A Anguel, maintenant, de jouer (comme doit jouer tout développeur...)
Anguel
Messages postés31Date d'inscriptionmardi 8 novembre 2005StatutMembreDernière intervention15 septembre 2011 31 mai 2007 à 21:43
Bonsoir
C'est encore moi
Cette fois je vais etre plus précis
S'il vous plait
Pouvez vous m'aider de convertir le code suivant en VB
et pouvoir le utiliser.
c'est une fonctione :
MERCI BEAUCOUP
LE code est :
850 REM Get the checksum
860 CHECKSUM = SOM XOR EOM: REM Do these first
870 CHECKSUM = CHECKSUM XOR ADDRESS: REM Now XOR in the address
880 CHECKSUM = (CHECKSUM XOR CMND1) XOR CMND2: REM And the commands
890 CHECKSUM = (CHECKSUM XOR DATA1) XOR DATA2: REM Then the data
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 31 mai 2007 à 22:02
Je te remercie, Anguel, mais je n'ai (personnellement) nul besoin d'un traducteur de code pour si peu et qui se retrouve preque à l'identique dans tout langage s'appuyant sur Basic !!!
Je suppose par ailleurs que le code écrit en GW Basic est de toi et que tu sais ce qu'il dit et fait.
Si tel n'était pas le cas, tu serais tout simplement en train d'essayer, pour éviter de développer (et ce devrait être là ton but premier : apprendre à développer), de piquer un code (écrit en GW Basic que tu ne comprends pas) pour le "faire" transposer en VB.Net par encore quelqu'un d'autre... !
Amitiés.
Anguel
Messages postés31Date d'inscriptionmardi 8 novembre 2005StatutMembreDernière intervention15 septembre 2011 1 juin 2007 à 01:11
Bonsoir jmfmarques
En demandant un traduction de ce code (écrit en GW basic par la société Pelco - c'est Eric Hamilton qui m'a l'envoyé )je veux le intégrer dans une user forme d'Excel et comme sa je vais pouvoir diriger les Cameras Speed Dômes . Je connaissance moyenne en Excel et VBE de Macro Excel . Si tu croix que je essai de profiter de quelque chose tu te trompe , je veux simplement de l'aide je n'ai pas assez moyens pour le moment d' Etudier a programmer comme le grands. Déjà un mois je rame avec se protocole de Cameras . Si tu peu m'aider fait le , je te serait reconnaissant . Si non n'empêche pas les autres de le faire.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 1 juin 2007 à 18:56
Re
Pas de polémique, on est là pour s'entraider.
En te lisant, je viens de voir que tu parlais de VBA de Excel : Tu aurais dû le préciser car il y a des petites choses qui diffèrent de VB6 et bien sûr de VB.Net. Bien faire attention à la rubrique dans laquelle tu postes tes questions, ça peut te faire gagner du temps.
Pour tes sous routines :
Pour la deuxième, tu remarqueras qu'elle n'est appelée qu'une seule fois, donc pas la peine de se torturer, suffit de remplacer le GOSUB 930 par les 930 à 1130 (sauf le RETURN final, bien sûr).
Remarque, pour la première, elle n'est aussi appelée qu'une fois, tu pourrais appliquer la même solution, mais je vais te montrer comment faire pour les autres :
Il faut les transformer en SUB ou plutôt en FUNCTION puisqu'elles doivent te renvoyer une valeur.
850 REM Get the checksum
860 CHECKSUM = SOM XOR EOM: REM Do these first
870 CHECKSUM = CHECKSUM XOR ADDRESS: REM Now XOR in the address
880 CHECKSUM = (CHECKSUM XOR CMND1) XOR CMND2: REM And the commands
890 CHECKSUM = (CHECKSUM XOR DATA1) XOR DATA2: REM Then the data
900 CHECKSUM = CHECKSUM AND 255
910 RETURN
On voit ici que ces lignes de programme ont besoin du contenu des variables se trouvant dans ton programme appelant, il faut donc les lui transmettre : SOM, EOM, ADDRESS, CMND1, CMND2, DATA1, DATA2
En retour, il faudra renvoyer le contenu de CHECKSUM.
Il te suffit donc de créer une fonction :
Private Function monCheckSum(SOM, EOM, ADDRESS, CMND1, CMND2, DATA1, DATA2) As Variant
A la fin de ta fonction, tu remplace le RETURN de la ligne 910 par le transfert du résultat :
monCheckSum = CHECKSUM
et enfin, pour remplacer le GOSUB 850, il te suffit de faire
CHECKSUM = monCheckSum(SOM, EOM, ADDRESS, CMND1, CMND2, DATA1, DATA2)
Pour le GOSUB 1150, là, il n'a besoin que de la valeur de X et ne renvoie rien
Il faut alors utiliser une SUB :
Private Sub maSub(X)
et remplacer les GOSUB 1150 par un Call maSub(X)
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Anguel
Messages postés31Date d'inscriptionmardi 8 novembre 2005StatutMembreDernière intervention15 septembre 2011 2 juin 2007 à 00:21
Merci Jack
Ca m'a vraiment beacoup aidé
voila se que j'ai fait toute la soirée
et il me donne un message d'erreur N° 380 sur la commande
MSComm1.Output = SendCom
Voila mon code :
Private Const SOM As Byte = &HA0
Private Const EOM As Byte = &HAF
Dim CmndCount As Byte, panspeed As Byte, tiltspeed As Byte, CheckSum As Byte
Dim Addres As Byte, CMND1 As Byte, CMND2 As Byte, DATA1 As Byte, DATA2 As Byte
Public Function monCheckSum(SOM, Addres, CMND1, CMND2, DATA1, DATA2, EOM) As Variant
CheckSum = SOM Xor EOM
CheckSum = CheckSum Xor Addres
CheckSum = (CheckSum Xor CMND1) Xor CMND2
CheckSum = (CheckSum Xor DATA1) Xor DATA2
CheckSum = CheckSum And 255
monCheckSum = CheckSum
End Function
Public Function Envois(SOM As Byte, Addres As Byte, CMND1 As Byte, CMND2 As Byte, DATA1 As Byte, DATA2 As Byte, EOM As Byte, CheckSum As Byte) As Variant
Anguel
Messages postés31Date d'inscriptionmardi 8 novembre 2005StatutMembreDernière intervention15 septembre 2011 4 juin 2007 à 13:14
Bonjour Jack
Je tien te Remercié Infiniment pour ton aide et aussi d'avoir consacré de ton temps pour s'occuper de mes problèmes .
Grasse a toi on a réussi . Le code marche Impeccable. On peut diriger les cameras Speed Dômes a partir d'un feuil de calcule Excel.
Voila se que je fait avec ton code:
Private Const SOM As Byte = &HA0
Private Const EOM As Byte = &HAF
Dim CmndCount As Byte, panspeed As Byte, tiltspeed As Byte, CheckSum As Byte
Dim SendCom As String
Dim Addres As Byte, CMND1 As Byte, CMND2 As Byte, DATA1 As Byte, DATA2 As Byte
Public Function monCheckSum(SOM, Addres, CMND1, CMND2, DATA1, DATA2, EOM) As Byte
CheckSum = SOM Xor EOM
CheckSum = CheckSum Xor Addres
CheckSum = (CheckSum Xor CMND1) Xor CMND2
CheckSum = (CheckSum Xor DATA1) Xor DATA2
CheckSum = CheckSum And 255
monCheckSum = CheckSum
End Function
Public Function Envois(SOM As Byte, Addres As Byte, CMND1 As Byte, CMND2 As Byte, DATA1 As Byte, DATA2 As Byte, EOM As Byte, CheckSum As Byte) As String
Envois = Chr$(SOM) & Chr$(Addres) & Chr$(CMND1) & Chr$(CMND2) & Chr$(DATA1) & Chr$(DATA2) & Chr$(EOM) & Chr$(CheckSum)
End Function
MSComm1.CommPort = 1 'On définit le port série qui sera utilisé
MSComm1.Settings = "4800,n,8,1" 'On définit ici les paramètres de transmission
MSComm1.PortOpen = True 'Ici on ouvre le port de communication
End Sub
Private Sub UserForm1_QueryClose(Cancel As Integer, CloseMode As Integer)
MSComm1.Open = False
End Sub