Home www.visualprog.cz

 

My new OpenGl technology engine 3DOT  for your information

is

here

 

 

(c)2002 Pavel Pindora
 Email Kontakt
Pro více informací je zde formulář
 

Click on of the PayPal button to donate money to this Web

 
19.04.2004 C# a graf od Dundas software
16.10.2004 C# a TreeView,DataGrid,ODBC,Chart Dundas,DataSet a MySQL ODBC
 

Microsoft.Net

Návrh nové platformy pro vizualizace, sběr dat v technologických procesech

(dále jen vizualizace)¨  

19.10.2003

V současnosti je nutné, pro specifické vlastnosti operačního systému, při tvorbě aplikací za účelem vizualizace,  používání problémově orientovaných vývojových nástrojů. Mezi tyto patří, mimo jiné, např: Promotic, Control web, InTouch... Stále více se ukazuje, že je nutné tyto nástroje častěji aktualizovat  s ohledem na nově se objevující požadavky, nebo lépe řečeno, v jednom systému je dobře vyřešena jedná věc a v druhém zase jiná.To se dá říci i o možnostech v komunikacích s PLC automaty, koncentrátory a pod.

Nově nastupující platforma, Microsoft.NET, však ve své podstatě má v sobě zahrnutý jednotný přístup, jak ve vytváření viditelné části obrazovky (klientská část) , archivaci dat, zabezpečení apod. ale i v možnosti sdílení vývojářem vytvořených služeb dalšími aplikacemi.

Velmi důležité je to, že Microsoft.NET obaluje operační systém ( dále jen OS) , izoluje NET aplikaci od jeho specifik a tím odpadnou starosti, jak starší aplikaci převést na nový OS. Microsoft.NET zahrnuje XML Web services , dovolující aplikacím komunikovat , sdílet data na sítí Intra(Inter)netu bez ohledu na OS nebo programovací jazyk.

Po stručné charakteristice o nové .NET platformě jsem usoudil její výhodnost pro nasazení i v oblasti vizualizací a řízení.

Je však důležité, co tato platforma přináší vývojářům a v čem mohou vlastně vytvářet aplikace. Pohodlnost, rychlost , správnost , spolehlivost, týmovost, údržba to je gró , které rozhodne zda tato platforma se uchytí i v tak náročných směrech, jako je řízení technologických procesů. V případě neúspěchu by to mohlo znamenat i přechod k jiným OS. Základnim nástrojem vývojáře je Visual Studio NET , jenž je tvořeno :

Windows Forms - pro tvorbu klientských částí (obrazovky ,

bitmapy...) s novými možnostmi Win32.

Web Forms - Uživatelské rozhraní web formulářů ( vkládání dat,

plánování, zadávací a info obrazovky . Stejný způsob

jako tvorba formuláře ve Visual Basic , s tím, že

WebForms je standartně založen na HTML a není na

VB závislý, je mimo něj a použitelný i pro jiné jazyky.

Web Services - poskytují mechanismy programům , komunikující

po Intra(Inter)netu mezi aplikacemi a berou ohledy i na

ne MS Windows platformy .

 

 

Obrazovky , komunikace, zpřístupnění dat mají tedy na starosti WinForms, WebForms a k nim je potřeba vytvořit obsluhu událostí, výpočty, regulace, řízení, k tomu slouží :

Visual Basic.NET

Visual C#

Jscript

 

C# je z mého hlediska preferovanou platformou pro MS.NET , Visual B však je hojněji používán a znám z např. Office , pro NET je rozšířen o další možnosti.

 

Pro tvorbu EXE,DLL je dále k dispozici Visual C++, který se využije při obsluze PLC, různých měřících a regulačních zařízení, pyrometrů,... a data z nich předá vyšší vrstvě naprogramované  pomocí VB,VC# ke zpracování a ty pak budou reprezentována pomocí Webforms , WinForms v klientské části obrazovky .

Nastoluje se otázka jak to bude s ovládači PLC , jako např. Simatic . Ale i v současnosti jsou na příslušném CD od Siemens příklady pro komunikaci ve Visual C++,V Basic , zbývá tedy jejich vhodné začlenění do MS NET . Nehledě na to, že některé protokoly by šly naprogramovat ve VB,VC#  přímo.

 

Na konec upřesnění jak to bude z runtime , známými z Promoticu , Controt Webu apod.

Budoucí Windows NET již bude standartně obsahovat potřebný runtime (NET Framework) a současné OS od MS , kromě W95, je možné o něj doplnit. Základním OS pro NET je v současnosti Windows 2000.

Nakonec zmínka , že klientská část, t.j. obrazovka s tlačítky, textíky,obrázky,... je prezentována uživateli, nebo lépe budoucí obsluze  i  pomocí Microsoft Internet Exploreru a ten je opět součásti OS, není třeba jej kupovat.

 

Dle mnou výše popsaných argumentů se jeví Microsoft NET platforma jako velice slibná pro tak náročné aplikace jako je sběr dat, řízení tech.procesů , vizualizace a to i s ohledem na jednotnost návrhu a tím údržbu systému.

 

Předkládám tento článek do odborných konferencí na internetu, za účelem vyjádření těch,  kteří mají o toto zájem. "Hardwaristé" by se zase mohli vyjádřit o možnostech začlenění obsluhy jejich hardware do NET platformy.

 

 

 

Následující příklady budou prezentovat možnosti použití .NET ve výše popsaných oblastech

 

 

19.04.2004 C# a graf od Dundas software

 

Dále popsaný příklad nebo spíš inspirace, je naprogramována v Microsoft Visual C# .NET Standart.

 

 

Zde je ukázka že lze použít i SharpDevelop

IC#SharpCode. Released under the terms of the GNU General Public License.

 

 

Dundas chart je k dispozici v balíku Microsoft Visual Basic .NET Resource kit a protože se mi jevil vhodný pro vizualizaci dat v C# aplikaci , rozhodl jsem se k jeho vyzkoušení . Pro jeho instalaci je potřeba nejdříve nainstalovat Resource kit a odtud nainstalovat Dundas chart., cestu znázorňuje následující obrázek .

 

 

 

 

Po instalaci spustíme C# a vytvoříme prázdnou Windows aplikaci .

 

 

Po vytvoření musíme grafy vložit do toolboxu Windows Forms , jak se to dělá demonstruje  další obrázek, stačí snad jen dodat, že pomocí tlačítka Browse najdeme příslušnou dll knihovnu tam, kde jsme pro instalaci Dundas Chart navolili cestu. Samozřejmě, že položka Chart se objeví v dialogu až po nalezení dllky a je zde zobrazena jen pro demonstraci.

 

 

 

 

Potom vybereme v toolbaru tlačítko a ve formuláři navolíme plochu o velikosti budoucího grafu , po navolení automaticky vyjede Chart Wizard, kde navolíme parametry a vzhled grafu.

 

 

Zbývá ještě přidat ovládací tlačítka , texty a kostra aplikace je hotova.

 

Vlastní programová obsluha je založena na komponentě Timer o intervalu volání události co 250 ms. Data pro graf jsou generována náhodně , pomocí random.

 

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
	{
		if( enableChart>0 )
		{
			int	datoToChart1 = random.Next(0, 100);
			int	datoToChart2 = random.Next(0, 100);
			chart1.Series[0].Points.AddXY(pointIndex + 1,datoToChart1 );
			chart1.Series[1].Points.AddXY(pointIndex + 1,datoToChart2 );
			++pointIndex;
			if(chart1.Series[0].Points.Count > PocetBoduGrafu)
			{
				if( chart1.Series[0].Points.Count > PocetBoduGrafu )
				chart1.Series[0].Points.RemoveAt(0);
				chart1.ChartAreas["Default"].AxisX.Minimum = pointIndex - PocetBoduGrafu;
				chart1.ChartAreas["Default"].AxisX.Maximum = chart1.ChartAreas["Default"].AxisX.Minimum + PocetBoduGrafu;
			}
			label2.Text		= datoToChart1.ToString();
			label4.Text		= datoToChart2.ToString();
			label6.Text		= pointIndex  .ToString();
			chart1.Invalidate();
		}
	}

 

Listing Form1.cs je v html.

 

V dalším pokračování budou data získána ze seriové linky, k jejímu ovládání jsem opět použil komponentu z Resource kitu od Sax.net Communications Community Edition která nám zpřístupní příslušné funkce ale vlastní ovládání protokolu si musíme napsat sami. Myslím, že pro ukázku pak použiji Modbus v ASCII formě.

 

 

 

 

 

16.04.2004 C# a TreeView,DataGrid,ODBC,Chart Dundas,DataSet a MySQL ODBC 

Protože jsem teď dělal nějakou menší aplikaci, tak jsem se rozhodl vyzkoušet GNU vývojové prostředí SharpDevelop a vytvořil v něm program s následující funkcí :

 

1. 

Vložen TreeView,DataSet a DataGrid prvek.
2. Poklepáním na položku v něm se provede nakonektování na MySQL server běžící na Linuxu Fedora 2 přes ODBC driver 
3. Data ze serveru jsou uložena do prvku DataSet, na tento prvek je napojena tabulka DataGrid, která zobrazí sejmutá data.

 

Vložení TreeView se provede ve sloupci Tools ,položce Windows Forms

Přetažením pak prvek umístíme 

do  formuláře MainForm . 

 

 

Položky Root1 , 2 jsou vytvořeny v Nodes

(kolekce) ale jen pro přehled, protože 

se vytvářejí programově

Dále je potřeba ošetřit události DoubleClick,AfterSelect a VisibleChanged od TreeView

Stačí provést double klik na těchto položkách a automaticky vyjede zdrojový kod, kde vepíšeme funkci

 

 

Dále budeme potřebovat vložit do formuláře (MainForm) tabulku , kde se zobrazí data, v mém případě jsem zvolil  DataGrid

Tabulka DataGrid

Datový zdroj DataSet

 

Aby se v tabulce zobrazily data automaticky , 

napojíme ji na zdroj dat

v našem případě DataSet

Pokud poklepeme na záhlaví řádku je vyvolána událost DoubleClick

Událost VisibleChanged prvku TreeView využívám při startu aplikace abych v něj vytvořil položky ( nodes ) . Jsou vytvořeny dvě základní položky Root1 , Root2 a v každé z nich 20 podpoložek 

treeK.Nodes.Clear();

TreeNode Root1;

TreeNode Root2;

Root1 = treeK.Nodes.Add("Root1");

Root2 = treeK.Nodes.Add("Root2");

int y;

for(int i=1;i<20;i++ )

{

     Root1.Nodes.Add(i.ToString());y = i;

     Root2.Nodes.Add(y.ToString());

}

 

 

 

Událost AfterSelect je vyvolána poté co vybereme nějakou položku v TreeView a slouží k sejmutí a uložení jejího názvu do proměnné selectedItem ale to jen v případě, pokud číselná hodnota položky je platná.

 

string strCislo = e.Node.Text;

int cisloNode = 0;

 

try

{

    cisloNode = Convert.ToInt32(strCislo);

}

catch(Exception errex)

{

    errex.ToString();

}

 

selectedItem = "";

if( cisloNode>0 && cisloNode<21 )

{

    selectedItem = e.Node.Text;

    textBoxMessage.Text=selectedItem;

}

 

 

 

V události DoubleClick, je z názvu vybrané položky (selectedItem), vytvořen název tabulky , který se pak přidá do SQL dotazu , 

takže, když kliknu na položku číslo 12 je vytvořen název DBK12.      Celý SQL string (CommandSQL ) pak vypadá takto SELECT * FROM DBK12. 

Událost zajistí napojení na ODBC driver (OdbcConnection)  , zaslání SQL přes OdbcCommand  a adapter.Fill  naplní dataSet , poté je daty automaticky naplněn DataGrid.

string CommandSQL="";

try

{

     textBoxMessage.Text="Please wait, connecting to database";

     int delkStr = selectedItem.Length;

     if(delkStr>0)

     {

          OdbcConnection con = new OdbcConnection();

          con.ConnectionString "Dsn=MySQLODBC;Uid=host;Pwd=redhat";

          con.Open();

          string DBnameOdkz = selectedItem;

          CommandSQL = "SELECT * FROM " + "DBK" + DBnameOdkz;

          OdbcDataAdapter adapter = new OdbcDataAdapter();

          adapter.SelectCommand = new   OdbcCommand(CommandSQL,con);

          adapter.Fill(dataSet);

          con.Close();

          textBoxMessage.Text="ok Fill";//*/

     };

}

catch(Exception errex)

{

     textBoxMessage.Text=CommandSQL +"___"+ errex.ToString();

};

 

 

Dále si v události DoubleClick pro DataGrid ukážeme jak sejmout aktuální řádek do proměnné rowNum, a z vybraného řádku a 5.sloupce (4) sejmeme text, který se opět použije pro vytvoření SQL dotazu. Výsledek se tentokrát uloží do druhého DataSet dataSetTable.

Zajímavá je konstrukce dataSetTable.Clear();   dataGridTable.Refresh(); která zajistí vymazáni dat z tabulky.

 

 

void DataGrid1Click(object sender, System.EventArgs e)

{

    System.Windows.Forms.DataGrid.HitTestInfo hi;

    textBoxMessage.Text=e.ToString();

    int rowNum = dataGrid1.CurrentCell.RowNumber;

    int colNum = 4;

    hi = dataGrid1.HitTest(rowNum,colNum);

 

    textBoxMessage.Text=dataGrid1[rowNum,colNum].ToString();

    string CommandSQL="";

    try

    {

        dataSetTable.Clear();

        dataGridTable.Refresh();

        int delkStr = textBoxMessage.Text.Length;

        if(delkStr>0)

        {

            ///--------- Napojeni na ODBC driver ------

            OdbcConnection con = new OdbcConnection();

            con.ConnectionString   "Dsn=MySQLODBC;Uid=host;Pwd=redhat";

            con.Open();

            ///--------- Vykonani SQL dotazu ---------

            string DBnameOdkz = textBoxMessage.Text;

            CommandSQL = "SELECT * FROM " + DBnameOdkz;

            OdbcDataAdapter adapter = new OdbcDataAdapter();

            adapter.SelectCommand = new OdbcCommand(CommandSQL,con);

            adapter.Fill(dataSetTable);

            con.Close();

            textBoxMessage.Text="ok Fill Chart+Table";//*/

        };

    }

    catch(Exception errex)

    {

        textBoxMessage.Text=CommandSQL +"___"+ errex.ToString();

    };

 

 

Pokud potřebujeme zobrazit data z tabulky v grafu, můžeme použít graf od Dundas software , následující příklad nastíní jak ho aplikovat. Já jsem použil tlačítko, jehož aktivací se vyvolá událost, obsluhující vykreslení dat v grafu.

 

Nejdříve ale musíme grafu nastavit jeho vzhled, v mém případě se bude jednat o 3D Chart.

 

Počet křivek, které bude graf umět zobrazovat je udán počtem vložených Series , v našem případě 2. Funkce series1.Points.Add(10); pak přidává data do grafu a tím se vykreslí křivky.

public void InicChart( )

{

    serieIndex = 0;

    try

    {

        newAreas = new ChartArea();

        newAreas.Area3DStyle.Enable3D = true;

        newAreas.Area3DStyle.RightAngleAxes = false;

        newAreas.Area3DStyle.XAngle = 0;//40;

        newAreas.Area3DStyle.YAngle = 0;//20;

        newAreas.Area3DStyle.Light = LightStyle.Simplistic;

        newAreas.Area3DStyle.Perspective = 0;

        newAreas.Area3DStyle.PointDepth = 100;

        newAreas.Area3DStyle.PointGapDepth = 100;

        newAreas.Area3DStyle.WallWidth = 5;

        newAreas.Position.Auto = false;

        newAreas.Position.Height = 90;

        newAreas.Position.Width = 80;

        newAreas.Position.X = 0;

        newAreas.Position.Y = 5;

        chart1.ChartAreas.Add(newAreas);

 

        series1 = new Series();

        series2 = new Series();

        series1.ChartType = "Spline";

        series2.ChartType = "Spline";

        chart1.Series.Clear();

        chart1.Series.Add(series1);

        chart1.Series.Add(series2);

 

        series1.Points.Add(10);

        series1.Points.Add(20);

        series1.Points.Add(30);

        series1.Points.Add(40);

        series1.Points.Add(50);

        series1.Points.Add(40);

        series1.Points.Add(30);

        series1.Points.Add(20);

        series1.Points.Add(10);

    }

    catch(Exception errex)

    {

        textBoxMessage.Text = errex.ToString();

    };

}

 

V události od tlačítka bude vložen příklad následujícího kódu, který vykoná vlastní vykreslení dat z tabulky.

 

    float cisloZeSloupce;

    int countRow=0,i=0;

 

Nejdříve si jen tak pro kontrolu sejmeme text z tabulky

 

    strCislo = dataGridTable[rowNum,colNum].ToString();

    cisloZeSloupce = Convert.ToSingle(strCislo);

 

Potom zjistíme počet řádků v tabulce

 

    countRow = dataSetTable.Tables[0].Rows.Count;

    textBoxMessage.Text = "Data Rows0=" + strCislo + " Count Rows=" + countRow.ToString();

 

Vypíšeme si, kterou sérii přidáváme, pozor pokud je jich více než dvě musíme graf vyčistit , nebo si přidat serie.

 

    label4.Text = serieIndex.ToString();

 

Zjistíme název sloupce v tabulce a ten přidáme do textu legendy série

 

    NameCol = dataSetTable.Tables[0].Columns[colNum].Caption;

    chart1.Series[serieIndex].LegendText = NameCol;

 

Nyní provedeme vlastní naplnění série grafu daty pomocí chart1.Series[serieIndex].Points.AddXY(i+1,cisloZeSloupce);

 

    try

    {

        for( i=0;i<countRow;i++)

        {

            strCislo = dataGridTable[i,colNum].ToString();

            cisloZeSloupce = Convert.ToSingle(strCislo);

            if(cisloZeSloupce>2000) cisloZeSloupce = 2000;

            chart1.Series[serieIndex].Points.AddXY(i+1,cisloZeSloupce);

        }

        serieIndex++;

        chart1.Invalidate();

        label4.Text = serieIndex.ToString();

    }

    catch(Exception errex)

    {

        textBoxMessage.Text="Error on chart; Index >" + i.ToString() +" "+errex.ToString();

    };