Bonjour,
j'effectue actuellement un programme qui compte le nombre de tours d'une roue à l'aide d'un capteur de position, et je souhaite savoir le temps que met la roue pour faire 1 tour, sachant que cette roue la est sensée monter à environ 13000 tour par minutes (Débit de fil passant dans la roue : 200m/min sachant que la roue fait 3 cm de diamètre).
j'ai écris un programme en parallèle qui, lorsque j'appuie sur une commande, cela enregistre un temps, puis sur une autre commande pour enregistrer cet autre temps, puis je faisais une soustraction pour avoir la durée entre les deux signaux. sauf qu'il se trouve que je n'ai pas trouvé le moyen afin d'avoir des unités plus précises afin de pouvoir compter ce nombre de tour.
Private Sub Command1_Click()
Dim T1 As Date
T1 = Time
Label1.Caption = T1
End Sub
Private Sub Command2_Click()
Dim T2 As Date
T2 = Time
Label2.Caption = T2
End Sub
Private Sub Command3_Click()
Dim TF As Date
Dim T1 As Date
Dim T2 As Date
T2 = Label2.Caption
T1 = Label1.Caption
TF = CDate(T2 - T1)
Label.Caption = TF
Label3.Caption = CDate(TF) * 60 / ((2 * 0.015 * 3.14))
End Sub
J'ai par la suite voulu rentrer un code de ce genre sur mon programme principal, mais le problème est qu'il est écrit dans le timer, et que du coup lorsque je met T1=Time, l'heure change en continue.
Je souhaiterai donc savoir s'il y a un autre endroit où placer ce programme et un moyen d'avoir une unité plus faible.
Le programme que j'ai écris actuellement est le suivant:
'form: recuperer_signal
Public Sub Timer1_Timer()
Dim err As ErrorCode
Dim portData As Byte
Dim i As Integer, PCV As Long
err = Success
'recherche de la tension disponible sur les différents ports
i = 0
While (i + startPort) < InstantDiCtrl1.Features.PortCount And i < portCountShow
portData = 0
err = InstantDiCtrl1.ReadPort(i + startPort, portData)
If err <> Success Then
Timer1.Enabled = False
HandleError (err)
Exit Sub
End If
PortNum.Item(i).Caption = Str(startPort)
PortHex.Item(i).Caption = Format(Hex(portData), "00")
i = i + 1
Wend
If PortHex(0) <> "FF" Then
Form1.Show 'ouvre la 2eme form pour compter
ElseIf PortHex(0) = "FF" Then
'récupération de la dernière valeur de form1
recuperer_signal.Longueur_finale.Caption = Form1.longueur_fil.Caption
'ecriture excel
With wsExcel
PCV = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & PCV) = Longueur_finale.Caption
End With
Unload Form1 'on referme la form 1 pour la réinitialiser.
End If
'j'ai voulu connaitre la durée à partir de ce moment la
Dim T1 As Date
Dim T2 As Date
Dim TT As Date
Dim vitesse As Long
If PortHex(1) = "FF" Then
T1 = Time
End If
signal1.Caption = T1
If PortHex(1) <> "FF" Then
T2 = Time
signal2.Caption = T2
End If
TT = CDate(T2 - T1)
tempsentredeuxsignaux.Caption = TT
vitesse = CDate(TT) * 60 / ((0.015) * 2 * (3.14))
m_min.Caption = vitesse
End Sub
Dans l'attente d'une aide de votre part, je vous souhaite une excellente fin de journée.
pour le 100eme de seconde si PC assez puissant et pas trop occupe, le 1000eme de seconde peut-etre un peu optimiste:
Private Sub Command1_Click()
Dim T1 As Double
T1 = Timer
Label1.Caption = T1
End Sub
Private Sub Command2_Click()
Dim T2 As Double
T2 = Timer
Label2.Caption = T2
End Sub
Private Sub Command3_Click()
Dim TF As Double
Dim T1 As Double
Dim T2 As Double
T2 = Label2.Caption
T1 = Label1.Caption
TF = T2 - T1
Label3.Caption = TF * 60 / ((2 * 0.015 * 3.14))
End Sub
Pour votre sub routine
Public Sub Timer1_Timer()
definissez les variables en Double, Timer au lieu de Time et de toutes facon vous aurez dans la prise de temps l'echantillonnage de votre Timer et le temps de reponse de la carte d'acquisition
Bonjour,
merci de votre réponse.
j'ai réussis à récupérer de votre manière, mais il se trouve que cela ne marchait pas justement pour le programme avec le timer.
je suis donc en ce moment en train d'essayer de récupérer ce temps la avec le "gettickcount". Je vous tiens au courant si jamais le programme que j'ai écris fonctionne correctement.
Private Sub tempsatrouver()
Dim vitesse As Long
Dim timestart As Long
Dim timefinich As Long
If PortHex(1) = "FF" Then
timestart = GetTickCount()
premier.Caption = timestart
End If
If PortHex(1) = "7F" Then
timefinich = GetTickCount()
deuxieme.Caption = timefinich
End If
Label4.Caption = CStr(timefinich - timestart)
tempsentredeuxsignaux.Caption = Label4.Caption
' vitesse = 60000 * 2 * 3.14 * 1.5 / CDbl(Label4.Caption)
m_min.Caption = vitesse
End Sub
Ce programme ne marche donc pas. En effet, lorsque je le laisse dans le
private sub tempsatrouver()
il ne récupère aucun des temps.
J'ai donc essayé de le mettre dans le
Public Sub Timer1_Timer()
mais dans celui ci, il récupère le temps lorsque l'on a "FF" mais celui ci change en continue (il ne sauvegarde pas le temps à un instant "t") et ce temps ci passe donc à 0 lorsque l'on a "7F". y-a t'il une ligne de code pour sauvegarder la valeur en ms des que le signal passe à FF, et change uniquement lorsque l'on revient à "FF"? ce n'est peut être pas une condition avec if qu'il aurait fallu que je mette.
Merci de votre aide.
re,
Cela n'a pas changé grand chose aux résultats obtenus.
Je vous mets le code de la form complet si jamais cela peut vous aider, pendant ce temps je cherche aussi à trouver une solution.
Option Explicit
Private Const startPort As Integer = 0
Private Const portCountShow As Integer = 4
Private Declare Function GetTickCount Lib "kernel32" () As Long
'Déclaration des variables
'Public timestart As Long
'Public timefinich As Long
Dim appExcel As Excel.Application 'Application Excel
Dim wbexcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.Worksheet 'Feuille Excel
Private Sub HandleError(ByVal err As ErrorCode)
Dim utility As BDaqUtility
Dim errorMessage As String
Dim res As ErrorCode
Set utility = New BDaqUtility
If err <> Success Then
MsgBox "Sorry ! Some errors happened, the error code is: " & errorMessage, , "StaticDI"
End If
End Sub
Private Sub Form_Load()
' le matériel choisis par défaut est "demo device", l'utilisateur peut en choisir
' un autre en fonction de ses besoins
If Not InstantDiCtrl1.Initialized Then
MsgBox "Please select a device with DAQNavi wizard!", , "StaticDI"
End
End If
Dim devNum As Long
Dim devDesc As String
Dim devMode As AccessMode
Dim modIndex As Long
InstantDiCtrl1.getSelectedDevice devNum, devDesc, devMode, modIndex
'Permettre au timer de lire les ports DI
Timer1.Enabled = True
'Ouverture de l'application
Set appExcel = CreateObject("Excel.application")
'Ouverture d'un fichier Excel
Set wbexcel = appExcel.Workbooks.Open("C:\Users\la.quere\Documents\programmation peut etre finale\nombre de tours.xlsx")
'wsExcel correspond à la première feuille du fichier
Set wsExcel = wbexcel.ActiveSheet
appExcel.Visible = True
End Sub
'form: recuperer_signal
Public Sub Timer1_Timer()
Dim err As ErrorCode
Dim portData As Byte
Dim i As Integer, PCV As Long
err = Success
'recherche de la tension disponible sur les différents ports
i = 0
While (i + startPort) < InstantDiCtrl1.Features.PortCount And i < portCountShow
portData = 0
err = InstantDiCtrl1.ReadPort(i + startPort, portData)
If err <> Success Then
Timer1.Enabled = False
HandleError (err)
Exit Sub
End If
PortNum.Item(i).Caption = Str(startPort)
PortHex.Item(i).Caption = Format(Hex(portData), "00")
i = i + 1
Wend
If PortHex(0) <> "FF" Then
Form1.Show 'ouvre la 2eme form pour compter
ElseIf PortHex(0) = "FF" Then
'récupération de la dernière valeur de form1
recuperer_signal.Longueur_finale.Caption = Form1.longueur_fil.Caption
'ecriture excel
With wsExcel
PCV = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A" & PCV) = Longueur_finale.Caption
End With
Unload Form1 'on referme la form 1 pour la réinitialiser.
End If
' Dim vitesse As Long
' Dim timestart As Long
'Dim timefinich As Long
'If PortHex(1) = "FF" Then
'timestart = GetTickCount()
'premier.Caption = timestart
' End If
' If PortHex(1) = "7F" Then
' timefinich = GetTickCount()
'deuxieme.Caption = timefinich
' End If
' Label4.Caption = CStr(timefinich - timestart)
'tempsentredeuxsignaux.Caption = Label4.Caption
' vitesse = 60000 * 2 * 3.14 * 1.5 / CDbl(Label4.Caption)
'm_min.Caption = vitesse
End Sub
'Private Sub tempsatrouver()
' Dim vitesse As Long
' Dim timestart As Long
' Dim timefinich As Long
' If PortHex(1) = "FF" Then
'timestart = GetTickCount()
'premier.Caption = timestart
' End If
' If PortHex(1) = "7F" Then
'timefinich = GetTickCount()
'deuxieme.Caption = timefinich
'End If
'Label4.Caption = CStr(timefinich - timestart)
'tempsentredeuxsignaux.Caption = Label4.Caption
' vitesse = 60000 * 2 * 3.14 * 1.5 / CDbl(Label4.Caption)
' m_min.Caption = vitesse
'End Sub
Re,
J'ai effectivement tout mit en commentaire juste pour l'envoie sur le forum, ainsi que pour montrer les deux types de manière que j'ai effectué pour tester le programme.
Qu'entendez vous par "pas de declaration Public"?
Car la (encore en commentaire) j'avais placé
public timestart as long
ainsi que
public timefinich as long
dans le
option explicit
ce n'était peut être de cette manière qu'il fallait déclarer la variable en variable public?
re,
je viens d'essayer votre programmer en modifiant ce dont j'avais besoin, et j'ai toujours le même soucis du label qui augmente en continue lorsque le signal reste sur "FF" ou s'il reste sur "7F" sachant que je ne reçois que l'un des deux caractères.
cordialement
il me semble avoir trouvé.
j'ai mis timer.enabled=False avant le début de ce programme, puis je l'ai remis en true ensuite, et les valeurs que j'obtenais sont à peu prêt cohérentes.
un grand merci à vous pour votre aide.
Ok, fichier avec front montant et arret du tirmer pendant le traitement (peut eviter les bug si interval timer tres court):https://www.cjoint.com/c/EFqnIaizK2f
re,
Le signal que je reçois n'est finalement pas le bon, mais je me demande si ce n'est pas dû au fait que le pc n'est pas assez puissant pour compter tout les signaux. la fréquence de réceptions des signaux est d'environ 300/400hz et le capteur de position a une fréquence de commutation de 1500 hz, donc ca ne vient pas du capteur.
ou alors c'est parce que le signal change encore en continue..
Merci pour votre programme,
j'ai du mal a comprendre pourquoi le programme ne m'affiche pas un temps inférieur à 140 ms...
sachant que théoriquement, je suis sensé descendre à 20ms.
Pensez vous que c'est à cause de la puissance du processeur? (j'ai tout de même un I5)
Re,
Il est à 100ms, trop élevé du coup, et je viens de refaire tout mes calculs, et c'est finalement tout les 2,25ms que je suis sensé recevoir un signal, ne serait-ce pas trop faible?
Re,
ne serait-ce pas trop faible? Faites l'essai timer1 a 2.
Il est vrai qu'un PC n'est pas un API(automate programmable). Par contre vous pouvez lancer ou installer votre exe en tant que service Windows, de ce fait il a plus de ressource CPU qu'un exe normal. Donc vous pourriez faire des essais pour voir jusque ou vous pouvez descendre le Timer1
Re,
Je viens de faire les tests, et du coup je ne descend pas à moins de 30ms.
Du coup je vais juste compter la durée d'acquisition et diviser par le nombre de signaux, ce sera plus simple à faire et ce sera sur que je possèderai les bonnes valeurs.
Merci pour votre aide.
C'est ce que je pensai vous proposer, car vous pourrez faire des stats avec le nombre de tours theoriques et ceux que vous aurez comptes sur un echantillon de dix durees d'acquisition comme ca vous verrez si votre "system" de controle est capable ou pas
En effet, mais il aurait été préférable d'avoir la vitesse affichée en temps réelle et non pas la moyenne d'une durée, car le but était de vérifier, à l'aide d'un appareil auxiliaire, si la vitesse de rotation était la même que celle indiquée par l'appareil.
Je me contenterai donc de la moyenne sur plusieurs échantillons.
Merci de m'avoir apporté vos connaissances, je viens de débuter la programmation et l'aide apportée par ce forum m'apporte beaucoup de savoir.
Il est à 100ms, trop élevé du coup, et je viens de refaire tout mes calculs, et c'est finalement tout les 2,25ms que je suis sensé recevoir un signal, ne serait-ce pas trop faible?
ne serait-ce pas trop faible? Faites l'essai timer1 a 2.
Il est vrai qu'un PC n'est pas un API(automate programmable). Par contre vous pouvez lancer ou installer votre exe en tant que service Windows, de ce fait il a plus de ressource CPU qu'un exe normal. Donc vous pourriez faire des essais pour voir jusque ou vous pouvez descendre le Timer1
deux liens a visiter:
http://www.remylarrieu.com/fr/creer-un-service-avec-un-executable/
http://www.alexwinner.com/tips/104-applscriptentantqueservice.html
Je viens de faire les tests, et du coup je ne descend pas à moins de 30ms.
Du coup je vais juste compter la durée d'acquisition et diviser par le nombre de signaux, ce sera plus simple à faire et ce sera sur que je possèderai les bonnes valeurs.
Merci pour votre aide.
C'est ce que je pensai vous proposer, car vous pourrez faire des stats avec le nombre de tours theoriques et ceux que vous aurez comptes sur un echantillon de dix durees d'acquisition comme ca vous verrez si votre "system" de controle est capable ou pas
Je me contenterai donc de la moyenne sur plusieurs échantillons.
Merci de m'avoir apporté vos connaissances, je viens de débuter la programmation et l'aide apportée par ce forum m'apporte beaucoup de savoir.