NumPipe - Kann mir das jemand erklären?

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
sora854
Posts: 5
Joined: Sat Apr 30, 2022 3:32 pm

NumPipe - Kann mir das jemand erklären?

Post by sora854 »

Hallo!

Ich bin derzeit durch ein Schulprojekt am Iowkit 28 am arbeiten und bisher läuft alles soweit ganz gut.

Jedoch bin ich nun ein bisschen an meine Grenzen gestoßen und wie es aussieht, liegt das daran, dass ich den NumPipe Wert noch nicht so 100% verstanden habe.

Ich möchte über einen der Analog Eingänge einen Wert von einem Sensor einlesen - soweit so gut. Ich setze den entsprechenden Eingang auf 1, damit dieser zu einem Input wird, schließe alles an und dann.. nichts.

Wenn ich das richtig verstanden habe, muss ich, damit Analog Werte eingelesen werten können, die IowKitReadNonBlocking Methode bei dem NumPipe wert auf 3 setzen.

Jetzt stellen sich jedoch für mich folgende 3 Fragen:

1. Wie genau muss ich das ganze einstellen? Muss die write Methode auch auf numpipe = 3 gesetzt werden? Kann ich evtl irgendwie testen ob überhaupt was ankommt?

2. Der Sensor gibt als Messung eine Spannung ab. Jedoch wird der Eingang doch durch das 1 Signal, bereits mit 5 V versorgt - wie kann dieser dann durch ein einkommendes Signal überhaupt irgendetwas auswerten?

3. Wenn der IowKitReadNonBlocking auf numPipe = steht, wie kann ich dann gleichzeitig überhaupt noch ein & ausgänge nutzen, da diese doch einen numpipe von = 0 benötigen?

Es wäre super, wenn mir jemand hier ein paar anhaltspunkte geben könnte. Es muss mir nicht zwingend alles vorgekaut werden, jedoch bräuchte ich zumindest einen stups in die richtige Richtung.

Ich bedanke mich schonmal recht herzlich im Voraus!
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: NumPipe - Kann mir das jemand erklären?

Post by Christoph Jung »

Die numpipes sind dafür da, um auf die unterschiedlichen Interfaces des IOW zugreifen zu können.
Der IO-Warrior28 hat insgesamt 4 Pipes die für unterschiedliche Funktionen zuständig sind:

0 -> IO-Ports
1 -> Special Modes (LCD, LED-Matrix, etc.)
2 -> I2C
3 -> ADC


Beispiel ADC:
Ist der ADC aktiviert worden sind Pin 1.0 bis 1.3 belegt und können nicht mehr über numpipe 0 geschrieben werden. Auch ist die LCD funktion deaktiviert, da diese die gleichen Pins nutzt.
Alle anderen Pins und Funktionen sind aber weiter zugängliche und können gesetzt oder gelesen werden.


Um den ADC also zu nutzen muss nicht der IO-Pin gesetzt werden, sondern die ADC-Funktion aktiviert werden.

Wir haben in unserem Windows SDK ein Beispielprojekt in C/C++ zum ADC drin, schon mal angeschaut?
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
sora854
Posts: 5
Joined: Sat Apr 30, 2022 3:32 pm

Re: NumPipe - Kann mir das jemand erklären?

Post by sora854 »

Ehrlich gesagt werde ich aus dem Beispiel Code nicht ansatzweise schlauer. Man muss dazu wissen, dass ich so gut wie keinerlei Erfahrung habe.

Bspw. werden im Code variablen genutzt, die vorher gar nicht deklariert werden, woraus ich mir keinen Schuh machen kann.

beispiel:

Code: Select all

