Zugriff auf ein Array in der SPS

Download

Voraussetzungen

Sprache / IDE

Beispielprogram auspacken

C# / Visual Studio

Sample01.zip

Aufgabe

In der SPS befindet sich ein Array, welches von einer .NET Applikation mit einem Lesebefehl ausgelesen werden soll.

Beschreibung

In der SPS befindet sich ein Array mit 100 Elementen vom Typ Integer (2 Byte). Das Array wird in der SPS mit den Werten 3500 bis 3599 aufgefüllt.


In der Event-Methode Form1_Load wird eine neue Instanz der Klasse TcAdsClient kreiert. Dann wird die Methode TcAdsClient.Connect des TcAdsClient Objektes aufgerufen, um eine Verbindung zum Port 801 zu erstellen. Zum Schluss wird dann die Methode TcAdsClient.CreateVariableHandle aufgerufen, um sich ein Handle auf die SPS-Variable zu besorgen. Wenn das Programm beendet wird, wird das Handle in der Event-Methode Form1_Closing wieder freigegeben und die Dispose-Methode des TcAdsClient Objektes wird aufgerufen.

Wenn der Anwender den Button betätigt, wird das gesamte Array mit Hilfe der Methode TcAdsClient.Read aus der SPS in ein AdsStream Objekt eingelesen. Der Stream sollte genauso groß wie die Daten in der SPS sein. Da wir 100 INTs (je 2 Bytes) lesen wollen, muss der Stream mindestens eine Größe von 2 * 100 Bytes haben.

Die Klasse System.IO.BinaryReader ist notwendig, um die einzelnen Felder des Arrays aus dem Stream lesen. Dazu wird als erstes die Position des Streams auf 0 gesetzt. Dann können die einzelnen Felder des Arrays mit Hilfe der Methode BinaryReader.ReadInt16 in einer for-Schleife ausgelesen werden. Der Positionszeiger des Streams wird automatisch um die Anzahl der gelesenen Bytes erhöht.

Zugriff auf ein Array in der SPS 1:

C# Programm


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using TwinCAT.Ads;
using System.IO;

namespace Sample01
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button btnRead;
private System.ComponentModel.Container components = null;
private System.Windows.Forms.ListBox lbArray;

private int hVar;
private TcAdsClient tcClient;

public Form1()
{
InitializeComponent();
}

protected override void Dispose( bool disposing ) ...
private void InitializeComponent() ...

[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
// Create instance of class TcAdsClient
tcClient = new TcAdsClient();


// Connect to local PLC - Runtime 1 TwinCAT 3 Port=851
tcClient.Connect(851);

try
{
hVar = tcClient.CreateVariableHandle("MAIN.PLCVar");
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}

private void btnRead_Click(object sender, System.EventArgs e)
{
try
{
// AdsStream which gets the data
AdsStream dataStream = new AdsStream(100 * 2);
BinaryReader binRead = new BinaryReader(dataStream);

//read comlpete Array
tcClient.Read(hVar,dataStream);

lbArray.Items.Clear();
dataStream.Position = 0;
for(int i=0; i<100; i++)
{
lbArray.Items.Add(binRead.ReadInt16().ToString());
}
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//enable resources
try
{
tcClient.DeleteVariableHandle(hVar);
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
tcClient.Dispose();
}
}
}

PLC Programm


PROGRAM MAIN
VAR
PLCVar : ARRAY [0..99] OF INT;
Index: BYTE;
END_VAR

FOR Index := 0 TO 99 DO
PLCVar[Index] := 3500 + INDEX;
END_FOR