MessageBox   otázka

VB.NET

Zdravím, něco jsem tu pročetl o zjištění handle messageboxu a podobně (v sekci Visual Basic 6 a jiné), ale to mi moc nepomohlo v mém konkrétním případě.

Jedná se mi o to, že v mé aplikaci mám okno, kam se mi vypisují různé chybové hlášky.

'Chybove hlasky
        Dim traceabilita As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("traca_dbg")
        If traceabilita.Length = 0 Then
            LabelChyby.Text = "Není spuštěna traceabilita!"
            LabelChyby.Visible = True
        Else
            LabelChyby.Visible = False
        End If

Tohle funguje ok. Jenže pokud aplikace běží a spadne PLC do chyby, přeruší se spojení PLC-aplikace a v aplikaci traca_dbg to vyhodí messagebox že bylo přerušeno spojení mezi serverem a aplikací. Po kliknutí na ok se aplikace zavře a je nutno ji znovu nastartovat.

Ale ten počítač je od mistra na lince z dohledu, prakticky k němu nechodí (nemá proč) a pokud resetuje linku zapomíná (hodně často) znovu nastartovat program traceability (ten jsem nedělal já, navíc je v C++ a i když získám source kody, těžko s tím něco asi provedu, na to mé síly začátečníka nestačí)

Takže já potřebuji v mé aplikaci aby kontrolovala, zda ta druhá aplikace nevyhodila nějaký messagebox (jedno jaký, chyb je tam více než dost, takže se jich může vyskytnout více "možná jeden a ten samý jen jiný obsah??") a stejným způsobem to kontrolovat a upozornit mistra, že něco zapoměl.

Teoreticky ani nepotřebuji mesagebox vzdáleně zavřít a podobně. To už si udělá sám. Případně mi aspoň napíše na papírek co to je za chybu :)

Ps: Jak moje aplikace ve VisualBasicu 2008 express edition, tak ta aplikace traca_dbg běží na stejném PC

Díky za pomoc chlapy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, pokud to chápu dobře, tak ve vaší aplikací napsanou v .Net potřebujete zjistit, zda v nějáké uplně jiné aplikaci nedošlo k chybě (a předpokládám že tam aplikace v C++ nemá nějáké COM rozhraní nebo cokoliv podobného co by pomohlo)? Pokud to je tak tak to asi nebude uplně ideální postup, možná by to šlo něják přes win api (nevím, tohle jsem nikdy nedělal) ale řekl bych že to nebude uplně trivialní.

Co na to jít něják z druhé strany? Například vždycky tu aplikaci v céčku preventivně spustit z vaší aplikace. Ale nevím jestli to typ té aplikace takto umožňuje (např. co by se stalo kdyby byla spuštěna 2x pokud to jde atd.) Moc jsem nepochopil jak přesně ta vaše aplikace funguje.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím. Přesně tak. v mé NETí aplikaci chci zjistit, zda ta druhá aplikace nevyhodí nějaký messagebox. Předpokládám totiž, že když ho vyhodí, tak přestane probíhat další kód i když třeba se obnoví spojení s PLC.

Spustit tu aplikaci traca_dbg teoreticky i prakticky spustit z mojí aplikace můžu, ale pořád mi to neřeší to, že když skočí do chyby, tak je pořád spuštěná, ale neběží. Tzn. že neukládá data z vyrobených dílů do souboru. To je jediná funkce té aplikace Traca_dbg. Sbírat data z PLC a ukládat je do souboru.

Na nové obrazovce, co budou mít přímo nad linkou ale bude ta moje aplikace, která bude ukazovat kolik je vyrobeno dílů a podobně + případné chybové hlášky jako například, že ta aplikace pro traceabilitu není spuštěna. A teď chci ještě přidat část, kdy to ukáže, že ta druhá aplikace vyhodila messagebox a neběží.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Napadá mě přidat do traca_dbg nějaké logování při chybě. V místě chybových výpisů se provede zápis do logu (na netu je spousta ukázek, jak v C++ zapisovat do souboru).

No a na .NETí straně bude ona aplikace, která bude periodicky kontrolovat log a bude mít přesné informace závislé na tom, co se vše zapíše (čas, kód chyby, text chyby, atd.). Popř. nějaký servis, který bude na zápisy v souboru upozorňovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdysi jsem zkoušel odchytit HWND pro okno dle textu v baru. Fungovalo to vcelku OK, nicméně u messageboxů se mi to nepovedlo. Možná to bylo mou tupostí nebo něčím jiným, ale prostě to nefungovalo.

