Avatar billede friiiiis Novice
14. juni 2009 - 15:16 Der er 17 kommentarer og
1 løsning

RS485 - MODBUS protokol & delphi - Der er rødvin i det hvis I kan hjælpe

Hej!

Jeg skal til at etablere kontakt til en enhed via RS485 og skal benytte MODBUS protokollen.

Enheden benytter RS485 samt åben protokol og understøtter MODBUS.

Mit problem er følgende:

I beskrivelse af protokollen står følgende:

===========================================================
===========================================================

This function is used to read the contents of a contiguous block of holding registers (word). The Request
frame specifies the starting register address and the number of registers to be read. It is possible to
read maximum 11 registers (words) with a single request, when not differently specified.
The register data in the response message are packed as two bytes per register (word), with the binary
contents right justified within each byte. For each register, the first byte contains the high order bits
(MSB) and the second contains the low order bits (LSB).

Description                        Length
==========================================
Physical Address                  1 byte
Function Code                      1 byte
Starting Address                  2 bytes
Quantity of registers (N word)    2 bytes
CRC                                2 bytes


===========================================================
===========================================================

Mit spøgrsmål er nu:

Hvordan "laver" jeg den streng eller det array af word karakterer der skal sendes til COM porten for at få enheden til at svare mig tilbage?

Jeg ved godt hvad de enkelte bytes skal være og jeg ved hvordan jeg regner CRC ud (Checksum, CRC 16, Cyclic Redundancy Check) men jeg kan ikke finde ud af at koble de enkelte bytes sammen til en streng som jeg så sender til enheden...

Jeg har kommunikations software så jeg ved at jeg kan kommunikerer mellem PC og enheden - det er bare kodningen af den streng jeg skal sende der volder mig problemer...

Kan du/I hjælpe?
Avatar billede js_delphi Nybegynder
14. juni 2009 - 18:19 #1
Jeg har lavet et par programmer, som kommunikerer med PLC styringer via modbus RTU (serielt og TCP).

Til formaalet koebte jeg en Modbus driver her:
http://www.modbusdriver.com/shop/index.php?cPath=46

Det koerer stabilt, og jeg skulle ikke selv stykke noget som helst sammen, som havde med kommunikationen at goere.

De faerdige funktioner skal bare kaldes, de relevante parametre (startadresse, datatype osv.) overgives, og saa spiller det.

Jeg er klar over, at det ikke var det, du spurgte om, men maaske hjaelper det alligevel.


Vh.
Avatar billede friiiiis Novice
14. juni 2009 - 21:34 #2
Hej,

jo og det lyder fint - syn's bare 300$ er dyrt... men ok, ikke bare mange timer man skal arbejde for at modbusdriver kan betale sig...

ANYWAY - jeg har selv noget software som kan kommunikere med enheden - jeg vil bage gerne lærer hvordan - altså stykke de der bytes sammen til at array of bytes/word som sendes som en streng osv...
Avatar billede kroning Nybegynder
14. juni 2009 - 23:07 #3
Den kode du bruger til at sende med kan den kun sende strenge (string) ?
De fleste komponenter (hvis det er det du bruger) har også en funktion til at sende en buffer, f.eks:

var
    Buffer : array[0..7] of byte;
begin
    Buffer[0]:=11;
  Buffer[1]:=22;
    Buffer[2]:=33;
  osv.

  Ting.SendBuffer(Buffer,8); //8=antal bytes der sendes
end;
Avatar billede friiiiis Novice
15. juni 2009 - 17:55 #4
>>> js_delphi:

Jo, tak, jeg vil prøve at benytte modbusdriver.com og se om jeg kan få kontakt med enheden...

Kan jeg evt. få din direkte email adresse så jeg kan kontakte dig direkte og spørge om hjælp?

Jeg kan tilgengæld tilbyde et par flasker rødvin/chokolade fra InterFlora hvis det har interesse...??

