modbus hakkında

Başlatan canbulut, 21 Haziran 2015, 14:03:11

canbulut

arkadaslar merhaba
sitede pic ile yapılmış modbus çalışan bir code var. picin (pic16f876) istenilen register'e nasıl yazıyor ya da nasıl okuyor (modbus genel olarak inceledim(Adres,FN Kod,Data,CRC gibi) verilen lib'de 3 ve 16. func. işlevini yapabileceğimi anladım). yazarken ya da okurken picin memory map'den sıraylamı gidiyor nasıl yapıyor? ikinci soruda mesela sıcaklık ölçme veya başka işlevi ana rutine eklemek istesem nasıl ekleyebilirim. pbp üzerinden gidiyorum.

F.T

loop ile goto loop arasına programını yazıyorsun.sanırım buffer değikeni ile göndereceğin datayı eşleştirmen gerekiyor.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

canbulut

#2
loop goto loop arasındaki codeların tamamını silip mi yoksa sadece for döngülerinin olduğu yere mi yazacağım? peki adreslemeyi nasıl yapacağız? mesela 01 10 000C 0001 02 000F  CRC ' (CRC 'yi görmezden geliniz.)kodunu göndersem PORTA'nın ilk dört bitini 1 yapmış son 4 bitini 0 yapmış olur muyum? Bu şekilde erişemeyeceğim register yoktur o zaman. tabi doğru anladıysam.


loop
goto loop


[code]loop: 

loop:

'kendi işlerini yap.
'ısıyı ölç.
'ısıyı 20h nolu adrese yaz' yaz ki master oradan bakabilsin. gibi mi?


' Modbus protocol function
	If NewFrame = 1 Then 					 ' Check if new modbus frame is in buffer
        NewFrame = 0	
		Gosub checkMB						 ' Check the modbus frame	
		if MBFrame = 3 then
			Gosub ReadRegResponse			 ' Response for function 3
		else
			if MBFrame = 16 then
				Gosub writeRegResponse		 ' Response for function 16	
			else
				Gosub writeBadRequest 		 ' Response for error
			endif
		endif
      Length = 0
	Endif

Goto loop
[/code]



loop: 

For counter2 = 0 to 5  ' The main program
For counter1 = 0 to 30000  ' Write your code here
next counter1
next counter2
Toggle 1


' Modbus protocol function
	If NewFrame = 1 Then 					 ' Check if new modbus frame is in buffer
        NewFrame = 0	
		Gosub checkMB						 ' Check the modbus frame	
		if MBFrame = 3 then
			Gosub ReadRegResponse			 ' Response for function 3
		else
			if MBFrame = 16 then
				Gosub writeRegResponse		 ' Response for function 16	
			else
				Gosub writeBadRequest 		 ' Response for error
			endif
		endif
      Length = 0
	Endif

Goto loop

F.T

Diğer kısımlar sabit kalacak kodu

For counter2 = 0 to 5  ' The main program
For counter1 = 0 to 30000  ' Write your code here
next counter1
next counter2
Toggle 1

bunların yerine yazacaksın sanırım.Burda bana göre değişkeni nereye yükleyeceği ile ilgili eksiklik var.Sanırım buffer değişkeni ile alakalı olmalı.Ayrıca porta nerden çıktı anlamadım.:))
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

canbulut

portA ya veri yazmak gibi.( pice çıkış vermek içindi.)fakat tabiki herkes değişiklik yapamamalı haliyle...bu tez çürüdü ise o zaman başa dönelim. peki modbus ile pic slave olduğunda veriler nereden alınır nereden okunur.  master yazan başka birisi cihaz ile ilgili bilgisi yok. nereye ne yazacağını nereden okuyacağını nereden bilecek.

F.T

Bu program zaten slave için olan bir program.sen hangi adreste neyi okutacağını zaten bilmek zorundasın.yada yazdıracağını .ona göre masterden slave sorgulaması kim yapacaksa yada slave e emiri kim verecekse bu bilgileri ona vereceksin.:))
bu program ile master, slav e emir yollar ya şu işi yap der sende hangi registerde o emir verildi ise o emre göre port çıkışlarını aktif edersin yada pasif edersin.yada şunu oku bana yolla der sende programdan okur yollarsın vs....
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

canbulut

#6
o zaman aslında verilen program boş bir program yani ham. biz 30000 adet kadar bir şeyler yazabiliriz yada okuyabiliyoruz (tabi yöntemi yapabilirsek. yine şu anda karışık. hocam verileriniz bana verimli :) fakat birde örnek bulup ta inceleyebilirsem daha anlaşılır olacağına inanıyorum.

canbulut

Alıntı yapılan: F.T - 21 Haziran 2015, 20:30:08
Bu program zaten slave için olan bir program.sen hangi adreste neyi okutacağını zaten bilmek zorundasın.yada yazdıracağını .ona göre masterden slave sorgulaması kim yapacaksa yada slave e emiri kim verecekse bu bilgileri ona vereceksin.:))
bu program ile master, slav e emir yollar ya şu işi yap der sende hangi registerde o emir verildi ise o emre göre port çıkışlarını aktif edersin yada pasif edersin.yada şunu oku bana yolla der sende programdan okur yollarsın vs....
hocam bu kodların içinde bazı yerlerde buffer*255 gibi çarpmış bir sonraki buffer ile toplamış bunu neden yapmış?

rck8942

Modbus ta En fazla 255 Slave icin olmasi lazim.
Elektroniker für Betriebstechnik