PIC ile HMI ekran kullanımı

Başlatan acemipicci, 08 Temmuz 2015, 16:21:33

acemipicci

Merhaba hocalarım,

Ben çok amatör olarak pic mikrokontrolör ile uğraşıyorum. piyasada genellikle PLC lerle kullanılan scada sistemi kurulan screenler var. bu tip screenle birlikte PLC yerine PIC i koyma şansımız var mı? 

saygılar,

Salih

Evet bazı teknik hususlara dikkat ederek kullanabilirsin.
Öncelikle haberleşme alt yapına karar vereceksin. Paneller RS232, RS485, TCP/IP üzerinden
haberleşebilecek alt yapılı olarak imal ediliyorlar.
Sende PIC devreni en azından biriyle haberleşebilecek şekilde hazırlaman gerekir.
İkinci konu, haberleşme protokolü olarak MODBUS kullanmak gerekecek.
PIC li devren ya master olarak yada slave olarak modbus haberleşmeyi desteklemelidir.

PROTECH_

Bunun için özel bir çözümüm var.
Dilerseniz bağlantıya geçebilirsiniz.

e-mail: turgut_electronical_eng@hotmail.com
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

makdeniz

PIC ve HMI arasında iletişim kurmanın en kolay yolu Modbus protokolü.
Bütün HMI'lar destekler.
Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

magic_gun

bu konu ile bende amatörce uğraşıyorum
geledigim nokta

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Magic Technology                                  *
'*  Notice  : Copyright (c) 2015 do Not copy                    *
'*          : All Rights Reserved                                            *
'*  Date    : 6.07.2015                                                      *
'*  Version : 3.56                                                              *
'*  Notes   :                                                                       *
'*          :                                                                           *
'*********************************************
Device 18F4520
Xtal = 20

ADCON1 = 7
Declare Adin_Res 10       
Declare Adin_Tad FRC      
Declare Adin_Stime 50     
Declare Hserial_RCSTA = %10010000  
Declare Hserial_TXSTA = %00100000        
Declare Hserial_Baud = 38400        
Declare Hserial_Clear = On         
Symbol RS485AKT = PORTB.1
'standart variable
Dim RCV_BYTE As Byte
Dim SR_BYTE_CNT As Byte
Dim SEND_BYTE_CNT As Word
Dim START_ADRESS As Word
Dim ZAMAN As Byte
Dim AI_ZAMAN As Byte
Dim SR_STR[110] As Byte
Dim IQ_TABLE[100] As Byte
Dim V1 As Byte
Dim V2 As Byte
Dim V3 As Word
Dim CRC_16 As Word
'Demo variable
Dim sayac As Byte
Dim sayac2 As Byte
Clear
'INTERRUPT
INTCON = %11100000
T0CON = %11000001        
PIE1.5 = 1
DelayMS 1000         
On Interrupt GoTo INT_LOOP
Enable
Low RS485AKT
IQ_TABLE[1] = ERead 0   'Modul adress
;********************** START ***********************************
start:
Inc sayac
If sayac = 0 Then Inc sayac2
IQ_TABLE[5] = sayac2
If sayac2.1 = 1 Then Inc IQ_TABLE[5]
If sayac2.2 = 1 Then Inc IQ_TABLE[7]

If PIE1.4 = 0 And PIE1.5 = 0  And ZAMAN > 5 Then  Low RS485AKT : ZAMAN = 0 : PIE1.5 = 1
GoTo start
;-------------------------------------------------------------------
;*********************** INTERRUPT *********************************
INT_LOOP: Disable
'RECEIVE BUFFER'DA BILGI VARSA ALMA ISLEMLERI
If PIE1.5 = 1 Then
    If PIR1.5 = 1 Then
        If ZAMAN > 4 Then SR_BYTE_CNT = 0 
        ZAMAN = 0
        HSerIn [RCV_BYTE]
        SR_STR[SR_BYTE_CNT] = RCV_BYTE 
        SR_BYTE_CNT = SR_BYTE_CNT + 1 
        GoTo CIKIS
    EndIf        
