Entwickler-Ecke

Windows API - CPU, mainboard und Festplatten temperatur


mke - Mi 13.04.05 17:09
Titel: CPU, mainboard und Festplatten temperatur
Hallo Leute,
könntet ihr mir sagen wie mann die cpu, mainboard und festplatten temperatur mit einbauen kann?

/mke


Gausi - Mi 13.04.05 18:40

Nein, kann ich leider nicht.

Aber das ist auch von Board zu Board verschieden. D.h. du müsstest bei den einzelnen Herstellern nachfragen, wie du an die Daten der Temperatursensoren drankommst. Dürfte relativ aufwendig werden.

btw.: frau darf das auch, oder? :lol:


noname40 - Fr 06.05.05 18:31

Hi,

die CPU Temp, etc. mit einzubauen ist eigentlich gar nicht so schwer.

Ich habe ein ASUS Mainboard und auf meiner HDD ist Asus PC´Probe installiert welches auch unter http://www.asuscom.de zu downloaden steht.

In dem Verzeichnis liegen einige DLL´s für verschiedene MB und Chipsätze und unter anderem die ASUS.DLL.

Mit dem Dependency Walker kann man sehen welche Funktionen exportiert werden:

DMI_GetBIOSDate
DMI_GetBIOSVender
DMI_GetBIOSVersion
DMI_GetCPUFamily
DMI_GetCPUID
DMI_GetCPUInfo
DMI_GetCPUVendor
DMI_GetCPUVersion
DMI_GetCPUVoltage
DMI_GetMBClock
DMI_GetMBManufacturer
DMI_GetMBProduct
DMI_GetMBSerial
DMI_GetMBSocket
DMI_GetMBVersion
DMI_IsASUSMB
DMI_IsDMI20BIOS
DMI_IsNoteBook
GetCPUName
GetCPUNominal
GetCPUOffset
GetCPUOS
GetCPUTemperature
GetCPUTemperature2
GetCPUVCore
GetFanChasis2RPM
GetFanChasisRPM
GetFanCPURPM
GetFanPowerRPM
GetMBTemperature
GetVoltIN0
GetVoltIN1
GetVoltIN2
GetVoltIN3
GetVoltIN4
GetVoltIN5
GetVoltIN6
SetCPUFan
SmbReadByte
SmbReadWord
SmbWriteByte
SmbWriteWord
TheCPUIsUnknown
WriteCPUInfoIntoRegistry

Somit muss man in seinem Source nur folgende Zeilen einfügen:

interface
...
function GetCPUTemperature: Cardinal; external 'ASUS.DLL';
...
implementation
...
... := GetCPUTemperature;

________________
.oooO NN40 Oooo.


Delete - Fr 06.05.05 20:13

user profile iconnoname40 hat folgendes geschrieben:

Somit muss man in seinem Source nur folgende Zeilen einfügen:

interface
...
function GetCPUTemperature: Cardinal; external 'ASUS.DLL';
...
implementation
...
... := GetCPUTemperature;

Interessant. Selber schon probiert? Woher weißt du, dass die Temperatur nicht im var Paramter steht und die Funktion True oder False zurückgibt? Wie sieht es beim nächten Modell des Mainboards aus? Was wenn dort die Funktion geändert wurde? Und wie viele DLLs für wie viele Mainboards willst du mitliefern?


themaddin - Fr 07.10.05 23:08

hehe, ASUS rockt. :lol: Das mit der DLL funktioniert, falls es noch jemanden interessiert.
hier der Code:

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:
unit MBCUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

   function GetCPUTemperature: Cardinal; external 'ASUS.DLL';
   function GetMBTemperature: Cardinal; external 'ASUS.DLL';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text := FloattoSTr(GetCPUTemperature);
edit2.Text := FloattoStr(GetMBTemperature);
end;

end.


Ach ja, der verlangt noch zehntausend andere DLLs aus dem Asus Verzeichnis, hab alle rüber kopiert....

MfG
Martin


drstar - So 09.10.05 18:43

