基于Qt/libmodbus框架开发modbusRTU主机模块(二)- 应用场景
日期 | 作者 | 版本 | 说明 |
---|---|---|---|
2021.03.18 | Dog Tao | V1.0 | 1. 将Modbus RTU主机的应用开发部分独立成篇。 2. 增加了负载监控与调节小节,用以介绍在高速数据吞吐的场景下,MB主机的监控与调整。 3. 增加了屏蔽初始化时的槽函数小节,用以介绍窗体加载时槽函数被意外触发的问题与解决方法。 |
2021.03.24 | Dog Tao | V1.1 | 1. 增加了获取与设置最大通讯队列长度的说明。 2. 从预防、检出、反馈、处理四个方面阐述了提高通讯可靠性、降低通讯丢失率的方法。 |
2021.04.08 | Dog Tao | V1.2 | 1. 增加了屏蔽主动刷新按钮触发的槽函数的说明。 2. 增加了GUI独立模式的总架构图。 |
2023.03.21 | Dog Tao | V1.3 | 将文档从notion平台转移到markdown。 |
GUI窗体与Modbus主机数据同步 - 耦合模式
数据设计
考虑到Modbus寄存器的读写时分开的,读Slave的寄存器的时候一般是读连续多个寄存器,而通过控件写Slave的寄存器的时候一般是写单个寄存器,因此应该分别为读与写功能准备两套Modbus寄存器请求变量。
读寄存器变量一般会根据变量定义的功能进行分组,每个变量都包含相同功能分组的多个数值,例如输入寄存器中的多个通道的传感器采样数据一般是多个地址连续的变量,可以将它们定义为一个数据寄存器读请求变量(MBData_BitArray
/MBData_FloatArray
类型),这样可以大幅度提高数据通讯的效率。
/*************In the head file**************/
///Input Registers
//ADC raw data of Sensor(mV).
MBData_FloatArray *MBIR_SenRaw_Read;
//Calculate of Sensor(kΩ).
MBData_FloatArray *MBIR_SenCalcu_Read;
//PV of heater
MBData_FloatArray *MBIR_HeaterPV_Read;
//Sensor data of AM2302, index 20: temperature, index 21: humidity
MBData_FloatArray *MBIR_AM2302Data_Read;
//Digital input
MBData_BitArray *MBDR_DiInput_Read;
///Holding Registers
//Shift of measure channels
MBData_FloatArray *MBHR_ChanShift_Read;
//SV of heater
MBData_FloatArray *MBHR_HeaterSV_Read;
//Calculate data of sensor
MBData_FloatArray *MBHR_SenCalculParam_Read;
//Output power of heater
MBData_FloatArray *MBHR_PowerOut_Read;
///Coils Registers
//Channel state of measure
MBData_BitArray *MBCR_ChDaqEn_Read;
//Channel auto shift
MBData_BitArray *MBCR_ChASEn_Read;
//State of heater
MBData_BitArray *MBCR_HeaterEn_Read;
//Power output mode of heater, 0: PID mode, 1: Manual mode
MBData_BitArray *MBCR_PowerMode_Read;
//MCU GPIO Output, index 26: Buzzer, index 27~30:DO, index 31~35: Extensional Relay
MBData_BitArray *MBCR_GpioCtrl_Read;
///Discrete Registers
//Digital input of MCU GPIO
MBData_BitArray *MBDR_DigitalInput_Read;
/*************In the source file**************/
MBIR_SenRaw_Read = new MBData_FloatArray(999, 8);
MBIR_SenCalcu_Read = new MBData_FloatArray(1015, 8);
MBIR_HeaterPV_Read = new MBData_FloatArray(1031, 4);
MBIR_AM2302Data_Read = new MBData_FloatArray(1039,2);
MBDR_DiInput_Read = new MBData_BitArray(999, 4);
MBHR_ChanShift_Read = new MBData_FloatArray(999, 4);
MBHR_HeaterSV_Read = new MBData_FloatArray(1015, 4);
MBHR_SenCalculParam_Read = new MBData_FloatArray(1023,8);
MBHR_PowerOut_Read = new MBData_FloatArray(1039,4);
MBCR_ChDaqEn_Read = new MBData_BitArray(999,8);
MBCR_ChASEn_Read = new MBData_BitArray(1007,8);
MBCR_HeaterEn_Read = new MBData_BitArray(1017,4);
MBCR_PowerMode_Read = new MBData_BitArray(1021,4);
MBCR_GpioCtrl_Read = new MBData_BitArray(1025,10);
MBDR_DigitalInput_Read = new MBData_BitArray(999,4);
写寄存器变量一般是对单个数值或者功能的寄存器进行写入,这是因为每个GUI控件的数据一般只能与一个寄存器数值相对应。例如每个QLcdNumber控件只能对应Slave中的一个float类型的数据显示。因此在定义写寄存器请求变量时应该为每一个数值都声明并初始化一个MBData_Bit
/MBData_Float
类型的变量。
/*************In the head file**************/
MBData_Bit CR_Ch1En = MBData_Bit(1000-1,0);
MBData_Bit CR_Ch2En = MBData_Bit(1001-1,0);
MBData_Bit CR_Ch3En = MBData_Bit(1002-1,0);
MBData_Bit CR_Ch4En = MBData_Bit(1003-1,0);
MBData_Bit CR_Ch5En = MBData_Bit(1004-1,0);
MBData_Bit CR_Ch6En = MBData_Bit(1005-1,0);
MBData_Bit CR_Ch7En = MBData_Bit(1006-1,0);
MBData_Bit CR_Ch8En = MBData_Bit(1007-1,0);
MBData_Bit CR_Ch1AutoShift = MBData_Bit(1008-1,0);
MBData_Bit CR_Ch2AutoShift = MBData_Bit(1009-1,0);
MBData_Bit CR_Ch3AutoShift = MBData_Bit(1010-1,0);
MBData_Bit CR_Ch4AutoShift = MBData_Bit(1011-1,0);
MBData_Bit CR_Ch5AutoShift = MBData_Bit(1012-1,0);
MBData_Bit CR_Ch6AutoShift = MBData_Bit(1013-1,0);
MBData_Bit CR_Ch7AutoShift = MBData_Bit(1014-1,0);
MBData_Bit CR_Ch8AutoShift = MBData_Bit(1015-1,0);
MBData_Bit CR_Reboot = MBData_Bit(1016-1,1);
MBData_Bit CR_Reset = MBData_Bit(1017-1,1);
MBData_Bit CR_H1_En = MBData_Bit(1018-1, 0);
MBData_Bit CR_H2_En = MBData_Bit(1019-1, 0);
MBData_Bit CR_H3_En = MBData_Bit(1020-1, 0);
MBData_Bit CR_H4_En = MBData_Bit(1021-1, 0);
MBData_Bit CR_H1PowMode_En = MBData_Bit(1022-1, 0);
MBData_Bit CR_H2PowMode_En = MBData_Bit(1023-1, 0);
MBData_Bit CR_H3PowMode_En = MBData_Bit(1024-1, 0);
MBData_Bit CR_H4PowMode_En = MBData_Bit(1025-1, 0);
MBData_Bit CR_Buzzer_En = MBData_Bit(1026-1, 0);
MBData_Bit CR_DO1_En = MBData_Bit(1027-1, 0);
MBData_Bit CR_DO2_En = MBData_Bit(1028-1, 0);
MBData_Bit CR_DO3_En = MBData_Bit(1029-1, 0);
MBData_Bit CR_DO4_En = MBData_Bit(1030-1, 0);
MBData_Bit CR_Relay1_En = MBData_Bit(1031-1, 0);
MBData_Bit CR_Relay2_En = MBData_Bit(1032-1, 0);
MBData_Bit CR_Relay3_En = MBData_Bit(1033-1, 0);
MBData_Bit CR_Relay4_En = MBData_Bit(1034-1, 0);
MBData_Bit CR_Relay5_En = MBData_Bit(1035-1, 0);
MBData_Float HR_Ch1Shift = MBData_Float(1000-1, 0);
MBData_Float HR_Ch2Shift = MBData_Float(1002-1, 0);
MBData_Float HR_Ch3Shift = MBData_Float(1004-1, 0);
MBData_Float HR_Ch4Shift = MBData_Float(1006-1, 0);
MBData_Float HR_Ch5Shift = MBData_Float(1008-1, 0);
MBData_Float HR_Ch6Shift = MBData_Float(1010-1, 0);
MBData_Float HR_Ch7Shift = MBData_Float(1012-1, 0);
MBData_Float HR_Ch8Shift = MBData_Float(1014-1, 0);
MBData_Float HR_H1_SV = MBData_Float(1016-1, 0);
MBData_Float HR_H2_SV = MBData_Float(1018-1, 0);
MBData_Float HR_H3_SV