EndIf
'OUTPUT BUFFER'DA BILGI YOKSA YENİSİNİ GÖNDERME ISLEMLERI
If PIE1.4 = 1 Then
    If PIR1.4 = 1 Then
        ZAMAN = 0
        If SR_BYTE_CNT > SEND_BYTE_CNT - 1  Then
             PIE1.4 = 0 :  SR_BYTE_CNT = 0 : GoTo CIKIS 
        EndIf
        HSerOut [SR_STR[SR_BYTE_CNT]]
        SR_BYTE_CNT = SR_BYTE_CNT + 1
        GoTo CIKIS
    EndIf
EndIf
If INTCON.2 = 1 Then
    INTCON.2 = 0
    Inc ZAMAN
    Inc AI_ZAMAN
    If ZAMAN > 6 Then
        ZAMAN = 0 
        GoSub MODBUS
    EndIf
EndIf
CIKIS:
Resume
Enable
;
;******************* MODBUS SORGU ÇÖZME İŞLEMLERİ ******************
MODBUS: 
If PIE1.5 = 0 Then Return
If SR_BYTE_CNT < 8 Then Return
PIE1.5 = 0  'RCV İNTERRUPT KAPATILIYOR
'ALINAN BİLGİLER TAMAMLANDI KONTROL EDİLİYOR       
If SR_STR[0] = IQ_TABLE[1] Then  'ADRES KONTROL EDİLİYOR 
    GoSub CRC16 'CRC16 HESAPLA
    If CRC_16.Byte0 = SR_STR[SR_BYTE_CNT-2] Then      
        If CRC_16.Byte1 = SR_STR[SR_BYTE_CNT-1] Then
            High RS485AKT    
            START_ADRESS = ((SR_STR[2]*256) + SR_STR[3]) * 2
            'BİLGİLER OKUNMAK İSTENDİ 
            If SR_STR[1] = 3 Or SR_STR[1] = 4 Then                     
                SEND_BYTE_CNT = (((SR_STR[4]*256) + SR_STR[5])* 2) + 5
                'İSTENİLEN ADRES SINIR DIŞINDA
                If START_ADRESS  + SEND_BYTE_CNT - 5 > 102 Then GoTo REG_ADR 
                'GÖNDERİLEN STRİNG OLUŞTURMA
                SR_STR[2] = SEND_BYTE_CNT - 5
                For V1 = START_ADRESS To START_ADRESS + SEND_BYTE_CNT
                    SR_STR[V1-START_ADRESS + 3] = IQ_TABLE[V1]                   
                Next
                GoSub SEND_CRC16
                Return
            EndIf 
            'TEK VARİABLE DEĞİŞTİRİLDİ 
            If SR_STR[1] = 6 Then 
                'İSTENİLEN ADRES SINIR DIŞINDA
                If START_ADRESS > 100 Then GoTo REG_ADR 
                'LİMİT KONTROL    
                If START_ADRESS < 21 Then 
                    If (SR_STR[4]*256) + SR_STR[5] > 1023 Then GoTo LIMIT_OUT
                EndIf                 
                If START_ADRESS > 20 Then 
                    If START_ADRESS < 35 Then 
                        If (SR_STR[4]*256) + SR_STR[5] = 0 Then GoTo LIMIT_OUT
                        If (SR_STR[4]*256) + SR_STR[5] > 255 Then GoTo LIMIT_OUT
                    EndIf
                EndIf                                                                                         
                IQ_TABLE[START_ADRESS] = SR_STR[4]
                IQ_TABLE[START_ADRESS + 1] = SR_STR[5]
                GoSub KAYIT
                'GÖNDERİLEN STRİNG OLUŞTURMA
                SEND_BYTE_CNT = 8
                GoSub SEND_CRC16
                Return
            EndIf            
            'ÇOKLU VARİABLE DEĞİŞTİRİLDİ 
            If SR_STR[1] = 16 Then   
                SEND_BYTE_CNT = SR_STR[6] + 5  'GONDERİLEN DATA BYTE SAYISI 
                'İSTENİLEN ADRES SINIR DIŞINDA
                If START_ADRESS  + SEND_BYTE_CNT - 5 > 102 Then GoTo REG_ADR
                'STRİNG BOYU HATALI
                If SEND_BYTE_CNT + 4 <> SR_BYTE_CNT Then GoTo REG_ADR                  
                For V1 = START_ADRESS To START_ADRESS + SEND_BYTE_CNT - 6                    
                    'LİMİT KONTROL    
                    If V1.0 = 0 Then 'SADECE FİRST BYTE'DA ÇALIŞMASI İÇİN
                        V3 = SR_STR[V1 - START_ADRESS + 7] * 256  'YAZILMAK İSTENEN DEĞER 
                        V3 = V3 + SR_STR[V1 - START_ADRESS + 8]   'TESPİT EDİLİYOR
                        If START_ADRESS < 21 Then 
                            If V3 > 1023 Then GoTo LIMIT_OUT
                        EndIf 
                        If V1 > 20 Then 
                            If V1 < 35 Then 
                                If V3 = 0 Then GoTo LIMIT_OUT
                                If V3 > 255 Then GoTo LIMIT_OUT
                            EndIf
                        EndIf                                                                                                                              
                    EndIf                                                                                                                                
                    IQ_TABLE[V1] = SR_STR[V1 - START_ADRESS + 7]
                Next
                GoSub KAYIT
                'GÖNDERİLEN STRİNG OLUŞTURMA
                SEND_BYTE_CNT = 8                                
                GoSub SEND_CRC16
                Return
            EndIf                                                     
            'GEÇERSİZ FONKSİYON KODU
            SEND_BYTE_CNT = 5
            SR_STR[2] = 1
            GoSub SEND_CRC16 
            Return
        EndIf    
    EndIf
