Twincat ADS und WinCE

OnkelRudi

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

zu mir: Ich bin in der Steurungstechnik schon länger unterwegs, mit twincat (codesys), Step7 kenn ich mich aus, und habe schon diverse programme ertstellt. Visualisierungen mit WinCC und dergleichen sind nicht das problem, auch mit c# und ads habe ich schon was gemacht (auf dem pc).

zu meinem problem: ich soll hier mit c# und einem cx9010 eine visu erstellen. jetzt soll das mit wince und c# funktionieren (sagt google). leider bekomme ich beim lesen einer variable aus twincat eine fehler zurück: nullrefenceexception. ich vermute ich nutze nicht die passende dll (es gibt da ja einige zur auswahl). Weiss da jemand rat (event. mit beispiel)? gemacht hats doch bestimmt schon jemand.

mfg

de onkelrudi
 
Hallo Rudi,

Die NullReferenceException ist eine Fehlermeldung von .Net. Ich gehe mal davon aus, dass dies ein Fehler des Programmierers ist, wurden alle Übergabe-Parameter korrekt angelegt und instanziert?
Siehe auch: http://msdn.microsoft.com/de-de/library/system.nullreferenceexception(v=vs.80).aspx

Beispiele findest du im InfoSys von Beckhoff. Für TwinCAT 2 und .Net wären die Beispiele hier zu finden:
http://infosys.beckhoff.com/content/1031/tcsample_net/html/note.htm

Läuft deine Applikation von Remote auf deinem Notebook o.ä. oder programmierst du eine Applikation welche nachher auf dem CX gestartet werden soll? Bei zweitem müsstest du nämlich das Compact Framework verwenden.

Gruß, Neals
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, ich bin der Programmiere, und ja, der hats falsch gemacht. Gemacht hab ich das wie im beispiel von beckhoff. wenn ich das ce-beispiele hernehme, macht vs2008 eine konvertierung. bei dieser gehts dann schief.
Die Applikation soll auf dem cx laufen. deswegen wince. das cf 3.5 ist drauf. da finde ich zumindest eine log-datei, die die installation beschreibt. oder wird das cf nur von visual-studio aufs gerät kopiert? wie gesagt, ich vermute, ich nutze die falsche twin.ads.dll.
 
Die Informationen bei Beckhoff sind mal wieder mehr als spärlich, aber zur Installation von .NET CF 3.5 steht da nur was von X86 basierenden Systemen. Die CX9000er Reihe hat durchweg Prozessoren mit ARM Befehlsatz. Also evtl. läuft das 3.5er .NET CF garnicht auf diesen Steuerungen.

Braucht ihr unbedingt die 3.5er Version? Die einzig wirklich großen Neuerungen sind WCF und LinQ und bisher bin ich sehr gut ohne beides ausgekommen.


Kommt die Exception gleich wenn eine TwinCAT ADS Komponente in deinem Programm initialisiert wird? Mit der Meldung das die TwinCAT.ADS.dll nicht existiert? Das Problem hatte ich auch mal. Da war irgend etwas in dem Projekt zerschossen. Am Ende hatte es nur geholfen ein neues Projekt erstellen und alle Sourcen zu importieren.
 
Also der connect klappt noch...
wenn ich dann eine variable auslesen will, dann gibts diese nullreferenceexception. die dll scheint also auf dem cx zu "existieren". ich hab sie gefunden, und auch die aplikation hat sie gefunden (nehme ich mal an, gibt auf jeden fall kein fehler in diese richtung).
 
Ok - hätte ich schonmal eher dran denken können. Leider wird das erst um 16:30 was. ich werds auf jeden fall tun.
danke schonmal..
 
Es vollkommen unabhänging ob nun x86 oder ARM bzw. CE oder XPe/WES/...
Die Methoden sind immer dieselben. Auch die dll die intern verwendet ist, ist immer die gleiche!
Warum arbeitest du nicht mit try-catch Blöcken anstatt mit unbehandelten Exceptions?
Zeig mal den Code.....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit try-catch hatte ich so gemacht....
Trotzdem läuft das jetzt. Wieso weiss ich nicht. Ich hatte mich heute morgen noch mal mit der CX9010 verbunden, Projekt drauf und lief.
Irgendwie komisch.

Hier mal der Code



Code:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using TwinCAT.Ads;


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







        private int iHandle = 0;
        private int iValue = 0;
        private TcAdsClient tcClient = new TcAdsClient();
        private AdsStream dataStream = new AdsStream(4);
      

        private void Form1_Load(object sender, EventArgs e)
        {

            tcClient.Connect(801);
            
        }



        private void button1_Click(object sender, EventArgs e)
        {
            try
            {

                AdsBinaryReader binReader = new AdsBinaryReader(dataStream);
                iHandle = tcClient.CreateVariableHandle("MAIN.PLCVar");
                tcClient.Read(iHandle, dataStream);
                iValue = binReader.ReadInt32();
                dataStream.Position = 0;
                textBox1.Text = Convert.ToString(iValue);

               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            {

                tcClient.WriteAny(iHandle, 0);
 
             }
        
        }


        private void Form1_Closing(object sender, CancelEventArgs e)
        {
            tcClient.Dispose();
        }        
    
    }
}
 
Okay.....

Und warum der "Umstand" mit dem DataStream?
Für eine Variable bzw. "Single-" Variablen macht man das üblicherweise nicht.
Das findet eher Verwendung bei ARRAY / STRUCT.
 
Ich hatte eine ganze reihe von möglichen "Umständen" probiert ;)
Da war ich halt gestern mittag stehen geblieben. Zuvor bekam ich halt immer diese exception...
 
Noch ein kleiner Tip am Ende: Beim Debuggen sollte eigentlich im Stack-Trace angezeigt werden an welcher Stelle im Programm eine Ausnahme ausgelöst wurde.
Wenn man die Ursache nur grob einkreisen kann, bleibt noch die Möglichkeit sich mit Haltepunkten an sie heran zu tasten.

Finde ich den Grund für einen Ausnahme-Fehler in meinen Programmen, signalisiere ich das meistens akustisch mit einem Face-Palm ;)
An manchen Tagen habe ich zum Feierabend eine rote Stirn .....
 
Zurück
Oben