My new OpenGl technology engine 3DOT for your information
is
(c)2002 Pavel Pindora
Email Kontakt Pro více informací je zde formulář
(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 .
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 |
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.
|
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ě.

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. |
![]() |
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(); };
|