From f6b8de465d89d19c9b1e1587002bfba987ebfff6 Mon Sep 17 00:00:00 2001 From: Thiago Alves Date: Thu, 29 Aug 2019 12:04:04 -0700 Subject: [PATCH] Monitoring update: Added support for %MD and %ML --- webserver/monitoring.py | 37 +++++++++++++++++-- webserver/pages.py | 79 ++++++++++++++++++++++++++++++++++------- webserver/webserver.py | 28 +++++++++++++-- 3 files changed, 126 insertions(+), 18 deletions(-) diff --git a/webserver/monitoring.py b/webserver/monitoring.py index bcf2811..40a1613 100644 --- a/webserver/monitoring.py +++ b/webserver/monitoring.py @@ -1,4 +1,5 @@ import time, threading +from struct import * from pymodbus.client.sync import ModbusTcpClient class debug_var(): @@ -72,11 +73,41 @@ def modbus_monitor(): elif (debug_data.location.find('MD')) > 0: #Reading Double Memory - print('hi') - + mb_address = debug_data.location.split('%MD')[1] + result = mb_client.read_holding_registers((int(mb_address)*2) + 2048, 2) + if (debug_data.type == 'SINT') or (debug_data.type == 'INT') or (debug_data.type == 'DINT'): + #signed integer + float_pack = pack('>HH', result.registers[0], result.registers[1]) + debug_data.value = unpack('>i', float_pack)[0] + + if (debug_data.type == 'USINT') or (debug_data.type == 'UINT') or (debug_data.type == 'UDINT'): + #unsigned integer + float_pack = pack('>HH', result.registers[0], result.registers[1]) + debug_data.value = unpack('>I', float_pack)[0] + + if (debug_data.type == 'REAL'): + #32-bit float + float_pack = pack('>HH', result.registers[0], result.registers[1]) + debug_data.value = unpack('>f', float_pack)[0] + elif (debug_data.location.find('ML')) > 0: #Reading Long Memory - print('hi') + mb_address = debug_data.location.split('%ML')[1] + result = mb_client.read_holding_registers((int(mb_address)*4) + 4096, 4) + if (debug_data.type == 'SINT') or (debug_data.type == 'INT') or (debug_data.type == 'DINT') or (debug_data.type == 'LINT'): + #signed integer + float_pack = pack('>HHHH', result.registers[0], result.registers[1], result.registers[2], result.registers[3]) + debug_data.value = unpack('>q', float_pack)[0] + + if (debug_data.type == 'USINT') or (debug_data.type == 'UINT') or (debug_data.type == 'UDINT') or (debug_data.type == 'ULINT'): + #unsigned integer + float_pack = pack('>HHHH', result.registers[0], result.registers[1], result.registers[2], result.registers[3]) + debug_data.value = unpack('>Q', float_pack)[0] + + if (debug_data.type == 'REAL') or (debug_data.type == 'LREAL'): + #64-bit float + float_pack = pack('>HHHH', result.registers[0], result.registers[1], result.registers[2], result.registers[3]) + debug_data.value = unpack('>d', float_pack)[0] if (monitor_active == True): diff --git a/webserver/pages.py b/webserver/pages.py index 19b77b3..4db3dfb 100644 --- a/webserver/pages.py +++ b/webserver/pages.py @@ -748,16 +748,59 @@ monitoring_head = """ font-family: arial, sans-serif; } - input[type=text], input[type=password], select, textarea { - width: 100%; - padding: 12px 20px; - margin: 8px 0; - display: inline-block; - border: 1px solid #ccc; - border-radius: 4px; - box-sizing: border-box; + .form-inline + { + display: flex; + flex-flow: row wrap; + align-items: center; + } + + .form-inline label + { + margin: 5px 10px 5px 0; + width: 130px; + } + + .form-inline input + { + vertical-align: middle; + margin: 5px 10px 5px 0; + padding: 10px; + width: calc(100% - 250px); + background-color: #fff; + border: 1px solid #ddd; + } + + .form-inline button + { + padding: 10px 20px; + background-color: #E02222; + width: 100px; + border: 1px solid #1F1F1F; + color: white; + cursor: pointer; + font-size: 14px; font-family: "Roboto", sans-serif; - } + } + + .form-inline button:hover + { + background-color: #B51A1A; + } + + @media (max-width: 800px) + { + .form-inline input + { + margin: 10px 0; + } + + .form-inline + { + flex-direction: column; + align-items: stretch; + } + } """ @@ -772,6 +815,7 @@ monitoring_tail = """ """ @@ -1999,4 +2054,4 @@ edit_devices_script = """ var aorstart = document.getElementById("aor_start"); var aorsize = document.getElementById("aor_size"); var aowstart = document.getElementById("aow_start"); - var aowsize = document.getElementById("aow_size");""" + var aowsize = document.getElementById("aow_size");""" \ No newline at end of file diff --git a/webserver/webserver.py b/webserver/webserver.py index 65a03db..70902cc 100644 --- a/webserver/webserver.py +++ b/webserver/webserver.py @@ -11,6 +11,7 @@ import pages import openplc import monitoring as monitor import sys +import ctypes import flask import flask_login @@ -1311,7 +1312,12 @@ def monitoring():

Monitoring

-

The table below displays a list of the OpenPLC points used by the currently running program. By clicking in one of the listed points it is possible to see more information about it and also to force it to be a different value.

+
+ + + +
+
@@ -1330,9 +1336,17 @@ def monitoring(): return_str += 'bool_falseFALSE' else: return_str += 'bool_trueTRUE' - else: + elif (debug_data.type == 'UINT'): percentage = (debug_data.value*100)/65535 return_str += '

' + str(debug_data.value) + '

' + elif (debug_data.type == 'INT'): + percentage = ((debug_data.value + 32768)*100)/65535 + debug_data.value = ctypes.c_short(debug_data.value).value + return_str += '

' + str(debug_data.value) + '

' + elif (debug_data.type == 'REAL') or (debug_data.type == 'LREAL'): + return_str += "{:10.4f}".format(debug_data.value) + else: + return_str += str(debug_data.value) return_str += '' data_index += 1 return_str += pages.monitoring_tail @@ -1374,9 +1388,17 @@ def monitor_update(): return_str += 'bool_falseFALSE' else: return_str += 'bool_trueTRUE' - else: + elif (debug_data.type == 'UINT'): percentage = (debug_data.value*100)/65535 return_str += '

' + str(debug_data.value) + '

' + elif (debug_data.type == 'INT'): + percentage = ((debug_data.value + 32768)*100)/65535 + debug_data.value = ctypes.c_short(debug_data.value).value + return_str += '

' + str(debug_data.value) + '

' + elif (debug_data.type == 'REAL') or (debug_data.type == 'LREAL'): + return_str += "{:10.4f}".format(debug_data.value) + else: + return_str += str(debug_data.value) return_str += '' data_index += 1