>>> Kroning: Det er lidt mere kompliceret end det du har skrevet op - lang historie, noget med hexadecimaler koblet sammen med bytes osv - man skal have styr på både delphi programmering samt det lidt mere måletekniske...
Avatar billede js_delphi Nybegynder
15. juni 2009 - 20:04 #5
Hvis du skriver en mailadresse, som du kan kontaktes paa, kan jeg svare dig tilbage. Jeg vil noedig oplyse min adresse herinde.
Avatar billede kroning Nybegynder
15. juni 2009 - 20:20 #6
Så kompliceret er det sikkert ikke, det er nok blot et spørgsmål om at forstå hvad de skriver.
Avatar billede friiiiis Novice
15. juni 2009 - 21:50 #7
>> js-Delphi

hhf _>at<_aa fiberline.com kan du kontakte mig på...

Fjern _><_aa samt mellemrum og så skulle den være der...

>>> Kroning, Ja, lige præcist - det er altså ikke helt ligetil men jeg er heller ikke styringstekniker, el-ingeniør, elektriker eller lignende, så det er godt nok lidt russisk...
Avatar billede friiiiis Novice
16. juni 2009 - 16:35 #8
Flere oplysninger: Enheden understøtter:

MODBUS RTU
1 start bit, 8 data bit, ingen paritet,1 stopp bit
Bithastighet 4800, 9600 bit/s
2 tråds tilslutning
Avatar billede js_delphi Nybegynder
16. juni 2009 - 18:57 #9
libmbusmaster.dll filen fra Fieldtalk laegger du i samme mappe som dit program.

//Tilfoej protokollen til uses:
uses
  MbusRtuMasterProtocol, BusProtocolExceptions...

(*Deklarer en global instans af protokollen, og f.eks. et array til at holde de data, du vil hente og skrive fra/til din enhed*)
var
  mbusProtocolSerial: TMbusRtuMasterProtocol;
  arrVaerdier: array[1..50] of single;
(*Dette array skal svare til et array i din Modbus slave i stoerrelse og type (single = float) *)

//Instansier og aaben protokollen:
begin
  mbusProtocolSerial := TMbusRtuMasterProtocol.Create(nil);
  mbusProtocolSerial.portName := 'COM1';
  mbusProtocolSerial.baudRate := 9600;
  mbusProtocolSerial.dataBits := 8;
  mbusProtocolSerial.stopBits := 1;
  mbusProtocolSerial.parity := 0;
  mbusProtocolSerial.openProtocol;
end;
 
//Laes arrayet fra din enhed:
mbusProtocolSerial.readMultipleFloats(1, 16384, arrVaerdier);
//1 er din slaves modbusadresse. (kontroller at dette er rigtig)
//16384 (4000 hex) er startadressen paa dit array i slaven (dette array skal selvfoelgelig ligge i modbusomraadet)
//(kontroller at dette er rigtig).

//Luk, naar du en gang er faerdig:
mbusProtocolSerial.CloseProtocol;
mbusProtocolSerial.Destroy;

Fejlhaandtering kan vi tage, naar du har faaet ovenstaaende op at koere.
Dette var lige en hurtig oversigt. Skriv endelig igen, hvis ikke det spiller!

Vh.
js_delphi
Avatar billede friiiiis Novice
16. juni 2009 - 22:41 #10
Store himmelske rorgænger, Du, Vort lysende Forbillede, Vor Helt, Vor Overhoved, Tekniliteternes Mester, ModBus's Herre, Vor Chefers Chef, De Serielle Portes Overkommandør, Vor Helt....

Ja, skriver bare lige for at sige at jeg har fået kontakt til enheden og prøver så - lidt specielt, indrømmet - at sige at det er jeg ret glad for, he, he..

Hvis jeg slukker for enheden eller angiver den forkerte adresse, så lukker Fieldtalk med en fejl = så må der være forbindelse...

