基于Qt/libmodbus框架开发modbusRTU主机模块(二)- 应用场景

基于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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全能骑士涛锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值