avatar_mustafa

pic ile plc haberleşmesi

Başlatan mustafa, 31 Mart 2013, 04:53:07

mustafa

Merhaba arkadaşlar ;
Acaba daha önce plc ile mikrodenetleyici haberleşmesi yapmış olan varmı aramızda? Örneğin pic den okuduğum sıcaklık gibi herhangi bir veriyi modbus protokolü kullanarak plc ye aktarabilirmiyim ? Yada plc üzerinden pic e sorgu gönderebilirmiyim ?

F®T

"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mustafa

Sayın Ft sana katılıyorum. Ancak bunun için bir yol bulamadım ben. Plc den modbus rtu ile haberleşirken plc yazılımında git şu registerlerden şunları oku deniliyor. Ancak pic kısmında bu registerleri nasıl oluştururum veya ayarlarım merak ettiğim budur.

İyi çalışmalar dilerim.

F®T

#3
Klein hocadan alıntıdır.
40001 registerindeki bilgiynin başlangıç adresi 0 fonksiyonu 03tür, yani PLC'deki  40001 adresindeki verinin adresi aslında 0 dır. başındaki 4000 aslında bir takma isimdir.
00001 0x referanslı adresler : dijital çıkışlar (bit)
10001 1x referanslı adresler : dijital girişler (bit)
30001 3x referanslı adresler : Analog girişler (word)
40001 4x referasnslı adresler analog çıkışlar (word)
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mustafa

Merhabalar ;
Aslında burada modbus protokolünün gereklerini bularak pic e gömmek daha sonrasında ise spı , usart , ı2c gibi haberleşme brimleri ile bağlantı kurmak aslında işi çok kolaylaştırabilir. Tabi modbus protokolü için pic e gömülebilecek hazır bir kod bloğu görmedim daha öncesinde. Rs 232 modülü de bir kaç plc dışında yok sanırım.

F®T

plc lerde genelde rs 232 veya rs485 haberleşme protokolleri standart gibidir.siz ikisindende haberleşebilirsiniz.burda modbus sorgulaması nasıl olur veya cevaplaması nasıl oluru bilirseniz zaten yazılımla olayı çözersiniz.

bu linkte istediğin kod var.

http://www.fultek.com.tr/blog/2012/03/01/pic-modbus-kaynak-kodu/
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mustafa

Bu siteye üye de oldum ancak kodları indiremiyorum. Sanırım bir hata var sitelerinde.

F®T

#7
device 18f452
XTAL = 20
DEFINE LOADER_USED 1
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 TIME 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 'STATION 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 TIME > 5 THEN LOW RS485AKT : TIME = 0 : PIE1.5 = 1
GOTO START
;-------------------------------------------------------------------
;*********************** INTERRUPT *********************************
INT_LOOP: disable
'IF RECEIVE BUFFER NOT EMPTY
if PIE1.5 = 1 then
if PIR1.5 = 1 then
IF TIME > 4 THEN SR_BYTE_CNT = 0
TIME = 0
hserin [RCV_BYTE]
SR_STR[SR_BYTE_CNT] = RCV_BYTE
SR_BYTE_CNT = SR_BYTE_CNT + 1
GOTO CIKIS
endif
endif
'IF OUTPUT BUFFER EMPTY SEND NEXT
if PIE1.4 = 1 then
if PIR1.4 = 1 then
TIME = 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 TIME
if TIME > 6 then
TIME = 0
gosub modbus
ENDIF
endif
CIKIS:
RESUME
ENABLE
;
;******************* MODBUS QUERY ANALYSIS ******************
MODBUS:
IF PIE1.5 = 0 THEN return
IF SR_BYTE_CNT < 8 THEN return
PIE1.5 = 0 'RCV INTERRUPT CLOSE
'RECEIVE COMPLETE
IF SR_STR[0] = IQ_TABLE[1] THEN 'ADRESS CHECK
GOSUB CRC16 'CRC16 CALCULATE
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
'FUNCTION CODE 3-4
IF SR_STR[1] = 3 or SR_STR[1] = 4 THEN
SEND_BYTE_CNT = (((SR_STR[4]*256) + SR_STR[5])* 2) + 5
'REQUEST ADRESS REGISTERS ADRESS CHECK
if START_ADRESS + SEND_BYTE_CNT - 5 > 102 then GOTO REG_ADR
'SEND STRING BUILDING
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
'FUNCTION CODE 6 SINGLE VARIABLE
IF SR_STR[1] = 6 THEN
'REQUEST ADRESS REGISTERS ADRESS CHECK
if START_ADRESS > 100 then GOTO REG_ADR
'VALUE LIMIT CHECK
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
'SEND STRING BUILDING
SEND_BYTE_CNT = 8
GOSUB SEND_CRC16
RETURN
ENDIF
'FUNCTION CODE 16
IF SR_STR[1] = 16 THEN
SEND_BYTE_CNT = SR_STR[6] + 5 'SEND DATA BYTE COUNT
'REQUEST ADRESS REGISTERS ADRESS CHECK
if START_ADRESS + SEND_BYTE_CNT - 5 > 102 then GOTO REG_ADR
'RECEIVE STRING LENGTH CHECK
IF SEND_BYTE_CNT + 4 <> SR_BYTE_CNT then GOTO REG_ADR
FOR V1 = START_ADRESS TO START_ADRESS + SEND_BYTE_CNT - 6
'VALUE LIMIT CHECK
IF V1.0 = 0 THEN 'LIMIT CHECK ONLY FIRST BYTE RUNING
V3 = SR_STR[V1 - START_ADRESS + 7] * 256
V3 = V3 + SR_STR[V1 - START_ADRESS + 8] 'VALUE
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
'SEND STRING BUILDING
SEND_BYTE_CNT = 8
GOSUB SEND_CRC16
RETURN
ENDIF
'INVALID FUNCTION CODE
SEND_BYTE_CNT = 5
SR_STR[2] = 1
GOSUB SEND_CRC16
RETURN
ENDIF
ENDIF
ENDIF
SR_BYTE_CNT = 0
RETURN
'REGISTIRS ADRESS OUT OFF LIMIT
REG_ADR:
SEND_BYTE_CNT = 5
SR_STR[2] = 2
GOSUB SEND_CRC16
return
'VALUE OUT OFF LIMIT
LIMIT_OUT:
SEND_BYTE_CNT = 5
SR_STR[2] = 3
GOSUB SEND_CRC16
RETURN
;
;************************** SEND QUERY BUILDING ****************
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 'SEND INTERRUPT CLOSE
RETURN
;
;************************** CALCULATE CRC-16 *************************
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
;
;************************* VARIABLE SAVE ***************
KAYIT:
IF IQ_TABLE[1] <> EREAD 0 THEN EWrite 0,[IQ_TABLE[1]]
return
;
;################################################# ###############




bu kod fultek_salih  adlı kişiye aittir.kendisinin fultek isimli firması olmasına rağmen bu tip bir kodu paylaşması çoğu insana örnek olacak bir davranıştır.salih kardeşimize bu paylaşımdan dolayı teşekkür ediyoruz.bu çalışan bir koddur.PROTON ile yazılmıştır.plc ile modbus rtu protokolü ile haberleştirilebilir.denediğim bir koddur.
bu kod 38400 baude hızında 8n1 modunda plc ile haberleşir.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F®T

#8
....
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mustafa

Çok teşekkür ederim ben de inşallah en kısa zamanda kodu deneyeceğim.

EMKE

Merhaba arkadaşlar yukarıdaki kodu fultek scada ile kullanabilirmiyiz ? pıc'deki verileri scada programına çekebilrmiyiz .F.T hocam hangi marka plc ile haberleştiniz ve bu kod blogunda start arasına nasıl bir program yazdınız ben hala şu modbus olayını tam olarak kavrayamadım eğer bir sakıncası yoksa programla ilgili kod örneği paylaşabilirmisiniiz .

F®T

#11
Emke ben delta plc ile ve dop ekran ile haberleşmiştim.Gayet güzel haberleşen bir yazılım.Kodun tamamı aşağıdadır kendi programını değişkenlerini yazıp haberleşebilirsin.
Kod ile 8n1 formatında haberleşebilirsin.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Elzemefe

#12
F.T Hocam dop ile PIC16f877 ile  uğraştım bir süre iş  yoğunluğu  yüzünden ara vermek zorunda  kaldım
kod aşağıdadır demişsiniz ama ben göremedim

dopb ttl seviyesinde mi max232 kullanmak gerekiyormu _?

F®T

Aşağıda kod var.Dosya olarak değil tabiki kod eklentisi olarak.Mosbus rtu slave olarak çalışan bir kod.Bu kod ile rs485 ile yada rs232 ile haberleşme olanağı bulunuyor.Ben rs485 üzerinden dop ve plc ile haberleşmiştim.Analog bir veriyi bu kod ile dopa ve plc ye yollamıştım.Tabiki bu koda kendi program eklentinizi oturtmanız gerekiyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

EMKE

F.T hocam fulteğin kodundan bahsediyorsunuz sanırım bu kodu çok inceledim bu kodu yazan kişi fultek firmasından salih bey kodu start bloğuna yazın demiş sizden rica etsem dop ve plc ile haberleştiğiniz program kodunuzdan en azından mantığı anlatıcak kadar yada illa kod olması önemli değil mantığı anlatsanız uygunmudur .

Powered by EzPortal