Laden...

Forenbeiträge von kuppi Ingesamt 44 Beiträge

28.11.2018 - 09:07 Uhr

Hallo Janiiix3,

ich habe einen Arduino von dem ich Daten via comport empfange.
Ich send keine Binärdaten sondern Strings, das ist zwar nicht so kompakt aber problemloser.
Als Endmarke habe ich CR der LF oder beides.
Die Endmarke kannst Du in einer Eigenschaft der Comportklasse angeben.
Die Daten lese ich mit der .Readline() Methode der Comportklasse (ist blockiered) in einem eigenen Thread ein.
Anschließend werden die Strings in eine SyncQueue (von Herbivore hier aus dem Forum) abgelegt.
Diese Strings werden dann im Hauptthread oder einem anderen geparst.
Wenn Du Einfluss auf das Protokoll hast wäre das eine Möglichkeit.

Gruß Jürgen

27.11.2018 - 16:50 Uhr

Hallo Janiiix3,

wie erkennst Du den den Anfang deines Datenblocks?
Die ersten beiden bytes sollen die Chars '+' und '-' sein, aber die sind ja dezimal 43 und 45.
Und diese Werte können auch in deinen anderen empfangenen bytes vorkommen.
Wäre zwar Zufall, aber ist nicht ausgeschlossen dass 43 und 45 nebeneinander auftauchen.

Gruß Jürgen

24.05.2016 - 12:10 Uhr

Hallo Jesfreric,

letzten endes ist nur die Frage:

Wird deine Virtual Machine den USB Comport so zur Verfügung stellen dass deine DOS SW sie verwenden kann?
Wenn deine DOS SW nicht HW nah auf den Comport zugreift könnte es klappen.
Ansonsten sehe ich nicht wie Du mit C# da etwas ausrichten willst.

Gruß Jürgen

24.05.2016 - 11:23 Uhr

Hallo Jesfreric,

ich hoffe ich habe dein Ziel richtig verstanden.

Du hast eine SW die unter MS-DOS läuft und via RS232 (Onboard Ports) dein Photometer ansteuert und von diesem Daten empfängt.
Die Daten werden dann visualisiert, gespeichert, gedruckt etc.

