迪文科技论坛

 找回密码
 立即注册
搜索
查看: 6317|回复: 13

【开源】基于DGUS II迪文屏的智能化生产控制系统

[复制链接]

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
发表于 2021-3-18 18:27:02 | 显示全部楼层 |阅读模式
本帖最后由 lihui163 于 2021-3-22 09:31 编辑

     简单了解一下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屏实时显示,完整的人机界面控制系统,界面控制采用多级切换,具体通过单片机USARTDGUS屏通讯协议来控制,可用触摸方式或者按键来触发控件消息。

  整个界面系统主要需要五个功能
  1.自动化产线(设备监控)界面;
  2.参数设置及保存界面;
  3.产线产量统计;
  4.四系统异常界面提醒及常规解决方法;
  5.试用提醒功能及广告。

  具体硬件配置如下:
  1.采用T5UID2屏,分辨率为1024*600  
  2.整体供电采用24V开关电源
  3.232通讯,波特率为115200
  4.单片机为STM32F103VET6,100引脚,lqfp封装
硬件原理图如下,原理图的功能比较多,有485和CAN通讯等,大家可以简单参考一下
人机界面主界面如下


下面是程序详细功能说明
控制系统,主要由动力部分、倍捻单元、传动部分三大部分构成。
动力部分:电动机、电气控制箱、指示器、操作面板或者人机交互界面;
先看下主函数
  1. //程序入口
  2. int main(void)
  3. {
  4.     qsize  size = 0;
  5.     u8        iFor;
  6.     uint32 timer_tick_last_update[100] = {0}; //上一次更新的时间
  7.     /*配置时钟*/
  8.     SystemInit();
  9.         /*配置串口中断*/
  10.     Interrupts_Config();
  11.         /*配置滴答定时器时钟节拍*/
  12.     systicket_init();
  13.         /*定时器配置*/
  14.     TIMER_Config();//定时器2 1ms中断
  15.         /*LED配置*/
  16.     LED_GPIO_Config();
  17.         /*key配置*/
  18.     Key_GPIO_Config();
  19.         /*串口初始化,波特率设置为115200*/
  20.     Uart1Init(115200);
  21.     /*清空串口接收缓冲区*/
  22.     queue_reset();
  23.         /*读取eeprom*/
  24.     FLASH_ReadBytes((u8 *)&readflash,Flash_ADDR,sizeof(readflash));//sizeof(readflash)字节长度
  25. //    /*将读出EEPROM的数据发送至显示屏*/
  26. //    for(iFor=0; iFor<12; iFor++)
  27. //    {

  28. //    }
  29. //    /*读取显示屏&单片机RTC时间*/
  30. //    {

  31. //    }
  32.     /*清除密码存放区数据*/
  33.     CLRsetKeyReg(0x82,M1_KEY_REG,0);
  34.     delay_ms(1000);
  35.     CLRsetKeyReg(0x82,M2_KEY_REG,0);
  36.     delay_ms(1000);
  37.     CLRsetKeyReg(0x82,BUY_KEY_REG,0);
  38.     delay_ms(1000);
  39.     /*切换页面显示*/
  40.     SetScreen(0);
  41.     delay_ms(3000);
  42.     SetScreen(1);
  43.     delay_ms(3000);
  44.     SetScreen(2);
  45.     delay_ms(3000);
  46.     SetScreen(3);
  47.     delay_ms(3000);
  48.     /*看门狗初始化*/
  49.     wdoginit();
  50.     while(1)
复制代码


1.设备监控
生产界面主要包括:产线编号、电动机运行状态、锭子状态、减速装置状态、各个传感器状态指示等,如下图所示。

a)       产线编号:方便产线巡检时查看,一目了然,如上图所示的1号机、2号机。
b)       电动机运行状态:正常运行与故障。
c)       锭子状态:正常运行与故障。
d)      减速装置:正常运行与故障。
e)       各个传感器状态:传感器采集采用闭环回路,防止因传感器损坏而影响产线生产。


复制代码

2.参数设置
参数只能由工程师或管理员来设置,为了防止工人误操作,故加密码防护,进入需要输入登陆密码,密码界面如下图

a)       密码区域由变量输入、数据变量显示构成,其中变量输入绑定键盘实现手动输入功能,数据变量显示与变量输入绑定到同一个地址,实现键盘输入后数据回显。
b)       登陆密码为6位整数,通过键盘输入,输入完成点击确认,单片机进行密码校验。参数设置界面图5主要用来设置倍捻机参数,主要包括锭速、捻速、电机速度等,单片机运动之前会获取这些配置参数。
c)       用户点击每一栏的参数设置区域,会唤醒键盘,用户输入完相应数据后,点击保存,将当前页面数据写入EEPROM和液晶屏对应的位置。除下“捻向”参数是一个1位整数,设置范围0~9;其余参数都是4位整数,设置范围0~9999

