3 Eksen Usb CNC Kontrol Kartı Projesi Yardım

Başlatan computerboy, 27 Temmuz 2010, 09:16:31

justice_for_all

sunu demek istiyorum veriyi bilgisayardan gönderdikten sonra delindi sinyslinin gelmesini bekliyosun işte bunu ne yaparak bekliyosun döngü gibi bişeylemi yaptın acaba
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

evet döngü kullanarak yaptım mesela delme komutunu gönderdim ve pic delme moduna girdi Z motoru +20 tur attı ve eski konumu -0 konumuna geldi ve pic delindi diye sinyal gönderdi o şekilde.

justice_for_all

arkadasım donguyle yaptıgın için donup kalıyo işte bilgi gelip grlmediğini timer ile kontrol ettirmen gerekiyo arkadaşım
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

onu nasil yaparım acaba üstad proton kullanıyorum ben timer kullanımı hakkında hiç bilgim yok. ayrıca visual basicde yaptığım arayüzde mesajın gelip gelmediğini api aracılığı ile kontrol ediyorum döngü ve timer kullanmadan.

Burak B

#19
t2 arkadaşımızın bahsettiği BackgroundWorker aslında Thread olarak geçer. VB + Thread uygulamalarını araştır. Thread uygulaması yazdığın bir fonksiyonu ana yazılım döngüsünden ayrı olarak çalıştırmak için kullanılır. Bu da işletim sisteminin mesaj döngüsüne müdahale etmeden istenen işlemin yapılmasını sağlayacaktır ki böylece ana penceren (programın) donmamış olur.

http://www.bilgininadresi.net/Madde/8303/Vb.Net-ile-%C3%96zg%C3%BCr-Threading-Programlama

Eğer VB altında managed bir şekilde thread işleminin altından çıkamazsan Win32 API ile daha kolay halledebilirsin.

http://www.vbforums.com/showthread.php?t=229694

Ben mesaj yazarken mesaj gelmiş. Timer kullanımını tavsiye etmem. WM_TIMER kullandığı için ana uygulamadaki her takılma, donma, v.s. sonuca da yansıyacaktır.

Kolay gelsin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

justice_for_all

microchipim dll imi kullandıgın ondz kesme die bi olay yok zaten yani bilgi gelse bile arayüzün haberi olmuyo bu yuzden vb de timeri 500ms ye ayarlayıp kesmesinde ise usbden  bilgi grlip gelmedini geldiyse ne bilgisi oldugunu kontrol ettien gerek...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

evet teşekkürler aradığım buydu işte:) çalışmalarımı tekrar başlatacağım kaldığım yerden devam çok proje var vakit buldukça yaparım ardık.

justice_for_all

arkadasım timer kullanmadanda usbden gelen veriyi kontrol edemezsin
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

computerboy

#23

Option Explicit

' HID interface API declarations...
Declare Function hidConnect Lib "mcHID.dll" Alias "Connect" (ByVal pHostWin As Long) As Boolean
Declare Function hidDisconnect Lib "mcHID.dll" Alias "Disconnect" () As Boolean
Declare Function hidGetItem Lib "mcHID.dll" Alias "GetItem" (ByVal pIndex As Long) As Long
Declare Function hidGetItemCount Lib "mcHID.dll" Alias "GetItemCount" () As Long
Declare Function hidRead Lib "mcHID.dll" Alias "Read" (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
Declare Function hidWrite Lib "mcHID.dll" Alias "Write" (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
Declare Function hidReadEx Lib "mcHID.dll" Alias "ReadEx" (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Declare Function hidWriteEx Lib "mcHID.dll" Alias "WriteEx" (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
Declare Function hidGetHandle Lib "mcHID.dll" Alias "GetHandle" (ByVal pVendoID As Long, ByVal pProductID As Long) As Long
Declare Function hidGetVendorID Lib "mcHID.dll" Alias "GetVendorID" (ByVal pHandle As Long) As Long
Declare Function hidGetProductID Lib "mcHID.dll" Alias "GetProductID" (ByVal pHandle As Long) As Long
Declare Function hidGetVersion Lib "mcHID.dll" Alias "GetVersion" (ByVal pHandle As Long) As Long
Declare Function hidGetVendorName Lib "mcHID.dll" Alias "GetVendorName" (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetProductName Lib "mcHID.dll" Alias "GetProductName" (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetSerialNumber Lib "mcHID.dll" Alias "GetSerialNumber" (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
Declare Function hidGetInputReportLength Lib "mcHID.dll" Alias "GetInputReportLength" (ByVal pHandle As Long) As Long
Declare Function hidGetOutputReportLength Lib "mcHID.dll" Alias "GetOutputReportLength" (ByVal pHandle As Long) As Long
Declare Sub hidSetReadNotify Lib "mcHID.dll" Alias "SetReadNotify" (ByVal pHandle As Long, ByVal pValue As Boolean)
Declare Function hidIsReadNotifyEnabled Lib "mcHID.dll" Alias "IsReadNotifyEnabled" (ByVal pHandle As Long) As Boolean
Declare Function hidIsAvailable Lib "mcHID.dll" Alias "IsAvailable" (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean

' windows API declarations - used to set up messaging...
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

' windows API Constants
Private Const WM_APP = 32768
Private Const GWL_WNDPROC = -4

' HID message constants
Private Const WM_HID_EVENT = WM_APP + 200
Private Const NOTIFY_PLUGGED = 1
Private Const NOTIFY_UNPLUGGED = 2
Private Const NOTIFY_CHANGED = 3
Private Const NOTIFY_READ = 4

' local variables
Private FPrevWinProc As Long    ' Handle to previous window procedure
Private FWinHandle As Long      ' Handle to message window

' Set up a windows hook to receive notification
' messages from the HID controller DLL - then connect
' to the controller
Public Function ConnectToHID(ByVal pHostWin As Long) As Boolean
   FWinHandle = pHostWin
   ConnectToHID = hidConnect(FWinHandle)
   FPrevWinProc = SetWindowLong(FWinHandle, GWL_WNDPROC, AddressOf WinProc)
End Function

' Unhook from the HID controller and disconnect...
Public Function DisconnectFromHID() As Boolean
   DisconnectFromHID = hidDisconnect
   SetWindowLong FWinHandle, GWL_WNDPROC, FPrevWinProc
End Function

' This is the procedure that intercepts the HID controller messages...
Private Function WinProc(ByVal pHWnd As Long, ByVal pMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   If pMsg = WM_HID_EVENT Then
       Select Case wParam
       
        ' HID device has been plugged message...
        Case Is = NOTIFY_PLUGGED
           UsbMod.OnPlugged (lParam)

        ' HID device has been unplugged
        Case Is = NOTIFY_UNPLUGGED
           UsbMod.OnUnplugged (lParam)
       
        ' controller has changed...
        Case Is = NOTIFY_CHANGED
           UsbMod.OnChanged

        ' read event...
        Case Is = NOTIFY_READ
           Form1.OnRead (lParam)
        End Select
   
   End If
   
   ' next...
   WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)
   
End Function

Public Sub OnRead(ByVal pHandle As Long)
Dim Response As Variant
   If hidRead(pHandle, BufferIn(0)) Then
      Response = Chr$(BufferIn(2)) & Chr$(BufferIn(3))
      'MG Response, vbBlue, True
      Select Case Response
        Case "MM"
         MG "Ölçü Sistemi: MM", vbRed, True
        Case "CM"
         MG "Ölçü Sistemi: CM", vbRed, True
        Case "MS"
         MG "Axis Siztemi: X,Y,Z", vbRed, True
        Case "S1"
         MG "Spindle Açıldı !", vbRed, True
        Case "S0"
         MG "Spindle Kapatıldı !", vbRed, True
        Case "EN"
         MG "Parça İşleme Tamamlandı !", vbRed, True
        Case "T0"
         TURKONTROL = False
         Command1_Click
         MG "OK", vbRed, True
      End Select
   End If
End Sub


api aracılığı ile windows mesajlaşma sistemini kullanarak yapıyorum mesela yukardaki örnekte kullandığım api usb cihazına tanımlanan hwnd penceresinin numarasını alıp direk dinleme yapıyor. yanlış bilmiyorsam tabi.


justice_for_all

peki bu fonksiyonu sureklimi calıştırıyosun
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Burak B

Alıntı Yaparkadasım timer kullanmadanda usbden gelen veriyi kontrol edemezsin

Bunu bana söylediğini farzederek cevap veriyorum. Timer kullanmakla ana programın mesaj döngüsüne belirtilen zaman aralığında WM_TIMER ürettirmek ve bu WM_TIMER mesajı döngü içerisinde yakalanarak istenilen işi yaptırmakla gerçekleştirilen bir olaydır. Eğer mesaj döngüsü başka bir nedenden dolayı donarsa timerınızda donar. Timer olmadan USB den gelen veriyi değil yedi ceddini kontrol edersiniz bunda da bir sorun olmaz; hatta ana programınız bayılsa veya ölse bile child bundan haberdar olmadığı sürece çalışacaktır.Böylece cihazınız ve/veya data toplama işleminiz devam eder. Timer kullanmak bir alternatif ben sadece tavsiye etmiyorum dedim. Thread kullanın önerim budur. Çünkü thread o kadar güçlüdür ki doğru kullanmazsanız tüm sistemi kendi çıkarı için tüketebilir. Kaç çekirdek ile kaç usb ne kullanmak isterseniz artık. v.s. v.s.

Kolay gelsin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

computerboy

#26
Hayır fonksiyon form ilk açıldığı andan itibaren dinliyor ve usbden veri geldiği an mesaj penceresine yansıtıyor.  justice_for_all şu şekildemi diyorsunuz apiden bağımsız timer ile usbden gelen veriyi belirli ms aralıklarla kontrol ettireyim ona göre işlem yaptırayım


Burak B

"siz" yerine nick belirtirsen karışıyor biraz :)
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

computerboy

justice_for_all arkadaşımıza demiştim.

Pardon üstad mesajlaşma sistemimiz karıştı timerlemi denesek acaba :)

Burak B

Sen timer' a meyillisin anlaşıldı. Timer yap daha anlaşılırdır. Thread karmaşık gelebilir.  :)
"... a healthy dose of paranoia leads to better systems." Jack Ganssle