소스 검색

增加PID 参数条目,页面显示调整

guoqiang 2 년 전
부모
커밋
9e300d82c4
2개의 변경된 파일478개의 추가작업 그리고 133개의 파일을 삭제
  1. 146 14
      Calibrationpara.cpp
  2. 332 119
      PageCalibration.qml

+ 146 - 14
Calibrationpara.cpp

@@ -5,6 +5,8 @@
 #include <QJsonObject>
 #include <QByteArray>
 #include <QFile>
+#include <algorithm>
+
 
 ParaItem::ParaItem(){
 
@@ -32,6 +34,10 @@ ParaItem::~ParaItem()
 
 }
 
+bool sortByVolume(const ParaItem& item1, const ParaItem& item2){
+    return (item1.max_volume < item2.max_volume); //升序排列
+}
+
 static CalibrationPara* _calibrationPara = nullptr;
 
 CalibrationPara::CalibrationPara(QObject* parent)
@@ -59,6 +65,8 @@ void CalibrationPara::init()
         add_default();
         save_parameters();
     }
+
+    std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
 }
 
 QJsonObject CalibrationPara::get_paras()
@@ -68,9 +76,10 @@ QJsonObject CalibrationPara::get_paras()
     QJsonObject rootObj;
 
     int count = static_cast<int>(m_paras.size());
-    if(count > 5){
-        count=5;
-    }
+    //if(count > 5){
+    //    count=5;
+    //}
+    qDebug() << "m_paras.size:" << count;
 
     rootObj.insert("count", count);
 
@@ -176,6 +185,10 @@ bool CalibrationPara::set_paras(const QString& jsonStr)
             m_paras.push_back(para);
 
         }
+
+        std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
+        qDebug() << "m_paras.size:" << m_paras.size();
+
     }else{
         return false;
     }
@@ -338,6 +351,47 @@ void CalibrationPara::add_default()
 {
     ParaItem para;
 
+#if 0
+    para.max_volume = 0;
+    para.keep_time = 0;
+
+    para.outermax = 0;
+    para.outermin = 0;
+    para.outerkp = 0;
+    para.outerki = 0;
+    para.outerkd = 0;
+
+    para.innermax = 0;
+    para.innermin = 0;
+    para.innerkp = 0;
+    para.innerki = 0;
+    para.innerkd = 0;
+    para.innermaxI = 0;
+    para.innerIstep = 0;
+    para.innerDstep = 0;
+
+    m_paras.push_back(para);
+
+    para.max_volume = 0;
+    para.keep_time = 0;
+
+    para.outermax = 0;
+    para.outermin = 0;
+    para.outerkp = 0;
+    para.outerki = 0;
+    para.outerkd = 0;
+
+    para.innermax = 0;
+    para.innermin = 0;
+    para.innerkp = 0;
+    para.innerki = 0;
+    para.innerkd = 0;
+    para.innermaxI = 0;
+    para.innerIstep = 0;
+    para.innerDstep = 0;
+
+    m_paras.push_back(para);
+#endif
     // <= 200  主要是系统自测
     para.max_volume = 200;
     para.keep_time = 30;
@@ -382,7 +436,7 @@ void CalibrationPara::add_default()
 
     //<= 5000
     para.max_volume = 5000;
-    para.keep_time = 60;
+    para.keep_time = 60; //1 min
 
     para.outermax = 0.1;
     para.outermin = 0;
@@ -403,7 +457,7 @@ void CalibrationPara::add_default()
 
     //<= 10000
     para.max_volume = 10000;
-    para.keep_time = 120;
+    para.keep_time = 120; //2 min
 
     para.outermax = 0.1;
     para.outermin = 0;
@@ -412,19 +466,19 @@ void CalibrationPara::add_default()
     para.outerkd = 0;
 
     para.innermax = 800;
-    para.innermin = -20;
+    para.innermin = -15;
     para.innerkp = 5000;
     para.innerki = 80;
     para.innerkd = 60;
     para.innermaxI = 30;
-    para.innerIstep = 2;
-    para.innerDstep = 10;
+    para.innerIstep = 8;
+    para.innerDstep = 30;
 
     m_paras.push_back(para);
 
-    //<= 9000000   最大值
-    para.max_volume = 9000000;
-    para.keep_time = 300;  // 5min
+    //<= 20000
+    para.max_volume = 20000;
+    para.keep_time = 180;  // 3min
 
     para.outermax = 0.1;
     para.outermin = 0;
@@ -432,16 +486,81 @@ void CalibrationPara::add_default()
     para.outerki = 0;
     para.outerkd = 0;
 
+    para.innermax = 800;
+    para.innermin = -15;
+    para.innerkp = 8000;
+    para.innerki = 80;
+    para.innerkd = 60;
+    para.innermaxI = 40;
+    para.innerIstep = 15;
+    para.innerDstep = 30;
+
+    m_paras.push_back(para);
+
+    //<= 30000
+    para.max_volume = 30000;
+    para.keep_time = 240;  // 4min
+
+    para.outermax = 0.1;
+    para.outermin = 0;
+    para.outerkp = 0.4;
+    para.outerki = 0;
+    para.outerkd = 0;
+
+    para.innermax = 800;
+    para.innermin = 0;
+    para.innerkp = 8000;
+    para.innerki = 80;
+    para.innerkd = 60;
+    para.innermaxI = 40;
+    para.innerIstep = 20;
+    para.innerDstep = 60;
+
+    m_paras.push_back(para);
+
+    //<= 40000
+    para.max_volume = 40000;
+    para.keep_time = 300;  // 5min
+
+    para.outermax = 0.1;
+    para.outermin = 0;
+    para.outerkp = 0.4;
+    para.outerki = 0;
+    para.outerkd = 0;
+
+    para.innermax = 800;
+    para.innermin = 0;
+    para.innerkp = 8000;
+    para.innerki = 80;
+    para.innerkd = 60;
+    para.innermaxI = 40;
+    para.innerIstep = 20;
+    para.innerDstep = 60;
+
+    m_paras.push_back(para);
+
+    //<= 1000000  最大
+    para.max_volume = 1000000;
+    para.keep_time = 300;  // 5min
+
+    para.outermax = 0.1;
+    para.outermin = 0;
+    para.outerkp = 0.4;
+    para.outerki = 0;
+    para.outerkd = 0;
+
     para.innermax = 800;
     para.innermin = 0;
     para.innerkp = 8000;
     para.innerki = 80;
     para.innerkd = 60;
     para.innermaxI = 40;
-    para.innerIstep = 5;
-    para.innerDstep = 20;
+    para.innerIstep = 20;
+    para.innerDstep = 60;
 
     m_paras.push_back(para);
+
+    std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
 }
 
 bool CalibrationPara::get_pidPara(int volume, ParaItem& item)
