基于物联网的仓储管理系统-sun_第1页
基于物联网的仓储管理系统-sun_第2页
基于物联网的仓储管理系统-sun_第3页
基于物联网的仓储管理系统-sun_第4页
基于物联网的仓储管理系统-sun_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于物联网的仓储管理系统组成员:傅志星、江志武、郭磊、袁成冉、孙华组长:孙华答辩人:孙华求本远志2023/9/5系统功能概述2023/9/5总体设计思路本系统是基于PC,A8及M0等设备,依托在各项互联网,物联网,传感器等技术的基础上编写,以实现食品物联网仓储系统,使用户更方便的管理仓库内的所有信息及其特殊情况。本系统主要分为三大模块:核心服务器端(PC)前端数据中心(A8)远程监控终端(M0)2023/9/51A8平台的主程序与页面调用的cgi进程通信方式选用消息队列。2 主程序需要同时监控串口信息,从消息队列获取信息,监控键盘值,监控核心服务器更新数据库请求,所以使用多线程编程,每种信息监控创建一个线程。3 当与cgi通信线程接到查看库存,查看警报记录的消息时,当串口接收线程接收到异常温湿度值、商品出入库值时,当键盘监控线程接收到有人入侵的键值时,当socket接收到更新服务器请求时,均访问数据库,所以专门建立数据库访问线程,以保证正确访问数据库。创建多个表,每个板子都指定一个编号,每个编号对于一个名字,用于描述该板子的相关信息(A8与M0的编号可以相同,相互独立

)。每次启动A8板子就从A8板子上的对应表中读取相关配置信息(如:温度上下限,控制信息等)到主函数的全局变量中。原本打算每个M0模块的配置信息完全独立、互不影响,将某个M0的配置信息存在数据没有任何问题,因为接受到数据后还要和其阀值进行比较,会导致频繁的读数据库,使性能降低,故没采用。在主函数中创建所有要用到的线程函数,线程函数是一个功能模块,较为独立。2023/9/5系统设计目标通过M0进行实时采集环境参数,例如温度、湿度、光感数据,进行物品刷卡;再通过ZigBee把采集到的环境参数或物品信息发送给主M0,由主M0通过串口发送给A8;由A8的M0线程负责接收环境参数或物品信息,激活数据库线程对数据库进行相应的处理,然后如果是环境参数则对环境参数进行判断处理进行报警。用摄像头采集图片,存储到A8上构建嵌入式web服务器,使用户通过网络利用pc机进行监控在web页面上设置控制按钮,监控设备识别用户指令并进行相应动作A8通过GPRS短信息功能向用户报警。2023/9/5总体结构图温度传感器RFID识别卡zigbeezigbeezigbee串口线仓库管理员(监控终端)核心服务器(汇总各仓库信息)socketM0A8平台(存放单个仓库信息)湿度传感器2023/9/5具体分工如下2023/9/5个人所做部分移植:Boa服务器移植、Sqlite3数据库移植(x86、ARM)、摄像头移植、udev、文件系统、内核总体数据定义与主函数数据库:负责将常用的表的数据的查询、插设置都封装成统一的函数接口供cgi调用线程:beep、light、warning_light、camera系统整合、脚本文件编写2023/9/5数据定义把一些常用的头文件、变量、结构体变量定义一起放在了head.h中,部分信息如下:structm0_collect_data//采集到的数据,暂存{ floatcurrent_temperature;//当前温度

floatcurrent_humidity;//当前湿度

floatcurrent_illumination; //当前光照

int id; //编号

int x; //三轴信息?? int y; int z; int sec; //time int min; // int hour; // int day; //编号

int mon; //编号

int year; //编号};详细见程序。2023/9/5数据库部分按照先前的实体-联系图(还在纸上没时间画在ppt上)设计,将数据库部分分成8张表(每张表单独做最后整合),如下图所示:2023/9/5其中,basic文件夹里的内容是对数据库操作的一个基本封装,其他相关操作基本上都调用到他的basic.c。因为数据使用sql语句的,所以主要根据要求的信息和输入的信息拼接成sql语句,普通的稍微讲解一下,有几个重要点单独讲。数据库接口支持模糊查询、按时间查询历史记录、查询实时单条记录、查询最近若干条记录,查询出入库信息等等现将其中文件简要分析:basic.h#ifndef_BASIC_H_#define_BASIC_H_#defineCREATE

1#defineINSERT

2#defineUPDATE

3#defineSELECT

4#defineDELETE

5#defineDROP

6#endif2023/9/5#include<stdlib.h>#include<stdio.h>#include<string.h>#include"sqlite3.h"#include"basic.h"//sqlite3_callbackstaticintload(void*para,intn_column,char**column_value,char**column_name){

inti;

printf("lieshu:%d\n",n_column);

for(i=0;i<n_column;i++)

{

printf("record:%s=%s\n",

column_name[i],column_value[i]);

}

printf("*****************\n");

return0;}这是数据的回调函数,在查询语句中中到,他主要用作打印显示。2023/9/5intoperation(constcharcmd,constchar*db_path,constchar*table,constchar*field,char*data,

void*arg,void*errcode){

sqlite3*db=NULL;

intret;

char*errmsg=NULL;

charstatement[1024]={0};

ret=sqlite3_open(db_path,&db);

if(ret!=SQLITE_OK)

return-1;

printf("cmd=%d\n",cmd);

switch(cmd){

caseCREATE:

strcpy(statement,"createtable");

strcpy(statement+strlen(statement),table);

strcpy(statement+strlen(statement),"(");

strcpy(statement+strlen(statement),field);

strcpy(statement+strlen(statement),");");

//

strcpy(statement+strlen(statement),);

break;

caseINSERT:

strcpy(statement,"insertinto");

strcpy(statement+strlen(statement),table);

strcpy(statement+strlen(statement),"(");

strcpy(statement+strlen(statement),field);

strcpy(statement+strlen(statement),")values(");

strcpy(statement+strlen(statement),data);

strcpy(statement+strlen(statement),");");

break;

2023/9/5caseUPDATE:

strcpy(statement,"update");

strcpy(statement+strlen(statement),table);

strcpy(statement+strlen(statement),"set");

strcpy(statement+strlen(statement),data);

strcpy(statement+strlen(statement),"where");

strcpy(statement+strlen(statement),field);

break;

/* *updatem0_datasetcurrent_temperature='100'whereid='3'; * data

field **/caseSELECT:

strcpy(statement,"select");

strcpy(statement+strlen(statement),field);

strcpy(statement+strlen(statement),"from");

strcpy(statement+strlen(statement),table);

strcpy(statement+strlen(statement),arg);

//selectpasswordfromadmin_ccwhereid=9990

//herearg="where..."orNULL

break;caseDELETE:

strcpy(statement,"deletefrom");

strcpy(statement+strlen(statement),table);

strcpy(statement+strlen(statement),"where");

strcpy(statement+strlen(statement),field);

/* *deletefromm0_datawhereid=3;

field **/

break;2023/9/5

caseDROP:

strcpy(statement+strlen(statement),"droptable");

strcpy(statement+strlen(statement),table);

break;

default:

printf("unknowncmd:%d\n",cmd);

return-2;

}

printf("statement=%s\n",statement);

if(cmd!=SELECT)

ret=sqlite3_exec(db,statement,0,0,&errmsg);

else

ret=sqlite3_exec(db,statement,load,0,&errmsg);

if(ret!=SQLITE_OK)

{

printf("func:%serror:%s\n",__func__,errmsg);

return-3;

}

sqlite3_close(db);

return0;}这个operation是数据库中核心的基本函数,基本上所有表的创建、插入、删除等都用到它,但查询除外,因为查询出来的结果要放到全局变量,让cgi来在网页上显示的。2023/9/5数据库简单的基本操作1)sqlite3支持的类型:integerfloatreal(数值)numeric(数值)booleantimedatevarcharnvarchartextblob2)创建表操作createtablem0_data( idinteger notnullprimarykey, current_temperature float, current_humidity float, current_illumination float, x integer,y integer,z integer);注意以逗号结束一个,最后一个不要加(不然会报错)2023/9/53)表查询selectid,current_temperature,current_humidity,current_illuminationfromm0_data;注意:id,current_temperature,不能有括号selectidasID,current_temperatureasTMP,current_humidityasHUM,current_illuminationasILLfromm0_data;//selectid(ID),current_temperature(TMP),current_humidity(HUM),current_illumination(ILL)fromm0_data;不支持查询语句4)数据插入insertintom0_data(id,current_temperature,current_humidity,current_illumination)values(3,30,40,49);插入语句2023/9/55)数据更新updatem0_datasetcurrent_temperature='100'whereid='3'; data fieldupdatem0_datasetcurrent_temperature=110whereid=3;(也可以,哪个更可靠?)更新语句6)删除指定记录deletefromm0_datawhereid=3; fieldDROPTABLE数据表名称(永久性删除一个数据表)7)统计记录数//count(id)fromm0_data;错误selectcount(id)asnufromm0_data;2023/9/5相关表的接口2023/9/5表a8相关操作createtablea8( cpu_idinteger, cpu_namenvarchar(20), a8_idintegernotnullprimarykey, namenvarchar(20), admin_idinteger, telephone_numnvarchar(11), backup_telephone_numnvarchar(11));insertintoa8(cpu_id,cpu_name,a8_id,name,admin_id,telephone_num,backup_telephone_num)values(100,'s5pc100',33,'addsome',3315858117529);selectcpu_id,cpu_name,a8_id,name,admin_id,telephone_num,backup_telephone_numfroma8wherea8_id=33;2023/9/5updatea8settelephone_num=123,backup_telephone_num=456wherea8_id=33;注意不是andintinsert_a8(inta8_id,void*field,structa8*pa8);//intget_a8(inta8_id,void*filed,structa8*pa8);2023/9/5表m0_other相关操作createtablem0_other…插入insertintom0_other(temperature_max,temperature_min,humidity_max ,humidity_min,illumination_max,illumination_min,status,waring_status,cpu_id,cpu_name,need_report,update_period,m0_id,m0_name,a8_id )values(80,10,80,30,75,35,1,0,33,'m0',15,5,34,'m0_w',8);更新updatem0_othersettemperature_max=100wherem0_id=33;查询selecttemperature_max,temperature_minfromm0_otherwherem0_id=33; data field2023/9/5表goods_other相关操作createtablegoods_other…//查询某个a8上的所有商品selectname,get_quantity,price,a8_idfromgoods_infoasinfo,goods_recordasrecordwhereinfo.id=record.goods_idandout_year=null;selectdistinct(goods_id)fromgoods_record;查询所有id,去重复selectsum(get_quantity)fromgoods_recordwheregoods_id=80;2023/9/5createtablegoods_info( idintegernotnullprimarykey, namenvarchar(20), priceinteger, weightinteger );//插入一个商品insertintogoods_info(id,name,price,weight)values(1,'apple',5,4);//查询某个商品的信息,按id和name类似名字selectid,name,price,weightfromgoods_infowhereid=1ornamelike'%p%';//更新某个商品的名字和价格updategoods_infosetname='face',price=90weighet=9whereid=1;注意不是and//删除某个商品信息deletefromgoods_infowhereid=1;2023/9/5表goods_record相关操作createtablegoods_record…flag=1,表示入库//一个入库记录insertintogoods_record(goods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,year)values(1,9,40,1,8,1,2,3,4,5,2012);flag=0,表示出库//一个出库记录insertintogoods_record(goods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,year)values(1,9,40,0,8,2,2,2,2,5,2012);//查询selectgoods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,yearfromgoods_recordwheregoods_id=1;//入库查询selectgoods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,yearfromgoods_recordwheregoods_id=1andflag=1;//出库查询selectgoods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,yearfromgoods_recordwheregoods_id=1andflag=0;2023/9/5