EndIf    
SR_BYTE_CNT = 0
Return  
'REGISTIR ADRES SINIR DIŞI
REG_ADR:
SEND_BYTE_CNT = 5
SR_STR[2] = 2
GoSub SEND_CRC16 
Return
'LİMİT SINIR DIŞI
LIMIT_OUT:
SEND_BYTE_CNT = 5
SR_STR[2] = 3
GoSub SEND_CRC16 
Return   
;
;************************** GÖNDERİLEN CRC-HESAPLATMA ****************
SEND_CRC16:
SR_BYTE_CNT = SEND_BYTE_CNT
GoSub CRC16
SR_STR[SEND_BYTE_CNT - 2] = CRC_16.Byte0
SR_STR[SEND_BYTE_CNT - 1] = CRC_16.Byte1
SR_BYTE_CNT = 0
PIE1.4 = 1  
Return
;
;**************************  CRC-16 hesap *************************
CRC16:
V1 = 0
V2 = 0
V3 = 0
CRC_16 = 65535
For V1 = 0 To SR_BYTE_CNT - 3
    V3 = CRC_16
    CRC_16.Byte0 = V3.Byte0 ^ SR_STR[V1]   
    For V2 = 0 To 7
        If CRC_16.0 = 1 Then 
            CRC_16 = CRC_16 >> 1            
            CRC_16 = CRC_16 ^ 40961
        Else
            CRC_16 = CRC_16 >> 1 
        End If
    Next V2
Next V1 
Return
;

KAYIT:
If IQ_TABLE[1] <> ERead 0 Then EWrite 0,[IQ_TABLE[1]]
Return
hayal etmeden basaramazsınız www.atariturkiye.com

acemipicci

yanıtlar için teşekkür ederim. bir şeyin olduğunu bilmek insana yapmaya kalkışmak için cesaret veriyor. biraz kafa yorum birazda para harcayıp olumlu bir şeyler çıkarabilirsem geri dönüş yapıp paylaşacağım . amacım jeneratör kontrol sistemi yapmak tabiki ayrıca bir senkronoskop kullanarak. çevre elemanları yapacağım pic li devreyle kumanda edip aynı zamanda senkronoskopuda sürerek şebeke- jeneratör  ve jeneratör- jeneratör senkron sistemini yapmaya çalışacağım. bu sistemi PLC ile çok kolay yapıyorlar ama çok daha ucuza mal olur mu ona bakacağım

a.zorba

şu satırlarda hata verıyor compiler 3.5.5.5

V3 = SR_STR[V1 - START_ADRESS + 7] * 256  'YAZILMAK İSTENEN DEĞER 
V3 = V3 + SR_STR[V1 - START_ADRESS + 8]   'TESPİT EDİLİYOR
Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

Okan AKÇA

Hocam modbus yazdiginiz taktirde kullanirsiniz. Ben kendi projelerimde kullanıyorum zaten en zor is haberlesme halletiginiz zaman bütün projelerinize uygularsiniz