Hallo ihr C# Spezialisten,
ich hoffe ihr habt Geduld mit einem Delphi Umsteiger.
Die im Public Teil angelegten Variablen werden nicht aktualisiert.
Die oldTicks etc werden von einem anderen Wert abgezogen, aber sie haben scheinbar den wert 0, das gilt für alle oldxyz Variablen.
Wahrscheinlich sieht der Profi den Fehler auf einen Blick.
hoffnungsvolle Grüße von kuppi
hier der Code:
namespace Heizung
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
PortBit aPortBit;
ThreadStart myTS;
Thread portThread;
Queue aList;
Queue MsgList;
long oldTicks = 0;
float oldWatt = 0;
float watt = 0;
long Ticks = 0;
float wattjeStd = 0;
private void init_HW()
{
aList = new Queue();
MsgList = Queue.Synchronized(aList);
aPortBit = new PortBit(530);
aPortBit.MsgList = this.MsgList;
aPortBit.Bits[0].ID = IDConst.idStromWP;
aPortBit.Bits[0].Typ = MsgConst.KWMsg;
aPortBit.Bits[0].Use = true;
aPortBit.Bits[1].ID = IDConst.idStromHaus;
aPortBit.Bits[1].Typ = MsgConst.KWMsg;
aPortBit.Bits[1].Use = true;
myTS = new ThreadStart(aPortBit.Threadloop);
portThread = new Thread(myTS);
portThread.Priority = ThreadPriority.Highest;
}
private void msgTimer_Tick(object sender, EventArgs e)
{
// die Nachrichten von der MsgList abholen
HeizMsg aMsg;
while (MsgList.Count > 0)
{
aMsg = (HeizMsg)MsgList.Dequeue(); // Msg holen, typcast von object nach heizmsg
switch (aMsg.Typ)
{
case MsgConst.KWMsg: KWMessage(aMsg); break;
case MsgConst.ADCMsg: ADCMessage(aMsg); break;
}
}
}
private void KWMessage(HeizMsg aMsg)
{ // hier die KW Messages verarbeiten
switch (aMsg.ID)
{
case IDConst.idStromWP: ; break;
case IDConst.idStromHaus:
if (oldTicks == 0)
{
oldTicks = aMsg.MsgDateTime.Ticks;
oldWatt = aMsg.Value;
ed_if1.Text = oldWatt.ToString("f2");
}
else
{
watt = aMsg.Value - oldWatt;
Ticks = aMsg.MsgDateTime.Ticks - oldTicks;
wattjeStd = watt /Ticks * 3600000;
oldWatt = watt;
oldTicks = Ticks;
tb_counts.Text = wattjeStd.ToString("f2");
tb_watt.Text = watt.ToString("f2");
tb_msec.Text = Ticks.ToString("f2");
}
break;
}
}
private void ADCMessage(HeizMsg aMsg)
{ // hier die ADC Messages verarbeiten
}
private void button1_Click(object sender, EventArgs e)
{// porthread starten
init_HW();
portThread.Start();
msgTimer.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
aPortBit.Terminate();
}
private void button3_Click(object sender, EventArgs e)
{
Single zahl = 1.23455F;
textBox1.Text = zahl.ToString("f4");
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Ich gehe einfach mal davon aus, dass entweder die Events nicht ausgelöst oder die case-Zweige nicht erreicht werden. Versuche mal zu debuggen oder ein paar Ausgaben reinzumachen, um das Problem einzugrenzen.
Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.
Leider ist es nicht so einfach,
die Procedure KWMessage wird aufgerufen, der else Zweig durchlaufen.
in aMsg.Value ist ein Wert der jeweils um 1 hochgezählt wird, wenn ich oldwatt davon abziehe müsste jeweils in der Ausgabe 1 erscheinen, ich sehe aber immer den weiter auflaufenden Wert.
kuppi
Das ist wirklich nahezu unmöglich (zumindest mir) bei dem Problem "aus der Ferne" zu helfen. Was evtl. noch sein könnte, dass hier: wattjeStd = watt /Ticks * 3600000; Ticks gleich 0 ist und dass es eine Exception gibt, da man ja nicht durch 0 teilen kann (zumindest nehme ich das an). Dadurch würden dann die nachfolgenden Zeilen und somit die Zuweisung an oldWatt nicht mehr ausgeführt.
Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.
Ich habe mir deinen Code nicht weiter angesehen, was Delphiumsteiger gerne vergessen ist, dass in .Net Int32 / Int32 Int32 ergibt., während du unter Delphi einen Real bekamst. 😉
btw: nächstes Mal bitte csharp-Tags anstatt code nehmen. 😉