whyclwt
2022-05-18 ab72c6e114d7c4e83564194367ba623ca23bf09d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "rs485_powerctrl.h"
 
RS485_PowerCtrl::RS485_PowerCtrl(const char *dev)
{
    int ret = this->OpenDev(dev);
 
    if (-1 == ret)
        qDebug("Can't Open Port %s!!!\n", dev);
    else qDebug("Open Port %s OK!\n", dev);
 
    this->SetDevAttr(9600,8,2,'N');
 
    fd = this->FD;
 
    dev_addr = 1;
}
 
void RS485_PowerCtrl::setPowerCtrlCommParam(const quint8 devaddr)
{
    dev_addr = devaddr;
}
 
void RS485_PowerCtrl::lock_RS485()
{
    RS485_mutex.lock();
}
 
void RS485_PowerCtrl::unlock_RS485()
{
    RS485_mutex.unlock();
}
 
void RS485_PowerCtrl::run()
{
    RS485_RUN_EN = true;
 
    if(fd < 0)
        RS485_RUN_EN = false;
 
    quint16 databuff[48] = {0};
    quint16 realReadRegNum = MOD_TEST_DATA_REG_NUM; //实际读取寄存器数
 
    MOD_TEST_DATA modTestData;
 
    memset(&modTestData,0x00,sizeof(modTestData));
 
    quint16 powerCtrlReadErrorCount = 0;
 
    powerCtrlComm_OK = false;
 
    while(true == RS485_RUN_EN)
    {
        lock_RS485();
 
        if (CommOK == ModBusRead(dev_addr, MOD_TEST_DATA_ADDR_START, realReadRegNum, databuff, 300))
        {
            powerCtrlReadErrorCount = 0;
            powerCtrlComm_OK = true;
 
            quint16 tmpdata = 0;
            for(quint16 j=0;j<realReadRegNum;j++)
            {
                tmpdata     = databuff[j];
                databuff[j] = Swap16(tmpdata);
            }
 
            memcpy(&modTestData,databuff,realReadRegNum*sizeof(quint16));
 
            emit sendModTestDataSignal(modTestData);
 
            /*
            qDebug("ADCVdc:%.3f, ADCIdc:%.3f, ADCVref:%.3f, ADCTemp1:%.1f,ADCTemp2:%.1f",
                    (float)(modTestData.ADCVdc)/1000,(float)(modTestData.ADCIdc)/1000,
                    (float)(modTestData.ADCVref)/1000,(float)(modTestData.ADCTemp1)/10,
                    (float)(modTestData.ADCTemp2)/10);
            */
        }
        else{
            if(powerCtrlReadErrorCount < 1000){
                powerCtrlReadErrorCount++;
            }
 
            if(powerCtrlReadErrorCount>=100){
 
                powerCtrlComm_OK = false;
 
                powerCtrlReadErrorCount = 0;
 
                memset(&modTestData,0x00,sizeof(modTestData));;
 
                emit sendModTestDataSignal(modTestData);
            }
        }
 
        msleep(100);
 
        unlock_RS485();
 
        msleep(500);
    }
}