程序代码如下
  1. case        0xB7://读取 M1 锭速 寄存器数据
  2. {
  3. ReadReg[0]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  4. FLASH_WriteBytes(msg->data,Flash_ADDR+4*0,4);
  5. break;
  6. }
  7. case        0xB9://读取 M2 锭速 寄存器数据
  8. {
  9. ReadReg[1]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  10. FLASH_WriteBytes(msg->data,Flash_ADDR+4*1,4);
  11. break;
  12. }
  13. case        0xBB://读取 M1 捻速 寄存器数据
  14. {
  15. ReadReg[2]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  16. FLASH_WriteBytes(msg->data,Flash_ADDR+4*2,4);
  17. break;
  18. }
  19. case        0xBD://读取 M2 捻速 寄存器数据
  20. {
  21. ReadReg[3]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  22. FLASH_WriteBytes(msg->data,Flash_ADDR+4*3,4);
  23. break;
  24. }
  25. case        0xBF://读取 M1 捻向 寄存器数据
  26. {
  27. ReadReg[4]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  28. FLASH_WriteBytes(msg->data,Flash_ADDR+4*4,4);
  29. break;
  30. }
  31. case 0xC1://读取 M2 捻向 寄存器数据
  32. {
  33. ReadReg[5]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  34. FLASH_WriteBytes(msg->data,Flash_ADDR+4*5,4);
  35. break;
  36. }
  37. case        0xC3://读取 M1 卷绕速度 寄存器数据
  38. {
  39. ReadReg[6]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  40. FLASH_WriteBytes(msg->data,Flash_ADDR+4*6,4);
  41. break;
  42. }
  43. case        0xC5://读取 M2 卷绕速度 寄存器数据
  44. {
  45. ReadReg[7]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  46. FLASH_WriteBytes(msg->data,Flash_ADDR+4*7,4);
  47. break;
  48. }
  49. case        0xC7:////读取 M1 电机速度 寄存器数据
  50. {
  51. ReadReg[8]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  52. FLASH_WriteBytes(msg->data,Flash_ADDR+4*8,4);
  53. break;
  54. }
  55. case        0xC9:////读取 M2 电机速度 寄存器数据
  56. {
  57. ReadReg[9]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  58. FLASH_WriteBytes(msg->data,Flash_ADDR+4*9,4);
  59. break;
  60. }
  61. case        0xCB:////读取 M1 往复次数 寄存器数据
  62. {
  63. ReadReg[10]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  64. FLASH_WriteBytes(msg->data,Flash_ADDR+4*10,4);
  65. break;
  66. }
  67. case        0xCD:////读取 M2 往复次数 寄存器数据
  68. {
  69. ReadReg[11]=((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  70. FLASH_WriteBytes(msg->data,Flash_ADDR+4*11,4);
  71. break;
  72. }
  73. default:
  74. break;
  75. }
  76. break;
复制代码
三、产量统计功能
产量统计以天为单位,循环记录,每个页面最多显示14组数据,主要通过对当天产量进行记录,在液晶屏上进行显示。主要界面如下图

a)       序号、生产日期、产量都是一个4位整型变量,用户进入产量统计界面后单片机读取EEPROM来获取日期和当天的产量,单片机通过写入对应的变量来显示序号、产量和日期。用户通过上一页下一页下发命令到单片机更新数据域。
程序如下,主要是采用滴答定时器1ms中断来递增时间变量,来刷新生产数据。
  1. #if (1)
  2.         //更新1~14序列号,滴答定时器
  3.         if(timer_tick_count_[0]-timer_tick_last_update[0]>=2000)
  4.         {
  5.             UpdateSerRec0();
  6.             timer_tick_last_update[0] = timer_tick_count_[0];
  7.         }
  8. #endif
  9. #if        (1)
  10.         //更新14~28序列号
  11.         if(timer_tick_count_[1]-timer_tick_last_update[1]>=3000)
  12.         {
  13.             UpdateSerRec1();
  14.             timer_tick_last_update[1] = timer_tick_count_[1];
  15.         }
  16. #endif
  17. #if        (1)
  18.         //更新生产记录-日期
  19.         if(timer_tick_count_[4]-timer_tick_last_update[4]>=30)
  20.         {
  21.             UpdateDateRec0();
  22.             timer_tick_last_update[4] = timer_tick_count_[4];
  23.         }
  24. //        if(timer_tick_count_[5]-timer_tick_last_update[5]>=100)
  25. //        {
  26. //                                                UpdateDateRec1();
  27. //            timer_tick_last_update[5] = timer_tick_count_[5];
  28. //        }
  29. #endif
  30. #if        (1)
  31.         //更新生产记录-产量
  32.         if(timer_tick_count_[6]-timer_tick_last_update[6]>=50)
  33.         {
  34.             UpdateProductRec0();
  35.             timer_tick_last_update[6] = timer_tick_count_[6];
  36.         }
  37. #endif
复制代码
四、
试用到期提醒界面
系统第一次开机时会获取RTC时间,记录到EEPROM中。以后每次运行时,单片机从液晶屏读取RTC信息,与第一次开机时间做对比,如果超过60天,且开启了试用到期提醒功能,则在弹出试用到期提醒界面图9,用户可以在试用到期提醒界面输入购买密钥,来解锁设备。如图所示
也可以通过按键来模拟,程序如下
  1. /*模拟试用期到期,弹出提示框*/
  2.         if( Key_Scan(keyPort,keyPin5) == KEY_ON  )
  3.         {
  4.             LED2(0);
  5.             SetScreen(31);
  6.             buykeyflag=1;
  7.         }
  8.         else
  9.         {
  10.             LED2(1);
  11.         }
