Avatar billede js_delphi Nybegynder
11. juli 2006 - 10:18 Der er 20 kommentarer og
1 løsning

Kommunikation med måleinstrument.

God morgen!

Jeg vil have lavet et simpelt Delphi program, som via RS232 kan kommunikere med et Mitutoyo ID-C1025B måleur.

Mellem måleuret og PC'ens COM port er et lille interface forbundet, da måleuret ikke direkte kan kommunikere med RS232.
Dette interface er ligeledes fra Mitutoyo og hedder DMX 1F.

Det er noget med at en ASCII-streng skal sendes til måleuret, som så sender en ASCII-streng tilbage med den aktuelt målte værdi.

Simpel dokumentation på mäleuret og på interfacet har jeg liggende.

Er der nogen, som har erfaring med sådanne opgaver, og som har tid og lyst til at skrive et lille program?
Mit formål er egentlig kun at lære, hvordan en sådan kommunikation sættes op, så derfor vil der blive brug for en del forklaringer..

Hvis det bliver kompliceret, kan jeg da godt give en sjat penge for det.
Avatar billede martinlind Nybegynder
11. juli 2006 - 13:15 #1
du kan sende en mail til mig på :" m a r t i n .at. e - l i n d . dk "

Jeg vil gerne ungå at den blivr snuppet til spam, så pil mellemrum væk og lav .at. om til @ så skulle du få min adr.
Avatar billede js_delphi Nybegynder
11. juli 2006 - 15:46 #2
Mail er sendt!
Avatar billede js_delphi Nybegynder
18. juli 2006 - 08:37 #3
martinlind har ikke tid i øjeblikket, er der andre, som kan finde ud af ovenstående?
Avatar billede kroning Nybegynder
18. juli 2006 - 12:35 #4
Send en mail til mig, post at kroning punktum dk
Avatar billede kroning Nybegynder
18. juli 2006 - 15:54 #5
Det var jo ganske enkelt, indtil nu :), der skal sendes '1'+CR til porten og så burde der komme nogle måle resultater tilbage. Jeg bruger en TMS Async32 komponent til RS232 kommunikation. Her er hele koden, jeg har også sendt det hele til dig via. mail men nu kommer det også her hvis andre har lyst til at kikke på det.

----------------------------------------

unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, VaClasses, VaComm, Buttons, Spin;