Du willst ein neues Program schreiben (C#) das unter Windows läuft, einen USB-Comport Adapter verwendet und eine vergleichbare Funktionalität bietet.

Oder habe ich das falsch verstanden?

Gruß Jürgen

24.05.2016 - 10:54 Uhr

Hallo Jesfreric,

der Treiber für den Comport kümmert sich darum das die Pegelwechsel in Bytes umgesetzt werden, Du mußt halt nur die richtige Baudrate Parität etc. einstellen.
Und dann kannst Du die Bytes relativ problemlos in C# einlesen.
Du brauchst dann auf jeden fall eine Dokumentation wie der Datenstrom zu interpretieren ist.
Das scheint ja ein Photometer zu sein, da werden dann möglicherweise XY Daten Intensität/Wellenlänge kommen.
Wenn in der Doku ein Beispielprogram, in QBasic, GW-Basic oder so, vorhanden ist kann das auch sehr hilfreich sein.

Gruß Jürgen

24.05.2016 - 09:51 Uhr

Hallo Jesfreric,

wenn dokumentiert ist wie das Gerät anzusprechen ist (Befehlssyntax, CR oder LF als Abschluss etc.) kann man das gut mit einem Terminalprogram testen (HTerm z.B.).
Ich habe für uns auch schon etliche C# Programme für Laborgeräte geschrieben, wenn eine vernünftige Dokumentation da ist haut das meistens hin.
Problematisch ist es mitunter wenn der Comport in der alten SW direkt über die HW-Register angesprochen wird (Die gibt es bei den USB Adaptern natürlich nicht).
Um welches Gerät handelt es sich denn?

Gruß Jürgen

19.05.2015 - 10:13 Uhr

Hallo Thomas_TK,

ein Arduino-Uno und DS18B20 Sensoren sind dazu gut geeignet.
Ich benutze das für meine Heizungssteuerung.
Der Arduino bindet via USB ein Comport ein, der kann dann von C# verwendet werden.

Gruß

kuppi

01.12.2014 - 19:44 Uhr

Hallo MrSparkle,

vielen Dank für die schnelle Antwort.
Du hast recht, Google hätte meine erste Anlaufstelle sein sollen.

Gruss kuppi

01.12.2014 - 18:35 Uhr

Hallo zusammen,

mir ist eine eigenwillige Darstellung der Checkbox unter Windows 8.1 aufgefallen.
Wenn FlowDirection="RightToLeft" eingestellt ist (die Box mit dem Haken ist rechts) wird
der Haken gespiegelt dargestellt.
Bei "LeftToRight" sieht alles normal aus.
Unter Windows 7 gibt es da keine Probleme.
Entwicklungsumgebung Visualstudio Comunityedition, bei der Expressversion ist es aber auch so.
Habt ihr das schon beobachtet, gibt es ein workaround?

Gruss kuppi

15.03.2013 - 14:39 Uhr

Hallo Coffeebean,

vielen Dank für deine Antwort.

Die Klasse vm_ruehrerIKA enthält die Properties (Drehmoment, Drehzahl etc.).
Und die Zuweisung der instanz ruehrer an base.DataContext macht die Properties für das Databinding auch verfügbar, wpf durchsucht ja wohl die DataContexts.
Die Frage ist nur, wird das bei Commandbinding auch funktionieren?
(Natürlich nur wenn ich die Commands vorher in der vm_ruehrerIKA Klasse implementiert habe).
Aber werden die Commands auch im DataContext gesucht?

Gruß kuppi

15.03.2013 - 12:31 Uhr

Hallo zusammen,

leider komme ich bei meinen ersten wpf-Schritten schon ins straucheln.

Bei der Datenbindung an ein Label mache ich folgendes:

Content="{Binding Drehmoment, Mode=OneWay}"

und in der Codebehind wird

   vm_ruehrerIKA ruehrer = (vm_ruehrerIKA)GUIobj.Get_vmObject(5, 2);  

    public MainWindow()  
    {  
        InitializeComponent();  
        base.DataContext = ruehrer;  
          

    }  

das object ruehrer an den DataContext des Window zugewiesen.

Das klappt auch alles sehr gut.
Jetzt möchte ich in vm_ruehrerIKA noch einige Commands einbauen und die an Buttons binden.

Gibt es eine möglichkeit von XAML auf die instanz ruhrer zuzugreifen, z.b. bei Databinding so:

Content="{Binding ruehrer.Drehmoment, Mode=OneWay}"

Das funktioniert leider nicht.

Wie kann ich also auf die Eigenschaften und Commands einer objectinstanz zugreifen?

08.03.2013 - 14:52 Uhr

Hallo,

hier ist mal ein Stück Quellcode:

hier werden die Aufrufe aus dem nicht GUI Thread in die Queue gelegt.

protected virtual void NotifyPropertyChanged(string propname)
        {
            if (PropertyChanged == null) return;
            PropertyChangedEventHandler handler = PropertyChanged;
            Action action = () => handler(this, new PropertyChangedEventArgs(propname));
            GUIobj.GUIpropChange.Enqueue(action); // SyncQueue
            // diese Queue wird dann vom GUI-Thread geleert.
        }


Und hier wird im GUI-Thread die Queue geleert.

private void tmr_msg_Tick(object sender, EventArgs e)
        {
            tmr_msg.Enabled = false;
            if (GUIobj.GUIpropChange.Count > 0) GUIobj.GUIpropChange.Dequeue()();
            tmr_msg.Enabled = true;
        }

Und so lege ich die Bindings an:

private void Form1_Shown(object sender, EventArgs e)
        {
            ruehrer = (vm_ruehrerIKA)GUIobj.Get_vmObject(5, 2);
            label1.DataBindings.Add("Text", ruehrer, "Drehzahl");
            label2.DataBindings.Add("Text", ruehrer, "Drehmoment", true, DataSourceUpdateMode.Never, null, "#0.0");
            textBox1.DataBindings.Add("Text", ruehrer, "Solldrehzahl", false, DataSourceUpdateMode.OnValidation, null);
        }

Gruß Jürgen

08.03.2013 - 14:20 Uhr

Hallo,

sorry wenn ich mich da unklar ausgedrückt haben sollte.

es ist tatsächlich so, dass ich die objekteigenschaften von einem anderen Thread gesetzt werden, und dementsprechend auch das PropertyChange Ereignis.
Aber ich lege diese Aufrufe als Action in eine "SyncQueue, (Herbivore sei Dank!), und leere die über einen Timer im GUI.
Ich habe mal gelesen dass es reichen würde wenn eine PropertyChange aufgerufen wird, das alle gebundenen Controls aktualisiert werden.

Beispiel:

Drehzahl ändert sich, PropertyChange für Drehzahl wird aufgerufen, aber alle 3 Bindungen Drehzahl, Drehmoment und Solldrehzahl werden aktualisiert.

In der Praxis sieht das so aus:

in der Textbox steht 275 als aktuelle Solldrehzahl, es kommen im Label laufend Drehzahlen von 274 bis 276 an, in dem anderen Label die Werte fürs Drehmoment.
Jetzt "geh ich in die Textbox", und will auf 325 ändern.
Ich habe z.B. gerade angefangen den Textboxinhalt von rechts (Backspace) abzuräumen, da wird wieder das Label mit einer neuen Drehzahl aktualisiert und sofort erscheint auch in der Textbox der ursprüngliche Wert von 275 (die Solldrehzal aus dem Quellobjekt).

Ich hoffe es ist jetzt etwas klarer.

08.03.2013 - 12:18 Uhr

Hallo zusammen,

ich habe ein (kleines?) Problem mit Datenbindung an einer Textbox.

Folgendes habe ich gemacht: (Ansteuerung eines Rührers)

ein Object mit 3 Int Eigenschaften Drehzahl, Drehmoment, Solldrehzahl ist an
2 Labels (Drehzahl und Drehmoment) und eine Textbox (Solldrehzahl) gebunden.
Die Events werden über NotifyChange aufgerufen, funktioniert einwandfrei, die Werte werden alle angezeigt.

Jetzt das Problem:

Es kommen laufen neue Werte (bis auf Solldrehzahl) an (ca. 2-3 /sek.), wenn ich dann versuche die Solldrehzahl zu ändern (editieren der Textbox) wird sowie z.B. ein neuer Drehzahlwert im Label erschein der ursprüngliche Wert der Solldrehzahl wieder in der Textbox angezeigt.
Wenn kein Update von Drehzahl/Drehmoment erfolgt kann ich die Solldrehzahl editieren.

Lässt sich diese verhalten ändern, der Solldrehzahl Int im Objekt hat sich ja nicht geändert, das Event wird auch nicht aufgerufen.

Ich hoffe auf euch.

Gruß Jürgen

17.10.2011 - 13:07 Uhr

Hallo Lassi,

mit C# geht das durchaus.
Ich benutze es für meine Heizungssteuerung. Allerdings läuft das heute mangels anderer Schnittstellen über USB.
Von Vellemann gibt es z.B. ein USB Board, mit Openkollektor Ausgängen, 8bit AD-Wandler und Zählerbaustein. Dazu eine passende DLL.
Läuft bei mir unter Win7 32 einwandfrei.

Gruß

Jürgen

15.02.2011 - 19:47 Uhr

Hallo sth_Weird,

ich habe für meine Heizungssteuerung auch einige USB Geräte im Einsatz.
Die müssen teils auch in sehr kurzen Intervallen abgefragt werden, da auch Impulse von Wasseruhren oder Stromzähler gezählt werden.
Ich habe das mit einer Klasse gelöst die einen Thread für das jeweilige Gerät startet.
Änderungen gebe ich dann an eine "threadsichere Queue", herbivore sei nochmals Dank gesagt dafür, weiter. Diese Queue wird dann vom Hauptprogram über einen Timer ausgelesen und ausgewertet.

Gruß

kuppi

13.01.2010 - 11:48 Uhr

Vielen Dank euch allen,

die Lösung hat mir "Dependency Walker" gebracht, da fehlte noch eine andere DLL.
Das mit dem Backslash fürt zu "Nicht erkannte Escapesequenz" Fehler.
Mal sehen was der nächste Stolperstein bringt.

Gruß kuppi

13.01.2010 - 08:44 Uhr

Hallo C# Profis,

leider habe ich ein Problem eine DLL einzubinden.

hier mal kurz ausschnittsweise der Code:

using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("C:/Dokumente und Einstellungen/ockua/Dateien Lokal/Visual Studio 2008/Projects/Dosinotest/Dosinotest/bin/Release/MetrohmOEMInterface.dll")]

        public static extern bool InitMetrohmOEMInterface();

        [DllImport("C:/Dokumente und Einstellungen/ockua/Dateien Lokal/Visual Studio 2008/Projects/Dosinotest/Dosinotest/bin/Release/MetrohmOEMInterface.dll")]

        public static extern long GetNumberOfDevices();

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = GetNumberOfDevices().ToString();
        } 

