I use a "Text List" component from the screen library, where each item in the list is a unique error message. I create the index for the list in another page that collects all the error flags from the program and encodes them all to one or more words (unsigned integer variables consisting of bit flags), where each bit in the word is represents a message to be displayed. No bits means no message. I then run the word through a "LSB #" component to get the index of the first set bit. This becomes the index to the text list. Only the highest-priority message gets displayed this way. With this method, if there are multiple errors, the highest-priority (least significant bit) must be cleared before other messages are displayed.
I also group the messages into warnings, errors, and messages, and use comparators to set other signals that I use for changing message colors, flash lights, etc.
Finally, I latch some of the errors (e.g. low hydraulic fluid) so that the user must acknowledge the error message before it goes off the screen. This prevents mystery shutdowns and machine behavior.