Forum: Mikrocontroller und Digitale Elektronik Wer hat Ahnung von Modbus-RTU und Bascom


von G. S. (sani2012)


Lesenswert?

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
Noch kein Account? Hier anmelden.