复制代码
密码检验程序
  1. /*****读寄存器值************/
  2.                         address                =        ((u16)msg->addr[0])<<8|msg->addr[1];
  3.                         switch(address)
  4.                         {
  5.                                 case        0x00B1://M1参数设置密码校验
  6.                                 {
  7.                                         keyData[0]                =        ((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  8.                                         if(keyData[0]==123456)        //校验正确
  9.                                         {
  10.                                                 SetScreen(37);
  11.                                                 CLRsetKeyReg(0x82,0x00B1,0);
  12.                                                 keyData[0]=0;
  13.                                         }
  14.                                         break;
  15.                                 }
  16.                                 case        0x00B3://M2参数设置密码校验
  17.                                 {
  18.                                         keyData[1]                =        ((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  19.                                         if(keyData[1]==654321)        //校验正确
  20.                                         {
  21.                                                 SetScreen(28);
  22.                                                 CLRsetKeyReg(0x82,0x00B3,0);
  23.                                                 keyData[1]=0;
  24.                                         }
  25.                                         break;
  26.                                 }
  27.                                 case        0x00B5://试用到期密码校验
  28.                                 {
  29.                                         keyData[2]                =        ((u32)msg->data[0])<<24|((u32)msg->data[1])<<16|((u32)msg->data[2])<<8|msg->data[3];
  30.                                         if(keyData[2]==123654)        //校验正确
  31.                                         {
  32.                                                 buykeyflag=0;
  33.                                                 SetScreen(4);
  34.                                                 CLRsetKeyReg(0x82,0X00B5,0);
  35.                                                 keyData[2]=0;
  36.                                         }
  37.                                         else                                                                //校验错误
  38.                                         {
  39.                                                 keyData[2]=0;
  40.                                                 SetScreen(31);
  41.                                         }
  42.                                         break;
  43.                                 }
复制代码
五、调节屏幕背光亮度
我们可以通过寄存器来设置背光亮度,非常方便










   

   


     





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-3-19 17:57:36 | 显示全部楼层
图片上传不了?
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-3-20 11:28:32 | 显示全部楼层
本帖最后由 lihui163 于 2021-3-22 09:32 编辑

对于串口接受这块,特别是对于工业串口屏,串口使用非常频繁,健壮的串口程序注意几点

1.对于没有dma和空闲中断功能的单片机,最好采用环形队列+超时的方法,保证不会出现丢帧等串口问题,对于那种串口接受,比如接受数据的同时判断解析数据的话,肯定会出问题的



2.对于具备dma和空闲中断功能的单片机,建议采用DMA+空闲中断的方法,帧接受中断,效率非常高,对于不等长的数据非常方便。

3.对于串口设备初始化后最好延时一段时间,时间具体情况而定
回复

使用道具 举报

6

主题

40

回帖

327

积分

中级会员

Rank: 3Rank: 3

积分
327
发表于 2021-3-23 07:31:08 | 显示全部楼层
感谢分享,DGUS II迪文屏功能和DGUS屏有啥区别
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-3-23 13:09:07 | 显示全部楼层
liuxiaofei 发表于 2021-3-23 07:31
感谢分享,DGUS II迪文屏功能和DGUS屏有啥区别

看看这个图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

6

主题

40

回帖

327

积分

中级会员

Rank: 3Rank: 3

积分
327
发表于 2021-3-30 22:20:29 | 显示全部楼层

好的,非常感谢
回复

使用道具 举报

27

主题

61

回帖

411

积分

中级会员

Rank: 3Rank: 3

积分
411
发表于 2021-10-16 16:25:29 | 显示全部楼层
你这么多界面,这么多控件,请问你的VP和SP地址怎么管理的,每个控件都要手工指定地址很烦躁啊。。。。。
回复

使用道具 举报

2

主题

679

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12172
发表于 2021-10-16 19:17:21 | 显示全部楼层
spy 发表于 2021-10-16 16:25
你这么多界面,这么多控件,请问你的VP和SP地址怎么管理的,每个控件都要手工指定地址很烦躁啊。。。。。 ...

您好,一般建议在工程之前做好地址规划
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
 楼主| 发表于 2021-10-19 18:06:45 | 显示全部楼层
spy 发表于 2021-10-16 16:25
你这么多界面,这么多控件,请问你的VP和SP地址怎么管理的,每个控件都要手工指定地址很烦躁啊。。。。。 ...

的确没有更好的办法
回复

使用道具 举报

0

主题

4

回帖

149

积分

注册会员

Rank: 2

积分
149
发表于 2021-11-5 16:25:06 | 显示全部楼层
你好,程序上怎么没看到连续发送83读取指令啊,小白一枚,麻烦解答一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 07:58 , Processed in 0.088857 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表