Not sure I know what you mean with #1. Are you talking about a conditional cycle stop?
But #2 is that the button press is a GUI event. And the GUI cannot be updated while it is processing a GUI event. It is the same thread of execution.
So you have to get creative. Maybe have a global screen script variable (defined in the screen load script), a string variable that will contain your message. Than an addition to the PLC script that watches the string variable to become non empty and when so, , uses the string variable in a call to mcCntlSetLastError() and then finally sets the string variable to empty.
screen load script:
myMessageVar = ""
PLC script
if (myMessageVar ~= "") then
local inst = mc.GetInstance()
mcCntlSetLastError(inst, myMessageVar);
myMessageVar = ""
end
Button script:
myMessageVar = "Display this now!!!"
Steve