You can Count it on your own. https://forge.codesys.com/forge/talk/Deutsch/thread/f14041c158/?limit=25#9c5f
Within this post I shared my Program (not the Code-Sniped, but the Project to download)
Here I Iterate all clients and read out some information. You can also geht som Usier-Info (Current logged In user for the different Clients)
So try e.g. If Current logged in user <> '' Then count+1
Or you use the code-sniped and use "pClient^.GlobalData.CurrentUserName" Inside the Iteration
e.g.
codeIfpClient^.GlobalData.CurrentUserName<>''THENiCountUser:=iCountUser+1;ELSEiCountUser:=iCountUser-1; //avoid to get a negativ valueEND_IF
Last edit: Chris.O 2020-06-02
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
in this post https://forge.codesys.com/forge/talk/Deutsch/thread/91a22bbea1/#8506
you can find a project to login from IEC code. After creating two user groups in the usermanagement, maybe this is a other simple way to allow or disable user inputs on specific clients and visu objects. I can't use the currentvisuvariable in my project, so I login or out the right user during the iteration for synchronisation or check if the right user is logged in, as Chris.O described.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
For those who suggest using hardwired buttons, it is not possible in my application. There are many "manual" buttons and our HMI should be mobile. You have to Walk around the site in order to operate different sections. It is not possible to put multiple panels around, because then we will need tens of them...
One of the reasons we have chosen Codesys for our application is the versatility and high end technology it introduce. I think that asking a button to stop operating in case of connection loss is mandatory. We achieve this with much much simpler HMIs easily.
In era where car drives themselves and robots are working next to humans, you can ask to operate a system with a touch screen button without being afraid it will get stuck...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
May that will be a topic for the CoDeSys development to give a general solution without workaround like discussed here... May you should create a support-Ticket.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
We are currently trying to figure out how to detect if a webvisu is in focus or not on specific clients. Has anyone been able to make ground with this?
Any direction is appreciated.
Thank you
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I've searched for this too and wasn't able to find a usable value or bit. The only thing i can imagine is, that 3S has to enhance the webserver with such a function, because there are possibilities in HMTL and java to detect if the browser application with webvisu is in focus or not.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Yes we've come across the html/java methods as well. Do you know if it would be possible to run a html/java script internally or externally of the PLC that could detect the focus? Then we could make one of the variables accessible by a script inside the Codesys program?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I really hope 3S will take care of this issue, as it seems to be a drawback for many users.
Meanwhile, my solution is a bit complicated but its the only one I could come up with:
I'm building an Android app with a webpage inside that runs the webvisu, and has a modbus server running, that keeps updating the PLC when the activity is in focus. Once the activity loses focus, the modbus stops shooting, and release every tap button that was pressed.
It is still in development, so I can't share it, but it's an idea for those who crave for solution...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I'm not sure if i understood your problem correctly... you want to know if a client opened a specific page?
For that I created a function which I called inside the Visualization inside a invisible dummy element.
Here you can e.g. call a function (e.g. for chage color...no matter) which is changing a bit of a global variable to TRUE.
Inside your code you can use this variable and set it back to FALSE. So every time when your visu is opended... your function inside this visu will set your bit to TRUE
Sure... for big projects you need a lot of variables => one for each page...but may you don't need it for every page
BR
Chris
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
My idea would be to have a BLINK signal generated by the web server and have a button or element replicate this heart beat signal, which would tell me that at least one instance of this visualization is active and in focus...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Alright so I can call a function from the text variable field? Interesting...now what if I wanted a function to work as a heart beat to know if the visu is active and in focus?
My initial idea was to use a Blink signal to activate a button that would run some ST code. Once the visualization is no longer active, the ST code would stop running...
Is there anyway to force a click or tap of a button through ST code?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Why so complicated...
Inside your function you can run any code you want...
For example create a Global Variable for your Page and create a "BLINK" inside this function which turns on and off your global variable...
Then you can use this global Variable on any place of your Program...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Yes I understand, but this is the behaviour that I've seen in the past:
When I am on Visu1 with Button 1, and Button1_State = true, once I switch to another app of my android tablet, button remains true (Button1_State = true, not Button1_State = false)
Assuming my observation are correct, if Button1_State remains true, then my BLINK function won't stop running even though the user has navigated to another app on the tablet. My thought is by having an element on the screen that reflects the blink, then as soon as that visualization is no longer responding with a blink signal, I will know the user has navigated to another app.
This is a safety issue for us as all processes must stop if the user navigates away from the webvisu. So i am looking for a way to detect if we've navigated away from the visualization and onto another program.
Please correct me if I'm wrong or if you have a better way of achieving this.
Last edit: dgirard 2020-06-15
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi, i am interested in this thread and have tried a couple of the above examples in to determine remote webvisu access.
I am having trouble getting the lastusage variable to refresh during runtime? It seems to only log the last usage at initialisation and that is it? how do i gain ongoing access to the time variable as the code is running?
Thankyou.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
You can Count it on your own.
https://forge.codesys.com/forge/talk/Deutsch/thread/f14041c158/?limit=25#9c5f
Within this post I shared my Program (not the Code-Sniped, but the Project to download)
Here I Iterate all clients and read out some information. You can also geht som Usier-Info (Current logged In user for the different Clients)
So try e.g. If Current logged in user <> '' Then count+1
Or you use the code-sniped and use "pClient^.GlobalData.CurrentUserName" Inside the Iteration
e.g.
Last edit: Chris.O 2020-06-02
Great, I will try and get this all put together before the end of the week and share my results in case anyone else has the same needs.
Thank you
in this post https://forge.codesys.com/forge/talk/Deutsch/thread/91a22bbea1/#8506
you can find a project to login from IEC code. After creating two user groups in the usermanagement, maybe this is a other simple way to allow or disable user inputs on specific clients and visu objects. I can't use the currentvisuvariable in my project, so I login or out the right user during the iteration for synchronisation or check if the right user is logged in, as Chris.O described.
For those who suggest using hardwired buttons, it is not possible in my application. There are many "manual" buttons and our HMI should be mobile. You have to Walk around the site in order to operate different sections. It is not possible to put multiple panels around, because then we will need tens of them...
One of the reasons we have chosen Codesys for our application is the versatility and high end technology it introduce. I think that asking a button to stop operating in case of connection loss is mandatory. We achieve this with much much simpler HMIs easily.
In era where car drives themselves and robots are working next to humans, you can ask to operate a system with a touch screen button without being afraid it will get stuck...
May that will be a topic for the CoDeSys development to give a general solution without workaround like discussed here... May you should create a support-Ticket.
I have requested the improvement in our tracking database which already exists for the 3.5SP17 version.
because of little bit confusing discussions in this thread, if hints needed for the workarounds, let me know.
Has anyone been able to detect if web browser focus from a specific client has been lost?
Hi everyone
We are currently trying to figure out how to detect if a webvisu is in focus or not on specific clients. Has anyone been able to make ground with this?
Any direction is appreciated.
Thank you
I've searched for this too and wasn't able to find a usable value or bit. The only thing i can imagine is, that 3S has to enhance the webserver with such a function, because there are possibilities in HMTL and java to detect if the browser application with webvisu is in focus or not.
Yes we've come across the html/java methods as well. Do you know if it would be possible to run a html/java script internally or externally of the PLC that could detect the focus? Then we could make one of the variables accessible by a script inside the Codesys program?
sorry, I'm not familiar with html and java!
I really hope 3S will take care of this issue, as it seems to be a drawback for many users.
Meanwhile, my solution is a bit complicated but its the only one I could come up with:
I'm building an Android app with a webpage inside that runs the webvisu, and has a modbus server running, that keeps updating the PLC when the activity is in focus. Once the activity loses focus, the modbus stops shooting, and release every tap button that was pressed.
It is still in development, so I can't share it, but it's an idea for those who crave for solution...
I'm not sure if i understood your problem correctly... you want to know if a client opened a specific page?
For that I created a function which I called inside the Visualization inside a invisible dummy element.
Here you can e.g. call a function (e.g. for chage color...no matter) which is changing a bit of a global variable to TRUE.
Inside your code you can use this variable and set it back to FALSE. So every time when your visu is opended... your function inside this visu will set your bit to TRUE
Sure... for big projects you need a lot of variables => one for each page...but may you don't need it for every page
BR
Chris
@Chris.O: how did you call a function from within the visualization without pressing a button?
I can't seem to get ST to execute without actually having a button pressed...
My idea would be to have a BLINK signal generated by the web server and have a button or element replicate this heart beat signal, which would tell me that at least one instance of this visualization is active and in focus...
You can call it like that (see attachment)
Inside this function you can do what ever you want...
(In this case the Function is of type BOOL)
BR
Last edit: Chris.O 2020-06-15
Alright so I can call a function from the text variable field? Interesting...now what if I wanted a function to work as a heart beat to know if the visu is active and in focus?
My initial idea was to use a Blink signal to activate a button that would run some ST code. Once the visualization is no longer active, the ST code would stop running...
Is there anyway to force a click or tap of a button through ST code?
Why so complicated...
Inside your function you can run any code you want...
For example create a Global Variable for your Page and create a "BLINK" inside this function which turns on and off your global variable...
Then you can use this global Variable on any place of your Program...
Yes I understand, but this is the behaviour that I've seen in the past:
When I am on Visu1 with Button 1, and Button1_State = true, once I switch to another app of my android tablet, button remains true (Button1_State = true, not Button1_State = false)
Assuming my observation are correct, if Button1_State remains true, then my BLINK function won't stop running even though the user has navigated to another app on the tablet. My thought is by having an element on the screen that reflects the blink, then as soon as that visualization is no longer responding with a blink signal, I will know the user has navigated to another app.
This is a safety issue for us as all processes must stop if the user navigates away from the webvisu. So i am looking for a way to detect if we've navigated away from the visualization and onto another program.
Please correct me if I'm wrong or if you have a better way of achieving this.
Last edit: dgirard 2020-06-15
But I think you can reset your Button1_State to false inside your Program right? So if you implement it in that way:
Last edit: Chris.O 2020-06-15
Will GVL.xVisuPageActive reset to false if the user navigates to another app on the tablet?
I don't know what exactly you do with your app...or if CoDeSys disconnect a Client...Try it!
You can also reset your button after a defined time... but if everything is fine you have to press again...
Sorry no other idea at the moment
BR Chris
Hi, i am interested in this thread and have tried a couple of the above examples in to determine remote webvisu access.
I am having trouble getting the lastusage variable to refresh during runtime? It seems to only log the last usage at initialisation and that is it? how do i gain ongoing access to the time variable as the code is running?
Thankyou.
this thread is 4 years old. Without more information about your current Codesys Version, code snippets etc., it's not possible to help