Damit funzt aber nur die MB-Temperatur, oder? Bin gerade dabei, SMART zu entschlüssln, ist leider mühselig, da die Hersteller der Platten leider immer eigene Süppchen kochen und sich nicht an die Standards (, die übrigens entgegen vieler Meldungen nicht exakt definiert wurden!) halten. Maxtor und WD sind schon großteils entschlüsselt, jetzt kommt noch der Rest (Seagate, IBM, die alten Hitachi-Modelle...)
Werde in ein bis zwei Wochen eine Unit bereitstellen, die eine Datenbank bereithält. Man muß ihr lediglich mitteilen, welches Device (physikalisch, nicht logisch) ausgelesen werden soll, und sie spuckt nen ganzen Haufen Infos aus (korrigierte Schreib-/ Lesefehler, nicht korrigierte Schreib-/ Lesefehler, Betriebsstd., Startvorgänge, akt. Betriebstemperatur, max. Betriebstemperatur). Ist ganz nützlich, um eine Platte auf Herz und Nieren zu prüfen...
Hat nur einen Nachteil: Im BIOS muß S.M.A.R.T akiviert sein, und natürlich muß die Platte dieses Feature auch unterstützen (trifft auf alle halbwegs aktuellen Platten zu). Windows stört sich daran übrigens nicht, da es mit den Daten ohnehin nicht s anfangen kann und sie deshalb einfach ignoriert...

_______________
Bearbeitet...
_______________

Hinweis: Diese Unit wird vorerst nur mit Parallel-ATA-Laufwerken funktionieren, nicht mit S-ATA-Laufwerken. Bin mir ohnehin nicht sicher, ob bei S-ATA die Standards verändert wurden, muß mal meinen RAID-Treiber zerpflücken, vielleicht bringt das ja später noch was.


digi_c - So 09.10.05 22:22

Dein Forscherdrang ist bewundernswert ehrlich aber da es keine einheitlichen Standarts gibt ist das mehr als mühselig und da haben auch schon viele aufgegeben weil es echt 0 Support seitens der Hersteller gibt.

Hier ein paar Tools die dennoch sowas unterstützen:
http://www.samurize.com, Speedfan(http://www.almico.com), MotherBoardMonitor(http://mbm.livewiredev.com/)

Vielleicht kriegst du da ja Ideen/Infos/...

Ich bin mir nciht sicher aber viel Statistisches lässt sich auch über WMI, Windows Measurement Interface erfahren, ob Temp,... dazugehören weiß ich aber nciht...


magu - Mo 18.09.06 00:48

nabend

seit asus probe 2 gibt es ja diese asus.dll nicht mehr. stattdessen eine pro2.dll und weitere...
ich habe diese bereits mit dem dependency walker angesehen und konnte nur wenig brauchbares finden.
google gibt auch nicht viele infos her

weiß vielleicht jemand ob ich mit den dlls auch irgendwie die temperaturen und spannungen auslesen kann?

gruß
magu


Corpsman - Fr 30.03.07 19:28

Ho,

Ich suche verzweifelt die Asus.dll

das Probe läst sich bei mir nicht installieren, Der meint das mein Asus P5B nicht Aktuell genug sei. Kann mir jemand vielleicht diese Blöde Dll zusenden ?


Delete - Fr 30.03.07 22:51

User von AMD-CPU können sich die Temperaturen von CORE 0 und CORE 1 anzeigen lassen - incl. Sourcecode.

S.M.A.R.T.-Werte lassen sich auch mit DELPHI auslesen - incl. Sourcecode.


Corpsman - Fr 30.03.07 23:00