ANYWAY - jeg mangler stadigvæk at få de rigtige tal hentet ud fra enheden, så jeg vil nok bliver ved med at skrive til dig - Jeg har specielt brug for at du nok lige skal se MODBUS protokollen for RS485 enheden og lige fortælle mig hvordan jeg skal opsætte det der "arrvaerdier[1..50] of single"

Tak for hjælpen ind til videre...
Avatar billede friiiiis Novice
16. juni 2009 - 23:04 #11
hmmm...

Jeg bruger eksemplet om følger med fieldtalk og ikke dit... Hvis jeg bruger dit med:

arrVaerdier : array[0..50] of single; // (deklareret i VAR)
mbusProtocol.readMultipleFloats(2, 16384, arrVaerdier);

får jeg fejlen:

Illegal Data Value exception response

hmm.. vi kan lige snakkes ved i morgen...
Avatar billede friiiiis Novice
16. juni 2009 - 23:09 #12
2 spørgsmål:


1) Hvordan skriver jeg til enheden og fortæller at jeg gerne vil have en bestemt værdi? jf. MODBUS protokollen f.eks. "KWH" på fase L1?

Kan se i MODBUS protokollen at det er "Modicom address 300071" = "physical adress = 0046h", length words = 2 og data format = INIT32 (står på side 8 i tabellen...) ... men hvordan fortæller jeg det til Fieldtalk?

2) Hvordan beregner Fieldtalk CRC eller checksum= Bare automatisk og det behøver jeg ikke bekymre mig om?
Avatar billede js_delphi Nybegynder
19. juni 2009 - 14:27 #13
Af en eller anden grund har jeg ikke faaet nogen mail om nye poster i denne traad, derfor det sene svar.

Hvad er det for en enhed, du vil kommunikere med?

Modbus kommunikerer med et bestemt adresseomraade i din enhed.
Du skal soerge for at laegge dine data i dette omraade.
Hvilket adresseomraade, det drejer sig om, kan du se i dokumentationen for din enhed.

Fra Fieldtalks side skal du ikke bekymre dig om checksum.

Fieldtalk kommer altid med en exception, naar et eller andet ikke har fungeret, som det skal.
Disse exceptions skal man opfange, og udlede noget fornuftigt af, men det kan du goere senere hen.
Avatar billede friiiiis Novice
19. juni 2009 - 17:55 #14
js_delphi: lige nu snakker jeg med en Martin Lind via email - Er det dig?

Jeg har nemlig sendt dokumentation omkring RS485 kommunikationen - dvs. MODBUS protokollen - til ham Martin Lind...

Det jeg er ti tvivl om er følgende;

"Modicom address 300071" = "physical adress = 0046h", length words = 2 og data format = INIT32 (står på side 8 i tabellen...) ... men hvordan fortæller jeg det til Fieldtalk?
Avatar billede js_delphi Nybegynder
22. juni 2009 - 08:14 #15
Jeg er js_delphi, men Martin Lind findes ogsaa herinde paa Eksperten.
Avatar billede friiiiis Novice
22. juni 2009 - 12:27 #16
Hej,

Som jeg skriver heroven for så kan du kontakte mig på følgende email:

hhf _>at<_aa fiberline.com kan du kontakte mig på...

Fjern _><_aa samt mellemrum og så skulle den være der...

Jeg har snakket med Martin Lind ang. det her RS485 kommunikation og jeg har fået det til at virke via Fieldtalk...

Jeg kan lægge koden herud hvis du vil se det...
Avatar billede friiiiis Novice
03. maj 2011 - 17:49 #17
lukker
Avatar billede Per Jensen Praktikant
19. april 2018 - 09:29 #18
Hej!

Hvis du stadig er i tvivl eller folk i tråden fortsat søger hjælp, så kontakt eventuelt www.danbit.dk - de kan varmt anbefales når det kommer til RS485.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester