TA的每日心情 | 衰 2024-10-6 20:55 |
---|
签到天数: 1 天 [LV.1]初来乍到
二级逆天
- 积分
- 1392
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
系统共分为四部分:
信号采集,执行机构输出,显示器,主控板(i.MXRT1050评估板)
主控板和其他模块采用modbus进行连接。共有2路串口,UART2连接PC,UART3连接信号采集和输出。
演示程序采用rttread操作系统,包含以下功能:
1、modbus主机采集信号
2、modbus主机输出信号
3、modbus从机连接PC显示
4、温度湿度计算
5、温湿度输出控制
PI压缩机制冷、除湿。控制要求允许波动较大时,压缩机可采用切换工作制以节省能源并延长设备寿命,切换式调节由程序根据温湿度的波动情况调节 | 开关
PC端显示使用昆仑通泰组态软件,采用modbus连接主控系统。 |
系统的关键是实现多通道modbus管理,包括主机和从机。从机相对简单,只需处理接收到的报文即可。主机相对复杂,要能够处理静态 | 命令和突发命令,其中静态命令在机器空闲时一直轮询执行,比如获取温湿度值,发送输出值给执行模块等;突发命令只在需要执行时执行一次,比如开关机,复位从设备等。 |
存放用户请求的命令,Poll函数自动处理缓冲池中的命令 |
| 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,一路主机连接模块,一路从机连接上位机。 |
[li]//作为主机连接下位模块[/li][li]mb02_Init(MB_RTU_MASTER,mb_baud_tab[MB_BAUD_38400],MB_PAR_NONE);[/li][li]mb.obj02.SlaveId=1;[/li][li][/li][li]//作为从机连接PC[/li][li]mb03_Init(MB_RTU_MASTER,mb_baud_tab[MB_BAUD_38400],MB_PAR_NONE);[/li][li]mb.obj03.SlaveId=1;[/li]
复制代码
[li]//命令配置端口x读取采样数据[/li][li]mmb_stc_cmd_req(&mb.obj02,1,2,FUN_CODE_READ_REG,&RegHold[0],0,8,0);[/li][li]//命令配置端口x写输出数据至执行模块[/li][li]mmb_stc_cmd_req(&mb.obj02,2,3,FUN_CODE_READ_REG,(uint16_t*)&TempCtrPar,16,sizeof(TempCtrPar)/2,0);[/li][li][/li][li][/li][li]for(;;){[/li][li]rt_uint32_tenent;[/li][li][/li][li]IF(mb.obj03.idle_TIme_cnt>6000)[/li][li]{[/li][li]mb03_Init(TEST_MODE,mb_baud_tab[MB_BAUD_38400],MB_PAR_NONE);[/li][li]mmb_stc_cmd_req(&mb.obj03,6,1,FUN_CODE_WRITE_MULTIPLE_COIL,&mb_tst.pv_r[14],0x20,16,dgus_callback);[/li][li]mmb_stc_cmd_req(&mb.obj03,7,1,FUN_CODE_READ_REG,&mb_tst.pv_w[16],0x22,16,dgus_callback);[/li][li]mb.obj03.SlaveId=1;[/li][li]}[/li][li][/li][li]enent=osEventFlagsWait(os_obj.eid_mb,0,RT_EVENT_FLAG_OR,ms_TIcks(100),enent);[/li][li][/li][li]mb_poll(&mb.obj00);[/li][li]mb_poll(&mb.obj02);[/li][li]mb_poll(&mb.obj03);[/li][li]mb_poll(&mb.obj04);[/li][li]}[/li]
复制代码
测试指令数据采集元件
|
|