bei button1_Click werde ich mit folgender Meldung erfreut:

Die DLL "C:/Dokumente und Einstellungen/ockua/Dateien Lokal/Visual Studio 2008/Projects/Dosinotest/Dosinotest/bin/Release/MetrohmOEMInterface.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.

Die DLL ist definitiv im bin Verzeichnis, ebenso auch in System32.

Es wäre toll wenn einer von euch was hilfreiches wüsste.

Gruß kuppi

08.11.2007 - 13:54 Uhr

vielen Dank für eure Antworten,

in die MSDN Dokus habe ich auch schon reingeschaut, ich werde wohl auch den mühsamen Weg gehen müssen und mich lagsam an das Thema ranarbeiten.
Dann kann ich sicher auch konkretere Fragen stellen.

Das Delphi Prog für die RS232 Geräte und damit auch das UDP Protokoll sind von mir, das Delphi Prog will ich momentan auch noch nicht ändern, sonst würde ich mir ja eine zusätzliche RS232 .Net C# Baustelle aufmachen, das hebe ich mir für später auf.

Aber die eigentliche Versuchssteuerung lauft halt auf anderen Rechnern, die woanders stehen und an denen keine Geräte via RS232 angeschlossen sind. Diese Benutzerschnittstellen zu den Laborgeräten sind ebenfals in Delphi erstellt (von mir) und komunizieren mit den Geräte-PCs via UDP.
Und diese Programme (Benutzerschnittstelle) wollte ich durch .Net C# Programme ersetzen.