Da hab ich mir nu endlich mal ein Intel geleistet und wieder nix :(

Asus.dll erkennt mein Chipsatz net dieses blöde DIng behauptet das er zu Alt ist , dabei ist mein Bpoard grad mal 5 Wochen alt oder so.

Kennt einer von euch noch nen Trick ?


Delete - Do 05.04.07 18:04
Titel: Temperatur der Grafikkarte auslesen
Bei NVIDIA mit GPU-Sensor (z.B.GeForce 6600GT, 7300 GT, 8800 GTS u.a.)
kann man die Temperatur der Grafikkarte messen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function GetGpuTemp: cardinal;
type
  NvCplGetThermalSettings = function(WindowsMonitorNumber: UINT;pGpuTemp, pUmgebTemp, pSlowDownTemp: Pointer): BOOL;stdcall;
var
  hInstNvcpl: THandle;
  GetThermalSettings: NvCplGetThermalSettings;
  UmgebTemp, SlowDownTemp: cardinal;
begin
  Result := 0;//GPU-Temperature
  UmgebTemp := 0;//Umgebungstemperatur
  SlowDownTemp := 0;//Slowdown

  hInstNvcpl := LoadLibrary('nvcpl.dll');
  if hInstNvcpl <> 0 then
    try
      GetThermalSettings:= GetProcAddress(hInstNvcpl,'NvCplGetThermalSettings');
      if Assigned(GetThermalSettings)  then
        GetThermalSettings(0, Addr(Result), Addr(UmgebTemp), Addr(SlowDownTemp));
    finally
      FreeLibrary(hInstNvcpl);
    end;
end;


HelgeLange - Do 05.04.07 18:14

seltsam, ich habe zwar die nvcpl.dll im System32-Verzeichnis, kann sie aber nicht als library laden, das Handle ist immer 0 :(
Habs auch schon mit absolutem Pfad probiert...


Corpsman - Do 05.04.07 18:17

*g*

den Source hab ich doch schon ewig.

Wie gesagt GPU und MB temp kann ich auslesen.

Mein Problem ist die CPU Temp.

Das Asus Probe II kann das zwar , und das Speedfan Proggy auch. Aber das Bringt mir leider gar nichts.

Da der Speedfan Programmierer sich nicht mal auf die FrageEmail meldet und die Genauen ExportParameter bei Asus habe ich auch nicht rausbekommen können, nach Meinung diverser leute die sich damit wohl auskennen ginge das in Richtung Hacken und das ist ja nicht erlaubt. Also bleibt mir zur Zeit nichts anderes Übrig als mit 2 Programmen zu arbeiten :(


Delete - Do 05.04.07 19:22

@Corpsman:

Es wäre nett und hilfreich, wenn Du nicht von uns Hellseherei erwartest.
Warum muss man Dir sämtliche nötigen Informationen "aus der Nase ziehen"?
Glaubst Du, wir lesen alles, was Du in anderen Foren preisgibst?

Was für einen EC-Chip etc. Du hast kannst Du doch wohl feststellen:
schau einfach ins Manual oder aufs Board!!!


Delete - Do 05.04.07 20:50

Hier ist ein Programm, mit dem man u.a. die Register (enthält Temparaturen,Spannungen,Drehzahlen etc.) des EC auslesen kann:
(funktioniert nur, wenn die althergebrachten KeyboardControllerAdressen benutzt werden: EC_SC,EC_DATA:0066,0062) Mit den gewonnenen RegisterAdressen lässt sich dann leicht ein DELPHI-Prog. füttern.

RW-Everything: RW - Read & Write

http://jacky5488.myweb.hinet.net/
http://jacky5488.myweb.hinet.net/bin/RwV022.zip


Corpsman - Fr 06.04.07 10:15

@hathor

sry, das Problem ist das Delphipraxis.net und delphi-forum.de vom Layout her so ähnlich sind.

und da merke ich das manchmal gar nicht in welchem Forum ich nun Poste.

Ich habe ein Asus P5B.
Und das mit dem Auslesen der Chip informationen blicke ich nun mal leider nicht so Recht.

Laut Gerätemanager ( siehe Screenshot ) ist es wohl ein ICH8 Chip. Was auch immer das sein soll.


Dieses RW Tool hab ich glatt mal installiert. Und WAO das zeigt einem ja wohl alles an. Nur verstehe ich es leider net.

Habe das CPU Ding aufgemacht und nen Screenshot mit hochgeladen. Vielleicht sagt dir das ja was.


Delete - Fr 06.04.07 12:43

Interessant ist z.Zt. nur, was Du siehst, wenn Du das EC-Symbol anklickst (das 7. von rechts in der Symbolleiste).
Da ändern sich im Sekundentakt verschiedene Werte -das sind Werte, die der Embedded Controller (EC) dem Betriebssystem zur Verfügung stellt - und neugierigen Usern...
Auf Mainboards nennt man einen ähnlichen Chip Super-I/O-Chip - SIO: vielleicht hast Du das auch schon mal angeklickt - was siehst Du da?

http://de.wikipedia.org/wiki/Embedded_Controller

BTW: Kannst Du die Temperaturen mit ACPI anzeigen lassen?
Das ATK0110 ACPI Utility hast Du, wie ich gesehen habe.


Corpsman - Fr 06.04.07 18:00

ho,

Also wenn ich auf das EC Symbol klicke dann öffnet sich das Popup was man im Screenshot sieht. Klicke ich dann da auf OK gibts "Embedded Controler not found"

Beim SIO ändert sich aber nichts.

Wie kann ich denn die Temps mit "ACPI" anzeigen lassen ?

ich wuste bis grad gar nicht das mein Rechner das kann ?


Delete - Fr 06.04.07 19:12

Das 1.Programm im Anhang zeigt:

'MSAcpi_ThermalZoneTemperature','CurrentTemperature'

Es funktioniert nicht auf allen PC (weil MS auch hier Mist gebaut hat)!
Manchmal wird eine Temperatur angezeigt, es erfolgt aber kein regelmässiges Update. Die Temperatur entspricht dann der Temperatur beim Booten von WINDOWS.

Das 2.Programm im Anhang zeigt die CPU-Temperatur mit ACPI-Update.
(und andere Parameter - sinnvoll für Notebooks)


Corpsman - Fr 06.04.07 20:43

Das ist doch zum Heulen.

Das Mobilemeter Kannte ich schon, und hab mich auch schon drüber geärgert das es das nicht schafft meine CPU aus zu lesen.

und dein Programm bringt auch nur FEHLER ( siehe Screenshot ).

Ich hab euch mal Mein Temperatur anzeige Project Hochgeladen.

Aber ACHTUNG ich hab von Port Programmierung nicht so arg viel Ahnung. Bei läuft es aber auf anderen systemen ??

wer sich den Code anschaut da gibts nen Compilerswitch der dann die CPU temp anzeigt. Das Problem ist wie gesagt nur das wenn ich das auf meinem system mache dann der Lüfter der CPU aus geht. Woran das liegt weis ich aber nicht, dazu bin ich in dieser Programmiersparte einfach nicht erfahren genug.


Delete - Fr 06.04.07 21:21

Hast Du das hier schon getestet:

Core(TM) Temperature Monitor Plugin for Motherboard Monitor 5

Monitor actual Core(TM) (DTS) temperatures directly from MBM5!
Supports Yonah, Conroe/Allendale/Woodcrest/Merom, and Kentsfield/Clovertown.
Compatability expected with Penryn/Wolfdale/Yorkfield.

http://www.thetechrepository.com/showthread.php?t=74

Ich habe keine INTEL-CPU (aus Prinzip: siehe oben!)
Ein Problem bei INTEL ist, dass die Temperatur nicht absolut übermittelt wird, sondern relativ zur zulässigen Maximal-Temperatur (TJunction), bei deren Überschreiten der Prozessor abgeschaltet wird. Der Wert ist Prozessorabhängig und in der CPU hinterlegt. Angenommen die TJunction beträgt 85°C und der Prozessor hat 60°C, dann beträgt der übermittelte Wert der DTS -25°C. Alle paar Monate ändert INTEL irgendwas an den Registern. Das heisst: Ein Temperatur-Anzeigeprogramm muss ständig an neue Prozessoren angepasst werden...

Aber für MBM5 könnte ich ein Interface schreiben, so dass man MBM5 nicht braucht - NUR das Core-Plugin.

Ausserdem gibt es noch:

http://www.thecoolest.zerobrains.com/CoreTemp/

Vielleicht schickt er mir den Code, wenn ich ne nette Email nach Israel schreibe...

Shalom, Arthur!


Corpsman - Fr 06.04.07 22:59

Hmm,

Von diesem MDM hab ich schon mal gehört, allerdings wiederstrebt es mir schon recht stark ein Tool installieren zu müssen, nur damit ich dann Mein Programm zum Laufen bekomm ( zumindest Dauerhaft ist das keine Lösung ).

Aber Das Tool von deinem Israelischen Mitprogrammierer funktioniert.

Wie man auf dem Screenshot sehen kann stimmen die Core0 und Core1 Temperaturen mit Speedfan überein.

Wenn wir das schaffen das ich die im Source Abfragen kann reicht mir das ja. Ich nehme den Durchschnitt davon und plotte meine Kurve.

Wäre echt super wenn das Klappen würde.


Delete - Fr 06.04.07 23:12

Für den Anfang könntest Du das Logfile auslesen, das CORETEMP schreiben kann..
Es sieht so aus bei meinem Notebook:

Session start: 23:10:48, April 6, 2007
CPUID: 0xF48
Processor: AMD Athlon 64 3200+ (ClawHammer)
Revision: SH-C0
CPU Speed CPU#0 (Core#0)
797.94 46
797.94 46
797.94 46
797.94 46
797.94 47
797.94 46
797.94 47
797.94 46

--------------------------------------------------------
Andere Lösung:
Wenn es Dich nicht stört, dass zu Deinem Programm SPEEDFAN im Hintergrund läuft,
dann kann man ja die Temperaturen in Dein Programm übernehmen (Shared Memory).


Delete - Sa 07.04.07 00:50

Hier ist (D)ein SPEEDFAN-Test-Programm - in Dein Programm integriert - mach was daraus!


Delete - Sa 07.04.07 09:16

Ich habe jetzt ein Stand-alone-SPEEDFAN-Test-Programm daraus gemacht incl. STRESS-Funktion - das treibt jetzt leistungsabhängige Werte in die Höhe...


Corpsman - Sa 07.04.07 10:45

also die Core Log File hab ich mal angeschaut :

Session start: 10:40:25, April 7, 2007
CPUID: 0x6F6
Processor: Intel Core 2 Duo E6700 (Conroe) (ES)
Revision: B2
CPU Speed CPU#0 (Core#0) CPU#0 (Core#1)
2668.83 41 41
2668.83 41 41
2668.83 41 41
2668.83 42 41
2668.83 41 41
2668.83 41 41
Session end: 10:40:31, April 7, 2007

das sagt mir nichts, ich hoffe Dir.

Und eigentlich stört mich das Speedfan Programm schon.

Mein Ziel ist es das ich nachher alle diese programme wieder Löschen kann.

Ich mag es nicht wenn ich ein Programm im Betriebsystem installieren mus. Deswegen schreibe ich ja immer alles selbst.

bzw. Wenn ich Speedfan anhab dann sehe ich die Informationen ja eh schon, dann brauche ich sie mir nicht noch zusätzlich über ein 2. Programm anzeigen lassen.


BenBE - Do 19.04.07 14:35

Laut dem Test-Programm für AMD-K8-Prozessoren läuft meine Laptop-CPU konstant bei 206 °C ...


Delete - Sa 05.05.07 15:41

user profile iconBenBE hat folgendes geschrieben:
Laut dem Test-Programm für AMD-K8-Prozessoren läuft meine Laptop-CPU konstant bei 206 °C ...


Unterhalb von K8 geht's NICHT!


BenBE - So 06.05.07 15:46

Ist ja ne AMD AthlonXP 1900+ gewesen ;-) Daher fand ich's ja so witzig ;-)

Sollte dann aber Abfragen, ob wirklich K8 oder höher bzw. den Fall "Kann's nicht lesen" auch sinnvoll anzeigen ;-)


Delete - So 06.05.07 20:53

Die Abfrage ist einfach:

If Temperature = 206 then Temp.caption:= 'ERROR';

Im betreffenden Register steht IMMER 255, wenn keine Core Temperature gemessen wird, subtrahiert man die Konstante '49' erhält man den Wert 206.


drstar - Mi 16.05.07 22:45
Titel: CPU-Temp
Zu Intel Core- und Core 2-CPUs ist ein interessanter Artikel in der aktuellen c't zu finden (Ausgabe 11/07, Seite 218-219). Dort wird auf die Temperaturmessung bei eben diesen CPUs eingegangen.

Im MSR 0x19C ($019C in Delphi) läßt sich der relative Wert auslesen, der sich allerings auf die Referenztemperatur der CPU bezieht und deshalb 85°C oder 100°C ebtragen kann. Scheinbar kann aus dem MSR 0xEE ($00EE) anhand eines undokumetierten Bits (Bit 30) abgeleitet werden, ob die Ref.-Temp. 85°C (gesetztes Bit) oder 100°C (gelöschtes Bit) beträgt.

Ich hoffe, es ist erlaubt, den Inhalt des Artikels in Kurzform wiederzugeben. Er ist allerdings sehr viel ausführlicher, enthält zahlreiche Hintergrundinformationen und ist sehr lesenswert.