You need to create an array with one element for each possible user. I usually define these arrays in the root screen. FrameIndex : Array [0..MaxUsers] OF INT; Then use the global CurrentClientId (defined by one of the VISU libraries) to index the array element used to select the frame. FrameIndex[CurrentClientId]
I use frames to build my own widgets. Generally a widget corresponds to a function block so that I can just pas a reference to the function block and the widget then has access to all of the function blocks data. Higher level function blocks have Param and Meta data structures that are passed to popup dialogs. The popups create a temporary instances of passed in function block references, which causes us some minor problems. I create my own custom graphics and heavily use the basic geometric shapes...
If you are starting with IEE754 (a codesys REAL type) then you could use "SomeString := TO_STRING(UrRealVal);" Probably it would be better to put "UrRealVal" into a TextVariable field and a format (i.i. %2.3f) in the Text field of a viosualization element.
When I ran Codesys 3.5.18.2 today the splash screen was displayed and then disappearedas normal but after that nothing is displayed. There is a codesys task in windows task manager but it's idle. Nothing had changed on my computer. I had been using Sp18.2 6 hours earlier, exited codesys and shut down the computer properly etc, in the evening. In the morning started the computer ran codesys but it failed to start as described above. Anyone else have a similar problem or ideas of what may be going...
I had the same problem and had to revert back to 18.2 to solve it.
Each column has its own properties. You may need to check the "Use Template" box to enable full property edits.
In the properties box goto TextProperties=>Format and select Line-Break for the cell. Then youn should be able to do ctrl-enter to get multiple lines.
Thank you very much for your explanation. I think I have a pretty good understanding of what you have done. Thanks.
Essentially you have to do the "session management" yourself. Any variables used to manage screens/sessions need to be arrays indexed by the client id. For example I've declared the following variable on one of my main screens. The screen contains a Frame set and I use Frame[VisuElemBase.CurrentClientId] to select the desired frame. Each client has its own id an so each can be independently viewing frame. VAR Frame : ARRAY [0..gHMI.MAXCLIENTS] OF USINT; END_VAR The same has to be done for any variables...
Hi zastortow, I would love t know how you did this. Can you give some insight here or post something. Thanks.
I'm going all in with Obsidian to create library documentation. There are a couple of plugh-ins that use Pandoc to export to various formats, including restructured text. The only other option worth considering is to use VSCODE to edit restructured text directly. The editor is not quite as nice as obsidian and it's still necessary to cut the text from a separate file an paste into a POU header.
I'm going all in with Obsidian to create library documentation. There are a couple of plughins that use Pandoc to export to various formats, including restructured text. The only other option worth considering is to use VSCODE to edit restructured text directly. The editor is not quite as nice as obsidian and it's still necessary to cut the text from a separate file an pase into a POU header.
I recently began using Obsidian (https://obsidian.md/), to organize my project spaces and the various bits of information about the project. It's open source and has a very very nice markdown editor, that provides an immediate preview. I've also recently read up on Docutils and Sphinx and it seems that they now also support markdown, in addition to reStructuredText. I am curious if the library documentation generator, which I understand is based on Sphinx/Docutils, is also able to handle markdown...
I recently began using Obsidian (https://obsidian.md/), to organize my project spaces and the various bits of information about the project. It's open source and has a very very nice markdown editor, that provides an immediate preview. I've also recently read up on Docutils and Sphinx and it seems that they now also support markdown, in addition to reStructuredText. I am curious if the library documentation generator, which I understand is based on Sphinx/Docutils, is also able to handle markdown...
On several different occasions, I've had the V18.2 Ide become unresponsive while editing a structured text function block. The hour glass comes on, the screen goes light gray, and the title bars says "not responding". Everything is fine up until the last key press and then the ide becomes non-responsive forever, and everything since the last :Save" is lost. Is this a known issue?
I need to be able to do this also but need some help getting the ClientData. Can anyone provide some clues as to the currently recommended methodology. Currently we are using SP16.4 per PLC mfg's compatibility requirements. Thanks
Hi Marcel, We are still working this problem. We have been working with Scott (Codes Tech Support) and now have a clean and stable project but we can still reproduce the download failure. It seems to be releated to exceeding some number of frames or frame references. We have sent example projects back to Scott and will be working with him tomorrow. However, I was wondering, if you know if there is a liomit of the number of frames or frame references within a project. We know about the 21 Frame limit...
Ok, I see that I can't send a PM to you. Unfortunately I don't have permission to post the project in a public forum. I believe my client is going to open a support ticket and proceed that way. I appreciate all your help on the forum very much. Unfortunately I am unable to recreate this problem with a stipped down project. Feel free to let me know if there is a more private method of sending the project to you. Best Regards Rick
Thanks for the offer Marcel. My client and I have been working with the vendor, IFM, on this problem for the past week. We eliminated several potential causes of this problem (i.e. exceeding the 21 frame limit, initialization slot usage, etc) but the problem still persists. My client has missed his shipping date and it's important to make progress on this problem. The client has given me permission to send you a project to look at. Because the problem seems to only occur after some number of visualization...
I have been having a problem with failed downloads for the past several days. I thought I had resiolved tyhe problem and attributed it to some corrupted data in a visu frame. However, 2 days later the symptom has not returned as follows. 1) I created a visu screen with a VAR_INPUT section consisting of two BOOLS, In and Blink. The Visu contains two circle elements having radial gradient colors. The In input is used to make one of the circles invisible. The Blink input selwects Normal/Alarm colors...
We have been making great use of the initialization slot mechanism. The only downside is that bugs are extremely difficult to identify and locate. Often such bugs result in runtime exceptions leaving the log entries blank, with the only recourse being to remove code until the bug disappears and then add code back in. This can be slow and laborious as you masy well imagine. Is there another debug method that is recommended or that can be used? I would also like to humbly suggest a couple of possible...
They seem to have rematerialized. So there is no longer a problem but any insight about this would be be useful. Thanks.
After upgrading to SP17 the alignment enumerations have disappeared (i.e. VisuEnumHorizontalAlignment and VisuEnumVerticalAlignment). Are they now located in a different library or have a different name? I'm setting alignments using a variable that's passed into the visu via a frame set. I need to know the enum values and the enum data types so that I can declare variables and set their values..
After upgrading to SP17 the alignment enumerations have disappeared (i.e. VisuEnumHorizontalAlignment and VisuEnumVerticalAlignment). Are they now located in a different library or have a different name? I'm setting alignments using a variable that's passed into the visu via a frame set, so I need to know the enum values.
Ah! ha! I found the problem. During the conversion process the user and group data was not migrated to the new project space. Apparently user management is not displayed in the menu when there are no users or groups. So all is good now. ;)
I upgraded a project to 17.1 and now the user management dialogs are no longer available in the Input Configuration menu in the property window. Screen captures of my libraries, the input configuration menu and compiler warning are attached. Any ideas of how to correct this?
When building a a projecty for an IFM Ecconomat contrtoller I get the following error message. " B111RS_Sp16.4_V0.0.22 KhIfmConversion3: C0136: Ambiguous use of name 'LinearMemoryManager' " This can be traced to two following codesys libraries. CDS_MemMan - codesys memory manager, 3.5.12.0 (3s - smart software solutions gmbh) VsuElemBase - visuelembase, 3.5.16.30 (system) As far as I can tell these are both codesys (i.e. 3S) libraries. Why are these libraries designed to be mutually exclusive and...
You can write data to a "REFERENCE TO" defined as a VAR_INPUT as well as using REF= to make it reference a different object.
The official answer is to use the VAR_IN_OUT_AS_POINTER attribute a described in the help. I sometimes have trouble getting this to work and instead pass in parameters as 'POINTER TO' or 'REFERENCE TO' data types. https://help.codesys.com/webapp/_visu_pragma_var_in_out_as_pointer;product=core_visualization;version=3.5.17.0
You could do something similar by using a table component and populating/formatting appropriately.
This appears to work as advertised. However, a visualization screen active in the ide before the reset remains offline after the reset is complete and the PLC come back online. This behavior has been observed before but had occured only occasionally/randomly. However, this behavior reproducible every time using this method of reset and would appear to be a visualization bug. I wonder if it's necessary to do more to ensure that the previously active visu screen comes back online after these reset...
The CmpApp library seems to support this functionality. The online help topic below explains what to do. Basically, the CmpApp.AppReset() function is called to perform a Warm/Cold reset, leaving the controller offline. A 'StopDone' event triggered task is defined that executes the CmpApp.AppStartApplication() function to bring the controller back online. https://faq.codesys.com/display/CDSFAQ/Automatic+Restart+of+the+Application+after+Resetting+from+IEC+Code
We've made effective use of the init slot mechanism in our projects. In our most recent project, the end user is able to configure a number of software objects at runtime, however, such configuration is dependent on sequential execution of methods assigned to initialization slots. I'm looking for a way to retrigger the initialization process from PLC code (visu button press probably), that execute the initialization process that occurs after a warm reset. There was mention of a PLC Control Library...
Every so often questions popup about using enums in visualizations or about how to cast to an enumerated type. Here are a couple of tips that some here may find useful. First of all, as far as I know, there is no codesys conversion or cast to enumerated types. The workaround is to remove the 'strict' attribute from the enum declaration and then use the underlying integer implementation (usually UDINT by default?). The other thing that is very convenient is to use the 'to_string' attribute in the...
I appologize for showing my frustration in the previous post. My client is currently in the field comissioning the project and this is an inconvenient time to find out this issue. I would like to learn more about this so I can evaluate how deeply the current project is affected. My concerns are as follows: Coding ability within the context of a screen is very limited. How would the Frame element check CURRENTCLIENTID against the array's upper boundary? Where in the Frame element to put this code...
"The correct way is to declare an ARRAY OF INT and use the CURRENTCLIENTID to write to a clientspecific index" If I understand correctly, it's entirely up to us to provide and manage the context for each each session. It would be necessary for all frame interface variables (i.e. VAR_IN_OUT) to also be arrays. Upgrading screens for the current and future projects would be a non-trival task requiring significant effort. Can you confirm this is the case or otherwise opine on the subject? It's difficult...
"The correct way is to declare an ARRAY OF INT and use the CURRENTCLIENTID to write to a clientspecific index" If I understand correctly, it's entirely up to us to provide and manage the context for each each session. It would be necessary for all frame interface variables (i.e. VAR_IN_OUT) to also be arrays. Upgrading screens for the current and future projects would be a non-trival requiring significant effort. Can you confirm this is the case or otherwise opine on the subject? It's difficult to...
I have a navigation system where the main menu uses the "Change Shown Visualization" mechanism to switch screens. Each of these screens have a sub-menu that uses the Frame switching mechanism to switch sub-screen content. This used so that function block and other references can be passed to the selected screen. The frame switching variable is declared as part of the main screen (i.e. the one displayed via "Change Shown Visualization") and is called Frame (for obvious reason). Navigation buttons...
Hi Marcel, VAR_INPUT Path : STRING; END_VARcode SysFile.SysFileGetPath('$$PlcLogic$$/$$visu$$',Path,80); // Returns Path ='%ProgramData%/CODESYS/Simulation/PlcLogic/visu/' Placing "file://%ProgramData%/CODESYS/Simulation/PlcLogic/visu/" into codesys embedded browser URL field displays the following: Codesys Embeded Browser: Canβt reach this page β’Make sure the web address is correct β’Search for this site on Bing β’Refresh the page Placing "file://C:/ProgramData/CODESYS/Simulation/PlcLogic/visu/" into...
Hi Marcel, VAR_INPUT Path : STRING; END_VARcode SysFile.SysFileGetPath('$$PlcLogic$$/$$visu$$',Path,80); // Returns Path ='%ProgramData%/CODESYS/Simulation/PlcLogic/visu/' Placing "file://%ProgramData%/CODESYS/Simulation/PlcLogic/visu/" into codesys embedded browser URL field displays the following: Codesys Embeded Browser: Canβt reach this page β’Make sure the web address is correct β’Search for this site on Bing β’Refresh the page Placing "file://C:/ProgramData/CODESYS/Simulation/PlcLogic/visu/" into...
Thanks Marcel. I still haven't figured out how to use the placeholder $PlcLogic$/$visu$ but you have given a very helpful about SysFile. If I embed an external file I can use SysFileGetPath('/App/Filename',Path,80) to get the path where it's stored. I can then compose a string containing the full path+filename for tyher browser. For anyone else interested a code snippet below: VAR // Path will contain full path minus file name Path : STRING; // Application - name of application in object tree //...
Thanks Marcel. I still haven't figured out how to use the placeholder $PlcLogic$/$visu$ but you have given a very helpful about SysFile. If I embed an external file I can use SysFileGetPath('/App/Filename',Path,80) to get the path where it's stored. I can then compose a string containing the full path+filename for tyher browser. For anyone else interested a code snippet below: VAR Path : STRING; Filename : STRING:='Config.csv'; END_VAR SysFile.SysFileGetPath(Filename, Path, 80);
How to get the contents of the placeholders? Placing them in the visu browser element's URL doesn't seem to work. Does this only work when executing shell command via windows/linux OS? I wish to display documents on a visualization screen using the html brwser element. Is there a way to get the placeholder contents into a PLC stgring variable?
I want to embed HTML and/or PDF doicumentation files into a project and then access them from a visualization screen using the HTML browser component. Is there a global variable or system function that contains/returns the project's root directory on the tagret runtime? I know I can poke around with a file manager and emperically find the path but thios is different for simulation builds than for live PLC builds and I suspect it could vary from one vendor PLC to another. I would like to find a solution...
Thanks. Me and kitty appreciate your help very much.
My kitty, Coquito, aspires to be a programmer and likes to push the keyboard keys and chase my mouse. While I was away from the computer he took the opportunity for practice. Now the IDE is displaying symbols for white space characters. I don't know how to turn this off. I keep asking him what he did to make it this way but he won't talk. ;) Surely it must be something very simple to do. Can someone here give me a clue? ;)
The workaround I use is to have ALL button presses set a global variable. A timeout FB uses this value to reset a TON timer and then resets the flag for next scan. I sure would be convenient to have a built-in flag and the ability to execute the timer within the context of a client session. In other words have session/client events such as EveryScan, SessionInit, etc in which one could declare variables/FBs and execute code. Most, if no all, Iterate Client stuff would be unnecessary.
When editing visu properties I find my self constantly switching between mouse and keyboard. Most of the time returning to the mouse is to open a field for editing. Is there a keyboard shortcut that opens the currently highlighted field for edit? I know you can simply type or paste data into a field, however, afterward the field is not open for edit. One must return to the mouse to open the field and then back to the keyboard for the edit. Being able to open a field for edit from the keyboard would...
When editing visu properties I find my self constantly switching between mouse and keyboard. Most of the time returning to the mouse is to open a field for editing. Is there a keyboard shortcut that opens the currently highlighted field for edit? I know you can open a field for edit by simply typing or pasting data into the field, however, afterward the field is not open for edit. One must return to the mouse to open the field and then back to the keyboard for the edit. Being able to open a field...
"In the other program you can nest structures in data block/other structures, and in Codesys you can't do it." Codesys does support nested STRUCTs as shown in the example below. Not sure where you went wrong but there is one quirk to be aware of. Codesys (sometimes or always?) doesn't compile and include entities in the build. Consequently, at least one variable defined in your GVL needs to be accessed in an executing program in order to view the GVL while Online. TYPE sSub : STRUCT Value : INT;...
"In the other program you can nest structures in data block/other structures, and in Codesys you can't do it." Codesys does support nested STRUCTs as shown in the example below. Not sure where you went wrong but there is one quirk to be aware of. Codesys (sometimes or always?) doesn't compile and include entities in the build. Consequently, at least one variable defined in your GVL needs to be accessed in an executing program in order to view the GVL while Online. TYPE sSub : STRUCT Value : INT;...
"In the other program you can nest structures in data block/other structures, and in Codesys you can't do it." Codesys does support nested STRUCTs as shown in the example below. Not sure where you went wrong but there is one quirk to be aware of. Codesys (sometimes or always?) doesn't compile and include entities in the build. Consequently, at least one variable defined in your GVL needs to be accessed in an executing program in order to view the GVL while Online. TYPE sSub : STRUCT Value : INT;...
"In the other program you can nest structures in data block/other structures, and in Codesys you can't do it." Codesys does support nested STRUCTs as shown in the example below. Not sure where you went wrong but there is one quirk to be aware of. Codesys (sometimes or always?) doesn't compile and include entities in the build. Consequently, at least one variable defined in your GVL needs to be accessed in an executing program in order to view the GVL while Online. // Create sub STRUCT TYPE sSub :...
Create sub STRUCT TYPE sSub : STRUCT Value : INT; END_STRUCT END_TYPE Create main STRUCT TYPE sMain : STRUCT Value : INT; SubVal : sSub; END_STRUCT END_TYPE Declare and Initialize in GVL VAR_GLOBAL NestedStruct : sMain := (value:=1, SubVal:=(Value:=2)); END_VAR Access any variable declared in GVL from a program attached to a task, otherwise compiler doesn't bother to compile it. Main_PROG VAR Val : INT; END_VAR VAL := NestedStruct.SubVal.Value; END Compile and go Online to see GVL data
Thanks Marcel and rckalex for all the info. Marcel, Just wondering, wouldn't all this be much easier to do if one could attach code at session/client, screen, and element levels as many other HMI systems do. For example, to create a client timeout one would just put a timer and a change screen command in a program having context/scope within a client. Same for screens and for elements. It would make all the "not calling from visu task crashes" go away, would it not? Anyway thank you for the help...
Thanks Marcel and rckalex for all the info. Marcel, Just wondering, wouldn't all this be much easier to do if one could attach code at session/client, screen, and element levels as many other HMI systems do. For example, to create a client timeout one would just put a timer and a change screen command in a program having context/scope within a client. Same for screens and for elements. It would make all the "not calling from visu task crashes" go away, would it not? Anyway thank you for the help...
Yes, examples would be very helpful.
Marcel, Thank you so much! I have been wanting to know how to do this for almost a year. That is exactly what I was looking for. It works perfectly. Marcel, I owe you a big beer for this. Best Regards Rick
Ok, I've been able to make the code snippet below to work, to get the group name for each active session. However, how would an active screen determine in which session it is being displayed? VisuElems.g_ClientManager.BeginIteration(); WHILE (VisuClient := VisuElems.g_ClientManager.GetNextClient()) <> 0 DO IF (VisuClient^.GlobalData.ClientType = VisuElems.Visu_ClientType.TargetVisualization) THEN VisuElems.g_VisuManager.SetMainVisu(VisuClient,HomeScreen); END_IF CurrentUserGroupName[GroupCnt] :=...
I have implemented a visualization table containing references to configuration and tuneup parameters for my client. The visualization's user management consists of several login groups, only some of which are permitted to modify table values. I am able to implement this functionality minimally using the "Access Rights" property. When inputs are disallowed in this way, the table colors are modified as an indication. The problem is that there is no control over the color selection and the colors automatically...
Here is a snippet of my code used for an "auto return to home screen" function. It's based off the codesys "Key Switch Login" example project which is also attached. It's a bit challenging in that there is no session execution context making it necessary to first get a reference to the session, which is more complicated than necessary and sparsely documented IMHO. VisuClient : POINTER TO VisuElems.VisuStructClientData; // Iterate over all currently active target visualization clients // IMPORTANT:...
We are having trouble resolving "Invalid Paint Command" warnings in the log file. As you likely already know, it's very difficult to identify the source of these warnings. Typically, it's necessary to resort to brute force methodology where portions of the project are removed until the warnings are no longer present. In our current project, everything was removed but the warnings remain. I've created a new pristine project and have added only one visualization screen with one rectangle element on...
Hi Marcel, What is the status of this issue? Has it been resolved? I have a client who would very much like to make use of this capability. Best Regards Rick
Create a visualization object and set its properties to "Dialog" Create a button, InputConfiguratioin=>OnMouseDown=>OpenDialog
Is 'Application.ST1.xSensorPresence' defined? Is ST1 a GVL? Post a screen cap of where it's defined.
Is 'Application.ST1.xSensorPresence' defined? Is ST1 a GVL? Post a screen cap of where it's defined.
Where/how is 'Application.ST1.xSensorPresence' defined?
Thanks Marcel. I will certainly look into it for my next project. The current one is a bit too far along and I have already introduced enough new features on this project. Thanks Rick
Thanks for the quick reply. That's great news and will be anxiously awaiting for this feature.
Thanks for the quick reply. That's great news and will be anxiously awaiting for this feature.
Client and I are making great use of popup dialogs to show additional information and for entering configuration and tuneup data. I'd like to take this technique to the next level where the end user would be able to drag a popup to a convenient location so it's not blocking critical information on the main screen behind. This can be very useful, in that instead of cluttering a given screen with as much as possible, one could simply provide and over view widget (i.e. some combination indicators) which...
Is there a way to select the popup keypad's language/country/laytout? There are several topics in the forum but they are nearly a decade old. Could someone provide more recent information? Thanks.
Here are some youtube tutorials you may find helpful. https://www.youtube.com/results?search_query=codesys+visualization+tutorial
Here are some youtube tutorials you may find helpful. https://www.youtube.com/results?search_query=codesys+visualization+tutorial
Is this a bug or correct behavior? If correct behavior then can someone explain why? I am working with a client who is making good use of this feature and I would like to give them a satisfactory when they ask me the above questions. We have an adequate work around so that's not a problem. However, they and I would like to have a better understanding of what's going on here and why. We want to have confidence that we are producing robust and quality applications for my client's customers. Any insight...
Example Project
I created a function block to initialize its Path string variable to the function block's path using the appropriate attribute pragmas as shown below. An instance of this function block in the main program is initialized to the correct and expected path. {attribute 'reflection'} FUNCTION_BLOCK PathTestFunctionFB VAR {attribute 'instance-path'} {attribute 'noinit'} Path : STRING(255); END_VAR I created a second function block in the same manner that also contains an instance of the first. An instance...
I created a function block to initialize its Path string variable to the function block's path using the appropriate attribute pragmas as shown below. An instance of this function block in the main program is initialized to the correct and expected path. {attribute 'reflection'} FUNCTION_BLOCK PathTestFunctionFB VAR {attribute 'instance-path'} {attribute 'noinit'} Path : STRING(255); END_VAR I created a second function block in the same manner that also contains an instance of the first. An instance...
Thanks i-campbell, that was exactly it! Updated and everything ids all good...
I opened and a previously existing project with V16.1 and selected the latest compiler version. I got the error message below instructing me to update the visualization profile. Does anyone have any idea how to do the update? This project is in the early stages and I'm the early stages of creating the basics from client's previous project. I could start from scratch without wrecking development but I would like to understand this situation better. Thanks Rick Your current visualization profile does...
Thanks all. I'll checkout SysTarget library. .
Is there a way to get basic hardware information from the runtime? I am making automated tests that measure execution time and would like to record CPU/Processor type, clock speed, and the amount of RAM. I'm mostly interested in the standard Win3 (x86 and x64) runtimes, although others would be useful as well.
Try placing a blank line between. Blank line is recognized in reST as a paragraph break.