VBA - Mscomm (seri port) ile veri loglama

 


Youtube da izleyebilirsin..


Örnek projemizde, seri port ile haberleşen bir cihazdan (barkod okuyucu, terazi, PLC, Arduino..) Excel sayfasına bilgi alacağız. Yazılımı geliştirmek için tek ihtiyacımız Excel oluyor.. Seri haberleşme için eskiden beri (yaklaşık 30 yıldır) VB6 ile kullanılan MSCOMM32.OCX isimli ActiveX bileşeni kullanıyoruz. Önceki yazıda bahsetmiştim, yine hatırlatayım, bu tip bileşenleri kullanabilmemiz için Excel versiyonumuz 32-bit olmalıdır. Hesap > Excel Hakkında penceresinde en üstte yazıyor.. Office versiyonu önemli değil 2007-2021 arası hatta 365 olabilir, hepsinde çalışır.. (365 bulut sürümü hariç, orada VBA değil kodlaması Basic e göre çok daha zor olan TypeScript veya JavaScript kullanılıyor..) 



Neyse ki Microsoft, eski VBA müşterilerini kızdırmamak için VBA desteğini yeni Office uygulamalarında da devam ettiriyor.



Senaryo şu şekilde; seri porttan gelen virgül ile ayrılmış bilgiler 6. satıra gelecektir.. Her bilgi geldiğinde 10. satır bir alt satıra kayacak ve 10. satıra yeni bilgiler yazılacaktır. Böylece cihazdan gelen bilgiler için log kaydı yapılmış olacaktır. Cihaz simülasyonu için sanal port ve Hercules programını kullandım.


Bileşenin çalışabilmesi için Güvenlik Merkezi (Trust Center) 'ne tıklayarak, ulaşacağınız ActiveX Ayarları aşağıdaki gibi olmalıdır.



MSCOMM32.OCX bileşeninin Windows 10 a tanıtılması

ocxme.com sitesinden bileşenin son versiyonunu indirin. 



Bilgisayarınızdaki işletim sistemi Windows 10 64-bit ise ki genelde öyle oluyor, bu dosyayı C:\Windows\SysWOW64 dizini altına, 32-bit ise C:\Windows\System32 dizinine kopyalayın..

Ardından resimdeki komutları komut isteminde çalıştırın..




Boş bir .xlsx dosyası açın ve farklı kaydet i seçerek farklı kaydet tipini .xlsm olarak seçin. Geliştirici sekmesinden Ekle (insert) > ActiveX controls > More controls menüsünü takip edin. Açılan pencerede Microsoft Communications Control, version 6.0 (SP6) seçin. Ardından sayfada bir yere tıklayın, telefon simgesi gelecektir. 



Sizde Geliştirici sekmesi gözükmüyorsa önceki yazıya bakınız.. 

Not: Resimde Insert butonunun yanında Design Mode butonu basılmış görülüyor, programı çalıştırırken bu butona basarak dizayn modundan çıkmamız gerekiyor.

Telefon simgesine sağ tık yaparak özelliklerine girin. burada RThreshold ve SThreshold değerlerine 1 yazın.. 

Bu işlemleri yaparken resimdeki gibi bir hata ile karşılaşabilirsiniz..




Bu sorunun çözümü olarak, kayıt defterine bir değer eklemek gerekiyor..




Bunun için Notepad ile bir .txt dosyasına aşağıdaki satırları yazın :

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905] 
@ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"

ve dosyayı .reg uzantılı olarak kaydedin. Çift tık ile çalıştırın..


Excel Sheet1 in düzenlenmesi


En üstteki resimde görüldüğü gibi sayfayı düzenleyin.. E6 hücresine =NOW() yazın, şimdiki zamanı gösterecektir.. E sütununu seçin, seçime sağ tık yapın ve Format Cells... e tıklayın ve resimdeki gibi düzenleyin..



Not: Resimdeki format Türkçe içindir, siz kendi dilinize göre gün, ay, yıl, saat, dakika ve saniye ayarını yapınız.. 


Geliştirici sekmesinden Ekle (insert) > ActiveX controls > Command Button  ile üç adet butonu sayfaya ekleyin ve düzenleyin.. Dizayn modu düğmesi basılı durumdayken bir butona çift tıklarsak kodlama penceresi açılacaktır..





Seri porttan Excel'e her bilgi geldiğinde MSComm1_OnComm olayı oluşur, bu olaya yazılan kodlar sayesinde program çalışıyor..
İlk satırdaki kodu yazarken veya kopyala yapıştır yaparken dikkat edin, kodlama penceresinde Sheet1 e tıklandığında üstteki kutularda (General) ve (Declarations) yazmalıdır..


Public EnableLog As Boolean 'should be in General Declarations in Sheet1

Private Sub CommandButton1_Click()  'Save As button
    Dim FileName As String
    FileName = ThisWorkbook.Path
    FileName = FileName & "\" & Format(CStr(Now), "yyyy_mm_dd_hh_mm")
    FileName = FileName & ".xlsm"
    ActiveWorkbook.SaveAs FileName
End Sub

Private Sub CommandButton2_Click() 'Enable Logging button
    EnableLog = True
    'http://www.endprod.com/colors/colors.htm
    CommandButton2.BackColor = 52582 'green
    On Error Resume Next
    If MSComm1.PortOpen = False Then  'check if the serial port is open
        MSComm1.PortOpen = True       'open the serial port
    End If
    If Err Then MsgBox Error$, 48     'Display error in message box
    'MSComm1.Output = "ABC" + Chr$(10)'to send something
    
End Sub

Private Sub CommandButton3_Click() 'Disable Logging button
    EnableLog = False
    CommandButton2.BackColor = 15790320 'grey
    On Error Resume Next
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False       'close the serial port
    End If
    If Err Then MsgBox Error$, 48
End Sub

Private Sub MSComm1_OnComm()
    If MSComm1.CommEvent = comEvReceive Then  'when send, comEvSend occurs
        Dim arr() As String
        arr = Split(MSComm1.Input, ",")
        Cells(6, 2) = arr(0)
        Cells(6, 3) = arr(1)
        Cells(6, 4) = arr(2)
        'shift cells down at row 10
        Range("B10:E10").Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        'update row 10
        Cells(10, 2) = Cells(6, 2)
        Cells(10, 3) = Cells(6, 3)
        Cells(10, 4) = Cells(6, 4)
        Cells(10, 5) = Cells(6, 5)
    End If
End Sub

Turuncu satırlarda yazan kodları, Geliştirici sekmesindeki Makro Kaydet butonunu kullanarak elde ettim.. Makro kaydı çok kolay.. Butona bastıktan sonra mouse ile B10:E10 seçin, seçime sağ tık yapın ve insert seçin, ardından shift cells down seçin. Kaydı durdura tıklayın. Alt+F11 kodlama penceresinde oluşan Module e bakın.. Excel, kodları bizim için üretebiliyor ve bunu yıllardır yapıyor.. ChatGPT yeni çıktı ve yanlış kodlar üretebiliyor.









Yorumlar

Bu blogdaki popüler yayınlar

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

Köpüğü alınmış Windows AtlasOS