Gruß kuppi

08.11.2007 - 10:55 Uhr

Hallo C# Spezialisten,

der wechsel von Delphi nach C# ist doch nicht so einfach wie ich mir erhofft hatte.
Eventuell kann mir ja einer von euch aufs Pferd helfe.
Folgendes Problem liegt an.

zur Ansteuerung von Laborgeräten benutze ich RS232, übers Netzwerk schicke ich die Befehle via UDP dem Prog welches die Geräte via RS232 ansteuert und diese schickt mir dann ebenfalls via UDP Ergebnisse zurück (Temp. Druck usw.).
Um mich bei dem RS232 Prog anzumelden schicke ich unter anderm auch den Port von meinem localen Rechner zu dem die Ergebnisse geschickt werden.
Unter Delphi gabs eine einfache Komponente der ich beim erstellen den gewünschten Localport übergeben konnte.
Wie realisiere ich das am einfachsten in C#, bzw. .Net?

abwartende Grüße

kuppi

03.08.2007 - 09:33 Uhr

@all,

vielen Dank für die schnellen Antworten.
Das mit der BitConverter Klasse scheint für mich das richtige zu sein.
Das funktioniert ja auch in beiden Richtungen.

Gruß kuppi

03.08.2007 - 07:57 Uhr

Hallo c# Spezialisten,

ich will per UDP Daten verschicken, und der UDPClient erwartet bei .Send ein ByteArray.
Das Struct das die Daten enthält sieht folgendermaßen aus:


[StructLayout(LayoutKind.Explicit)]
	public struct UDPdata
	{
	[FieldOffset(0)] public byte devTyp;
	[FieldOffset(1)] public byte devID;
	[FieldOffset(2)] public byte paramID;
	[FieldOffset(3)] public byte rw;
	[FieldOffset(4)] public int wert;
	}

die ersten 4 bytes kann ich natürlich einfach zuweisen z.b. arrayvar[0] = data.devTyp u.s.w.
wie bekomme ich aber den integer in das Array?
und wenn die Gegenseite geantwortet hat (Receive) wie bekomme ich die letzten 4 Bytes in den Integer?

Schon mal vielen Dank.

kuppi

21.10.2006 - 18:31 Uhr

Hallo C# Spezialisten,

this ist ja die Referenz auf das eigene Object, bei zuweisungen in der Klasse sieht man daher oft z.B this.Variable = 47.11;
Ist das mehr der übersicht wegen, oder bringt die verwendung von this irgendwelche Vor- oder Nachteile?
Zuweisung ohne this funktioniert ja auch.
Lange Rede, kurze Frage: Sollte man bei Zuweisungen this benutzen?

Vielen Dank schonmal.

mit freundlichem Gruß kuppi

21.09.2006 - 17:09 Uhr

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

21.09.2006 - 16:39 Uhr

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)
        {

        }

        
        
    }
}
17.04.2006 - 18:23 Uhr

