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).
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...
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...
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;
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...
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...
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) *)
//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!
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"
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?
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.
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?
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.
Synes godt om
Ny brugerNybegynder
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.