'API funkce pro získání kontextu formuláře
hwnd = FindWindow(0&, "Form1")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To by teoreticky šlo, zádrhel je, že zatím nemám od té c++ aplikace zdrojové soubory, aplikaci pro nás dělali ve Francii. Ale je to v jednání, aby nám to poskytly.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tedy než začít vyrábět podobnou zrůdnost, která se bude rozhodovat podle toho, zda-li je zobrazen MessageBox bych raději celou aplikaci přepsal do .NET.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Zrůdnost to není. Prakticky na pozadí mě běží aplikace která se může seknout aniž by to někdo postřehl. V popředí běží moje .NET aplikace, která ukazuje operátorům stav výroby, jestli jsou ve spoždění a podobné věci a pouze tam chci ještě přidat upozornění pro předáka, že program v pozadí, (který sbírá informace z celé výrobní linky a ukládá to do souboru), je v chybě. (třeba právě proto, že spadla linka, muselo se restartovat PLC)

Aby se nestalo to co dneska, příjdu k PC a je tam mesagebox ze včerejška že spadlo PLC. Předák ví co dělat, reset PLC odblokování linky a jede se dál, samo ale že už na pc nepotvrdil mesagebox nerestartoval aplikaci a tudíž se celý den nezbírali data z vyrobených dílů.

A přepsat celou aplikaci....ee velmi složitá. Pro mě. Posílá do PLC "recepty" na výrobu konkrétního výrobku (např. jaká stanice bude co dělat) sbírá informace ze čtecích zařízení (3D matrix), utahovací momenty z elektrických utahováků Dessauter, časy jednotlivých operací. Komunikuje tam zpět s PLC Siemensem, takže bych ještě k tomu musel umět programovat v Simaticu, což neumím.

Ale zkusím nakonec asi využít ten textlog. Protože jsem koukal a při chybě to zapisuje do textlogu. Sice obsahuje i několik informací, které nepotřebuji, ale to už zkusím vyfiltrovat, že pokud tam bude na posledním řádku konkrétní text, tak ho vyhodí.

No nic...Myslel jsem, že to bude snazší :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ke komunikaci dvou aplikací existuje mnoho technologií. Od Windows Messages přes COM až po WCF. Zjišťovat chybové stavy vámi uvedeným způsobem je nepoužitelná prasárna maximálního kalibru, obzvlášť při takové činnosti jako je monitorování stavu software řídícího nějaké stroje.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

možná to je prasárna, ale já neumím programovat, pouze vycházím ze zdejšího seriálu a fora, či komentářů.

Ps: ten software neřídí stroje, jen od nich sbírá informace.

To řízení předávání informací "co se bude vyrábět" jsou prakticky dva "recepty" a ty stejně říkaj na stanici 3 použij čtecí zařízení, na stanici 4 použij utahovák, s programem č.2, musí proběhnout 2x výstup ok, přes ip adresu končící .71 seber informace, na stanici 5 použij čtecí zařízení. Ukonči potvrzením tlačítka validace.

Je jasný, že kdyby to byl program co ovládá nějaké stroje, tak to nechám profesionální firmě a byl by na to daleko jinačí program. Ale tohle jsou víceméně čistě manuální pracoviště a ten "recept" jen říká, co se operátorům má zobrazit na TouchPanelu a co má PLC posílat na vstupy a co má očekávat za výstupy.

Takže vyloženě neřídím něco nebezpečného.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No jestli chcete chybové hlášky číst z texťáku do kterého zapisuje aplikace, tak si ještě dejte pozor na to aby jste tím tu aplikaci sám neshodil. Budet potřeba vychytat aby jste si ten texťák neotevřel zrovna v momentě, kdy do něj ta céčková aplikace bude chtít zapisovat. Škda že to nezapisuje někam na SQL server nebo do nějáké jiné databáze, bylo by to snažší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No k tomu souboru třeba také vůbec nepůjde přistupovat, protože bude uzamčen tou aplikací pro čtení.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Uvidím a vyzkouším.

Každopádně díky za osvětlení situace, že to se základními znalostmi nepůjde :)

Jinak jsem teď řešil trošku jiný problémek a to že nefunguje následující způsob otevření .csv souboru, který jako oddělovač používá ";" Místo toho mi to excel otevře jako by to byl soubor s pevně stanovenýma šířkama buňky(navíc každá jinak široká :) ).

Dim soub1 As String = "c:/treves/traca.csv"
        Dim soub2 As String = "c:/treves/traca1.csv"
        File.Copy(soub1, soub2, True)
        Threading.Thread.Sleep(1500)
        System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
        Dim mojeaplikace As New Microsoft.Office.Interop.Excel.Application()
        mojeaplikace.Visible = False
        mojeaplikace.Workbooks.Open(soub2, Delimiter:=";").Activate()
        mojeaplikace.Workbooks.Open("c:/treves/Export_number.xla")
        Threading.Thread.Sleep(2000)
        mojeaplikace.Quit()

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback