Entwickler-Ecke

Windows API - SIEMENS SITOP USV über USB


Jens Jung - Do 05.03.09 09:45
Titel: SIEMENS SITOP USV über USB
Hallo zusammen,

erstmal zu meinem Hintergrund.
Ich bin ins Delphi programieren sozusagen reingeworfen worden. Ich hatte einen einwöchigen Grundkurs, und den Rest musste ich mir in den letzten Jahren selbst beibringen.
Das genügt zwar für unsere Anwendungen, aber leider fehlt mir fast jede Kenntnis über die WIndows API, Pointer, Handles usw.

Jetzt zu meinem Problem.
Wir haben eine Siemens SITOP USV mit USB, welche ich jetzt aus Delphi 6 heraus abfragen soll, bzw. das Abschaltsignal schicken muss.
Die USV verwendet einen FTDI-Treiber und ich hatte bisher die besten Erfolge mit der D2XXUnit, d.h. ich konnte schon mal die Verbindung mit Open_USB_Device_By_Device_Description('SITOP DC-USV 6') öffnen. Zumindes bekomme ich ein FT_OK zurück.
Aber das Auslesen und das Senden krieg ich einfach nicht hin.

Ich habe auch versucht die USV als COM-Port anzusprechen. Komischer Weise sehe ich mit dem Hyperterminal was die USV sendet, kann aber im Delphi nichts empfangen oder senden.

Hat jemand Erfahrung mit der SITOP oder etwas ähnlichem und kann mir helfen? Siemens weigert sich nämlich strikt auch nur ein bischen brauchbaren Source zu verfügung zu stellen, obwohl deren App auch in Delphi erstellt wurde.

Vielen Dank schon mal.

Jens


Nersgatt - Do 05.03.09 10:47

Moin Namensvetter,

Zeig mal ein bisschen Sourcecode.

Meiner Erfahung (mit Scanner, Meterzählern oder Waagen) nach hat man schon fast gewonnen, wenn man das gewüschte Verhalten des Gerätes im Hyperterminal simulieren kann. Was das Hyperterminal kann, kann man mit Delphi schon lange. Der Rest ist Fleißarbeit.

Gruß,
Jens


Jens Jung - Do 05.03.09 12:19

Hallo Jens,

hier meine bisherigen Versuche.
Mit D2XXUnit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
procedure TForm1.Button1Click(Sender: TObject);
var
  z:Cardinal;
  st :string;
begin
  z:=Open_USB_Device_By_Device_Description('SITOP DC-USV 6');
  if z=ft_ok then
    Memo1.Lines.Add('OK');                   //Funktioniert soweit
  Set_USB_Device_TimeOuts(2000,2000);
  st:='R';
  FT_Out_Buffer[0]:=Byte(st[1]);
  Write_USB_Device_Buffer(Length(st));       //USV bleibt an :-(
  Close_USB_Device;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  z:Cardinal;
  st :string;
  i:integer;
begin
  z:=Open_USB_Device_By_Device_Description('SITOP DC-USV 6');
  if z=ft_ok then
    Memo1.Lines.Add('OK');                 //Funktioniert
  Set_USB_Device_TimeOuts(2000,2000);
  Freceivetext:='';
  if Get_USB_Device_Status=FT_Event_RXCHAR then
    Memo1.Lines.Add('READ');               // Kein Read event
  N:=Read_USB_Device_Buffer(84);           // und auch keine Zeichen empfangen (läuft in Timeout)
  for i:=1 to N do
  begin
    Freceivetext:=Freceivetext+intToHex(FT_In_Buffer[i-1],2);
  end;
  memo1.Lines.Add(Freceivetext);
  Close_USB_Device;
end;


Und seriell:

procedure TForm1.Button3Click(Sender: TObject);
var
  sLine:string;
begin
  ComPort1.Connected:=True;
//  ComPort1.ClearBuffer(True,True);
//  sleep(1000);
  ComPort1.ReadStr(sLine,20);           //kommt nur '' zurück
  ComPort1.Connected:=False;            //Hyperterminal zeigt die Strings an
  if sLine<>'' then
    Memo1.Lines.Add(sLine);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ComPort1.Connected:=True;
  ComPort1.WriteStr('R');
  ComPort1.Connected:=False;            //Auch hier bleibt die USV an
end;

Ich versteh es genauso wenig, dass Hyperterminal das lesen kann, aber ich (Delphi) nicht.

Jens

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Xentar - Do 05.03.09 12:23

user profile iconJens Jung hat folgendes geschrieben Zum zitierten Posting springen:
Ich versteh es genauso wenig, dass Hyperterminal das lesen kann, aber ich (Delphi) nicht.

Liegt evtl. an falschen Einstellungen? Baudrate, Stopbits, Parität, usw.


Nersgatt - Do 05.03.09 12:58

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJens Jung hat folgendes geschrieben Zum zitierten Posting springen:
Ich versteh es genauso wenig, dass Hyperterminal das lesen kann, aber ich (Delphi) nicht.

Liegt evtl. an falschen Einstellungen? Baudrate, Stopbits, Parität, usw.

Ist auch mein Tipp. Das böse an diesen Einstellung ist, dass man keine Fehlermeldung zurück bekommt, wenn die Einstellungen nicht passen, sondern dass einfach nicht ankommt.

[Edit]:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button3Click(Sender: TObject);
var
  sLine:string;
begin
  ComPort1.Connected:=True;
//  ComPort1.ClearBuffer(True,True);
//  sleep(1000);
  ComPort1.ReadStr(sLine,20);           //kommt nur '' zurück
  ComPort1.Connected:=False;            //Hyperterminal zeigt die Strings an
  if sLine<>'' then
    Memo1.Lines.Add(sLine);
end;


Sendet das Gerät dauerhaft die Daten, oder musst Du erst mit einem Befehl die Daten anfordern? Setz mal das "ComPort1.Connected := True" an eine andere Stelle, z.b. im FormShow und frage mit einem Timer (vielleicht alle 200ms) die Daten vom Com-Port ab.

Gruß,
Jens


Jens Jung - Do 05.03.09 13:31

Hallo Xentar,

nee, mit serieller Kommunikation hab ich öfters zu tun und 8,N,1,9600 sind ja schon fast überall Standardeinstellungen.

Trotzdem Danke.

An Jens,

das mit dem Timer hab ich auch schon probiert, aber da kommt nix.
Beim Hyperterminal muss ich nur die Verbindung öffnen, und schon rattern die Daten los...