Hallo, ich benötige Hilfe bei einem programmier Problem. Ich nutze eine MyAVR Board LPT mit einem Atmel Mega8 Mikrokontroller und einen Omega CB7500 PID-Regler als Hardware, ich verwende AVR-BASCOM als Programmierumgebung und bin auf das Modbus-RTU Protokoll festgenagelt. Nun zu meinem Problem : Ich wollte mit dem Mega8 Mikrokontroller einen Prozess steuern und dafür muss ich aus dem PID-Regler regelmäßig die Temperatur auslesen und ich muss eine soll Temperatur, über den Mikrokontroller, vorgeben können. Als Kommunikationsprotokoll nutzt der PID-Regler das Modbus-RTU Protokoll, diesen wollte ich über die RS232-Schnittstelle auf den MyAVR Board ansprechen. Bis jetzt habe ich die Parameter des PID-Reglers für das auslesen, und das vorgeben der Temperatur im Modbus-RTU Protokoll mit dem Programm HTerm ermittelt. Ich komme bei der Umsetzung der Auslese-Prozedur in einem Bascom-Programm einfach nicht weiter. Die Vorgabe einer soll Temperatur per Mikrokontroller konnte ich umsetzten. Modbus-RTU Code für das auslesen der Ist-Temperatur : 01 03 10 00 00 01 80 CA Byte 1 Slave ID (01) 2 Function Code (03) read 3 } Fist Register Adresse 4 } bestehend aus 2 Byte (1000h oder 4096d) 5 ] Number of Register 6 ] bestehend aus 2 Byte (0001h oder 0001d) 7 ) Cyclic Redundancy Check 8 ) bestehend aus 16 Bit (2 Byte) Mein Test-Programm für die Modbus-RTU Befehle: $regfile = "m8def.dat" ' specify the used micro $crystal = 3686400 $baud = 9600 ' use baud rate $hwstack = 42 ' default use 42 for the hardware stack $swstack = 40 ' default use 40 for the SW stack $framesize = 40 ' default use 40 for the frame space $lib "modbus.lbx" ' specify the additional library 'The circuit from the help is used. ' TX RX ' COM0 PD.1 PD.0 rs232 used for debugging 'configure the first UART for RS232 Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 'use OPEN/CLOSE for using the second UART Open "COM1:" For Binary As #1 'dimension some variables Dim Lcd_line As Word Dim Ref_temp As Word Ref_temp = &H28F 'assign a value 655 = 65,5 °C Do Waitms 2000 ' delay ' Send one of the following three messages ' Print #1 , Makemodbus(1 , 3 , 4096 , 2); ' slave 1, function 3, start address 4096, 2 bytes ' Print #1 , Makemodbus(1 , 3 , 4097 , 2); ' slave 1, function 3, start address 4097, 2 bytes Print #1 , Makemodbus(1 , 6 , 4097 , Ref_temp); ' slave 1, function 6, address 4097, value of Ref_temp ' End If If Ischarwaiting(#1) <> 0 Then 'was something returned? Lcd_line = Waitkey(#1) 'then get it 'Print Hex(b) ; ","; 'print the info End If Loop End Habe mehr oder weniger das Beispielprogramm zum Thema „Makemodbus“ aus der AVR-Bascom Hilfe genommen und angepasst. Was genau gibt Makemodbus in der read Funktion zurück? Nur den Wert der angesprochenen Speicheradresse, oder den kompletten RTU-Code bestehend aus Slave-ID., Funktion-Code, länge des Datenantworts, Wert der Speicheradresse, und CRC? Zur meiner Person, es ist mein erster Kontakt mit dem Modbus-Protokoll und AVR-Bascom. Ich bin jetzt nicht gerade das was man einen Programmier-Crack nennt. Wäre für jede Hilfe / Anregung dankbar. Gruß Gregor
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.