`
java-admin
  • 浏览: 1392389 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

gallery3d源码学习总结(一)——绘制流程drawFocusItems

阅读更多

eoe·Android开发者门户

标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems [打印本页]


作者: specialbrian    时间: 2010-10-29 20:15     标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems

本帖最后由 specialbrian 于 2010-11-4 07:59 编辑

显示单张图片相关的输入变量

  1. int selectedSlotIndex = mSelectedSlot;
  2.         GridDrawables drawables = mDrawables;
  3.         GridCamera camera = mCamera;
  4.         DisplayItem[] displayItems = mDisplayItems;
  5.         int firstBufferedVisibleSlot = mBufferedVisibleRange.begin;
  6.         int lastBufferedVisibleSlot = mBufferedVisibleRange.end;
  7.         boolean isCameraZAnimating = mCamera.isZAnimating();
复制代码

删除当前选中槽位前后2步之外的大缩略图

  1. for (int i = firstBufferedVisibleSlot; i <= lastBufferedVisibleSlot; ++i) {
  2.             if (selectedSlotIndex != Shared.INVALID && (i >= selectedSlotIndex - 2 && i <= selectedSlotIndex + 2)) {
  3.                 continue;
  4.             }
  5.             DisplayItem displayItem = displayItems[(i - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT];
  6.             if (displayItem != null) {
  7.                 displayItem.clearScreennailImage();
  8.             }
  9.         }
复制代码

得到当前图片的DispalyItem元素

  1. int centerIndexInDrawnArray = (selectedSlotIndex - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
  2.             if (centerIndexInDrawnArray < 0 || centerIndexInDrawnArray >= displayItems.length) {
  3.                 return;
  4.             }
  5.             DisplayItem centerDisplayItem = displayItems[centerIndexInDrawnArray];
  6.             if (centerDisplayItem == null || centerDisplayItem.mItemRef.mId == Shared.INVALID) {
  7.                 return;
  8.             }
复制代码

判断大缩略图是否加载完成

  1. boolean focusItemTextureLoaded = false;
  2.             Texture centerTexture = centerDisplayItem.getScreennailImage(view.getContext());
  3.             if (centerTexture != null && centerTexture.isLoaded()) {
  4.                 focusItemTextureLoaded = true;
  5.             }
复制代码

是否跳过当前图片前一张图片

  1. float camX = camera.mLookAtX * camera.mScale;
  2. float centerTranslateX = centerDisplayItem.mAnimatedPosition.x;
  3.             final boolean skipPrevious = centerTranslateX < camX;
复制代码

开启opengl混合模式并设置混合函数

  1. gl.glEnable(GL11.GL_BLEND);
  2.             gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
复制代码

循环遍历前中后三幅图片分别进行“核心绘制处理”

  1. for (int i = -1; i <= 1; ++i) {
  2.                 if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
  3.                     continue;
  4. 。。。
  5. }
复制代码

核心绘制处理——输入变量准备

  1. if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
  2.                     continue;
  3.                 float viewAspect = camera.mAspectRatio;
  4.                 int selectedSlotToUse = selectedSlotIndex + i;
  5.                 if (selectedSlotToUse >= 0 && selectedSlotToUse <= lastBufferedVisibleSlot) {
  6.                     int indexInDrawnArray = (selectedSlotToUse - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
  7.                     if (indexInDrawnArray < 0 || indexInDrawnArray >= displayItems.length) {
  8.                         return;
  9.                     }
  10.                     DisplayItem displayItem = displayItems[indexInDrawnArray];
  11.                     MediaItem item = displayItem.mItemRef;
  12.                     final Texture thumbnailTexture = displayItem.getThumbnailImage(view.getContext(), sThumbnailConfig);
  13.                     Texture texture = displayItem.getScreennailImage(view.getContext());
复制代码

在幻灯模式下且超过1秒的切换时间无须显示前后两张图片;
得到视角和当前displayItem、对应媒体对象、小缩略图材质、大缩略图材质。
加载高质量的材质资源

  1. if (isCameraZAnimating && (texture == null || !texture.isLoaded())) {
  2.                         texture = thumbnailTexture;
  3.                         mSelectedMixRatio.setValue(0f);
  4.                         mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
  5.                     }
  6.                     Texture hiRes = (zoomValue != 1.0f && i == 0 && item.getMediaType() != MediaItem.MEDIA_TYPE_VIDEO) ? displayItem
  7.                             .getHiResImage(view.getContext())
  8.                             : null;
  9.                     if (Gallery.PIXEL_DENSITY > 1.0f) {
  10.                         hiRes = texture;
  11.                     }
  12.                     if (i != 0) {
  13.                         displayItem.clearHiResImage();
  14.                     }
  15.                     if (hiRes != null) {
  16.                         if (!hiRes.isLoaded()) {
  17.                             view.bind(hiRes);
  18.                             view.prime(hiRes, true);
  19.                         } else {
  20.                             texture = hiRes;
  21.                         }
  22.                     }
复制代码

如果Camera正在拉远或拉近,且大缩略图材质为空或未加载完成,则选择小缩略图作为材质,将当前图片的“大缩略图混合比例”变量进行初始化(目标值为1秒,渐变时间为0.75秒,渐变开始时间为当前帧时间)。
如果处于放大状态,则加载原图hiRes,加载成功后赋值给材质变量texture;并清除前后图片的原图。
加载材质

  1. final Texture fsTexture = texture;
  2.                     if (texture == null || !texture.isLoaded()) {
  3.                         if (Math.abs(centerTranslateX - camX) < 0.1f) {
  4.                             if (focusItemTextureLoaded && i != 0) {
  5.                                 view.bind(texture);
  6.                             }
  7.                             if (i == 0) {
  8.                                 view.bind(texture);
  9.                                 view.prime(texture, true);
  10.                             }
  11.                         }
  12.                         texture = thumbnailTexture;
  13.                         if (i == 0) {
  14.                             mSelectedMixRatio.setValue(0f);
  15.                             mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
  16.                         }
  17.                     }
复制代码

保留当前的最佳材质,
如果此材质加载未完成,则继续按优先级加载,并把小缩略图(基本上都已经加载成功了)设置为当前材质;
最佳材质未加载完成之前,替换渐变不会开始。
无须绘制

  1. if (mCamera.isAnimating() || slideshowMode) {
  2.                         if (!slideshowMode && skipPrevious && i == -1) {
  3.                             continue;
  4.                         }
  5.                         if (!skipPrevious && i == 1) {
  6.                             continue;
  7.                         }
  8.                     }
  9.                     int theta = (int) displayItem.getImageTheta();
复制代码

如果相机缩放过程中,非幻灯片模式下且镜头中不需要展示前一张的情况下,无须处理前一张;
如果相机缩放或幻灯片绘制过程中,需要展示前一张的情况下,无须处理后一张。
处理前后渐变绘制

  1. // If it is in slideshow mode, we draw the previous item in
  2.                     // the next item's position.
  3.                     if (slideshowMode && timeElapsedSinceView < 1.0f && timeElapsedSinceView != 0) {
  4.                         if (i == -1) {
  5.                             int nextSlotToUse = selectedSlotToUse + 1;
  6.                             if (nextSlotToUse >= 0 && nextSlotToUse <= lastBufferedVisibleSlot) {
  7.                                 int nextIndexInDrawnArray = (nextSlotToUse - firstBufferedVisibleSlot)
  8.                                         * GridLayer.MAX_ITEMS_PER_SLOT;
  9.                                 if (nextIndexInDrawnArray >= 0 && nextIndexInDrawnArray < displayItems.length) {
  10.                                     float currentImageTheta = displayItem.mAnimatedImageTheta;
  11.                                     displayItem = displayItems[nextIndexInDrawnArray];
  12.                                     backupImageTheta = displayItem.mAnimatedImageTheta;
  13.                                     displayItem.mAnimatedImageTheta = currentImageTheta;
  14.                                     view.setAlpha(1.0f - timeElapsedSinceView);
  15.                                 }
  16.                             }
  17.                         } else if (i == 0) {
  18.                             displayItem.mAnimatedImageTheta = backupImageTheta;
  19.                             view.setAlpha(timeElapsedSinceView);
  20.                         }
  21.                     }
复制代码

如果处于幻灯片模式中 渐变过程中,处理上一幅相片时找到它的下一个DispalyItem,处理本张相片则直接使用当前DispalyItem,为的是同样找到当前DisplayItem,并绑定上一张相片和本张相片,两张相片透明度互补达到渐变的效果。
绘制小大缩略图渐变过程-小缩略图

  1. int vboIndex = i + 1;
  2.                         float alpha = view.getAlpha();
  3.                         float selectedMixRatio = mSelectedMixRatio.getValue(view.getFrameTime());
  4.                         if (selectedMixRatio != 1f) {
  5.                             texture = thumbnailTexture;
  6.                             view.setAlpha(alpha * (1.0f - selectedMixRatio));
  7.                         }
  8.                         GridQuad quad = GridDrawables.sFullscreenGrid[vboIndex];
  9.                         float u = texture.getNormalizedWidth();
  10.                         float v = texture.getNormalizedHeight();
  11.                         float imageWidth = texture.getWidth();
  12.                         float imageHeight = texture.getHeight();
  13.                         boolean portrait = ((theta / 90) % 2 == 1);
  14.                         if (portrait) {
  15.                             viewAspect = 1.0f / viewAspect;
  16.                         }
  17.                         quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
  18.                         quad.bindArrays(gl);
  19.                         
  20.                         drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null, 0.0f);
  21.                         quad.unbindArrays(gl);
复制代码

绘制小缩略图,请注意:selectedMixRatio表示大缩略图的绘制透明度,小缩略图的自然就是1.0f - selectedMixRatio。
绘制小大缩略图渐变过程-大缩略图

  1. if (selectedMixRatio != 0.0f && selectedMixRatio != 1.0f) {
  2.                             texture = fsTexture;
  3.                             if (texture != null) {
  4.                                 float drawAlpha = selectedMixRatio;
  5.                                 view.setAlpha(alpha * drawAlpha);
  6.                                 u = texture.getNormalizedWidth();
  7.                                 v = texture.getNormalizedHeight();
  8.                                 imageWidth = texture.getWidth();
  9.                                 imageHeight = texture.getHeight();
  10.                                 quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
  11.                                 quad.bindArrays(gl);
  12.                                 drawDisplayItem(view, gl, displayItem, fsTexture, PASS_FOCUS_CONTENT, null, 1.0f);
  13.                                 quad.unbindArrays(gl);
  14.                             }
  15.                         }
复制代码

更新当前图片长宽数据

  1. if (i == 0 || slideshowMode) {
  2.                             mCurrentFocusItemWidth = quad.getWidth();
  3.                             mCurrentFocusItemHeight = quad.getHeight();
  4.                             if (portrait) {
  5.                                 // Swap these values.
  6.                                 float itemWidth = mCurrentFocusItemWidth;
  7.                                 mCurrentFocusItemWidth = mCurrentFocusItemHeight;
  8.                                 mCurrentFocusItemHeight = itemWidth;
  9.                             }
  10.                         }
复制代码

绘制视频元素

  1. view.setAlpha(alpha);
  2.                         if (item.getMediaType() == MediaItem.MEDIA_TYPE_VIDEO) {
  3.                             // The play graphic overlay.
  4.                             GridDrawables.sVideoGrid.bindArrays(gl);
  5.                             drawDisplayItem(view, gl, displayItem, drawables.mTextureVideo, PASS_VIDEO_LABEL, null, 0);
  6.                             GridDrawables.sVideoGrid.unbindArrays(gl);
  7.                         }
复制代码

【此部分讲解已结束】,如您对其他部分感兴趣请回帖说明


作者: lily0314    时间: 2010-11-1 10:53

本帖最后由 lily0314 于 2010-11-19 15:55 编辑

写的挺好啊,谢谢啦!


作者: lily0314    时间: 2010-11-1 11:15

GridLayer和HudLayer分别是负责什么的?


作者: specialbrian    时间: 2010-11-1 11:26

回复 3# lily0314


    HudLayer是交互控件图层,GridLayer是动画元素层。


作者: lily0314    时间: 2010-11-1 14:30

谢谢啦,能否详细讲讲drawBlendedComponents和drawThumbnails方法?


作者: lily0314    时间: 2010-11-1 15:04

STATE_TIMELINE(GridLayer中的)是什么状态?能否截图?


作者: lily0314    时间: 2010-11-1 17:19

你好,我还想请问一下从打开软件,到呈现出文件夹界面,经过了哪些过程?图片的坐标是固定的吗?随着重力感应和手指滑动,位置会有细微的小位移,用什么方法呢?是改变视点还是怎样?具体的代码是怎样呢?


作者: specialbrian    时间: 2010-11-2 09:51

本帖最后由 specialbrian 于 2010-11-2 09:53 编辑

回复 6# lily0314
device.png

[attach]12020[/attach]

图片附件: device.png (2010-11-2 09:53, 359.51 KB) / 下载次数 1
http://www.eoeandroid.com/forum.php?mod=attachment&aid=MTIwMjR8MWI5NzVmYWN8MTMwMTYyMzkxNnw0ODEyMzA%3D


作者: lily0314    时间: 2010-11-2 10:17

回复 8# specialbrian


    噢,同一个文件夹内,按时间分类的界面啊,为什么我看不到这种界面?是需要怎样触发呢?
  那么STATE_MEDIA_SETS是刚打开时候的主界面(有文件夹的),STATE_GRID_VIEW是缩略图矩阵浏览的界面,对吗?


作者: specialbrian    时间: 2010-11-2 14:24

回复 9# lily0314
    你的理解没错,不过我习惯管STATE_MEDIA_SETS叫做相册表格页,STATE_GRID_VIEW是相片表格页,时间分类页在相片表格页的右上角控件控制,详见我图中的红色标记


作者: lily0314    时间: 2010-11-2 14:54

回复 10# specialbrian


    非常感谢!不知我之前的问题有没有可解?


作者: eoe-android-com    时间: 2010-11-2 15:29

想了解一下 缓存管理那一块的
CacheService类 ,以及怎么进行异步加载的呢 以及缓存文件的的写入读取的过程
特别是DCIM\.thumbnails\.thumbdata3--1967290299 缩略图文件是如何创建的
可否 详细的讲解一下呢 谢谢
如果方便的话可否加QQ:907288406交流一下


作者: specialbrian    时间: 2010-11-2 15:43

回复 11# lily0314
正在汇总整理当中,估计今明两天给出响应帖子


作者: lily0314    时间: 2010-11-2 16:05

回复 13# specialbrian


    呵呵谢谢啦,我就是看到哪,想到一些问题,就问你了,很期待你的讲解!


作者: lily0314    时间: 2010-11-2 16:55

本帖最后由 lily0314 于 2010-11-2 16:57 编辑

HudLayer.java文件中的MODE_NORMAL和MODE_SELECT是指哪些模式呢?是不是普通的模式和标记选中模式?我偶然能到标记选中模式下,但是不知道是怎么触发的,想请教下,可否有截图?


作者: specialbrian    时间: 2010-11-2 21:28

回复 5# lily0314

已经写了另一篇帖子,写了下drawThumbnails
    http://www.eoeandroid.com/viewthread.php?tid=41731&extra=


作者: specialbrian    时间: 2010-11-2 21:31

回复 15# lily0314


    是的,你的理解完全正确。出发多选的方式是长按一个相册或相片。


作者: specialbrian    时间: 2010-11-3 17:10

回复 12# eoe-android-com

第三篇文章
http://www.eoeandroid.com/viewthread.php?tid=41920&extra=
    写了大体流程,如有疑问请提到这个帖子中吧


作者: eoe-android-com    时间: 2010-11-8 15:43

回复 18# specialbrian


    非常感谢


作者: xiaomeigu330    时间: 2010-12-7 13:31

非常好,学习中。。。


作者: kuanbaobei    时间: 2010-12-8 11:45

楼主,你太帅了!能否把你对gallery3d的学习笔记,提供打包下载呢?真是讲的太好了!


作者: specialbrian    时间: 2010-12-30 14:38

目前只有这三篇:gallery3d源码学习总结(一)(二)(三),留下我的QQ:634589207


作者: contentroot    时间: 2011-1-24 11:46

问个问题。
大缩略图是做什么用的?
我跟代码没看到运行过呀?


作者: MEYEGG    时间: 2011-2-22 19:06

:):):)


作者: lzl26689    时间: 2011-3-7 17:39

谢谢啦


作者: qiuxueming    时间: 2011-3-7 18:38

不错,做个记号



欢迎光临 eoe·Android开发者门户 (http://www.eoeandroid.com/) Powered by Discuz! X1.5
分享到:
评论
1 楼 337240552 2011-07-17  
不得不说一句废话,写的真是好,收藏

相关推荐

    android 3d 分析

    例如,"gallery3d源码学习总结(一)——绘制流程drawFocusItems"可能是关于如何在焦点变化时绘制选中项的详细解析;"gallery3d源码学习总结(二)——绘制流程drawThumbnails"可能涵盖了如何绘制缩略图的步骤,这...

    埃斯顿量产伺服控制器:TMS320F2系列C代码、硬件图纸及全套技术方案

    内容概要:本文详细介绍了埃斯顿基于TMS320F28335 DSP和Lattice FPGA的伺服控制器技术。首先探讨了DSP部分的C语言代码架构,重点在于电机参数自动识别、电流电压反馈获取等功能。接着阐述了FPGA部分的VHDL代码,特别是编码器信号处理。硬件方面,涵盖了AD电路、主控板、显示板和驱动板的设计要点,强调了PCB布局的重要性。此外,文中还提到了伺服控制器的特色功能,如电机参数自动识别、低频振动抑制和通讯功能(MODBUS、CANopen)。最后讨论了量产技术生产方案,包括测试流程和成本控制措施。 适合人群:具有一定嵌入式开发经验和电机控制基础知识的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解伺服控制系统内部工作原理的人群,尤其是那些想要掌握DSP+C语言+FPGA联合开发技巧的工程师。目标是通过学习该伺服控制器的具体实现方法,提升自身在嵌入式系统设计方面的技能。 其他说明:文中提供了丰富的代码片段和硬件设计细节,有助于读者更好地理解和实践。同时提醒读者,由于涉及较多专业知识,初学者可能需要更多前置学习才能完全掌握相关内容。

    EPS模型MATLAB/Simulink下的电动助力转向系统控制系统与PID控制算法的回正控制策略及软件在环仿真测试

    内容概要:本文详细介绍了电动助力转向系统(EPS)在MATLAB/Simulink中的建模与仿真过程。首先讨论了被控系统的建模,包括电机模型、减速机构以及扭矩传感器的数学表达。接着深入探讨了PID控制算法的具体实现及其参数调整方法,特别强调了增量式PID的应用和抗积分饱和措施。随后讲解了回正控制策略的设计思路,利用状态机和二维查表来优化不同车速下的回正性能。最后分享了软件在环仿真的实践经验,包括自动化测试场景构建和参数优化技巧。 适合人群:从事汽车电子、底盘控制领域的工程师和技术人员,尤其是对电动助力转向系统感兴趣的开发者。 使用场景及目标:帮助读者掌握EPS系统的控制原理,学会使用MATLAB/Simulink进行相关建模和仿真,提高对PID控制算法的理解和应用能力,从而更好地应用于实际工程项目中。 其他说明:文中提供了大量实用的代码片段和调试经验,有助于加速开发进程并确保系统稳定性。此外,还提到了一些常见的陷阱和解决方案,使读者能够避免常见错误。

    基于Matlab的主动配电网实时无功优化:应用多目标粒子群算法及IEEE33算例仿真

    内容概要:本文详细介绍了基于Matlab实现主动配电网实时无功优化的方法,重点探讨了多目标粒子群算法(MOPSO)在风电和光伏接入背景下的应用。主要内容包括MOPSO算法的工作原理及其参数设置,如粒子数量、学习因子、惯性权重等;数据加载流程,涵盖负荷、光伏和风电数据;MOPSO算法的具体实现步骤,包括迭代更新粒子位置和速度;计算与绘图环节,用于展示优化前后电网的运行状况;以及结果计算与返回,验证优化效果。文中还讨论了如何通过调整算法参数和引入约束条件来提高优化性能,确保电网的稳定性和高效运行。 适合人群:从事电力系统研究和技术开发的专业人士,尤其是关注可再生能源接入对配电网影响的研究人员和工程师。 使用场景及目标:适用于电力系统的规划、运行和调度阶段,旨在通过优化无功补偿器参数和变压器变比,减少网损和电压偏差,从而提高电网的稳定性和能源利用率。 其他说明:文章不仅提供了详细的代码示例,还分享了许多实践经验,如惯性权重的动态调整、风光出力的实时处理、并行计算加速等,为实际应用提供了宝贵的指导。

    javassist-3.23.2-GA.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    跨平台移动应用开发_React-Native框架_腾讯云播放器SDK集成_实现高性能视频播放组件_支持多种视频格式与流媒体协议_包含完整播放控制功能_提供清晰度切换与弹幕支持_适用.zip

    跨平台移动应用开发_React-Native框架_腾讯云播放器SDK集成_实现高性能视频播放组件_支持多种视频格式与流媒体协议_包含完整播放控制功能_提供清晰度切换与弹幕支持_适用

    智能硬件安全_Android系统Root技术_Python自动化脚本开发_小天才电话手表一键Root工具_支持711和810机型Root_内置超级恢复功能_提供工具箱辅助_简化Ro.zip

    智能硬件安全_Android系统Root技术_Python自动化脚本开发_小天才电话手表一键Root工具_支持711和810机型Root_内置超级恢复功能_提供工具箱辅助_简化Ro

    多摩川绝对值编码器STM32F103通信源码及硬件实现方案(原理图+PCB+程序+说明书)”

    内容概要:本文详细介绍了使用STM32F103与多摩川绝对值编码器进行高效通信的设计方案。首先探讨了硬件设计的关键要点,如隔离电路、PCB布局、电平转换等,确保通信的稳定性和可靠性。接着深入讲解了DMA双缓冲技术和CRC校验的实现方法,解决了高波特率下的数据丢失和校验效率问题。最后分享了多个实战经验和调试技巧,包括上电时序、接地环路处理以及高频通信中的常见问题解决办法。 适合人群:从事嵌入式系统开发、伺服控制系统设计的专业工程师和技术爱好者。 使用场景及目标:适用于需要实现高可靠性和高性能编码器通信的项目,如工业自动化设备、精密机械控制等领域。目标是帮助开发者掌握高效的通信设计方案,提高系统的稳定性和性能。 其他说明:文中提供了详细的代码示例和硬件设计建议,附带完整的工程文件和测试数据,便于读者快速理解和应用。

    无人值守智能污水处理控制系统:威纶通触摸屏与西门子PLC联动实践一年多稳定运行经验分享

    内容概要:本文详细介绍了利用威纶通触摸屏和西门子200smart PLC构建的无人值守污水处理控制系统。系统通过PLC编程实现了对污水处理各环节的精确控制,包括溶解氧控制、污泥回流控制、液位监测等。触摸屏则用于实时监控和人机交互,提供了丰富的图形化界面和智能化的操作方式。文中展示了多个具体的编程实例和技术细节,如梯形图逻辑、VBScript脚本以及故障自诊断模块的设计。此外,系统还集成了多种优化措施,如根据季节和天气动态调整参数、采用加权平均算法处理传感器数据冲突等,确保了系统的高效性和稳定性。 适合人群:从事工业自动化、污水处理领域的工程师和技术人员。 使用场景及目标:适用于需要高可靠性、低维护成本的污水处理应用场景。目标是实现污水处理过程的自动化管理,减少人工干预,提高处理效率和质量。 其他说明:本文不仅提供了详细的系统设计方案,还包括了许多实际调试经验和优化技巧,对于理解和实施类似的自动化控制系统具有很高的参考价值。

    aws-java-sdk-s3-1.12.265.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    thymeleaf-2.0.17.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    S7-1200 PLC改造No.173 M7120型平面磨床电气控制系统:带解释梯形图接线原理图及IO分配组态画面

    内容概要:本文详细介绍了将No.173 S7-1200 MCGS M7120型平面磨床的继电器逻辑控制改为PLC控制的具体方法。主要内容涵盖PLC基本原理、梯形图设计、接线图与原理图绘制、IO分配、组态画面设计等方面。通过具体实例,如启动、停止、急停等功能的实现,展示了PLC改造的优势,包括灵活性、可靠性、维护简便性等方面的提升。此外,文中还涉及了一些实际调试中的问题及其解决方案,如模拟量模块抖动、限位开关逻辑异常等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是有一定PLC编程基础的人群。 使用场景及目标:适用于需要将传统继电器控制系统升级为现代化PLC控制系统的场合。主要目标是提高生产设备的自动化水平、生产效率和安全性。 其他说明:文章不仅提供了理论指导,还包括大量实际案例和代码片段,有助于读者更好地理解和应用PLC改造技术。

    mybatis-3.0.1.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    ELM时间序列预测Matlab代码

    内容概要:本文详细介绍了基于极限学习机(ELM)的单变量时间序列数据预测方法,并提供了完整的Matlab代码实现。首先解释了ELM的基本原理,即通过随机生成输入层与隐层之间的权重和偏置,仅需计算输出层权重,从而提高学习效率。接着展示了如何生成模拟的时间序列数据,并将其划分为训练集和测试集。随后逐步讲解了ELM模型的训练过程,包括设置参数、计算隐层输出矩阵以及最终确定输出权重。之后演示了如何使用训练好的模型对测试集进行预测,并通过均方误差(MSE)评估预测效果。最后讨论了实际应用中的注意事项,如调整参数、数据预处理(归一化)、处理噪声等,以提升预测精度。 适用人群:对机器学习尤其是时间序列预测感兴趣的初学者和有一定编程基础的研究人员。 使用场景及目标:适用于需要快速高效的单变量时间序列预测任务,如金融市场的股价预测、气象预报等领域。目标是帮助读者掌握ELM的工作原理及其在Matlab环境下的具体实现。 其他说明:文中还提到了一些改进措施,如增加隐藏层数量、改变激活函数、采用集成学习等,以应对不同应用场景的需求。同时强调了数据预处理的重要性,特别是在处理真实世界数据时。

    winmm钢琴程序代码QZQ.txt

    winmm钢琴程序代码QZQ

    煤采空区聚集瓦斯现象图

    内容概要:本文详细介绍了利用COMSOL软件对采空区煤自然环境下的瓦斯运移进行模拟的研究。研究建立了三维几何模型并设置了合理的网格划分,通过多物理场耦合(如热传导、流体力学)精确捕捉瓦斯在不同深度的扩散和聚集过程。重点关注了距底面4米和14米处的截面,展示了瓦斯含量和温度的分布情况及其受温度梯度、渗透率等因素的影响。同时,文中还涉及了关键参数设置、数据可视化以及现场监测数据与模拟结果的对比分析。 适合人群:从事矿山安全工程、地质勘探、瓦斯治理等相关领域的研究人员和技术人员。 使用场景及目标:①帮助理解和预测采空区内瓦斯的运移规律;②为制定有效的瓦斯治理措施提供理论依据和技术支持;③优化矿井通风系统设计,保障煤矿生产的安全性。 其他说明:文章不仅提供了详细的建模和仿真流程,还包括了一些实用技巧,如实时监控特定点参数变化的方法,有助于提高模拟效率和准确性。此外,强调了网格划分、边界条件处理等细节对结果的重要影响。

    S7-1500与TP1500 PID温控与压力调节的完整应用案例:包含PLC与触摸屏通讯程序及STL语言编程详解

    内容概要:本文详细介绍了基于S7-1500 PLC和TP1500触摸屏的PID温度压力调节系统的应用案例。首先解释了PID控制的基础概念及其在S7-1500中的具体实现方法,包括使用FB41功能块进行温度调节的具体参数设置。接着探讨了S7-1500 PLC间的通讯机制,展示了如何利用STL语言编写通讯程序段,确保不同PLC之间的高效数据交换。此外,还讨论了TP1500触摸屏与PLC的交互方式,如变量关联和监控画面的设计,使得操作员能够便捷地监控和调整系统参数。文中提供了丰富的代码实例和技术细节,有助于深入理解S7-1500的强大功能及其在工业自动化领域的应用。 适合人群:从事工业自动化控制的技术人员,尤其是熟悉西门子PLC编程并希望深入了解S7-1500系列产品的工程师。 使用场景及目标:适用于需要构建稳定可靠的温度压力调节系统的工业环境,如钢铁厂、化工厂等。通过学习本文,读者可以掌握PID控制的基本原理、PLC编程技巧以及触摸屏与PLC的交互设计,从而提高项目的实施效率和质量。 其他说明:文中提到的一些关键技术和编程技巧对于解决实际工程中的难题非常有价值,例如PID参数整定、硬件联调等问题。同时,提供的代码示例可以直接应用于类似场景,减少了重复开发的工作量。

    三菱Fx PLC主从站编程及联网方法总结:含模拟量模块、触摸屏及扩展模块的实用编程技巧

    内容概要:本文详细介绍了三菱FX系列PLC在工业现场控制中的主从站联网配置、编程技巧以及实际应用案例。主要内容涵盖硬件配置选择、通信参数设置、数据交换方式、模拟量模块处理、触摸屏交互逻辑、扩展模块地址分配等方面。文中提供了具体的编程代码示例,强调了通信稳定性、数据传输准确性以及系统容错能力的设计思路。作者通过多个项目的实践经验,总结出一套行之有效的PLC联网方案,确保系统长期稳定运行。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对三菱FX系列PLC有一定了解并希望深入掌握其联网技术和编程技巧的人群。 使用场景及目标:适用于需要构建稳定可靠PLC网络的工业控制系统项目,如污水处理、化工生产、仓储输送等领域。目标是帮助工程师快速搭建并优化PLC联网系统,提高系统的稳定性和可靠性。 其他说明:文中提到的技术细节和编程技巧均基于作者的实际项目经验,具有较高的实用价值。对于初学者来说,可以作为入门指南;对于有经验的工程师,则可以提供新的思路和改进方向。

    scratch少儿编程逻辑思维游戏源码-关卡传奇.zip

    scratch少儿编程逻辑思维游戏源码-关卡传奇.zip

    JS数据结构-数组-思维导图

    JS数据结构-数组-思维导图

Global site tag (gtag.js) - Google Analytics