Hallo herbivore,

im Grunde brauche ich nichts sichtbares zur Laufzeit, aber ich werd mal mit einem UserControl was üben, es kommt ja auch noch der Stolperstein der Einbindung in die Toolbox.
Ich hoffe ich muss nicht zu oft eure (deine) Geduld strapazieren.
Vielen Dank von kuppi

17.04.2006 - 18:07 Uhr

Hallo an alle,

ich versuche momentan (leider erfolglos) ein Steuerelement zu erstellen das wie der Timer zur Laufzeit unsichtbar sein soll.
In der Hilfe erscheint mir Control schon fast was überqualifiziert, oder sollte man von Component ableiten.

Wie ist überhaupt die grundsätzliche Vorgehensweise (Visual #C Express 2005) damit man das neue "Steuerelement" in die Toolbox einarbeiten kann, *.cs Dateien mag die nicht?
Fragen über Fragen, ich hoffe ihr kennt einige Antworten.

m.f.G. kuppi

17.04.2006 - 12:54 Uhr

Vielen Dank,

so einfach kann das Leben sein ....
Momentan keine Fehlermeldungen.

Jetzt werde ich erst mal einen Trockenlauf machen ob auch die richtigen Ergebnisse rauskommen.

m.f.G. kuppi

17.04.2006 - 12:48 Uhr

Hallo an alle,

der Fluch der guten Tat, hier kommt mein nächstes Problem.
(Für euch möglicherweise eher was zum schmunzel?)

folgendes funktioniert leider nicht:

aender = (18 && 16);

aender ist int, und im wirklichen Leben wären auch 18 und 16 int Variablen sein.
Das Ergebnis wäre vorzugsweise 16 (Bit 5 ist gesetzt).

Die Fehlermeldung sagt folgendes:

Fehler 1 Der Operator "&&" kann nicht auf Operanden vom Typ "int" und "int" angewendet werden.

Gibts dafür eine Lösung?

m.f.G. kuppi

17.04.2006 - 12:28 Uhr

Vielen Dank für die guten und schnellen Antworten,

wahr wohl schon zu einfach....
Aber ich hoffe ihr vergebt einem Umsteiger/Anfänger (Delphi -> #C).
Mit IOPort.IOread klappts auch ohne Fehlermeldung.
Die .dll habe ich aus der Quelle aus dem Bericht über den Parallelportzugriff hier im Forum. Die .dll fuktioniert natürlich auch mit anderen Adressen.

m.f.G. kuppi

17.04.2006 - 12:11 Uhr

Hallo ihr alle,

irgendwie scheine ich noch was nicht begriffen zu haben.
Folgende Konstellation:
ich habe 2 vorhandene *.cs Dateien dem Project hinzugefügt.
dann versuche ich auf ein Element in einer der *.cs Dateien von der anderen *.cs Datei zuzugreifen es folgt der Fehler:
Fehler 1 Der Name "IOread" ist im aktuellen Kontext nicht vorhanden.

Hier sind die Auszüge der Dateien, zuerst die auf die ich zugreifen will:


namespace HWIO
{
    using System;
    using System.Runtime.InteropServices;

    public class IOPort
    {
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int IOread(int adress);
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void IOwrite(int adress, int val);
    }
}

jetzt die andere:


using System;
using System.Threading;
using System.Collections;
using HWIO;


namespace HeizClasses 
{

    public struct HeizMsg 
    {
        public DateTime MsgDateTime;
        public int Value;
        public int Typ;
        public int ID;
    }
    public struct BitInfo
    {
        public int ID;
        public int Count;
        public Boolean Use;
    }   
    public class PortBit 
    {
        private bool Terminated = false;
        private HeizMsg aMsg = new HeizMsg();
        private int ioport = 0;
        private int msek = 5;
        public PortBit(int adresse) // der Konstruktor
        {
            ioport = adresse;
            int i;
            for (i = 0; i < 8; i++)
            {
                Bits[i].Use = false;
            };
        }
        public int IOAdresse
        {
            set
            {
                this.ioport = value;
            }
            get
            {
                return this.ioport;
            }
        }
        public int WaitmSek
        {
            set
            {
                this.msek = value;
            }
            get
            {
                return this.msek;
            }
        }

        public Queue MsgList = null;
        public BitInfo[] Bits = new BitInfo[8]; 
        public void Terminate() 
        {
            Terminated = true;
            msek = IOread(125); // <=======Hier taucht der Fehler auf.
        }
        public void Treadloop() 
        {
            int oldwert = 0;
            int wert = 0;
            int aender = 0;
            int x = 0;
            while(Terminated == false) 
            { // das ist die eigentliche Threadschleife
                wert = IOread(ioport);

                if (wert == oldwert)
                {
                    aender = (wert ^ oldwert);
                    for (x = 0; x <8; x++)
                    {
                        if (Bits[x].Use)
                        {
                            if ((aender && (1 << x)) > 0)
                            {
                                Bits[x].Count ++;
                                if (Bits[x].Count % 2 == 1)
                                {
                                    if (MsgList != null) 
                                    {
                                        aMsg.MsgDateTime = DateTime.Now;
                                        MsgList.Enqueue(aMsg);
                                    }    //PostMessage(OwnerHWND, WM_BITMsg, Bits[x].ID, Bits[x].Count);
                                }
                            }
                        }
                    }
                }
                oldwert = wert;
                Thread.Sleep(msek);
            }
        }
    }


}

Die Zuweisung an dieser Stelle ist nur übungshalber, der Fehler tritt auch in der Threadllop auf.
Aber was läuft da falsch?

m.f.G. kuppi

[EDIT]Bitte Code-Tags benutzen[/EDIT]

16.04.2006 - 20:07 Uhr

hallo herbivore,

nochmals Danke,
das war für heute wirklich meine letzte Frage.

m.f.G. kuppi

16.04.2006 - 19:57 Uhr

Hallo ihr alle,

eigentlich wollte ich euch heute nicht mehr behelligen,
aber...
ich habe da noch ein kleines Problem.
Die Umsetzung meiner Heizungssteuerung von Delphi nach #c hakelt noch etwas.
Hier ist ein kurzes Stückchen Pascal:

for x := 0 to 7 do
if Bits[x].Use then
if (aender and (1 shl x)) > 0 then
begin
Inc(Bits[x].Count);
if odd(Bits[x].Count) then
PostMessage(OwnerHWND, WM_BITMsg, Bits[x].ID, Bits[x].Count);
end;

was ich suche ist ein äquivalent zu shl und wo ich gerade dabei bin gibts etwas vergleichbares zu odd?

m.f.G. kuppi

16.04.2006 - 19:07 Uhr

Hallo herbivore,

vielen Dank für deine schnelle Antwort, funktioniert (wie sicherlich zu erwarten) jetzt einwandfrei.
Eine (vorerst) letzte Frage noch: welchen Zugriffsbereich haben "Dinge" bei denen ich keinen Zugriffsbereich angebe?

Gruss kuppi

16.04.2006 - 18:53 Uhr

Hallo an alle,

folgende Fehlermeldung führt mich in arge Verwirrung:

Fehler 1 Der Zugriff auf "HeizClasses.BitInfo.Use" ist aufgrund der Sicherheitsebene nicht möglich.

Im Konstructor PortBit(int adresse) wird die Stelle wo ich .Use auf false setzen will moniert. Leider gibt die Hile nichts (für mich) hilfreiches her.
Weis einer von euch weiter was ich falch mache?

Gruss kuppi.


namespace HeizClasses 
{

    public struct HeizMsg 
    {
        public DateTime MsgDateTime;
        public int Value;
        public int Typ;
        public int ID;
    }

    public struct BitInfo
    {
        int ID;
        int Count;
        Boolean Use;
    }   
    
    public class PortBit {
        
        private bool Terminated = false;
        private HeizMsg aMsg = new HeizMsg();
        public BitInfo[] Bits = new BitInfo[8]; 
        public PortBit(int adresse)
        {
            int i;
            for (i = 0; i < 8; i++)
            {
                Bits[i].Use = false;
            };
        }
        public Queue MsgList = null;
        
        public void Terminate() 
        {
            Terminated = true;
        }
        public void Treadloop() {
            while(Terminated == false) 
            { // das ist die eigentliche Threadschleife
                Thread.Sleep(5);
                if (MsgList != null) 
                {
                    aMsg.MsgDateTime = DateTime.Now;
                    MsgList.Enqueue(aMsg);
                }
            }
        }
    }
}

16.04.2006 - 16:31 Uhr

vielen Dank herbivore,

ist sicherlich auch fast eine philosophische Frage.
Eine Copie der Datei im Projectverzeichnis hat zumindest den Vorteil das diese Version mit dem verbundenen Project (hoffentlich) funktioniert.
Ich muß mich möglicherweise erst daran gewöhnen, in Delphi wars halt anders.

m.f.G.

kuppi

16.04.2006 - 16:16 Uhr

Hallo ihr alle,

ich habe in Visulstudio 2005 Express eine *.cs via Project->vorhandenes Element hinzufügen eine *.cs Datei hinzugefügt.
Klappt soweit ganz gut, der Namespace wird im Project gefunden.
Wenn ich aber diese *.cs Datei ändere und speicher wird sie im aktuellen Project gespeichert und nicht an der ursprünglichen Stelle.
Kann man das ändern, oder eventuel andere Namespaces in *.cs Dateien referenzieren ohne sie als vorhandenes Element hinzuzufügen?
Wenn ich bei mehreren Projekten ein und die selbe *.cs Datei verwenden will, habe ich sonst in jeder möglicherweise eine andere Version.

vielen Dank schon mal.

kuppi

12.04.2006 - 17:29 Uhr

Hallo an alle,

der Umstieg von Delphi auf #C was Threading anbelangt ist doch etwas schwieriger.
Ich habe den ersten Thread zwar ans laufen bekommen, aber laut doku sind Suspend/Resume veraltet und man sollte was anderes nehmen.
Was empfehlt ihr?

m.f.G. kuppi

08.04.2006 - 18:16 Uhr

Sorry, in DateTime heisst das Ticks.
Kommt dann in 100nSek. Portionen daher.
Bei ersten Tests mit einem Timer scheinen mir die Ticks für meine Zwecke brauchbar zu sein.

Vielen Dank nochmals.

m.f.G.
kuppi

08.04.2006 - 16:57 Uhr

Hallo an Alle,

die Umstellung meiner Heizungssteuerung von Delphi auf #C geht langsam weiter.
Zur berechnung des Stromverbrauchs brauche ich zu dem erfassten Impuls die Zeit.
DateTime liefert z.B. TickCount hat aber laut .Net Hilfe nur eine Auflösung von 500ms.
Ist das ein Druckfehler oder ist die Auflösung tatsächlich nur 0,5 Sekunden?

m.f.G.

kuppi

05.04.2006 - 18:40 Uhr

Vielen Dank für die Antworten,

im Systemverzeichnis klappt's.

kuppi

05.04.2006 - 18:23 Uhr

Hallo Coder,

ich bin gerade dabei erste Versuche mit HWIO unter #C und WinXP Prof zu machen.
Nach installation und start des Treibers *.sys Datei wird über eine *.dll Datei die Komunikation abgewickelt (leider noch nicht).
Wo genau muss ich die *.dll Datei hinterlegen damit sie gefunden wird?
Der Programmstart funktioniert erst mal, erst bei zugriff auf z.B. ParPort.Input erscheint ein Fehler.
Die deklaration der Funktionen habe ich aus einem Beispiel entnommen.

public class ParPort
{
[DllImport("inpout32.dll", EntryPoint="Inp32")]
public static extern int Input(int adress);
[DllImport("inpout32.dll", EntryPoint="Out32")]
public static extern void Output(int adress, int val);
}

und hier die Fehlermeldung

Die DLL inpout32.dll: Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.

Hoffnungsvolle Grüsse von kuppi

03.04.2006 - 18:30 Uhr

Hallo an euch beide,

vielen Dank für eure Antworten, das ging ja rasend schnell.
Mit der Dock Eigenschaft komme ich der Sache wohl am nächsten.
Ich werde demnächst meine Heizungssteuerung von Delphi auf #C umstellen.
(HW-IO etc, hoffe das wird mir gelingen).
Eventuell werde ich eure Hilfe (und eure Geduld) dann nochmals in Anspruch nehmen.

Gruss kuppi

03.04.2006 - 18:16 Uhr

Hallo .Net User,

ich bin ein Umsteiger von Delphi und stosse am Anfang doch auf ein paar Unterschiede oder ich durchblicke da noch was nicht.

Bei Delphi hatten die meisten Controls (Panel etc.) eine Eigenschaft ALIGN mit der die Ausrichtung im Clientbereich bestimmt wurde.
z.b. alTop positionierte das Control immer auf ges. Breite am oberen Rand des Clientbereichs.

Gibt es bei den Winform Controls swas auch?

vielen Dank schon mal.

kuppi