`系统共分为四部分:
信号采集,执行机构输出,显示器,主控板(i.MX RT1050评估板)
主控板和其他模块采用modbus进行连接。共有2路串口,UART2连接PC,UART3连接信号采集和输出。
演示程序采用rttread操作系统,包含以下功能:
1、modbus主机采集信号
2、modbus主机输出信号
3、modbus从机连接PC显示
4、温度湿度计算
5、温湿度输出控制
待进一步完成,历史数据记录,导出以及图像输出。
输入信号包含设备温度、湿度
输出信号包括加热、加湿、制冷、除湿
调节原理:高温或高湿度采用PID调节,低温或低湿度启动压缩机制冷、除湿。控制要求允许波动较大时,压缩机可采用切换工作制以节省能源并延长设备寿命,切换式调节由程序根据温湿度的波动情况调节开关压缩机的温湿度点。
PC端显示使用昆仑通泰组态软件,采用modbus连接主控系统。
系统的关键是实现多通道modbus管理,包括主机和从机。从机相对简单,只需处理接收到的报文即可。主机相对复杂,要能够处理静态命令和突发命令,其中静态命令在机器空闲时一直轮询执行,比如获取温湿度值,发送输出值给执行模块等;突发命令只在需要执行时执行一次,比如开关机,复位从设备等。
主机使用缓冲池来存放用户请求的命令,Poll函数自动处理缓冲池中的命令
缓冲池结构如下
0 mbSCBuffSize mbCBuffSize
| | |
| Buff0 | Buff1 | Buff2 | .... | Buff[mbSCBuffSize-1] | Buff[mbSCBuffSize] | Buff[mbSCBuffSize+1] | .... | Buff[mbCBuffSize]|
| | | |
静态 静态 动态 动态
缓冲 缓冲 缓冲 缓冲
起始 结束 开始 结束
扫描顺序:
先扫描动态区,从上次处理的位置开始,命中后退出。若扫描完整个动态区都没有命中,开始扫描静态区
扫描静态区,方法同动态区。
两个区域的区别在于:动态区的命令处理后会被清除,而静态一直保持就绪状态。
-------------- 状态机过程 ---------------------------
从机:
RX-IDLE&TX-IDLE -> RX-RCV&TX-IDLE -> RX-RCVEND&TX-IDLE -> RX-IDLE&TX-SEND -> RX-IDLE&TX-IDLE
主机:
RX-IDLE&TX-IDLE -> RX-RCV&TX-SEND -> RX-RCV&TX-IDLE -> RX-RCVEND&TX-IDLE -> RX-IDLE&TX-IDLE
为尽量兼容其他设备,接收处理施加延时:
对于含操作系统的应用,可以在数据发送函数添加任务延时即可。
对于不含操作系统的应用--
主机模式在接收结束后延时处理即可。
从机接收到非本机地址直接处理,接收到本地地址延时处理。
配置两通道modbus,一路主机连接模块,一路从机连接上位机。
- //作为主机连接下位模块
- mb02_Init(MB_RTU_MASTER, mb_baud_tab[MB_BAUD_38400], MB_PAR_NONE);
- mb.obj02.SlaveId = 1;
-
- //作为从机连接PC
- mb03_Init(MB_RTU_MASTER, mb_baud_tab[MB_BAUD_38400], MB_PAR_NONE);
- mb.obj03.SlaveId = 1;
复制代码
//主机配置命令,独立os任务轮询。
- //命令配置 端口x读取采样数据
- mmb_stc_cmd_req(&mb.obj02,1, 2, FUN_CODE_READ_REG, &RegHold[0], 0, 8, 0);
- //命令配置 端口x写输出数据至执行模块
- mmb_stc_cmd_req(&mb.obj02,2, 3, FUN_CODE_READ_REG, (uint16_t*)&TempCtrPar, 16, sizeof(TempCtrPar)/2, 0);
-
- for(;;){
- rt_uint32_t enent;
-
- if(mb.obj03.idle_time_cnt > 6000)
- {
- mb03_Init(TEST_MODE, mb_baud_tab[MB_BAUD_38400], MB_PAR_NONE);
- mmb_stc_cmd_req(&mb.obj03,6,1,FUN_CODE_WRITE_MULTIPLE_COIL,&mb_tst.pv_r[14],0x20,16,dgus_callback);
- mmb_stc_cmd_req(&mb.obj03,7,1,FUN_CODE_READ_REG,&mb_tst.pv_w[16],0x22,16,dgus_callback);
- mb.obj03.SlaveId = 1;
- }
-
- enent = osEventFlagsWait(os_obj.eid_mb , 0, RT_EVENT_FLAG_OR, ms_ticks(100), enent);
-
- mb_poll(&mb.obj00);
- mb_poll(&mb.obj02);
- mb_poll(&mb.obj03);
- mb_poll(&mb.obj04);
- }
复制代码
i.MX RT1050 处理速度极快,测试modbus主机短报文指令执行速度可以达到40条/s。极大降低的数据采集及执行 元件执行延时,可做系统低速IO扩展。
温湿度处理过程较为复杂直接上传至附件中。
`
|