【开源】基于DGUS II迪文屏的智能化生产控制系统
简单了解一下DGUS II迪文屏,软件仿真功能太给力了,省去了硬件串口打印调试,非常方便,节省了项目开发时间。 一、DGUS II是基于T5 CPU的第2代DGUS系统,主要特点包括:
(1)T5双核CPU架构,DGUS和DWIN OS在各自独立的CPU并行运行,两个CPU运行最高可达250MHz,响应快,功耗低;
(2)数据处理速度是基于T2处理器的第1代DGUS的大约30倍,UI极其流畅;
(3)最高支持1280*800分辨率,变量刷新周期40mS;
(4)8 UARTs,可以扩展非常完备的通信接口:232、485、LAN、CAN、USB、WIFI、3G;
(5)完善的高品质音乐播放,远程网络管理(字库、图片、音乐)的能力;
(6)高可靠性数据库和强大的数据管理接口;
(7)可直接拓展连接迪文DCS设备;
(8)迪文专利的硬件加密算法和专用CPU设计,更好的客户知识产权安全性。
对智能化生产线的控制系统,实时检测设备的运行状态,并通过DGUS II屏实时显示,完整的人机界面控制系统,界面控制采用多级切换,具体通过单片机USART与DGUS屏通讯协议来控制,可用触摸方式或者按键来触发控件消息。
二、功能介绍及配置 1.整个界面系统主要需要五个功能: - 自动化产线(设备监控)界面;
- 参数设置及保存界面;
- 产线产量统计;
- 四系统异常界面提醒及常规解决方法;
- 试用提醒功能及广告。
2.具体硬件配置如下: - 采用T5UID2屏,分辨率为1024*600;
- 整体供电采用24V开关电源;
- 232通讯,波特率为115200;
- 单片机为STM32F103VET6,100引脚,lqfp封装。
3.硬件原理图如下: 原理图的功能比较多,有485和CAN通讯等,大家可以简单参考一下:
三、下面是程序详细功能说明 控制系统,主要由动力部分、倍捻单元、传动部分三大部分构成。 动力部分:电动机、电气控制箱、指示器、操作面板或者人机交互界面。先看下主函数:
- //程序入口
- int main(void)
- {
- qsize size = 0;
- u8 iFor;
- uint32 timer_tick_last_update[100] = {0}; //上一次更新的时间
- /*配置时钟*/
- SystemInit();
- /*配置串口中断*/
- Interrupts_Config();
- /*配置滴答定时器时钟节拍*/
- systicket_init();
- /*定时器配置*/
- TIMER_Config();//定时器2 1ms中断
- /*LED配置*/
- LED_GPIO_Config();
- /*key配置*/
- Key_GPIO_Config();
- /*串口初始化,波特率设置为115200*/
- Uart1Init(115200);
- /*清空串口接收缓冲区*/
- queue_reset();
- /*读取eeprom*/
- FLASH_ReadBytes((u8 *)&readflash,Flash_ADDR,sizeof(readflash));//sizeof(readflash)字节长度
- // /*将读出EEPROM的数据发送至显示屏*/
- // for(iFor=0; iFor<12; iFor++)
- // {
- // }
- // /*读取显示屏&单片机RTC时间*/
- // {
- // }
- /*清除密码存放区数据*/
- CLRsetKeyReg(0x82,M1_KEY_REG,0);
- delay_ms(1000);
- CLRsetKeyReg(0x82,M2_KEY_REG,0);
- delay_ms(1000);
- CLRsetKeyReg(0x82,BUY_KEY_REG,0);
- delay_ms(1000);
- /*切换页面显示*/
- SetScreen(0);
- delay_ms(3000);
- SetScreen(1);
- delay_ms(3000);
- SetScreen(2);
- delay_ms(3000);
- SetScreen(3);
- delay_ms(3000);
- /*看门狗初始化*/
- wdoginit();
- while(1)
复制代码
2.产量统计功能 产量统计以天为单位,循环记录,每个页面最多显示14组数据,主要通过对当天产量进行记录,在液晶屏上进行显示。主要界面如下图:
a)序号、生产日期、产量都是一个4位整型变量,用户进入产量统计界面后单片机读取EEPROM来获取日期和当天的产量,单片机通过写入对应的变量来显示序号、产量和日期。用户通过上一页下一页下发命令到单片机更新数据域。 程序如下,主要是采用滴答定时器1ms中断来递增时间变量,来刷新生产数据。
- <font size="3" face="宋体">#if (1)
- //更新1~14序列号,滴答定时器
- if(timer_tick_count_[0]-timer_tick_last_update[0]>=2000)
- {
- UpdateSerRec0();
- timer_tick_last_update[0] = timer_tick_count_[0];
- }
- #endif
- #if (1)
- //更新14~28序列号
- if(timer_tick_count_[1]-timer_tick_last_update[1]>=3000)
- {
- UpdateSerRec1();
- timer_tick_last_update[1] = timer_tick_count_[1];
- }
- #endif
- #if (1)
- //更新生产记录-日期
- if(timer_tick_count_[4]-timer_tick_last_update[4]>=30)
- {
- UpdateDateRec0();
- timer_tick_last_update[4] = timer_tick_count_[4];
- }
- // if(timer_tick_count_[5]-timer_tick_last_update[5]>=100)
- // {
- // UpdateDateRec1();
- // timer_tick_last_update[5] = timer_tick_count_[5];
- // }
- #endif
- #if (1)
- //更新生产记录-产量
- if(timer_tick_count_[6]-timer_tick_last_update[6]>=50)
- {
- UpdateProductRec0();
- timer_tick_last_update[6] = timer_tick_count_[6];
- }
- #endif
- </font>
复制代码
3.试用到期提醒界面 系统第一次开机时会获取RTC时间,记录到EEPROM中。以后每次运行时,单片机从液晶屏读取RTC信息,与第一次开机时间做对比,如果超过60天,且开启了试用到期提醒功能,则在弹出试用到期提醒界面图9,用户可以在试用到期提醒界面输入购买密钥,来解锁设备。如图所示:
也可以通过按键来模拟,程序如下:
- /*模拟试用期到期,弹出提示框*/
- if( Key_Scan(keyPort,keyPin5) == KEY_ON )
- {
- LED2(0);
- SetScreen(31);
- buykeyflag=1;
- }
- else
- {
- LED2(1);
- }
复制代码
密码检验程序: - <font size="3" face="宋体">/*****读寄存器值************/
- address = ((u16)msg->addr[0])<<8|msg->addr[1];
- switch(address)
- {
- case 0x00B1://M1参数设置密码校验
- {
- keyData[0] = ((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
- if(keyData[0]==123456) //校验正确
- {
- SetScreen(37);
- CLRsetKeyReg(0x82,0x00B1,0);
- keyData[0]=0;
- }
- break;
- }
- case 0x00B3://M2参数设置密码校验
- {
- keyData[1] = ((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
- if(keyData[1]==654321) //校验正确
- {
- SetScreen(28);
- CLRsetKeyReg(0x82,0x00B3,0);
- keyData[1]=0;
- }
- break;
- }
- case 0x00B5://试用到期密码校验
- {
- keyData[2] = ((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
- if(keyData[2]==123654) //校验正确
- {
- buykeyflag=0;
- SetScreen(4);
- CLRsetKeyReg(0x82,0X00B5,0);
- keyData[2]=0;
- }
- else //校验错误
- {
- keyData[2]=0;
- SetScreen(31);
- }
- break;
- }</font>
复制代码
4.调节屏幕背光亮度 我们可以通过寄存器来设置背光亮度,非常方便。
对于串口接受这块,特别是对于工业串口屏,串口使用非常频繁,健壮的串口程序注意几点:
(1)对于没有dma和空闲中断功能的单片机,最好采用环形队列+超时的方法,保证不会出现丢帧等串口问题,对于那种串口接受,比如接受数据的同时判断解析数据的话,肯定会出问题的;
(2)对于具备dma和空闲中断功能的单片机,建议采用DMA+空闲中断的方法,帧接受中断,效率非常高,对于不等长的数据非常方便;
(3)对于串口设备初始化后最好延时一段时间,时间具体情况而定。
|