目的:希望有一个普遍思路,引导这类产品的选择和快速运用。以下为DWIN屏应用过程。
(一)刚拿到屏,需要了解什么?(粗体字的参数影响对工业屏的选择)
一、屏幕:
1.电阻 or 电容屏
电容屏支持多点触控,使得触摸屏按键支持组合键。
反之,电阻屏(dwin采用)只能检测到一点,只要屏幕上一直有键不抬起(第一次按下的键或其他键),屏就检测不到其他按键。
eg.dwin控件“同步数据返回”
背景知识:寄存器06记录当前屏幕是否有按压:03 一直按压中;02 抬起
初始设置:假设页面上有同步A和同步B。同步A和B用mode1(对变量地址写值)。A和B键值设置为:
状态 键值
A按下 1E
A保持 1E
A抬起 9E
B按下 30
B保持 30
B抬起 B0
测试操作流程及结果:
step1:A先按下,B再按下
读到的结果: A:001E
B:0000
Reg06:03
step2:A抬起
读到的结果: A:001E
B:0000
Reg06:03
...
last step:B抬起,此时已没有键按下,则被认为是A抬起。
结论:若需要知道触摸键是否在保持状态:电阻屏(不支持多点触控)只能通过判断整个屏幕是否有键按下来判断。
若界面中有大的(越大越好)且要求正方形的控件(画布),则控件布局上16:9的比4:3有优势,更容易放下更多按键。
2.分辨率
手里的是800*600。图片分辨率要和屏相同。
3.位图要求:
A.dwin屏幕采用16bit调色板,但要求图片均为24位色bmp。 见注释[2]
dwin的16bit调色板导致24位色图片中一些细微的色彩看不到。
我估计dwin内部流程是:1.检查所有图片是不是24位色bmp。2.调用页面时通过16bit调色板转成16位图。
B.图标图片要求和过滤背景色:见客服给的《简单用画图板处理图标使能过滤掉背景色》。
二、串口通讯
1.选择串口协议
串口协议会影响主从关系的顺利实现。
eg. dwin支持485,232,TTL;项目上将单片机的485口留给dwin屏(为什么用485?注释[1] 232,485,TTL区别)。这就决定了:若单片机作为主机,查询从机时,主从可能在链路上打架(ysmz4:这个不太了解,如果主机在发送后很快释放(注释[2])不知道能不能彻底解决这个问题)。
2.232线序(232测试用)
PC上是DB9公头,所以自制一根线,一端是DB9母头,一端连屏的凤凰端子。DB9母头pin2(DB9定义为Tx)接屏的232_Tx.
3.屏如何处理传来的数据?
1/屏什么时候处理指令 —— 中断当下处理 or OS周期处理?指令缓冲区大小?
dwin:串口中断里不做处理,DGUS周期里处理255字节指令。见《DGUS与OS的关系》
2/实际指令长度若和指令中的设置长度不符,怎么办?(是否有线路超时主动丢弃包机制)
dwin测试:
单片机发送:连发两次 5A A5 04 83 0100 (两次发送之间间隔时间不限)
dwin返回:第二次发送后返回 5A A5 04 83 0100 5A + 5A个数据
结论:dwin屏只看指令中设置的长度,而没有线路超时主动丢弃包的机制。导致收发不同步,crc校验也没用。这是个大BUG!
三、下载调试
dwin有两种调试办法:
1.SD
1/SD卡要求:size限制(dwin支持2G-16G),fat32格式,如果有问题则尝试格式化
2/SD根目录下存放DWIN_SET文件夹。
2.ED2 (SD转USB)
1/安装连接流程:连接ED2,安装驱动(驱动名和ED2毛关系没有,很不人性化。驱动安装:___T080,就是指T系列,8寸屏,安装XR那个驱动)。
2/使用时的注意事项:进入软件,点击“DGUS”。最上面一排的Baudrate需要手动输入6250000(而不是在列表下选择)。
3/注:当硬件配置有改动时(config.txt改动),只能用 SD下载到屏,而不能用ED2!
ps:ED2要我70块钱,够坑!!
3.下载调试 常见问题与解决办法:
1/hmi通过sd下载到迪文屏,若下载不成功则注意:
A.sd根目录下存放DWIN_SET。
B.手册中写着图片要求:所有图片必须是bmp,分辨率必须和屏幕一样(800*600),24位色。(注释[4] 如何修改分辨率,位色)
2/下载后显示的图片不是我设置的图片?
图片编号要从0号开始。SD下载进屏后,屏幕会停在0号图片处。
四、OS运行机制
eg.dwin DGUS
1.初始化:
1/如果用到22.bin:将22.bin(放地址对应数值,56KB,但只有字节地址[0~0x6FFF]中的内容被copy)中的内容copy到DGUS flash的变量区(相当于RAM,掉电不保存)。
ps:初始化时:将22.bin(56KB,[0~0xE000])映射到flash(256MB)中变量地址区间[0~0x6FFF],大于22.bin中大于0x6FFF的部分内容就废了,注意这部分不要写东西!!
2/加载13.bin触控文件,14.bin显示变量文件。即把13.bin,14.bin的所有指令中变量地址部分映射到flash中的变量地址区间[0~0x6FFF]。
2.运行:
1/每个DGUS周期处理一次触控变量和显示变量,处理255字节串口指令;按键中断和串口中断中只是标记,不处理。DGUS和PLC OS机制一样。
3.dwin tips:
复位WDT:相当于断电后再上电。(这句不知道什么意思)
大概在DGUS程序“处理配置寄存器”时不会关中断。
五、模块
1.按键
屏的通用性:输入:物理按键/触摸屏。是否为了通用性模仿键盘。
屏发出的是 键值or电平?
单点触控的屏幕不能实现键盘的组合键。
eg.dwin:同步数据返回 按下时写1,抬起时写0,主机定时扫描屏键值。屏发送的就是电平信号,具体怎么做由主机决定。
2.电机调速
六、FLASH地址规划
1.为什么要做地址规划?
dwin如果不了解地址规则,很容易出错,而且不容易排查
DGUS初始化时加载13.bin,14.bin。若其中两个变量地址空间有重合部分(有的变量地址占多个地址),生成和加载时dwin不报错,运行时出现异常,这时面对着一堆变量,已经不容易排查了。
2.怎么做地址规划?
1/所有可用的地址空间
对应指令读写空间
DGUS硬件寄存器空间:256B 指令80,81:0x00-0xFF(数据单位:字节)
DGUS用户变量存储空间:56KB 指令82,83:0x0000-0x6FFF(数据单位:字)
字库和图标库存储空间:32MB(其中字库空间: 32-127 号( 0x20-ox7F)汉字库, 24MB)
图片存储空间:224M
OS 变量寄存器:共 256 个 只能 OS 访问:R0—R255
(开发指南P41 “页面地址”指的是14.bin里的地址,和flash里的无关。)
2/不同控件用到的地址
首先说明,控件们会用到各种地址,有的叫变量地址(VP),描述指针(SP),辅助地址,,,它们的地址范围都是[0,0x6FFF]地址(除非当不需要某个SP时地址设为FFFF即无效)。
关于地址冲突:
dwin tool软件生成时检查的是所有VP和SP地址有没有一样的。但引起冲突的另一个原因是SP属性所占的地址长度长短不一,导致误使两个不同类型控件属性地址有重合。
若控件能按位变量控制,希望控件A和控件B对应于同一个变量地址的不同位,则可以设置为:A变量地址=B变量地址=0x0000,A,B对应于不同位。该情况下A,B变量地址相同。
Q:不同页面的两个控件能不能对同一个VP地址调节或显示?
A:可以
VP(变量地址)和SP(描述指针)通常是指显示变量功能的两种定义,两者共用0000到6FFF地址:
1、VP指某个变量显示功能必须需要的实际地址,必须要定义。
2、SP指某个VP地址显示的控件的属性地址,以便在应用中可以让用户指令修改,达到实时控制不同显示效果目的如字体颜色、位置、状态等属性。可以不定义(默认FFFF)。
以下是实验过程中摸索出来的,可能需要补充。
eg.位变量图标显示控件的辅助地址:
辅助地址在动画显示时有用。
辅助地址的范围:[0,0x6FFF]
我的做法:辅助地址跟在变量地址后面。比如变量地址=0x0000,辅助地址=0x0001(辅助地址占两个字地址)
若希望控件A和控件B对应于同一个变量地址的不同位,则可以设置为:A变量地址=B变量地址=0x0000,A辅助地址=B辅助地址=0x0001,A,B对应于不同位。
eg.图标变量:
1.当SP无效(SP=0xFFFF):只访问*VP。
2.当SP有效,实验:
实验1:查看SP地址区间存的是什么
步骤:1.控件设置SP=0x0100,VP=0x0200:
2.PC发: 5A A5 04 83 01 00 08
屏应答:5A A5 14 83 01 00 08 02 00 02 8D 00 51 00 00 00 01 00 02 00 01 18 00
*SP=VP <--------------属性--------------------->
实验2:能否SP=VP?
步骤:1.控件设置SP=0x0100,VP=0x0100
2.PC发: 5A A5 04 83 01 00 08
屏应答:5A A5 14 83 01 00 08 01 00 02 8D 00 51 00 00 00 01 00 02 00 01 18 00
<-VP-><--------------属性--------------------->
结果:屏不能显示图标。
结论:不能。
eg.动画图标显示
实验1:查看SP地址区间存的是什么
步骤:1.设置:SP=0x0100,VP=0x0200:
2.PC发: 5A A5 04 83 0100 0a
屏应答:5A A5 18 83 0100 0A 02 00 02 90 00 1D 00 00 00 00 00 01 00 04 00 03 00 04 18 00
<----VP----><--------------属性---------------------------->
目标:实现图标定时切换-----begin
PC发: 5A A5 04 83 0200 02
屏应答:5A A5 08 83 0200 02 00 00 00 00
PC发: 5A A5 05 82 0200 00 01
目标:实现图标定时切换-----end
实验2:2个控件的VP能否设置为连续?
步骤1.设置:控件A SP=0x0200,VP=0x0100
控件B SP=0x0300,VP=0x0101
2.PC发: 5A A5 05 82 0100 00 01
屏显示:不能显示控件B。
结论:不能。必须相差2个地址。
(二)如何使用屏的自带控件?
一、首先看:控件的实现效果,视频最直观。
二、拿到屏演示文件的源码,用哪做哪。
eg.dwin:
1.效果:第n次按下时,对变量地址写值(Xn)并改变图标显示。eg,滑块
控件:图标变量+增量调节
注释
[1] 232,485,TTL区别
具体的去看协议。这里只列出为什么项目主板上偏爱485而不是232:
232是一对一的通讯,485是一对多的通讯。
传输速度:
一般的通讯多会用到,9600bps 38400bps 115200bps;
RS485采用差分传输,最远传输1200米,最高传输速率可以达到10M,
一般速率越高传输距离也就越短,当然还和传输的介质有关系了;
RS232受到电容负载的限制,只能通讯15米。
追问:
这个最高传输的10M是怎么设置的,是物理层面的限制吗?
追答:
对,物理层决定的
RS232,TTL232电压范围:
TTL输出
高电平: 2.4 < v < 5
低电平: 0 < v < 0.8
RS232输出
高电平: -15 < v < -3
低电平: 3 < v < 15
[2]Windows位图和调色板,bmp文件格式 http://blog.csdn.net/ysmz4/article/details/47776735
[3]【为避免485冲突,主机占用后要立刻释放】STM32再学习——实现完美的RS485 http://blog.csdn.net/ysmz4/article/details/47750525
[4] 如何修改分辨率,位色
打开画图,ctrl+W(拉伸/扭曲)修改分辨率,保存时修改位色。
三)dwin实际应用遇到的问题
开发指南结构:
结构 P4
处理流程 P6
指令集 P15
寄存器表 P17
寄存器,变量,字库空间 5.1 P20
一、指令,地址
读地址指令
5A A5 04 83 0000 1a 读flash的变量地址区间[0~0x6fff]! 读26个字!
二、文件
tips:
若两个文件文件号相同,则调用其中一个!当22.bin,22_config.bin同时存在,OS实际调用的是22_config.bin
13.bin
由若干条参数集合组成。PC软件写好后固化,运行时不被改写。
举例:
00 00 010200C701300104 FF00 FF00 FE08 xx..
页面ID 坐标 目标切换页面 按压效果 触控键码TP_CODE TP_FUN触控描述(长度32)
22.bin
1.每次生成时软件会自动清空22.bin!所以要将22.bin放到外部备份。
2.串口指令寻址存储器:字地址
PC软件配置22文件变量地址:字节地址
eg.22文件变量地址0x0300 数据量单位:字节 => 串口指令寻址0x0180,数据量单位:字
文本显示
变量地址0x0010 对应 22.bin的0x0020位置
文本初始值:若软件里设置为“迪文科技”,同时22.bin 0x20位置开始为“我是大神”,则文本将显示“我是大神”
可见22.bin优先级高于软件的设置。
三、按键控件
控件作用简述:
按键值返回:对某变量地址(对应控件eg变量图标)赋值以改变控件状态。
文本数据录入:按键键值写到*VP。
按键触发:指令对寄存器0x4F写键值,进入文本录入
基本触控:(按键效果),页面切换,短回路文本输入
增量调节:可用0-1范围调节
1.键控键值
除了同步返回数据没有“键控键值”功能,其他按键控件都有。
键控键值:设置键控键值以后,就不能在屏上进行触摸操作。只能发指令实现
eg.按键返回+键控
键控键值:0x12
键值:0xabab
变量地址:0x0010
测试过程:
发送指令查变量地址值:5A A5 04 83 0010 01 (返回5A A5 06 83 00 10 01 00 00 )
发送键控指令:5A A5 03 80 4F 12
发送指令查变量地址值:5A A5 04 83 0010 01 (返回5A A5 06 83 00 10 01 AB AB )
即:通过键控(开键控则触控无效)改变变量地址值
2.Q:数据同步返回和带键控键值的基础触控 能否叠加使用?
A:可以实现这两个叠加的功能。
那就按压的话就只有按压数据同步返回才能触摸有效
带键控的就只能是发指令控制。
3.同步数据返回 VPxS,VPxT
VPXS,VPXT范围:[0~0x6FFF],就是说初始化后它们都指向flash中的变量地址区间[0~0x6FFF]
VPXS不能等于VPXT,否则会出现异常!!(做好地址规划)
4.同步数据返回 从按下到保持的时间:
客服说:小于500ms。
5.同步数据返回 ysmz4猜测检查按键状态的办法:
http://home.**/my/space-uid-116926-blogid-15886.html 的最后一种
6.弹出菜单
弹出菜单:
命令控制菜单弹出,菜单上只能有基本触控,其他显示、触控无效。
当接收到一个触控后屏将键值写到“弹出菜单”控件的*VP并自动将菜单关闭。
触控下(非键控):弹出菜单后,按下基础触控后*VP修改,菜单立刻退出;只要没有按下基础触控使菜单关闭,菜单以外的按键就无效(比如希望用方位键控制菜单里的焦点就不可以,不过既然是触控也就不需要方位键选择了哦呵呵)。
键控实现长回路。命令:5A A5 03 80 4F xx(弹出菜单键值)
7.焦点:
外部键盘按方位键,框依次落到不同控件上。当enter按下,主机发键值。
办法:1.做个框的图标,图标变量设置了描述指针,发指令改变位置(指令eg.5A A5 07 82 0301 0010 0005);2.基本图形
8.分页显示图标们
显示比较费劲。问题如下:
1.页面数不能动态改,要改系统程序。
2.图标可以根据命令移动,但是按键位置不能改。
所以要做的话,需要[页面,按键值]-花样的映射
3.外部导入花样时,生成图标要改系统程序。
9.列表显示
注意:列数必须大于1,否则不显示。
四、寄存器
1.0x05和0x07一起用:
用07寄存器,坐标位置第一次点击屏后显示,后面点击坐标位置都没有更新了,需要再05寄存器里面写5A更
新触摸屏坐标,再点击屏,07寄存器读才会返回下一个坐标的位置
2.0x10-0x1c 配置寄存器的映射:就是写config.txt
五、图片图标
1.不要直接在它生成的图标文件夹里改图片,否则可能会被原来的图片重写,那就白改了!
2.图片和图标会在它从24位图改成16位时将背景变为粉色。
六、数据库
图片空间一共存32+209张图片,其中209张图片像素值可改。
2.图片占用空间
比如32.bmp,占用字地址0~0x3FFFF(实际占用800*600*1B=480000B=0x3A980个字地址)。以此类推。
3.改一张图片
①串口发包数目
一张图片的每个像素点占1BYTE(8位位图经运算转成16位位图),所以800*600图片占不到512KB,由于flash每页128KB,所以图片占4页。
800*600=480000个点,480000*1Byte=480000Byte,假设串口每次发250Byte,480000/250=1920包。所以改一张图片串口要发送1920包。
②串口发送时间
当波特率115200时,480000/115200=4s.
③页面擦写次数
每次写数据库都是先擦页后写页。串口将数据copy到变量区,然后变量区写到数据库。变量区56KB,所以为了减少页面擦写次数,需要预留变量区空间(越大越好),假设预留了56KB, 当串口发送数据将56KB填满后,变量区缓冲整体copy到数据库,那么改一张图片则每页需要被擦128KB/56KB=3次。
4.Q:若只有一张图片32.bmp,存放到哪里,32.bmp所在地址(即数据库0地址)还是0.bmp所在地址?
A:32.bmp所在地址
七、基本图形
1.两个基本图形控件位置重合,一个用于剪切粘贴,一个用于画线。注意用于画线的控件要在另一个控件上面,否则画线被覆盖。
2.放大指令测试:
两个基本图形控件所在上下层:
上层:地址0x3000
下层:地址0x0000
测试1:
下:端点连线
5aa5 13 82 0000 0002 0001 f800 0104 010E 0114 012E
上:放大
5aa5 13 82 3000 0010 0001 0000 0000 0104 010E 01CC 01D6
结果:可以放大
测试2:
上:端点连线
5aa5 13 82 3000 0002 0001 f800 0104 010E 0114 012E
下:放大
5aa5 13 82 0000 0010 0001 0000 0000 0104 010E 01CC 01D6
结果:不能放大
两个基本图形控件所在上下层改成:
上:0x0000
下:0x3000
测试3:
下:端点连线
5aa5 13 82 3000 0002 0001 f800 0104 010E 0114 012E
上:放大
5aa5 13 82 0000 0010 0001 0000 0000 0104 010E 01CC 01D6
结果:可以放大
测试4:
上:端点连线
5aa5 13 82 0000 0002 0001 f800 0104 010E 0114 012E
下:放大
5aa5 13 82 3000 0010 0001 0000 0000 0104 010E 01CC 01D6
结果:不能放大
结论:实现放大的条件——被放大基本图形控件要置于下层,放大控件置于上层。和控件的地址无关。
八、flash数据导出
导出文件是加密的。 |