@@ -449,6 +568,19 @@ bool CalibrationPara::get_pidPara(int volume, ParaItem& item)
     int min_volme = 0;
     bool ret_value = false;
 
+   #if 0
+
+    std::sort(m_paras.begin(), m_paras.end(), sortByVolume);
+
+    for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
+        if(it->max_volume >= volume){
+            item = *it;
+            ret_value = true;
+        }
+    }
+
+   #else
+
     for(std::vector<ParaItem>::iterator it = m_paras.begin(); it != m_paras.end(); it++){
         if(it->max_volume >= volume){
 
@@ -470,7 +602,7 @@ bool CalibrationPara::get_pidPara(int volume, ParaItem& item)
             ret_value = true;
         }
     }
-
+#endif
     return ret_value;
 }
 

+ 332 - 119
PageCalibration.qml

@@ -1,7 +1,16 @@
-import QtQuick 2.11
+import QtQuick 2.15
 import QtQuick.Layouts 1.3
-import QtQuick.Controls 2.14
-import QtQuick.Controls.Styles 1.2
+import QtQuick.Controls 1.2
+//import QtQuick 2.11
+//import QtQuick.Layouts 1.3
+//import QtQuick.Controls 2.14
+//import QtQuick.Controls.Styles 1.2
+import QtQuick.Controls.Styles 1.4
+import Qt.labs.qmlmodels 1.0
+//import QtQuick.LocalStorage 2.0
+//import io.qt.DataBaseModel 1.0
+import Qt.labs.platform 1.1
+
 import TService 1.0
 
 Item {
@@ -27,33 +36,56 @@ Item {
     property var innermaxIstep: [0.0, 0.0, 0.0, 0.0, 0.0]
     property var innermaxDstep: [0.0, 0.0, 0.0, 0.0, 0.0]
 
+    property string background: "#d7e3bc"
+    property string alterBackground: "white"
+    property string highlight: "#e4f7d6"
+    property string headerBkgnd: "#F0F0F0"
+
+    property var normalG: Gradient {
+            GradientStop { position: 0.0; color: "#c7d3ac" }
+            GradientStop { position: 1.0; color: "#F0F0F0" }
+    }
+    property var hoverG: Gradient {
+            GradientStop { position: 0.0; color: "white"; }
+            GradientStop { position: 1.0; color: "#d7e3bc"; }
+    }
+    property var pressG: Gradient {
+            GradientStop { position: 0.0; color: "#d7e3bc"; }
+            GradientStop { position: 1.0; color: "white"; }
+    }
+
+
     function set_paras(){
         var Jsonobj={}
         var itemArrayJson=[]
+        var j=0;
+
+        for(var i = 0; i<param_model.count; i++){
+            var row_record = param_model.get(i)
 
-        for(var i = 0; i<5; i++){
-            if(volume[i] > 0){
+            if(row_record.volume > 0){
                 var item={}
 
-                item.max_volume = volume[i]
-                item.keep_time = keeptime[i]
-
-                item.outermax = outermax[i]
-                item.outermin = outermini[i]
-                item.outerkp = outerKp[i]
-                item.outerki = outerKi[i]
-                item.outerkd = outerKd[i]
-
-                item.innermax = innermax[i]
-                item.innermin =innermini[i]
-                item.innerkp = innerKp[i]
-                item.innerki = innerKi[i]
-                item.innerkd = innerKd[i]
-                item.innermaxI = innermaxI[i]
-                item.innerIstep = innermaxIstep[i]
-                item.innerDstep = innermaxDstep[i]
-
-                itemArrayJson[i] = item
+                item.max_volume = row_record.volume
+                item.keep_time = row_record.time
+
+                item.outermax = row_record.out_max
+                item.outermin = row_record.out_min
+                item.outerkp = row_record.out_kp
+                item.outerki = row_record.out_ki
+                item.outerkd = row_record.out_kd
+
+                item.innermax = row_record.inner_max
+                item.innermin =row_record.inner_min
+                item.innerkp = row_record.inner_kp
+                item.innerki = row_record.inner_ki
+                item.innerkd = row_record.inner_kd
+                item.innermaxI = row_record.inner_maxI
+                item.innerIstep = row_record.inner_maxIstep
+                item.innerDstep = row_record.inner_maxDstep
+
+                itemArrayJson[j] = item
+                j++
             }
         }
 
@@ -63,100 +95,26 @@ Item {
     }
 
     function update_paras(index, item){
-        if(index === 0){
-            volume1.text = item.max_volume
-            keep1.text = item.keep_time
-
-            outmax1.text = item.outermax
-            outmini1.text = item.outermin
-            outp1.text = item.outerkp
-            outi1.text = item.outerki
-            outd1.text = item.outerkd
-
-            inmax1.text = item.innermax
-            inmini1.text = item.innermin
-            inp1.text = item.innerkp
-            ini1.text = item.innerki
-            ind1.text = item.innerkd
-            inmaxI1.text = item.innermaxI
-            inmaxIstep1.text = item.innerIstep
-            inmaxDstep1.text = item.innerDstep
 
-        }else if(index === 1){
-            volume2.text = item.max_volume
-            keep2.text = item.keep_time
-
-            outmax2.text = item.outermax
-            outmini2.text = item.outermin
-            outp2.text = item.outerkp
-            outi2.text = item.outerki
-            outd2.text = item.outerkd
-
-            inmax2.text = item.innermax
-            inmini2.text = item.innermin
-            inp2.text = item.innerkp
-            ini2.text = item.innerki
-            ind2.text = item.innerkd
-            inmaxI2.text = item.innermaxI
-            inmaxIstep2.text = item.innerIstep
-            inmaxDstep2.text = item.innerDstep
+        param_model.append({
+                                  "idx":index,
+                                  "volume":item.max_volume,
+                                  "time":item.keep_time,
+                                  "out_max":item.outermax,
+                                  "out_min":item.outermin,
+                                  "out_kp":item.outerkp,
+                                  "out_ki":item.outerki,
+                                  "out_kd":item.outerkd,
+                                  "inner_max":item.innermax,
+                                  "inner_min":item.innermin,
+                                  "inner_kp":item.innerkp,
+                                  "inner_ki":item.innerki,
+                                  "inner_kd":item.innerkd,
+                                  "inner_maxI":item.innermaxI,
+                                  "inner_maxIstep":item.innerIstep,
+                                  "inner_maxDstep":item.innerDstep})
 
-        }else if(index === 2){
-            volume3.text = item.max_volume
-            keep3.text = item.keep_time
-
-            outmax3.text = item.outermax
-            outmini3.text = item.outermin
-            outp3.text = item.outerkp
-            outi3.text = item.outerki
-            outd3.text = item.outerkd
-
-            inmax3.text = item.innermax
-            inmini3.text = item.innermin
-            inp3.text = item.innerkp
-            ini3.text = item.innerki
-            ind3.text = item.innerkd
-            inmaxI3.text = item.innermaxI
-            inmaxIstep3.text = item.innerIstep
-            inmaxDstep3.text = item.innerDstep
-        }else if(index === 3){
-            volume4.text = item.max_volume
-            keep4.text = item.keep_time
-
-            outmax4.text = item.outermax
-            outmini4.text = item.outermin
-            outp4.text = item.outerkp
-            outi4.text = item.outerki
-            outd4.text = item.outerkd
-
-            inmax4.text = item.innermax
-            inmini4.text = item.innermin
-            inp4.text = item.innerkp
-            ini4.text = item.innerki
-            ind4.text = item.innerkd
-            inmaxI4.text = item.innermaxI
-            inmaxIstep4.text = item.innerIstep
-            inmaxDstep4.text = item.innerDstep
-        }else if(index === 4){
-            volume5.text = item.max_volume
-            keep5.text = item.keep_time
-
-            outmax5.text = item.outermax
-            outmini5.text = item.outermin
-            outp5.text = item.outerkp
-            outi5.text = item.outerki
-            outd5.text = item.outerkd
-
-            inmax5.text = item.innermax
-            inmini5.text = item.innermin
-            inp5.text = item.innerkp
-            ini5.text = item.innerki
-            ind5.text = item.innerkd
-            inmaxI5.text = item.innermaxI
-            inmaxIstep5.text = item.innerIstep
-            inmaxDstep5.text = item.innerDstep
         }
-    }
 
     function clear_paras(index){
         if(index === 0){
@@ -258,13 +216,68 @@ Item {
 
         var jsonobj = CalibrationPara.get_paras();
 
-        for(var i=0; i<5; i++){
-            clear_paras(i)
-        }
+        param_model.clear()
 
         for(var index= 0; index< jsonobj.count; index++){
             update_paras(index, jsonobj.pids[index])
         }
+
+    }
+
+    function get_role(column){
+        var role = "idx"
+        switch(column){
+        case 1:
+            role = "volume"
+            break
+        case 2:
+            role = "time"
+            break
+        case 3:
+            role = "out_max"
+            break
+        case 4:
+            role = "out_min"
+            break
+        case 5:
+            role = "out_kp"
+            break
+        case 6:
+            role = "out_ki"
+            break
+        case 7:
+            role = "out_kd"
+            break
+        case 8:
+            role = "inner_max"
+            break
+        case 9:
+            role = "inner_min"
+            break
+        case 10:
+            role = "inner_kp"
+            break
+        case 11:
+            role = "inner_ki"
+            break
+        case 12:
+            role = "inner_kd"
+            break
+        case 13:
+            role = "inner_maxI"
+            break
+        case 14:
+            role = "inner_maxIstep"
+            break
+        case 15:
+            role = "inner_maxDstep"
+            break
+        default:
+            break
+
+        }
+
+        return role
     }
 
 
@@ -275,6 +288,206 @@ Item {
         anchors.fill: parent
         title: title_str
 
+        Column{
+        Rectangle{
+            id:param_rect
+            //x:-10
+            width: 1250
+            height: 420
+            //anchors.centerIn: parent
+            color: "white"
+            radius: 6
+            border.color: "black"
+
+            Text{
+                id:text_title
+                anchors.top: parent.top
+                anchors.topMargin: 10
+                anchors.horizontalCenter: parent.horizontalCenter
+                font.bold: true
+                font.pixelSize: 24
+                text: "PID 参数标定"
+
+            }
+
+            Component{
+                        id:itemDelegateTextEdit
+                        TextField {
+                            anchors.verticalCenter: parent.verticalCenter
+                            text: styleData.value
+                            font.pointSize: 10
+                            //font.pixelSize: 24
+                            //font.bold: true
+                            horizontalAlignment: Text.AlignHCenter
+                            verticalAlignment: Text.AlignVCenter
+                            validator:RegExpValidator {
+                                regExp: /(-?[0-9]\d*((.\d+)*))*/
+                                    // /(-?[0-9]\d*((.\d+)*))|(0.\d+)*/
+                                    ///[0-9]*/
+                            }
+
+                            anchors.fill: parent
+                            onEditingFinished: {
+                                //console.log("row === "+styleData.row );
+                                //console.log("column=== "+styleData.column);
+                                //console.log("role  === "+get_role(styleData.column));
+                                var role = get_role(styleData.column)
+                                if("idx" !== role){
+                                    param_model.setProperty(styleData.row, get_role(styleData.column), Number(text))
+                                }
+
+                            }
+                        }
+                    }
+
+            Component{
+                        id:itemDelegateText
+                        Text {
+                            anchors.verticalCenter: parent.verticalCenter
+                            color: styleData.selected?"#1E90FF":"#000000"
+                            elide: styleData.elideMode
+                            text: styleData.value
+                            font.pointSize: 10
+                            //font.pixelSize: 24
+                            //font.bold: true
+                            horizontalAlignment: Text.AlignHCenter
+                            verticalAlignment: Text.AlignVCenter
+                            anchors.fill: parent
+                        }
+                    }
+
+            TableView{
+                id:tableView
+                //frameVisible: true
+                width: parent.width
+                focus: true
+                //height: parent.height - 50
+                anchors.top: text_title.bottom
+                anchors.bottom: parent.bottom
+                anchors.topMargin: 10
+
+                TableViewColumn{role: "idx"; title: "ID"; width: 40; movable:false; delegate: itemDelegateText}
+                TableViewColumn{role: "volume"; title: "容积≤(L)"; width: 120; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "time"; title: "稳压时间(秒)"; width: 120; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "out_max"; title: "外环max"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "out_min"; title: "外环min"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "out_kp"; title: "外环KP"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "out_ki"; title: "外环KI"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "out_kd"; title: "外环KD"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_max"; title: "内环max"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_min"; title: "内环min"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_kp"; title: "内环KP"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_ki"; title: "内环KI"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_kd"; title: "内环KD"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_maxI"; title: "内环maxI"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_maxIstep"; title: "内环Istep"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+                TableViewColumn{role: "inner_maxDstep"; title: "内环Rstep"; width: 80; movable:false; delegate: itemDelegateTextEdit}
+
+                //model: modelItems
+
+                headerDelegate: Rectangle{
+                    implicitWidth: 16
+                    implicitHeight: 24
+
+                    gradient: styleData.pressed ? selftest_root.pressG : (styleData.containsMouse ? root.hoverG: root.normalG)
+
+                    border.color: "gray"
+                    border.width: 1
+                    Text{
+                        anchors.verticalCenter: parent.verticalCenter
+                        anchors.left: parent.left
+                        anchors.leftMargin: 4
+                        anchors.right: parent.right
+                        anchors.rightMargin: 4
+                        text: styleData.value
+                        color: styleData.pressed ?"red" : "blue"
+                        horizontalAlignment: Text.AlignHCenter
+                        verticalAlignment: Text.AlignVCenter
+                        font.bold: true
+                    }
+                }
+                rowDelegate: Rectangle{
+                    height: 32
+                    //border.color: "gray"
+                    //color: styleData.selected?"#f0b0b0af":(styleData.alternate?"#c3c3c0":"#c0c0c3")
+                    color: styleData.selected ? root.highlight : root.alterBackground
+
+                }
+
+                itemDelegate: Rectangle {
+                    height: 28
+                    //border.color: "gray"
+                    color: "transparent"
+                    Text {
+                        //anchors.centerIn: parent
+                        //anchors.left: parent.left
+                        anchors.leftMargin: 6
+                        anchors.verticalCenter: parent.verticalCenter
+                        //color: styleData.textColor
+                        color: styleData.selected ? "red" : styleData.textColor
+                        text: styleData.value
+                        verticalAlignment: Text.AlignVCenter
+                        font.pointSize: 13
+                    }
+                }
+
+
+                model:ListModel{
+                     id: param_model
+                }
+            }
+
+
+        }
+
+        Rectangle{
+            id:button_rect
+            //x:-10
+            width: 1250
+            height: 60
+            color: "transparent"
+
+            Row{
+                spacing:30
+                anchors.fill: parent
+
+                UserButton {
+                    id: refresh_button;
+                    text: "刷新";
+                    font.pixelSize: 20
+
+                    anchors.verticalCenter: parent.verticalCenter
+
+                    width: 120
+                    height: 45
+
+                    onClicked: {
+
+                        update_detail()
+                    }
+                }
+
+                UserButton {
+                    id: save_button;
+                    text: "保存";
+                    font.pixelSize: 20
+
+                    anchors.verticalCenter: parent.verticalCenter
+
+                    width: 120
+                    height: 45
+
+                    onClicked: {
+                        set_paras()
+                    }
+                }
+            }
+
+        }
+
+        }
+
+/*
         Column{
             //spacing:10
             anchors.centerIn: parent
@@ -1117,7 +1330,7 @@ Item {
                 }
             }
         }
-
+*/
     }
 
     Component.onCompleted: {