void SetParameter(IOWKIT_HANDLE handle, BYTE enable, BYTE chan, BYTE mod)
{
	IOWKIT28_SPECIAL_REPORT report;
	memset(&report, 0, IOWKIT28_ADC_REPORT_SIZE);
	
	report.ReportID = IOW28_ADC_MODE;
	report.Bytes[0] = enable;		//Enable / Disable ADC mode
	report.Bytes[1] = chan;			//Channel count 
	report.Bytes[2] = 0x00;			//Must be 0
	report.Bytes[3] = 0x00;			//Must be 0
	report.Bytes[4] = mod;			//Single short or continues mode

	IowKitWrite(handle, IOW_PIPE_ADC_MODE, (char*)&report, IOWKIT28_ADC_REPORT_SIZE);
}
so fängt der code an - woher kommt das enable, chan und mod byte? Was genau wird hier eingetragen?
Ist der ADC aktiviert worden sind Pin 1.0 bis 1.3 belegt und können nicht mehr über numpipe 0 geschrieben werden. Auch ist die LCD funktion deaktiviert, da diese die gleichen Pins nutzt.
Alle anderen Pins und Funktionen sind aber weiter zugängliche und können gesetzt oder gelesen werden.
wenn ich in meinem code das numpipe auf 3 ändere, werden auch die anderen Eingänge nicht mehr angesprochen, was mich nur umso mehr verwirrt 😫
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: NumPipe - Kann mir das jemand erklären?

Post by Christoph Jung »

Die Variablen stehen im Funktionsaufruf als Parameter und werden beim Aufruf der Funktion mit übergeben. Die Funktion wird ja im Code aufgerufen und da wird das dann eingetragen/übergeben. Und was da eingetragen wird ist das, was im Datenblatt angegeben ist, bzw. welches Setup man haben möchte.

Ohne Code kann ich leider nicht weiter helfen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: NumPipe - Kann mir das jemand erklären?

Post by Guido Körber »

sora854 wrote: Sat May 07, 2022 12:22 pm wenn ich in meinem code das numpipe auf 3 ändere, werden auch die anderen Eingänge nicht mehr angesprochen, was mich nur umso mehr verwirrt 😫
Also mal zum grundsätzlichen Verständnis: Die Pipes sind einzelne Funktionen bzw. Funktionsgruppen im IO-Warrior.

Will man direkt auf die Pins zugreifen, dann geht das über Pipe 0. Über die anderen Pipes kommt man nicht direkt an die Pins ran.

Mit dem ADC redet man über Pipe 3. Die ADC Funktion muss erst mal mit einem Befehl an die Pipe 3 eingeschaltet werden. Die betroffenen Pins werden damit der Kontrolle der Funktion auf Pipe 0 entzogen, die ADC Funktion übernimmt die dann direkt. Es ist dann egal, was man vorher mit den Pins gemacht hat, oder danach über Pipe 0 an diese Pins schreibt.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: NumPipe - Kann mir das jemand erklären?

Post by Guido Körber »

Hat es denn jetzt geklappt?
sora854
Posts: 5
Joined: Sat Apr 30, 2022 3:32 pm

Re: NumPipe - Kann mir das jemand erklären?

Post by sora854 »

So - sorry für die späte Antwort. Ich habe noch viel mit dem Teil rumgespielt und habe auch irgendwann meinen Fehler gefunden - ich hatte von Anfang an das nötige Byte falsch beschrieben.

Nun komme ich allerdings direkt an das nächste Problem, an dem ich seit tagen hänge und nicht weiß wie ich es lösen soll.

Mein Sensor wird ausgelesen und die Werte machen Sinn - so weit so, so gut. Nun muss man sich vorstellen, dass ich möchte, wenn ein bestimmter wert erreicht wurde, dass ein I/O Ausgang angesteuert wird.

Nur leider schaffe ich es nicht, den ADC Modus zu verlassen

In den IF Schleifen werden die Werte, die ich von da aus versuche rein zu schreiben, einfach erneut überschrieben, da der ADC Modus ununterbrochen einen Wert vom sensor ausliest. Man könnte sagen, dass ich sowas wie einen "IowKitReadStop()" Befehl bräuchte.

Vermutlich gibt es hier eine ganz einfache Lösung nur ich habe wirklich schon alles für mich probiert und nichts hilft 🙄

Code: Select all

    private void Form1_Load(object sender, EventArgs e)
        {
            // Timer Starten und Eingänge einstellen

            IowKitOpenDevice();
            
            Data[0] = 0x1C;                              //0x1C
            Data[1] = 1;                //ADC Mode Enable = 1 , Disable = 0 
            Data[2] = 1;                
            Data[3] = 0;
            Data[5] = 1;
            Data[6] = 0;

           IowKitWrite(handle, 3, ref Data[0], 64);
            timer1.Enabled = true;                          
         //   timer1.Start();


        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Updaten der Anzeige zum derzeitigen status des Byte Array
            label1.Text = "Data 0: " + Data[0];
            label2.Text = "Data 1: " + Data[1];
            label3.Text = "Data 2: " + Convert.ToDouble(Data[2]) / 3;
            label4.Text = "Data 3: " + Data[3];
            label5.Text = "Data 4: " + Data[4];
            label9.Text = "Data Dummy 1: " + DataDummy[1];


            // Auslesen der Eingänge
            
            
                IowKitRead(handle, 3, ref Data[0], 64);
            
            
                     
                //Test für Ansteuerung Pumpe

                if (Data[2] / 3 >= 60)
                {
                    Data[1] = 0xFF;
                    IowKitWrite(handle, 0, ref Data[0], 64);
                    IowKitReadNonBlocking(handle, 0, ref Empfangen[0], 64);
                    label7.Text = "Über 60";
                    label8.Text = "";
                }
                else if (Data[2] / 3 <= 60)
                {

                    Data[1] = 0x00;
                    IowKitWrite(handle, 0, ref Data[0], 64);
                    IowKitReadNonBlocking(handle, 0, ref Empfangen[0], 64);
                    label8.Text = "Unter 60";
                    label7.Text = "";
                }
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: NumPipe - Kann mir das jemand erklären?

Post by Christoph Jung »

Am besten einen eigenstänigen Array für die IO-Funktion nutzen, also nicht Data[0] sonder z.B. WriteData[0].
Weil in Data steht das drin, was über IowKitRead() gelesen wurde (reportID von ADC, die Bytes, etc) und es macht ja keinen
Sinn diese "Zufallswerte" in die IO-Ports zu schreiben.


Ansonsten sieht alles weiter OK aus, außer, dass halt der Ganze IO-Port 0 mit 0xFF beschrieben wird.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
sora854
Posts: 5
Joined: Sat Apr 30, 2022 3:32 pm

Re: NumPipe - Kann mir das jemand erklären?

Post by sora854 »

Ansonsten sieht alles weiter OK aus, außer, dass halt der Ganze IO-Port 0 mit 0xFF beschrieben wird.
Die Idee hier war, dass ich einen von den Ports ( wegen testzwecken war es mir egal welcher ) ein high bekommt, welches ich mir ausgeben lassen kann, was nun mal nicht passiert, weil es direkt wieder überschrieben wird.
Am besten einen eigenstänigen Array für die IO-Funktion nutzen, also nicht Data[0] sonder z.B. WriteData[0].
Sprich ich mache nochmal einen Befehl mit IowKitReadNonBlocking(handle, 0, ref WriteData[0], 64) um seperat die I/O Funktion auszulesen?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: NumPipe - Kann mir das jemand erklären?

Post by Christoph Jung »

Hab ich ganz übersehen, die IO-Funktion möchte beim IOW28 keine 64 sondern nur 5 Byte haben.
Wenn da mehr drin stehen, dann wird der Befehl verworfen.

Das müsste so aussehen (hab den Arraynamen geändert):

Code: Select all

if (Data[2] / 3 >= 60)
{
        IOPorts[0] = 0x00;  //Report-ID
	IOPorts[1] = 0xFF;  //IO-Port 0.0 bis 0.7
	
	IowKitWrite(handle, 0, ref IOPorts[0], 5);
	label7.Text = "Über 60";
	label8.Text = "";
}
Ein Read ist bei den IO-Ports nicht zwingend notwendig (außer man will diese als Eingänge nutzen), daher hab ich es mal weg gelassen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
sora854
Posts: 5
Joined: Sat Apr 30, 2022 3:32 pm

Re: NumPipe - Kann mir das jemand erklären?

Post by sora854 »

Es hat tatsächlich funktioniert! Vielen Dank 😁
Post Reply