//按日查询selectgoods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,yearfromgoods_recordwhereyear=2012andmon=5andday=2;insertintogoods_record(goods_id,get_id,get_quantity,flag,a8_id,sec,min,hour,day,mon,year)values(12,9,40,1,8,1,2,10,4,5,2012);//查询某个a8上的所有商品查询所有id,去重复selectdistinct(goods_id)fromgoods_record;selectsum(get_quantity)fromgoods_recordwheregoods_id=1;//查询条件为某月某a8上的库的信息2023/9/5表goods_statistics相关操作createtablegoods_statistics…//插入insertintogoods_statistics(a8_id,goods_id,a8_name,goods_name,quantity,price,worth)values(8,1,'beijing','htc',800,54,34);//查询某个a8上的所有商品信息selectgoods_id,quantity,price,worthfromgoods_statisticswherea8_id=8;//查询某个a8上的所有商品查询所有id,去重复selectdistinct(goods_id)fromgoods_record;selectsum(get_quantity)fromgoods_recordwheregoods_id=1;//查询条件为某月某a8上的库的信息//查询某个a8上的所有商品insertintogoods_statistics(a8_id,goods_id,quantity,price)selecta8_id,goods_id,get_quantity,pricefromgoods_infoasinfo,goods_recordasrecordwhereinfo.id=record.goods_id;2023/9/5总结很显然我们组这次项目是失败的,主要原因总结如下:1.前期我对项目的总体架构、流程把握不够,在分工时,思路不清楚,不能提出有效的分工方案,不能划出详细的流程图,没能调动组员积极性(主要原因)。2.在项目中郭磊接了另一个QT开发,故它没工夫搞自己的模块。3.cgi的复杂程度超过预期,傅志星在搞cgi时没有时间去做它负责的另外两个模块。而且在出现这种现状时,组员不够团结,只顾做自己的模块,不来分担麻烦。4.我在做完移植和数据库后,江志武的M0迟迟没好,数据采集没人做。。。。其实不想再做其他,只想看看自己喜欢的M0那一部分。因为那是已经是一盘散沙,想组合起来十分困难,最后还是硬着头皮做了一下。5.期间遇到了很多困难,有时被一个小问题,困扰了半天多,再次感谢所有帮助过我的同学和老师。谢谢2023/9/5第一节活塞式空压机的工作原理第二节活塞式空压机的结构和自动控制第三节活塞式空压机的管理复习思考题单击此处输入你的副标题,文字是您思想的提炼,为了最终演示发布的良好效果,请尽量言简意赅的阐述观点。第六章活塞式空气压缩机

piston-aircompressor压缩空气在船舶上的应用:

1.主机的启动、换向;

2.辅机的启动;

3.为气动装置提供气源;

4.为气动工具提供气源;

5.吹洗零部件和滤器。

排气量:单位时间内所排送的相当第一级吸气状态的空气体积。单位:m3/s、m3/min、m3/h第六章活塞式空气压缩机

piston-aircompressor空压机分类:按排气压力分:低压0.2~1.0MPa;中压1~10MPa;高压10~100MPa。按排气量分:微型<1m3/min;小型1~10m3/min;中型10~100m3/min;大型>100m3/min。第六章活塞式空气压缩机

piston-aircompressor第一节活塞式空压机的工作原理容积式压缩机按结构分为两大类:往复式与旋转式两级活塞式压缩机单级活塞压缩机活塞式压缩机膜片式压缩机旋转叶片式压缩机最长的使用寿命-

----低转速(1460RPM),动件少(轴承与滑片),润滑油在机件间形成保护膜,防止磨损及泄漏,使空压机能够安静有效运作;平时有按规定做例行保养的JAGUAR滑片式空压机,至今使用十万小时以上,依然完好如初,按十万小时相当于每日以十小时运作计算,可长达33年之久。因此,将滑片式空压机比喻为一部终身机器实不为过。滑(叶)片式空压机可以365天连续运转并保证60000小时以上安全运转的空气压缩机1.进气2.开始压缩3.压缩中4.排气1.转子及机壳间成为压缩空间,当转子开始转动时,空气由机体进气端进入。2.转子转动使被吸入的空气转至机壳与转子间气密范围,同时停止进气。3.转子不断转动,气密范围变小,空气被压缩。4.被压缩的空气压力升高达到额定的压力后由排气端排出进入油气分离器内。4.被压缩的空气压力升高达到额定的压力后由排气端排出进入油气分离器内。1.进气2.开始压缩3.压缩中4.排气1.凸凹转子及机壳间成为压缩空间,当转子开始转动时,空气由机体进气端进入。2.转子转动使被吸入的空气转至机壳与转子间气密范围,同时停止进气。3.转子不断转动,气密范围变小,空气被压缩。螺杆式气体压缩机是世界上最先进、紧凑型、坚实、运行平稳,噪音低,是值得信赖的气体压缩机。螺杆式压缩机气路系统:

A

进气过滤器

B

空气进气阀

C

压缩机主机

D

单向阀

E

空气/油分离器

F

最小压力阀

G

后冷却器

H

带自动疏水器的水分离器油路系统:

J

油箱

K

恒温旁通阀

L

油冷却器

M

油过滤器

N

回油阀

O

断油阀冷冻系统:

P

冷冻压缩机

Q

冷凝器

R

热交换器

S

旁通系统

T

空气出口过滤器螺杆式压缩机涡旋式压缩机

涡旋式压缩机是20世纪90年代末期开发并问世的高科技压缩机,由于结构简单、零件少、效率高、可靠性好,尤其是其低噪声、长寿命等诸方面大大优于其它型式的压缩机,已经得到压缩机行业的关注和公认。被誉为“环保型压缩机”。由于涡旋式压缩机的独特设计,使其成为当今世界最节能压缩机。涡旋式压缩机主要运动件涡卷付,只有磨合没有磨损,因而寿命更长,被誉为免维修压缩机。

由于涡旋式压缩机运行平稳、振动小、工作环境安静,又被誉为“超静压缩机”。

涡旋式压缩机零部件少,只有四个运动部件,压缩机工作腔由相运动涡卷付形成多个相互封闭的镰形工作腔,当动涡卷作平动运动时,使镰形工作腔由大变小而达到压缩和排出压缩空气的目的。活塞式空气压缩机的外形第一节活塞式空压机的工作原理一、理论工作循环(单级压缩)工作循环:4—1—2—34—1吸气过程

1—2压缩过程

2—3排气过程第一节活塞式空压机的工作原理一、理论工作循环(单级压缩)

压缩分类:绝热压缩:1—2耗功最大等温压缩:1—2''耗功最小多变压缩:1—2'耗功居中功=P×V(PV图上的面积)加强对气缸的冷却,省功、对气缸润滑有益。二、实际工作循环(单级压缩)1.不存在假设条件2.与理论循环不同的原因:1)余隙容积Vc的影响Vc不利的影响—残存的气体在活塞回行时,发生膨胀,使实际吸气行程(容积)减小。Vc有利的好处—

(1)形成气垫,利于活塞回行;(2)避免“液击”(空气结露);(3)避免活塞、连杆热膨胀,松动发生相撞。第一节活塞式空压机的工作原理表征Vc的参数—相对容积C、容积系数λv合适的C:低压0.07-0.12

中压0.09-0.14

高压0.11-0.16

λv=0.65—0.901)余隙容积Vc的影响C越大或压力比越高,则λv越小。保证Vc正常的措施:余隙高度见表6-1压铅法—保证要求的气缸垫厚度2.与理论循环不同的原因:二、实际工作循环(单级压缩)第一节活塞式空压机的工作原理2)进排气阀及流道阻力的影响吸气过程压力损失使排气量减少程度,用压力系数λp表示:保证措施:合适的气阀升程及弹簧弹力、管路圆滑畅通、滤器干净。λp

(0.90-0.98)2.与理论循环不同的原因:二、实际工作循环(单级压缩)第一节活塞式空压机的工作原理3)吸气预热的影响由于压缩过程中机件吸热,所以在吸气过程中,机件放热使吸入的气体温度升高,使吸气的比容减小,造成吸

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论