type
  TMainForm = class(TForm)
    Label1: TLabel;
    EditPort: TSpinEdit;
    BtnGo: TBitBtn;
    Memo: TMemo;
    Label2: TLabel;
    VaComm: TVaComm;
    procedure EditPortChange(Sender: TObject);
    procedure BtnGoClick(Sender: TObject);
    procedure VaCommRxChar(Sender: TObject; Count: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.EditPortChange(Sender: TObject);
begin
    VaComm.Close;
end;

procedure TMainForm.BtnGoClick(Sender: TObject);
begin
    if not VaComm.Active then
  begin
      VaComm.PortNum:=EditPort.Value;
      VaComm.Open;
  end;

    VaComm.WriteText('1'#13);
end;

procedure TMainForm.VaCommRxChar(Sender: TObject; Count: Integer);
var
    ch    : char;
begin
    while VaComm.ReadChar(ch) do
      Memo.Text:=Memo.Text+ch;
end;

end.
Avatar billede kroning Nybegynder
18. juli 2006 - 16:06 #6
Mht. TMS Async32 komponenten til RS232 kommunikation, man kunne jo godt lave port koden selv men hvorfor det når der nu findes masser af gratis RS232 komponenter som virker ganske fint.
Avatar billede kroning Nybegynder
18. juli 2006 - 22:31 #7
RTS og DTR skal være on da disse giver strøm til DMX 1F´en, dette kræver kun en mindre ændring i BtnOnClick proceduren, jeg har sendt det hele til dig på mail også:

procedure TMainForm.BtnGoClick(Sender: TObject);
begin
    if not VaComm.Active then
  begin
      VaComm.PortNum:=EditPort.Value;
      VaComm.Open;
    VaComm.SetDTR(true);
    VaComm.SetRTS(true);
  end;

    VaComm.WriteText('1'#13);
end;
Avatar billede js_delphi Nybegynder
19. juli 2006 - 08:32 #8
Det virker super.
Som du ved fra mine mails har jeg lige installeret Delphi 2006, og skal nu til at compilere koden selv.

Sä gär det lös:
kan du beskrive trin for trin, hvordan jeg installerer komponenten Async32, da jeg aldrig har installeret en komponent :)

Jeg har downloadet Async32 til Delphi 2006 fra www.tmssoftware.com.
Avatar billede kroning Nybegynder
19. juli 2006 - 09:48 #9
Jeg har ikke D2006 og kan derfor ikke sige så meget om det, men jeg kan se at der blot er en exe fil med til Async32 komponenten til D2006 så jeg vil da gætte på at den bare skal køres og så finder den selv ud af og installere sig.
Avatar billede js_delphi Nybegynder
19. juli 2006 - 10:31 #10
Jeps, jeg sidder lige og arbejder pä det.
Hjälpen i D2006 ser ud til at beskrive det ret godt.
Undskyld jeg lige var lidt hurtig med at spörge...
Avatar billede js_delphi Nybegynder
19. juli 2006 - 13:23 #11
Nu har jeg installeret komponenten, og det virker fint.

1:
Hvordan har du egentlig fundet ud af hvilke kommandoer man skal skrive for at sende/modtage data med denne komponent?
Jeg har kigget lidt pä demoerne, man kan hente fra TMS' hjemmeside, men der fär man jo ikke en komplet beskrivelse af komponenten.

2:
Bliver fölgende procedure kört for hvert tegn der modtages pä porten?:

procedure TMainForm.VaCommRxChar(Sender: TObject; Count: Integer);

For mig ser det ud som om den bliver kört 2 gange när dataene fra mäleuret modtages, selvom strengen fra mäleuret altid er 12 tegn lang (og afsluttes med carriage return).

I sidste ende skal jeg nemlig sätte en bool variabel til true, nar alle 12 tegn er modtaget. Denne variabel er sä tegn pä at mäleuret er färdig med at sende.

Alternativt kan jeg vel sätte denne variabel true sä snart tegnet carriage return kommer?

3:
Hvad er i övrigt carriage return? Er det det samme som "enter"?
Avatar billede kroning Nybegynder
19. juli 2006 - 14:09 #12
Nu har jeg brugt Async32 i flere år men jeg mener bare at jeg forsøgte mig frem, som jeg så ofte gør :), når man trykker VaComm og så . så kommer der jo en liste over alle funktioner og variabler som man kan benytte.

Man kan ikke være sikker på at TMainForm.VaCommRxChar kun bliver kaldt en gang, det kommer vist lidt an på hvornår og hvor hurtig tegene modtages, men som du selv er inde på så skal man kikke på hvornår CR tegnet modtages. Den måde jeg plejer at gøre det på er at bruge en global variable som jeg så opdatere hver gang TMainForm.VaCommRxChar kaldes og efter hver kald checker jeg så for om CR tegnet er modtaget.

Dvs.
var
ModtagetText : string; // en global
.
.
procedure TMainForm.VaCommRxChar(Sender: TObject; Count: Integer);
begin
  while VaComm.ReadChar(ch) do
  begin
      ModtagetText:=ModtagetText+ch;
      if ch=#13 then
      begin
        GørNoget(ModtagetText);
        // sæt evt. en bool=true
        ModtagetText:='';
      end;
  end;
end;

Således sikre du også at det virker selvom der bliver sendt 2 målinger lige efter hinanden.

Carrige return er det samme som enter og har værdien 13 dvs. #13 når den skal sendes som tekst.
Avatar billede js_delphi Nybegynder
19. juli 2006 - 14:23 #13
Men kan man sä väre sikker pä at Char-variablen ch altid kun indeholder et tegn ad gangen, eller hvordan fungerer det? Jeg er ikke helt med der.
Avatar billede kroning Nybegynder
19. juli 2006 - 14:40 #14
Ja ch er af typen char og proceduren VaComm.ReadChar() returnere kun et enkelt tegn i variablen, desuden er retur værdien af VaComm.ReadChar() så true hvis der returneres et tegn og false hvis der ikke er flere tegn at modtage.
Avatar billede kroning Nybegynder
19. juli 2006 - 14:46 #15
Glemte at nævne at du kan være sikker på at du kun får et tegn i ch da typen char kun kan indeholde et enkelt tegn.
Avatar billede kroning Nybegynder
19. juli 2006 - 18:05 #16
Kom lige til at se at hvis du henter versionen til D7 og pakker ud, så er der en lille hjælpe fil med som har en kort beskrivelse af alle funktioner.
Avatar billede js_delphi Nybegynder
19. juli 2006 - 18:07 #17
Sååå, nu begynder det at ligne noget.

Dataene jeg fär fra mäleuret ser f.eks. sädan ud:

01A+00099.21

Det fjerde tegn er fortegnet, og tegn 8-12 er selve den mälte värdi.

Jeg har med fölgende kode forsögt at plukke mölingen ud af strengen:

var
a,b,c: string;
...
...
...
a := copy(ModtagetText,4,1);
b := copy(ModtagetText,8,5);
c := strcat(a, b);       
//Her brokker den sig over inkompatible typer: 'string' und 'PAnsiChar'

Der kan man vel ikke göre särlig meget forkert.
Hvad er den af...?
Avatar billede kroning Nybegynder
19. juli 2006 - 18:20 #18
var
a : string;
.
.
a:=copy(ModtagetText,4,1)+copy(ModtagetText,8,5);

--------------
strcat er en function beregnet til null termineret strenge hvilket ikke er hvad der er brug for her, du har måske programeret i C eller lign. tidligere?
Avatar billede js_delphi Nybegynder
21. juli 2006 - 12:15 #19
Jeg er i gang med at läre C++.. Skriver dog i Delphi, da det gär hurtigere, og for mig ikke har nogen begränsninger i forhold til C++.

Ang. funktionen strcat:
da det ikke fungerede, sögte jeg en del pä Eksperten (kategori Delphi vel at märke) for at se, hvordan andre brugte denne funktion. De brugte den angiveligt ligesom jeg har beskrevet. Hvordan det sä har fungeret, ved jeg ikke.

Et afsluttende spörgsmäl:
hvis ikke man lukker en port korrekt, när programmet afsluttes (ved f.eks. et crash), bliver porten sä först frigivet ved en genstart af computeren, eller hvordan fungerer det i almindelighed?

Läg det som et svar, jeg tror jeg er ved at fatte det.

Mange tak for hjälpen!
Avatar billede martinlind Nybegynder
21. juli 2006 - 13:29 #20
lige en lille bemærkning, det er mange år siden Pacal ikke kunne måle sig med C++, såvel som C#, det er ren religion om du bruger den ene eller anden compiler !!

og i Delphi lægger du strenge sammen med + istedet for strcat og hvad de ellers hedder alle sammen. og i delphi kan du Casre en String til en PChar direkte hvis du skulle få brug for det. StrCat(PChar(MyString1),PChar(MyString2));
Avatar billede kroning Nybegynder
21. juli 2006 - 14:33 #21
Jeg har prøvet at lukke et program brutalt via processer, RS232 porten som programmet brugte blev frigivet uden problemer. Om en port kan blive låst hvis et program crasher og man så lukker det via processer kan jeg ikke svare på, men hvis du laver dit program godt nok så crasher det jo ikke ;-)
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

IT-JOB

LINK Mobility

Support Specialist

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger AI forretningskonsulent i Ballerup

Capgemini Danmark A/S

IGNITE Graduate Program 2026

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation