Visual Studio zugriff über TwinCat3 (C# / ADSdll)

Fränki

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

ich habe hier einen Beckhoff EK1100 im Einsatz.
Ich versuche eine einfach Form von lesen und schreiben von SPS variablen zu erstellen.
Ich orientiere mich an diesem Bsp: http://infosys.beckhoff.de/index.ph...31/tcadscomlib/html/tcadscomlib_intro.htm&id=

PLC CODE:
Code:
PROGRAM MAIN VAR    
 int1:INT := 30000;
 str1:STRING := 'this is a test string';
END_VAR

C#
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using TwinCAT.Ads;


namespace Read_Write
{
    public partial class Form1 : Form
    {
        internal System.Windows.Forms.TextBox tText;
        internal System.Windows.Forms.TextBox tint1;

        private int hText;
        private int hint1;

        private TcAdsClient adsClient;



        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            adsClient = new TcAdsClient();
            try
            {
                adsClient.Connect(851);

                //PLC Variablen
                hText = adsClient.CreateVariableHandle("MAIN.str1");
                hint1 = adsClient.CreateVariableHandle("MAIN.int1");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            adsClient.Dispose();
        }

        //READ Button
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                tText.Text = adsClient.ReadAny(hText, typeof(String), new int[] { 80 }).ToString();
                tint1.Text = adsClient.ReadAny(hint1, typeof(int)).ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void Write_Click(object sender, EventArgs e)
        {
            try
            {
                adsClient.WriteAny(hint1, int.Parse(tint1.Text));
                adsClient.WriteAny(hText, tText.Text, new int[] { 80 });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
prog.PNG

Nun bekomme ich beim drücken auf "Read oder Write folgdenden Fehler

fehler.PNG

Habt ihr eine Idee?

VG
 
Hast du das Form im Designer zusammengeklickt?

Du verweist auf tText und tint1. Diese beiden Textboxen werden bei dir aber nirgends initialisiert. Auf dem Bild mit deinem Form ist auch nur eine Textbox zu sehen und keine 2.

In den Beispielen von Beckhoff gibt es keine gesonderte Designer.cs. Die InitializeComponent Methode ist direkt im cs File für die Form.

Am einfachsten fügst du im Designer noch eine 2te Textbox hinzu. Die erste nennst du dann halt tText und die 2te tint1.

Im Deklarationsteil von Form1.cs löschst du dann die Deklarationen von tText und tint1. Die sollten jetzt im Designer File enthalten sein.
 
Hall Leute,
Ich möchte auch die SPS variablen in visual studio lesen und schreiben. Ich habe das gleiche Programm verwendet und sieht jetzt so aus.
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using TwinCAT.Ads;


namespace ReadWriteADS
{
    public partial class Form1 : Form
    {
        

        private int hText;
        private int hint1;

        private TcAdsClient adsClient;


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            adsClient = new TcAdsClient();
            try
            {
                adsClient.Connect(851);

                //PLC Variablen
                hText = adsClient.CreateVariableHandle("MAIN.str1");
                hint1 = adsClient.CreateVariableHandle("MAIN.int1");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            adsClient.Dispose();
        }

        //READ Button
       

        private void button1_Click_1(object sender, EventArgs e)
        {

            try
            {
                textBox1.Text = adsClient.ReadAny(hText, typeof(String), new int[] { 80 }).ToString();
                textBox2.Text = adsClient.ReadAny(hint1, typeof(int)).ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                adsClient.WriteAny(hint1, int.Parse(textBox2.Text));
                adsClient.WriteAny(hText, textBox1.Text, new int[] { 80 });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Im solution Explorer hab ich so konfiguriert:
Projekt.PNG

aber ich bekomme diesen Fehler:
Unbenannt.PNG

Ich weiss nicht was ich ändern muss. Hat Jemand eine Idee?
 
Wäre schon hilfreich, wenn du uns zeigst (code-schnipsel) wie du versuchst die Daten an die SPS zu übertragen. In der ADS.dll gibt es ja einige verschiedene Methoden die das bewerkstelligen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist der SPS Code:
Code:
PROGRAM MAIN
VAR
    int1:INT ;
    str1:STRING ;
END_VAR


int1:= 30000;
str1:= 'this is a test string';


C# Code:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using TwinCAT.Ads;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private int hText;
        private int hint1;

        private TcAdsClient adsClient;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            adsClient = new TcAdsClient();
            try
            {
                adsClient.Connect(851);

                //PLC Variablen
                hText = adsClient.CreateVariableHandle("MAIN.str1");
                hint1 = adsClient.CreateVariableHandle("MAIN.int1");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            adsClient.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = adsClient.ReadAny(hText, typeof(String), new int[] { 80 }).ToString();
                textBox2.Text = adsClient.ReadAny(hint1, typeof(int)).ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                adsClient.WriteAny(hint1, int.Parse(textBox2.Text));
                adsClient.WriteAny(hText, textBox1.Text, new int[] { 80 });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }




    }
}

beim drücken von button1_Click bekomme ich die Daten aus dem Twincat wie folgt:
comp.PNG

Beim drücken von button2_Click bekomme ich diesen Fehler:
Err.PNG
Ich dwollte damit daten in Texbox schreiben und beim drücken von Button dann in Twincat senden.
 
Vielen Dank für die Antwort. Allerdings habe ich das gleiche Problem. ich glaube ich muss noch einige Einstellungen in Twincat machen. aber ich weiss nicht was fehl. Mit Integer ist auch genauso
 
Hat es evtl. etwas mit dem Alignment zu tun?
Setze mal folgende Zeile über die Definition der Variablen im SPS Programm:

Code:
{attribute 'pack_mode' := '1'}
PROGRAM MAIN
VAR
    int1:INT ;
    str1:STRING ;
END_VAR


int1:= 30000;
str1:= 'this is a test string';

So wird ein 1-Byte Alignment der Variablen erzwingt.
 
Zurück
Oben