pvbrowser, pvb® - The Process Visualiation Browser.

  • English
  • Deutsch

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 --------------------------------------------------------------------------------------

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 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)