Using pvbrowser
Using pvbrowser is similar to using a web browser. It depends on the developer of a visualization how comfortable the use for the end user is. The end user may only want to make some adjustments in the ini file of pvbrowser by choosing menu File->Options.
Developing a pvserver
For developing a pvserver for process visualization you need some programming skills. For C/C++ we assume some knowledge in ANSI C. Programming in Lua might be easier if you lack these skills.
In case you do not know programming, here you can find a short programming course in german
How pvbrowser, pvb® looks like
Available widgets and dialogs
The following widgets and dialogs are available in pvbrowser. Widgets can be designed in pvdevelop and/or Qt Designer.
// names in // pvdevelop : Qt library : Qt Designer // widgets from qt ------------------------------------------------------------------------------ PushButton : QPushButton : Buttons - Push Button RadioButton : QRadioButton : Buttons - Radio Button CheckBox : QCheckBox : Buttons - Check Box Label : QLabel : Display Widgets - Label LineEdit : QLineEdit : Input Widgets - Line Edit ComboBox : QComboBox : Input Widgets - Combo Box Table : QTableWidget : Item Widgets (Item-Based) - Table Widget DateEdit : QDateEdit : Input Widgets - Date Edit TimeEdit : QTimeEdit : Input Widgets - Time Edit DateTimeEdit : QDateTimeEdit : Input Widgets - Date/Time Edit TextBrowser : QWebView : Display Widgets - Text Browser // any web page ListView : QTreeWidget : not available from Qt Designer Qt4 (fixed in pvbrowser 4.5.8) IconView : QListWidget : use Pvb Widgets - PvbIconview ListBox : QListWidget : Item Widgets (Item-Based) - List Widget TabWidget : QTabWidget : Containers - Tab Widget GroupBox : QGroupBox : Containers - Group Box Frame : QFrame : Containers - Frame MultiLineEdit : QTextEdit : Input Widgets - Text Edit SpinBox : QSpinBox : Input Widgets - Spin Box Slider : QSlider : Input Widgets - Horizontal/Vertical Slider LCDNumber : QLCDNumber : Display Widgets - LCD Number Dial : QDial : Input Widgets - Dial ProgressBar : QProgressBar : Display Widgets - Progress Bar ToolBox : QToolBox : Containers - Group Box // widgets from pvb plugin ---------------------------------------------------------------------- : Pvb Widgets - PvbIconview Draw/SVG : Pvb Widgets - PvbDraw // xy-graphics + SVG Image : Pvb Widgets - PvbImage // bitmap graphics OpenGL : pvb Widgets - PvbOpengl // OpenGL output VTK : pvb Widgets - PvbVtk // VTK toolkit // widgets from qwt plugin ---------------------------------------------------------------------- QwtPlot : Qwt Widgets - QwtPlot // xy-graphics QwtKnob : Qwt Widgets - QwtKnob QwtCounter : Qwt Widgets - Qwt Counter QwtThermo : Qwt Widgets - QwtThermo QwtAnalogClock : Qwt Widgets - QwtAnalogClock QwtSlider : Qwt Widgets - QwtSlider QwtWheel : Qwt Widgets - QwtWheel QwtCompass : Qwt Widgets - QwtCompass QwtDial : Qwt Widgets - QwtDial // analog instruments // dialogs -------------------------------------------------------------------------------------- MessageBox InputDialog FileDialog ModalDialog DockWidget PopupMenu
pvbrowser key bindings
mask-without-layout: Ctrl+MouseWheel Zoom in/out mask-without-layout: Ctrl-1 Zoom 100 percent mask-without-layout: Ctrl-K Zoom in mask-without-layout: Ctrl-J Zoom out mask-without-layout: TAB moveto next widget every-mask: SPACEBAR Button Down MyTextBrowser: Qt::Key_Tab move-to-next-link MyTextBrowser: Qt::Key_Return select-link
Extract from Qt 6.x Documentation
enum QKeySequence::StandardKey This enum represent standard key bindings. They can be used to assign platform dependent keyboard shortcuts to a QAction. Note that the key bindings are platform dependent. The currently bound shortcuts can be queried using keyBindings(). Constant Value Description QKeySequence::AddTab 19 Add new tab. QKeySequence::Back 13 Navigate back. QKeySequence::Backspace 69 Delete previous character. QKeySequence::Bold 27 Bold text. QKeySequence::Close 4 Close document/tab. QKeySequence::Copy 9 Copy. QKeySequence::Cut 8 Cut. QKeySequence::Delete 7 Delete. QKeySequence::DeleteEndOfLine 60 Delete end of line. QKeySequence::DeleteEndOfWord 59 Delete word from the end of the cursor. QKeySequence::DeleteStartOfWord 58 Delete the beginning of a word up to the cursor. QKeySequence::DeleteCompleteLine 68 Delete the entire line. QKeySequence::Find 22 Find in document. QKeySequence::FindNext 23 Find next result. QKeySequence::FindPrevious 24 Find previous result. QKeySequence::Forward 14 Navigate forward. QKeySequence::HelpContents 1 Open help contents. QKeySequence::InsertLineSeparator 62 Insert a new line. QKeySequence::InsertParagraphSeparator 61 Insert a new paragraph. QKeySequence::Italic 28 Italic text. QKeySequence::MoveToEndOfBlock 41 Move cursor to end of block. This shortcut is only used on the macOS. QKeySequence::MoveToEndOfDocument 43 Move cursor to end of document. QKeySequence::MoveToEndOfLine 39 Move cursor to end of line. QKeySequence::MoveToNextChar 30 Move cursor to next character. QKeySequence::MoveToNextLine 34 Move cursor to next line. QKeySequence::MoveToNextPage 36 Move cursor to next page. QKeySequence::MoveToNextWord 32 Move cursor to next word. QKeySequence::MoveToPreviousChar 31 Move cursor to previous character. QKeySequence::MoveToPreviousLine 35 Move cursor to previous line. QKeySequence::MoveToPreviousPage 37 Move cursor to previous page. QKeySequence::MoveToPreviousWord 33 Move cursor to previous word. QKeySequence::MoveToStartOfBlock 40 Move cursor to start of a block. This shortcut is only used on macOS. QKeySequence::MoveToStartOfDocument 42 Move cursor to start of document. QKeySequence::MoveToStartOfLine 38 Move cursor to start of line. QKeySequence::New 6 Create new document. QKeySequence::NextChild 20 Navigate to next tab or child window. QKeySequence::Open 3 Open document. QKeySequence::Paste 10 Paste. QKeySequence::Preferences 64 Open the preferences dialog. QKeySequence::PreviousChild 21 Navigate to previous tab or child window. QKeySequence::Print 18 Print document. QKeySequence::Quit 65 Quit the application. QKeySequence::Redo 12 Redo. QKeySequence::Refresh 15 Refresh or reload current document. QKeySequence::Replace 25 Find and replace. QKeySequence::SaveAs 63 Save document after prompting the user for a file name. QKeySequence::Save 5 Save document. QKeySequence::SelectAll 26 Select all text. QKeySequence::Deselect 67 Deselect text. Since 5.1 QKeySequence::SelectEndOfBlock 55 Extend selection to the end of a text block. This shortcut is only used on macOS. QKeySequence::SelectEndOfDocument 57 Extend selection to end of document. QKeySequence::SelectEndOfLine 53 Extend selection to end of line. QKeySequence::SelectNextChar 44 Extend selection to next character. QKeySequence::SelectNextLine 48 Extend selection to next line. QKeySequence::SelectNextPage 50 Extend selection to next page. QKeySequence::SelectNextWord 46 Extend selection to next word. QKeySequence::SelectPreviousChar 45 Extend selection to previous character. QKeySequence::SelectPreviousLine 49 Extend selection to previous line. QKeySequence::SelectPreviousPage 51 Extend selection to previous page. QKeySequence::SelectPreviousWord 47 Extend selection to previous word. QKeySequence::SelectStartOfBlock 54 Extend selection to the start of a text block. This shortcut is only used on macOS.
Hints for creating robust SCADA systems
Suggestion 1:
Create a hierarchic system with islands on the lower level that are not connected to wide area networks. These islands can represent an RTU each to the outer world. Now you connect the RTU to the outer world by the means of a serial line (Like RS232 or RS485). Thus the connection to the outer world will not be vulnerable by malware. You might use a proxy that converts TCP / serial line back and forth for communicating over longer distances but keep in mind to use a serial line within the communication chain. There might be several serial line connections to the island in order to implement redundancy. An example for connecting the RTU might use Modbus RTU.
Suggestion 2:
Imagine a dog and his master implemented as UDP protocol. The dog will only follow instructions from his master (fixed IP address). All instructions from others will be ignored and the master will be informed about such intrusions. If something happens (e.g. change of measurement value) the dog will report it to the master (UDP telegram to fixed master IP address). If the master wants the dog to take actions (e.g. output setpoint values) he will send a command to the dog (UDP telegram). Dog and master will be living within a local area network (mask 255.255.255.0). Dog and master may talk bidirectional without prior request.
Suggestion 3:
Make each SCADA solution an individual. This can be achieved by using frameworks (e.g. pvbrowser) / libraries and employing staff who knows programming in the same language the frameworks / libraries are implemented.
Suggestion 4:
Make your SCADA solution a CSP (communicating sequential process) that uses threads and communication. (My Credits to Occam and Transputers)