Showing results 1 to 5 of 5

Thread: Dokumentation / Demo / Tutorial zu StratOnCom (K5COM.dll)

  1. #1
    Join Date
    29.07.2007
    Location
    Germany
    Posts
    191

    Default Dokumentation / Demo / Tutorial zu StratOnCom (K5COM.dll)

    Hallo!

    Ich muß unseren VSTA (C#) Wizard, mit dem wir zenon Projekte automatisiert anlegen, für die Programmgenerierung in zenon Logic erweitern.

    Der Umgang mit der Programmierschnittstelle und dem Obejctmodel von zenon ist klar und gut dokumentiert, bei zenon Logic sieht das leider anders aus.

    Die Doku ist rudimentär:

    The Workbench offers a COM interface (K5COM.dll) which sets up on the program automation interface. As the referring object model is developed continuously this description could not be up to date.

    The COM interfac can be use for e.g.:

    declaring variables via a VBA wizard.
    browsing programs or the variable lists.
    automatic programming.
    ...
    This page describes the object model only. All the rest of the information can be looked up in the object library of the used programming environments (e.g. VBA).

    Here you find the object model represented as a tree:

    - StratonCom
    - Project
    - GlobalVariables
    - Variables
    - Variable
    - VarProps
    - VarProperty
    - RetainVariables
    - Variables
    - Variable
    - VarProps
    - VarProperty
    - Programs
    - Variables
    - Variable
    - VarProps
    - VarProperty
    - ProgramContent
    - ProgramObjects
    - GraphicalObject
    - ProgramLines
    - LineObject

    You can use all program automation commands through the shell of the used programming language (e.g. VBA).wer stört

    Beispiele oder Tutorials sind wohl gar nicht vorhanden?

    Kann mir jemand beim Einstieg helfen? Vorhandenes Programm um Bausteinaufrufe erweitern, Deklaration von Bausteinen, Programm kompilieren, Projekt herunterladen...

    Genutzt wird zenon 7.50


    Gruß und vielen Dank!

    H.-P.
    Last edited by hp : 18th April 2016 at 12:44 Reason: Typo
    string zenon = "7.60 Build52515 / 8.00 Build52082";
    string Windows = "7 / 10 / 2012R2";
    string VMware = "Workstation / VMware ESXi";

  2. #2

    Default Re: Dokumentation / Demo / Tutorial zu StratOnCom (K5COM.dll)

    Hello,

    You can find more information in the help of zenon logic editor in the section:
    -> Project Automation Library -> Reference

    Regards,
    Jerome

  3. #3
    Join Date
    29.07.2007
    Location
    Germany
    Posts
    191

    Default AW: Dokumentation / Demo / Tutorial zu StratOnCom (K5COM.dll)

    Hello Jerome,

    I saw the help section "-> Project Automation Library -> Reference ", but how to adapt this to a C#-Wizard in zenon?

    Example:
    paCreateUDFB - Create a User Defined Function Block

    OK := paCreateUDFB (NAME, LANGUAGE)

    Parameter Description
    NAME : STRING; Name of the new function block.
    LANGUAGE : STRING; Programming language (see notes).
    OK : BOOL; TRUE if successful.

    Description
    This function creates a User Defined Function Block in the target project.
    The following values are predefined for the LANGUAGE parameter:

    Value Description
    _LG_FBD Function Block Diagram.
    _LG_LD Ladder Diagram.
    _LG_ST Structured Text.
    _LG_IL Instruction List.

    Example Example
    // create a new program folder
    paCreateProgramFolder ('UDFBs') then
    // create a new sub-UDFB in LD language
    if paCreateUDFB ('FB1', _LG_LD) then
    // and put it in the folder
    paSendProgramToFolder ('F1', 'UDFBs');
    end_if;


    We only use Structured Text (ST) in zenon Logic and here the COM-Interface also seems to have problems...

            public void Macro_zenon_logic_Config_test01()
            {
                string lsProjektPfad = "C:\\zenOnSQL\\zenOn750_SQL2012\\292ed1ba-8a4c-4a3f-9ef4-123b25e651b7\\FILES\\straton\\PLT_Server";
                
                StratOnCom.IProject soProjekt = new StratOnCom.Project();
    
                soProjekt.ProjectPath = lsProjektPfad;
                
                for (int i = 0; i < soProjekt.Programs.Count; i++)
                {
                    if (soProjekt.Programs.get_Item(i).Name == "Main")
                    //if (soProjekt.Programs.get_Item(i).Name == "hp_test")
                    {
                        System.Diagnostics.Debug.Print(soProjekt.Programs.get_Item(i).Language);
                        System.Diagnostics.Debug.Print(soProjekt.Programs.get_Item(i).GetType().ToString());
                        System.Diagnostics.Debug.Print(soProjekt.Programs.get_Item(i).Name);
                        System.Diagnostics.Debug.Print(soProjekt.Programs.get_Item(i).Type);
                        
                        for (int o = 0; o < soProjekt.Programs.get_Item(i).Content.Objects.Count; o++)
                        {
                            System.Diagnostics.Debug.Print("Object " + o + " [ID] " + soProjekt.Programs.get_Item(i).Content.Objects.get_Item(o).Id);
                            System.Diagnostics.Debug.Print("Object " + o + " [Desc] " + soProjekt.Programs.get_Item(i).Content.Objects.get_Item(o).Description);
    
                        }
    
                        for (int l = 0; l < soProjekt.Programs.get_Item(i).Content.Lines.Count; l++)
                        {
                            System.Diagnostics.Debug.Print("Line " + l + " [ID] " + soProjekt.Programs.get_Item(i).Content.Lines.get_Item(l).Id);
                            System.Diagnostics.Debug.Print("Line " + l + " [Desc] " + soProjekt.Programs.get_Item(i).Content.Lines.get_Item(l).Description);
                        }
                    }
                }
                soProjekt = null;
    
                System.Diagnostics.Debug.Print("...fertig!");
            }

    Result for FBD:

    FBD
    System.__ComObject
    hp_test
    MAIN
    Object 0 [ID] 2
    Object 0 [Desc] VAR 15 5 ein_1
    Object 1 [ID] 6
    Object 1 [Desc] BOX(2,1) 30 5 &
    Object 2 [ID] 7
    Object 2 [Desc] VAR 15 8 ein_2
    Object 3 [ID] 8
    Object 3 [Desc] VAR 38 6 aus_1
    Line 0 [ID] 1
    Line 0 [Desc] ARC 2:0 6:0
    Line 1 [ID] 2
    Line 1 [Desc] ARC 7:0 6:1
    Line 2 [ID] 3
    Line 2 [Desc] ARC 6:0 8:0
    ...fertig!

    Result for ST:

    ST
    System.__ComObject
    Main
    MAIN
    ...fertig!

    string zenon = "7.60 Build52515 / 8.00 Build52082";
    string Windows = "7 / 10 / 2012R2";
    string VMware = "Workstation / VMware ESXi";

  4. #4
    Join Date
    13.08.2013
    Posts
    57

    Default Re: Dokumentation / Demo / Tutorial zu StratOnCom (K5COM.dll)

    Hi,
    im Moment wird an einem Demo und Tutorial für genau deinen Anwendungsfall gearbeitet. Leider habe ich mit der StratOnCom noch keine Erfahrung, aber es gibt auch eine Alternative=>
    Das Invoken der Prompt und direktes schreiben in die Files.
    Die Befehle der Prompt findest du unter
    IEC 61131-3 Programming Environment -> Tools -> The console
    Zum Invoken habe ich eine Hilfsklasse gebaut.
     class K5PrpHelper
        {
            //[DllImport(@"C:\Program Files\COPA-DATA\zenon 7.11 SP0\K5Prp.dll", CallingConvention = CallingConvention.StdCall)] 
            [DllImport("K5Prp.dll", CallingConvention = CallingConvention.StdCall)]
            private static extern IntPtr K5PRPCall(string szProject, string szCommand, ref uint dwOk, ref uint dwDataIn, ref uint dwDataOut);
    
            private String projectPath;
    
            /// 
            /// K5PrpHelper Constructor
            /// 
            /// Logic project path
            public K5PrpHelper(String pProjectPath)
            {
                projectPath = pProjectPath;
            }
    
            /// 
            /// Executes a prompt command
            ///  
            /// Prompt command to execute
            /// Return message
            /// True on success, False on error
            ///   
            public Boolean ExecutePrompt(string pPromptCommand, out String pRetMessage)
            {
                try
                {
                    uint dwOk = 0;
                    uint dwDataIn = 0;
                    uint dwDataOut = 0;
    
                    IntPtr result = new IntPtr();
                    result = K5PRPCall(projectPath, pPromptCommand, ref dwOk, ref dwDataIn, ref dwDataOut);
    
                    pRetMessage = Marshal.PtrToStringAnsi(result);
                    Boolean executedSuccessfully = Convert.ToBoolean(dwOk);
    
                    return executedSuccessfully;
                }
                catch (Exception ex)
                {
                    pRetMessage = "DLL Call/API Error...";
                    Debug.Print("K5Prp.dll call error: " + ex.Message);
                    return false;
                }
            }
        }
    Hier muss sichergestellt sein das die K5Prp.dll in x86 oder x64 zur Verfügung steht. Ein Aufruf zum erstellen eines neuen ST-Programms kann so aussehen

     //Create the program (may already exist, so dont react on this "error")
                if (!k5Helper.ExecutePrompt("CreateProgram ST " + LOGIC_PROGRAM_NAME, out pRetMessage))
                {
                    Debug.Print(pRetMessage);
                }
    Da Projekte/Files manipuliert werden sollte die zenonLogic Workbench in dem Moment nicht laufen.

    private Boolean checkForOpenWorkbench(String pLogicProjectName)
            {
                Process[] proc = Process.GetProcessesByName("W6Main");
    
                foreach (Process p in proc)
                {
                    if (p.MainWindowTitle.Contains(pLogicProjectName))
                        return true;
                }
                return false;
            }

    Variablen könne ebenfalls über die Prompt erstellt werden "CreateVar".

    Sollte die Variablen für zenon sichtbar sein muss die Fieldbuskonfig bearbeitet werden.
     private Boolean createFieldbusConfigurationLogicToZenon()
            {
                try
                {
                    IniFile k5zenonRT = new IniFile(Path.Combine(logicProjectPath, @"__K5zenonRT.cfg"));
    
                    k5zenonRT.IniWriteValue("LVL1", "VERSION", "1");
                    k5zenonRT.IniWriteValue("LVL1", "ID", "1");
                    k5zenonRT.IniWriteValue("LVL1", "#F", "-8");
                    k5zenonRT.IniWriteValue("LVL1", "ZENON_FAILURE_DETECTION", "30");
                    k5zenonRT.IniWriteValue("LVL1", "NEXTID", "2");
                    k5zenonRT.IniWriteValue("LVL1", "DLLVERSION", "0");
                    k5zenonRT.IniWriteValue("MAIN", "DLLNAME", "K5zenonRT");
    
                    k5zenonRT = null;
    
                    return true;
                }
                catch (Exception ex)
                {
                    Debug.Print(@"Errow writing __K5zenonRT.cfg: " + ex.Message);
                    return false;
                } 
            }

    Der SourceCode wird jetzt direkt ins entsprechende File geschrieben. Wichtig sind 2 Sachen, beim Schreiben Encoding.Default explizit verwenden z.B. File.WriteAllLines(srcFile, lines.ToArray(), Encoding.Default); da sonst die Umlaute nicht richtig interpretiert werden und Variablen in geschweifte Klammern {}, falls jemand auf die Idee kommt eine Variable mit dem Namen "x:=1;" zur erstellen...


     private bool writeToSourceFile(String pInstanceName, String[] pNewCodeLines,String pProgramName ,out String pRetMessage)
            {
                DebugLog.getinstance().CreateLogEntry("Write To Source");
                String srcFile;
                List lines;
                getSourceLines(pProgramName, out srcFile, out lines);
    
                //Check if there is already a code block for the given instance
                Int32 lineIndex = getLineIndex(lines, pInstanceName);
    
                //If yes, exchange the lines of code 
                if (lineIndex != -1)
                {
                    for (int i = 0; i < pNewCodeLines.Count(); i++)
                    {
                        lines[lineIndex + i - 1] = pNewCodeLines[i];
                    }
                }
                //Otherwise append at the end
                else
                {
                    for (int i = 0; i < pNewCodeLines.Count(); i++)
                    {
                        lines.Add(pNewCodeLines[i]);
                    }
                }
    
                //Write the changed source file
                File.WriteAllLines(srcFile, lines.ToArray(), Encoding.Default);
                
                DebugLog.getinstance().CreateLogEntry("Written");
                pRetMessage = "";
                return true;
            }
    
    private void getSourceLines(String pProgramName, out String pSrcFile, out List pLines)
            {
                //Read the source file
               pSrcFile = Path.Combine(logicProjectPath, pProgramName + @".src");
               pLines = new List(File.ReadAllLines(pSrcFile));
            }

    Wenn alle Programme, Variablen,SourceCode erstellt wurden muss noch der Kompiler angetriggert werden. Der ist als KB5.exe im zenon Installationspfad und kann folgendermaßen aufgerufen werden.

     public bool compileLogicProject(out String pRetMessage)
            {
                lock (mylock)
                {
                    string currentVersionPath = ProgrammDir + VERSION;
                    var x = Registry.LocalMachine.OpenSubKey(subkey).GetValue(currentVersionPath);
    
                    //Get the path for the K5B.exe (for zenon logic compile)
                    String k5bExePath = Path.Combine(x.ToString(), "K5B.exe");
                    if (!File.Exists(k5bExePath))
                    {
                        pRetMessage = "MgK5BuildExeNotFound";
                        return false;
                    }
    
                    ProcessStartInfo processStartInfo = new ProcessStartInfo(k5bExePath, String.Format("BUILD {0}", logicProjectPath));
                    processStartInfo.CreateNoWindow = true;
                    processStartInfo.UseShellExecute = false;
                    processStartInfo.ErrorDialog = false;
                    processStartInfo.RedirectStandardOutput = true;
                    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    
                    Process process = new Process();
                    process.StartInfo = processStartInfo;
    
                    if (!process.Start())
                    {
                        pRetMessage = "MgProgramNoCompile";
                        return false;
                    }
    
                    StreamReader outputReader = process.StandardOutput;
                    String outputString = outputReader.ReadToEnd();
                    String[] outputLines = outputString.Split(new[] { '\n' });
    
                    pRetMessage = outputLines[outputLines.Count() - 2];
    
                    process.WaitForExit();
    
                    if (File.Exists(Path.Combine(logicProjectPath, "APPLI.XTI")))
                    {
                        if (File.GetLastAccessTime(Path.Combine(logicProjectPath, "APPLI.XTI")).AddSeconds(10) > DateTime.Now)//wenn dieses File geschrieben wurde hat das kompelieren geklappt.
                        {
                            pRetMessage = "MgProgramCompiledSuccessfully";
                            return true;
                        }
                        //old file exists (current compile failed)
                        else
                        {
                            pRetMessage = "MgProgramNoCompile";
                            return false;
                        }
                    }
                    //no file found, program was not compiled
                    else
                    {
                        pRetMessage = "MgProgramNoCompile";
                        return false;
                    }
                }
            }

    So das waren mal die ersten Ansätze, ich hoffe es hilft dir weiter.

    Lg Sigi
    Last edited by sntech : 28th April 2016 at 08:03

  5. #5
    Join Date
    29.07.2007
    Location
    Germany
    Posts
    191

    Default AW: Dokumentation / Demo / Tutorial zu StratOnCom (K5COM.dll)

    Hi Sigi,

    erst mal Danke und Respekt für die ausführlich und fundierte Antwort!
    Ich werde mir deinen alternativen Ansatz über die Konsole ansehen, stecke aber die nächsten Tage noch in anderen Bereichen des Projektes fest... Werde Rückmeldung geben...

    im Moment wird an einem Demo und Tutorial für genau deinen Anwendungsfall gearbeitet.
    Freut mich zu hören, dass in dieser Richtung etwas läuft. Wir haben uns bei deinen Kollegen im Deutschland schon einen Namen gemacht nach Dingen oder Wegen zu Fragen die es noch nicht gibt

    Gruß, H.-P.
    string zenon = "7.60 Build52515 / 8.00 Build52082";
    string Windows = "7 / 10 / 2012R2";
    string VMware = "Workstation / VMware ESXi";

Similar Threads

  1. New Science Package Software & Tutorial available!
    By ralff in forum zenon Science Package for LEGO MINDSTORMS
    Replies: 0
    Last Post: 31st July 2014, 09:22
  2. Dokumentation/Hilfe für VB.Net
    By and12121 in forum VSTA
    Replies: 1
    Last Post: 27th February 2014, 15:02
  3. Zenon 6.51 license vs. Demo mode
    By rbfernandez in forum zenon Operator
    Replies: 2
    Last Post: 30th November 2012, 08:45
  4. i can't open the demo
    By zhangbb_dimension in forum zenon Supervisor
    Replies: 2
    Last Post: 4th May 2012, 07:31

Posting Rules

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •