Wer hat Ahnung von Modbus-RTU und Bascom

OP #2569274
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren